diff --git a/msa/js-executor/package-lock.json b/msa/js-executor/package-lock.json
index 244ece6de8..e0a631ac6f 100644
--- a/msa/js-executor/package-lock.json
+++ b/msa/js-executor/package-lock.json
@@ -1944,12 +1944,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"
@@ -1964,17 +1966,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",
@@ -2091,7 +2096,8 @@
"inherits": {
"version": "2.0.4",
"bundled": true,
- "dev": true
+ "dev": true,
+ "optional": true
},
"ini": {
"version": "1.3.5",
@@ -2103,6 +2109,7 @@
"version": "1.0.0",
"bundled": true,
"dev": true,
+ "optional": true,
"requires": {
"number-is-nan": "^1.0.0"
}
@@ -2117,6 +2124,7 @@
"version": "3.0.4",
"bundled": true,
"dev": true,
+ "optional": true,
"requires": {
"brace-expansion": "^1.1.7"
}
@@ -2124,12 +2132,14 @@
"minimist": {
"version": "0.0.8",
"bundled": true,
- "dev": true
+ "dev": true,
+ "optional": true
},
"minipass": {
"version": "2.9.0",
"bundled": true,
"dev": true,
+ "optional": true,
"requires": {
"safe-buffer": "^5.1.2",
"yallist": "^3.0.0"
@@ -2148,6 +2158,7 @@
"version": "0.5.1",
"bundled": true,
"dev": true,
+ "optional": true,
"requires": {
"minimist": "0.0.8"
}
@@ -2237,7 +2248,8 @@
"number-is-nan": {
"version": "1.0.1",
"bundled": true,
- "dev": true
+ "dev": true,
+ "optional": true
},
"object-assign": {
"version": "4.1.1",
@@ -2249,6 +2261,7 @@
"version": "1.4.0",
"bundled": true,
"dev": true,
+ "optional": true,
"requires": {
"wrappy": "1"
}
@@ -2370,6 +2383,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",
diff --git a/pom.xml b/pom.xml
index 295d029957..27fc6fca91 100755
--- a/pom.xml
+++ b/pom.xml
@@ -69,7 +69,7 @@
3.11.4
1.22.1
1.16.18
- 1.1.0
+ 1.2.4
4.1.49.Final
1.5.0
4.8.0
diff --git a/ui/.babelrc b/ui/.babelrc
deleted file mode 100644
index bbda4fe421..0000000000
--- a/ui/.babelrc
+++ /dev/null
@@ -1,9 +0,0 @@
-{
- "presets": [
- "@babel/preset-react",
- "@babel/preset-env"
- ],
- "plugins": [
- "react-hot-loader/babel"
- ]
-}
diff --git a/ui/.eslintrc b/ui/.eslintrc
deleted file mode 100644
index 5b8920d93d..0000000000
--- a/ui/.eslintrc
+++ /dev/null
@@ -1,18 +0,0 @@
-{
- "extends": [
- "eslint:recommended",
- "plugin:import/errors",
- "plugin:import/warnings",
- "angular"
- ],
- "parser": "babel-eslint",
- "settings": {
- "import/ignore": [
- "node_modules",
- "\\.tpl\\.html$"
- ]
- },
- "globals": {
- "FileReader": true
- }
-}
diff --git a/ui/.gitignore b/ui/.gitignore
deleted file mode 100644
index 09daa48c35..0000000000
--- a/ui/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-node_modules
-.tern-project
diff --git a/ui/.jshintrc b/ui/.jshintrc
deleted file mode 100644
index 6f00218e37..0000000000
--- a/ui/.jshintrc
+++ /dev/null
@@ -1,13 +0,0 @@
-{
- "globalstrict": true,
- "globals": {
- "angular": false,
- "describe": false,
- "it": false,
- "expect": false,
- "beforeEach": false,
- "afterEach": false,
- "module": false,
- "inject": false
- }
-}
\ No newline at end of file
diff --git a/ui/.stylelintrc b/ui/.stylelintrc
deleted file mode 100644
index e878729b53..0000000000
--- a/ui/.stylelintrc
+++ /dev/null
@@ -1,292 +0,0 @@
-{
- "extends": ["stylelint-config-standard", "stylelint-config-recommended-scss"],
- "plugins": [
- "stylelint-order"
- ],
- "rules": {
- "at-rule-empty-line-before": ["always", {
- "except": ["first-nested"],
- "ignore": ["after-comment"]
- }],
- "at-rule-name-space-after": "always",
- "at-rule-no-vendor-prefix": true,
- "at-rule-semicolon-space-before": "never",
- "block-closing-brace-empty-line-before": "never",
- "block-closing-brace-newline-after": null,
- "block-opening-brace-space-before": null,
- "color-named": "never",
- "declaration-block-semicolon-newline-after": "always-multi-line",
- "declaration-block-semicolon-newline-before": "never-multi-line",
- "declaration-block-semicolon-space-after": "always-single-line",
- "declaration-empty-line-before": null,
- "declaration-no-important": null,
- "font-family-name-quotes": "always-where-recommended",
- "font-weight-notation": [
- "numeric", {
- "ignore": ["relative"]
- }],
- "function-url-no-scheme-relative": true,
- "function-url-quotes": "always",
- "length-zero-no-unit": true,
- "max-empty-lines": 2,
- "max-line-length": null,
- "media-feature-name-no-vendor-prefix": true,
- "media-feature-parentheses-space-inside": "never",
- "media-feature-range-operator-space-after": "always",
- "media-feature-range-operator-space-before": "never",
- "no-descending-specificity": null,
- "no-duplicate-selectors": true,
- "number-leading-zero": "never",
- "media-feature-name-no-unknown": [true, {
- "ignoreMediaFeatureNames": ["prefers-reduced-motion"]
- }],
- "order/properties-order": [
- "position",
- "top",
- "right",
- "bottom",
- "left",
- "z-index",
- "box-sizing",
- "display",
- "flex",
- "flex-align",
- "flex-basis",
- "flex-direction",
- "flex-wrap",
- "flex-flow",
- "flex-shrink",
- "flex-grow",
- "flex-order",
- "flex-pack",
- "align-content",
- "align-items",
- "align-self",
- "justify-content",
- "order",
- "float",
- "width",
- "min-width",
- "max-width",
- "height",
- "min-height",
- "max-height",
- "padding",
- "padding-top",
- "padding-right",
- "padding-bottom",
- "padding-left",
- "margin",
- "margin-top",
- "margin-right",
- "margin-bottom",
- "margin-left",
- "overflow",
- "overflow-x",
- "overflow-y",
- "-webkit-overflow-scrolling",
- "-ms-overflow-x",
- "-ms-overflow-y",
- "-ms-overflow-style",
- "columns",
- "column-count",
- "column-fill",
- "column-gap",
- "column-rule",
- "column-rule-width",
- "column-rule-style",
- "column-rule-color",
- "column-span",
- "column-width",
- "orphans",
- "widows",
- "clip",
- "clear",
- "font",
- "font-family",
- "font-size",
- "font-style",
- "font-weight",
- "font-variant",
- "font-size-adjust",
- "font-stretch",
- "font-effect",
- "font-emphasize",
- "font-emphasize-position",
- "font-emphasize-style",
- "font-smooth",
- "src",
- "hyphens",
- "line-height",
- "color",
- "text-align",
- "text-align-last",
- "text-emphasis",
- "text-emphasis-color",
- "text-emphasis-style",
- "text-emphasis-position",
- "text-decoration",
- "text-indent",
- "text-justify",
- "text-outline",
- "-ms-text-overflow",
- "text-overflow",
- "text-overflow-ellipsis",
- "text-overflow-mode",
- "text-shadow",
- "text-transform",
- "text-wrap",
- "-webkit-text-size-adjust",
- "-ms-text-size-adjust",
- "letter-spacing",
- "-ms-word-break",
- "word-break",
- "word-spacing",
- "-ms-word-wrap",
- "word-wrap",
- "overflow-wrap",
- "tab-size",
- "white-space",
- "vertical-align",
- "direction",
- "unicode-bidi",
- "list-style",
- "list-style-position",
- "list-style-type",
- "list-style-image",
- "pointer-events",
- "-ms-touch-action",
- "touch-action",
- "cursor",
- "visibility",
- "zoom",
- "table-layout",
- "empty-cells",
- "caption-side",
- "border-spacing",
- "border-collapse",
- "content",
- "quotes",
- "counter-reset",
- "counter-increment",
- "resize",
- "user-select",
- "nav-index",
- "nav-up",
- "nav-right",
- "nav-down",
- "nav-left",
- "background",
- "background-color",
- "background-image",
- "filter",
- "background-repeat",
- "background-attachment",
- "background-position",
- "background-position-x",
- "background-position-y",
- "background-clip",
- "background-origin",
- "background-size",
- "border",
- "border-color",
- "border-style",
- "border-width",
- "border-top",
- "border-top-color",
- "border-top-style",
- "border-top-width",
- "border-right",
- "border-right-color",
- "border-right-style",
- "border-right-width",
- "border-bottom",
- "border-bottom-color",
- "border-bottom-style",
- "border-bottom-width",
- "border-left",
- "border-left-color",
- "border-left-style",
- "border-left-width",
- "border-radius",
- "border-top-left-radius",
- "border-top-right-radius",
- "border-bottom-right-radius",
- "border-bottom-left-radius",
- "border-image",
- "border-image-source",
- "border-image-slice",
- "border-image-width",
- "border-image-outset",
- "border-image-repeat",
- "outline",
- "outline-width",
- "outline-style",
- "outline-color",
- "outline-offset",
- "box-shadow",
- "opacity",
- "-ms-interpolation-mode",
- "page-break-after",
- "page-break-before",
- "page-break-inside",
- "transition",
- "transition-delay",
- "transition-timing-function",
- "transition-duration",
- "transition-property",
- "transform",
- "transform-origin",
- "perspective",
- "appearance",
- "animation",
- "animation-name",
- "animation-duration",
- "animation-play-state",
- "animation-timing-function",
- "animation-delay",
- "animation-iteration-count",
- "animation-direction",
- "animation-fill-mode",
- "fill",
- "stroke"
- ],
- "property-no-vendor-prefix": true,
- "rule-empty-line-before": ["always", {
- "except": ["first-nested"],
- "ignore": ["after-comment"]
- }],
- "scss/dollar-variable-default": [true, { "ignore": "local" }],
- "selector-attribute-quotes": "always",
- "selector-list-comma-newline-after": "always",
- "selector-list-comma-newline-before": "never-multi-line",
- "selector-list-comma-space-after": "always-single-line",
- "selector-list-comma-space-before": "never-single-line",
- "selector-max-attribute": 2,
- "selector-max-class": 6,
- "selector-max-combinators": 8,
- "selector-max-compound-selectors": 9,
- "selector-max-empty-lines": 1,
- "selector-max-id": 1,
- "selector-max-specificity": null,
- "selector-max-type": 5,
- "selector-max-universal": 1,
- "selector-no-qualifying-type": null,
- "selector-no-vendor-prefix": true,
- "selector-type-no-unknown": [true, {
- "ignoreTypes": [
- "/^md-/",
- "/^mdp-/",
- "/^ng-/",
- "/^tb-/",
- "/^v-pane/"
- ]
- }],
- "string-quotes": "double",
- "value-keyword-case": "lower",
- "value-list-comma-newline-after": "always-multi-line",
- "value-list-comma-newline-before": "never-multi-line",
- "value-list-comma-space-after": "always-single-line",
- "value-no-vendor-prefix": true
- }
-}
diff --git a/ui/package-lock.json b/ui/package-lock.json
deleted file mode 100644
index bd0e0cc260..0000000000
--- a/ui/package-lock.json
+++ /dev/null
@@ -1,14229 +0,0 @@
-{
- "name": "thingsboard",
- "version": "2.4.3",
- "lockfileVersion": 1,
- "requires": true,
- "dependencies": {
- "@babel/cli": {
- "version": "7.8.4",
- "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.8.4.tgz",
- "integrity": "sha512-XXLgAm6LBbaNxaGhMAznXXaxtCWfuv6PIDJ9Alsy9JYTOh+j2jJz+L/162kkfU1j/pTSxK1xGmlwI4pdIMkoag==",
- "dev": true,
- "requires": {
- "chokidar": "^2.1.8",
- "commander": "^4.0.1",
- "convert-source-map": "^1.1.0",
- "fs-readdir-recursive": "^1.1.0",
- "glob": "^7.0.0",
- "lodash": "^4.17.13",
- "make-dir": "^2.1.0",
- "slash": "^2.0.0",
- "source-map": "^0.5.0"
- },
- "dependencies": {
- "commander": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz",
- "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==",
- "dev": true
- }
- }
- },
- "@babel/code-frame": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz",
- "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==",
- "dev": true,
- "requires": {
- "@babel/highlight": "^7.8.3"
- }
- },
- "@babel/compat-data": {
- "version": "7.8.5",
- "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.8.5.tgz",
- "integrity": "sha512-jWYUqQX/ObOhG1UiEkbH5SANsE/8oKXiQWjj7p7xgj9Zmnt//aUvyz4dBkK0HNsS8/cbyC5NmmH87VekW+mXFg==",
- "dev": true,
- "requires": {
- "browserslist": "^4.8.5",
- "invariant": "^2.2.4",
- "semver": "^5.5.0"
- }
- },
- "@babel/core": {
- "version": "7.8.4",
- "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.8.4.tgz",
- "integrity": "sha512-0LiLrB2PwrVI+a2/IEskBopDYSd8BCb3rOvH7D5tzoWd696TBEduBvuLVm4Nx6rltrLZqvI3MCalB2K2aVzQjA==",
- "dev": true,
- "requires": {
- "@babel/code-frame": "^7.8.3",
- "@babel/generator": "^7.8.4",
- "@babel/helpers": "^7.8.4",
- "@babel/parser": "^7.8.4",
- "@babel/template": "^7.8.3",
- "@babel/traverse": "^7.8.4",
- "@babel/types": "^7.8.3",
- "convert-source-map": "^1.7.0",
- "debug": "^4.1.0",
- "gensync": "^1.0.0-beta.1",
- "json5": "^2.1.0",
- "lodash": "^4.17.13",
- "resolve": "^1.3.2",
- "semver": "^5.4.1",
- "source-map": "^0.5.0"
- },
- "dependencies": {
- "debug": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
- "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
- "dev": true,
- "requires": {
- "ms": "^2.1.1"
- }
- },
- "ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
- "dev": true
- }
- }
- },
- "@babel/generator": {
- "version": "7.8.4",
- "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.4.tgz",
- "integrity": "sha512-PwhclGdRpNAf3IxZb0YVuITPZmmrXz9zf6fH8lT4XbrmfQKr6ryBzhv593P5C6poJRciFCL/eHGW2NuGrgEyxA==",
- "dev": true,
- "requires": {
- "@babel/types": "^7.8.3",
- "jsesc": "^2.5.1",
- "lodash": "^4.17.13",
- "source-map": "^0.5.0"
- }
- },
- "@babel/helper-annotate-as-pure": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.8.3.tgz",
- "integrity": "sha512-6o+mJrZBxOoEX77Ezv9zwW7WV8DdluouRKNY/IR5u/YTMuKHgugHOzYWlYvYLpLA9nPsQCAAASpCIbjI9Mv+Uw==",
- "dev": true,
- "requires": {
- "@babel/types": "^7.8.3"
- }
- },
- "@babel/helper-builder-binary-assignment-operator-visitor": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.8.3.tgz",
- "integrity": "sha512-5eFOm2SyFPK4Rh3XMMRDjN7lBH0orh3ss0g3rTYZnBQ+r6YPj7lgDyCvPphynHvUrobJmeMignBr6Acw9mAPlw==",
- "dev": true,
- "requires": {
- "@babel/helper-explode-assignable-expression": "^7.8.3",
- "@babel/types": "^7.8.3"
- }
- },
- "@babel/helper-builder-react-jsx": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.8.3.tgz",
- "integrity": "sha512-JT8mfnpTkKNCboTqZsQTdGo3l3Ik3l7QIt9hh0O9DYiwVel37VoJpILKM4YFbP2euF32nkQSb+F9cUk9b7DDXQ==",
- "dev": true,
- "requires": {
- "@babel/types": "^7.8.3",
- "esutils": "^2.0.0"
- }
- },
- "@babel/helper-call-delegate": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/helper-call-delegate/-/helper-call-delegate-7.8.3.tgz",
- "integrity": "sha512-6Q05px0Eb+N4/GTyKPPvnkig7Lylw+QzihMpws9iiZQv7ZImf84ZsZpQH7QoWN4n4tm81SnSzPgHw2qtO0Zf3A==",
- "dev": true,
- "requires": {
- "@babel/helper-hoist-variables": "^7.8.3",
- "@babel/traverse": "^7.8.3",
- "@babel/types": "^7.8.3"
- }
- },
- "@babel/helper-compilation-targets": {
- "version": "7.8.4",
- "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.8.4.tgz",
- "integrity": "sha512-3k3BsKMvPp5bjxgMdrFyq0UaEO48HciVrOVF0+lon8pp95cyJ2ujAh0TrBHNMnJGT2rr0iKOJPFFbSqjDyf/Pg==",
- "dev": true,
- "requires": {
- "@babel/compat-data": "^7.8.4",
- "browserslist": "^4.8.5",
- "invariant": "^2.2.4",
- "levenary": "^1.1.1",
- "semver": "^5.5.0"
- }
- },
- "@babel/helper-create-regexp-features-plugin": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.8.3.tgz",
- "integrity": "sha512-Gcsm1OHCUr9o9TcJln57xhWHtdXbA2pgQ58S0Lxlks0WMGNXuki4+GLfX0p+L2ZkINUGZvfkz8rzoqJQSthI+Q==",
- "dev": true,
- "requires": {
- "@babel/helper-regex": "^7.8.3",
- "regexpu-core": "^4.6.0"
- }
- },
- "@babel/helper-define-map": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.8.3.tgz",
- "integrity": "sha512-PoeBYtxoZGtct3md6xZOCWPcKuMuk3IHhgxsRRNtnNShebf4C8YonTSblsK4tvDbm+eJAw2HAPOfCr+Q/YRG/g==",
- "dev": true,
- "requires": {
- "@babel/helper-function-name": "^7.8.3",
- "@babel/types": "^7.8.3",
- "lodash": "^4.17.13"
- }
- },
- "@babel/helper-explode-assignable-expression": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.8.3.tgz",
- "integrity": "sha512-N+8eW86/Kj147bO9G2uclsg5pwfs/fqqY5rwgIL7eTBklgXjcOJ3btzS5iM6AitJcftnY7pm2lGsrJVYLGjzIw==",
- "dev": true,
- "requires": {
- "@babel/traverse": "^7.8.3",
- "@babel/types": "^7.8.3"
- }
- },
- "@babel/helper-function-name": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz",
- "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==",
- "dev": true,
- "requires": {
- "@babel/helper-get-function-arity": "^7.8.3",
- "@babel/template": "^7.8.3",
- "@babel/types": "^7.8.3"
- }
- },
- "@babel/helper-get-function-arity": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz",
- "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==",
- "dev": true,
- "requires": {
- "@babel/types": "^7.8.3"
- }
- },
- "@babel/helper-hoist-variables": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.8.3.tgz",
- "integrity": "sha512-ky1JLOjcDUtSc+xkt0xhYff7Z6ILTAHKmZLHPxAhOP0Nd77O+3nCsd6uSVYur6nJnCI029CrNbYlc0LoPfAPQg==",
- "dev": true,
- "requires": {
- "@babel/types": "^7.8.3"
- }
- },
- "@babel/helper-member-expression-to-functions": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz",
- "integrity": "sha512-fO4Egq88utkQFjbPrSHGmGLFqmrshs11d46WI+WZDESt7Wu7wN2G2Iu+NMMZJFDOVRHAMIkB5SNh30NtwCA7RA==",
- "dev": true,
- "requires": {
- "@babel/types": "^7.8.3"
- }
- },
- "@babel/helper-module-imports": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz",
- "integrity": "sha512-R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg==",
- "dev": true,
- "requires": {
- "@babel/types": "^7.8.3"
- }
- },
- "@babel/helper-module-transforms": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.8.3.tgz",
- "integrity": "sha512-C7NG6B7vfBa/pwCOshpMbOYUmrYQDfCpVL/JCRu0ek8B5p8kue1+BCXpg2vOYs7w5ACB9GTOBYQ5U6NwrMg+3Q==",
- "dev": true,
- "requires": {
- "@babel/helper-module-imports": "^7.8.3",
- "@babel/helper-simple-access": "^7.8.3",
- "@babel/helper-split-export-declaration": "^7.8.3",
- "@babel/template": "^7.8.3",
- "@babel/types": "^7.8.3",
- "lodash": "^4.17.13"
- }
- },
- "@babel/helper-optimise-call-expression": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz",
- "integrity": "sha512-Kag20n86cbO2AvHca6EJsvqAd82gc6VMGule4HwebwMlwkpXuVqrNRj6CkCV2sKxgi9MyAUnZVnZ6lJ1/vKhHQ==",
- "dev": true,
- "requires": {
- "@babel/types": "^7.8.3"
- }
- },
- "@babel/helper-plugin-utils": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz",
- "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==",
- "dev": true
- },
- "@babel/helper-regex": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.8.3.tgz",
- "integrity": "sha512-BWt0QtYv/cg/NecOAZMdcn/waj/5P26DR4mVLXfFtDokSR6fyuG0Pj+e2FqtSME+MqED1khnSMulkmGl8qWiUQ==",
- "dev": true,
- "requires": {
- "lodash": "^4.17.13"
- }
- },
- "@babel/helper-remap-async-to-generator": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.8.3.tgz",
- "integrity": "sha512-kgwDmw4fCg7AVgS4DukQR/roGp+jP+XluJE5hsRZwxCYGg+Rv9wSGErDWhlI90FODdYfd4xG4AQRiMDjjN0GzA==",
- "dev": true,
- "requires": {
- "@babel/helper-annotate-as-pure": "^7.8.3",
- "@babel/helper-wrap-function": "^7.8.3",
- "@babel/template": "^7.8.3",
- "@babel/traverse": "^7.8.3",
- "@babel/types": "^7.8.3"
- }
- },
- "@babel/helper-replace-supers": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.8.3.tgz",
- "integrity": "sha512-xOUssL6ho41U81etpLoT2RTdvdus4VfHamCuAm4AHxGr+0it5fnwoVdwUJ7GFEqCsQYzJUhcbsN9wB9apcYKFA==",
- "dev": true,
- "requires": {
- "@babel/helper-member-expression-to-functions": "^7.8.3",
- "@babel/helper-optimise-call-expression": "^7.8.3",
- "@babel/traverse": "^7.8.3",
- "@babel/types": "^7.8.3"
- }
- },
- "@babel/helper-simple-access": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.8.3.tgz",
- "integrity": "sha512-VNGUDjx5cCWg4vvCTR8qQ7YJYZ+HBjxOgXEl7ounz+4Sn7+LMD3CFrCTEU6/qXKbA2nKg21CwhhBzO0RpRbdCw==",
- "dev": true,
- "requires": {
- "@babel/template": "^7.8.3",
- "@babel/types": "^7.8.3"
- }
- },
- "@babel/helper-split-export-declaration": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz",
- "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==",
- "dev": true,
- "requires": {
- "@babel/types": "^7.8.3"
- }
- },
- "@babel/helper-wrap-function": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.8.3.tgz",
- "integrity": "sha512-LACJrbUET9cQDzb6kG7EeD7+7doC3JNvUgTEQOx2qaO1fKlzE/Bf05qs9w1oXQMmXlPO65lC3Tq9S6gZpTErEQ==",
- "dev": true,
- "requires": {
- "@babel/helper-function-name": "^7.8.3",
- "@babel/template": "^7.8.3",
- "@babel/traverse": "^7.8.3",
- "@babel/types": "^7.8.3"
- }
- },
- "@babel/helpers": {
- "version": "7.8.4",
- "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.8.4.tgz",
- "integrity": "sha512-VPbe7wcQ4chu4TDQjimHv/5tj73qz88o12EPkO2ValS2QiQS/1F2SsjyIGNnAD0vF/nZS6Cf9i+vW6HIlnaR8w==",
- "dev": true,
- "requires": {
- "@babel/template": "^7.8.3",
- "@babel/traverse": "^7.8.4",
- "@babel/types": "^7.8.3"
- }
- },
- "@babel/highlight": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz",
- "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==",
- "dev": true,
- "requires": {
- "chalk": "^2.0.0",
- "esutils": "^2.0.2",
- "js-tokens": "^4.0.0"
- },
- "dependencies": {
- "ansi-styles": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
- "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
- "dev": true,
- "requires": {
- "color-convert": "^1.9.0"
- }
- },
- "chalk": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
- "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
- "dev": true,
- "requires": {
- "ansi-styles": "^3.2.1",
- "escape-string-regexp": "^1.0.5",
- "supports-color": "^5.3.0"
- }
- },
- "supports-color": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
- "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
- "dev": true,
- "requires": {
- "has-flag": "^3.0.0"
- }
- }
- }
- },
- "@babel/node": {
- "version": "7.8.4",
- "resolved": "https://registry.npmjs.org/@babel/node/-/node-7.8.4.tgz",
- "integrity": "sha512-MlczXI/VYRnoaWHjicqrzq2z4DhRPaWQIC+C3ISEQs5z+mEccBsn7IAI5Q97ZDTnFYw6ts5IUTzqArilC/g7nw==",
- "dev": true,
- "requires": {
- "@babel/register": "^7.8.3",
- "commander": "^4.0.1",
- "core-js": "^3.2.1",
- "lodash": "^4.17.13",
- "node-environment-flags": "^1.0.5",
- "regenerator-runtime": "^0.13.3",
- "resolve": "^1.13.1",
- "v8flags": "^3.1.1"
- },
- "dependencies": {
- "commander": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz",
- "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==",
- "dev": true
- },
- "core-js": {
- "version": "3.6.4",
- "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.4.tgz",
- "integrity": "sha512-4paDGScNgZP2IXXilaffL9X7968RuvwlkK3xWtZRVqgd8SYNiVKRJvkFd1aqqEuPfN7E68ZHEp9hDj6lHj4Hyw==",
- "dev": true
- },
- "regenerator-runtime": {
- "version": "0.13.3",
- "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz",
- "integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw==",
- "dev": true
- }
- }
- },
- "@babel/parser": {
- "version": "7.8.4",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz",
- "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==",
- "dev": true
- },
- "@babel/plugin-proposal-async-generator-functions": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.8.3.tgz",
- "integrity": "sha512-NZ9zLv848JsV3hs8ryEh7Uaz/0KsmPLqv0+PdkDJL1cJy0K4kOCFa8zc1E3mp+RHPQcpdfb/6GovEsW4VDrOMw==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.8.3",
- "@babel/helper-remap-async-to-generator": "^7.8.3",
- "@babel/plugin-syntax-async-generators": "^7.8.0"
- }
- },
- "@babel/plugin-proposal-dynamic-import": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.8.3.tgz",
- "integrity": "sha512-NyaBbyLFXFLT9FP+zk0kYlUlA8XtCUbehs67F0nnEg7KICgMc2mNkIeu9TYhKzyXMkrapZFwAhXLdnt4IYHy1w==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.8.3",
- "@babel/plugin-syntax-dynamic-import": "^7.8.0"
- }
- },
- "@babel/plugin-proposal-json-strings": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.8.3.tgz",
- "integrity": "sha512-KGhQNZ3TVCQG/MjRbAUwuH+14y9q0tpxs1nWWs3pbSleRdDro9SAMMDyye8HhY1gqZ7/NqIc8SKhya0wRDgP1Q==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.8.3",
- "@babel/plugin-syntax-json-strings": "^7.8.0"
- }
- },
- "@babel/plugin-proposal-nullish-coalescing-operator": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.8.3.tgz",
- "integrity": "sha512-TS9MlfzXpXKt6YYomudb/KU7nQI6/xnapG6in1uZxoxDghuSMZsPb6D2fyUwNYSAp4l1iR7QtFOjkqcRYcUsfw==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.8.3",
- "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0"
- }
- },
- "@babel/plugin-proposal-object-rest-spread": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.8.3.tgz",
- "integrity": "sha512-8qvuPwU/xxUCt78HocNlv0mXXo0wdh9VT1R04WU8HGOfaOob26pF+9P5/lYjN/q7DHOX1bvX60hnhOvuQUJdbA==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.8.3",
- "@babel/plugin-syntax-object-rest-spread": "^7.8.0"
- }
- },
- "@babel/plugin-proposal-optional-catch-binding": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.8.3.tgz",
- "integrity": "sha512-0gkX7J7E+AtAw9fcwlVQj8peP61qhdg/89D5swOkjYbkboA2CVckn3kiyum1DE0wskGb7KJJxBdyEBApDLLVdw==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.8.3",
- "@babel/plugin-syntax-optional-catch-binding": "^7.8.0"
- }
- },
- "@babel/plugin-proposal-optional-chaining": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.8.3.tgz",
- "integrity": "sha512-QIoIR9abkVn+seDE3OjA08jWcs3eZ9+wJCKSRgo3WdEU2csFYgdScb+8qHB3+WXsGJD55u+5hWCISI7ejXS+kg==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.8.3",
- "@babel/plugin-syntax-optional-chaining": "^7.8.0"
- }
- },
- "@babel/plugin-proposal-unicode-property-regex": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.8.3.tgz",
- "integrity": "sha512-1/1/rEZv2XGweRwwSkLpY+s60za9OZ1hJs4YDqFHCw0kYWYwL5IFljVY1MYBL+weT1l9pokDO2uhSTLVxzoHkQ==",
- "dev": true,
- "requires": {
- "@babel/helper-create-regexp-features-plugin": "^7.8.3",
- "@babel/helper-plugin-utils": "^7.8.3"
- }
- },
- "@babel/plugin-syntax-async-generators": {
- "version": "7.8.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz",
- "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.8.0"
- }
- },
- "@babel/plugin-syntax-dynamic-import": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz",
- "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.8.0"
- }
- },
- "@babel/plugin-syntax-json-strings": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz",
- "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.8.0"
- }
- },
- "@babel/plugin-syntax-jsx": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.8.3.tgz",
- "integrity": "sha512-WxdW9xyLgBdefoo0Ynn3MRSkhe5tFVxxKNVdnZSh318WrG2e2jH+E9wd/++JsqcLJZPfz87njQJ8j2Upjm0M0A==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.8.3"
- }
- },
- "@babel/plugin-syntax-nullish-coalescing-operator": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz",
- "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.8.0"
- }
- },
- "@babel/plugin-syntax-object-rest-spread": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz",
- "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.8.0"
- }
- },
- "@babel/plugin-syntax-optional-catch-binding": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz",
- "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.8.0"
- }
- },
- "@babel/plugin-syntax-optional-chaining": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz",
- "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.8.0"
- }
- },
- "@babel/plugin-syntax-top-level-await": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.8.3.tgz",
- "integrity": "sha512-kwj1j9lL/6Wd0hROD3b/OZZ7MSrZLqqn9RAZ5+cYYsflQ9HZBIKCUkr3+uL1MEJ1NePiUbf98jjiMQSv0NMR9g==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.8.3"
- }
- },
- "@babel/plugin-transform-arrow-functions": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.8.3.tgz",
- "integrity": "sha512-0MRF+KC8EqH4dbuITCWwPSzsyO3HIWWlm30v8BbbpOrS1B++isGxPnnuq/IZvOX5J2D/p7DQalQm+/2PnlKGxg==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.8.3"
- }
- },
- "@babel/plugin-transform-async-to-generator": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.8.3.tgz",
- "integrity": "sha512-imt9tFLD9ogt56Dd5CI/6XgpukMwd/fLGSrix2httihVe7LOGVPhyhMh1BU5kDM7iHD08i8uUtmV2sWaBFlHVQ==",
- "dev": true,
- "requires": {
- "@babel/helper-module-imports": "^7.8.3",
- "@babel/helper-plugin-utils": "^7.8.3",
- "@babel/helper-remap-async-to-generator": "^7.8.3"
- }
- },
- "@babel/plugin-transform-block-scoped-functions": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.8.3.tgz",
- "integrity": "sha512-vo4F2OewqjbB1+yaJ7k2EJFHlTP3jR634Z9Cj9itpqNjuLXvhlVxgnjsHsdRgASR8xYDrx6onw4vW5H6We0Jmg==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.8.3"
- }
- },
- "@babel/plugin-transform-block-scoping": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.8.3.tgz",
- "integrity": "sha512-pGnYfm7RNRgYRi7bids5bHluENHqJhrV4bCZRwc5GamaWIIs07N4rZECcmJL6ZClwjDz1GbdMZFtPs27hTB06w==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.8.3",
- "lodash": "^4.17.13"
- }
- },
- "@babel/plugin-transform-classes": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.8.3.tgz",
- "integrity": "sha512-SjT0cwFJ+7Rbr1vQsvphAHwUHvSUPmMjMU/0P59G8U2HLFqSa082JO7zkbDNWs9kH/IUqpHI6xWNesGf8haF1w==",
- "dev": true,
- "requires": {
- "@babel/helper-annotate-as-pure": "^7.8.3",
- "@babel/helper-define-map": "^7.8.3",
- "@babel/helper-function-name": "^7.8.3",
- "@babel/helper-optimise-call-expression": "^7.8.3",
- "@babel/helper-plugin-utils": "^7.8.3",
- "@babel/helper-replace-supers": "^7.8.3",
- "@babel/helper-split-export-declaration": "^7.8.3",
- "globals": "^11.1.0"
- }
- },
- "@babel/plugin-transform-computed-properties": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.8.3.tgz",
- "integrity": "sha512-O5hiIpSyOGdrQZRQ2ccwtTVkgUDBBiCuK//4RJ6UfePllUTCENOzKxfh6ulckXKc0DixTFLCfb2HVkNA7aDpzA==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.8.3"
- }
- },
- "@babel/plugin-transform-destructuring": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.8.3.tgz",
- "integrity": "sha512-H4X646nCkiEcHZUZaRkhE2XVsoz0J/1x3VVujnn96pSoGCtKPA99ZZA+va+gK+92Zycd6OBKCD8tDb/731bhgQ==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.8.3"
- }
- },
- "@babel/plugin-transform-dotall-regex": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.8.3.tgz",
- "integrity": "sha512-kLs1j9Nn4MQoBYdRXH6AeaXMbEJFaFu/v1nQkvib6QzTj8MZI5OQzqmD83/2jEM1z0DLilra5aWO5YpyC0ALIw==",
- "dev": true,
- "requires": {
- "@babel/helper-create-regexp-features-plugin": "^7.8.3",
- "@babel/helper-plugin-utils": "^7.8.3"
- }
- },
- "@babel/plugin-transform-duplicate-keys": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.8.3.tgz",
- "integrity": "sha512-s8dHiBUbcbSgipS4SMFuWGqCvyge5V2ZeAWzR6INTVC3Ltjig/Vw1G2Gztv0vU/hRG9X8IvKvYdoksnUfgXOEQ==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.8.3"
- }
- },
- "@babel/plugin-transform-exponentiation-operator": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.8.3.tgz",
- "integrity": "sha512-zwIpuIymb3ACcInbksHaNcR12S++0MDLKkiqXHl3AzpgdKlFNhog+z/K0+TGW+b0w5pgTq4H6IwV/WhxbGYSjQ==",
- "dev": true,
- "requires": {
- "@babel/helper-builder-binary-assignment-operator-visitor": "^7.8.3",
- "@babel/helper-plugin-utils": "^7.8.3"
- }
- },
- "@babel/plugin-transform-for-of": {
- "version": "7.8.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.8.4.tgz",
- "integrity": "sha512-iAXNlOWvcYUYoV8YIxwS7TxGRJcxyl8eQCfT+A5j8sKUzRFvJdcyjp97jL2IghWSRDaL2PU2O2tX8Cu9dTBq5A==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.8.3"
- }
- },
- "@babel/plugin-transform-function-name": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.8.3.tgz",
- "integrity": "sha512-rO/OnDS78Eifbjn5Py9v8y0aR+aSYhDhqAwVfsTl0ERuMZyr05L1aFSCJnbv2mmsLkit/4ReeQ9N2BgLnOcPCQ==",
- "dev": true,
- "requires": {
- "@babel/helper-function-name": "^7.8.3",
- "@babel/helper-plugin-utils": "^7.8.3"
- }
- },
- "@babel/plugin-transform-literals": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.8.3.tgz",
- "integrity": "sha512-3Tqf8JJ/qB7TeldGl+TT55+uQei9JfYaregDcEAyBZ7akutriFrt6C/wLYIer6OYhleVQvH/ntEhjE/xMmy10A==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.8.3"
- }
- },
- "@babel/plugin-transform-member-expression-literals": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.8.3.tgz",
- "integrity": "sha512-3Wk2EXhnw+rP+IDkK6BdtPKsUE5IeZ6QOGrPYvw52NwBStw9V1ZVzxgK6fSKSxqUvH9eQPR3tm3cOq79HlsKYA==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.8.3"
- }
- },
- "@babel/plugin-transform-modules-amd": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.8.3.tgz",
- "integrity": "sha512-MadJiU3rLKclzT5kBH4yxdry96odTUwuqrZM+GllFI/VhxfPz+k9MshJM+MwhfkCdxxclSbSBbUGciBngR+kEQ==",
- "dev": true,
- "requires": {
- "@babel/helper-module-transforms": "^7.8.3",
- "@babel/helper-plugin-utils": "^7.8.3",
- "babel-plugin-dynamic-import-node": "^2.3.0"
- }
- },
- "@babel/plugin-transform-modules-commonjs": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.8.3.tgz",
- "integrity": "sha512-JpdMEfA15HZ/1gNuB9XEDlZM1h/gF/YOH7zaZzQu2xCFRfwc01NXBMHHSTT6hRjlXJJs5x/bfODM3LiCk94Sxg==",
- "dev": true,
- "requires": {
- "@babel/helper-module-transforms": "^7.8.3",
- "@babel/helper-plugin-utils": "^7.8.3",
- "@babel/helper-simple-access": "^7.8.3",
- "babel-plugin-dynamic-import-node": "^2.3.0"
- }
- },
- "@babel/plugin-transform-modules-systemjs": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.8.3.tgz",
- "integrity": "sha512-8cESMCJjmArMYqa9AO5YuMEkE4ds28tMpZcGZB/jl3n0ZzlsxOAi3mC+SKypTfT8gjMupCnd3YiXCkMjj2jfOg==",
- "dev": true,
- "requires": {
- "@babel/helper-hoist-variables": "^7.8.3",
- "@babel/helper-module-transforms": "^7.8.3",
- "@babel/helper-plugin-utils": "^7.8.3",
- "babel-plugin-dynamic-import-node": "^2.3.0"
- }
- },
- "@babel/plugin-transform-modules-umd": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.8.3.tgz",
- "integrity": "sha512-evhTyWhbwbI3/U6dZAnx/ePoV7H6OUG+OjiJFHmhr9FPn0VShjwC2kdxqIuQ/+1P50TMrneGzMeyMTFOjKSnAw==",
- "dev": true,
- "requires": {
- "@babel/helper-module-transforms": "^7.8.3",
- "@babel/helper-plugin-utils": "^7.8.3"
- }
- },
- "@babel/plugin-transform-named-capturing-groups-regex": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.8.3.tgz",
- "integrity": "sha512-f+tF/8UVPU86TrCb06JoPWIdDpTNSGGcAtaD9mLP0aYGA0OS0j7j7DHJR0GTFrUZPUU6loZhbsVZgTh0N+Qdnw==",
- "dev": true,
- "requires": {
- "@babel/helper-create-regexp-features-plugin": "^7.8.3"
- }
- },
- "@babel/plugin-transform-new-target": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.8.3.tgz",
- "integrity": "sha512-QuSGysibQpyxexRyui2vca+Cmbljo8bcRckgzYV4kRIsHpVeyeC3JDO63pY+xFZ6bWOBn7pfKZTqV4o/ix9sFw==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.8.3"
- }
- },
- "@babel/plugin-transform-object-super": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.8.3.tgz",
- "integrity": "sha512-57FXk+gItG/GejofIyLIgBKTas4+pEU47IXKDBWFTxdPd7F80H8zybyAY7UoblVfBhBGs2EKM+bJUu2+iUYPDQ==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.8.3",
- "@babel/helper-replace-supers": "^7.8.3"
- }
- },
- "@babel/plugin-transform-parameters": {
- "version": "7.8.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.8.4.tgz",
- "integrity": "sha512-IsS3oTxeTsZlE5KqzTbcC2sV0P9pXdec53SU+Yxv7o/6dvGM5AkTotQKhoSffhNgZ/dftsSiOoxy7evCYJXzVA==",
- "dev": true,
- "requires": {
- "@babel/helper-call-delegate": "^7.8.3",
- "@babel/helper-get-function-arity": "^7.8.3",
- "@babel/helper-plugin-utils": "^7.8.3"
- }
- },
- "@babel/plugin-transform-property-literals": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.8.3.tgz",
- "integrity": "sha512-uGiiXAZMqEoQhRWMK17VospMZh5sXWg+dlh2soffpkAl96KAm+WZuJfa6lcELotSRmooLqg0MWdH6UUq85nmmg==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.8.3"
- }
- },
- "@babel/plugin-transform-react-display-name": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.8.3.tgz",
- "integrity": "sha512-3Jy/PCw8Fe6uBKtEgz3M82ljt+lTg+xJaM4og+eyu83qLT87ZUSckn0wy7r31jflURWLO83TW6Ylf7lyXj3m5A==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.8.3"
- }
- },
- "@babel/plugin-transform-react-jsx": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.8.3.tgz",
- "integrity": "sha512-r0h+mUiyL595ikykci+fbwm9YzmuOrUBi0b+FDIKmi3fPQyFokWVEMJnRWHJPPQEjyFJyna9WZC6Viv6UHSv1g==",
- "dev": true,
- "requires": {
- "@babel/helper-builder-react-jsx": "^7.8.3",
- "@babel/helper-plugin-utils": "^7.8.3",
- "@babel/plugin-syntax-jsx": "^7.8.3"
- }
- },
- "@babel/plugin-transform-react-jsx-self": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.8.3.tgz",
- "integrity": "sha512-01OT7s5oa0XTLf2I8XGsL8+KqV9lx3EZV+jxn/L2LQ97CGKila2YMroTkCEIE0HV/FF7CMSRsIAybopdN9NTdg==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.8.3",
- "@babel/plugin-syntax-jsx": "^7.8.3"
- }
- },
- "@babel/plugin-transform-react-jsx-source": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.8.3.tgz",
- "integrity": "sha512-PLMgdMGuVDtRS/SzjNEQYUT8f4z1xb2BAT54vM1X5efkVuYBf5WyGUMbpmARcfq3NaglIwz08UVQK4HHHbC6ag==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.8.3",
- "@babel/plugin-syntax-jsx": "^7.8.3"
- }
- },
- "@babel/plugin-transform-regenerator": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.8.3.tgz",
- "integrity": "sha512-qt/kcur/FxrQrzFR432FGZznkVAjiyFtCOANjkAKwCbt465L6ZCiUQh2oMYGU3Wo8LRFJxNDFwWn106S5wVUNA==",
- "dev": true,
- "requires": {
- "regenerator-transform": "^0.14.0"
- }
- },
- "@babel/plugin-transform-reserved-words": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.8.3.tgz",
- "integrity": "sha512-mwMxcycN3omKFDjDQUl+8zyMsBfjRFr0Zn/64I41pmjv4NJuqcYlEtezwYtw9TFd9WR1vN5kiM+O0gMZzO6L0A==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.8.3"
- }
- },
- "@babel/plugin-transform-shorthand-properties": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.8.3.tgz",
- "integrity": "sha512-I9DI6Odg0JJwxCHzbzW08ggMdCezoWcuQRz3ptdudgwaHxTjxw5HgdFJmZIkIMlRymL6YiZcped4TTCB0JcC8w==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.8.3"
- }
- },
- "@babel/plugin-transform-spread": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.8.3.tgz",
- "integrity": "sha512-CkuTU9mbmAoFOI1tklFWYYbzX5qCIZVXPVy0jpXgGwkplCndQAa58s2jr66fTeQnA64bDox0HL4U56CFYoyC7g==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.8.3"
- }
- },
- "@babel/plugin-transform-sticky-regex": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.8.3.tgz",
- "integrity": "sha512-9Spq0vGCD5Bb4Z/ZXXSK5wbbLFMG085qd2vhL1JYu1WcQ5bXqZBAYRzU1d+p79GcHs2szYv5pVQCX13QgldaWw==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.8.3",
- "@babel/helper-regex": "^7.8.3"
- }
- },
- "@babel/plugin-transform-template-literals": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.8.3.tgz",
- "integrity": "sha512-820QBtykIQOLFT8NZOcTRJ1UNuztIELe4p9DCgvj4NK+PwluSJ49we7s9FB1HIGNIYT7wFUJ0ar2QpCDj0escQ==",
- "dev": true,
- "requires": {
- "@babel/helper-annotate-as-pure": "^7.8.3",
- "@babel/helper-plugin-utils": "^7.8.3"
- }
- },
- "@babel/plugin-transform-typeof-symbol": {
- "version": "7.8.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.8.4.tgz",
- "integrity": "sha512-2QKyfjGdvuNfHsb7qnBBlKclbD4CfshH2KvDabiijLMGXPHJXGxtDzwIF7bQP+T0ysw8fYTtxPafgfs/c1Lrqg==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.8.3"
- }
- },
- "@babel/plugin-transform-unicode-regex": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.8.3.tgz",
- "integrity": "sha512-+ufgJjYdmWfSQ+6NS9VGUR2ns8cjJjYbrbi11mZBTaWm+Fui/ncTLFF28Ei1okavY+xkojGr1eJxNsWYeA5aZw==",
- "dev": true,
- "requires": {
- "@babel/helper-create-regexp-features-plugin": "^7.8.3",
- "@babel/helper-plugin-utils": "^7.8.3"
- }
- },
- "@babel/preset-env": {
- "version": "7.8.4",
- "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.8.4.tgz",
- "integrity": "sha512-HihCgpr45AnSOHRbS5cWNTINs0TwaR8BS8xIIH+QwiW8cKL0llV91njQMpeMReEPVs+1Ao0x3RLEBLtt1hOq4w==",
- "dev": true,
- "requires": {
- "@babel/compat-data": "^7.8.4",
- "@babel/helper-compilation-targets": "^7.8.4",
- "@babel/helper-module-imports": "^7.8.3",
- "@babel/helper-plugin-utils": "^7.8.3",
- "@babel/plugin-proposal-async-generator-functions": "^7.8.3",
- "@babel/plugin-proposal-dynamic-import": "^7.8.3",
- "@babel/plugin-proposal-json-strings": "^7.8.3",
- "@babel/plugin-proposal-nullish-coalescing-operator": "^7.8.3",
- "@babel/plugin-proposal-object-rest-spread": "^7.8.3",
- "@babel/plugin-proposal-optional-catch-binding": "^7.8.3",
- "@babel/plugin-proposal-optional-chaining": "^7.8.3",
- "@babel/plugin-proposal-unicode-property-regex": "^7.8.3",
- "@babel/plugin-syntax-async-generators": "^7.8.0",
- "@babel/plugin-syntax-dynamic-import": "^7.8.0",
- "@babel/plugin-syntax-json-strings": "^7.8.0",
- "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0",
- "@babel/plugin-syntax-object-rest-spread": "^7.8.0",
- "@babel/plugin-syntax-optional-catch-binding": "^7.8.0",
- "@babel/plugin-syntax-optional-chaining": "^7.8.0",
- "@babel/plugin-syntax-top-level-await": "^7.8.3",
- "@babel/plugin-transform-arrow-functions": "^7.8.3",
- "@babel/plugin-transform-async-to-generator": "^7.8.3",
- "@babel/plugin-transform-block-scoped-functions": "^7.8.3",
- "@babel/plugin-transform-block-scoping": "^7.8.3",
- "@babel/plugin-transform-classes": "^7.8.3",
- "@babel/plugin-transform-computed-properties": "^7.8.3",
- "@babel/plugin-transform-destructuring": "^7.8.3",
- "@babel/plugin-transform-dotall-regex": "^7.8.3",
- "@babel/plugin-transform-duplicate-keys": "^7.8.3",
- "@babel/plugin-transform-exponentiation-operator": "^7.8.3",
- "@babel/plugin-transform-for-of": "^7.8.4",
- "@babel/plugin-transform-function-name": "^7.8.3",
- "@babel/plugin-transform-literals": "^7.8.3",
- "@babel/plugin-transform-member-expression-literals": "^7.8.3",
- "@babel/plugin-transform-modules-amd": "^7.8.3",
- "@babel/plugin-transform-modules-commonjs": "^7.8.3",
- "@babel/plugin-transform-modules-systemjs": "^7.8.3",
- "@babel/plugin-transform-modules-umd": "^7.8.3",
- "@babel/plugin-transform-named-capturing-groups-regex": "^7.8.3",
- "@babel/plugin-transform-new-target": "^7.8.3",
- "@babel/plugin-transform-object-super": "^7.8.3",
- "@babel/plugin-transform-parameters": "^7.8.4",
- "@babel/plugin-transform-property-literals": "^7.8.3",
- "@babel/plugin-transform-regenerator": "^7.8.3",
- "@babel/plugin-transform-reserved-words": "^7.8.3",
- "@babel/plugin-transform-shorthand-properties": "^7.8.3",
- "@babel/plugin-transform-spread": "^7.8.3",
- "@babel/plugin-transform-sticky-regex": "^7.8.3",
- "@babel/plugin-transform-template-literals": "^7.8.3",
- "@babel/plugin-transform-typeof-symbol": "^7.8.4",
- "@babel/plugin-transform-unicode-regex": "^7.8.3",
- "@babel/types": "^7.8.3",
- "browserslist": "^4.8.5",
- "core-js-compat": "^3.6.2",
- "invariant": "^2.2.2",
- "levenary": "^1.1.1",
- "semver": "^5.5.0"
- }
- },
- "@babel/preset-react": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.8.3.tgz",
- "integrity": "sha512-9hx0CwZg92jGb7iHYQVgi0tOEHP/kM60CtWJQnmbATSPIQQ2xYzfoCI3EdqAhFBeeJwYMdWQuDUHMsuDbH9hyQ==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.8.3",
- "@babel/plugin-transform-react-display-name": "^7.8.3",
- "@babel/plugin-transform-react-jsx": "^7.8.3",
- "@babel/plugin-transform-react-jsx-self": "^7.8.3",
- "@babel/plugin-transform-react-jsx-source": "^7.8.3"
- }
- },
- "@babel/register": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.8.3.tgz",
- "integrity": "sha512-t7UqebaWwo9nXWClIPLPloa5pN33A2leVs8Hf0e9g9YwUP8/H9NeR7DJU+4CXo23QtjChQv5a3DjEtT83ih1rg==",
- "dev": true,
- "requires": {
- "find-cache-dir": "^2.0.0",
- "lodash": "^4.17.13",
- "make-dir": "^2.1.0",
- "pirates": "^4.0.0",
- "source-map-support": "^0.5.16"
- }
- },
- "@babel/runtime": {
- "version": "7.8.4",
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.8.4.tgz",
- "integrity": "sha512-neAp3zt80trRVBI1x0azq6c57aNBqYZH8KhMm3TaB7wEI5Q4A2SHfBHE8w9gOhI/lrqxtEbXZgQIrHP+wvSGwQ==",
- "requires": {
- "regenerator-runtime": "^0.13.2"
- },
- "dependencies": {
- "regenerator-runtime": {
- "version": "0.13.3",
- "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz",
- "integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw=="
- }
- }
- },
- "@babel/template": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz",
- "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==",
- "dev": true,
- "requires": {
- "@babel/code-frame": "^7.8.3",
- "@babel/parser": "^7.8.3",
- "@babel/types": "^7.8.3"
- }
- },
- "@babel/traverse": {
- "version": "7.8.4",
- "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.4.tgz",
- "integrity": "sha512-NGLJPZwnVEyBPLI+bl9y9aSnxMhsKz42so7ApAv9D+b4vAFPpY013FTS9LdKxcABoIYFU52HcYga1pPlx454mg==",
- "dev": true,
- "requires": {
- "@babel/code-frame": "^7.8.3",
- "@babel/generator": "^7.8.4",
- "@babel/helper-function-name": "^7.8.3",
- "@babel/helper-split-export-declaration": "^7.8.3",
- "@babel/parser": "^7.8.4",
- "@babel/types": "^7.8.3",
- "debug": "^4.1.0",
- "globals": "^11.1.0",
- "lodash": "^4.17.13"
- },
- "dependencies": {
- "debug": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
- "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
- "dev": true,
- "requires": {
- "ms": "^2.1.1"
- }
- },
- "ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
- "dev": true
- }
- }
- },
- "@babel/types": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz",
- "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==",
- "dev": true,
- "requires": {
- "esutils": "^2.0.2",
- "lodash": "^4.17.13",
- "to-fast-properties": "^2.0.0"
- }
- },
- "@flowjs/ng-flow": {
- "version": "2.7.8",
- "resolved": "https://registry.npmjs.org/@flowjs/ng-flow/-/ng-flow-2.7.8.tgz",
- "integrity": "sha1-HZ+dH4Ks2lNgMowxW6z9YNv9mBk="
- },
- "@mrmlnc/readdir-enhanced": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz",
- "integrity": "sha1-UkryQNGjYFJ7cwR17PoTRKpUDd4=",
- "dev": true,
- "requires": {
- "call-me-maybe": "^1.0.1",
- "glob-to-regexp": "^0.3.0"
- }
- },
- "@nodelib/fs.scandir": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz",
- "integrity": "sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==",
- "dev": true,
- "requires": {
- "@nodelib/fs.stat": "2.0.3",
- "run-parallel": "^1.1.9"
- },
- "dependencies": {
- "@nodelib/fs.stat": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz",
- "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==",
- "dev": true
- }
- }
- },
- "@nodelib/fs.stat": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz",
- "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==",
- "dev": true
- },
- "@nodelib/fs.walk": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz",
- "integrity": "sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==",
- "dev": true,
- "requires": {
- "@nodelib/fs.scandir": "2.1.3",
- "fastq": "^1.6.0"
- }
- },
- "@types/color-name": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz",
- "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==",
- "dev": true
- },
- "@types/events": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz",
- "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==",
- "dev": true
- },
- "@types/glob": {
- "version": "7.1.1",
- "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.1.tgz",
- "integrity": "sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w==",
- "dev": true,
- "requires": {
- "@types/events": "*",
- "@types/minimatch": "*",
- "@types/node": "*"
- }
- },
- "@types/jquery": {
- "version": "3.3.32",
- "resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-3.3.32.tgz",
- "integrity": "sha512-UKoof2mnV/X1/Ix2g+V2Ny5sgHjV8nK/UJbiYxuo4zPwzGyFlZ/mp4KaePb2VqQrqJctmcDQNA57buU84/2uIw==",
- "requires": {
- "@types/sizzle": "*"
- }
- },
- "@types/minimatch": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz",
- "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==",
- "dev": true
- },
- "@types/minimist": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.0.tgz",
- "integrity": "sha1-aaI6OtKcrwCX8G7aWbNh7i8GOfY=",
- "dev": true
- },
- "@types/node": {
- "version": "13.7.4",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-13.7.4.tgz",
- "integrity": "sha512-oVeL12C6gQS/GAExndigSaLxTrKpQPxewx9bOcwfvJiJge4rr7wNaph4J+ns5hrmIV2as5qxqN8YKthn9qh0jw==",
- "dev": true
- },
- "@types/normalize-package-data": {
- "version": "2.4.0",
- "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz",
- "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==",
- "dev": true
- },
- "@types/parse-json": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz",
- "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==",
- "dev": true
- },
- "@types/sizzle": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.2.tgz",
- "integrity": "sha512-7EJYyKTL7tFR8+gDbB6Wwz/arpGa0Mywk1TJbNzKzHtzbwVmY4HR9WqS5VV7dsBUKQmPNr192jHr/VpBluj/hg=="
- },
- "@types/unist": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.3.tgz",
- "integrity": "sha512-FvUupuM3rlRsRtCN+fDudtmytGO6iHJuuRKS1Ss0pG5z8oX0diNEw94UEL7hgDbpN94rgaK5R7sWm6RrSkZuAQ==",
- "dev": true
- },
- "@types/vfile": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/@types/vfile/-/vfile-3.0.2.tgz",
- "integrity": "sha512-b3nLFGaGkJ9rzOcuXRfHkZMdjsawuDD0ENL9fzTophtBg8FJHSGbH7daXkEpcwy3v7Xol3pAvsmlYyFhR4pqJw==",
- "dev": true,
- "requires": {
- "@types/node": "*",
- "@types/unist": "*",
- "@types/vfile-message": "*"
- }
- },
- "@types/vfile-message": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/@types/vfile-message/-/vfile-message-2.0.0.tgz",
- "integrity": "sha512-GpTIuDpb9u4zIO165fUy9+fXcULdD8HFRNli04GehoMVbeNq7D6OBnqSmg3lxZnC+UvgUhEWKxdKiwYUkGltIw==",
- "dev": true,
- "requires": {
- "vfile-message": "*"
- }
- },
- "@webassemblyjs/ast": {
- "version": "1.8.5",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.8.5.tgz",
- "integrity": "sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ==",
- "dev": true,
- "requires": {
- "@webassemblyjs/helper-module-context": "1.8.5",
- "@webassemblyjs/helper-wasm-bytecode": "1.8.5",
- "@webassemblyjs/wast-parser": "1.8.5"
- }
- },
- "@webassemblyjs/floating-point-hex-parser": {
- "version": "1.8.5",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz",
- "integrity": "sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ==",
- "dev": true
- },
- "@webassemblyjs/helper-api-error": {
- "version": "1.8.5",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz",
- "integrity": "sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA==",
- "dev": true
- },
- "@webassemblyjs/helper-buffer": {
- "version": "1.8.5",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz",
- "integrity": "sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q==",
- "dev": true
- },
- "@webassemblyjs/helper-code-frame": {
- "version": "1.8.5",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz",
- "integrity": "sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ==",
- "dev": true,
- "requires": {
- "@webassemblyjs/wast-printer": "1.8.5"
- }
- },
- "@webassemblyjs/helper-fsm": {
- "version": "1.8.5",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz",
- "integrity": "sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow==",
- "dev": true
- },
- "@webassemblyjs/helper-module-context": {
- "version": "1.8.5",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz",
- "integrity": "sha512-/O1B236mN7UNEU4t9X7Pj38i4VoU8CcMHyy3l2cV/kIF4U5KoHXDVqcDuOs1ltkac90IM4vZdHc52t1x8Yfs3g==",
- "dev": true,
- "requires": {
- "@webassemblyjs/ast": "1.8.5",
- "mamacro": "^0.0.3"
- }
- },
- "@webassemblyjs/helper-wasm-bytecode": {
- "version": "1.8.5",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz",
- "integrity": "sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ==",
- "dev": true
- },
- "@webassemblyjs/helper-wasm-section": {
- "version": "1.8.5",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz",
- "integrity": "sha512-VV083zwR+VTrIWWtgIUpqfvVdK4ff38loRmrdDBgBT8ADXYsEZ5mPQ4Nde90N3UYatHdYoDIFb7oHzMncI02tA==",
- "dev": true,
- "requires": {
- "@webassemblyjs/ast": "1.8.5",
- "@webassemblyjs/helper-buffer": "1.8.5",
- "@webassemblyjs/helper-wasm-bytecode": "1.8.5",
- "@webassemblyjs/wasm-gen": "1.8.5"
- }
- },
- "@webassemblyjs/ieee754": {
- "version": "1.8.5",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz",
- "integrity": "sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g==",
- "dev": true,
- "requires": {
- "@xtuc/ieee754": "^1.2.0"
- }
- },
- "@webassemblyjs/leb128": {
- "version": "1.8.5",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.8.5.tgz",
- "integrity": "sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A==",
- "dev": true,
- "requires": {
- "@xtuc/long": "4.2.2"
- }
- },
- "@webassemblyjs/utf8": {
- "version": "1.8.5",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.8.5.tgz",
- "integrity": "sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw==",
- "dev": true
- },
- "@webassemblyjs/wasm-edit": {
- "version": "1.8.5",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz",
- "integrity": "sha512-A41EMy8MWw5yvqj7MQzkDjU29K7UJq1VrX2vWLzfpRHt3ISftOXqrtojn7nlPsZ9Ijhp5NwuODuycSvfAO/26Q==",
- "dev": true,
- "requires": {
- "@webassemblyjs/ast": "1.8.5",
- "@webassemblyjs/helper-buffer": "1.8.5",
- "@webassemblyjs/helper-wasm-bytecode": "1.8.5",
- "@webassemblyjs/helper-wasm-section": "1.8.5",
- "@webassemblyjs/wasm-gen": "1.8.5",
- "@webassemblyjs/wasm-opt": "1.8.5",
- "@webassemblyjs/wasm-parser": "1.8.5",
- "@webassemblyjs/wast-printer": "1.8.5"
- }
- },
- "@webassemblyjs/wasm-gen": {
- "version": "1.8.5",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz",
- "integrity": "sha512-BCZBT0LURC0CXDzj5FXSc2FPTsxwp3nWcqXQdOZE4U7h7i8FqtFK5Egia6f9raQLpEKT1VL7zr4r3+QX6zArWg==",
- "dev": true,
- "requires": {
- "@webassemblyjs/ast": "1.8.5",
- "@webassemblyjs/helper-wasm-bytecode": "1.8.5",
- "@webassemblyjs/ieee754": "1.8.5",
- "@webassemblyjs/leb128": "1.8.5",
- "@webassemblyjs/utf8": "1.8.5"
- }
- },
- "@webassemblyjs/wasm-opt": {
- "version": "1.8.5",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz",
- "integrity": "sha512-HKo2mO/Uh9A6ojzu7cjslGaHaUU14LdLbGEKqTR7PBKwT6LdPtLLh9fPY33rmr5wcOMrsWDbbdCHq4hQUdd37Q==",
- "dev": true,
- "requires": {
- "@webassemblyjs/ast": "1.8.5",
- "@webassemblyjs/helper-buffer": "1.8.5",
- "@webassemblyjs/wasm-gen": "1.8.5",
- "@webassemblyjs/wasm-parser": "1.8.5"
- }
- },
- "@webassemblyjs/wasm-parser": {
- "version": "1.8.5",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz",
- "integrity": "sha512-pi0SYE9T6tfcMkthwcgCpL0cM9nRYr6/6fjgDtL6q/ZqKHdMWvxitRi5JcZ7RI4SNJJYnYNaWy5UUrHQy998lw==",
- "dev": true,
- "requires": {
- "@webassemblyjs/ast": "1.8.5",
- "@webassemblyjs/helper-api-error": "1.8.5",
- "@webassemblyjs/helper-wasm-bytecode": "1.8.5",
- "@webassemblyjs/ieee754": "1.8.5",
- "@webassemblyjs/leb128": "1.8.5",
- "@webassemblyjs/utf8": "1.8.5"
- }
- },
- "@webassemblyjs/wast-parser": {
- "version": "1.8.5",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz",
- "integrity": "sha512-daXC1FyKWHF1i11obK086QRlsMsY4+tIOKgBqI1lxAnkp9xe9YMcgOxm9kLe+ttjs5aWV2KKE1TWJCN57/Btsg==",
- "dev": true,
- "requires": {
- "@webassemblyjs/ast": "1.8.5",
- "@webassemblyjs/floating-point-hex-parser": "1.8.5",
- "@webassemblyjs/helper-api-error": "1.8.5",
- "@webassemblyjs/helper-code-frame": "1.8.5",
- "@webassemblyjs/helper-fsm": "1.8.5",
- "@xtuc/long": "4.2.2"
- }
- },
- "@webassemblyjs/wast-printer": {
- "version": "1.8.5",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz",
- "integrity": "sha512-w0U0pD4EhlnvRyeJzBqaVSJAo9w/ce7/WPogeXLzGkO6hzhr4GnQIZ4W4uUt5b9ooAaXPtnXlj0gzsXEOUNYMg==",
- "dev": true,
- "requires": {
- "@webassemblyjs/ast": "1.8.5",
- "@webassemblyjs/wast-parser": "1.8.5",
- "@xtuc/long": "4.2.2"
- }
- },
- "@xtuc/ieee754": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
- "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==",
- "dev": true
- },
- "@xtuc/long": {
- "version": "4.2.2",
- "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz",
- "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==",
- "dev": true
- },
- "abbrev": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
- "integrity": "sha1-+PLIh60Qv2f2NPAFtph/7TF5qsg="
- },
- "accepts": {
- "version": "1.3.7",
- "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz",
- "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==",
- "dev": true,
- "requires": {
- "mime-types": "~2.1.24",
- "negotiator": "0.6.2"
- }
- },
- "acorn": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.0.tgz",
- "integrity": "sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ==",
- "dev": true
- },
- "acorn-jsx": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.1.0.tgz",
- "integrity": "sha512-tMUqwBWfLFbJbizRmEcWSLw6HnFzfdJs2sOJEOwwtVPMoH/0Ay+E703oZz78VSXZiiDcZrQ5XKjPIUQixhmgVw==",
- "dev": true
- },
- "acorn-walk": {
- "version": "7.1.1",
- "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.1.1.tgz",
- "integrity": "sha512-wdlPY2tm/9XBr7QkKlq0WQVgiuGTX6YWPyRyBviSoScBuLfTVQhvwg6wJ369GJ/1nPfTLMfnrFIfjqVg6d+jQQ==",
- "dev": true
- },
- "add-dom-event-listener": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/add-dom-event-listener/-/add-dom-event-listener-1.1.0.tgz",
- "integrity": "sha512-WCxx1ixHT0GQU9hb0KI/mhgRQhnU+U3GvwY6ZvVjYq8rsihIGoaIOUbY0yMPBxLH5MDtr0kz3fisWGNcbWW7Jw==",
- "requires": {
- "object-assign": "4.x"
- }
- },
- "aggregate-error": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.0.1.tgz",
- "integrity": "sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA==",
- "dev": true,
- "requires": {
- "clean-stack": "^2.0.0",
- "indent-string": "^4.0.0"
- }
- },
- "ajv": {
- "version": "6.11.0",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.11.0.tgz",
- "integrity": "sha512-nCprB/0syFYy9fVYU1ox1l2KN8S9I+tziH8D4zdZuLT3N6RMlGSGt5FSTpAiHB/Whv8Qs1cWHma1aMKZyaHRKA==",
- "dev": true,
- "requires": {
- "fast-deep-equal": "^3.1.1",
- "fast-json-stable-stringify": "^2.0.0",
- "json-schema-traverse": "^0.4.1",
- "uri-js": "^4.2.2"
- }
- },
- "ajv-errors": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz",
- "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==",
- "dev": true
- },
- "ajv-keywords": {
- "version": "3.4.1",
- "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz",
- "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==",
- "dev": true
- },
- "alter": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/alter/-/alter-0.2.0.tgz",
- "integrity": "sha1-x1iICGF1cgNKrmJICvJrHU0cs80=",
- "dev": true,
- "requires": {
- "stable": "~0.1.3"
- }
- },
- "amdefine": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz",
- "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=",
- "dev": true
- },
- "angular": {
- "version": "1.5.8",
- "resolved": "https://registry.npmjs.org/angular/-/angular-1.5.8.tgz",
- "integrity": "sha1-klpTkrjCEtCVctxEbbfgEmTglMs="
- },
- "angular-animate": {
- "version": "1.5.8",
- "resolved": "https://registry.npmjs.org/angular-animate/-/angular-animate-1.5.8.tgz",
- "integrity": "sha1-U19zaSJaun+xW/cTTHGxW8Y1xYY="
- },
- "angular-aria": {
- "version": "1.5.8",
- "resolved": "https://registry.npmjs.org/angular-aria/-/angular-aria-1.5.8.tgz",
- "integrity": "sha1-VY+gfcgsb6V7FDjmYLvc/LgFovU="
- },
- "angular-breadcrumb": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/angular-breadcrumb/-/angular-breadcrumb-0.4.1.tgz",
- "integrity": "sha1-W/9XgMeZzMYIglioQlbTR/6WkaU="
- },
- "angular-carousel": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/angular-carousel/-/angular-carousel-1.1.0.tgz",
- "integrity": "sha1-PmlA5ovRio85L8Qx2XGSrDSIMdE="
- },
- "angular-cookies": {
- "version": "1.5.8",
- "resolved": "https://registry.npmjs.org/angular-cookies/-/angular-cookies-1.5.8.tgz",
- "integrity": "sha1-CPOfouF7bjqRbNO6c1L51wLoqf4="
- },
- "angular-drag-and-drop-lists": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/angular-drag-and-drop-lists/-/angular-drag-and-drop-lists-1.4.0.tgz",
- "integrity": "sha1-KREEyTXhCkL4RZaW7TAGlQnXm/w="
- },
- "angular-fixed-table-header": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/angular-fixed-table-header/-/angular-fixed-table-header-0.2.1.tgz",
- "integrity": "sha1-IypxTwohWKdd3DH8cvvVkjeVQY0=",
- "requires": {
- "angular": "^1.4.0"
- }
- },
- "angular-fullscreen": {
- "version": "git://github.com/fabiobiondi/angular-fullscreen.git#8217174565761d3566807bc60a73b5ca015b8cb6",
- "from": "git://github.com/fabiobiondi/angular-fullscreen.git#master"
- },
- "angular-gridster": {
- "version": "0.13.14",
- "resolved": "https://registry.npmjs.org/angular-gridster/-/angular-gridster-0.13.14.tgz",
- "integrity": "sha1-er6/Y9fJ++xFOLnMpFfg2oBdQgQ="
- },
- "angular-hotkeys": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/angular-hotkeys/-/angular-hotkeys-1.7.0.tgz",
- "integrity": "sha1-BS5rb0TfzYJEJ3mLfxDhkX6HAKE="
- },
- "angular-jwt": {
- "version": "0.1.11",
- "resolved": "https://registry.npmjs.org/angular-jwt/-/angular-jwt-0.1.11.tgz",
- "integrity": "sha512-793dv5vXOXaW5/cweMd+sqSf9dPhbazDya3szTVOQ84MDEj1nYLJrixBBa7WNtZeMqz7ylWX7djnFgqLjEWcHw=="
- },
- "angular-material": {
- "version": "1.1.19",
- "resolved": "https://registry.npmjs.org/angular-material/-/angular-material-1.1.19.tgz",
- "integrity": "sha512-R46TfnVsAkhRDcsbrFR5DB+Ja4LpPGugAQDHYItcvLYCIkVMf07cIx1q6WyFPiZQVwz3j+ECMveqsjX+jEUrgg=="
- },
- "angular-material-data-table": {
- "version": "0.10.10",
- "resolved": "https://registry.npmjs.org/angular-material-data-table/-/angular-material-data-table-0.10.10.tgz",
- "integrity": "sha1-IptAJ0XsGhRvB9qNHlJr5lQISe4="
- },
- "angular-material-expansion-panel": {
- "version": "0.7.2",
- "resolved": "https://registry.npmjs.org/angular-material-expansion-panel/-/angular-material-expansion-panel-0.7.2.tgz",
- "integrity": "sha1-jCV5dN/xd8wHYgjQO9sKgy34Tqw="
- },
- "angular-material-icons": {
- "version": "0.7.1",
- "resolved": "https://registry.npmjs.org/angular-material-icons/-/angular-material-icons-0.7.1.tgz",
- "integrity": "sha1-5eq0hTthwzH1j55+blS24dZeT5s=",
- "requires": {
- "angular": ">=1.3.0"
- }
- },
- "angular-messages": {
- "version": "1.5.8",
- "resolved": "https://registry.npmjs.org/angular-messages/-/angular-messages-1.5.8.tgz",
- "integrity": "sha1-H5HR5/P08uWrWt7+4smnGWsaNM8="
- },
- "angular-route": {
- "version": "1.5.8",
- "resolved": "https://registry.npmjs.org/angular-route/-/angular-route-1.5.8.tgz",
- "integrity": "sha1-lkCT3n7I3FeZvVapOmzl9gCVZ0s="
- },
- "angular-sanitize": {
- "version": "1.5.8",
- "resolved": "https://registry.npmjs.org/angular-sanitize/-/angular-sanitize-1.5.8.tgz",
- "integrity": "sha1-GDL2lIfuggohy+MAVaj7G98perg="
- },
- "angular-socialshare": {
- "version": "2.3.11",
- "resolved": "https://registry.npmjs.org/angular-socialshare/-/angular-socialshare-2.3.11.tgz",
- "integrity": "sha1-BTKLM9mF/Zt+FQAmPCCpqg+ELJk="
- },
- "angular-storage": {
- "version": "0.0.15",
- "resolved": "https://registry.npmjs.org/angular-storage/-/angular-storage-0.0.15.tgz",
- "integrity": "sha1-AF1kgImChI2UlyXisr+Qod0nr8E="
- },
- "angular-touch": {
- "version": "1.5.8",
- "resolved": "https://registry.npmjs.org/angular-touch/-/angular-touch-1.5.8.tgz",
- "integrity": "sha1-skQ8Q1+HdGF+55uxH7ae9PXVuPU="
- },
- "angular-translate": {
- "version": "2.18.1",
- "resolved": "https://registry.npmjs.org/angular-translate/-/angular-translate-2.18.1.tgz",
- "integrity": "sha1-sp7Q0vm6xEB156rTKEFmxZ4VB5E=",
- "requires": {
- "angular": ">=1.2.26 <=1.7"
- }
- },
- "angular-translate-handler-log": {
- "version": "2.18.1",
- "resolved": "https://registry.npmjs.org/angular-translate-handler-log/-/angular-translate-handler-log-2.18.1.tgz",
- "integrity": "sha1-icu1mCeALYb4EVJ1+/iNbYiWsNQ=",
- "requires": {
- "angular-translate": "~2.18.1"
- }
- },
- "angular-translate-interpolation-messageformat": {
- "version": "2.18.1",
- "resolved": "https://registry.npmjs.org/angular-translate-interpolation-messageformat/-/angular-translate-interpolation-messageformat-2.18.1.tgz",
- "integrity": "sha1-FsUq4MYcJA8PJBZKBSGUPPi6QI4=",
- "requires": {
- "angular-translate": "~2.18.1",
- "messageformat": "~1.0.2"
- }
- },
- "angular-translate-loader-static-files": {
- "version": "2.18.1",
- "resolved": "https://registry.npmjs.org/angular-translate-loader-static-files/-/angular-translate-loader-static-files-2.18.1.tgz",
- "integrity": "sha1-rQw8iDsYsIm9uNsCu9Nm2QP4V8w=",
- "requires": {
- "angular-translate": "~2.18.1"
- }
- },
- "angular-translate-storage-cookie": {
- "version": "2.18.1",
- "resolved": "https://registry.npmjs.org/angular-translate-storage-cookie/-/angular-translate-storage-cookie-2.18.1.tgz",
- "integrity": "sha1-j8vaspb6gkkOALQorxp0ahf0QVY=",
- "requires": {
- "angular-cookies": ">=1.2.26 <1.8",
- "angular-translate": "~2.18.1"
- }
- },
- "angular-translate-storage-local": {
- "version": "2.18.1",
- "resolved": "https://registry.npmjs.org/angular-translate-storage-local/-/angular-translate-storage-local-2.18.1.tgz",
- "integrity": "sha1-lHQP5NgBq3gpopofBeHDkFTIcwM=",
- "requires": {
- "angular-translate": "~2.18.1",
- "angular-translate-storage-cookie": "~2.18.1"
- }
- },
- "angular-ui-ace": {
- "version": "0.2.3",
- "resolved": "https://registry.npmjs.org/angular-ui-ace/-/angular-ui-ace-0.2.3.tgz",
- "integrity": "sha1-PLkDQoEAYho2f8f2QUQOl6QqJtA="
- },
- "angular-ui-router": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/angular-ui-router/-/angular-ui-router-0.3.2.tgz",
- "integrity": "sha1-wn4EljCcmSGNVlWYWxZKCWq1IKk=",
- "requires": {
- "angular": "^1.0.8"
- }
- },
- "angular-websocket": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/angular-websocket/-/angular-websocket-2.0.1.tgz",
- "integrity": "sha1-D7TWDtkBi+WD0DHuxOVrRXy43O4=",
- "requires": {
- "angular": "*",
- "ws": "^1.0.0"
- }
- },
- "ansi-colors": {
- "version": "3.2.4",
- "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz",
- "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==",
- "dev": true
- },
- "ansi-escapes": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz",
- "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4="
- },
- "ansi-html": {
- "version": "0.0.7",
- "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz",
- "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=",
- "dev": true
- },
- "ansi-regex": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
- "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
- },
- "ansi-styles": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
- "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4="
- },
- "anymatch": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz",
- "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==",
- "dev": true,
- "requires": {
- "micromatch": "^3.1.4",
- "normalize-path": "^2.1.1"
- },
- "dependencies": {
- "normalize-path": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
- "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
- "dev": true,
- "requires": {
- "remove-trailing-separator": "^1.0.1"
- }
- }
- }
- },
- "aproba": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz",
- "integrity": "sha1-aALmJk79GMeQobDVF/DyYnvyyUo=",
- "dev": true
- },
- "are-we-there-yet": {
- "version": "1.1.5",
- "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz",
- "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==",
- "dev": true,
- "requires": {
- "delegates": "^1.0.0",
- "readable-stream": "^2.0.6"
- }
- },
- "argparse": {
- "version": "1.0.10",
- "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
- "integrity": "sha1-vNZ5HqWuCXJeF+WtmIE0zUCz2RE=",
- "dev": true,
- "requires": {
- "sprintf-js": "~1.0.2"
- }
- },
- "arr-diff": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
- "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
- "dev": true
- },
- "arr-flatten": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
- "integrity": "sha1-NgSLv/TntH4TZkQxbJlmnqWukfE=",
- "dev": true
- },
- "arr-union": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
- "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=",
- "dev": true
- },
- "array-find-index": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz",
- "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=",
- "dev": true
- },
- "array-flatten": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz",
- "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==",
- "dev": true
- },
- "array-includes": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.1.tgz",
- "integrity": "sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ==",
- "dev": true,
- "requires": {
- "define-properties": "^1.1.3",
- "es-abstract": "^1.17.0",
- "is-string": "^1.0.5"
- }
- },
- "array-union": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz",
- "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=",
- "dev": true,
- "requires": {
- "array-uniq": "^1.0.1"
- }
- },
- "array-uniq": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz",
- "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=",
- "dev": true
- },
- "array-unique": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
- "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
- "dev": true
- },
- "array.prototype.flat": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz",
- "integrity": "sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ==",
- "dev": true,
- "requires": {
- "define-properties": "^1.1.3",
- "es-abstract": "^1.17.0-next.1"
- }
- },
- "arrify": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
- "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=",
- "dev": true
- },
- "asap": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
- "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY="
- },
- "asn1": {
- "version": "0.2.4",
- "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz",
- "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==",
- "dev": true,
- "requires": {
- "safer-buffer": "~2.1.0"
- }
- },
- "asn1.js": {
- "version": "4.10.1",
- "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz",
- "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==",
- "dev": true,
- "requires": {
- "bn.js": "^4.0.0",
- "inherits": "^2.0.1",
- "minimalistic-assert": "^1.0.0"
- }
- },
- "assert": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz",
- "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==",
- "dev": true,
- "requires": {
- "object-assign": "^4.1.1",
- "util": "0.10.3"
- },
- "dependencies": {
- "inherits": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz",
- "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=",
- "dev": true
- },
- "util": {
- "version": "0.10.3",
- "resolved": "http://registry.npmjs.org/util/-/util-0.10.3.tgz",
- "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=",
- "dev": true,
- "requires": {
- "inherits": "2.0.1"
- }
- }
- }
- },
- "assert-plus": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
- "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
- "dev": true
- },
- "assign-symbols": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
- "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=",
- "dev": true
- },
- "ast-types": {
- "version": "0.9.6",
- "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.9.6.tgz",
- "integrity": "sha1-ECyenpAF0+fjgpvwxPok7oYu6bk=",
- "dev": true
- },
- "astral-regex": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz",
- "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==",
- "dev": true
- },
- "async": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/async/-/async-3.1.1.tgz",
- "integrity": "sha512-X5Dj8hK1pJNC2Wzo2Rcp9FBVdJMGRR/S7V+lH46s8GVFhtbo5O4Le5GECCF/8PISVdkUA6mMPvgz7qTTD1rf1g=="
- },
- "async-each": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz",
- "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==",
- "dev": true
- },
- "async-foreach": {
- "version": "0.1.3",
- "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz",
- "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=",
- "dev": true
- },
- "async-limiter": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz",
- "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==",
- "dev": true
- },
- "asynckit": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
- "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
- "dev": true
- },
- "atob": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz",
- "integrity": "sha1-bZUX654DDSQ2ZmZR6GvZ9vE1M8k=",
- "dev": true
- },
- "attr-accept": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/attr-accept/-/attr-accept-1.1.3.tgz",
- "integrity": "sha512-iT40nudw8zmCweivz6j58g+RT33I4KbaIvRUhjNmDwO2WmsQUxFEZZYZ5w3vXe5x5MX9D7mfvA/XaLOZYFR9EQ==",
- "requires": {
- "core-js": "^2.5.0"
- }
- },
- "autoprefixer": {
- "version": "9.7.4",
- "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.7.4.tgz",
- "integrity": "sha512-g0Ya30YrMBAEZk60lp+qfX5YQllG+S5W3GYCFvyHTvhOki0AEQJLPEcIuGRsqVwLi8FvXPVtwTGhfr38hVpm0g==",
- "dev": true,
- "requires": {
- "browserslist": "^4.8.3",
- "caniuse-lite": "^1.0.30001020",
- "chalk": "^2.4.2",
- "normalize-range": "^0.1.2",
- "num2fraction": "^1.2.2",
- "postcss": "^7.0.26",
- "postcss-value-parser": "^4.0.2"
- },
- "dependencies": {
- "ansi-styles": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
- "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
- "dev": true,
- "requires": {
- "color-convert": "^1.9.0"
- }
- },
- "chalk": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
- "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
- "dev": true,
- "requires": {
- "ansi-styles": "^3.2.1",
- "escape-string-regexp": "^1.0.5",
- "supports-color": "^5.3.0"
- }
- },
- "supports-color": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
- "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
- "dev": true,
- "requires": {
- "has-flag": "^3.0.0"
- }
- }
- }
- },
- "aws-sign2": {
- "version": "0.7.0",
- "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
- "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=",
- "dev": true
- },
- "aws4": {
- "version": "1.9.1",
- "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz",
- "integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==",
- "dev": true
- },
- "babel-eslint": {
- "version": "10.0.3",
- "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.0.3.tgz",
- "integrity": "sha512-z3U7eMY6r/3f3/JB9mTsLjyxrv0Yb1zb8PCWCLpguxfCzBIZUwy23R1t/XKewP+8mEN2Ck8Dtr4q20z6ce6SoA==",
- "dev": true,
- "requires": {
- "@babel/code-frame": "^7.0.0",
- "@babel/parser": "^7.0.0",
- "@babel/traverse": "^7.0.0",
- "@babel/types": "^7.0.0",
- "eslint-visitor-keys": "^1.0.0",
- "resolve": "^1.12.0"
- }
- },
- "babel-loader": {
- "version": "8.0.6",
- "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.0.6.tgz",
- "integrity": "sha512-4BmWKtBOBm13uoUwd08UwjZlaw3O9GWf456R9j+5YykFZ6LUIjIKLc0zEZf+hauxPOJs96C8k6FvYD09vWzhYw==",
- "dev": true,
- "requires": {
- "find-cache-dir": "^2.0.0",
- "loader-utils": "^1.0.2",
- "mkdirp": "^0.5.1",
- "pify": "^4.0.1"
- }
- },
- "babel-plugin-dynamic-import-node": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz",
- "integrity": "sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ==",
- "dev": true,
- "requires": {
- "object.assign": "^4.1.0"
- }
- },
- "babel-polyfill": {
- "version": "6.23.0",
- "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.23.0.tgz",
- "integrity": "sha1-g2TKYt+Or7gwSZ9pkXdGbDsDSZ0=",
- "requires": {
- "babel-runtime": "^6.22.0",
- "core-js": "^2.4.0",
- "regenerator-runtime": "^0.10.0"
- },
- "dependencies": {
- "regenerator-runtime": {
- "version": "0.10.5",
- "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz",
- "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg="
- }
- }
- },
- "babel-runtime": {
- "version": "6.26.0",
- "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
- "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
- "requires": {
- "core-js": "^2.4.0",
- "regenerator-runtime": "^0.11.0"
- }
- },
- "bail": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz",
- "integrity": "sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==",
- "dev": true
- },
- "balanced-match": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
- "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
- },
- "base": {
- "version": "0.11.2",
- "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz",
- "integrity": "sha1-e95c7RRbbVUakNuH+DxVi060io8=",
- "dev": true,
- "requires": {
- "cache-base": "^1.0.1",
- "class-utils": "^0.3.5",
- "component-emitter": "^1.2.1",
- "define-property": "^1.0.0",
- "isobject": "^3.0.1",
- "mixin-deep": "^1.2.0",
- "pascalcase": "^0.1.1"
- },
- "dependencies": {
- "define-property": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
- "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
- "dev": true,
- "requires": {
- "is-descriptor": "^1.0.0"
- }
- },
- "is-accessor-descriptor": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
- "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=",
- "dev": true,
- "requires": {
- "kind-of": "^6.0.0"
- }
- },
- "is-data-descriptor": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
- "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=",
- "dev": true,
- "requires": {
- "kind-of": "^6.0.0"
- }
- },
- "is-descriptor": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
- "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=",
- "dev": true,
- "requires": {
- "is-accessor-descriptor": "^1.0.0",
- "is-data-descriptor": "^1.0.0",
- "kind-of": "^6.0.2"
- }
- }
- }
- },
- "base64-js": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz",
- "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g=="
- },
- "batch": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz",
- "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=",
- "dev": true
- },
- "bcrypt-pbkdf": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
- "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
- "dev": true,
- "requires": {
- "tweetnacl": "^0.14.3"
- }
- },
- "big.js": {
- "version": "5.2.2",
- "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz",
- "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==",
- "dev": true
- },
- "binary-extensions": {
- "version": "1.13.1",
- "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz",
- "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==",
- "dev": true
- },
- "bind-decorator": {
- "version": "1.0.11",
- "resolved": "https://registry.npmjs.org/bind-decorator/-/bind-decorator-1.0.11.tgz",
- "integrity": "sha1-5BvAah9l3ZzsR2yRxdrzl4SIJS8="
- },
- "bindings": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz",
- "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==",
- "dev": true,
- "optional": true,
- "requires": {
- "file-uri-to-path": "1.0.0"
- }
- },
- "block-stream": {
- "version": "0.0.9",
- "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz",
- "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=",
- "dev": true,
- "requires": {
- "inherits": "~2.0.0"
- }
- },
- "bluebird": {
- "version": "3.7.2",
- "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
- "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==",
- "dev": true
- },
- "bn.js": {
- "version": "4.11.8",
- "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz",
- "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==",
- "dev": true
- },
- "body-parser": {
- "version": "1.19.0",
- "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz",
- "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==",
- "dev": true,
- "requires": {
- "bytes": "3.1.0",
- "content-type": "~1.0.4",
- "debug": "2.6.9",
- "depd": "~1.1.2",
- "http-errors": "1.7.2",
- "iconv-lite": "0.4.24",
- "on-finished": "~2.3.0",
- "qs": "6.7.0",
- "raw-body": "2.4.0",
- "type-is": "~1.6.17"
- },
- "dependencies": {
- "bytes": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
- "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==",
- "dev": true
- },
- "qs": {
- "version": "6.7.0",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz",
- "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==",
- "dev": true
- }
- }
- },
- "bonjour": {
- "version": "3.5.0",
- "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz",
- "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=",
- "dev": true,
- "requires": {
- "array-flatten": "^2.1.0",
- "deep-equal": "^1.0.1",
- "dns-equal": "^1.0.0",
- "dns-txt": "^2.0.2",
- "multicast-dns": "^6.0.1",
- "multicast-dns-service-types": "^1.1.0"
- }
- },
- "boolbase": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
- "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=",
- "dev": true
- },
- "bowser": {
- "version": "1.9.4",
- "resolved": "https://registry.npmjs.org/bowser/-/bowser-1.9.4.tgz",
- "integrity": "sha512-9IdMmj2KjigRq6oWhmwv1W36pDuA4STQZ8q6YO9um+x07xgYNCD3Oou+WP/3L1HNz7iqythGet3/p4wvc8AAwQ=="
- },
- "brace": {
- "version": "0.10.0",
- "resolved": "https://registry.npmjs.org/brace/-/brace-0.10.0.tgz",
- "integrity": "sha1-7e9OubCSi6HuX3F//BV3SabdXXY=",
- "requires": {
- "w3c-blob": "0.0.1"
- }
- },
- "brace-expansion": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0=",
- "requires": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
- }
- },
- "braces": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
- "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
- "dev": true,
- "requires": {
- "arr-flatten": "^1.1.0",
- "array-unique": "^0.3.2",
- "extend-shallow": "^2.0.1",
- "fill-range": "^4.0.0",
- "isobject": "^3.0.1",
- "repeat-element": "^1.1.2",
- "snapdragon": "^0.8.1",
- "snapdragon-node": "^2.0.1",
- "split-string": "^3.0.2",
- "to-regex": "^3.0.1"
- },
- "dependencies": {
- "extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "dev": true,
- "requires": {
- "is-extendable": "^0.1.0"
- }
- }
- }
- },
- "brorand": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz",
- "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=",
- "dev": true
- },
- "browserify-aes": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz",
- "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==",
- "dev": true,
- "requires": {
- "buffer-xor": "^1.0.3",
- "cipher-base": "^1.0.0",
- "create-hash": "^1.1.0",
- "evp_bytestokey": "^1.0.3",
- "inherits": "^2.0.1",
- "safe-buffer": "^5.0.1"
- }
- },
- "browserify-cipher": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz",
- "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==",
- "dev": true,
- "requires": {
- "browserify-aes": "^1.0.4",
- "browserify-des": "^1.0.0",
- "evp_bytestokey": "^1.0.0"
- }
- },
- "browserify-des": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz",
- "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==",
- "dev": true,
- "requires": {
- "cipher-base": "^1.0.1",
- "des.js": "^1.0.0",
- "inherits": "^2.0.1",
- "safe-buffer": "^5.1.2"
- }
- },
- "browserify-rsa": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz",
- "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=",
- "dev": true,
- "requires": {
- "bn.js": "^4.1.0",
- "randombytes": "^2.0.1"
- }
- },
- "browserify-sign": {
- "version": "4.0.4",
- "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz",
- "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=",
- "dev": true,
- "requires": {
- "bn.js": "^4.1.1",
- "browserify-rsa": "^4.0.0",
- "create-hash": "^1.1.0",
- "create-hmac": "^1.1.2",
- "elliptic": "^6.0.0",
- "inherits": "^2.0.1",
- "parse-asn1": "^5.0.0"
- }
- },
- "browserify-zlib": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz",
- "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==",
- "dev": true,
- "requires": {
- "pako": "~1.0.5"
- }
- },
- "browserslist": {
- "version": "4.8.7",
- "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.8.7.tgz",
- "integrity": "sha512-gFOnZNYBHrEyUML0xr5NJ6edFaaKbTFX9S9kQHlYfCP0Rit/boRIz4G+Avq6/4haEKJXdGGUnoolx+5MWW2BoA==",
- "dev": true,
- "requires": {
- "caniuse-lite": "^1.0.30001027",
- "electron-to-chromium": "^1.3.349",
- "node-releases": "^1.1.49"
- }
- },
- "buffer": {
- "version": "4.9.2",
- "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz",
- "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==",
- "dev": true,
- "requires": {
- "base64-js": "^1.0.2",
- "ieee754": "^1.1.4",
- "isarray": "^1.0.0"
- }
- },
- "buffer-from": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
- "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==",
- "dev": true
- },
- "buffer-indexof": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz",
- "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==",
- "dev": true
- },
- "buffer-xor": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz",
- "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=",
- "dev": true
- },
- "builtin-status-codes": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz",
- "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=",
- "dev": true
- },
- "bytes": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz",
- "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=",
- "dev": true
- },
- "cacache": {
- "version": "13.0.1",
- "resolved": "https://registry.npmjs.org/cacache/-/cacache-13.0.1.tgz",
- "integrity": "sha512-5ZvAxd05HDDU+y9BVvcqYu2LLXmPnQ0hW62h32g4xBTgL/MppR4/04NHfj/ycM2y6lmTnbw6HVi+1eN0Psba6w==",
- "dev": true,
- "requires": {
- "chownr": "^1.1.2",
- "figgy-pudding": "^3.5.1",
- "fs-minipass": "^2.0.0",
- "glob": "^7.1.4",
- "graceful-fs": "^4.2.2",
- "infer-owner": "^1.0.4",
- "lru-cache": "^5.1.1",
- "minipass": "^3.0.0",
- "minipass-collect": "^1.0.2",
- "minipass-flush": "^1.0.5",
- "minipass-pipeline": "^1.2.2",
- "mkdirp": "^0.5.1",
- "move-concurrently": "^1.0.1",
- "p-map": "^3.0.0",
- "promise-inflight": "^1.0.1",
- "rimraf": "^2.7.1",
- "ssri": "^7.0.0",
- "unique-filename": "^1.1.1"
- },
- "dependencies": {
- "glob": {
- "version": "7.1.6",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
- "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
- "dev": true,
- "requires": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.0.4",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- }
- },
- "lru-cache": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
- "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
- "dev": true,
- "requires": {
- "yallist": "^3.0.2"
- }
- },
- "yallist": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
- "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
- "dev": true
- }
- }
- },
- "cache-base": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
- "integrity": "sha1-Cn9GQWgxyLZi7jb+TnxZ129marI=",
- "dev": true,
- "requires": {
- "collection-visit": "^1.0.0",
- "component-emitter": "^1.2.1",
- "get-value": "^2.0.6",
- "has-value": "^1.0.0",
- "isobject": "^3.0.1",
- "set-value": "^2.0.0",
- "to-object-path": "^0.3.0",
- "union-value": "^1.0.0",
- "unset-value": "^1.0.0"
- }
- },
- "call-me-maybe": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz",
- "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=",
- "dev": true
- },
- "caller-callsite": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz",
- "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=",
- "dev": true,
- "requires": {
- "callsites": "^2.0.0"
- },
- "dependencies": {
- "callsites": {
- "version": "2.0.0",
- "resolved": "http://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz",
- "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=",
- "dev": true
- }
- }
- },
- "caller-path": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz",
- "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=",
- "dev": true,
- "requires": {
- "caller-callsite": "^2.0.0"
- }
- },
- "callsites": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
- "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
- "dev": true
- },
- "camel-case": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz",
- "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=",
- "dev": true,
- "requires": {
- "no-case": "^2.2.0",
- "upper-case": "^1.1.1"
- }
- },
- "camelcase": {
- "version": "5.3.1",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
- "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
- "dev": true
- },
- "camelcase-keys": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz",
- "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=",
- "dev": true,
- "requires": {
- "camelcase": "^2.0.0",
- "map-obj": "^1.0.0"
- },
- "dependencies": {
- "camelcase": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz",
- "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=",
- "dev": true
- }
- }
- },
- "caniuse-lite": {
- "version": "1.0.30001028",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001028.tgz",
- "integrity": "sha512-Vnrq+XMSHpT7E+LWoIYhs3Sne8h9lx9YJV3acH3THNCwU/9zV93/ta4xVfzTtnqd3rvnuVpVjE3DFqf56tr3aQ==",
- "dev": true
- },
- "canvas-gauges": {
- "version": "2.1.5",
- "resolved": "https://registry.npmjs.org/canvas-gauges/-/canvas-gauges-2.1.5.tgz",
- "integrity": "sha512-7GUd1uukePQPQPIoM8Sh4UrG8om+2RG+D8WN5BCkIp9wAfByzPuZZinsUkfFCyRrEOZ/rhuwBfFnb1ld8IfNrw=="
- },
- "caseless": {
- "version": "0.12.0",
- "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
- "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=",
- "dev": true
- },
- "ccount": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.0.5.tgz",
- "integrity": "sha512-MOli1W+nfbPLlKEhInaxhRdp7KVLFxLN5ykwzHgLsLI3H3gs5jjFAK4Eoj3OzzcxCtumDaI8onoVDeQyWaNTkw==",
- "dev": true
- },
- "chain-function": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/chain-function/-/chain-function-1.0.1.tgz",
- "integrity": "sha512-SxltgMwL9uCko5/ZCLiyG2B7R9fY4pDZUw7hJ4MhirdjBLosoDqkWABi3XMucddHdLiFJMb7PD2MZifZriuMTg=="
- },
- "chalk": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
- "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
- "requires": {
- "ansi-styles": "^2.2.1",
- "escape-string-regexp": "^1.0.2",
- "has-ansi": "^2.0.0",
- "strip-ansi": "^3.0.0",
- "supports-color": "^2.0.0"
- }
- },
- "change-emitter": {
- "version": "0.1.6",
- "resolved": "https://registry.npmjs.org/change-emitter/-/change-emitter-0.1.6.tgz",
- "integrity": "sha1-6LL+PX8at9aaMhma/5HqaTFAlRU="
- },
- "character-entities": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz",
- "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==",
- "dev": true
- },
- "character-entities-html4": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-1.1.4.tgz",
- "integrity": "sha512-HRcDxZuZqMx3/a+qrzxdBKBPUpxWEq9xw2OPZ3a/174ihfrQKVsFhqtthBInFy1zZ9GgZyFXOatNujm8M+El3g==",
- "dev": true
- },
- "character-entities-legacy": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz",
- "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==",
- "dev": true
- },
- "character-reference-invalid": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz",
- "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==",
- "dev": true
- },
- "chardet": {
- "version": "0.4.2",
- "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz",
- "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I="
- },
- "chokidar": {
- "version": "2.1.8",
- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz",
- "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==",
- "dev": true,
- "requires": {
- "anymatch": "^2.0.0",
- "async-each": "^1.0.1",
- "braces": "^2.3.2",
- "fsevents": "^1.2.7",
- "glob-parent": "^3.1.0",
- "inherits": "^2.0.3",
- "is-binary-path": "^1.0.0",
- "is-glob": "^4.0.0",
- "normalize-path": "^3.0.0",
- "path-is-absolute": "^1.0.0",
- "readdirp": "^2.2.1",
- "upath": "^1.1.1"
- }
- },
- "chownr": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz",
- "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==",
- "dev": true
- },
- "chrome-trace-event": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz",
- "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==",
- "dev": true,
- "requires": {
- "tslib": "^1.9.0"
- }
- },
- "cipher-base": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz",
- "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==",
- "dev": true,
- "requires": {
- "inherits": "^2.0.1",
- "safe-buffer": "^5.0.1"
- }
- },
- "class-utils": {
- "version": "0.3.6",
- "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz",
- "integrity": "sha1-+TNprouafOAv1B+q0MqDAzGQxGM=",
- "dev": true,
- "requires": {
- "arr-union": "^3.1.0",
- "define-property": "^0.2.5",
- "isobject": "^3.0.0",
- "static-extend": "^0.1.1"
- },
- "dependencies": {
- "define-property": {
- "version": "0.2.5",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
- "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
- "dev": true,
- "requires": {
- "is-descriptor": "^0.1.0"
- }
- }
- }
- },
- "classnames": {
- "version": "2.2.6",
- "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.2.6.tgz",
- "integrity": "sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q=="
- },
- "clean-css": {
- "version": "4.2.3",
- "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz",
- "integrity": "sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==",
- "dev": true,
- "requires": {
- "source-map": "~0.6.0"
- },
- "dependencies": {
- "source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
- "dev": true
- }
- }
- },
- "clean-stack": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz",
- "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==",
- "dev": true
- },
- "cli-cursor": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz",
- "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=",
- "requires": {
- "restore-cursor": "^2.0.0"
- }
- },
- "cli-width": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz",
- "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk="
- },
- "clipboard": {
- "version": "1.7.1",
- "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-1.7.1.tgz",
- "integrity": "sha1-Ng1taUbpmnof7zleQrqStem1oWs=",
- "requires": {
- "good-listener": "^1.2.2",
- "select": "^1.1.2",
- "tiny-emitter": "^2.0.0"
- }
- },
- "cliui": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz",
- "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=",
- "dev": true,
- "requires": {
- "string-width": "^1.0.1",
- "strip-ansi": "^3.0.1",
- "wrap-ansi": "^2.0.0"
- },
- "dependencies": {
- "is-fullwidth-code-point": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
- "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
- "dev": true,
- "requires": {
- "number-is-nan": "^1.0.0"
- }
- },
- "string-width": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
- "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
- "dev": true,
- "requires": {
- "code-point-at": "^1.0.0",
- "is-fullwidth-code-point": "^1.0.0",
- "strip-ansi": "^3.0.0"
- }
- }
- }
- },
- "clone": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
- "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4="
- },
- "clone-deep": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz",
- "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==",
- "dev": true,
- "requires": {
- "is-plain-object": "^2.0.4",
- "kind-of": "^6.0.2",
- "shallow-clone": "^3.0.0"
- }
- },
- "clone-regexp": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/clone-regexp/-/clone-regexp-2.2.0.tgz",
- "integrity": "sha512-beMpP7BOtTipFuW8hrJvREQ2DrRu3BE7by0ZpibtfBA+qfHYvMGTc2Yb1JMYPKg/JUw0CHYvpg796aNTSW9z7Q==",
- "dev": true,
- "requires": {
- "is-regexp": "^2.0.0"
- }
- },
- "code-point-at": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
- "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
- "dev": true
- },
- "collapse-white-space": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.6.tgz",
- "integrity": "sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ==",
- "dev": true
- },
- "collection-visit": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
- "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
- "dev": true,
- "requires": {
- "map-visit": "^1.0.0",
- "object-visit": "^1.0.0"
- }
- },
- "color-convert": {
- "version": "1.9.3",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
- "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
- "dev": true,
- "requires": {
- "color-name": "1.1.3"
- }
- },
- "color-name": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
- "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
- "dev": true
- },
- "combined-stream": {
- "version": "1.0.8",
- "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
- "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
- "dev": true,
- "requires": {
- "delayed-stream": "~1.0.0"
- }
- },
- "commander": {
- "version": "2.20.3",
- "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
- "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="
- },
- "commondir": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
- "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=",
- "dev": true
- },
- "compass-sass-mixins": {
- "version": "0.12.7",
- "resolved": "https://registry.npmjs.org/compass-sass-mixins/-/compass-sass-mixins-0.12.7.tgz",
- "integrity": "sha1-KsTTEPLr5Ri31qykriTx0yVAnow="
- },
- "component-classes": {
- "version": "1.2.6",
- "resolved": "https://registry.npmjs.org/component-classes/-/component-classes-1.2.6.tgz",
- "integrity": "sha1-xkI5TDYYpNiwuJGe/Mu9kw5c1pE=",
- "requires": {
- "component-indexof": "0.0.3"
- }
- },
- "component-emitter": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz",
- "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==",
- "dev": true
- },
- "component-indexof": {
- "version": "0.0.3",
- "resolved": "https://registry.npmjs.org/component-indexof/-/component-indexof-0.0.3.tgz",
- "integrity": "sha1-EdCRMSI5648yyPJa6csAL/6NPCQ="
- },
- "compressible": {
- "version": "2.0.18",
- "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz",
- "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==",
- "dev": true,
- "requires": {
- "mime-db": ">= 1.43.0 < 2"
- }
- },
- "compression": {
- "version": "1.7.4",
- "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz",
- "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==",
- "dev": true,
- "requires": {
- "accepts": "~1.3.5",
- "bytes": "3.0.0",
- "compressible": "~2.0.16",
- "debug": "2.6.9",
- "on-headers": "~1.0.2",
- "safe-buffer": "5.1.2",
- "vary": "~1.1.2"
- }
- },
- "compression-webpack-plugin": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/compression-webpack-plugin/-/compression-webpack-plugin-3.1.0.tgz",
- "integrity": "sha512-iqTHj3rADN4yHwXMBrQa/xrncex/uEQy8QHlaTKxGchT/hC0SdlJlmL/5eRqffmWq2ep0/Romw6Ld39JjTR/ug==",
- "dev": true,
- "requires": {
- "cacache": "^13.0.1",
- "find-cache-dir": "^3.0.0",
- "neo-async": "^2.5.0",
- "schema-utils": "^2.6.1",
- "serialize-javascript": "^2.1.2",
- "webpack-sources": "^1.0.1"
- },
- "dependencies": {
- "find-cache-dir": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.2.0.tgz",
- "integrity": "sha512-1JKclkYYsf1q9WIJKLZa9S9muC+08RIjzAlLrK4QcYLJMS6mk9yombQ9qf+zJ7H9LS800k0s44L4sDq9VYzqyg==",
- "dev": true,
- "requires": {
- "commondir": "^1.0.1",
- "make-dir": "^3.0.0",
- "pkg-dir": "^4.1.0"
- }
- },
- "find-up": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
- "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
- "dev": true,
- "requires": {
- "locate-path": "^5.0.0",
- "path-exists": "^4.0.0"
- }
- },
- "locate-path": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
- "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
- "dev": true,
- "requires": {
- "p-locate": "^4.1.0"
- }
- },
- "make-dir": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.2.tgz",
- "integrity": "sha512-rYKABKutXa6vXTXhoV18cBE7PaewPXHe/Bdq4v+ZLMhxbWApkFFplT0LcbMW+6BbjnQXzZ/sAvSE/JdguApG5w==",
- "dev": true,
- "requires": {
- "semver": "^6.0.0"
- }
- },
- "p-locate": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
- "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
- "dev": true,
- "requires": {
- "p-limit": "^2.2.0"
- }
- },
- "path-exists": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
- "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
- "dev": true
- },
- "pkg-dir": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
- "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
- "dev": true,
- "requires": {
- "find-up": "^4.0.0"
- }
- },
- "semver": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
- "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
- "dev": true
- }
- }
- },
- "concat-map": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
- "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
- },
- "concat-stream": {
- "version": "1.6.2",
- "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
- "integrity": "sha1-kEvfGUzTEi/Gdcd/xKw9T/D9GjQ=",
- "dev": true,
- "requires": {
- "buffer-from": "^1.0.0",
- "inherits": "^2.0.3",
- "readable-stream": "^2.2.2",
- "typedarray": "^0.0.6"
- }
- },
- "config-chain": {
- "version": "1.1.12",
- "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.12.tgz",
- "integrity": "sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA==",
- "requires": {
- "ini": "^1.3.4",
- "proto-list": "~1.2.1"
- }
- },
- "connect-history-api-fallback": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz",
- "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==",
- "dev": true
- },
- "console-browserify": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz",
- "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==",
- "dev": true
- },
- "console-control-strings": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
- "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=",
- "dev": true
- },
- "constants-browserify": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz",
- "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=",
- "dev": true
- },
- "contains-path": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz",
- "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=",
- "dev": true
- },
- "content-disposition": {
- "version": "0.5.3",
- "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz",
- "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==",
- "dev": true,
- "requires": {
- "safe-buffer": "5.1.2"
- }
- },
- "content-type": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
- "integrity": "sha1-4TjMdeBAxyexlm/l5fjJruJW/js=",
- "dev": true
- },
- "convert-source-map": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz",
- "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==",
- "dev": true,
- "requires": {
- "safe-buffer": "~5.1.1"
- }
- },
- "cookie": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz",
- "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==",
- "dev": true
- },
- "cookie-signature": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
- "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=",
- "dev": true
- },
- "copy-concurrently": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz",
- "integrity": "sha1-kilzmMrjSTf8r9bsgTnBgFHwteA=",
- "dev": true,
- "requires": {
- "aproba": "^1.1.1",
- "fs-write-stream-atomic": "^1.0.8",
- "iferr": "^0.1.5",
- "mkdirp": "^0.5.1",
- "rimraf": "^2.5.4",
- "run-queue": "^1.0.0"
- }
- },
- "copy-descriptor": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
- "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=",
- "dev": true
- },
- "copy-webpack-plugin": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-5.1.1.tgz",
- "integrity": "sha512-P15M5ZC8dyCjQHWwd4Ia/dm0SgVvZJMYeykVIVYXbGyqO4dWB5oyPHp9i7wjwo5LhtlhKbiBCdS2NvM07Wlybg==",
- "dev": true,
- "requires": {
- "cacache": "^12.0.3",
- "find-cache-dir": "^2.1.0",
- "glob-parent": "^3.1.0",
- "globby": "^7.1.1",
- "is-glob": "^4.0.1",
- "loader-utils": "^1.2.3",
- "minimatch": "^3.0.4",
- "normalize-path": "^3.0.0",
- "p-limit": "^2.2.1",
- "schema-utils": "^1.0.0",
- "serialize-javascript": "^2.1.2",
- "webpack-log": "^2.0.0"
- },
- "dependencies": {
- "cacache": {
- "version": "12.0.3",
- "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.3.tgz",
- "integrity": "sha512-kqdmfXEGFepesTuROHMs3MpFLWrPkSSpRqOw80RCflZXy/khxaArvFrQ7uJxSUduzAufc6G0g1VUCOZXxWavPw==",
- "dev": true,
- "requires": {
- "bluebird": "^3.5.5",
- "chownr": "^1.1.1",
- "figgy-pudding": "^3.5.1",
- "glob": "^7.1.4",
- "graceful-fs": "^4.1.15",
- "infer-owner": "^1.0.3",
- "lru-cache": "^5.1.1",
- "mississippi": "^3.0.0",
- "mkdirp": "^0.5.1",
- "move-concurrently": "^1.0.1",
- "promise-inflight": "^1.0.1",
- "rimraf": "^2.6.3",
- "ssri": "^6.0.1",
- "unique-filename": "^1.1.1",
- "y18n": "^4.0.0"
- }
- },
- "glob": {
- "version": "7.1.6",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
- "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
- "dev": true,
- "requires": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.0.4",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- }
- },
- "lru-cache": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
- "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
- "dev": true,
- "requires": {
- "yallist": "^3.0.2"
- }
- },
- "schema-utils": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz",
- "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==",
- "dev": true,
- "requires": {
- "ajv": "^6.1.0",
- "ajv-errors": "^1.0.0",
- "ajv-keywords": "^3.1.0"
- }
- },
- "ssri": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz",
- "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==",
- "dev": true,
- "requires": {
- "figgy-pudding": "^3.5.1"
- }
- },
- "yallist": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
- "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
- "dev": true
- }
- }
- },
- "core-js": {
- "version": "2.6.11",
- "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz",
- "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg=="
- },
- "core-js-compat": {
- "version": "3.6.4",
- "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.6.4.tgz",
- "integrity": "sha512-zAa3IZPvsJ0slViBQ2z+vgyyTuhd3MFn1rBQjZSKVEgB0UMYhUkCj9jJUVPgGTGqWvsBVmfnruXgTcNyTlEiSA==",
- "dev": true,
- "requires": {
- "browserslist": "^4.8.3",
- "semver": "7.0.0"
- },
- "dependencies": {
- "semver": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz",
- "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==",
- "dev": true
- }
- }
- },
- "core-util-is": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
- "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
- },
- "cosmiconfig": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz",
- "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==",
- "dev": true,
- "requires": {
- "import-fresh": "^2.0.0",
- "is-directory": "^0.3.1",
- "js-yaml": "^3.13.1",
- "parse-json": "^4.0.0"
- },
- "dependencies": {
- "import-fresh": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz",
- "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=",
- "dev": true,
- "requires": {
- "caller-path": "^2.0.0",
- "resolve-from": "^3.0.0"
- }
- },
- "parse-json": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
- "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=",
- "dev": true,
- "requires": {
- "error-ex": "^1.3.1",
- "json-parse-better-errors": "^1.0.1"
- }
- },
- "resolve-from": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz",
- "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=",
- "dev": true
- }
- }
- },
- "create-ecdh": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz",
- "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==",
- "dev": true,
- "requires": {
- "bn.js": "^4.1.0",
- "elliptic": "^6.0.0"
- }
- },
- "create-hash": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz",
- "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==",
- "dev": true,
- "requires": {
- "cipher-base": "^1.0.1",
- "inherits": "^2.0.1",
- "md5.js": "^1.3.4",
- "ripemd160": "^2.0.1",
- "sha.js": "^2.4.0"
- }
- },
- "create-hmac": {
- "version": "1.1.7",
- "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz",
- "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==",
- "dev": true,
- "requires": {
- "cipher-base": "^1.0.3",
- "create-hash": "^1.1.0",
- "inherits": "^2.0.1",
- "ripemd160": "^2.0.0",
- "safe-buffer": "^5.0.1",
- "sha.js": "^2.4.8"
- }
- },
- "create-react-class": {
- "version": "15.6.3",
- "resolved": "https://registry.npmjs.org/create-react-class/-/create-react-class-15.6.3.tgz",
- "integrity": "sha1-LXMjf7P5cK5uvgEanmb0bbyoADY=",
- "requires": {
- "fbjs": "^0.8.9",
- "loose-envify": "^1.3.1",
- "object-assign": "^4.1.1"
- }
- },
- "cross-env": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-5.2.1.tgz",
- "integrity": "sha512-1yHhtcfAd1r4nwQgknowuUNfIT9E8dOMMspC36g45dN+iD1blloi7xp8X/xAIDnjHWyt1uQ8PHk2fkNaym7soQ==",
- "dev": true,
- "requires": {
- "cross-spawn": "^6.0.5"
- }
- },
- "cross-spawn": {
- "version": "6.0.5",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
- "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
- "dev": true,
- "requires": {
- "nice-try": "^1.0.4",
- "path-key": "^2.0.1",
- "semver": "^5.5.0",
- "shebang-command": "^1.2.0",
- "which": "^1.2.9"
- }
- },
- "crypto-browserify": {
- "version": "3.12.0",
- "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz",
- "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==",
- "dev": true,
- "requires": {
- "browserify-cipher": "^1.0.0",
- "browserify-sign": "^4.0.0",
- "create-ecdh": "^4.0.0",
- "create-hash": "^1.1.0",
- "create-hmac": "^1.1.0",
- "diffie-hellman": "^5.0.0",
- "inherits": "^2.0.1",
- "pbkdf2": "^3.0.3",
- "public-encrypt": "^4.0.0",
- "randombytes": "^2.0.0",
- "randomfill": "^1.0.3"
- }
- },
- "css-animation": {
- "version": "1.6.1",
- "resolved": "https://registry.npmjs.org/css-animation/-/css-animation-1.6.1.tgz",
- "integrity": "sha512-/48+/BaEaHRY6kNQ2OIPzKf9A6g8WjZYjhiNDNuIVbsm5tXCGIAsHDjB4Xu1C4vXJtUWZo26O68OQkDpNBaPog==",
- "requires": {
- "babel-runtime": "6.x",
- "component-classes": "^1.2.5"
- }
- },
- "css-loader": {
- "version": "3.4.2",
- "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-3.4.2.tgz",
- "integrity": "sha512-jYq4zdZT0oS0Iykt+fqnzVLRIeiPWhka+7BqPn+oSIpWJAHak5tmB/WZrJ2a21JhCeFyNnnlroSl8c+MtVndzA==",
- "dev": true,
- "requires": {
- "camelcase": "^5.3.1",
- "cssesc": "^3.0.0",
- "icss-utils": "^4.1.1",
- "loader-utils": "^1.2.3",
- "normalize-path": "^3.0.0",
- "postcss": "^7.0.23",
- "postcss-modules-extract-imports": "^2.0.0",
- "postcss-modules-local-by-default": "^3.0.2",
- "postcss-modules-scope": "^2.1.1",
- "postcss-modules-values": "^3.0.0",
- "postcss-value-parser": "^4.0.2",
- "schema-utils": "^2.6.0"
- }
- },
- "css-select": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz",
- "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=",
- "dev": true,
- "requires": {
- "boolbase": "~1.0.0",
- "css-what": "2.1",
- "domutils": "1.5.1",
- "nth-check": "~1.0.1"
- }
- },
- "css-what": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz",
- "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==",
- "dev": true
- },
- "cssesc": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
- "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
- "dev": true
- },
- "currently-unhandled": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz",
- "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=",
- "dev": true,
- "requires": {
- "array-find-index": "^1.0.1"
- }
- },
- "cyclist": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz",
- "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=",
- "dev": true
- },
- "dashdash": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
- "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
- "dev": true,
- "requires": {
- "assert-plus": "^1.0.0"
- }
- },
- "debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=",
- "dev": true,
- "requires": {
- "ms": "2.0.0"
- }
- },
- "decamelize": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
- "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
- "dev": true
- },
- "decamelize-keys": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz",
- "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=",
- "dev": true,
- "requires": {
- "decamelize": "^1.1.0",
- "map-obj": "^1.0.0"
- }
- },
- "decode-uri-component": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
- "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=",
- "dev": true
- },
- "deep-equal": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz",
- "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==",
- "dev": true,
- "requires": {
- "is-arguments": "^1.0.4",
- "is-date-object": "^1.0.1",
- "is-regex": "^1.0.4",
- "object-is": "^1.0.1",
- "object-keys": "^1.1.1",
- "regexp.prototype.flags": "^1.2.0"
- }
- },
- "deep-is": {
- "version": "0.1.3",
- "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
- "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
- "dev": true
- },
- "default-gateway": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz",
- "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==",
- "dev": true,
- "requires": {
- "execa": "^1.0.0",
- "ip-regex": "^2.1.0"
- }
- },
- "defaults": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz",
- "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=",
- "requires": {
- "clone": "^1.0.2"
- }
- },
- "define-properties": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
- "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
- "dev": true,
- "requires": {
- "object-keys": "^1.0.12"
- }
- },
- "define-property": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
- "integrity": "sha1-1Flono1lS6d+AqgX+HENcCyxbp0=",
- "dev": true,
- "requires": {
- "is-descriptor": "^1.0.2",
- "isobject": "^3.0.1"
- },
- "dependencies": {
- "is-accessor-descriptor": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
- "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=",
- "dev": true,
- "requires": {
- "kind-of": "^6.0.0"
- }
- },
- "is-data-descriptor": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
- "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=",
- "dev": true,
- "requires": {
- "kind-of": "^6.0.0"
- }
- },
- "is-descriptor": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
- "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=",
- "dev": true,
- "requires": {
- "is-accessor-descriptor": "^1.0.0",
- "is-data-descriptor": "^1.0.0",
- "kind-of": "^6.0.2"
- }
- }
- }
- },
- "del": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz",
- "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==",
- "dev": true,
- "requires": {
- "@types/glob": "^7.1.1",
- "globby": "^6.1.0",
- "is-path-cwd": "^2.0.0",
- "is-path-in-cwd": "^2.0.0",
- "p-map": "^2.0.0",
- "pify": "^4.0.1",
- "rimraf": "^2.6.3"
- },
- "dependencies": {
- "globby": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz",
- "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=",
- "dev": true,
- "requires": {
- "array-union": "^1.0.1",
- "glob": "^7.0.3",
- "object-assign": "^4.0.1",
- "pify": "^2.0.0",
- "pinkie-promise": "^2.0.0"
- },
- "dependencies": {
- "pify": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
- "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
- "dev": true
- }
- }
- },
- "p-map": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz",
- "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==",
- "dev": true
- }
- }
- },
- "delayed-stream": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
- "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
- "dev": true
- },
- "delegate": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz",
- "integrity": "sha1-tmtxwxWFIuirV0T3INjKDCr1kWY="
- },
- "delegates": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
- "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=",
- "dev": true
- },
- "depd": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
- "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=",
- "dev": true
- },
- "des.js": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz",
- "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==",
- "dev": true,
- "requires": {
- "inherits": "^2.0.1",
- "minimalistic-assert": "^1.0.0"
- }
- },
- "destroy": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
- "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=",
- "dev": true
- },
- "detect-file": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz",
- "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=",
- "dev": true
- },
- "detect-node": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz",
- "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==",
- "dev": true
- },
- "diffie-hellman": {
- "version": "5.0.3",
- "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz",
- "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==",
- "dev": true,
- "requires": {
- "bn.js": "^4.1.0",
- "miller-rabin": "^4.0.0",
- "randombytes": "^2.0.0"
- }
- },
- "dir-glob": {
- "version": "2.2.2",
- "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz",
- "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==",
- "dev": true,
- "requires": {
- "path-type": "^3.0.0"
- }
- },
- "directory-tree": {
- "version": "2.2.4",
- "resolved": "https://registry.npmjs.org/directory-tree/-/directory-tree-2.2.4.tgz",
- "integrity": "sha512-2N43msQptKbi3WMfIs+U09yi6bfyKL+MWyj5VMj8t1F/Tx04bt1cn/EEIU3o1JBltlJk7NQnzOEuTNa/KQvbWA==",
- "dev": true
- },
- "dns-equal": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz",
- "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=",
- "dev": true
- },
- "dns-packet": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz",
- "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==",
- "dev": true,
- "requires": {
- "ip": "^1.1.0",
- "safe-buffer": "^5.0.1"
- }
- },
- "dns-txt": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz",
- "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=",
- "dev": true,
- "requires": {
- "buffer-indexof": "^1.0.0"
- }
- },
- "doctrine": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
- "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
- "dev": true,
- "requires": {
- "esutils": "^2.0.2"
- }
- },
- "dom-align": {
- "version": "1.10.4",
- "resolved": "https://registry.npmjs.org/dom-align/-/dom-align-1.10.4.tgz",
- "integrity": "sha512-wytDzaru67AmqFOY4B9GUb/hrwWagezoYYK97D/vpK+ezg+cnuZO0Q2gltUPa7KfNmIqfRIYVCF8UhRDEHAmgQ=="
- },
- "dom-converter": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz",
- "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==",
- "dev": true,
- "requires": {
- "utila": "~0.4"
- }
- },
- "dom-helpers": {
- "version": "3.4.0",
- "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-3.4.0.tgz",
- "integrity": "sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA==",
- "requires": {
- "@babel/runtime": "^7.1.2"
- }
- },
- "dom-scroll-into-view": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/dom-scroll-into-view/-/dom-scroll-into-view-1.2.1.tgz",
- "integrity": "sha1-6PNnMt0ImwIBqI14Fdw/iObWbH4="
- },
- "dom-serializer": {
- "version": "0.2.2",
- "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz",
- "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==",
- "dev": true,
- "requires": {
- "domelementtype": "^2.0.1",
- "entities": "^2.0.0"
- },
- "dependencies": {
- "domelementtype": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.1.tgz",
- "integrity": "sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ==",
- "dev": true
- }
- }
- },
- "dom-walk": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.1.tgz",
- "integrity": "sha1-ZyIm3HTI95mtNTB9+TaroRrNYBg=",
- "dev": true
- },
- "domain-browser": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz",
- "integrity": "sha1-PTH1AZGmdJ3RN1p/Ui6CPULlTto=",
- "dev": true
- },
- "domelementtype": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz",
- "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==",
- "dev": true
- },
- "domhandler": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz",
- "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==",
- "dev": true,
- "requires": {
- "domelementtype": "1"
- }
- },
- "domutils": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz",
- "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=",
- "dev": true,
- "requires": {
- "dom-serializer": "0",
- "domelementtype": "1"
- }
- },
- "dot-prop": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.2.0.tgz",
- "integrity": "sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A==",
- "dev": true,
- "requires": {
- "is-obj": "^2.0.0"
- }
- },
- "duplexify": {
- "version": "3.7.1",
- "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz",
- "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==",
- "dev": true,
- "requires": {
- "end-of-stream": "^1.0.0",
- "inherits": "^2.0.1",
- "readable-stream": "^2.0.0",
- "stream-shift": "^1.0.0"
- }
- },
- "ecc-jsbn": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
- "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=",
- "dev": true,
- "requires": {
- "jsbn": "~0.1.0",
- "safer-buffer": "^2.1.0"
- }
- },
- "editorconfig": {
- "version": "0.15.3",
- "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-0.15.3.tgz",
- "integrity": "sha512-M9wIMFx96vq0R4F+gRpY3o2exzb8hEj/n9S8unZtHSvYjibBp/iMufSzvmOcV/laG0ZtuTVGtiJggPOSW2r93g==",
- "requires": {
- "commander": "^2.19.0",
- "lru-cache": "^4.1.5",
- "semver": "^5.6.0",
- "sigmund": "^1.0.1"
- }
- },
- "ee-first": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
- "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=",
- "dev": true
- },
- "electron-to-chromium": {
- "version": "1.3.355",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.355.tgz",
- "integrity": "sha512-zKO/wS+2ChI/jz9WAo647xSW8t2RmgRLFdbUb/77cORkUTargO+SCj4ctTHjBn2VeNFrsLgDT7IuDVrd3F8mLQ==",
- "dev": true
- },
- "elliptic": {
- "version": "6.5.2",
- "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.2.tgz",
- "integrity": "sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw==",
- "dev": true,
- "requires": {
- "bn.js": "^4.4.0",
- "brorand": "^1.0.1",
- "hash.js": "^1.0.0",
- "hmac-drbg": "^1.0.0",
- "inherits": "^2.0.1",
- "minimalistic-assert": "^1.0.0",
- "minimalistic-crypto-utils": "^1.0.0"
- }
- },
- "emoji-regex": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
- "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
- "dev": true
- },
- "emojis-list": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz",
- "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==",
- "dev": true
- },
- "encodeurl": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
- "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=",
- "dev": true
- },
- "encoding": {
- "version": "0.1.12",
- "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz",
- "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=",
- "requires": {
- "iconv-lite": "~0.4.13"
- }
- },
- "end-of-stream": {
- "version": "1.4.4",
- "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
- "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
- "dev": true,
- "requires": {
- "once": "^1.4.0"
- }
- },
- "enhanced-resolve": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.1.tgz",
- "integrity": "sha512-98p2zE+rL7/g/DzMHMTF4zZlCgeVdJ7yr6xzEpJRYwFYrGi9ANdn5DnJURg6RpBkyk60XYDnWIv51VfIhfNGuA==",
- "dev": true,
- "requires": {
- "graceful-fs": "^4.1.2",
- "memory-fs": "^0.5.0",
- "tapable": "^1.0.0"
- },
- "dependencies": {
- "memory-fs": {
- "version": "0.5.0",
- "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz",
- "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==",
- "dev": true,
- "requires": {
- "errno": "^0.1.3",
- "readable-stream": "^2.0.1"
- }
- }
- }
- },
- "entities": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.0.tgz",
- "integrity": "sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw==",
- "dev": true
- },
- "errno": {
- "version": "0.1.7",
- "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz",
- "integrity": "sha1-RoTXF3mtOa8Xfj8AeZb3xnyFJhg=",
- "dev": true,
- "requires": {
- "prr": "~1.0.1"
- }
- },
- "error-ex": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
- "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
- "dev": true,
- "requires": {
- "is-arrayish": "^0.2.1"
- }
- },
- "es-abstract": {
- "version": "1.17.4",
- "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.4.tgz",
- "integrity": "sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ==",
- "dev": true,
- "requires": {
- "es-to-primitive": "^1.2.1",
- "function-bind": "^1.1.1",
- "has": "^1.0.3",
- "has-symbols": "^1.0.1",
- "is-callable": "^1.1.5",
- "is-regex": "^1.0.5",
- "object-inspect": "^1.7.0",
- "object-keys": "^1.1.1",
- "object.assign": "^4.1.0",
- "string.prototype.trimleft": "^2.1.1",
- "string.prototype.trimright": "^2.1.1"
- }
- },
- "es-to-primitive": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
- "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
- "dev": true,
- "requires": {
- "is-callable": "^1.1.4",
- "is-date-object": "^1.0.1",
- "is-symbol": "^1.0.2"
- }
- },
- "es6-templates": {
- "version": "0.2.3",
- "resolved": "https://registry.npmjs.org/es6-templates/-/es6-templates-0.2.3.tgz",
- "integrity": "sha1-XLmsn7He1usSOTQrgdeSu7QHjuQ=",
- "dev": true,
- "requires": {
- "recast": "~0.11.12",
- "through": "~2.3.6"
- }
- },
- "escape-html": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
- "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=",
- "dev": true
- },
- "escape-string-regexp": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
- "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
- },
- "eslint": {
- "version": "6.8.0",
- "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz",
- "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==",
- "dev": true,
- "requires": {
- "@babel/code-frame": "^7.0.0",
- "ajv": "^6.10.0",
- "chalk": "^2.1.0",
- "cross-spawn": "^6.0.5",
- "debug": "^4.0.1",
- "doctrine": "^3.0.0",
- "eslint-scope": "^5.0.0",
- "eslint-utils": "^1.4.3",
- "eslint-visitor-keys": "^1.1.0",
- "espree": "^6.1.2",
- "esquery": "^1.0.1",
- "esutils": "^2.0.2",
- "file-entry-cache": "^5.0.1",
- "functional-red-black-tree": "^1.0.1",
- "glob-parent": "^5.0.0",
- "globals": "^12.1.0",
- "ignore": "^4.0.6",
- "import-fresh": "^3.0.0",
- "imurmurhash": "^0.1.4",
- "inquirer": "^7.0.0",
- "is-glob": "^4.0.0",
- "js-yaml": "^3.13.1",
- "json-stable-stringify-without-jsonify": "^1.0.1",
- "levn": "^0.3.0",
- "lodash": "^4.17.14",
- "minimatch": "^3.0.4",
- "mkdirp": "^0.5.1",
- "natural-compare": "^1.4.0",
- "optionator": "^0.8.3",
- "progress": "^2.0.0",
- "regexpp": "^2.0.1",
- "semver": "^6.1.2",
- "strip-ansi": "^5.2.0",
- "strip-json-comments": "^3.0.1",
- "table": "^5.2.3",
- "text-table": "^0.2.0",
- "v8-compile-cache": "^2.0.3"
- },
- "dependencies": {
- "ansi-escapes": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.0.tgz",
- "integrity": "sha512-EiYhwo0v255HUL6eDyuLrXEkTi7WwVCLAw+SeOQ7M7qdun1z1pum4DEm/nuqIVbPvi9RPPc9k9LbyBv6H0DwVg==",
- "dev": true,
- "requires": {
- "type-fest": "^0.8.1"
- }
- },
- "ansi-regex": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
- "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
- "dev": true
- },
- "ansi-styles": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
- "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
- "dev": true,
- "requires": {
- "color-convert": "^1.9.0"
- }
- },
- "chalk": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
- "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
- "dev": true,
- "requires": {
- "ansi-styles": "^3.2.1",
- "escape-string-regexp": "^1.0.5",
- "supports-color": "^5.3.0"
- }
- },
- "chardet": {
- "version": "0.7.0",
- "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz",
- "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==",
- "dev": true
- },
- "cli-cursor": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz",
- "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==",
- "dev": true,
- "requires": {
- "restore-cursor": "^3.1.0"
- }
- },
- "debug": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
- "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
- "dev": true,
- "requires": {
- "ms": "^2.1.1"
- }
- },
- "external-editor": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz",
- "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==",
- "dev": true,
- "requires": {
- "chardet": "^0.7.0",
- "iconv-lite": "^0.4.24",
- "tmp": "^0.0.33"
- }
- },
- "figures": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz",
- "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==",
- "dev": true,
- "requires": {
- "escape-string-regexp": "^1.0.5"
- }
- },
- "glob-parent": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz",
- "integrity": "sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==",
- "dev": true,
- "requires": {
- "is-glob": "^4.0.1"
- }
- },
- "globals": {
- "version": "12.3.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-12.3.0.tgz",
- "integrity": "sha512-wAfjdLgFsPZsklLJvOBUBmzYE8/CwhEqSBEMRXA3qxIiNtyqvjYurAtIfDh6chlEPUfmTY3MnZh5Hfh4q0UlIw==",
- "dev": true,
- "requires": {
- "type-fest": "^0.8.1"
- }
- },
- "ignore": {
- "version": "4.0.6",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
- "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
- "dev": true
- },
- "inquirer": {
- "version": "7.0.4",
- "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.0.4.tgz",
- "integrity": "sha512-Bu5Td5+j11sCkqfqmUTiwv+tWisMtP0L7Q8WrqA2C/BbBhy1YTdFrvjjlrKq8oagA/tLQBski2Gcx/Sqyi2qSQ==",
- "dev": true,
- "requires": {
- "ansi-escapes": "^4.2.1",
- "chalk": "^2.4.2",
- "cli-cursor": "^3.1.0",
- "cli-width": "^2.0.0",
- "external-editor": "^3.0.3",
- "figures": "^3.0.0",
- "lodash": "^4.17.15",
- "mute-stream": "0.0.8",
- "run-async": "^2.2.0",
- "rxjs": "^6.5.3",
- "string-width": "^4.1.0",
- "strip-ansi": "^5.1.0",
- "through": "^2.3.6"
- }
- },
- "is-fullwidth-code-point": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
- "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
- "dev": true
- },
- "mimic-fn": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
- "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
- "dev": true
- },
- "ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
- "dev": true
- },
- "mute-stream": {
- "version": "0.0.8",
- "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz",
- "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==",
- "dev": true
- },
- "onetime": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz",
- "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==",
- "dev": true,
- "requires": {
- "mimic-fn": "^2.1.0"
- }
- },
- "restore-cursor": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz",
- "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==",
- "dev": true,
- "requires": {
- "onetime": "^5.1.0",
- "signal-exit": "^3.0.2"
- }
- },
- "semver": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
- "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
- "dev": true
- },
- "string-width": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
- "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
- "dev": true,
- "requires": {
- "emoji-regex": "^8.0.0",
- "is-fullwidth-code-point": "^3.0.0",
- "strip-ansi": "^6.0.0"
- },
- "dependencies": {
- "strip-ansi": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
- "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
- "dev": true,
- "requires": {
- "ansi-regex": "^5.0.0"
- }
- }
- }
- },
- "strip-ansi": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
- "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
- "dev": true,
- "requires": {
- "ansi-regex": "^4.1.0"
- },
- "dependencies": {
- "ansi-regex": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
- "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
- "dev": true
- }
- }
- },
- "supports-color": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
- "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
- "dev": true,
- "requires": {
- "has-flag": "^3.0.0"
- }
- }
- }
- },
- "eslint-config-angular": {
- "version": "0.5.0",
- "resolved": "https://registry.npmjs.org/eslint-config-angular/-/eslint-config-angular-0.5.0.tgz",
- "integrity": "sha1-4KrgEy4550Z98/dUf+yBpE02hcQ=",
- "dev": true
- },
- "eslint-import-resolver-node": {
- "version": "0.3.3",
- "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.3.tgz",
- "integrity": "sha512-b8crLDo0M5RSe5YG8Pu2DYBj71tSB6OvXkfzwbJU2w7y8P4/yo0MyF8jU26IEuEuHF2K5/gcAJE3LhQGqBBbVg==",
- "dev": true,
- "requires": {
- "debug": "^2.6.9",
- "resolve": "^1.13.1"
- }
- },
- "eslint-loader": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/eslint-loader/-/eslint-loader-2.2.1.tgz",
- "integrity": "sha512-RLgV9hoCVsMLvOxCuNjdqOrUqIj9oJg8hF44vzJaYqsAHuY9G2YAeN3joQ9nxP0p5Th9iFSIpKo+SD8KISxXRg==",
- "dev": true,
- "requires": {
- "loader-fs-cache": "^1.0.0",
- "loader-utils": "^1.0.2",
- "object-assign": "^4.0.1",
- "object-hash": "^1.1.4",
- "rimraf": "^2.6.1"
- }
- },
- "eslint-module-utils": {
- "version": "2.5.2",
- "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.5.2.tgz",
- "integrity": "sha512-LGScZ/JSlqGKiT8OC+cYRxseMjyqt6QO54nl281CK93unD89ijSeRV6An8Ci/2nvWVKe8K/Tqdm75RQoIOCr+Q==",
- "dev": true,
- "requires": {
- "debug": "^2.6.9",
- "pkg-dir": "^2.0.0"
- },
- "dependencies": {
- "find-up": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
- "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
- "dev": true,
- "requires": {
- "locate-path": "^2.0.0"
- }
- },
- "locate-path": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
- "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
- "dev": true,
- "requires": {
- "p-locate": "^2.0.0",
- "path-exists": "^3.0.0"
- }
- },
- "p-limit": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
- "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
- "dev": true,
- "requires": {
- "p-try": "^1.0.0"
- }
- },
- "p-locate": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
- "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
- "dev": true,
- "requires": {
- "p-limit": "^1.1.0"
- }
- },
- "p-try": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
- "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=",
- "dev": true
- },
- "pkg-dir": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz",
- "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=",
- "dev": true,
- "requires": {
- "find-up": "^2.1.0"
- }
- }
- }
- },
- "eslint-plugin-angular": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/eslint-plugin-angular/-/eslint-plugin-angular-4.0.1.tgz",
- "integrity": "sha512-OaW5G461C2lIkOG+/bhnBoXB9UQm/r0Dj2Qf9uiIN0/ncvf2Llp30L0q1tqWkN8/CxyBwQKh1v0hpCLLDjaIKQ==",
- "dev": true
- },
- "eslint-plugin-import": {
- "version": "2.20.1",
- "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.20.1.tgz",
- "integrity": "sha512-qQHgFOTjguR+LnYRoToeZWT62XM55MBVXObHM6SKFd1VzDcX/vqT1kAz8ssqigh5eMj8qXcRoXXGZpPP6RfdCw==",
- "dev": true,
- "requires": {
- "array-includes": "^3.0.3",
- "array.prototype.flat": "^1.2.1",
- "contains-path": "^0.1.0",
- "debug": "^2.6.9",
- "doctrine": "1.5.0",
- "eslint-import-resolver-node": "^0.3.2",
- "eslint-module-utils": "^2.4.1",
- "has": "^1.0.3",
- "minimatch": "^3.0.4",
- "object.values": "^1.1.0",
- "read-pkg-up": "^2.0.0",
- "resolve": "^1.12.0"
- },
- "dependencies": {
- "doctrine": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz",
- "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=",
- "dev": true,
- "requires": {
- "esutils": "^2.0.2",
- "isarray": "^1.0.0"
- }
- }
- }
- },
- "eslint-scope": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz",
- "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==",
- "dev": true,
- "requires": {
- "esrecurse": "^4.1.0",
- "estraverse": "^4.1.1"
- }
- },
- "eslint-utils": {
- "version": "1.4.3",
- "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz",
- "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==",
- "dev": true,
- "requires": {
- "eslint-visitor-keys": "^1.1.0"
- }
- },
- "eslint-visitor-keys": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz",
- "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==",
- "dev": true
- },
- "espree": {
- "version": "6.1.2",
- "resolved": "https://registry.npmjs.org/espree/-/espree-6.1.2.tgz",
- "integrity": "sha512-2iUPuuPP+yW1PZaMSDM9eyVf8D5P0Hi8h83YtZ5bPc/zHYjII5khoixIUTMO794NOY8F/ThF1Bo8ncZILarUTA==",
- "dev": true,
- "requires": {
- "acorn": "^7.1.0",
- "acorn-jsx": "^5.1.0",
- "eslint-visitor-keys": "^1.1.0"
- }
- },
- "esprima": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
- "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
- "dev": true
- },
- "esquery": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.1.0.tgz",
- "integrity": "sha512-MxYW9xKmROWF672KqjO75sszsA8Mxhw06YFeS5VHlB98KDHbOSurm3ArsjO60Eaf3QmGMCP1yn+0JQkNLo/97Q==",
- "dev": true,
- "requires": {
- "estraverse": "^4.0.0"
- }
- },
- "esrecurse": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz",
- "integrity": "sha1-AHo7n9vCs7uH5IeeoZyS/b05Qs8=",
- "dev": true,
- "requires": {
- "estraverse": "^4.1.0"
- }
- },
- "estraverse": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
- "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
- "dev": true
- },
- "esutils": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
- "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
- "dev": true
- },
- "etag": {
- "version": "1.8.1",
- "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
- "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=",
- "dev": true
- },
- "eve-raphael": {
- "version": "0.5.0",
- "resolved": "https://registry.npmjs.org/eve-raphael/-/eve-raphael-0.5.0.tgz",
- "integrity": "sha1-F8dUt5K+7z+maE15z1pHxjxM2jA="
- },
- "event-source-polyfill": {
- "version": "0.0.9",
- "resolved": "https://registry.npmjs.org/event-source-polyfill/-/event-source-polyfill-0.0.9.tgz",
- "integrity": "sha1-GMYgXRcKsJ24if/OqjPw5JPxSlA="
- },
- "eventemitter3": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.0.tgz",
- "integrity": "sha512-qerSRB0p+UDEssxTtm6EDKcE7W4OaoisfIMl4CngyEhjpYglocpNg6UEqCvemdGhosAsg4sO2dXJOdyBifPGCg==",
- "dev": true
- },
- "events": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/events/-/events-3.1.0.tgz",
- "integrity": "sha512-Rv+u8MLHNOdMjTAFeT3nCjHn2aGlx435FP/sDHNaRhDEMwyI/aB22Kj2qIN8R0cw3z28psEQLYwxVKLsKrMgWg==",
- "dev": true
- },
- "eventsource": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.0.7.tgz",
- "integrity": "sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==",
- "dev": true,
- "requires": {
- "original": "^1.0.0"
- }
- },
- "evp_bytestokey": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz",
- "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==",
- "dev": true,
- "requires": {
- "md5.js": "^1.3.4",
- "safe-buffer": "^5.1.1"
- }
- },
- "execa": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz",
- "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==",
- "dev": true,
- "requires": {
- "cross-spawn": "^6.0.0",
- "get-stream": "^4.0.0",
- "is-stream": "^1.1.0",
- "npm-run-path": "^2.0.0",
- "p-finally": "^1.0.0",
- "signal-exit": "^3.0.0",
- "strip-eof": "^1.0.0"
- }
- },
- "execall": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/execall/-/execall-2.0.0.tgz",
- "integrity": "sha512-0FU2hZ5Hh6iQnarpRtQurM/aAvp3RIbfvgLHrcqJYzhXyV2KFruhuChf9NC6waAhiUR7FFtlugkI4p7f2Fqlow==",
- "dev": true,
- "requires": {
- "clone-regexp": "^2.1.0"
- }
- },
- "expand-brackets": {
- "version": "2.1.4",
- "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
- "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
- "dev": true,
- "requires": {
- "debug": "^2.3.3",
- "define-property": "^0.2.5",
- "extend-shallow": "^2.0.1",
- "posix-character-classes": "^0.1.0",
- "regex-not": "^1.0.0",
- "snapdragon": "^0.8.1",
- "to-regex": "^3.0.1"
- },
- "dependencies": {
- "define-property": {
- "version": "0.2.5",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
- "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
- "dev": true,
- "requires": {
- "is-descriptor": "^0.1.0"
- }
- },
- "extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "dev": true,
- "requires": {
- "is-extendable": "^0.1.0"
- }
- }
- }
- },
- "expand-tilde": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz",
- "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=",
- "dev": true,
- "requires": {
- "homedir-polyfill": "^1.0.1"
- }
- },
- "express": {
- "version": "4.17.1",
- "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz",
- "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==",
- "dev": true,
- "requires": {
- "accepts": "~1.3.7",
- "array-flatten": "1.1.1",
- "body-parser": "1.19.0",
- "content-disposition": "0.5.3",
- "content-type": "~1.0.4",
- "cookie": "0.4.0",
- "cookie-signature": "1.0.6",
- "debug": "2.6.9",
- "depd": "~1.1.2",
- "encodeurl": "~1.0.2",
- "escape-html": "~1.0.3",
- "etag": "~1.8.1",
- "finalhandler": "~1.1.2",
- "fresh": "0.5.2",
- "merge-descriptors": "1.0.1",
- "methods": "~1.1.2",
- "on-finished": "~2.3.0",
- "parseurl": "~1.3.3",
- "path-to-regexp": "0.1.7",
- "proxy-addr": "~2.0.5",
- "qs": "6.7.0",
- "range-parser": "~1.2.1",
- "safe-buffer": "5.1.2",
- "send": "0.17.1",
- "serve-static": "1.14.1",
- "setprototypeof": "1.1.1",
- "statuses": "~1.5.0",
- "type-is": "~1.6.18",
- "utils-merge": "1.0.1",
- "vary": "~1.1.2"
- },
- "dependencies": {
- "array-flatten": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
- "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=",
- "dev": true
- },
- "qs": {
- "version": "6.7.0",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz",
- "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==",
- "dev": true
- }
- }
- },
- "extend": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
- "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
- "dev": true
- },
- "extend-shallow": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
- "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
- "dev": true,
- "requires": {
- "assign-symbols": "^1.0.0",
- "is-extendable": "^1.0.1"
- },
- "dependencies": {
- "is-extendable": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
- "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
- "dev": true,
- "requires": {
- "is-plain-object": "^2.0.4"
- }
- }
- }
- },
- "external-editor": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz",
- "integrity": "sha1-BFURz9jRM/OEZnPRBHwVTiFK09U=",
- "requires": {
- "chardet": "^0.4.0",
- "iconv-lite": "^0.4.17",
- "tmp": "^0.0.33"
- }
- },
- "extglob": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
- "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
- "dev": true,
- "requires": {
- "array-unique": "^0.3.2",
- "define-property": "^1.0.0",
- "expand-brackets": "^2.1.4",
- "extend-shallow": "^2.0.1",
- "fragment-cache": "^0.2.1",
- "regex-not": "^1.0.0",
- "snapdragon": "^0.8.1",
- "to-regex": "^3.0.1"
- },
- "dependencies": {
- "define-property": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
- "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
- "dev": true,
- "requires": {
- "is-descriptor": "^1.0.0"
- }
- },
- "extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "dev": true,
- "requires": {
- "is-extendable": "^0.1.0"
- }
- },
- "is-accessor-descriptor": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
- "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
- "dev": true,
- "requires": {
- "kind-of": "^6.0.0"
- }
- },
- "is-data-descriptor": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
- "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
- "dev": true,
- "requires": {
- "kind-of": "^6.0.0"
- }
- },
- "is-descriptor": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
- "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
- "dev": true,
- "requires": {
- "is-accessor-descriptor": "^1.0.0",
- "is-data-descriptor": "^1.0.0",
- "kind-of": "^6.0.2"
- }
- }
- }
- },
- "extsprintf": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
- "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=",
- "dev": true
- },
- "fast-deep-equal": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz",
- "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==",
- "dev": true
- },
- "fast-glob": {
- "version": "2.2.7",
- "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz",
- "integrity": "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==",
- "dev": true,
- "requires": {
- "@mrmlnc/readdir-enhanced": "^2.2.1",
- "@nodelib/fs.stat": "^1.1.2",
- "glob-parent": "^3.1.0",
- "is-glob": "^4.0.0",
- "merge2": "^1.2.3",
- "micromatch": "^3.1.10"
- }
- },
- "fast-json-stable-stringify": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
- "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
- "dev": true
- },
- "fast-levenshtein": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
- "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
- "dev": true
- },
- "fastparse": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz",
- "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==",
- "dev": true
- },
- "fastq": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.6.0.tgz",
- "integrity": "sha512-jmxqQ3Z/nXoeyDmWAzF9kH1aGZSis6e/SbfPmJpUnyZ0ogr6iscHQaml4wsEepEWSdtmpy+eVXmCRIMpxaXqOA==",
- "dev": true,
- "requires": {
- "reusify": "^1.0.0"
- }
- },
- "faye-websocket": {
- "version": "0.10.0",
- "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz",
- "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=",
- "dev": true,
- "requires": {
- "websocket-driver": ">=0.5.1"
- }
- },
- "fbjs": {
- "version": "0.8.17",
- "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.17.tgz",
- "integrity": "sha1-xNWY6taUkRJlPWWIsBpc3Nn5D90=",
- "requires": {
- "core-js": "^1.0.0",
- "isomorphic-fetch": "^2.1.1",
- "loose-envify": "^1.0.0",
- "object-assign": "^4.1.0",
- "promise": "^7.1.1",
- "setimmediate": "^1.0.5",
- "ua-parser-js": "^0.7.18"
- },
- "dependencies": {
- "core-js": {
- "version": "1.2.7",
- "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz",
- "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY="
- }
- }
- },
- "figgy-pudding": {
- "version": "3.5.1",
- "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz",
- "integrity": "sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==",
- "dev": true
- },
- "figures": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz",
- "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=",
- "requires": {
- "escape-string-regexp": "^1.0.5"
- }
- },
- "file-entry-cache": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz",
- "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==",
- "dev": true,
- "requires": {
- "flat-cache": "^2.0.1"
- }
- },
- "file-loader": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-4.3.0.tgz",
- "integrity": "sha512-aKrYPYjF1yG3oX0kWRrqrSMfgftm7oJW5M+m4owoldH5C51C0RkIwB++JbRvEW3IU6/ZG5n8UvEcdgwOt2UOWA==",
- "dev": true,
- "requires": {
- "loader-utils": "^1.2.3",
- "schema-utils": "^2.5.0"
- }
- },
- "file-type": {
- "version": "10.11.0",
- "resolved": "https://registry.npmjs.org/file-type/-/file-type-10.11.0.tgz",
- "integrity": "sha512-uzk64HRpUZyTGZtVuvrjP0FYxzQrBf4rojot6J65YMEbwBLB0CWm0CLojVpwpmFmxcE/lkvYICgfcGozbBq6rw==",
- "dev": true
- },
- "file-uri-to-path": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz",
- "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==",
- "dev": true,
- "optional": true
- },
- "fill-range": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
- "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
- "dev": true,
- "requires": {
- "extend-shallow": "^2.0.1",
- "is-number": "^3.0.0",
- "repeat-string": "^1.6.1",
- "to-regex-range": "^2.1.0"
- },
- "dependencies": {
- "extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "dev": true,
- "requires": {
- "is-extendable": "^0.1.0"
- }
- }
- }
- },
- "finalhandler": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz",
- "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==",
- "dev": true,
- "requires": {
- "debug": "2.6.9",
- "encodeurl": "~1.0.2",
- "escape-html": "~1.0.3",
- "on-finished": "~2.3.0",
- "parseurl": "~1.3.3",
- "statuses": "~1.5.0",
- "unpipe": "~1.0.0"
- }
- },
- "find-cache-dir": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz",
- "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==",
- "dev": true,
- "requires": {
- "commondir": "^1.0.1",
- "make-dir": "^2.0.0",
- "pkg-dir": "^3.0.0"
- }
- },
- "find-up": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
- "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
- "dev": true,
- "requires": {
- "locate-path": "^3.0.0"
- }
- },
- "findup-sync": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz",
- "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==",
- "dev": true,
- "requires": {
- "detect-file": "^1.0.0",
- "is-glob": "^4.0.0",
- "micromatch": "^3.0.4",
- "resolve-dir": "^1.0.1"
- }
- },
- "flat-cache": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz",
- "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==",
- "dev": true,
- "requires": {
- "flatted": "^2.0.0",
- "rimraf": "2.6.3",
- "write": "1.0.3"
- },
- "dependencies": {
- "glob": {
- "version": "7.1.6",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
- "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
- "dev": true,
- "requires": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.0.4",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- }
- },
- "rimraf": {
- "version": "2.6.3",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz",
- "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==",
- "dev": true,
- "requires": {
- "glob": "^7.1.3"
- }
- }
- }
- },
- "flatted": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.1.tgz",
- "integrity": "sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg==",
- "dev": true
- },
- "flot": {
- "version": "git://github.com/thingsboard/flot.git#6e1a37095868f174d31d5c627c3659b70f9b92dd",
- "from": "git://github.com/thingsboard/flot.git#0.9-work"
- },
- "flot.curvedlines": {
- "version": "git://github.com/MichaelZinsmaier/CurvedLines.git#22ed1fc2a6ccafc816c2d07b36027cc123825c4b",
- "from": "git://github.com/MichaelZinsmaier/CurvedLines.git#master"
- },
- "flush-write-stream": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz",
- "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==",
- "dev": true,
- "requires": {
- "inherits": "^2.0.3",
- "readable-stream": "^2.3.6"
- }
- },
- "follow-redirects": {
- "version": "1.10.0",
- "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.10.0.tgz",
- "integrity": "sha512-4eyLK6s6lH32nOvLLwlIOnr9zrL8Sm+OvW4pVTJNoXeGzYIkHVf+pADQi+OJ0E67hiuSLezPVPyBcIZO50TmmQ==",
- "dev": true,
- "requires": {
- "debug": "^3.0.0"
- },
- "dependencies": {
- "debug": {
- "version": "3.2.6",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
- "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
- "dev": true,
- "requires": {
- "ms": "^2.1.1"
- }
- },
- "ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
- "dev": true
- }
- }
- },
- "font-awesome": {
- "version": "4.7.0",
- "resolved": "https://registry.npmjs.org/font-awesome/-/font-awesome-4.7.0.tgz",
- "integrity": "sha1-j6jPBBGhoxr9B7BtKQK7n8gVoTM="
- },
- "for-in": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
- "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=",
- "dev": true
- },
- "forever-agent": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
- "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=",
- "dev": true
- },
- "form-data": {
- "version": "2.3.3",
- "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
- "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
- "dev": true,
- "requires": {
- "asynckit": "^0.4.0",
- "combined-stream": "^1.0.6",
- "mime-types": "^2.1.12"
- }
- },
- "forwarded": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz",
- "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=",
- "dev": true
- },
- "fragment-cache": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
- "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=",
- "dev": true,
- "requires": {
- "map-cache": "^0.2.2"
- }
- },
- "fresh": {
- "version": "0.5.2",
- "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
- "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=",
- "dev": true
- },
- "from2": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz",
- "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=",
- "dev": true,
- "requires": {
- "inherits": "^2.0.1",
- "readable-stream": "^2.0.0"
- }
- },
- "fs-minipass": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz",
- "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==",
- "dev": true,
- "requires": {
- "minipass": "^3.0.0"
- }
- },
- "fs-readdir-recursive": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz",
- "integrity": "sha1-4y/AMKLM7kSmtTcTCNpUvgs5fSc=",
- "dev": true
- },
- "fs-write-stream-atomic": {
- "version": "1.0.10",
- "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz",
- "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=",
- "dev": true,
- "requires": {
- "graceful-fs": "^4.1.2",
- "iferr": "^0.1.5",
- "imurmurhash": "^0.1.4",
- "readable-stream": "1 || 2"
- }
- },
- "fs.realpath": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
- "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
- },
- "fsevents": {
- "version": "1.2.11",
- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.11.tgz",
- "integrity": "sha512-+ux3lx6peh0BpvY0JebGyZoiR4D+oYzdPZMKJwkZ+sFkNJzpL7tXc/wehS49gUAxg3tmMHPHZkA8JU2rhhgDHw==",
- "dev": true,
- "optional": true,
- "requires": {
- "bindings": "^1.5.0",
- "nan": "^2.12.1",
- "node-pre-gyp": "*"
- },
- "dependencies": {
- "abbrev": {
- "version": "1.1.1",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "ansi-regex": {
- "version": "2.1.1",
- "bundled": true,
- "dev": true
- },
- "aproba": {
- "version": "1.2.0",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "are-we-there-yet": {
- "version": "1.1.5",
- "bundled": true,
- "dev": true,
- "optional": true,
- "requires": {
- "delegates": "^1.0.0",
- "readable-stream": "^2.0.6"
- }
- },
- "balanced-match": {
- "version": "1.0.0",
- "bundled": true,
- "dev": true
- },
- "brace-expansion": {
- "version": "1.1.11",
- "bundled": true,
- "dev": true,
- "requires": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
- }
- },
- "chownr": {
- "version": "1.1.3",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "code-point-at": {
- "version": "1.1.0",
- "bundled": true,
- "dev": true
- },
- "concat-map": {
- "version": "0.0.1",
- "bundled": true,
- "dev": true
- },
- "console-control-strings": {
- "version": "1.1.0",
- "bundled": true,
- "dev": true
- },
- "core-util-is": {
- "version": "1.0.2",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "debug": {
- "version": "3.2.6",
- "bundled": true,
- "dev": true,
- "optional": true,
- "requires": {
- "ms": "^2.1.1"
- }
- },
- "deep-extend": {
- "version": "0.6.0",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "delegates": {
- "version": "1.0.0",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "detect-libc": {
- "version": "1.0.3",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "fs-minipass": {
- "version": "1.2.7",
- "bundled": true,
- "dev": true,
- "optional": true,
- "requires": {
- "minipass": "^2.6.0"
- }
- },
- "fs.realpath": {
- "version": "1.0.0",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "gauge": {
- "version": "2.7.4",
- "bundled": true,
- "dev": true,
- "optional": true,
- "requires": {
- "aproba": "^1.0.3",
- "console-control-strings": "^1.0.0",
- "has-unicode": "^2.0.0",
- "object-assign": "^4.1.0",
- "signal-exit": "^3.0.0",
- "string-width": "^1.0.1",
- "strip-ansi": "^3.0.1",
- "wide-align": "^1.1.0"
- }
- },
- "glob": {
- "version": "7.1.6",
- "bundled": true,
- "dev": true,
- "optional": true,
- "requires": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.0.4",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- }
- },
- "has-unicode": {
- "version": "2.0.1",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "iconv-lite": {
- "version": "0.4.24",
- "bundled": true,
- "dev": true,
- "optional": true,
- "requires": {
- "safer-buffer": ">= 2.1.2 < 3"
- }
- },
- "ignore-walk": {
- "version": "3.0.3",
- "bundled": true,
- "dev": true,
- "optional": true,
- "requires": {
- "minimatch": "^3.0.4"
- }
- },
- "inflight": {
- "version": "1.0.6",
- "bundled": true,
- "dev": true,
- "optional": true,
- "requires": {
- "once": "^1.3.0",
- "wrappy": "1"
- }
- },
- "inherits": {
- "version": "2.0.4",
- "bundled": true,
- "dev": true
- },
- "ini": {
- "version": "1.3.5",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "is-fullwidth-code-point": {
- "version": "1.0.0",
- "bundled": true,
- "dev": true,
- "requires": {
- "number-is-nan": "^1.0.0"
- }
- },
- "isarray": {
- "version": "1.0.0",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "minimatch": {
- "version": "3.0.4",
- "bundled": true,
- "dev": true,
- "requires": {
- "brace-expansion": "^1.1.7"
- }
- },
- "minimist": {
- "version": "0.0.8",
- "bundled": true,
- "dev": true
- },
- "minipass": {
- "version": "2.9.0",
- "bundled": true,
- "dev": true,
- "requires": {
- "safe-buffer": "^5.1.2",
- "yallist": "^3.0.0"
- }
- },
- "minizlib": {
- "version": "1.3.3",
- "bundled": true,
- "dev": true,
- "optional": true,
- "requires": {
- "minipass": "^2.9.0"
- }
- },
- "mkdirp": {
- "version": "0.5.1",
- "bundled": true,
- "dev": true,
- "requires": {
- "minimist": "0.0.8"
- }
- },
- "ms": {
- "version": "2.1.2",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "needle": {
- "version": "2.4.0",
- "bundled": true,
- "dev": true,
- "optional": true,
- "requires": {
- "debug": "^3.2.6",
- "iconv-lite": "^0.4.4",
- "sax": "^1.2.4"
- }
- },
- "node-pre-gyp": {
- "version": "0.14.0",
- "bundled": true,
- "dev": true,
- "optional": true,
- "requires": {
- "detect-libc": "^1.0.2",
- "mkdirp": "^0.5.1",
- "needle": "^2.2.1",
- "nopt": "^4.0.1",
- "npm-packlist": "^1.1.6",
- "npmlog": "^4.0.2",
- "rc": "^1.2.7",
- "rimraf": "^2.6.1",
- "semver": "^5.3.0",
- "tar": "^4.4.2"
- }
- },
- "nopt": {
- "version": "4.0.1",
- "bundled": true,
- "dev": true,
- "optional": true,
- "requires": {
- "abbrev": "1",
- "osenv": "^0.1.4"
- }
- },
- "npm-bundled": {
- "version": "1.1.1",
- "bundled": true,
- "dev": true,
- "optional": true,
- "requires": {
- "npm-normalize-package-bin": "^1.0.1"
- }
- },
- "npm-normalize-package-bin": {
- "version": "1.0.1",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "npm-packlist": {
- "version": "1.4.7",
- "bundled": true,
- "dev": true,
- "optional": true,
- "requires": {
- "ignore-walk": "^3.0.1",
- "npm-bundled": "^1.0.1"
- }
- },
- "npmlog": {
- "version": "4.1.2",
- "bundled": true,
- "dev": true,
- "optional": true,
- "requires": {
- "are-we-there-yet": "~1.1.2",
- "console-control-strings": "~1.1.0",
- "gauge": "~2.7.3",
- "set-blocking": "~2.0.0"
- }
- },
- "number-is-nan": {
- "version": "1.0.1",
- "bundled": true,
- "dev": true
- },
- "object-assign": {
- "version": "4.1.1",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "once": {
- "version": "1.4.0",
- "bundled": true,
- "dev": true,
- "requires": {
- "wrappy": "1"
- }
- },
- "os-homedir": {
- "version": "1.0.2",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "os-tmpdir": {
- "version": "1.0.2",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "osenv": {
- "version": "0.1.5",
- "bundled": true,
- "dev": true,
- "optional": true,
- "requires": {
- "os-homedir": "^1.0.0",
- "os-tmpdir": "^1.0.0"
- }
- },
- "path-is-absolute": {
- "version": "1.0.1",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "process-nextick-args": {
- "version": "2.0.1",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "rc": {
- "version": "1.2.8",
- "bundled": true,
- "dev": true,
- "optional": true,
- "requires": {
- "deep-extend": "^0.6.0",
- "ini": "~1.3.0",
- "minimist": "^1.2.0",
- "strip-json-comments": "~2.0.1"
- },
- "dependencies": {
- "minimist": {
- "version": "1.2.0",
- "bundled": true,
- "dev": true,
- "optional": true
- }
- }
- },
- "readable-stream": {
- "version": "2.3.6",
- "bundled": true,
- "dev": true,
- "optional": true,
- "requires": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.3",
- "isarray": "~1.0.0",
- "process-nextick-args": "~2.0.0",
- "safe-buffer": "~5.1.1",
- "string_decoder": "~1.1.1",
- "util-deprecate": "~1.0.1"
- }
- },
- "rimraf": {
- "version": "2.7.1",
- "bundled": true,
- "dev": true,
- "optional": true,
- "requires": {
- "glob": "^7.1.3"
- }
- },
- "safe-buffer": {
- "version": "5.1.2",
- "bundled": true,
- "dev": true
- },
- "safer-buffer": {
- "version": "2.1.2",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "sax": {
- "version": "1.2.4",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "semver": {
- "version": "5.7.1",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "set-blocking": {
- "version": "2.0.0",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "signal-exit": {
- "version": "3.0.2",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "string-width": {
- "version": "1.0.2",
- "bundled": true,
- "dev": true,
- "requires": {
- "code-point-at": "^1.0.0",
- "is-fullwidth-code-point": "^1.0.0",
- "strip-ansi": "^3.0.0"
- }
- },
- "string_decoder": {
- "version": "1.1.1",
- "bundled": true,
- "dev": true,
- "optional": true,
- "requires": {
- "safe-buffer": "~5.1.0"
- }
- },
- "strip-ansi": {
- "version": "3.0.1",
- "bundled": true,
- "dev": true,
- "requires": {
- "ansi-regex": "^2.0.0"
- }
- },
- "strip-json-comments": {
- "version": "2.0.1",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "tar": {
- "version": "4.4.13",
- "bundled": true,
- "dev": true,
- "optional": true,
- "requires": {
- "chownr": "^1.1.1",
- "fs-minipass": "^1.2.5",
- "minipass": "^2.8.6",
- "minizlib": "^1.2.1",
- "mkdirp": "^0.5.0",
- "safe-buffer": "^5.1.2",
- "yallist": "^3.0.3"
- }
- },
- "util-deprecate": {
- "version": "1.0.2",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "wide-align": {
- "version": "1.1.3",
- "bundled": true,
- "dev": true,
- "optional": true,
- "requires": {
- "string-width": "^1.0.2 || 2"
- }
- },
- "wrappy": {
- "version": "1.0.2",
- "bundled": true,
- "dev": true
- },
- "yallist": {
- "version": "3.1.1",
- "bundled": true,
- "dev": true
- }
- }
- },
- "fstream": {
- "version": "1.0.12",
- "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz",
- "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==",
- "dev": true,
- "requires": {
- "graceful-fs": "^4.1.2",
- "inherits": "~2.0.0",
- "mkdirp": ">=0.5 0",
- "rimraf": "2"
- }
- },
- "function-bind": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
- "integrity": "sha1-pWiZ0+o8m6uHS7l3O3xe3pL0iV0=",
- "dev": true
- },
- "functional-red-black-tree": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
- "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=",
- "dev": true
- },
- "gauge": {
- "version": "2.7.4",
- "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz",
- "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=",
- "dev": true,
- "requires": {
- "aproba": "^1.0.3",
- "console-control-strings": "^1.0.0",
- "has-unicode": "^2.0.0",
- "object-assign": "^4.1.0",
- "signal-exit": "^3.0.0",
- "string-width": "^1.0.1",
- "strip-ansi": "^3.0.1",
- "wide-align": "^1.1.0"
- },
- "dependencies": {
- "is-fullwidth-code-point": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
- "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
- "dev": true,
- "requires": {
- "number-is-nan": "^1.0.0"
- }
- },
- "string-width": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
- "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
- "dev": true,
- "requires": {
- "code-point-at": "^1.0.0",
- "is-fullwidth-code-point": "^1.0.0",
- "strip-ansi": "^3.0.0"
- }
- }
- }
- },
- "gaze": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz",
- "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==",
- "dev": true,
- "requires": {
- "globule": "^1.0.0"
- }
- },
- "gensync": {
- "version": "1.0.0-beta.1",
- "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz",
- "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==",
- "dev": true
- },
- "get-caller-file": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz",
- "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==",
- "dev": true
- },
- "get-stdin": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz",
- "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=",
- "dev": true
- },
- "get-stream": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
- "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
- "dev": true,
- "requires": {
- "pump": "^3.0.0"
- }
- },
- "get-value": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
- "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=",
- "dev": true
- },
- "getpass": {
- "version": "0.1.7",
- "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
- "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
- "dev": true,
- "requires": {
- "assert-plus": "^1.0.0"
- }
- },
- "glob": {
- "version": "7.0.6",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.6.tgz",
- "integrity": "sha1-IRuvr0nlJbjNkyYNFKsTYVKz9Xo=",
- "requires": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.0.2",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- }
- },
- "glob-parent": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
- "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
- "dev": true,
- "requires": {
- "is-glob": "^3.1.0",
- "path-dirname": "^1.0.0"
- },
- "dependencies": {
- "is-glob": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
- "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
- "dev": true,
- "requires": {
- "is-extglob": "^2.1.0"
- }
- }
- }
- },
- "glob-to-regexp": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz",
- "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=",
- "dev": true
- },
- "global": {
- "version": "4.4.0",
- "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz",
- "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==",
- "dev": true,
- "requires": {
- "min-document": "^2.19.0",
- "process": "^0.11.10"
- }
- },
- "global-modules": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz",
- "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==",
- "dev": true,
- "requires": {
- "global-prefix": "^3.0.0"
- }
- },
- "global-prefix": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz",
- "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==",
- "dev": true,
- "requires": {
- "ini": "^1.3.5",
- "kind-of": "^6.0.2",
- "which": "^1.3.1"
- }
- },
- "globals": {
- "version": "11.12.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
- "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
- "dev": true
- },
- "globby": {
- "version": "7.1.1",
- "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz",
- "integrity": "sha1-+yzP+UAfhgCUXfral0QMypcrhoA=",
- "dev": true,
- "requires": {
- "array-union": "^1.0.1",
- "dir-glob": "^2.0.0",
- "glob": "^7.1.2",
- "ignore": "^3.3.5",
- "pify": "^3.0.0",
- "slash": "^1.0.0"
- },
- "dependencies": {
- "glob": {
- "version": "7.1.6",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
- "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
- "dev": true,
- "requires": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.0.4",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- }
- },
- "pify": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
- "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
- "dev": true
- },
- "slash": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz",
- "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=",
- "dev": true
- }
- }
- },
- "globjoin": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/globjoin/-/globjoin-0.1.4.tgz",
- "integrity": "sha1-L0SUrIkZ43Z8XLtpHp9GMyQoXUM=",
- "dev": true
- },
- "globule": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/globule/-/globule-1.3.1.tgz",
- "integrity": "sha512-OVyWOHgw29yosRHCHo7NncwR1hW5ew0W/UrvtwvjefVJeQ26q4/8r8FmPsSF1hJ93IgWkyv16pCTz6WblMzm/g==",
- "dev": true,
- "requires": {
- "glob": "~7.1.1",
- "lodash": "~4.17.12",
- "minimatch": "~3.0.2"
- },
- "dependencies": {
- "glob": {
- "version": "7.1.6",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
- "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
- "dev": true,
- "requires": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.0.4",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- }
- }
- }
- },
- "gonzales-pe": {
- "version": "4.2.4",
- "resolved": "https://registry.npmjs.org/gonzales-pe/-/gonzales-pe-4.2.4.tgz",
- "integrity": "sha512-v0Ts/8IsSbh9n1OJRnSfa7Nlxi4AkXIsWB6vPept8FDbL4bXn3FNuxjYtO/nmBGu7GDkL9MFeGebeSu6l55EPQ==",
- "dev": true,
- "requires": {
- "minimist": "1.1.x"
- },
- "dependencies": {
- "minimist": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.1.3.tgz",
- "integrity": "sha1-O+39kaktOQFvz6ocaB6Pqhoe/ag=",
- "dev": true
- }
- }
- },
- "good-listener": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/good-listener/-/good-listener-1.2.2.tgz",
- "integrity": "sha1-1TswzfkxPf+33JoNR3CWqm0UXFA=",
- "requires": {
- "delegate": "^3.1.2"
- }
- },
- "graceful-fs": {
- "version": "4.2.3",
- "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz",
- "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==",
- "dev": true
- },
- "handle-thing": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.0.tgz",
- "integrity": "sha512-d4sze1JNC454Wdo2fkuyzCr6aHcbL6PGGuFAz0Li/NcOm1tCHGnWDRmJP85dh9IhQErTc2svWFEX5xHIOo//kQ==",
- "dev": true
- },
- "har-schema": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
- "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=",
- "dev": true
- },
- "har-validator": {
- "version": "5.1.3",
- "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz",
- "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==",
- "dev": true,
- "requires": {
- "ajv": "^6.5.5",
- "har-schema": "^2.0.0"
- }
- },
- "hard-rejection": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz",
- "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==",
- "dev": true
- },
- "has": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
- "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
- "dev": true,
- "requires": {
- "function-bind": "^1.1.1"
- }
- },
- "has-ansi": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
- "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
- "requires": {
- "ansi-regex": "^2.0.0"
- }
- },
- "has-flag": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
- "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
- "dev": true
- },
- "has-symbols": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz",
- "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==",
- "dev": true
- },
- "has-unicode": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
- "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=",
- "dev": true
- },
- "has-value": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz",
- "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
- "dev": true,
- "requires": {
- "get-value": "^2.0.6",
- "has-values": "^1.0.0",
- "isobject": "^3.0.0"
- }
- },
- "has-values": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz",
- "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=",
- "dev": true,
- "requires": {
- "is-number": "^3.0.0",
- "kind-of": "^4.0.0"
- },
- "dependencies": {
- "kind-of": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
- "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
- "dev": true,
- "requires": {
- "is-buffer": "^1.1.5"
- }
- }
- }
- },
- "hash-base": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz",
- "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=",
- "dev": true,
- "requires": {
- "inherits": "^2.0.1",
- "safe-buffer": "^5.0.1"
- }
- },
- "hash.js": {
- "version": "1.1.7",
- "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz",
- "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==",
- "dev": true,
- "requires": {
- "inherits": "^2.0.3",
- "minimalistic-assert": "^1.0.1"
- }
- },
- "he": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
- "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
- "dev": true
- },
- "hmac-drbg": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz",
- "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=",
- "dev": true,
- "requires": {
- "hash.js": "^1.0.3",
- "minimalistic-assert": "^1.0.0",
- "minimalistic-crypto-utils": "^1.0.1"
- }
- },
- "hoist-non-react-statics": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-1.2.0.tgz",
- "integrity": "sha1-qkSM8JhtVcxAdzsXF0t90GbLfPs="
- },
- "homedir-polyfill": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz",
- "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==",
- "dev": true,
- "requires": {
- "parse-passwd": "^1.0.0"
- }
- },
- "hosted-git-info": {
- "version": "2.8.5",
- "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.5.tgz",
- "integrity": "sha512-kssjab8CvdXfcXMXVcvsXum4Hwdq9XGtRD3TteMEvEbq0LXyiNQr6AprqKqfeaDXze7SxWvRxdpwE6ku7ikLkg==",
- "dev": true
- },
- "hpack.js": {
- "version": "2.1.6",
- "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz",
- "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=",
- "dev": true,
- "requires": {
- "inherits": "^2.0.1",
- "obuf": "^1.0.0",
- "readable-stream": "^2.0.1",
- "wbuf": "^1.1.0"
- }
- },
- "html-entities": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz",
- "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=",
- "dev": true
- },
- "html-loader": {
- "version": "0.5.5",
- "resolved": "https://registry.npmjs.org/html-loader/-/html-loader-0.5.5.tgz",
- "integrity": "sha512-7hIW7YinOYUpo//kSYcPB6dCKoceKLmOwjEMmhIobHuWGDVl0Nwe4l68mdG/Ru0wcUxQjVMEoZpkalZ/SE7zog==",
- "dev": true,
- "requires": {
- "es6-templates": "^0.2.3",
- "fastparse": "^1.1.1",
- "html-minifier": "^3.5.8",
- "loader-utils": "^1.1.0",
- "object-assign": "^4.1.1"
- },
- "dependencies": {
- "commander": {
- "version": "2.17.1",
- "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz",
- "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==",
- "dev": true
- },
- "html-minifier": {
- "version": "3.5.21",
- "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.21.tgz",
- "integrity": "sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA==",
- "dev": true,
- "requires": {
- "camel-case": "3.0.x",
- "clean-css": "4.2.x",
- "commander": "2.17.x",
- "he": "1.2.x",
- "param-case": "2.1.x",
- "relateurl": "0.2.x",
- "uglify-js": "3.4.x"
- }
- }
- }
- },
- "html-minifier": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-4.0.0.tgz",
- "integrity": "sha512-aoGxanpFPLg7MkIl/DDFYtb0iWz7jMFGqFhvEDZga6/4QTjneiD8I/NXL1x5aaoCp7FSIT6h/OhykDdPsbtMig==",
- "dev": true,
- "requires": {
- "camel-case": "^3.0.0",
- "clean-css": "^4.2.1",
- "commander": "^2.19.0",
- "he": "^1.2.0",
- "param-case": "^2.1.1",
- "relateurl": "^0.2.7",
- "uglify-js": "^3.5.1"
- },
- "dependencies": {
- "source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
- "dev": true
- },
- "uglify-js": {
- "version": "3.8.0",
- "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.8.0.tgz",
- "integrity": "sha512-ugNSTT8ierCsDHso2jkBHXYrU8Y5/fY2ZUprfrJUiD7YpuFvV4jODLFmb3h4btQjqr5Nh4TX4XtgDfCU1WdioQ==",
- "dev": true,
- "requires": {
- "commander": "~2.20.3",
- "source-map": "~0.6.1"
- }
- }
- }
- },
- "html-minifier-loader": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/html-minifier-loader/-/html-minifier-loader-1.4.1.tgz",
- "integrity": "sha1-ZfBeKl+R9rBxPMIIGuTr5L/A1pY=",
- "dev": true,
- "requires": {
- "loader-utils": "^1.1.0"
- }
- },
- "html-tags": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.1.0.tgz",
- "integrity": "sha512-1qYz89hW3lFDEazhjW0yVAV87lw8lVkrJocr72XmBkMKsoSVJCQx3W8BXsC7hO2qAt8BoVjYjtAcZ9perqGnNg==",
- "dev": true
- },
- "html-webpack-plugin": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-3.2.0.tgz",
- "integrity": "sha1-sBq71yOsqqeze2r0SS69oD2d03s=",
- "dev": true,
- "requires": {
- "html-minifier": "^3.2.3",
- "loader-utils": "^0.2.16",
- "lodash": "^4.17.3",
- "pretty-error": "^2.0.2",
- "tapable": "^1.0.0",
- "toposort": "^1.0.0",
- "util.promisify": "1.0.0"
- },
- "dependencies": {
- "big.js": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz",
- "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==",
- "dev": true
- },
- "commander": {
- "version": "2.17.1",
- "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz",
- "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==",
- "dev": true
- },
- "emojis-list": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz",
- "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=",
- "dev": true
- },
- "html-minifier": {
- "version": "3.5.21",
- "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.21.tgz",
- "integrity": "sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA==",
- "dev": true,
- "requires": {
- "camel-case": "3.0.x",
- "clean-css": "4.2.x",
- "commander": "2.17.x",
- "he": "1.2.x",
- "param-case": "2.1.x",
- "relateurl": "0.2.x",
- "uglify-js": "3.4.x"
- }
- },
- "json5": {
- "version": "0.5.1",
- "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz",
- "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=",
- "dev": true
- },
- "loader-utils": {
- "version": "0.2.17",
- "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz",
- "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=",
- "dev": true,
- "requires": {
- "big.js": "^3.1.3",
- "emojis-list": "^2.0.0",
- "json5": "^0.5.0",
- "object-assign": "^4.0.1"
- }
- }
- }
- },
- "htmlparser2": {
- "version": "3.10.1",
- "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz",
- "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==",
- "dev": true,
- "requires": {
- "domelementtype": "^1.3.1",
- "domhandler": "^2.3.0",
- "domutils": "^1.5.1",
- "entities": "^1.1.1",
- "inherits": "^2.0.1",
- "readable-stream": "^3.1.1"
- },
- "dependencies": {
- "entities": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz",
- "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==",
- "dev": true
- },
- "readable-stream": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
- "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
- "dev": true,
- "requires": {
- "inherits": "^2.0.3",
- "string_decoder": "^1.1.1",
- "util-deprecate": "^1.0.1"
- }
- }
- }
- },
- "http-deceiver": {
- "version": "1.2.7",
- "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz",
- "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=",
- "dev": true
- },
- "http-errors": {
- "version": "1.7.2",
- "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz",
- "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==",
- "dev": true,
- "requires": {
- "depd": "~1.1.2",
- "inherits": "2.0.3",
- "setprototypeof": "1.1.1",
- "statuses": ">= 1.5.0 < 2",
- "toidentifier": "1.0.0"
- },
- "dependencies": {
- "inherits": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
- "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
- "dev": true
- }
- }
- },
- "http-parser-js": {
- "version": "0.4.10",
- "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.10.tgz",
- "integrity": "sha1-ksnBN0w1CF912zWexWzCV8u5P6Q=",
- "dev": true
- },
- "http-proxy": {
- "version": "1.18.0",
- "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.0.tgz",
- "integrity": "sha512-84I2iJM/n1d4Hdgc6y2+qY5mDaz2PUVjlg9znE9byl+q0uC3DeByqBGReQu5tpLK0TAqTIXScRUV+dg7+bUPpQ==",
- "dev": true,
- "requires": {
- "eventemitter3": "^4.0.0",
- "follow-redirects": "^1.0.0",
- "requires-port": "^1.0.0"
- }
- },
- "http-proxy-middleware": {
- "version": "0.19.1",
- "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz",
- "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==",
- "dev": true,
- "requires": {
- "http-proxy": "^1.17.0",
- "is-glob": "^4.0.0",
- "lodash": "^4.17.11",
- "micromatch": "^3.1.10"
- }
- },
- "http-signature": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
- "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
- "dev": true,
- "requires": {
- "assert-plus": "^1.0.0",
- "jsprim": "^1.2.2",
- "sshpk": "^1.7.0"
- }
- },
- "https-browserify": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz",
- "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=",
- "dev": true
- },
- "hyphenate-style-name": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.3.tgz",
- "integrity": "sha512-EcuixamT82oplpoJ2XU4pDtKGWQ7b00CD9f1ug9IaQ3p1bkHMiKCZ9ut9QDI6qsa6cpUuB+A/I+zLtdNK4n2DQ=="
- },
- "iconv-lite": {
- "version": "0.4.24",
- "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
- "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
- "requires": {
- "safer-buffer": ">= 2.1.2 < 3"
- }
- },
- "icss-utils": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.1.tgz",
- "integrity": "sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==",
- "dev": true,
- "requires": {
- "postcss": "^7.0.14"
- }
- },
- "ieee754": {
- "version": "1.1.13",
- "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz",
- "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==",
- "dev": true
- },
- "iferr": {
- "version": "0.1.5",
- "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz",
- "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=",
- "dev": true
- },
- "ignore": {
- "version": "3.3.10",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz",
- "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==",
- "dev": true
- },
- "image-size": {
- "version": "0.5.5",
- "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz",
- "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=",
- "dev": true,
- "optional": true
- },
- "imagemin": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/imagemin/-/imagemin-6.1.0.tgz",
- "integrity": "sha512-8ryJBL1CN5uSHpiBMX0rJw79C9F9aJqMnjGnrd/1CafegpNuA81RBAAru/jQQEOWlOJJlpRnlcVFF6wq+Ist0A==",
- "dev": true,
- "requires": {
- "file-type": "^10.7.0",
- "globby": "^8.0.1",
- "make-dir": "^1.0.0",
- "p-pipe": "^1.1.0",
- "pify": "^4.0.1",
- "replace-ext": "^1.0.0"
- },
- "dependencies": {
- "dir-glob": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz",
- "integrity": "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==",
- "dev": true,
- "requires": {
- "arrify": "^1.0.1",
- "path-type": "^3.0.0"
- }
- },
- "glob": {
- "version": "7.1.6",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
- "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
- "dev": true,
- "requires": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.0.4",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- }
- },
- "globby": {
- "version": "8.0.2",
- "resolved": "https://registry.npmjs.org/globby/-/globby-8.0.2.tgz",
- "integrity": "sha512-yTzMmKygLp8RUpG1Ymu2VXPSJQZjNAZPD4ywgYEaG7e4tBJeUQBO8OpXrf1RCNcEs5alsoJYPAMiIHP0cmeC7w==",
- "dev": true,
- "requires": {
- "array-union": "^1.0.1",
- "dir-glob": "2.0.0",
- "fast-glob": "^2.0.2",
- "glob": "^7.1.2",
- "ignore": "^3.3.5",
- "pify": "^3.0.0",
- "slash": "^1.0.0"
- },
- "dependencies": {
- "pify": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
- "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
- "dev": true
- }
- }
- },
- "make-dir": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz",
- "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==",
- "dev": true,
- "requires": {
- "pify": "^3.0.0"
- },
- "dependencies": {
- "pify": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
- "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
- "dev": true
- }
- }
- },
- "slash": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz",
- "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=",
- "dev": true
- }
- }
- },
- "img-loader": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/img-loader/-/img-loader-3.0.1.tgz",
- "integrity": "sha512-0jDJqexgzOuq3zlXwFTBKJlMcaP1uXyl5t4Qu6b1IgXb3IwBDjPfVylBC8vHFIIESDw/S+5QkBbtBrt4T8wESA==",
- "dev": true,
- "requires": {
- "loader-utils": "^1.1.0"
- }
- },
- "immediate": {
- "version": "3.0.6",
- "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz",
- "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps="
- },
- "import-cwd": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz",
- "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=",
- "dev": true,
- "requires": {
- "import-from": "^2.1.0"
- }
- },
- "import-fresh": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz",
- "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==",
- "dev": true,
- "requires": {
- "parent-module": "^1.0.0",
- "resolve-from": "^4.0.0"
- }
- },
- "import-from": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz",
- "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=",
- "dev": true,
- "requires": {
- "resolve-from": "^3.0.0"
- },
- "dependencies": {
- "resolve-from": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz",
- "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=",
- "dev": true
- }
- }
- },
- "import-lazy": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz",
- "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==",
- "dev": true
- },
- "import-local": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz",
- "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==",
- "dev": true,
- "requires": {
- "pkg-dir": "^3.0.0",
- "resolve-cwd": "^2.0.0"
- }
- },
- "imurmurhash": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
- "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
- "dev": true
- },
- "in-publish": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.0.tgz",
- "integrity": "sha1-4g/146KvwmkDILbcVSaCqcf631E=",
- "dev": true
- },
- "indent-string": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
- "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
- "dev": true
- },
- "indexes-of": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz",
- "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=",
- "dev": true
- },
- "infer-owner": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz",
- "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==",
- "dev": true
- },
- "inflight": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
- "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
- "requires": {
- "once": "^1.3.0",
- "wrappy": "1"
- }
- },
- "inherits": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
- "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
- },
- "ini": {
- "version": "1.3.5",
- "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
- "integrity": "sha1-7uJfVtscnsYIXgwid4CD9Zar+Sc="
- },
- "inline-style-prefixer": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/inline-style-prefixer/-/inline-style-prefixer-2.0.5.tgz",
- "integrity": "sha1-wVPH6I/YT+9cYC6VqBaLJ3BnH+c=",
- "requires": {
- "bowser": "^1.0.0",
- "hyphenate-style-name": "^1.0.1"
- }
- },
- "inquirer": {
- "version": "3.0.6",
- "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.0.6.tgz",
- "integrity": "sha1-4EqqnQW3o8ubD0B9BDdfBEcZA0c=",
- "requires": {
- "ansi-escapes": "^1.1.0",
- "chalk": "^1.0.0",
- "cli-cursor": "^2.1.0",
- "cli-width": "^2.0.0",
- "external-editor": "^2.0.1",
- "figures": "^2.0.0",
- "lodash": "^4.3.0",
- "mute-stream": "0.0.7",
- "run-async": "^2.2.0",
- "rx": "^4.1.0",
- "string-width": "^2.0.0",
- "strip-ansi": "^3.0.0",
- "through": "^2.3.6"
- }
- },
- "internal-ip": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz",
- "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==",
- "dev": true,
- "requires": {
- "default-gateway": "^4.2.0",
- "ipaddr.js": "^1.9.0"
- }
- },
- "interpret": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz",
- "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==",
- "dev": true
- },
- "invariant": {
- "version": "2.2.4",
- "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
- "integrity": "sha1-YQ88ksk1nOHbYW5TgAjSP/NRWOY=",
- "dev": true,
- "requires": {
- "loose-envify": "^1.0.0"
- }
- },
- "invert-kv": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz",
- "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=",
- "dev": true
- },
- "ip": {
- "version": "1.1.5",
- "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz",
- "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=",
- "dev": true
- },
- "ip-regex": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz",
- "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=",
- "dev": true
- },
- "ipaddr.js": {
- "version": "1.9.0",
- "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz",
- "integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA==",
- "dev": true
- },
- "is-absolute-url": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz",
- "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==",
- "dev": true
- },
- "is-accessor-descriptor": {
- "version": "0.1.6",
- "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
- "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
- "dev": true,
- "requires": {
- "kind-of": "^3.0.2"
- },
- "dependencies": {
- "kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "dev": true,
- "requires": {
- "is-buffer": "^1.1.5"
- }
- }
- }
- },
- "is-alphabetical": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz",
- "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==",
- "dev": true
- },
- "is-alphanumeric": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-alphanumeric/-/is-alphanumeric-1.0.0.tgz",
- "integrity": "sha1-Spzvcdr0wAHB2B1j0UDPU/1oifQ=",
- "dev": true
- },
- "is-alphanumerical": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz",
- "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==",
- "dev": true,
- "requires": {
- "is-alphabetical": "^1.0.0",
- "is-decimal": "^1.0.0"
- }
- },
- "is-arguments": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz",
- "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==",
- "dev": true
- },
- "is-arrayish": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
- "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
- "dev": true
- },
- "is-binary-path": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz",
- "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=",
- "dev": true,
- "requires": {
- "binary-extensions": "^1.0.0"
- }
- },
- "is-buffer": {
- "version": "1.1.6",
- "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
- "integrity": "sha1-76ouqdqg16suoTqXsritUf776L4=",
- "dev": true
- },
- "is-callable": {
- "version": "1.1.5",
- "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz",
- "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==",
- "dev": true
- },
- "is-data-descriptor": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
- "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
- "dev": true,
- "requires": {
- "kind-of": "^3.0.2"
- },
- "dependencies": {
- "kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "dev": true,
- "requires": {
- "is-buffer": "^1.1.5"
- }
- }
- }
- },
- "is-date-object": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz",
- "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==",
- "dev": true
- },
- "is-decimal": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz",
- "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==",
- "dev": true
- },
- "is-descriptor": {
- "version": "0.1.6",
- "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
- "integrity": "sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=",
- "dev": true,
- "requires": {
- "is-accessor-descriptor": "^0.1.6",
- "is-data-descriptor": "^0.1.4",
- "kind-of": "^5.0.0"
- },
- "dependencies": {
- "kind-of": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
- "integrity": "sha1-cpyR4thXt6QZofmqZWhcTDP1hF0=",
- "dev": true
- }
- }
- },
- "is-directory": {
- "version": "0.3.1",
- "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz",
- "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=",
- "dev": true
- },
- "is-extendable": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
- "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
- "dev": true
- },
- "is-extglob": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
- "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
- "dev": true
- },
- "is-finite": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz",
- "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==",
- "dev": true
- },
- "is-fullwidth-code-point": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
- "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8="
- },
- "is-glob": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz",
- "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==",
- "dev": true,
- "requires": {
- "is-extglob": "^2.1.1"
- }
- },
- "is-hexadecimal": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz",
- "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==",
- "dev": true
- },
- "is-number": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
- "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
- "dev": true,
- "requires": {
- "kind-of": "^3.0.2"
- },
- "dependencies": {
- "kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "dev": true,
- "requires": {
- "is-buffer": "^1.1.5"
- }
- }
- }
- },
- "is-obj": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz",
- "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==",
- "dev": true
- },
- "is-path-cwd": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz",
- "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==",
- "dev": true
- },
- "is-path-in-cwd": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz",
- "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==",
- "dev": true,
- "requires": {
- "is-path-inside": "^2.1.0"
- }
- },
- "is-path-inside": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz",
- "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==",
- "dev": true,
- "requires": {
- "path-is-inside": "^1.0.2"
- }
- },
- "is-plain-obj": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz",
- "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=",
- "dev": true
- },
- "is-plain-object": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
- "integrity": "sha1-LBY7P6+xtgbZ0Xko8FwqHDjgdnc=",
- "dev": true,
- "requires": {
- "isobject": "^3.0.1"
- }
- },
- "is-promise": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz",
- "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o="
- },
- "is-regex": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz",
- "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==",
- "dev": true,
- "requires": {
- "has": "^1.0.3"
- }
- },
- "is-regexp": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-2.1.0.tgz",
- "integrity": "sha512-OZ4IlER3zmRIoB9AqNhEggVxqIH4ofDns5nRrPS6yQxXE1TPCUpFznBfRQmQa8uC+pXqjMnukiJBxCisIxiLGA==",
- "dev": true
- },
- "is-stream": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
- "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ="
- },
- "is-string": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz",
- "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==",
- "dev": true
- },
- "is-symbol": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz",
- "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==",
- "dev": true,
- "requires": {
- "has-symbols": "^1.0.1"
- }
- },
- "is-typedarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
- "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
- "dev": true
- },
- "is-utf8": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz",
- "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=",
- "dev": true
- },
- "is-whitespace-character": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz",
- "integrity": "sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w==",
- "dev": true
- },
- "is-windows": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
- "integrity": "sha1-0YUOuXkezRjmGCzhKjDzlmNLsZ0=",
- "dev": true
- },
- "is-word-character": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/is-word-character/-/is-word-character-1.0.4.tgz",
- "integrity": "sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA==",
- "dev": true
- },
- "is-wsl": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz",
- "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=",
- "dev": true
- },
- "isarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
- "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
- },
- "isexe": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
- "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
- "dev": true
- },
- "isobject": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
- "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
- "dev": true
- },
- "isomorphic-fetch": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz",
- "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=",
- "requires": {
- "node-fetch": "^1.0.1",
- "whatwg-fetch": ">=0.10.0"
- }
- },
- "isstream": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
- "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
- "dev": true
- },
- "javascript-detect-element-resize": {
- "version": "0.5.3",
- "resolved": "https://registry.npmjs.org/javascript-detect-element-resize/-/javascript-detect-element-resize-0.5.3.tgz",
- "integrity": "sha1-GnHNUd/lZZB/KZAS/nOilBBAJd4="
- },
- "jquery": {
- "version": "3.4.1",
- "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.4.1.tgz",
- "integrity": "sha512-36+AdBzCL+y6qjw5Tx7HgzeGCzC81MDDgaUP8ld2zhx58HdqXGoBd+tHdrBMiyjGQs0Hxs/MLZTu/eHNJJuWPw=="
- },
- "jquery.terminal": {
- "version": "1.23.2",
- "resolved": "https://registry.npmjs.org/jquery.terminal/-/jquery.terminal-1.23.2.tgz",
- "integrity": "sha512-ULKxZNzL8W4CoeAx5CJZTVY80SrNoeetA4lhnBeHd792uaLAkfRXMeJeARLWhBOrzDWo1yqn2nm4td0a+EU0dg==",
- "requires": {
- "@types/jquery": "^3.3.6",
- "jquery": "~3",
- "prismjs": "^1.15.0",
- "wcwidth": "^1.0.1"
- }
- },
- "js-base64": {
- "version": "2.5.2",
- "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.5.2.tgz",
- "integrity": "sha512-Vg8czh0Q7sFBSUMWWArX/miJeBWYBPpdU/3M/DKSaekLMqrqVPaedp+5mZhie/r0lgrcaYBfwXatEew6gwgiQQ==",
- "dev": true
- },
- "js-beautify": {
- "version": "1.10.3",
- "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.10.3.tgz",
- "integrity": "sha512-wfk/IAWobz1TfApSdivH5PJ0miIHgDoYb1ugSqHcODPmaYu46rYe5FVuIEkhjg8IQiv6rDNPyhsqbsohI/C2vQ==",
- "requires": {
- "config-chain": "^1.1.12",
- "editorconfig": "^0.15.3",
- "glob": "^7.1.3",
- "mkdirp": "~0.5.1",
- "nopt": "~4.0.1"
- },
- "dependencies": {
- "glob": {
- "version": "7.1.6",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
- "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
- "requires": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.0.4",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- }
- },
- "nopt": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz",
- "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=",
- "requires": {
- "abbrev": "1",
- "osenv": "^0.1.4"
- }
- }
- }
- },
- "js-tokens": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
- "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
- },
- "js-yaml": {
- "version": "3.13.1",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz",
- "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==",
- "dev": true,
- "requires": {
- "argparse": "^1.0.7",
- "esprima": "^4.0.0"
- }
- },
- "jsbn": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
- "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=",
- "dev": true
- },
- "jsesc": {
- "version": "2.5.2",
- "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
- "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
- "dev": true
- },
- "json-parse-better-errors": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
- "integrity": "sha1-u4Z8+zRQ5pEHwTHRxRS6s9yLyqk=",
- "dev": true
- },
- "json-schema": {
- "version": "0.2.3",
- "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
- "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=",
- "dev": true
- },
- "json-schema-defaults": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/json-schema-defaults/-/json-schema-defaults-0.2.0.tgz",
- "integrity": "sha1-ic64b/BTffvBpt21LyvQPvqF/4k="
- },
- "json-schema-traverse": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
- "integrity": "sha1-afaofZUTq4u4/mO9sJecRI5oRmA=",
- "dev": true
- },
- "json-stable-stringify-without-jsonify": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
- "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
- "dev": true
- },
- "json-stringify-safe": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
- "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=",
- "dev": true
- },
- "json3": {
- "version": "3.3.3",
- "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz",
- "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==",
- "dev": true
- },
- "json5": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.1.tgz",
- "integrity": "sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ==",
- "dev": true,
- "requires": {
- "minimist": "^1.2.0"
- }
- },
- "jsonminify": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/jsonminify/-/jsonminify-0.4.1.tgz",
- "integrity": "sha1-gF2vuzk5UYjO6atYLIHvlZ1+cQw=",
- "dev": true
- },
- "jsprim": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
- "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
- "dev": true,
- "requires": {
- "assert-plus": "1.0.0",
- "extsprintf": "1.3.0",
- "json-schema": "0.2.3",
- "verror": "1.10.0"
- }
- },
- "jstree": {
- "version": "3.3.9",
- "resolved": "https://registry.npmjs.org/jstree/-/jstree-3.3.9.tgz",
- "integrity": "sha512-jRIbhg+BHrIs1Wm6oiJt3oKTVBE6sWS0PCp2/RlkIUqsLUPWUYgV3q8LfKoi1/E+YMzGtP6BuK4okk+0mwfmhQ==",
- "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"
- }
- },
- "jszip": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.2.2.tgz",
- "integrity": "sha512-NmKajvAFQpbg3taXQXr/ccS2wcucR1AZ+NtyWp2Nq7HHVsXhcJFR8p0Baf32C2yVvBylFWVeKf+WI2AnvlPhpA==",
- "requires": {
- "lie": "~3.3.0",
- "pako": "~1.0.2",
- "readable-stream": "~2.3.6",
- "set-immediate-shim": "~1.0.1"
- }
- },
- "keycode": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/keycode/-/keycode-2.2.0.tgz",
- "integrity": "sha1-PQr1bce4uOXLqNCpfxByBO7CKwQ="
- },
- "killable": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz",
- "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==",
- "dev": true
- },
- "kind-of": {
- "version": "6.0.3",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
- "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
- "dev": true
- },
- "known-css-properties": {
- "version": "0.17.0",
- "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.17.0.tgz",
- "integrity": "sha512-Vi3nxDGMm/z+lAaCjvAR1u+7fiv+sG6gU/iYDj5QOF8h76ytK9EW/EKfF0NeTyiGBi8Jy6Hklty/vxISrLox3w==",
- "dev": true
- },
- "lcid": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz",
- "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=",
- "dev": true,
- "requires": {
- "invert-kv": "^1.0.0"
- }
- },
- "leaflet": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/leaflet/-/leaflet-1.6.0.tgz",
- "integrity": "sha512-CPkhyqWUKZKFJ6K8umN5/D2wrJ2+/8UIpXppY7QDnUZW5bZL5+SEI2J7GBpwh4LIupOKqbNSQXgqmrEJopHVNQ=="
- },
- "leaflet-polylinedecorator": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/leaflet-polylinedecorator/-/leaflet-polylinedecorator-1.6.0.tgz",
- "integrity": "sha1-nvef0bUwLWe3Lv6Vmo7NJVPycmY=",
- "requires": {
- "leaflet-rotatedmarker": "^0.2.0"
- }
- },
- "leaflet-providers": {
- "version": "1.9.1",
- "resolved": "https://registry.npmjs.org/leaflet-providers/-/leaflet-providers-1.9.1.tgz",
- "integrity": "sha512-YpJB9y4/nT5NGicU9vuqlttJaCer6paD3J3b8Wrw+IIQvK9dtcdzE9CsTkDg7Dg9FeGp5NEr3hu17xcHbYI/2w=="
- },
- "leaflet-rotatedmarker": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/leaflet-rotatedmarker/-/leaflet-rotatedmarker-0.2.0.tgz",
- "integrity": "sha1-RGf0n5jRv9VpWb2cZwUgPdJgEnc="
- },
- "leaflet.markercluster": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/leaflet.markercluster/-/leaflet.markercluster-1.4.1.tgz",
- "integrity": "sha512-ZSEpE/EFApR0bJ1w/dUGwTSUvWlpalKqIzkaYdYB7jaftQA/Y2Jav+eT4CMtEYFj+ZK4mswP13Q2acnPBnhGOw=="
- },
- "less": {
- "version": "3.11.1",
- "resolved": "https://registry.npmjs.org/less/-/less-3.11.1.tgz",
- "integrity": "sha512-tlWX341RECuTOvoDIvtFqXsKj072hm3+9ymRBe76/mD6O5ZZecnlAOVDlWAleF2+aohFrxNidXhv2773f6kY7g==",
- "dev": true,
- "requires": {
- "clone": "^2.1.2",
- "errno": "^0.1.1",
- "graceful-fs": "^4.1.2",
- "image-size": "~0.5.0",
- "mime": "^1.4.1",
- "mkdirp": "^0.5.0",
- "promise": "^7.1.1",
- "request": "^2.83.0",
- "source-map": "~0.6.0",
- "tslib": "^1.10.0"
- },
- "dependencies": {
- "clone": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
- "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=",
- "dev": true
- },
- "source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
- "dev": true,
- "optional": true
- }
- }
- },
- "less-loader": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-5.0.0.tgz",
- "integrity": "sha512-bquCU89mO/yWLaUq0Clk7qCsKhsF/TZpJUzETRvJa9KSVEL9SO3ovCvdEHISBhrC81OwC8QSVX7E0bzElZj9cg==",
- "dev": true,
- "requires": {
- "clone": "^2.1.1",
- "loader-utils": "^1.1.0",
- "pify": "^4.0.1"
- },
- "dependencies": {
- "clone": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
- "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=",
- "dev": true
- }
- }
- },
- "leven": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz",
- "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==",
- "dev": true
- },
- "levenary": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/levenary/-/levenary-1.1.1.tgz",
- "integrity": "sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ==",
- "dev": true,
- "requires": {
- "leven": "^3.1.0"
- }
- },
- "levn": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
- "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
- "dev": true,
- "requires": {
- "prelude-ls": "~1.1.2",
- "type-check": "~0.3.2"
- }
- },
- "lie": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz",
- "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==",
- "requires": {
- "immediate": "~3.0.5"
- }
- },
- "lines-and-columns": {
- "version": "1.1.6",
- "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz",
- "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=",
- "dev": true
- },
- "load-json-file": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz",
- "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=",
- "dev": true,
- "requires": {
- "graceful-fs": "^4.1.2",
- "parse-json": "^2.2.0",
- "pify": "^2.0.0",
- "strip-bom": "^3.0.0"
- },
- "dependencies": {
- "pify": {
- "version": "2.3.0",
- "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
- "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
- "dev": true
- }
- }
- },
- "loader-fs-cache": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/loader-fs-cache/-/loader-fs-cache-1.0.2.tgz",
- "integrity": "sha512-70IzT/0/L+M20jUlEqZhZyArTU6VKLRTYRDAYN26g4jfzpJqjipLL3/hgYpySqI9PwsVRHHFja0LfEmsx9X2Cw==",
- "dev": true,
- "requires": {
- "find-cache-dir": "^0.1.1",
- "mkdirp": "0.5.1"
- },
- "dependencies": {
- "find-cache-dir": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-0.1.1.tgz",
- "integrity": "sha1-yN765XyKUqinhPnjHFfHQumToLk=",
- "dev": true,
- "requires": {
- "commondir": "^1.0.1",
- "mkdirp": "^0.5.1",
- "pkg-dir": "^1.0.0"
- }
- },
- "find-up": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz",
- "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=",
- "dev": true,
- "requires": {
- "path-exists": "^2.0.0",
- "pinkie-promise": "^2.0.0"
- }
- },
- "path-exists": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz",
- "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=",
- "dev": true,
- "requires": {
- "pinkie-promise": "^2.0.0"
- }
- },
- "pkg-dir": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz",
- "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=",
- "dev": true,
- "requires": {
- "find-up": "^1.0.0"
- }
- }
- }
- },
- "loader-runner": {
- "version": "2.4.0",
- "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz",
- "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==",
- "dev": true
- },
- "loader-utils": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz",
- "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==",
- "dev": true,
- "requires": {
- "big.js": "^5.2.2",
- "emojis-list": "^3.0.0",
- "json5": "^1.0.1"
- },
- "dependencies": {
- "json5": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
- "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
- "dev": true,
- "requires": {
- "minimist": "^1.2.0"
- }
- }
- }
- },
- "locate-path": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
- "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
- "dev": true,
- "requires": {
- "p-locate": "^3.0.0",
- "path-exists": "^3.0.0"
- }
- },
- "lodash": {
- "version": "4.17.15",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
- "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A=="
- },
- "lodash.isboolean": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz",
- "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=",
- "dev": true
- },
- "lodash.isequal": {
- "version": "4.5.0",
- "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz",
- "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA="
- },
- "lodash.isregexp": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/lodash.isregexp/-/lodash.isregexp-4.0.1.tgz",
- "integrity": "sha1-4T5kezDNVZdSoEzZEghvr32hwws=",
- "dev": true
- },
- "lodash.isstring": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz",
- "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=",
- "dev": true
- },
- "lodash.merge": {
- "version": "4.6.2",
- "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
- "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="
- },
- "lodash.throttle": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz",
- "integrity": "sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ="
- },
- "log-symbols": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz",
- "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==",
- "dev": true,
- "requires": {
- "chalk": "^2.4.2"
- },
- "dependencies": {
- "ansi-styles": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
- "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
- "dev": true,
- "requires": {
- "color-convert": "^1.9.0"
- }
- },
- "chalk": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
- "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
- "dev": true,
- "requires": {
- "ansi-styles": "^3.2.1",
- "escape-string-regexp": "^1.0.5",
- "supports-color": "^5.3.0"
- }
- },
- "supports-color": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
- "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
- "dev": true,
- "requires": {
- "has-flag": "^3.0.0"
- }
- }
- }
- },
- "loglevel": {
- "version": "1.6.7",
- "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.7.tgz",
- "integrity": "sha512-cY2eLFrQSAfVPhCgH1s7JI73tMbg9YC3v3+ZHVW67sBS7UxWzNEk/ZBbSfLykBWHp33dqqtOv82gjhKEi81T/A==",
- "dev": true
- },
- "longest-streak": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-2.0.4.tgz",
- "integrity": "sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg==",
- "dev": true
- },
- "loose-envify": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
- "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
- "requires": {
- "js-tokens": "^3.0.0 || ^4.0.0"
- }
- },
- "loud-rejection": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz",
- "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=",
- "dev": true,
- "requires": {
- "currently-unhandled": "^0.4.1",
- "signal-exit": "^3.0.0"
- }
- },
- "lower-case": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz",
- "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=",
- "dev": true
- },
- "lru-cache": {
- "version": "4.1.5",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz",
- "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==",
- "requires": {
- "pseudomap": "^1.0.2",
- "yallist": "^2.1.2"
- }
- },
- "make-dir": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz",
- "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==",
- "dev": true,
- "requires": {
- "pify": "^4.0.1",
- "semver": "^5.6.0"
- }
- },
- "make-plural": {
- "version": "3.0.6",
- "resolved": "https://registry.npmjs.org/make-plural/-/make-plural-3.0.6.tgz",
- "integrity": "sha1-IDOgO6wpC487uRJY9lud9+iwHKc=",
- "requires": {
- "minimist": "^1.2.0"
- }
- },
- "mamacro": {
- "version": "0.0.3",
- "resolved": "https://registry.npmjs.org/mamacro/-/mamacro-0.0.3.tgz",
- "integrity": "sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA==",
- "dev": true
- },
- "map-age-cleaner": {
- "version": "0.1.3",
- "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz",
- "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==",
- "dev": true,
- "requires": {
- "p-defer": "^1.0.0"
- }
- },
- "map-cache": {
- "version": "0.2.2",
- "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
- "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=",
- "dev": true
- },
- "map-obj": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
- "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=",
- "dev": true
- },
- "map-visit": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz",
- "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=",
- "dev": true,
- "requires": {
- "object-visit": "^1.0.0"
- }
- },
- "markdown-escapes": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.4.tgz",
- "integrity": "sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg==",
- "dev": true
- },
- "markdown-table": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-1.1.3.tgz",
- "integrity": "sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q==",
- "dev": true
- },
- "material-design-icons": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/material-design-icons/-/material-design-icons-3.0.1.tgz",
- "integrity": "sha1-mnHEh0chjrylHlGmbaaCA4zct78=",
- "dev": true
- },
- "material-steppers": {
- "version": "git://github.com/thingsboard/material-steppers.git#ee6241d63b97b7c4a3f3b240cdb347c02a3dcb0a",
- "from": "git://github.com/thingsboard/material-steppers.git#master"
- },
- "material-ui": {
- "version": "0.16.7",
- "resolved": "https://registry.npmjs.org/material-ui/-/material-ui-0.16.7.tgz",
- "integrity": "sha1-XsUIDV8ieBcJLESRBd+cvIgHlBw=",
- "requires": {
- "babel-runtime": "^6.11.6",
- "inline-style-prefixer": "^2.0.1",
- "keycode": "^2.1.1",
- "lodash.merge": "^4.6.0",
- "lodash.throttle": "^4.1.1",
- "react-addons-create-fragment": "^15.0.0",
- "react-addons-transition-group": "^15.0.0",
- "react-event-listener": "^0.4.0",
- "recompose": "^0.21.0",
- "simple-assign": "^0.1.0",
- "warning": "^3.0.0"
- }
- },
- "material-ui-number-input": {
- "version": "5.0.24",
- "resolved": "https://registry.npmjs.org/material-ui-number-input/-/material-ui-number-input-5.0.24.tgz",
- "integrity": "sha1-CRJdGoK2whnpr4s8LGjJ7GwN+8Q=",
- "requires": {
- "bind-decorator": "^1.0.11",
- "object-assign": "^4.1.1",
- "prop-types": "^15.5.10"
- }
- },
- "mathml-tag-names": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz",
- "integrity": "sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==",
- "dev": true
- },
- "md-color-picker": {
- "version": "0.2.6",
- "resolved": "https://registry.npmjs.org/md-color-picker/-/md-color-picker-0.2.6.tgz",
- "integrity": "sha1-OCfUkssPzZcgIG4+MqpRU/rfaIs=",
- "requires": {
- "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"
- }
- },
- "md5.js": {
- "version": "1.3.5",
- "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz",
- "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==",
- "dev": true,
- "requires": {
- "hash-base": "^3.0.0",
- "inherits": "^2.0.1",
- "safe-buffer": "^5.1.2"
- }
- },
- "mdPickers": {
- "version": "git://github.com/alenaksu/mdPickers.git#72592ae51c81a7260701055ea21870efa57fa7c8",
- "from": "git://github.com/alenaksu/mdPickers.git#0.7.5"
- },
- "mdast-util-compact": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/mdast-util-compact/-/mdast-util-compact-1.0.4.tgz",
- "integrity": "sha512-3YDMQHI5vRiS2uygEFYaqckibpJtKq5Sj2c8JioeOQBU6INpKbdWzfyLqFFnDwEcEnRFIdMsguzs5pC1Jp4Isg==",
- "dev": true,
- "requires": {
- "unist-util-visit": "^1.1.0"
- }
- },
- "media-typer": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
- "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=",
- "dev": true
- },
- "mem": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz",
- "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==",
- "dev": true,
- "requires": {
- "map-age-cleaner": "^0.1.1",
- "mimic-fn": "^2.0.0",
- "p-is-promise": "^2.0.0"
- },
- "dependencies": {
- "mimic-fn": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
- "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
- "dev": true
- }
- }
- },
- "memory-fs": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz",
- "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=",
- "dev": true,
- "requires": {
- "errno": "^0.1.3",
- "readable-stream": "^2.0.1"
- }
- },
- "meow": {
- "version": "3.7.0",
- "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz",
- "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=",
- "dev": true,
- "requires": {
- "camelcase-keys": "^2.0.0",
- "decamelize": "^1.1.2",
- "loud-rejection": "^1.0.0",
- "map-obj": "^1.0.1",
- "minimist": "^1.1.3",
- "normalize-package-data": "^2.3.4",
- "object-assign": "^4.0.1",
- "read-pkg-up": "^1.0.1",
- "redent": "^1.0.0",
- "trim-newlines": "^1.0.0"
- },
- "dependencies": {
- "find-up": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz",
- "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=",
- "dev": true,
- "requires": {
- "path-exists": "^2.0.0",
- "pinkie-promise": "^2.0.0"
- }
- },
- "load-json-file": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
- "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=",
- "dev": true,
- "requires": {
- "graceful-fs": "^4.1.2",
- "parse-json": "^2.2.0",
- "pify": "^2.0.0",
- "pinkie-promise": "^2.0.0",
- "strip-bom": "^2.0.0"
- }
- },
- "path-exists": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz",
- "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=",
- "dev": true,
- "requires": {
- "pinkie-promise": "^2.0.0"
- }
- },
- "path-type": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz",
- "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=",
- "dev": true,
- "requires": {
- "graceful-fs": "^4.1.2",
- "pify": "^2.0.0",
- "pinkie-promise": "^2.0.0"
- }
- },
- "pify": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
- "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
- "dev": true
- },
- "read-pkg": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz",
- "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=",
- "dev": true,
- "requires": {
- "load-json-file": "^1.0.0",
- "normalize-package-data": "^2.3.2",
- "path-type": "^1.0.0"
- }
- },
- "read-pkg-up": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz",
- "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=",
- "dev": true,
- "requires": {
- "find-up": "^1.0.0",
- "read-pkg": "^1.0.0"
- }
- },
- "strip-bom": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz",
- "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
- "dev": true,
- "requires": {
- "is-utf8": "^0.2.0"
- }
- }
- }
- },
- "merge-descriptors": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
- "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=",
- "dev": true
- },
- "merge2": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.3.0.tgz",
- "integrity": "sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw==",
- "dev": true
- },
- "messageformat": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/messageformat/-/messageformat-1.0.2.tgz",
- "integrity": "sha1-kI9GkfKf8o2uNcRUNqJM/5NAI4g=",
- "requires": {
- "glob": "~7.0.6",
- "make-plural": "~3.0.6",
- "messageformat-parser": "^1.0.0",
- "nopt": "~3.0.6",
- "reserved-words": "^0.1.1"
- }
- },
- "messageformat-parser": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/messageformat-parser/-/messageformat-parser-1.1.0.tgz",
- "integrity": "sha1-E7oiUKdrvejg/KDbs0dflcWUqQo="
- },
- "methods": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
- "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=",
- "dev": true
- },
- "micromatch": {
- "version": "3.1.10",
- "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
- "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
- "dev": true,
- "requires": {
- "arr-diff": "^4.0.0",
- "array-unique": "^0.3.2",
- "braces": "^2.3.1",
- "define-property": "^2.0.2",
- "extend-shallow": "^3.0.2",
- "extglob": "^2.0.4",
- "fragment-cache": "^0.2.1",
- "kind-of": "^6.0.2",
- "nanomatch": "^1.2.9",
- "object.pick": "^1.3.0",
- "regex-not": "^1.0.0",
- "snapdragon": "^0.8.1",
- "to-regex": "^3.0.2"
- }
- },
- "miller-rabin": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz",
- "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==",
- "dev": true,
- "requires": {
- "bn.js": "^4.0.0",
- "brorand": "^1.0.1"
- }
- },
- "mime": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
- "integrity": "sha1-Ms2eXGRVO9WNGaVor0Uqz/BJgbE=",
- "dev": true
- },
- "mime-db": {
- "version": "1.43.0",
- "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz",
- "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==",
- "dev": true
- },
- "mime-types": {
- "version": "2.1.26",
- "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz",
- "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==",
- "dev": true,
- "requires": {
- "mime-db": "1.43.0"
- }
- },
- "mimic-fn": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz",
- "integrity": "sha1-ggyGo5M0ZA6ZUWkovQP8qIBX0CI="
- },
- "min-document": {
- "version": "2.19.0",
- "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz",
- "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=",
- "dev": true,
- "requires": {
- "dom-walk": "^0.1.0"
- }
- },
- "min-indent": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.0.tgz",
- "integrity": "sha1-z8RcN+nsDY8KDsPdTvf3w6vjklY=",
- "dev": true
- },
- "mini-css-extract-plugin": {
- "version": "0.8.2",
- "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.8.2.tgz",
- "integrity": "sha512-a3Y4of27Wz+mqK3qrcd3VhYz6cU0iW5x3Sgvqzbj+XmlrSizmvu8QQMl5oMYJjgHOC4iyt+w7l4umP+dQeW3bw==",
- "dev": true,
- "requires": {
- "loader-utils": "^1.1.0",
- "normalize-url": "1.9.1",
- "schema-utils": "^1.0.0",
- "webpack-sources": "^1.1.0"
- },
- "dependencies": {
- "schema-utils": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz",
- "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==",
- "dev": true,
- "requires": {
- "ajv": "^6.1.0",
- "ajv-errors": "^1.0.0",
- "ajv-keywords": "^3.1.0"
- }
- }
- }
- },
- "minimalistic-assert": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
- "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==",
- "dev": true
- },
- "minimalistic-crypto-utils": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz",
- "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=",
- "dev": true
- },
- "minimatch": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
- "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=",
- "requires": {
- "brace-expansion": "^1.1.7"
- }
- },
- "minimist": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
- "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ="
- },
- "minimist-options": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.0.2.tgz",
- "integrity": "sha512-seq4hpWkYSUh1y7NXxzucwAN9yVlBc3Upgdjz8vLCP97jG8kaOmzYrVH/m7tQ1NYD1wdtZbSLfdy4zFmRWuc/w==",
- "dev": true,
- "requires": {
- "arrify": "^1.0.1",
- "is-plain-obj": "^1.1.0"
- }
- },
- "minipass": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.1.tgz",
- "integrity": "sha512-UFqVihv6PQgwj8/yTGvl9kPz7xIAY+R5z6XYjRInD3Gk3qx6QGSD6zEcpeG4Dy/lQnv1J6zv8ejV90hyYIKf3w==",
- "dev": true,
- "requires": {
- "yallist": "^4.0.0"
- },
- "dependencies": {
- "yallist": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
- "dev": true
- }
- }
- },
- "minipass-collect": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz",
- "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==",
- "dev": true,
- "requires": {
- "minipass": "^3.0.0"
- }
- },
- "minipass-flush": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz",
- "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==",
- "dev": true,
- "requires": {
- "minipass": "^3.0.0"
- }
- },
- "minipass-pipeline": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.2.tgz",
- "integrity": "sha512-3JS5A2DKhD2g0Gg8x3yamO0pj7YeKGwVlDS90pF++kxptwx/F+B//roxf9SqYil5tQo65bijy+dAuAFZmYOouA==",
- "dev": true,
- "requires": {
- "minipass": "^3.0.0"
- }
- },
- "mississippi": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz",
- "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==",
- "dev": true,
- "requires": {
- "concat-stream": "^1.5.0",
- "duplexify": "^3.4.2",
- "end-of-stream": "^1.1.0",
- "flush-write-stream": "^1.0.0",
- "from2": "^2.1.0",
- "parallel-transform": "^1.1.0",
- "pump": "^3.0.0",
- "pumpify": "^1.3.3",
- "stream-each": "^1.1.0",
- "through2": "^2.0.0"
- }
- },
- "mixin-deep": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz",
- "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==",
- "dev": true,
- "requires": {
- "for-in": "^1.0.2",
- "is-extendable": "^1.0.1"
- },
- "dependencies": {
- "is-extendable": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
- "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=",
- "dev": true,
- "requires": {
- "is-plain-object": "^2.0.4"
- }
- }
- }
- },
- "mkdirp": {
- "version": "0.5.1",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
- "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
- "requires": {
- "minimist": "0.0.8"
- },
- "dependencies": {
- "minimist": {
- "version": "0.0.8",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
- "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0="
- }
- }
- },
- "moment": {
- "version": "2.24.0",
- "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz",
- "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg=="
- },
- "move-concurrently": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz",
- "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=",
- "dev": true,
- "requires": {
- "aproba": "^1.1.1",
- "copy-concurrently": "^1.0.0",
- "fs-write-stream-atomic": "^1.0.8",
- "mkdirp": "^0.5.1",
- "rimraf": "^2.5.4",
- "run-queue": "^1.0.3"
- }
- },
- "ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
- "dev": true
- },
- "multicast-dns": {
- "version": "6.2.3",
- "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz",
- "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==",
- "dev": true,
- "requires": {
- "dns-packet": "^1.3.1",
- "thunky": "^1.0.2"
- }
- },
- "multicast-dns-service-types": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz",
- "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=",
- "dev": true
- },
- "mute-stream": {
- "version": "0.0.7",
- "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz",
- "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s="
- },
- "nan": {
- "version": "2.14.0",
- "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz",
- "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==",
- "dev": true
- },
- "nanomatch": {
- "version": "1.2.13",
- "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz",
- "integrity": "sha1-uHqKpPwN6P5r6IiVs4mD/yZb0Rk=",
- "dev": true,
- "requires": {
- "arr-diff": "^4.0.0",
- "array-unique": "^0.3.2",
- "define-property": "^2.0.2",
- "extend-shallow": "^3.0.2",
- "fragment-cache": "^0.2.1",
- "is-windows": "^1.0.2",
- "kind-of": "^6.0.2",
- "object.pick": "^1.3.0",
- "regex-not": "^1.0.0",
- "snapdragon": "^0.8.1",
- "to-regex": "^3.0.1"
- }
- },
- "natural-compare": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
- "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
- "dev": true
- },
- "negotiator": {
- "version": "0.6.2",
- "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz",
- "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==",
- "dev": true
- },
- "neo-async": {
- "version": "2.6.1",
- "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz",
- "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==",
- "dev": true
- },
- "ng-annotate": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/ng-annotate/-/ng-annotate-1.2.1.tgz",
- "integrity": "sha1-64vBpnMccNCK9rAsPq8abj+55rs=",
- "dev": true,
- "requires": {
- "acorn": "~2.6.4",
- "alter": "~0.2.0",
- "convert-source-map": "~1.1.2",
- "optimist": "~0.6.1",
- "ordered-ast-traverse": "~1.1.1",
- "simple-fmt": "~0.1.0",
- "simple-is": "~0.2.0",
- "source-map": "~0.5.3",
- "stable": "~0.1.5",
- "stringmap": "~0.2.2",
- "stringset": "~0.2.1",
- "tryor": "~0.1.2"
- },
- "dependencies": {
- "acorn": {
- "version": "2.6.4",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-2.6.4.tgz",
- "integrity": "sha1-6x9FtKQ/ox0DcBpexG87Umc+kO4=",
- "dev": true
- },
- "convert-source-map": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz",
- "integrity": "sha1-SCnId+n+SbMWHzvzZziI4gRpmGA=",
- "dev": true
- }
- }
- },
- "ng-annotate-loader": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/ng-annotate-loader/-/ng-annotate-loader-0.6.1.tgz",
- "integrity": "sha1-6be3oVYrnHlzfVCIbVWN5/DfQlc=",
- "dev": true,
- "requires": {
- "clone": "^2.1.1",
- "loader-utils": "1.1.0",
- "ng-annotate": "1.2.1",
- "normalize-path": "2.0.1",
- "source-map": "0.5.6"
- },
- "dependencies": {
- "big.js": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz",
- "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==",
- "dev": true
- },
- "clone": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
- "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=",
- "dev": true
- },
- "emojis-list": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz",
- "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=",
- "dev": true
- },
- "json5": {
- "version": "0.5.1",
- "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz",
- "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=",
- "dev": true
- },
- "loader-utils": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz",
- "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=",
- "dev": true,
- "requires": {
- "big.js": "^3.1.3",
- "emojis-list": "^2.0.0",
- "json5": "^0.5.0"
- }
- },
- "normalize-path": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.0.1.tgz",
- "integrity": "sha1-R4hqwWYnYNQmG32XnSQXCdPOP3o=",
- "dev": true
- },
- "source-map": {
- "version": "0.5.6",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz",
- "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=",
- "dev": true
- }
- }
- },
- "ng-annotate-patched": {
- "version": "1.11.1",
- "resolved": "https://registry.npmjs.org/ng-annotate-patched/-/ng-annotate-patched-1.11.1.tgz",
- "integrity": "sha512-DmReqLu/cAdnXt7d0NpLC1hEDUH2z1CGs5ymQCjHd5+eAvWfkTl0k17pdFc0/C/EZRx+oed+4DJ7TsRILQVLUQ==",
- "dev": true,
- "requires": {
- "acorn": "^7.0.0",
- "acorn-walk": "^7.0.0",
- "commander": "^3.0.1",
- "convert-source-map": "^1.1.2",
- "source-map": "^0.6.1"
- },
- "dependencies": {
- "commander": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/commander/-/commander-3.0.2.tgz",
- "integrity": "sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==",
- "dev": true
- },
- "source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
- "dev": true
- }
- }
- },
- "ngFlowchart": {
- "version": "git://github.com/thingsboard/ngFlowchart.git#1343a7478961f68280d81f0ecda4e722a2068e0f",
- "from": "git://github.com/thingsboard/ngFlowchart.git#master"
- },
- "ngclipboard": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/ngclipboard/-/ngclipboard-1.1.2.tgz",
- "integrity": "sha1-RZ8B8+4eisQBWZquo3uXdQh9WW0=",
- "requires": {
- "clipboard": "~1.5.5"
- },
- "dependencies": {
- "clipboard": {
- "version": "1.5.16",
- "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-1.5.16.tgz",
- "integrity": "sha1-kW1ec5sAZL5hsLSKU1cx7K7z02c=",
- "requires": {
- "good-listener": "^1.2.0",
- "select": "^1.0.6",
- "tiny-emitter": "^1.0.0"
- }
- },
- "tiny-emitter": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-1.2.0.tgz",
- "integrity": "sha1-bchFBSywjr78GHRyO1jySmSMO28="
- }
- }
- },
- "ngreact": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/ngreact/-/ngreact-0.3.0.tgz",
- "integrity": "sha1-g4u3Z5BGKb6ApduynAp76xKbRKA="
- },
- "ngtemplate-loader": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/ngtemplate-loader/-/ngtemplate-loader-2.0.1.tgz",
- "integrity": "sha1-nX7S6KI2NSOte2TXSqxALY2v8/M=",
- "dev": true,
- "requires": {
- "jsesc": "^0.5.0",
- "loader-utils": "^1.0.2"
- },
- "dependencies": {
- "jsesc": {
- "version": "0.5.0",
- "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
- "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=",
- "dev": true
- }
- }
- },
- "nice-try": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz",
- "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==",
- "dev": true
- },
- "no-case": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz",
- "integrity": "sha1-YLgTOWvjmz8SiKTB7V0efSi0ZKw=",
- "dev": true,
- "requires": {
- "lower-case": "^1.1.1"
- }
- },
- "node-environment-flags": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.6.tgz",
- "integrity": "sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw==",
- "dev": true,
- "requires": {
- "object.getownpropertydescriptors": "^2.0.3",
- "semver": "^5.7.0"
- }
- },
- "node-fetch": {
- "version": "1.7.3",
- "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz",
- "integrity": "sha1-mA9vcthSEaU0fGsrwYxbhMPrR+8=",
- "requires": {
- "encoding": "^0.1.11",
- "is-stream": "^1.0.1"
- }
- },
- "node-forge": {
- "version": "0.9.0",
- "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.9.0.tgz",
- "integrity": "sha512-7ASaDa3pD+lJ3WvXFsxekJQelBKRpne+GOVbLbtHYdd7pFspyeuJHnWfLplGf3SwKGbfs/aYl5V/JCIaHVUKKQ==",
- "dev": true
- },
- "node-gyp": {
- "version": "3.8.0",
- "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.8.0.tgz",
- "integrity": "sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==",
- "dev": true,
- "requires": {
- "fstream": "^1.0.0",
- "glob": "^7.0.3",
- "graceful-fs": "^4.1.2",
- "mkdirp": "^0.5.0",
- "nopt": "2 || 3",
- "npmlog": "0 || 1 || 2 || 3 || 4",
- "osenv": "0",
- "request": "^2.87.0",
- "rimraf": "2",
- "semver": "~5.3.0",
- "tar": "^2.0.0",
- "which": "1"
- },
- "dependencies": {
- "semver": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz",
- "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=",
- "dev": true
- }
- }
- },
- "node-libs-browser": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz",
- "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==",
- "dev": true,
- "requires": {
- "assert": "^1.1.1",
- "browserify-zlib": "^0.2.0",
- "buffer": "^4.3.0",
- "console-browserify": "^1.1.0",
- "constants-browserify": "^1.0.0",
- "crypto-browserify": "^3.11.0",
- "domain-browser": "^1.1.1",
- "events": "^3.0.0",
- "https-browserify": "^1.0.0",
- "os-browserify": "^0.3.0",
- "path-browserify": "0.0.1",
- "process": "^0.11.10",
- "punycode": "^1.2.4",
- "querystring-es3": "^0.2.0",
- "readable-stream": "^2.3.3",
- "stream-browserify": "^2.0.1",
- "stream-http": "^2.7.2",
- "string_decoder": "^1.0.0",
- "timers-browserify": "^2.0.4",
- "tty-browserify": "0.0.0",
- "url": "^0.11.0",
- "util": "^0.11.0",
- "vm-browserify": "^1.0.1"
- },
- "dependencies": {
- "punycode": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
- "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=",
- "dev": true
- }
- }
- },
- "node-modules-regexp": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz",
- "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=",
- "dev": true
- },
- "node-releases": {
- "version": "1.1.49",
- "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.49.tgz",
- "integrity": "sha512-xH8t0LS0disN0mtRCh+eByxFPie+msJUBL/lJDBuap53QGiYPa9joh83K4pCZgWJ+2L4b9h88vCVdXQ60NO2bg==",
- "dev": true,
- "requires": {
- "semver": "^6.3.0"
- },
- "dependencies": {
- "semver": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
- "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
- "dev": true
- }
- }
- },
- "node-sass": {
- "version": "4.13.1",
- "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.13.1.tgz",
- "integrity": "sha512-TTWFx+ZhyDx1Biiez2nB0L3YrCZ/8oHagaDalbuBSlqXgUPsdkUSzJsVxeDO9LtPB49+Fh3WQl3slABo6AotNw==",
- "dev": true,
- "requires": {
- "async-foreach": "^0.1.3",
- "chalk": "^1.1.1",
- "cross-spawn": "^3.0.0",
- "gaze": "^1.0.0",
- "get-stdin": "^4.0.1",
- "glob": "^7.0.3",
- "in-publish": "^2.0.0",
- "lodash": "^4.17.15",
- "meow": "^3.7.0",
- "mkdirp": "^0.5.1",
- "nan": "^2.13.2",
- "node-gyp": "^3.8.0",
- "npmlog": "^4.0.0",
- "request": "^2.88.0",
- "sass-graph": "^2.2.4",
- "stdout-stream": "^1.4.0",
- "true-case-path": "^1.0.2"
- },
- "dependencies": {
- "cross-spawn": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz",
- "integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=",
- "dev": true,
- "requires": {
- "lru-cache": "^4.0.1",
- "which": "^1.2.9"
- }
- }
- }
- },
- "nopt": {
- "version": "3.0.6",
- "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz",
- "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=",
- "requires": {
- "abbrev": "1"
- }
- },
- "normalize-package-data": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
- "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
- "dev": true,
- "requires": {
- "hosted-git-info": "^2.1.4",
- "resolve": "^1.10.0",
- "semver": "2 || 3 || 4 || 5",
- "validate-npm-package-license": "^3.0.1"
- }
- },
- "normalize-path": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
- "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
- "dev": true
- },
- "normalize-range": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz",
- "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=",
- "dev": true
- },
- "normalize-selector": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/normalize-selector/-/normalize-selector-0.2.0.tgz",
- "integrity": "sha1-0LFF62kRicY6eNIB3E/bEpPvDAM=",
- "dev": true
- },
- "normalize-url": {
- "version": "1.9.1",
- "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz",
- "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=",
- "dev": true,
- "requires": {
- "object-assign": "^4.0.1",
- "prepend-http": "^1.0.0",
- "query-string": "^4.1.0",
- "sort-keys": "^1.0.0"
- }
- },
- "npm-run-path": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
- "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=",
- "dev": true,
- "requires": {
- "path-key": "^2.0.0"
- }
- },
- "npmlog": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz",
- "integrity": "sha1-CKfyqL9zRgR3mp76StXMcXq7lUs=",
- "dev": true,
- "requires": {
- "are-we-there-yet": "~1.1.2",
- "console-control-strings": "~1.1.0",
- "gauge": "~2.7.3",
- "set-blocking": "~2.0.0"
- }
- },
- "nth-check": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz",
- "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==",
- "dev": true,
- "requires": {
- "boolbase": "~1.0.0"
- }
- },
- "num2fraction": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz",
- "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=",
- "dev": true
- },
- "number-is-nan": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
- "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
- "dev": true
- },
- "oauth-sign": {
- "version": "0.9.0",
- "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
- "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==",
- "dev": true
- },
- "object-assign": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
- "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
- },
- "object-copy": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
- "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
- "dev": true,
- "requires": {
- "copy-descriptor": "^0.1.0",
- "define-property": "^0.2.5",
- "kind-of": "^3.0.3"
- },
- "dependencies": {
- "define-property": {
- "version": "0.2.5",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
- "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
- "dev": true,
- "requires": {
- "is-descriptor": "^0.1.0"
- }
- },
- "kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "dev": true,
- "requires": {
- "is-buffer": "^1.1.5"
- }
- }
- }
- },
- "object-hash": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-1.3.1.tgz",
- "integrity": "sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA==",
- "dev": true
- },
- "object-inspect": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz",
- "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==",
- "dev": true
- },
- "object-is": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.0.2.tgz",
- "integrity": "sha512-Epah+btZd5wrrfjkJZq1AOB9O6OxUQto45hzFd7lXGrpHPGE0W1k+426yrZV+k6NJOzLNNW/nVsmZdIWsAqoOQ==",
- "dev": true
- },
- "object-keys": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
- "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
- "dev": true
- },
- "object-visit": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
- "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
- "dev": true,
- "requires": {
- "isobject": "^3.0.0"
- }
- },
- "object.assign": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz",
- "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==",
- "dev": true,
- "requires": {
- "define-properties": "^1.1.2",
- "function-bind": "^1.1.1",
- "has-symbols": "^1.0.0",
- "object-keys": "^1.0.11"
- }
- },
- "object.getownpropertydescriptors": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz",
- "integrity": "sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==",
- "dev": true,
- "requires": {
- "define-properties": "^1.1.3",
- "es-abstract": "^1.17.0-next.1"
- }
- },
- "object.pick": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
- "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
- "dev": true,
- "requires": {
- "isobject": "^3.0.1"
- }
- },
- "object.values": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz",
- "integrity": "sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==",
- "dev": true,
- "requires": {
- "define-properties": "^1.1.3",
- "es-abstract": "^1.17.0-next.1",
- "function-bind": "^1.1.1",
- "has": "^1.0.3"
- }
- },
- "objectpath": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/objectpath/-/objectpath-1.2.2.tgz",
- "integrity": "sha512-ie+GY5tJsKt7daHH6qGROf3JqxfD2XhfBPLY+HQrVuRY8MQE1ySKVSqQ/TQz/Dx7jDwuy3etQALDE1cRJAC0cg=="
- },
- "obuf": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz",
- "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==",
- "dev": true
- },
- "oclazyload": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/oclazyload/-/oclazyload-1.1.0.tgz",
- "integrity": "sha1-qYBzIvGQggqBwCLy7xcB0DbYPoc="
- },
- "on-finished": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
- "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
- "dev": true,
- "requires": {
- "ee-first": "1.1.1"
- }
- },
- "on-headers": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz",
- "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==",
- "dev": true
- },
- "once": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
- "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
- "requires": {
- "wrappy": "1"
- }
- },
- "onetime": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz",
- "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=",
- "requires": {
- "mimic-fn": "^1.0.0"
- }
- },
- "opencollective": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/opencollective/-/opencollective-1.0.3.tgz",
- "integrity": "sha1-ruY3K8KBRFg2kMPKja7PwSDdDvE=",
- "requires": {
- "babel-polyfill": "6.23.0",
- "chalk": "1.1.3",
- "inquirer": "3.0.6",
- "minimist": "1.2.0",
- "node-fetch": "1.6.3",
- "opn": "4.0.2"
- },
- "dependencies": {
- "node-fetch": {
- "version": "1.6.3",
- "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.6.3.tgz",
- "integrity": "sha1-3CNO3WSJmC1Y6PDbT2lQKavNjAQ=",
- "requires": {
- "encoding": "^0.1.11",
- "is-stream": "^1.0.1"
- }
- }
- }
- },
- "opn": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/opn/-/opn-4.0.2.tgz",
- "integrity": "sha1-erwi5kTf9jsKltWrfyeQwPAavJU=",
- "requires": {
- "object-assign": "^4.0.1",
- "pinkie-promise": "^2.0.0"
- }
- },
- "optimist": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz",
- "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=",
- "dev": true,
- "requires": {
- "minimist": "~0.0.1",
- "wordwrap": "~0.0.2"
- },
- "dependencies": {
- "minimist": {
- "version": "0.0.10",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz",
- "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=",
- "dev": true
- }
- }
- },
- "optionator": {
- "version": "0.8.3",
- "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz",
- "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==",
- "dev": true,
- "requires": {
- "deep-is": "~0.1.3",
- "fast-levenshtein": "~2.0.6",
- "levn": "~0.3.0",
- "prelude-ls": "~1.1.2",
- "type-check": "~0.3.2",
- "word-wrap": "~1.2.3"
- }
- },
- "options": {
- "version": "0.0.6",
- "resolved": "https://registry.npmjs.org/options/-/options-0.0.6.tgz",
- "integrity": "sha1-7CLTEoBrtT5zF3Pnza788cZDEo8="
- },
- "ordered-ast-traverse": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/ordered-ast-traverse/-/ordered-ast-traverse-1.1.1.tgz",
- "integrity": "sha1-aEOhcLwO7otSDMjdwd3TqjD6BXw=",
- "dev": true,
- "requires": {
- "ordered-esprima-props": "~1.1.0"
- }
- },
- "ordered-esprima-props": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/ordered-esprima-props/-/ordered-esprima-props-1.1.0.tgz",
- "integrity": "sha1-qYJwht9fAQqmDpvQK24DNc6i/8s=",
- "dev": true
- },
- "original": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz",
- "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==",
- "dev": true,
- "requires": {
- "url-parse": "^1.4.3"
- }
- },
- "os-browserify": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz",
- "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=",
- "dev": true
- },
- "os-homedir": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
- "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M="
- },
- "os-locale": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz",
- "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=",
- "dev": true,
- "requires": {
- "lcid": "^1.0.0"
- }
- },
- "os-tmpdir": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
- "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ="
- },
- "osenv": {
- "version": "0.1.5",
- "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz",
- "integrity": "sha1-hc36+uso6Gd/QW4odZK18/SepBA=",
- "requires": {
- "os-homedir": "^1.0.0",
- "os-tmpdir": "^1.0.0"
- }
- },
- "p-defer": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz",
- "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=",
- "dev": true
- },
- "p-finally": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
- "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=",
- "dev": true
- },
- "p-is-promise": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz",
- "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==",
- "dev": true
- },
- "p-limit": {
- "version": "2.2.2",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz",
- "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==",
- "dev": true,
- "requires": {
- "p-try": "^2.0.0"
- }
- },
- "p-locate": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
- "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
- "dev": true,
- "requires": {
- "p-limit": "^2.0.0"
- }
- },
- "p-map": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz",
- "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==",
- "dev": true,
- "requires": {
- "aggregate-error": "^3.0.0"
- }
- },
- "p-pipe": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/p-pipe/-/p-pipe-1.2.0.tgz",
- "integrity": "sha1-SxoROZoRUgpneQ7loMHViB1r7+k=",
- "dev": true
- },
- "p-retry": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz",
- "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==",
- "dev": true,
- "requires": {
- "retry": "^0.12.0"
- }
- },
- "p-try": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
- "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
- "dev": true
- },
- "pako": {
- "version": "1.0.11",
- "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz",
- "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw=="
- },
- "parallel-transform": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz",
- "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==",
- "dev": true,
- "requires": {
- "cyclist": "^1.0.1",
- "inherits": "^2.0.3",
- "readable-stream": "^2.1.5"
- }
- },
- "param-case": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz",
- "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=",
- "dev": true,
- "requires": {
- "no-case": "^2.2.0"
- }
- },
- "parent-module": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
- "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
- "dev": true,
- "requires": {
- "callsites": "^3.0.0"
- }
- },
- "parse-asn1": {
- "version": "5.1.5",
- "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.5.tgz",
- "integrity": "sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==",
- "dev": true,
- "requires": {
- "asn1.js": "^4.0.0",
- "browserify-aes": "^1.0.0",
- "create-hash": "^1.1.0",
- "evp_bytestokey": "^1.0.0",
- "pbkdf2": "^3.0.3",
- "safe-buffer": "^5.1.1"
- }
- },
- "parse-entities": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-1.2.2.tgz",
- "integrity": "sha512-NzfpbxW/NPrzZ/yYSoQxyqUZMZXIdCfE0OIN4ESsnptHJECoUk3FZktxNuzQf4tjt5UEopnxpYJbvYuxIFDdsg==",
- "dev": true,
- "requires": {
- "character-entities": "^1.0.0",
- "character-entities-legacy": "^1.0.0",
- "character-reference-invalid": "^1.0.0",
- "is-alphanumerical": "^1.0.0",
- "is-decimal": "^1.0.0",
- "is-hexadecimal": "^1.0.0"
- }
- },
- "parse-json": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
- "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
- "dev": true,
- "requires": {
- "error-ex": "^1.2.0"
- }
- },
- "parse-passwd": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz",
- "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=",
- "dev": true
- },
- "parseurl": {
- "version": "1.3.3",
- "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
- "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
- "dev": true
- },
- "pascalcase": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
- "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=",
- "dev": true
- },
- "path-browserify": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz",
- "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==",
- "dev": true
- },
- "path-dirname": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz",
- "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=",
- "dev": true
- },
- "path-exists": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
- "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
- "dev": true
- },
- "path-is-absolute": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
- "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
- },
- "path-is-inside": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz",
- "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=",
- "dev": true
- },
- "path-key": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
- "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=",
- "dev": true
- },
- "path-parse": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
- "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
- "dev": true
- },
- "path-to-regexp": {
- "version": "0.1.7",
- "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
- "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=",
- "dev": true
- },
- "path-type": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz",
- "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==",
- "dev": true,
- "requires": {
- "pify": "^3.0.0"
- },
- "dependencies": {
- "pify": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
- "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
- "dev": true
- }
- }
- },
- "pbkdf2": {
- "version": "3.0.17",
- "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz",
- "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==",
- "dev": true,
- "requires": {
- "create-hash": "^1.1.2",
- "create-hmac": "^1.1.4",
- "ripemd160": "^2.0.1",
- "safe-buffer": "^5.0.1",
- "sha.js": "^2.4.8"
- }
- },
- "performance-now": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
- "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns="
- },
- "picomatch": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.1.tgz",
- "integrity": "sha512-ISBaA8xQNmwELC7eOjqFKMESB2VIqt4PPDD0nsS95b/9dZXvVKOlz9keMSnoGGKcOHXfTvDD6WMaRoSc9UuhRA==",
- "dev": true
- },
- "pify": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
- "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
- "dev": true
- },
- "pinkie": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
- "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA="
- },
- "pinkie-promise": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
- "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
- "requires": {
- "pinkie": "^2.0.0"
- }
- },
- "pirates": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz",
- "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==",
- "dev": true,
- "requires": {
- "node-modules-regexp": "^1.0.0"
- }
- },
- "pkg-dir": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz",
- "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==",
- "dev": true,
- "requires": {
- "find-up": "^3.0.0"
- }
- },
- "portfinder": {
- "version": "1.0.25",
- "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.25.tgz",
- "integrity": "sha512-6ElJnHBbxVA1XSLgBp7G1FiCkQdlqGzuF7DswL5tcea+E8UpuvPU7beVAjjRwCioTS9ZluNbu+ZyRvgTsmqEBg==",
- "dev": true,
- "requires": {
- "async": "^2.6.2",
- "debug": "^3.1.1",
- "mkdirp": "^0.5.1"
- },
- "dependencies": {
- "async": {
- "version": "2.6.3",
- "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz",
- "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==",
- "dev": true,
- "requires": {
- "lodash": "^4.17.14"
- }
- },
- "debug": {
- "version": "3.2.6",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
- "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
- "dev": true,
- "requires": {
- "ms": "^2.1.1"
- }
- },
- "ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
- "dev": true
- }
- }
- },
- "posix-character-classes": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
- "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=",
- "dev": true
- },
- "postcss": {
- "version": "7.0.27",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz",
- "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==",
- "dev": true,
- "requires": {
- "chalk": "^2.4.2",
- "source-map": "^0.6.1",
- "supports-color": "^6.1.0"
- },
- "dependencies": {
- "ansi-styles": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
- "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
- "dev": true,
- "requires": {
- "color-convert": "^1.9.0"
- }
- },
- "chalk": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
- "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
- "dev": true,
- "requires": {
- "ansi-styles": "^3.2.1",
- "escape-string-regexp": "^1.0.5",
- "supports-color": "^5.3.0"
- },
- "dependencies": {
- "supports-color": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
- "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
- "dev": true,
- "requires": {
- "has-flag": "^3.0.0"
- }
- }
- }
- },
- "source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
- "dev": true
- },
- "supports-color": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
- "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
- "dev": true,
- "requires": {
- "has-flag": "^3.0.0"
- }
- }
- }
- },
- "postcss-html": {
- "version": "0.36.0",
- "resolved": "https://registry.npmjs.org/postcss-html/-/postcss-html-0.36.0.tgz",
- "integrity": "sha512-HeiOxGcuwID0AFsNAL0ox3mW6MHH5cstWN1Z3Y+n6H+g12ih7LHdYxWwEA/QmrebctLjo79xz9ouK3MroHwOJw==",
- "dev": true,
- "requires": {
- "htmlparser2": "^3.10.0"
- }
- },
- "postcss-jsx": {
- "version": "0.36.4",
- "resolved": "https://registry.npmjs.org/postcss-jsx/-/postcss-jsx-0.36.4.tgz",
- "integrity": "sha512-jwO/7qWUvYuWYnpOb0+4bIIgJt7003pgU3P6nETBLaOyBXuTD55ho21xnals5nBrlpTIFodyd3/jBi6UO3dHvA==",
- "dev": true,
- "requires": {
- "@babel/core": ">=7.2.2"
- }
- },
- "postcss-less": {
- "version": "3.1.4",
- "resolved": "https://registry.npmjs.org/postcss-less/-/postcss-less-3.1.4.tgz",
- "integrity": "sha512-7TvleQWNM2QLcHqvudt3VYjULVB49uiW6XzEUFmvwHzvsOEF5MwBrIXZDJQvJNFGjJQTzSzZnDoCJ8h/ljyGXA==",
- "dev": true,
- "requires": {
- "postcss": "^7.0.14"
- }
- },
- "postcss-load-config": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.0.tgz",
- "integrity": "sha512-4pV3JJVPLd5+RueiVVB+gFOAa7GWc25XQcMp86Zexzke69mKf6Nx9LRcQywdz7yZI9n1udOxmLuAwTBypypF8Q==",
- "dev": true,
- "requires": {
- "cosmiconfig": "^5.0.0",
- "import-cwd": "^2.0.0"
- }
- },
- "postcss-loader": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-3.0.0.tgz",
- "integrity": "sha1-a5eUPkfHLYRfqeA/Jzdz1OjdbC0=",
- "dev": true,
- "requires": {
- "loader-utils": "^1.1.0",
- "postcss": "^7.0.0",
- "postcss-load-config": "^2.0.0",
- "schema-utils": "^1.0.0"
- },
- "dependencies": {
- "schema-utils": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz",
- "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==",
- "dev": true,
- "requires": {
- "ajv": "^6.1.0",
- "ajv-errors": "^1.0.0",
- "ajv-keywords": "^3.1.0"
- }
- }
- }
- },
- "postcss-markdown": {
- "version": "0.36.0",
- "resolved": "https://registry.npmjs.org/postcss-markdown/-/postcss-markdown-0.36.0.tgz",
- "integrity": "sha512-rl7fs1r/LNSB2bWRhyZ+lM/0bwKv9fhl38/06gF6mKMo/NPnp55+K1dSTosSVjFZc0e1ppBlu+WT91ba0PMBfQ==",
- "dev": true,
- "requires": {
- "remark": "^10.0.1",
- "unist-util-find-all-after": "^1.0.2"
- }
- },
- "postcss-media-query-parser": {
- "version": "0.2.3",
- "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz",
- "integrity": "sha1-J7Ocb02U+Bsac7j3Y1HGCeXO8kQ=",
- "dev": true
- },
- "postcss-modules-extract-imports": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz",
- "integrity": "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==",
- "dev": true,
- "requires": {
- "postcss": "^7.0.5"
- }
- },
- "postcss-modules-local-by-default": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.2.tgz",
- "integrity": "sha512-jM/V8eqM4oJ/22j0gx4jrp63GSvDH6v86OqyTHHUvk4/k1vceipZsaymiZ5PvocqZOl5SFHiFJqjs3la0wnfIQ==",
- "dev": true,
- "requires": {
- "icss-utils": "^4.1.1",
- "postcss": "^7.0.16",
- "postcss-selector-parser": "^6.0.2",
- "postcss-value-parser": "^4.0.0"
- }
- },
- "postcss-modules-scope": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.1.1.tgz",
- "integrity": "sha512-OXRUPecnHCg8b9xWvldG/jUpRIGPNRka0r4D4j0ESUU2/5IOnpsjfPPmDprM3Ih8CgZ8FXjWqaniK5v4rWt3oQ==",
- "dev": true,
- "requires": {
- "postcss": "^7.0.6",
- "postcss-selector-parser": "^6.0.0"
- }
- },
- "postcss-modules-values": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz",
- "integrity": "sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg==",
- "dev": true,
- "requires": {
- "icss-utils": "^4.0.0",
- "postcss": "^7.0.6"
- }
- },
- "postcss-reporter": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/postcss-reporter/-/postcss-reporter-6.0.1.tgz",
- "integrity": "sha512-LpmQjfRWyabc+fRygxZjpRxfhRf9u/fdlKf4VHG4TSPbV2XNsuISzYW1KL+1aQzx53CAppa1bKG4APIB/DOXXw==",
- "dev": true,
- "requires": {
- "chalk": "^2.4.1",
- "lodash": "^4.17.11",
- "log-symbols": "^2.2.0",
- "postcss": "^7.0.7"
- },
- "dependencies": {
- "ansi-styles": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
- "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
- "dev": true,
- "requires": {
- "color-convert": "^1.9.0"
- }
- },
- "chalk": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
- "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
- "dev": true,
- "requires": {
- "ansi-styles": "^3.2.1",
- "escape-string-regexp": "^1.0.5",
- "supports-color": "^5.3.0"
- }
- },
- "log-symbols": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz",
- "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==",
- "dev": true,
- "requires": {
- "chalk": "^2.0.1"
- }
- },
- "supports-color": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
- "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
- "dev": true,
- "requires": {
- "has-flag": "^3.0.0"
- }
- }
- }
- },
- "postcss-resolve-nested-selector": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz",
- "integrity": "sha1-Kcy8fDfe36wwTp//C/FZaz9qDk4=",
- "dev": true
- },
- "postcss-safe-parser": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-4.0.2.tgz",
- "integrity": "sha512-Uw6ekxSWNLCPesSv/cmqf2bY/77z11O7jZGPax3ycZMFU/oi2DMH9i89AdHc1tRwFg/arFoEwX0IS3LCUxJh1g==",
- "dev": true,
- "requires": {
- "postcss": "^7.0.26"
- }
- },
- "postcss-sass": {
- "version": "0.4.2",
- "resolved": "https://registry.npmjs.org/postcss-sass/-/postcss-sass-0.4.2.tgz",
- "integrity": "sha512-hcRgnd91OQ6Ot9R90PE/khUDCJHG8Uxxd3F7Y0+9VHjBiJgNv7sK5FxyHMCBtoLmmkzVbSj3M3OlqUfLJpq0CQ==",
- "dev": true,
- "requires": {
- "gonzales-pe": "^4.2.4",
- "postcss": "^7.0.21"
- }
- },
- "postcss-scss": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-2.0.0.tgz",
- "integrity": "sha512-um9zdGKaDZirMm+kZFKKVsnKPF7zF7qBAtIfTSnZXD1jZ0JNZIxdB6TxQOjCnlSzLRInVl2v3YdBh/M881C4ug==",
- "dev": true,
- "requires": {
- "postcss": "^7.0.0"
- }
- },
- "postcss-selector-parser": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz",
- "integrity": "sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg==",
- "dev": true,
- "requires": {
- "cssesc": "^3.0.0",
- "indexes-of": "^1.0.1",
- "uniq": "^1.0.1"
- }
- },
- "postcss-sorting": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/postcss-sorting/-/postcss-sorting-5.0.1.tgz",
- "integrity": "sha512-Y9fUFkIhfrm6i0Ta3n+89j56EFqaNRdUKqXyRp6kvTcSXnmgEjaVowCXH+JBe9+YKWqd4nc28r2sgwnzJalccA==",
- "dev": true,
- "requires": {
- "lodash": "^4.17.14",
- "postcss": "^7.0.17"
- }
- },
- "postcss-syntax": {
- "version": "0.36.2",
- "resolved": "https://registry.npmjs.org/postcss-syntax/-/postcss-syntax-0.36.2.tgz",
- "integrity": "sha512-nBRg/i7E3SOHWxF3PpF5WnJM/jQ1YpY9000OaVXlAQj6Zp/kIqJxEDWIZ67tAd7NLuk7zqN4yqe9nc0oNAOs1w==",
- "dev": true
- },
- "postcss-value-parser": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.0.3.tgz",
- "integrity": "sha512-N7h4pG+Nnu5BEIzyeaaIYWs0LI5XC40OrRh5L60z0QjFsqGWcHcbkBvpe1WYpcIS9yQ8sOi/vIPt1ejQCrMVrg==",
- "dev": true
- },
- "prelude-ls": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
- "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
- "dev": true
- },
- "prepend-http": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz",
- "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=",
- "dev": true
- },
- "pretty-error": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.1.tgz",
- "integrity": "sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM=",
- "dev": true,
- "requires": {
- "renderkid": "^2.0.1",
- "utila": "~0.4"
- }
- },
- "prismjs": {
- "version": "1.19.0",
- "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.19.0.tgz",
- "integrity": "sha512-IVFtbW9mCWm9eOIaEkNyo2Vl4NnEifis2GQ7/MLRG5TQe6t+4Sj9J5QWI9i3v+SS43uZBlCAOn+zYTVYQcPXJw==",
- "requires": {
- "clipboard": "^2.0.0"
- },
- "dependencies": {
- "clipboard": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-2.0.4.tgz",
- "integrity": "sha512-Vw26VSLRpJfBofiVaFb/I8PVfdI1OxKcYShe6fm0sP/DtmiWQNCjhM/okTvdCo0G+lMMm1rMYbk4IK4x1X+kgQ==",
- "optional": true,
- "requires": {
- "good-listener": "^1.2.2",
- "select": "^1.1.2",
- "tiny-emitter": "^2.0.0"
- }
- }
- }
- },
- "private": {
- "version": "0.1.8",
- "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz",
- "integrity": "sha1-I4Hts2ifelPWUxkAYPz4ItLzaP8=",
- "dev": true
- },
- "process": {
- "version": "0.11.10",
- "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
- "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=",
- "dev": true
- },
- "process-nextick-args": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
- "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
- },
- "progress": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
- "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
- "dev": true
- },
- "promise": {
- "version": "7.3.1",
- "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz",
- "integrity": "sha1-BktyYCsY+Q8pGSuLG8QY/9Hr078=",
- "requires": {
- "asap": "~2.0.3"
- }
- },
- "promise-inflight": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz",
- "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=",
- "dev": true
- },
- "prop-types": {
- "version": "15.7.2",
- "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz",
- "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==",
- "requires": {
- "loose-envify": "^1.4.0",
- "object-assign": "^4.1.1",
- "react-is": "^16.8.1"
- }
- },
- "proto-list": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz",
- "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk="
- },
- "proxy-addr": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz",
- "integrity": "sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ==",
- "dev": true,
- "requires": {
- "forwarded": "~0.1.2",
- "ipaddr.js": "1.9.0"
- }
- },
- "prr": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz",
- "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=",
- "dev": true
- },
- "pseudomap": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
- "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM="
- },
- "psl": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/psl/-/psl-1.7.0.tgz",
- "integrity": "sha512-5NsSEDv8zY70ScRnOTn7bK7eanl2MvFrOrS/R6x+dBt5g1ghnj9Zv90kO8GwT8gxcu2ANyFprnFYB85IogIJOQ==",
- "dev": true
- },
- "public-encrypt": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz",
- "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==",
- "dev": true,
- "requires": {
- "bn.js": "^4.1.0",
- "browserify-rsa": "^4.0.0",
- "create-hash": "^1.1.0",
- "parse-asn1": "^5.0.0",
- "randombytes": "^2.0.1",
- "safe-buffer": "^5.1.2"
- }
- },
- "pump": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
- "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
- "dev": true,
- "requires": {
- "end-of-stream": "^1.1.0",
- "once": "^1.3.1"
- }
- },
- "pumpify": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz",
- "integrity": "sha1-NlE74karJ1cLGjdKXOJ4v9dDcM4=",
- "dev": true,
- "requires": {
- "duplexify": "^3.6.0",
- "inherits": "^2.0.3",
- "pump": "^2.0.0"
- },
- "dependencies": {
- "pump": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz",
- "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==",
- "dev": true,
- "requires": {
- "end-of-stream": "^1.1.0",
- "once": "^1.3.1"
- }
- }
- }
- },
- "punycode": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
- "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
- "dev": true
- },
- "qs": {
- "version": "6.5.2",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
- "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==",
- "dev": true
- },
- "query-string": {
- "version": "4.3.4",
- "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz",
- "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=",
- "dev": true,
- "requires": {
- "object-assign": "^4.1.0",
- "strict-uri-encode": "^1.0.0"
- }
- },
- "querystring": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz",
- "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=",
- "dev": true
- },
- "querystring-es3": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz",
- "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=",
- "dev": true
- },
- "querystringify": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.1.tgz",
- "integrity": "sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA==",
- "dev": true
- },
- "quick-lru": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz",
- "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==",
- "dev": true
- },
- "raf": {
- "version": "3.4.1",
- "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz",
- "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==",
- "requires": {
- "performance-now": "^2.1.0"
- }
- },
- "randombytes": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
- "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
- "dev": true,
- "requires": {
- "safe-buffer": "^5.1.0"
- }
- },
- "randomfill": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz",
- "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==",
- "dev": true,
- "requires": {
- "randombytes": "^2.0.5",
- "safe-buffer": "^5.1.0"
- }
- },
- "range-parser": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
- "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
- "dev": true
- },
- "raphael": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/raphael/-/raphael-2.3.0.tgz",
- "integrity": "sha512-w2yIenZAQnp257XUWGni4bLMVxpUpcIl7qgxEgDIXtmSypYtlNxfXWpOBxs7LBTps5sDwhRnrToJrMUrivqNTQ==",
- "requires": {
- "eve-raphael": "0.5.0"
- }
- },
- "raw-body": {
- "version": "2.4.0",
- "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz",
- "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==",
- "dev": true,
- "requires": {
- "bytes": "3.1.0",
- "http-errors": "1.7.2",
- "iconv-lite": "0.4.24",
- "unpipe": "1.0.0"
- },
- "dependencies": {
- "bytes": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
- "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==",
- "dev": true
- }
- }
- },
- "raw-loader": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-3.1.0.tgz",
- "integrity": "sha512-lzUVMuJ06HF4rYveaz9Tv0WRlUMxJ0Y1hgSkkgg+50iEdaI0TthyEDe08KIHb0XsF6rn8WYTqPCaGTZg3sX+qA==",
- "dev": true,
- "requires": {
- "loader-utils": "^1.1.0",
- "schema-utils": "^2.0.1"
- }
- },
- "rc-align": {
- "version": "2.4.5",
- "resolved": "https://registry.npmjs.org/rc-align/-/rc-align-2.4.5.tgz",
- "integrity": "sha512-nv9wYUYdfyfK+qskThf4BQUSIadeI/dCsfaMZfNEoxm9HwOIioQ+LyqmMK6jWHAZQgOzMLaqawhuBXlF63vgjw==",
- "requires": {
- "babel-runtime": "^6.26.0",
- "dom-align": "^1.7.0",
- "prop-types": "^15.5.8",
- "rc-util": "^4.0.4"
- }
- },
- "rc-animate": {
- "version": "2.10.2",
- "resolved": "https://registry.npmjs.org/rc-animate/-/rc-animate-2.10.2.tgz",
- "integrity": "sha512-cE/A7piAzoWFSgUD69NmmMraqCeqVBa51UErod8NS3LUEqWfppSVagHfa0qHAlwPVPiIBg3emRONyny3eiH0Dg==",
- "requires": {
- "babel-runtime": "6.x",
- "classnames": "^2.2.6",
- "css-animation": "^1.3.2",
- "prop-types": "15.x",
- "raf": "^3.4.0",
- "rc-util": "^4.15.3",
- "react-lifecycles-compat": "^3.0.4"
- }
- },
- "rc-menu": {
- "version": "5.1.4",
- "resolved": "https://registry.npmjs.org/rc-menu/-/rc-menu-5.1.4.tgz",
- "integrity": "sha1-5d8I/ouDPoFGkTX/E7MKuPIf88Y=",
- "requires": {
- "babel-runtime": "6.x",
- "classnames": "2.x",
- "create-react-class": "^15.5.2",
- "dom-scroll-into-view": "1.x",
- "prop-types": "^15.5.6",
- "rc-animate": "2.x",
- "rc-util": "^4.0.2"
- }
- },
- "rc-select": {
- "version": "6.9.8",
- "resolved": "https://registry.npmjs.org/rc-select/-/rc-select-6.9.8.tgz",
- "integrity": "sha512-PO665G7iD0+CWTXQBd+wsVrDd/Y4FRrjppOYbc0R5O/di92Aj8NItVFYFtBN4olqvdUh5yXDkvf2TW0QAPQJvQ==",
- "requires": {
- "babel-runtime": "^6.23.0",
- "classnames": "2.x",
- "component-classes": "1.x",
- "dom-scroll-into-view": "1.x",
- "prop-types": "^15.5.8",
- "rc-animate": "2.x",
- "rc-menu": "^5.0.11",
- "rc-trigger": "1.x",
- "rc-util": "^4.0.4",
- "warning": "^3.0.0"
- }
- },
- "rc-trigger": {
- "version": "1.11.5",
- "resolved": "https://registry.npmjs.org/rc-trigger/-/rc-trigger-1.11.5.tgz",
- "integrity": "sha1-+I+fhODnn44O8cjRv4rCIItxViA=",
- "requires": {
- "babel-runtime": "6.x",
- "create-react-class": "15.x",
- "prop-types": "15.x",
- "rc-align": "2.x",
- "rc-animate": "2.x",
- "rc-util": "4.x"
- }
- },
- "rc-util": {
- "version": "4.19.0",
- "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-4.19.0.tgz",
- "integrity": "sha512-mptALlLwpeczS3nrv83DbwJNeupolbuvlIEjcvimSiWI8NUBjpF0HgG3kWp1RymiuiRCNm9yhaXqDz0a99dpgQ==",
- "requires": {
- "add-dom-event-listener": "^1.1.0",
- "babel-runtime": "6.x",
- "prop-types": "^15.5.10",
- "react-lifecycles-compat": "^3.0.4",
- "shallowequal": "^1.1.0"
- }
- },
- "react": {
- "version": "15.6.2",
- "resolved": "https://registry.npmjs.org/react/-/react-15.6.2.tgz",
- "integrity": "sha1-26BDSrQ5z+gvEI8PURZjkIF5qnI=",
- "requires": {
- "create-react-class": "^15.6.0",
- "fbjs": "^0.8.9",
- "loose-envify": "^1.1.0",
- "object-assign": "^4.1.0",
- "prop-types": "^15.5.10"
- }
- },
- "react-ace": {
- "version": "4.4.0",
- "resolved": "https://registry.npmjs.org/react-ace/-/react-ace-4.4.0.tgz",
- "integrity": "sha1-be42amljyzOur8ndPCWaJGAXSSY=",
- "requires": {
- "brace": "^0.10.0",
- "lodash.isequal": "^4.1.1",
- "opencollective": "^1.0.3",
- "prop-types": "^15.5.8"
- }
- },
- "react-addons-create-fragment": {
- "version": "15.6.2",
- "resolved": "https://registry.npmjs.org/react-addons-create-fragment/-/react-addons-create-fragment-15.6.2.tgz",
- "integrity": "sha1-o5TefCx77Na1R1uhuXrEcs58dPg=",
- "requires": {
- "fbjs": "^0.8.4",
- "loose-envify": "^1.3.1",
- "object-assign": "^4.1.0"
- }
- },
- "react-addons-transition-group": {
- "version": "15.6.2",
- "resolved": "https://registry.npmjs.org/react-addons-transition-group/-/react-addons-transition-group-15.6.2.tgz",
- "integrity": "sha1-i668Kukczb8kX+Kcn9PTb4tHGSM=",
- "requires": {
- "react-transition-group": "^1.2.0"
- }
- },
- "react-dom": {
- "version": "15.6.2",
- "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-15.6.2.tgz",
- "integrity": "sha1-Qc+t9pO3V/rycIRDodH9WgK+9zA=",
- "requires": {
- "fbjs": "^0.8.9",
- "loose-envify": "^1.1.0",
- "object-assign": "^4.1.0",
- "prop-types": "^15.5.10"
- }
- },
- "react-dropzone": {
- "version": "3.13.4",
- "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-3.13.4.tgz",
- "integrity": "sha1-hNomgVxAM5aRxJtFRMLvehaRLMw=",
- "requires": {
- "attr-accept": "^1.0.3",
- "prop-types": "^15.5.7"
- }
- },
- "react-event-listener": {
- "version": "0.4.5",
- "resolved": "https://registry.npmjs.org/react-event-listener/-/react-event-listener-0.4.5.tgz",
- "integrity": "sha1-4+iVoJcM8U7o+JAROvaBl6vz0LE=",
- "requires": {
- "babel-runtime": "^6.20.0",
- "fbjs": "^0.8.4",
- "prop-types": "^15.5.4",
- "warning": "^3.0.0"
- }
- },
- "react-hot-loader": {
- "version": "4.12.19",
- "resolved": "https://registry.npmjs.org/react-hot-loader/-/react-hot-loader-4.12.19.tgz",
- "integrity": "sha512-p8AnA4QE2GtrvkdmqnKrEiijtVlqdTIDCHZOwItkI9kW51bt5XnQ/4Anz8giiWf9kqBpEQwsmnChDCAFBRyR/Q==",
- "dev": true,
- "requires": {
- "fast-levenshtein": "^2.0.6",
- "global": "^4.3.0",
- "hoist-non-react-statics": "^3.3.0",
- "loader-utils": "^1.1.0",
- "prop-types": "^15.6.1",
- "react-lifecycles-compat": "^3.0.4",
- "shallowequal": "^1.1.0",
- "source-map": "^0.7.3"
- },
- "dependencies": {
- "hoist-non-react-statics": {
- "version": "3.3.2",
- "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz",
- "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==",
- "dev": true,
- "requires": {
- "react-is": "^16.7.0"
- }
- },
- "source-map": {
- "version": "0.7.3",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz",
- "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==",
- "dev": true
- }
- }
- },
- "react-is": {
- "version": "16.12.0",
- "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.12.0.tgz",
- "integrity": "sha512-rPCkf/mWBtKc97aLL9/txD8DZdemK0vkA3JMLShjlJB3Pj3s+lpf1KaBzMfQrAmhMQB0n1cU/SUGgKKBCe837Q=="
- },
- "react-lifecycles-compat": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz",
- "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA=="
- },
- "react-schema-form": {
- "version": "0.3.11",
- "resolved": "https://registry.npmjs.org/react-schema-form/-/react-schema-form-0.3.11.tgz",
- "integrity": "sha1-gWdjoGUuehisJBBzVsceOmfUHYE=",
- "requires": {
- "classnames": "^2.2.5",
- "lodash": "^4.16.6",
- "objectpath": "^1.2.1",
- "tv4": "^1.2.7"
- }
- },
- "react-tap-event-plugin": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/react-tap-event-plugin/-/react-tap-event-plugin-2.0.1.tgz",
- "integrity": "sha1-MWvrO8ZVbinshppyk+icgmqQdNI=",
- "requires": {
- "fbjs": "^0.8.6"
- }
- },
- "react-transition-group": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-1.2.1.tgz",
- "integrity": "sha1-4R9yslf5IbITIpp3TfRmEjRsfKY=",
- "requires": {
- "chain-function": "^1.0.0",
- "dom-helpers": "^3.2.0",
- "loose-envify": "^1.3.1",
- "prop-types": "^15.5.6",
- "warning": "^3.0.0"
- }
- },
- "reactcss": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/reactcss/-/reactcss-1.2.3.tgz",
- "integrity": "sha1-wAATh15Vexzw39mjaKHD2rO1SN0=",
- "requires": {
- "lodash": "^4.0.1"
- }
- },
- "read-pkg": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz",
- "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=",
- "dev": true,
- "requires": {
- "load-json-file": "^2.0.0",
- "normalize-package-data": "^2.3.2",
- "path-type": "^2.0.0"
- },
- "dependencies": {
- "path-type": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz",
- "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=",
- "dev": true,
- "requires": {
- "pify": "^2.0.0"
- }
- },
- "pify": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
- "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
- "dev": true
- }
- }
- },
- "read-pkg-up": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz",
- "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=",
- "dev": true,
- "requires": {
- "find-up": "^2.0.0",
- "read-pkg": "^2.0.0"
- },
- "dependencies": {
- "find-up": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
- "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
- "dev": true,
- "requires": {
- "locate-path": "^2.0.0"
- }
- },
- "locate-path": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
- "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
- "dev": true,
- "requires": {
- "p-locate": "^2.0.0",
- "path-exists": "^3.0.0"
- }
- },
- "p-limit": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
- "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
- "dev": true,
- "requires": {
- "p-try": "^1.0.0"
- }
- },
- "p-locate": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
- "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
- "dev": true,
- "requires": {
- "p-limit": "^1.1.0"
- }
- },
- "p-try": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
- "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=",
- "dev": true
- }
- }
- },
- "readable-stream": {
- "version": "2.3.7",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
- "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
- "requires": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.3",
- "isarray": "~1.0.0",
- "process-nextick-args": "~2.0.0",
- "safe-buffer": "~5.1.1",
- "string_decoder": "~1.1.1",
- "util-deprecate": "~1.0.1"
- }
- },
- "readdirp": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz",
- "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==",
- "dev": true,
- "requires": {
- "graceful-fs": "^4.1.11",
- "micromatch": "^3.1.10",
- "readable-stream": "^2.0.2"
- }
- },
- "recast": {
- "version": "0.11.23",
- "resolved": "https://registry.npmjs.org/recast/-/recast-0.11.23.tgz",
- "integrity": "sha1-RR/TAEqx5N+bTktmN2sqIZEkYtM=",
- "dev": true,
- "requires": {
- "ast-types": "0.9.6",
- "esprima": "~3.1.0",
- "private": "~0.1.5",
- "source-map": "~0.5.0"
- },
- "dependencies": {
- "esprima": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz",
- "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=",
- "dev": true
- }
- }
- },
- "recompose": {
- "version": "0.21.2",
- "resolved": "https://registry.npmjs.org/recompose/-/recompose-0.21.2.tgz",
- "integrity": "sha1-/z+9sjl7HHfEfUUb4qY7kpXURoE=",
- "requires": {
- "change-emitter": "^0.1.2",
- "fbjs": "^0.8.1",
- "hoist-non-react-statics": "^1.0.0",
- "symbol-observable": "^1.0.4"
- }
- },
- "redent": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz",
- "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=",
- "dev": true,
- "requires": {
- "indent-string": "^2.1.0",
- "strip-indent": "^1.0.1"
- },
- "dependencies": {
- "indent-string": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz",
- "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=",
- "dev": true,
- "requires": {
- "repeating": "^2.0.0"
- }
- }
- }
- },
- "regenerate": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz",
- "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==",
- "dev": true
- },
- "regenerate-unicode-properties": {
- "version": "8.1.0",
- "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.1.0.tgz",
- "integrity": "sha512-LGZzkgtLY79GeXLm8Dp0BVLdQlWICzBnJz/ipWUgo59qBaZ+BHtq51P2q1uVZlppMuUAT37SDk39qUbjTWB7bA==",
- "dev": true,
- "requires": {
- "regenerate": "^1.4.0"
- }
- },
- "regenerator-runtime": {
- "version": "0.11.1",
- "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
- "integrity": "sha1-vgWtf5v30i4Fb5cmzuUBf78Z4uk="
- },
- "regenerator-transform": {
- "version": "0.14.1",
- "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.1.tgz",
- "integrity": "sha512-flVuee02C3FKRISbxhXl9mGzdbWUVHubl1SMaknjxkFB1/iqpJhArQUvRxOOPEc/9tAiX0BaQ28FJH10E4isSQ==",
- "dev": true,
- "requires": {
- "private": "^0.1.6"
- }
- },
- "regex-not": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
- "integrity": "sha1-H07OJ+ALC2XgJHpoEOaoXYOldSw=",
- "dev": true,
- "requires": {
- "extend-shallow": "^3.0.2",
- "safe-regex": "^1.1.0"
- }
- },
- "regexp.prototype.flags": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz",
- "integrity": "sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==",
- "dev": true,
- "requires": {
- "define-properties": "^1.1.3",
- "es-abstract": "^1.17.0-next.1"
- }
- },
- "regexpp": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz",
- "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==",
- "dev": true
- },
- "regexpu-core": {
- "version": "4.6.0",
- "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.6.0.tgz",
- "integrity": "sha512-YlVaefl8P5BnFYOITTNzDvan1ulLOiXJzCNZxduTIosN17b87h3bvG9yHMoHaRuo88H4mQ06Aodj5VtYGGGiTg==",
- "dev": true,
- "requires": {
- "regenerate": "^1.4.0",
- "regenerate-unicode-properties": "^8.1.0",
- "regjsgen": "^0.5.0",
- "regjsparser": "^0.6.0",
- "unicode-match-property-ecmascript": "^1.0.4",
- "unicode-match-property-value-ecmascript": "^1.1.0"
- }
- },
- "regjsgen": {
- "version": "0.5.1",
- "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.1.tgz",
- "integrity": "sha512-5qxzGZjDs9w4tzT3TPhCJqWdCc3RLYwy9J2NB0nm5Lz+S273lvWcpjaTGHsT1dc6Hhfq41uSEOw8wBmxrKOuyg==",
- "dev": true
- },
- "regjsparser": {
- "version": "0.6.3",
- "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.3.tgz",
- "integrity": "sha512-8uZvYbnfAtEm9Ab8NTb3hdLwL4g/LQzEYP7Xs27T96abJCCE2d6r3cPZPQEsLKy0vRSGVNG+/zVGtLr86HQduA==",
- "dev": true,
- "requires": {
- "jsesc": "~0.5.0"
- },
- "dependencies": {
- "jsesc": {
- "version": "0.5.0",
- "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
- "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=",
- "dev": true
- }
- }
- },
- "relateurl": {
- "version": "0.2.7",
- "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz",
- "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=",
- "dev": true
- },
- "remark": {
- "version": "10.0.1",
- "resolved": "https://registry.npmjs.org/remark/-/remark-10.0.1.tgz",
- "integrity": "sha512-E6lMuoLIy2TyiokHprMjcWNJ5UxfGQjaMSMhV+f4idM625UjjK4j798+gPs5mfjzDE6vL0oFKVeZM6gZVSVrzQ==",
- "dev": true,
- "requires": {
- "remark-parse": "^6.0.0",
- "remark-stringify": "^6.0.0",
- "unified": "^7.0.0"
- }
- },
- "remark-parse": {
- "version": "6.0.3",
- "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-6.0.3.tgz",
- "integrity": "sha512-QbDXWN4HfKTUC0hHa4teU463KclLAnwpn/FBn87j9cKYJWWawbiLgMfP2Q4XwhxxuuuOxHlw+pSN0OKuJwyVvg==",
- "dev": true,
- "requires": {
- "collapse-white-space": "^1.0.2",
- "is-alphabetical": "^1.0.0",
- "is-decimal": "^1.0.0",
- "is-whitespace-character": "^1.0.0",
- "is-word-character": "^1.0.0",
- "markdown-escapes": "^1.0.0",
- "parse-entities": "^1.1.0",
- "repeat-string": "^1.5.4",
- "state-toggle": "^1.0.0",
- "trim": "0.0.1",
- "trim-trailing-lines": "^1.0.0",
- "unherit": "^1.0.4",
- "unist-util-remove-position": "^1.0.0",
- "vfile-location": "^2.0.0",
- "xtend": "^4.0.1"
- }
- },
- "remark-stringify": {
- "version": "6.0.4",
- "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-6.0.4.tgz",
- "integrity": "sha512-eRWGdEPMVudijE/psbIDNcnJLRVx3xhfuEsTDGgH4GsFF91dVhw5nhmnBppafJ7+NWINW6C7ZwWbi30ImJzqWg==",
- "dev": true,
- "requires": {
- "ccount": "^1.0.0",
- "is-alphanumeric": "^1.0.0",
- "is-decimal": "^1.0.0",
- "is-whitespace-character": "^1.0.0",
- "longest-streak": "^2.0.1",
- "markdown-escapes": "^1.0.0",
- "markdown-table": "^1.1.0",
- "mdast-util-compact": "^1.0.0",
- "parse-entities": "^1.0.2",
- "repeat-string": "^1.5.4",
- "state-toggle": "^1.0.0",
- "stringify-entities": "^1.0.1",
- "unherit": "^1.0.4",
- "xtend": "^4.0.1"
- }
- },
- "remove-trailing-separator": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
- "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=",
- "dev": true
- },
- "renderkid": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.3.tgz",
- "integrity": "sha512-z8CLQp7EZBPCwCnncgf9C4XAi3WR0dv+uWu/PjIyhhAb5d6IJ/QZqlHFprHeKT+59//V6BNUsLbvN8+2LarxGA==",
- "dev": true,
- "requires": {
- "css-select": "^1.1.0",
- "dom-converter": "^0.2",
- "htmlparser2": "^3.3.0",
- "strip-ansi": "^3.0.0",
- "utila": "^0.4.0"
- }
- },
- "repeat-element": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz",
- "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==",
- "dev": true
- },
- "repeat-string": {
- "version": "1.6.1",
- "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
- "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
- "dev": true
- },
- "repeating": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
- "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
- "dev": true,
- "requires": {
- "is-finite": "^1.0.0"
- }
- },
- "replace-ext": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz",
- "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=",
- "dev": true
- },
- "request": {
- "version": "2.88.2",
- "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz",
- "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==",
- "dev": true,
- "requires": {
- "aws-sign2": "~0.7.0",
- "aws4": "^1.8.0",
- "caseless": "~0.12.0",
- "combined-stream": "~1.0.6",
- "extend": "~3.0.2",
- "forever-agent": "~0.6.1",
- "form-data": "~2.3.2",
- "har-validator": "~5.1.3",
- "http-signature": "~1.2.0",
- "is-typedarray": "~1.0.0",
- "isstream": "~0.1.2",
- "json-stringify-safe": "~5.0.1",
- "mime-types": "~2.1.19",
- "oauth-sign": "~0.9.0",
- "performance-now": "^2.1.0",
- "qs": "~6.5.2",
- "safe-buffer": "^5.1.2",
- "tough-cookie": "~2.5.0",
- "tunnel-agent": "^0.6.0",
- "uuid": "^3.3.2"
- }
- },
- "require-directory": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
- "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
- "dev": true
- },
- "require-main-filename": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz",
- "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=",
- "dev": true
- },
- "requires-port": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
- "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=",
- "dev": true
- },
- "reserved-words": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/reserved-words/-/reserved-words-0.1.2.tgz",
- "integrity": "sha1-AKCUD5jNUBrqqsMWQR2a3FKzGrE="
- },
- "resolve": {
- "version": "1.15.1",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz",
- "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==",
- "dev": true,
- "requires": {
- "path-parse": "^1.0.6"
- }
- },
- "resolve-cwd": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz",
- "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=",
- "dev": true,
- "requires": {
- "resolve-from": "^3.0.0"
- },
- "dependencies": {
- "resolve-from": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz",
- "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=",
- "dev": true
- }
- }
- },
- "resolve-dir": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz",
- "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=",
- "dev": true,
- "requires": {
- "expand-tilde": "^2.0.0",
- "global-modules": "^1.0.0"
- },
- "dependencies": {
- "global-modules": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz",
- "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==",
- "dev": true,
- "requires": {
- "global-prefix": "^1.0.1",
- "is-windows": "^1.0.1",
- "resolve-dir": "^1.0.0"
- }
- },
- "global-prefix": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz",
- "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=",
- "dev": true,
- "requires": {
- "expand-tilde": "^2.0.2",
- "homedir-polyfill": "^1.0.1",
- "ini": "^1.3.4",
- "is-windows": "^1.0.1",
- "which": "^1.2.14"
- }
- }
- }
- },
- "resolve-from": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
- "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
- "dev": true
- },
- "resolve-url": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
- "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=",
- "dev": true
- },
- "restore-cursor": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz",
- "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=",
- "requires": {
- "onetime": "^2.0.0",
- "signal-exit": "^3.0.2"
- }
- },
- "ret": {
- "version": "0.1.15",
- "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
- "integrity": "sha1-uKSCXVvbH8P29Twrwz+BOIaBx7w=",
- "dev": true
- },
- "retry": {
- "version": "0.12.0",
- "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz",
- "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=",
- "dev": true
- },
- "reusify": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
- "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
- "dev": true
- },
- "rimraf": {
- "version": "2.7.1",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
- "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
- "dev": true,
- "requires": {
- "glob": "^7.1.3"
- },
- "dependencies": {
- "glob": {
- "version": "7.1.6",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
- "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
- "dev": true,
- "requires": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.0.4",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- }
- }
- }
- },
- "ripemd160": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz",
- "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==",
- "dev": true,
- "requires": {
- "hash-base": "^3.0.0",
- "inherits": "^2.0.1"
- }
- },
- "run-async": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz",
- "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=",
- "requires": {
- "is-promise": "^2.1.0"
- }
- },
- "run-parallel": {
- "version": "1.1.9",
- "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz",
- "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==",
- "dev": true
- },
- "run-queue": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz",
- "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=",
- "dev": true,
- "requires": {
- "aproba": "^1.1.1"
- }
- },
- "rx": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/rx/-/rx-4.1.0.tgz",
- "integrity": "sha1-pfE/957zt0D+MKqAP7CfmIBdR4I="
- },
- "rxjs": {
- "version": "6.5.4",
- "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz",
- "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==",
- "dev": true,
- "requires": {
- "tslib": "^1.9.0"
- }
- },
- "safe-buffer": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
- "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
- },
- "safe-regex": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
- "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
- "dev": true,
- "requires": {
- "ret": "~0.1.10"
- }
- },
- "safer-buffer": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
- "integrity": "sha1-RPoWGwGHuVSd2Eu5GAL5vYOFzWo="
- },
- "sass-graph": {
- "version": "2.2.4",
- "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.4.tgz",
- "integrity": "sha1-E/vWPNHK8JCLn9k0dq1DpR0eC0k=",
- "dev": true,
- "requires": {
- "glob": "^7.0.0",
- "lodash": "^4.0.0",
- "scss-tokenizer": "^0.2.3",
- "yargs": "^7.0.0"
- }
- },
- "sass-loader": {
- "version": "7.3.1",
- "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-7.3.1.tgz",
- "integrity": "sha512-tuU7+zm0pTCynKYHpdqaPpe+MMTQ76I9TPZ7i4/5dZsigE350shQWe5EZNl5dBidM49TPET75tNqRbcsUZWeNA==",
- "dev": true,
- "requires": {
- "clone-deep": "^4.0.1",
- "loader-utils": "^1.0.1",
- "neo-async": "^2.5.0",
- "pify": "^4.0.1",
- "semver": "^6.3.0"
- },
- "dependencies": {
- "semver": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
- "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
- "dev": true
- }
- }
- },
- "sass-material-colors": {
- "version": "0.0.5",
- "resolved": "https://registry.npmjs.org/sass-material-colors/-/sass-material-colors-0.0.5.tgz",
- "integrity": "sha1-uURTkjbJTi1OzjXS7j+iLxCy7UM="
- },
- "schema-inspector": {
- "version": "1.6.9",
- "resolved": "https://registry.npmjs.org/schema-inspector/-/schema-inspector-1.6.9.tgz",
- "integrity": "sha512-MNS3SOn6noecIv9R+gwroIgiOLQoRY1IRXToFvVBo2QMfnXy1E+SGRVWJFsJPqgy0lAivUfPLaVLhvAI35HKRg==",
- "requires": {
- "async": "^3.1.0"
- }
- },
- "schema-utils": {
- "version": "2.6.4",
- "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.4.tgz",
- "integrity": "sha512-VNjcaUxVnEeun6B2fiiUDjXXBtD4ZSH7pdbfIu1pOFwgptDPLMo/z9jr4sUfsjFVPqDCEin/F7IYlq7/E6yDbQ==",
- "dev": true,
- "requires": {
- "ajv": "^6.10.2",
- "ajv-keywords": "^3.4.1"
- }
- },
- "scss-tokenizer": {
- "version": "0.2.3",
- "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz",
- "integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=",
- "dev": true,
- "requires": {
- "js-base64": "^2.1.8",
- "source-map": "^0.4.2"
- },
- "dependencies": {
- "source-map": {
- "version": "0.4.4",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz",
- "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=",
- "dev": true,
- "requires": {
- "amdefine": ">=0.0.4"
- }
- }
- }
- },
- "select": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/select/-/select-1.1.2.tgz",
- "integrity": "sha1-DnNQrN7ICxEIUoeG7B1EGNEbOW0="
- },
- "select-hose": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz",
- "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=",
- "dev": true
- },
- "selfsigned": {
- "version": "1.10.7",
- "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.7.tgz",
- "integrity": "sha512-8M3wBCzeWIJnQfl43IKwOmC4H/RAp50S8DF60znzjW5GVqTcSe2vWclt7hmYVPkKPlHWOu5EaWOMZ2Y6W8ZXTA==",
- "dev": true,
- "requires": {
- "node-forge": "0.9.0"
- }
- },
- "semver": {
- "version": "5.7.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
- "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
- },
- "send": {
- "version": "0.17.1",
- "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz",
- "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==",
- "dev": true,
- "requires": {
- "debug": "2.6.9",
- "depd": "~1.1.2",
- "destroy": "~1.0.4",
- "encodeurl": "~1.0.2",
- "escape-html": "~1.0.3",
- "etag": "~1.8.1",
- "fresh": "0.5.2",
- "http-errors": "~1.7.2",
- "mime": "1.6.0",
- "ms": "2.1.1",
- "on-finished": "~2.3.0",
- "range-parser": "~1.2.1",
- "statuses": "~1.5.0"
- },
- "dependencies": {
- "ms": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
- "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
- "dev": true
- }
- }
- },
- "serialize-javascript": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-2.1.2.tgz",
- "integrity": "sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ==",
- "dev": true
- },
- "serve-index": {
- "version": "1.9.1",
- "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz",
- "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=",
- "dev": true,
- "requires": {
- "accepts": "~1.3.4",
- "batch": "0.6.1",
- "debug": "2.6.9",
- "escape-html": "~1.0.3",
- "http-errors": "~1.6.2",
- "mime-types": "~2.1.17",
- "parseurl": "~1.3.2"
- },
- "dependencies": {
- "http-errors": {
- "version": "1.6.3",
- "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
- "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=",
- "dev": true,
- "requires": {
- "depd": "~1.1.2",
- "inherits": "2.0.3",
- "setprototypeof": "1.1.0",
- "statuses": ">= 1.4.0 < 2"
- }
- },
- "inherits": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
- "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
- "dev": true
- },
- "setprototypeof": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz",
- "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==",
- "dev": true
- }
- }
- },
- "serve-static": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz",
- "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==",
- "dev": true,
- "requires": {
- "encodeurl": "~1.0.2",
- "escape-html": "~1.0.3",
- "parseurl": "~1.3.3",
- "send": "0.17.1"
- }
- },
- "set-blocking": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
- "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
- "dev": true
- },
- "set-immediate-shim": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz",
- "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E="
- },
- "set-value": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz",
- "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==",
- "dev": true,
- "requires": {
- "extend-shallow": "^2.0.1",
- "is-extendable": "^0.1.1",
- "is-plain-object": "^2.0.3",
- "split-string": "^3.0.1"
- },
- "dependencies": {
- "extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "dev": true,
- "requires": {
- "is-extendable": "^0.1.0"
- }
- }
- }
- },
- "setimmediate": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz",
- "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU="
- },
- "setprototypeof": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
- "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==",
- "dev": true
- },
- "sha.js": {
- "version": "2.4.11",
- "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz",
- "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==",
- "dev": true,
- "requires": {
- "inherits": "^2.0.1",
- "safe-buffer": "^5.0.1"
- }
- },
- "shallow-clone": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz",
- "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==",
- "dev": true,
- "requires": {
- "kind-of": "^6.0.2"
- }
- },
- "shallowequal": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz",
- "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ=="
- },
- "shebang-command": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
- "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
- "dev": true,
- "requires": {
- "shebang-regex": "^1.0.0"
- }
- },
- "shebang-regex": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
- "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
- "dev": true
- },
- "sigmund": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz",
- "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA="
- },
- "signal-exit": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
- "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0="
- },
- "simple-assign": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/simple-assign/-/simple-assign-0.1.0.tgz",
- "integrity": "sha1-F/0wZqXz13OPUDIbsPFMooHMS6o="
- },
- "simple-fmt": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/simple-fmt/-/simple-fmt-0.1.0.tgz",
- "integrity": "sha1-GRv1ZqWeZTBILLJatTtKjchcOms=",
- "dev": true
- },
- "simple-is": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/simple-is/-/simple-is-0.2.0.tgz",
- "integrity": "sha1-Krt1qt453rXMgVzhDmGRFkhQuvA=",
- "dev": true
- },
- "slash": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz",
- "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==",
- "dev": true
- },
- "slice-ansi": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz",
- "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==",
- "dev": true,
- "requires": {
- "ansi-styles": "^3.2.0",
- "astral-regex": "^1.0.0",
- "is-fullwidth-code-point": "^2.0.0"
- },
- "dependencies": {
- "ansi-styles": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
- "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
- "dev": true,
- "requires": {
- "color-convert": "^1.9.0"
- }
- }
- }
- },
- "snapdragon": {
- "version": "0.8.2",
- "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
- "integrity": "sha1-ZJIufFZbDhQgS6GqfWlkJ40lGC0=",
- "dev": true,
- "requires": {
- "base": "^0.11.1",
- "debug": "^2.2.0",
- "define-property": "^0.2.5",
- "extend-shallow": "^2.0.1",
- "map-cache": "^0.2.2",
- "source-map": "^0.5.6",
- "source-map-resolve": "^0.5.0",
- "use": "^3.1.0"
- },
- "dependencies": {
- "define-property": {
- "version": "0.2.5",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
- "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
- "dev": true,
- "requires": {
- "is-descriptor": "^0.1.0"
- }
- },
- "extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "dev": true,
- "requires": {
- "is-extendable": "^0.1.0"
- }
- }
- }
- },
- "snapdragon-node": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz",
- "integrity": "sha1-bBdfhv8UvbByRWPo88GwIaKGhTs=",
- "dev": true,
- "requires": {
- "define-property": "^1.0.0",
- "isobject": "^3.0.0",
- "snapdragon-util": "^3.0.1"
- },
- "dependencies": {
- "define-property": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
- "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
- "dev": true,
- "requires": {
- "is-descriptor": "^1.0.0"
- }
- },
- "is-accessor-descriptor": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
- "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=",
- "dev": true,
- "requires": {
- "kind-of": "^6.0.0"
- }
- },
- "is-data-descriptor": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
- "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=",
- "dev": true,
- "requires": {
- "kind-of": "^6.0.0"
- }
- },
- "is-descriptor": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
- "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=",
- "dev": true,
- "requires": {
- "is-accessor-descriptor": "^1.0.0",
- "is-data-descriptor": "^1.0.0",
- "kind-of": "^6.0.2"
- }
- }
- }
- },
- "snapdragon-util": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
- "integrity": "sha1-+VZHlIbyrNeXAGk/b3uAXkWrVuI=",
- "dev": true,
- "requires": {
- "kind-of": "^3.2.0"
- },
- "dependencies": {
- "kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "dev": true,
- "requires": {
- "is-buffer": "^1.1.5"
- }
- }
- }
- },
- "sockjs": {
- "version": "0.3.19",
- "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.19.tgz",
- "integrity": "sha1-2Xa76ACve9IK4IWY1YI5NQiZPA0=",
- "dev": true,
- "requires": {
- "faye-websocket": "^0.10.0",
- "uuid": "^3.0.1"
- }
- },
- "sockjs-client": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.4.0.tgz",
- "integrity": "sha512-5zaLyO8/nri5cua0VtOrFXBPK1jbL4+1cebT/mmKA1E1ZXOvJrII75bPu0l0k843G/+iAbhEqzyKr0w/eCCj7g==",
- "dev": true,
- "requires": {
- "debug": "^3.2.5",
- "eventsource": "^1.0.7",
- "faye-websocket": "~0.11.1",
- "inherits": "^2.0.3",
- "json3": "^3.3.2",
- "url-parse": "^1.4.3"
- },
- "dependencies": {
- "debug": {
- "version": "3.2.6",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
- "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
- "dev": true,
- "requires": {
- "ms": "^2.1.1"
- }
- },
- "faye-websocket": {
- "version": "0.11.3",
- "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz",
- "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==",
- "dev": true,
- "requires": {
- "websocket-driver": ">=0.5.1"
- }
- },
- "ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
- "dev": true
- }
- }
- },
- "sort-keys": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz",
- "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=",
- "dev": true,
- "requires": {
- "is-plain-obj": "^1.0.0"
- }
- },
- "source-list-map": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz",
- "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==",
- "dev": true
- },
- "source-map": {
- "version": "0.5.7",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
- "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
- "dev": true
- },
- "source-map-resolve": {
- "version": "0.5.3",
- "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz",
- "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==",
- "dev": true,
- "requires": {
- "atob": "^2.1.2",
- "decode-uri-component": "^0.2.0",
- "resolve-url": "^0.2.1",
- "source-map-url": "^0.4.0",
- "urix": "^0.1.0"
- }
- },
- "source-map-support": {
- "version": "0.5.16",
- "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz",
- "integrity": "sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==",
- "dev": true,
- "requires": {
- "buffer-from": "^1.0.0",
- "source-map": "^0.6.0"
- },
- "dependencies": {
- "source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
- "dev": true
- }
- }
- },
- "source-map-url": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz",
- "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=",
- "dev": true
- },
- "spdx-correct": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz",
- "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==",
- "dev": true,
- "requires": {
- "spdx-expression-parse": "^3.0.0",
- "spdx-license-ids": "^3.0.0"
- }
- },
- "spdx-exceptions": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz",
- "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==",
- "dev": true
- },
- "spdx-expression-parse": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz",
- "integrity": "sha1-meEZt6XaAOBUkcn6M4t5BII7QdA=",
- "dev": true,
- "requires": {
- "spdx-exceptions": "^2.1.0",
- "spdx-license-ids": "^3.0.0"
- }
- },
- "spdx-license-ids": {
- "version": "3.0.5",
- "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz",
- "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==",
- "dev": true
- },
- "spdy": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.1.tgz",
- "integrity": "sha512-HeZS3PBdMA+sZSu0qwpCxl3DeALD5ASx8pAX0jZdKXSpPWbQ6SYGnlg3BBmYLx5LtiZrmkAZfErCm2oECBcioA==",
- "dev": true,
- "requires": {
- "debug": "^4.1.0",
- "handle-thing": "^2.0.0",
- "http-deceiver": "^1.2.7",
- "select-hose": "^2.0.0",
- "spdy-transport": "^3.0.0"
- },
- "dependencies": {
- "debug": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
- "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
- "dev": true,
- "requires": {
- "ms": "^2.1.1"
- }
- },
- "ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
- "dev": true
- }
- }
- },
- "spdy-transport": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz",
- "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==",
- "dev": true,
- "requires": {
- "debug": "^4.1.0",
- "detect-node": "^2.0.4",
- "hpack.js": "^2.1.6",
- "obuf": "^1.1.2",
- "readable-stream": "^3.0.6",
- "wbuf": "^1.7.3"
- },
- "dependencies": {
- "debug": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
- "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
- "dev": true,
- "requires": {
- "ms": "^2.1.1"
- }
- },
- "ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
- "dev": true
- },
- "readable-stream": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
- "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
- "dev": true,
- "requires": {
- "inherits": "^2.0.3",
- "string_decoder": "^1.1.1",
- "util-deprecate": "^1.0.1"
- }
- }
- }
- },
- "specificity": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/specificity/-/specificity-0.4.1.tgz",
- "integrity": "sha512-1klA3Gi5PD1Wv9Q0wUoOQN1IWAuPu0D1U03ThXTr0cJ20+/iq2tHSDnK7Kk/0LXJ1ztUB2/1Os0wKmfyNgUQfg==",
- "dev": true
- },
- "split-string": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
- "integrity": "sha1-fLCd2jqGWFcFxks5pkZgOGguj+I=",
- "dev": true,
- "requires": {
- "extend-shallow": "^3.0.0"
- }
- },
- "split.js": {
- "version": "1.3.5",
- "resolved": "https://registry.npmjs.org/split.js/-/split.js-1.3.5.tgz",
- "integrity": "sha1-YuLOZtLPkcx3SqXwdJ/yUTgDn1A="
- },
- "sprintf-js": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
- "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
- "dev": true
- },
- "sshpk": {
- "version": "1.16.1",
- "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz",
- "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==",
- "dev": true,
- "requires": {
- "asn1": "~0.2.3",
- "assert-plus": "^1.0.0",
- "bcrypt-pbkdf": "^1.0.0",
- "dashdash": "^1.12.0",
- "ecc-jsbn": "~0.1.1",
- "getpass": "^0.1.1",
- "jsbn": "~0.1.0",
- "safer-buffer": "^2.0.2",
- "tweetnacl": "~0.14.0"
- }
- },
- "ssri": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/ssri/-/ssri-7.1.0.tgz",
- "integrity": "sha512-77/WrDZUWocK0mvA5NTRQyveUf+wsrIc6vyrxpS8tVvYBcX215QbafrJR3KtkpskIzoFLqqNuuYQvxaMjXJ/0g==",
- "dev": true,
- "requires": {
- "figgy-pudding": "^3.5.1",
- "minipass": "^3.1.1"
- }
- },
- "stable": {
- "version": "0.1.8",
- "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz",
- "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==",
- "dev": true
- },
- "state-toggle": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.3.tgz",
- "integrity": "sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ==",
- "dev": true
- },
- "static-extend": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
- "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
- "dev": true,
- "requires": {
- "define-property": "^0.2.5",
- "object-copy": "^0.1.0"
- },
- "dependencies": {
- "define-property": {
- "version": "0.2.5",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
- "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
- "dev": true,
- "requires": {
- "is-descriptor": "^0.1.0"
- }
- }
- }
- },
- "statuses": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
- "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=",
- "dev": true
- },
- "stdout-stream": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.1.tgz",
- "integrity": "sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==",
- "dev": true,
- "requires": {
- "readable-stream": "^2.0.1"
- }
- },
- "stream-browserify": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz",
- "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==",
- "dev": true,
- "requires": {
- "inherits": "~2.0.1",
- "readable-stream": "^2.0.2"
- }
- },
- "stream-each": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz",
- "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==",
- "dev": true,
- "requires": {
- "end-of-stream": "^1.1.0",
- "stream-shift": "^1.0.0"
- }
- },
- "stream-http": {
- "version": "2.8.3",
- "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz",
- "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==",
- "dev": true,
- "requires": {
- "builtin-status-codes": "^3.0.0",
- "inherits": "^2.0.1",
- "readable-stream": "^2.3.6",
- "to-arraybuffer": "^1.0.0",
- "xtend": "^4.0.0"
- }
- },
- "stream-shift": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz",
- "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==",
- "dev": true
- },
- "strict-uri-encode": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz",
- "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=",
- "dev": true
- },
- "string-width": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
- "integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=",
- "requires": {
- "is-fullwidth-code-point": "^2.0.0",
- "strip-ansi": "^4.0.0"
- },
- "dependencies": {
- "ansi-regex": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
- "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg="
- },
- "strip-ansi": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
- "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
- "requires": {
- "ansi-regex": "^3.0.0"
- }
- }
- }
- },
- "string.prototype.trimleft": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz",
- "integrity": "sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag==",
- "dev": true,
- "requires": {
- "define-properties": "^1.1.3",
- "function-bind": "^1.1.1"
- }
- },
- "string.prototype.trimright": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz",
- "integrity": "sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g==",
- "dev": true,
- "requires": {
- "define-properties": "^1.1.3",
- "function-bind": "^1.1.1"
- }
- },
- "string_decoder": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
- "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=",
- "requires": {
- "safe-buffer": "~5.1.0"
- }
- },
- "stringify-entities": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-1.3.2.tgz",
- "integrity": "sha512-nrBAQClJAPN2p+uGCVJRPIPakKeKWZ9GtBCmormE7pWOSlHat7+x5A8gx85M7HM5Dt0BP3pP5RhVW77WdbJJ3A==",
- "dev": true,
- "requires": {
- "character-entities-html4": "^1.0.0",
- "character-entities-legacy": "^1.0.0",
- "is-alphanumerical": "^1.0.0",
- "is-hexadecimal": "^1.0.0"
- }
- },
- "stringmap": {
- "version": "0.2.2",
- "resolved": "https://registry.npmjs.org/stringmap/-/stringmap-0.2.2.tgz",
- "integrity": "sha1-VWwTeyWPlCuHdvWy71gqoGnX0bE=",
- "dev": true
- },
- "stringset": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/stringset/-/stringset-0.2.1.tgz",
- "integrity": "sha1-7yWcTjSTRDd/zRyRPdLoSMnAQrU=",
- "dev": true
- },
- "strip-ansi": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
- "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
- "requires": {
- "ansi-regex": "^2.0.0"
- }
- },
- "strip-bom": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
- "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=",
- "dev": true
- },
- "strip-eof": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
- "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=",
- "dev": true
- },
- "strip-indent": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz",
- "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=",
- "dev": true,
- "requires": {
- "get-stdin": "^4.0.1"
- }
- },
- "strip-json-comments": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz",
- "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==",
- "dev": true
- },
- "style-loader": {
- "version": "0.23.1",
- "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.23.1.tgz",
- "integrity": "sha512-XK+uv9kWwhZMZ1y7mysB+zoihsEj4wneFWAS5qoiLwzW0WzSqMrrsIy+a3zkQJq0ipFtBpX5W3MqyRIBF/WFGg==",
- "dev": true,
- "requires": {
- "loader-utils": "^1.1.0",
- "schema-utils": "^1.0.0"
- },
- "dependencies": {
- "schema-utils": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz",
- "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==",
- "dev": true,
- "requires": {
- "ajv": "^6.1.0",
- "ajv-errors": "^1.0.0",
- "ajv-keywords": "^3.1.0"
- }
- }
- }
- },
- "style-search": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/style-search/-/style-search-0.1.0.tgz",
- "integrity": "sha1-eVjHk+R+MuB9K1yv5cC/jhLneQI=",
- "dev": true
- },
- "stylelint": {
- "version": "13.0.0",
- "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-13.0.0.tgz",
- "integrity": "sha512-6sjgOJbM3iLhnUtmRO0J1vvxie9VnhIZX/2fCehjylv9Gl9u0ytehGCTm9Lhw2p1F8yaNZn5UprvhCB8C3g/Tg==",
- "dev": true,
- "requires": {
- "autoprefixer": "^9.7.3",
- "balanced-match": "^1.0.0",
- "chalk": "^3.0.0",
- "cosmiconfig": "^6.0.0",
- "debug": "^4.1.1",
- "execall": "^2.0.0",
- "file-entry-cache": "^5.0.1",
- "get-stdin": "^7.0.0",
- "global-modules": "^2.0.0",
- "globby": "^11.0.0",
- "globjoin": "^0.1.4",
- "html-tags": "^3.1.0",
- "ignore": "^5.1.4",
- "import-lazy": "^4.0.0",
- "imurmurhash": "^0.1.4",
- "known-css-properties": "^0.17.0",
- "leven": "^3.1.0",
- "lodash": "^4.17.15",
- "log-symbols": "^3.0.0",
- "mathml-tag-names": "^2.1.1",
- "meow": "^6.0.0",
- "micromatch": "^4.0.2",
- "normalize-selector": "^0.2.0",
- "postcss": "^7.0.26",
- "postcss-html": "^0.36.0",
- "postcss-jsx": "^0.36.3",
- "postcss-less": "^3.1.4",
- "postcss-markdown": "^0.36.0",
- "postcss-media-query-parser": "^0.2.3",
- "postcss-reporter": "^6.0.1",
- "postcss-resolve-nested-selector": "^0.1.1",
- "postcss-safe-parser": "^4.0.1",
- "postcss-sass": "^0.4.2",
- "postcss-scss": "^2.0.0",
- "postcss-selector-parser": "^3.1.0",
- "postcss-syntax": "^0.36.2",
- "postcss-value-parser": "^4.0.2",
- "resolve-from": "^5.0.0",
- "slash": "^3.0.0",
- "specificity": "^0.4.1",
- "string-width": "^4.2.0",
- "strip-ansi": "^6.0.0",
- "style-search": "^0.1.0",
- "sugarss": "^2.0.0",
- "svg-tags": "^1.0.0",
- "table": "^5.4.6",
- "v8-compile-cache": "^2.1.0",
- "write-file-atomic": "^3.0.1"
- },
- "dependencies": {
- "@nodelib/fs.stat": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz",
- "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==",
- "dev": true
- },
- "ansi-regex": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
- "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
- "dev": true
- },
- "ansi-styles": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
- "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
- "dev": true,
- "requires": {
- "@types/color-name": "^1.1.1",
- "color-convert": "^2.0.1"
- }
- },
- "array-union": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
- "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
- "dev": true
- },
- "braces": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
- "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
- "dev": true,
- "requires": {
- "fill-range": "^7.0.1"
- }
- },
- "camelcase-keys": {
- "version": "6.1.2",
- "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.1.2.tgz",
- "integrity": "sha512-QfFrU0CIw2oltVvpndW32kuJ/9YOJwUnmWrjlXt1nnJZHCaS9i6bfOpg9R4Lw8aZjStkJWM+jc0cdXjWBgVJSw==",
- "dev": true,
- "requires": {
- "camelcase": "^5.3.1",
- "map-obj": "^4.0.0",
- "quick-lru": "^4.0.1"
- }
- },
- "chalk": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
- "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
- "dev": true,
- "requires": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- }
- },
- "color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "dev": true,
- "requires": {
- "color-name": "~1.1.4"
- }
- },
- "color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true
- },
- "cosmiconfig": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz",
- "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==",
- "dev": true,
- "requires": {
- "@types/parse-json": "^4.0.0",
- "import-fresh": "^3.1.0",
- "parse-json": "^5.0.0",
- "path-type": "^4.0.0",
- "yaml": "^1.7.2"
- }
- },
- "debug": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
- "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
- "dev": true,
- "requires": {
- "ms": "^2.1.1"
- }
- },
- "dir-glob": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
- "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
- "dev": true,
- "requires": {
- "path-type": "^4.0.0"
- }
- },
- "fast-glob": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.1.1.tgz",
- "integrity": "sha512-nTCREpBY8w8r+boyFYAx21iL6faSsQynliPHM4Uf56SbkyohCNxpVPEH9xrF5TXKy+IsjkPUHDKiUkzBVRXn9g==",
- "dev": true,
- "requires": {
- "@nodelib/fs.stat": "^2.0.2",
- "@nodelib/fs.walk": "^1.2.3",
- "glob-parent": "^5.1.0",
- "merge2": "^1.3.0",
- "micromatch": "^4.0.2"
- }
- },
- "fill-range": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
- "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
- "dev": true,
- "requires": {
- "to-regex-range": "^5.0.1"
- }
- },
- "find-up": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
- "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
- "dev": true,
- "requires": {
- "locate-path": "^5.0.0",
- "path-exists": "^4.0.0"
- }
- },
- "get-stdin": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-7.0.0.tgz",
- "integrity": "sha512-zRKcywvrXlXsA0v0i9Io4KDRaAw7+a1ZpjRwl9Wox8PFlVCCHra7E9c4kqXCoCM9nR5tBkaTTZRBoCm60bFqTQ==",
- "dev": true
- },
- "glob-parent": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz",
- "integrity": "sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==",
- "dev": true,
- "requires": {
- "is-glob": "^4.0.1"
- }
- },
- "globby": {
- "version": "11.0.0",
- "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.0.tgz",
- "integrity": "sha512-iuehFnR3xu5wBBtm4xi0dMe92Ob87ufyu/dHwpDYfbcpYpIbrO5OnS8M1vWvrBhSGEJ3/Ecj7gnX76P8YxpPEg==",
- "dev": true,
- "requires": {
- "array-union": "^2.1.0",
- "dir-glob": "^3.0.1",
- "fast-glob": "^3.1.1",
- "ignore": "^5.1.4",
- "merge2": "^1.3.0",
- "slash": "^3.0.0"
- }
- },
- "has-flag": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
- "dev": true
- },
- "ignore": {
- "version": "5.1.4",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.4.tgz",
- "integrity": "sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A==",
- "dev": true
- },
- "is-fullwidth-code-point": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
- "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
- "dev": true
- },
- "is-number": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
- "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
- "dev": true
- },
- "locate-path": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
- "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
- "dev": true,
- "requires": {
- "p-locate": "^4.1.0"
- }
- },
- "map-obj": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.1.0.tgz",
- "integrity": "sha512-glc9y00wgtwcDmp7GaE/0b0OnxpNJsVf3ael/An6Fe2Q51LLwN1er6sdomLRzz5h0+yMpiYLhWYF5R7HeqVd4g==",
- "dev": true
- },
- "meow": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/meow/-/meow-6.0.1.tgz",
- "integrity": "sha512-kxGTFgT/b7/oSRSQsJ0qsT5IMU+bgZ1eAdSA3kIV7onkW0QWo/hL5RbGlMfvBjHJKPE1LaPX0kdecYFiqYWjUw==",
- "dev": true,
- "requires": {
- "@types/minimist": "^1.2.0",
- "camelcase-keys": "^6.1.1",
- "decamelize-keys": "^1.1.0",
- "hard-rejection": "^2.0.0",
- "minimist-options": "^4.0.1",
- "normalize-package-data": "^2.5.0",
- "read-pkg-up": "^7.0.0",
- "redent": "^3.0.0",
- "trim-newlines": "^3.0.0",
- "type-fest": "^0.8.1",
- "yargs-parser": "^16.1.0"
- }
- },
- "micromatch": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz",
- "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==",
- "dev": true,
- "requires": {
- "braces": "^3.0.1",
- "picomatch": "^2.0.5"
- }
- },
- "ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
- "dev": true
- },
- "p-locate": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
- "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
- "dev": true,
- "requires": {
- "p-limit": "^2.2.0"
- }
- },
- "parse-json": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz",
- "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==",
- "dev": true,
- "requires": {
- "@babel/code-frame": "^7.0.0",
- "error-ex": "^1.3.1",
- "json-parse-better-errors": "^1.0.1",
- "lines-and-columns": "^1.1.6"
- }
- },
- "path-exists": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
- "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
- "dev": true
- },
- "path-type": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
- "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
- "dev": true
- },
- "postcss-selector-parser": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz",
- "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==",
- "dev": true,
- "requires": {
- "dot-prop": "^5.2.0",
- "indexes-of": "^1.0.1",
- "uniq": "^1.0.1"
- }
- },
- "read-pkg": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz",
- "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==",
- "dev": true,
- "requires": {
- "@types/normalize-package-data": "^2.4.0",
- "normalize-package-data": "^2.5.0",
- "parse-json": "^5.0.0",
- "type-fest": "^0.6.0"
- },
- "dependencies": {
- "type-fest": {
- "version": "0.6.0",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz",
- "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==",
- "dev": true
- }
- }
- },
- "read-pkg-up": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz",
- "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==",
- "dev": true,
- "requires": {
- "find-up": "^4.1.0",
- "read-pkg": "^5.2.0",
- "type-fest": "^0.8.1"
- }
- },
- "redent": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz",
- "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==",
- "dev": true,
- "requires": {
- "indent-string": "^4.0.0",
- "strip-indent": "^3.0.0"
- }
- },
- "resolve-from": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
- "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
- "dev": true
- },
- "slash": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
- "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
- "dev": true
- },
- "string-width": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
- "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
- "dev": true,
- "requires": {
- "emoji-regex": "^8.0.0",
- "is-fullwidth-code-point": "^3.0.0",
- "strip-ansi": "^6.0.0"
- }
- },
- "strip-ansi": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
- "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
- "dev": true,
- "requires": {
- "ansi-regex": "^5.0.0"
- }
- },
- "strip-indent": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz",
- "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==",
- "dev": true,
- "requires": {
- "min-indent": "^1.0.0"
- }
- },
- "supports-color": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
- "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
- "dev": true,
- "requires": {
- "has-flag": "^4.0.0"
- }
- },
- "to-regex-range": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
- "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
- "dev": true,
- "requires": {
- "is-number": "^7.0.0"
- }
- },
- "trim-newlines": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.0.tgz",
- "integrity": "sha512-C4+gOpvmxaSMKuEf9Qc134F1ZuOHVXKRbtEflf4NTtuuJDEIJ9p5PXsalL8SkeRw+qit1Mo+yuvMPAKwWg/1hA==",
- "dev": true
- },
- "yargs-parser": {
- "version": "16.1.0",
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-16.1.0.tgz",
- "integrity": "sha512-H/V41UNZQPkUMIT5h5hiwg4QKIY1RPvoBV4XcjUbRM8Bk2oKqqyZ0DIEbTFZB0XjbtSPG8SAa/0DxCQmiRgzKg==",
- "dev": true,
- "requires": {
- "camelcase": "^5.0.0",
- "decamelize": "^1.2.0"
- }
- }
- }
- },
- "stylelint-config-recommended": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-3.0.0.tgz",
- "integrity": "sha512-F6yTRuc06xr1h5Qw/ykb2LuFynJ2IxkKfCMf+1xqPffkxh0S09Zc902XCffcsw/XMFq/OzQ1w54fLIDtmRNHnQ==",
- "dev": true
- },
- "stylelint-config-recommended-scss": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/stylelint-config-recommended-scss/-/stylelint-config-recommended-scss-4.1.0.tgz",
- "integrity": "sha512-4012ca0weVi92epm3RRBRZcRJIyl5vJjJ/tJAKng+Qat5+cnmuCwyOI2vXkKdjNfGd0gvzyKCKEkvTMDcbtd7Q==",
- "dev": true,
- "requires": {
- "stylelint-config-recommended": "^3.0.0"
- }
- },
- "stylelint-config-standard": {
- "version": "19.0.0",
- "resolved": "https://registry.npmjs.org/stylelint-config-standard/-/stylelint-config-standard-19.0.0.tgz",
- "integrity": "sha512-VvcODsL1PryzpYteWZo2YaA5vU/pWfjqBpOvmeA8iB2MteZ/ZhI1O4hnrWMidsS4vmEJpKtjdhLdfGJmmZm6Cg==",
- "dev": true,
- "requires": {
- "stylelint-config-recommended": "^3.0.0"
- }
- },
- "stylelint-order": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/stylelint-order/-/stylelint-order-4.0.0.tgz",
- "integrity": "sha512-bXV0v+jfB0+JKsqIn3mLglg1Dj2QCYkFHNfL1c+rVMEmruZmW5LUqT/ARBERfBm8SFtCuXpEdatidw/3IkcoiA==",
- "dev": true,
- "requires": {
- "lodash": "^4.17.15",
- "postcss": "^7.0.26",
- "postcss-sorting": "^5.0.1"
- }
- },
- "stylelint-scss": {
- "version": "3.13.0",
- "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-3.13.0.tgz",
- "integrity": "sha512-SaLnvQyndaPcsgVJsMh6zJ1uKVzkRZJx+Wg/stzoB1mTBdEmGketbHrGbMQNymzH/0mJ06zDSpeCDvNxqIJE5A==",
- "dev": true,
- "requires": {
- "lodash.isboolean": "^3.0.3",
- "lodash.isregexp": "^4.0.1",
- "lodash.isstring": "^4.0.1",
- "postcss-media-query-parser": "^0.2.3",
- "postcss-resolve-nested-selector": "^0.1.1",
- "postcss-selector-parser": "^6.0.2",
- "postcss-value-parser": "^4.0.2"
- }
- },
- "stylelint-webpack-plugin": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/stylelint-webpack-plugin/-/stylelint-webpack-plugin-1.2.3.tgz",
- "integrity": "sha512-XEevZZzlI6k3e0Amp7AtpZ/elgaOdPPwLFY9InNoajw4KNRcZTkK61ZsZdHvIyK32Ej9L9u4fwfXG2QGKW0imA==",
- "dev": true,
- "requires": {
- "arrify": "^2.0.1",
- "micromatch": "^4.0.2",
- "schema-utils": "^2.6.1"
- },
- "dependencies": {
- "arrify": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz",
- "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==",
- "dev": true
- },
- "braces": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
- "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
- "dev": true,
- "requires": {
- "fill-range": "^7.0.1"
- }
- },
- "fill-range": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
- "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
- "dev": true,
- "requires": {
- "to-regex-range": "^5.0.1"
- }
- },
- "is-number": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
- "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
- "dev": true
- },
- "micromatch": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz",
- "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==",
- "dev": true,
- "requires": {
- "braces": "^3.0.1",
- "picomatch": "^2.0.5"
- }
- },
- "to-regex-range": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
- "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
- "dev": true,
- "requires": {
- "is-number": "^7.0.0"
- }
- }
- }
- },
- "sugarss": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/sugarss/-/sugarss-2.0.0.tgz",
- "integrity": "sha512-WfxjozUk0UVA4jm+U1d736AUpzSrNsQcIbyOkoE364GrtWmIrFdk5lksEupgWMD4VaT/0kVx1dobpiDumSgmJQ==",
- "dev": true,
- "requires": {
- "postcss": "^7.0.2"
- }
- },
- "supports-color": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
- "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc="
- },
- "svg-tags": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz",
- "integrity": "sha1-WPcc7jvVGbWdSyqEO2x95krAR2Q=",
- "dev": true
- },
- "symbol-observable": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz",
- "integrity": "sha1-wiaIrtTqs83C3+rLtWFmBWCgCAQ="
- },
- "table": {
- "version": "5.4.6",
- "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz",
- "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==",
- "dev": true,
- "requires": {
- "ajv": "^6.10.2",
- "lodash": "^4.17.14",
- "slice-ansi": "^2.1.0",
- "string-width": "^3.0.0"
- },
- "dependencies": {
- "ansi-regex": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
- "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
- "dev": true
- },
- "emoji-regex": {
- "version": "7.0.3",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
- "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
- "dev": true
- },
- "string-width": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
- "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
- "dev": true,
- "requires": {
- "emoji-regex": "^7.0.1",
- "is-fullwidth-code-point": "^2.0.0",
- "strip-ansi": "^5.1.0"
- }
- },
- "strip-ansi": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
- "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
- "dev": true,
- "requires": {
- "ansi-regex": "^4.1.0"
- }
- }
- }
- },
- "tapable": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz",
- "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==",
- "dev": true
- },
- "tar": {
- "version": "2.2.2",
- "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.2.tgz",
- "integrity": "sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==",
- "dev": true,
- "requires": {
- "block-stream": "*",
- "fstream": "^1.0.12",
- "inherits": "2"
- }
- },
- "terser": {
- "version": "4.6.3",
- "resolved": "https://registry.npmjs.org/terser/-/terser-4.6.3.tgz",
- "integrity": "sha512-Lw+ieAXmY69d09IIc/yqeBqXpEQIpDGZqT34ui1QWXIUpR2RjbqEkT8X7Lgex19hslSqcWM5iMN2kM11eMsESQ==",
- "dev": true,
- "requires": {
- "commander": "^2.20.0",
- "source-map": "~0.6.1",
- "source-map-support": "~0.5.12"
- },
- "dependencies": {
- "source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
- "dev": true
- }
- }
- },
- "terser-webpack-plugin": {
- "version": "1.4.3",
- "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.3.tgz",
- "integrity": "sha512-QMxecFz/gHQwteWwSo5nTc6UaICqN1bMedC5sMtUc7y3Ha3Q8y6ZO0iCR8pq4RJC8Hjf0FEPEHZqcMB/+DFCrA==",
- "dev": true,
- "requires": {
- "cacache": "^12.0.2",
- "find-cache-dir": "^2.1.0",
- "is-wsl": "^1.1.0",
- "schema-utils": "^1.0.0",
- "serialize-javascript": "^2.1.2",
- "source-map": "^0.6.1",
- "terser": "^4.1.2",
- "webpack-sources": "^1.4.0",
- "worker-farm": "^1.7.0"
- },
- "dependencies": {
- "cacache": {
- "version": "12.0.3",
- "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.3.tgz",
- "integrity": "sha512-kqdmfXEGFepesTuROHMs3MpFLWrPkSSpRqOw80RCflZXy/khxaArvFrQ7uJxSUduzAufc6G0g1VUCOZXxWavPw==",
- "dev": true,
- "requires": {
- "bluebird": "^3.5.5",
- "chownr": "^1.1.1",
- "figgy-pudding": "^3.5.1",
- "glob": "^7.1.4",
- "graceful-fs": "^4.1.15",
- "infer-owner": "^1.0.3",
- "lru-cache": "^5.1.1",
- "mississippi": "^3.0.0",
- "mkdirp": "^0.5.1",
- "move-concurrently": "^1.0.1",
- "promise-inflight": "^1.0.1",
- "rimraf": "^2.6.3",
- "ssri": "^6.0.1",
- "unique-filename": "^1.1.1",
- "y18n": "^4.0.0"
- }
- },
- "glob": {
- "version": "7.1.6",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
- "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
- "dev": true,
- "requires": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.0.4",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- }
- },
- "lru-cache": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
- "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
- "dev": true,
- "requires": {
- "yallist": "^3.0.2"
- }
- },
- "schema-utils": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz",
- "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==",
- "dev": true,
- "requires": {
- "ajv": "^6.1.0",
- "ajv-errors": "^1.0.0",
- "ajv-keywords": "^3.1.0"
- }
- },
- "source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
- "dev": true
- },
- "ssri": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz",
- "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==",
- "dev": true,
- "requires": {
- "figgy-pudding": "^3.5.1"
- }
- },
- "yallist": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
- "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
- "dev": true
- }
- }
- },
- "text-table": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
- "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
- "dev": true
- },
- "through": {
- "version": "2.3.8",
- "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
- "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU="
- },
- "through2": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
- "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
- "dev": true,
- "requires": {
- "readable-stream": "~2.3.6",
- "xtend": "~4.0.1"
- }
- },
- "thunky": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz",
- "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==",
- "dev": true
- },
- "timers-browserify": {
- "version": "2.0.11",
- "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.11.tgz",
- "integrity": "sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ==",
- "dev": true,
- "requires": {
- "setimmediate": "^1.0.4"
- }
- },
- "tiny-emitter": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz",
- "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q=="
- },
- "tinycolor2": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.4.1.tgz",
- "integrity": "sha1-9PrTM0R7wLB9TcjpIJ2POaisd+g="
- },
- "tmp": {
- "version": "0.0.33",
- "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
- "integrity": "sha1-bTQzWIl2jSGyvNoKonfO07G/rfk=",
- "requires": {
- "os-tmpdir": "~1.0.2"
- }
- },
- "to-arraybuffer": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz",
- "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=",
- "dev": true
- },
- "to-fast-properties": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
- "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
- "dev": true
- },
- "to-object-path": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
- "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
- "dev": true,
- "requires": {
- "kind-of": "^3.0.2"
- },
- "dependencies": {
- "kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "dev": true,
- "requires": {
- "is-buffer": "^1.1.5"
- }
- }
- }
- },
- "to-regex": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz",
- "integrity": "sha1-E8/dmzNlUvMLUfM6iuG0Knp1mc4=",
- "dev": true,
- "requires": {
- "define-property": "^2.0.2",
- "extend-shallow": "^3.0.2",
- "regex-not": "^1.0.2",
- "safe-regex": "^1.1.0"
- }
- },
- "to-regex-range": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
- "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
- "dev": true,
- "requires": {
- "is-number": "^3.0.0",
- "repeat-string": "^1.6.1"
- }
- },
- "toidentifier": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz",
- "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==",
- "dev": true
- },
- "tooltipster": {
- "version": "4.2.7",
- "resolved": "https://registry.npmjs.org/tooltipster/-/tooltipster-4.2.7.tgz",
- "integrity": "sha512-W4tY3LG2eyPY2VQZRH3JcsNuRl3jPCEGmKBPOMTP/05E3+1kOJjASzPRRkcpP+uf9vqX7+896ivU86f6B8Esgw=="
- },
- "toposort": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/toposort/-/toposort-1.0.7.tgz",
- "integrity": "sha1-LmhELZ9k7HILjMieZEOsbKqVACk=",
- "dev": true
- },
- "tough-cookie": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
- "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
- "dev": true,
- "requires": {
- "psl": "^1.1.28",
- "punycode": "^2.1.1"
- }
- },
- "trim": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz",
- "integrity": "sha1-WFhUf2spB1fulczMZm+1AITEYN0=",
- "dev": true
- },
- "trim-newlines": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz",
- "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=",
- "dev": true
- },
- "trim-trailing-lines": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-1.1.3.tgz",
- "integrity": "sha512-4ku0mmjXifQcTVfYDfR5lpgV7zVqPg6zV9rdZmwOPqq0+Zq19xDqEgagqVbc4pOOShbncuAOIs59R3+3gcF3ZA==",
- "dev": true
- },
- "trough": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz",
- "integrity": "sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==",
- "dev": true
- },
- "true-case-path": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.3.tgz",
- "integrity": "sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew==",
- "dev": true,
- "requires": {
- "glob": "^7.1.2"
- },
- "dependencies": {
- "glob": {
- "version": "7.1.6",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
- "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
- "dev": true,
- "requires": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.0.4",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- }
- }
- }
- },
- "tryor": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/tryor/-/tryor-0.1.2.tgz",
- "integrity": "sha1-gUXkynyv9ArN48z5Rui4u3W0Fys=",
- "dev": true
- },
- "tslib": {
- "version": "1.10.0",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz",
- "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==",
- "dev": true
- },
- "tty-browserify": {
- "version": "0.0.0",
- "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz",
- "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=",
- "dev": true
- },
- "tunnel-agent": {
- "version": "0.6.0",
- "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
- "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
- "dev": true,
- "requires": {
- "safe-buffer": "^5.0.1"
- }
- },
- "tv4": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/tv4/-/tv4-1.3.0.tgz",
- "integrity": "sha1-0CDIRvrdUMhVq7JeuuzGj8EPeWM="
- },
- "tweetnacl": {
- "version": "0.14.5",
- "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
- "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=",
- "dev": true
- },
- "type-check": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
- "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
- "dev": true,
- "requires": {
- "prelude-ls": "~1.1.2"
- }
- },
- "type-fest": {
- "version": "0.8.1",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
- "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
- "dev": true
- },
- "type-is": {
- "version": "1.6.18",
- "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
- "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
- "dev": true,
- "requires": {
- "media-typer": "0.3.0",
- "mime-types": "~2.1.24"
- }
- },
- "typedarray": {
- "version": "0.0.6",
- "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
- "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=",
- "dev": true
- },
- "typedarray-to-buffer": {
- "version": "3.1.5",
- "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz",
- "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==",
- "dev": true,
- "requires": {
- "is-typedarray": "^1.0.0"
- }
- },
- "typeface-roboto": {
- "version": "0.0.22",
- "resolved": "https://registry.npmjs.org/typeface-roboto/-/typeface-roboto-0.0.22.tgz",
- "integrity": "sha1-A7YLsCsQ+VCaaDImsDmucEFj5WE="
- },
- "ua-parser-js": {
- "version": "0.7.21",
- "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.21.tgz",
- "integrity": "sha512-+O8/qh/Qj8CgC6eYBVBykMrNtp5Gebn4dlGD/kKXVkJNDwyrAwSIqwz8CDf+tsAIWVycKcku6gIXJ0qwx/ZXaQ=="
- },
- "uglify-js": {
- "version": "3.4.10",
- "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.10.tgz",
- "integrity": "sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw==",
- "dev": true,
- "requires": {
- "commander": "~2.19.0",
- "source-map": "~0.6.1"
- },
- "dependencies": {
- "commander": {
- "version": "2.19.0",
- "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz",
- "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==",
- "dev": true
- },
- "source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=",
- "dev": true
- }
- }
- },
- "uglifyjs-webpack-plugin": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-2.2.0.tgz",
- "integrity": "sha512-mHSkufBmBuJ+KHQhv5H0MXijtsoA1lynJt1lXOaotja8/I0pR4L9oGaPIZw+bQBOFittXZg9OC1sXSGO9D9ZYg==",
- "dev": true,
- "requires": {
- "cacache": "^12.0.2",
- "find-cache-dir": "^2.1.0",
- "is-wsl": "^1.1.0",
- "schema-utils": "^1.0.0",
- "serialize-javascript": "^1.7.0",
- "source-map": "^0.6.1",
- "uglify-js": "^3.6.0",
- "webpack-sources": "^1.4.0",
- "worker-farm": "^1.7.0"
- },
- "dependencies": {
- "cacache": {
- "version": "12.0.3",
- "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.3.tgz",
- "integrity": "sha512-kqdmfXEGFepesTuROHMs3MpFLWrPkSSpRqOw80RCflZXy/khxaArvFrQ7uJxSUduzAufc6G0g1VUCOZXxWavPw==",
- "dev": true,
- "requires": {
- "bluebird": "^3.5.5",
- "chownr": "^1.1.1",
- "figgy-pudding": "^3.5.1",
- "glob": "^7.1.4",
- "graceful-fs": "^4.1.15",
- "infer-owner": "^1.0.3",
- "lru-cache": "^5.1.1",
- "mississippi": "^3.0.0",
- "mkdirp": "^0.5.1",
- "move-concurrently": "^1.0.1",
- "promise-inflight": "^1.0.1",
- "rimraf": "^2.6.3",
- "ssri": "^6.0.1",
- "unique-filename": "^1.1.1",
- "y18n": "^4.0.0"
- }
- },
- "glob": {
- "version": "7.1.6",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
- "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
- "dev": true,
- "requires": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.0.4",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- }
- },
- "lru-cache": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
- "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
- "dev": true,
- "requires": {
- "yallist": "^3.0.2"
- }
- },
- "schema-utils": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz",
- "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==",
- "dev": true,
- "requires": {
- "ajv": "^6.1.0",
- "ajv-errors": "^1.0.0",
- "ajv-keywords": "^3.1.0"
- }
- },
- "serialize-javascript": {
- "version": "1.9.1",
- "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.9.1.tgz",
- "integrity": "sha512-0Vb/54WJ6k5v8sSWN09S0ora+Hnr+cX40r9F170nT+mSkaxltoE/7R3OrIdBSUv1OoiobH1QoWQbCnAO+e8J1A==",
- "dev": true
- },
- "source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
- "dev": true
- },
- "ssri": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz",
- "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==",
- "dev": true,
- "requires": {
- "figgy-pudding": "^3.5.1"
- }
- },
- "uglify-js": {
- "version": "3.8.0",
- "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.8.0.tgz",
- "integrity": "sha512-ugNSTT8ierCsDHso2jkBHXYrU8Y5/fY2ZUprfrJUiD7YpuFvV4jODLFmb3h4btQjqr5Nh4TX4XtgDfCU1WdioQ==",
- "dev": true,
- "requires": {
- "commander": "~2.20.3",
- "source-map": "~0.6.1"
- }
- },
- "yallist": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
- "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
- "dev": true
- }
- }
- },
- "ultron": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz",
- "integrity": "sha1-rOEWq1V80Zc4ak6I9GhTeMiy5Po="
- },
- "unherit": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/unherit/-/unherit-1.1.3.tgz",
- "integrity": "sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ==",
- "dev": true,
- "requires": {
- "inherits": "^2.0.0",
- "xtend": "^4.0.0"
- }
- },
- "unicode-canonical-property-names-ecmascript": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz",
- "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==",
- "dev": true
- },
- "unicode-match-property-ecmascript": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz",
- "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==",
- "dev": true,
- "requires": {
- "unicode-canonical-property-names-ecmascript": "^1.0.4",
- "unicode-property-aliases-ecmascript": "^1.0.4"
- }
- },
- "unicode-match-property-value-ecmascript": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.1.0.tgz",
- "integrity": "sha512-hDTHvaBk3RmFzvSl0UVrUmC3PuW9wKVnpoUDYH0JDkSIovzw+J5viQmeYHxVSBptubnr7PbH2e0fnpDRQnQl5g==",
- "dev": true
- },
- "unicode-property-aliases-ecmascript": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.5.tgz",
- "integrity": "sha512-L5RAqCfXqAwR3RriF8pM0lU0w4Ryf/GgzONwi6KnL1taJQa7x1TCxdJnILX59WIGOwR57IVxn7Nej0fz1Ny6fw==",
- "dev": true
- },
- "unified": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/unified/-/unified-7.1.0.tgz",
- "integrity": "sha512-lbk82UOIGuCEsZhPj8rNAkXSDXd6p0QLzIuSsCdxrqnqU56St4eyOB+AlXsVgVeRmetPTYydIuvFfpDIed8mqw==",
- "dev": true,
- "requires": {
- "@types/unist": "^2.0.0",
- "@types/vfile": "^3.0.0",
- "bail": "^1.0.0",
- "extend": "^3.0.0",
- "is-plain-obj": "^1.1.0",
- "trough": "^1.0.0",
- "vfile": "^3.0.0",
- "x-is-string": "^0.1.0"
- }
- },
- "union-value": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz",
- "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==",
- "dev": true,
- "requires": {
- "arr-union": "^3.1.0",
- "get-value": "^2.0.6",
- "is-extendable": "^0.1.1",
- "set-value": "^2.0.1"
- }
- },
- "uniq": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz",
- "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=",
- "dev": true
- },
- "unique-filename": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz",
- "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==",
- "dev": true,
- "requires": {
- "unique-slug": "^2.0.0"
- }
- },
- "unique-slug": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz",
- "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==",
- "dev": true,
- "requires": {
- "imurmurhash": "^0.1.4"
- }
- },
- "unist-util-find-all-after": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/unist-util-find-all-after/-/unist-util-find-all-after-1.0.5.tgz",
- "integrity": "sha512-lWgIc3rrTMTlK1Y0hEuL+k+ApzFk78h+lsaa2gHf63Gp5Ww+mt11huDniuaoq1H+XMK2lIIjjPkncxXcDp3QDw==",
- "dev": true,
- "requires": {
- "unist-util-is": "^3.0.0"
- }
- },
- "unist-util-is": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-3.0.0.tgz",
- "integrity": "sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A==",
- "dev": true
- },
- "unist-util-remove-position": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-1.1.4.tgz",
- "integrity": "sha512-tLqd653ArxJIPnKII6LMZwH+mb5q+n/GtXQZo6S6csPRs5zB0u79Yw8ouR3wTw8wxvdJFhpP6Y7jorWdCgLO0A==",
- "dev": true,
- "requires": {
- "unist-util-visit": "^1.1.0"
- }
- },
- "unist-util-stringify-position": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.2.tgz",
- "integrity": "sha512-nK5n8OGhZ7ZgUwoUbL8uiVRwAbZyzBsB/Ddrlbu6jwwubFza4oe15KlyEaLNMXQW1svOQq4xesUeqA85YrIUQA==",
- "dev": true,
- "requires": {
- "@types/unist": "^2.0.2"
- }
- },
- "unist-util-visit": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.1.tgz",
- "integrity": "sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==",
- "dev": true,
- "requires": {
- "unist-util-visit-parents": "^2.0.0"
- }
- },
- "unist-util-visit-parents": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-2.1.2.tgz",
- "integrity": "sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g==",
- "dev": true,
- "requires": {
- "unist-util-is": "^3.0.0"
- }
- },
- "unpipe": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
- "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=",
- "dev": true
- },
- "unset-value": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
- "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=",
- "dev": true,
- "requires": {
- "has-value": "^0.3.1",
- "isobject": "^3.0.0"
- },
- "dependencies": {
- "has-value": {
- "version": "0.3.1",
- "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz",
- "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=",
- "dev": true,
- "requires": {
- "get-value": "^2.0.3",
- "has-values": "^0.1.4",
- "isobject": "^2.0.0"
- },
- "dependencies": {
- "isobject": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
- "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
- "dev": true,
- "requires": {
- "isarray": "1.0.0"
- }
- }
- }
- },
- "has-values": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz",
- "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=",
- "dev": true
- }
- }
- },
- "upath": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz",
- "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==",
- "dev": true
- },
- "upper-case": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz",
- "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=",
- "dev": true
- },
- "uri-js": {
- "version": "4.2.2",
- "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz",
- "integrity": "sha1-lMVA4f93KVbiKZUHwBCupsiDjrA=",
- "dev": true,
- "requires": {
- "punycode": "^2.1.0"
- }
- },
- "urix": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
- "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=",
- "dev": true
- },
- "url": {
- "version": "0.11.0",
- "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz",
- "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=",
- "dev": true,
- "requires": {
- "punycode": "1.3.2",
- "querystring": "0.2.0"
- },
- "dependencies": {
- "punycode": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz",
- "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=",
- "dev": true
- }
- }
- },
- "url-loader": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-2.3.0.tgz",
- "integrity": "sha512-goSdg8VY+7nPZKUEChZSEtW5gjbS66USIGCeSJ1OVOJ7Yfuh/36YxCwMi5HVEJh6mqUYOoy3NJ0vlOMrWsSHog==",
- "dev": true,
- "requires": {
- "loader-utils": "^1.2.3",
- "mime": "^2.4.4",
- "schema-utils": "^2.5.0"
- },
- "dependencies": {
- "mime": {
- "version": "2.4.4",
- "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz",
- "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==",
- "dev": true
- }
- }
- },
- "url-parse": {
- "version": "1.4.7",
- "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.7.tgz",
- "integrity": "sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg==",
- "dev": true,
- "requires": {
- "querystringify": "^2.1.1",
- "requires-port": "^1.0.0"
- }
- },
- "use": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz",
- "integrity": "sha1-1QyMrHmhn7wg8pEfVuuXP04QBw8=",
- "dev": true
- },
- "util": {
- "version": "0.11.1",
- "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz",
- "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==",
- "dev": true,
- "requires": {
- "inherits": "2.0.3"
- },
- "dependencies": {
- "inherits": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
- "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
- "dev": true
- }
- }
- },
- "util-deprecate": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
- "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
- },
- "util.promisify": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz",
- "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==",
- "dev": true,
- "requires": {
- "define-properties": "^1.1.2",
- "object.getownpropertydescriptors": "^2.0.3"
- }
- },
- "utila": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz",
- "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=",
- "dev": true
- },
- "utils-merge": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
- "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=",
- "dev": true
- },
- "uuid": {
- "version": "3.4.0",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
- "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
- "dev": true
- },
- "v-accordion": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/v-accordion/-/v-accordion-1.6.0.tgz",
- "integrity": "sha1-8KiaFsLWlcEe4sq4uptRkevIthM="
- },
- "v8-compile-cache": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz",
- "integrity": "sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==",
- "dev": true
- },
- "v8flags": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.1.3.tgz",
- "integrity": "sha512-amh9CCg3ZxkzQ48Mhcb8iX7xpAfYJgePHxWMQCBWECpOSqJUXgY26ncA61UTV0BkPqfhcy6mzwCIoP4ygxpW8w==",
- "dev": true,
- "requires": {
- "homedir-polyfill": "^1.0.1"
- }
- },
- "validate-npm-package-license": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
- "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
- "dev": true,
- "requires": {
- "spdx-correct": "^3.0.0",
- "spdx-expression-parse": "^3.0.0"
- }
- },
- "vary": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
- "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=",
- "dev": true
- },
- "verror": {
- "version": "1.10.0",
- "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
- "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
- "dev": true,
- "requires": {
- "assert-plus": "^1.0.0",
- "core-util-is": "1.0.2",
- "extsprintf": "^1.2.0"
- }
- },
- "vfile": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/vfile/-/vfile-3.0.1.tgz",
- "integrity": "sha512-y7Y3gH9BsUSdD4KzHsuMaCzRjglXN0W2EcMf0gpvu6+SbsGhMje7xDc8AEoeXy6mIwCKMI6BkjMsRjzQbhMEjQ==",
- "dev": true,
- "requires": {
- "is-buffer": "^2.0.0",
- "replace-ext": "1.0.0",
- "unist-util-stringify-position": "^1.0.0",
- "vfile-message": "^1.0.0"
- },
- "dependencies": {
- "is-buffer": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz",
- "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==",
- "dev": true
- },
- "unist-util-stringify-position": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-1.1.2.tgz",
- "integrity": "sha512-pNCVrk64LZv1kElr0N1wPiHEUoXNVFERp+mlTg/s9R5Lwg87f9bM/3sQB99w+N9D/qnM9ar3+AKDBwo/gm/iQQ==",
- "dev": true
- },
- "vfile-message": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-1.1.1.tgz",
- "integrity": "sha512-1WmsopSGhWt5laNir+633LszXvZ+Z/lxveBf6yhGsqnQIhlhzooZae7zV6YVM1Sdkw68dtAW3ow0pOdPANugvA==",
- "dev": true,
- "requires": {
- "unist-util-stringify-position": "^1.1.1"
- }
- }
- }
- },
- "vfile-location": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-2.0.6.tgz",
- "integrity": "sha512-sSFdyCP3G6Ka0CEmN83A2YCMKIieHx0EDaj5IDP4g1pa5ZJ4FJDvpO0WODLxo4LUX4oe52gmSCK7Jw4SBghqxA==",
- "dev": true
- },
- "vfile-message": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.2.tgz",
- "integrity": "sha512-gNV2Y2fDvDOOqq8bEe7cF3DXU6QgV4uA9zMR2P8tix11l1r7zju3zry3wZ8sx+BEfuO6WQ7z2QzfWTvqHQiwsA==",
- "dev": true,
- "requires": {
- "@types/unist": "^2.0.0",
- "unist-util-stringify-position": "^2.0.0"
- }
- },
- "vm-browserify": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz",
- "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==",
- "dev": true
- },
- "w3c-blob": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/w3c-blob/-/w3c-blob-0.0.1.tgz",
- "integrity": "sha1-sM01KhpQ9RVWNCD/1YYflQ8dhbg="
- },
- "warning": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz",
- "integrity": "sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w=",
- "requires": {
- "loose-envify": "^1.0.0"
- }
- },
- "watchpack": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz",
- "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==",
- "dev": true,
- "requires": {
- "chokidar": "^2.0.2",
- "graceful-fs": "^4.1.2",
- "neo-async": "^2.5.0"
- }
- },
- "wbuf": {
- "version": "1.7.3",
- "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz",
- "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==",
- "dev": true,
- "requires": {
- "minimalistic-assert": "^1.0.0"
- }
- },
- "wcwidth": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz",
- "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=",
- "requires": {
- "defaults": "^1.0.3"
- }
- },
- "webpack": {
- "version": "4.41.6",
- "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.41.6.tgz",
- "integrity": "sha512-yxXfV0Zv9WMGRD+QexkZzmGIh54bsvEs+9aRWxnN8erLWEOehAKUTeNBoUbA6HPEZPlRo7KDi2ZcNveoZgK9MA==",
- "dev": true,
- "requires": {
- "@webassemblyjs/ast": "1.8.5",
- "@webassemblyjs/helper-module-context": "1.8.5",
- "@webassemblyjs/wasm-edit": "1.8.5",
- "@webassemblyjs/wasm-parser": "1.8.5",
- "acorn": "^6.2.1",
- "ajv": "^6.10.2",
- "ajv-keywords": "^3.4.1",
- "chrome-trace-event": "^1.0.2",
- "enhanced-resolve": "^4.1.0",
- "eslint-scope": "^4.0.3",
- "json-parse-better-errors": "^1.0.2",
- "loader-runner": "^2.4.0",
- "loader-utils": "^1.2.3",
- "memory-fs": "^0.4.1",
- "micromatch": "^3.1.10",
- "mkdirp": "^0.5.1",
- "neo-async": "^2.6.1",
- "node-libs-browser": "^2.2.1",
- "schema-utils": "^1.0.0",
- "tapable": "^1.1.3",
- "terser-webpack-plugin": "^1.4.3",
- "watchpack": "^1.6.0",
- "webpack-sources": "^1.4.1"
- },
- "dependencies": {
- "acorn": {
- "version": "6.4.0",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.0.tgz",
- "integrity": "sha512-gac8OEcQ2Li1dxIEWGZzsp2BitJxwkwcOm0zHAJLcPJaVvm58FRnk6RkuLRpU1EujipU2ZFODv2P9DLMfnV8mw==",
- "dev": true
- },
- "eslint-scope": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz",
- "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==",
- "dev": true,
- "requires": {
- "esrecurse": "^4.1.0",
- "estraverse": "^4.1.1"
- }
- },
- "schema-utils": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz",
- "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==",
- "dev": true,
- "requires": {
- "ajv": "^6.1.0",
- "ajv-errors": "^1.0.0",
- "ajv-keywords": "^3.1.0"
- }
- }
- }
- },
- "webpack-cli": {
- "version": "3.3.11",
- "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.3.11.tgz",
- "integrity": "sha512-dXlfuml7xvAFwYUPsrtQAA9e4DOe58gnzSxhgrO/ZM/gyXTBowrsYeubyN4mqGhYdpXMFNyQ6emjJS9M7OBd4g==",
- "dev": true,
- "requires": {
- "chalk": "2.4.2",
- "cross-spawn": "6.0.5",
- "enhanced-resolve": "4.1.0",
- "findup-sync": "3.0.0",
- "global-modules": "2.0.0",
- "import-local": "2.0.0",
- "interpret": "1.2.0",
- "loader-utils": "1.2.3",
- "supports-color": "6.1.0",
- "v8-compile-cache": "2.0.3",
- "yargs": "13.2.4"
- },
- "dependencies": {
- "ansi-regex": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
- "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
- "dev": true
- },
- "ansi-styles": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
- "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
- "dev": true,
- "requires": {
- "color-convert": "^1.9.0"
- }
- },
- "chalk": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
- "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
- "dev": true,
- "requires": {
- "ansi-styles": "^3.2.1",
- "escape-string-regexp": "^1.0.5",
- "supports-color": "^5.3.0"
- },
- "dependencies": {
- "supports-color": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
- "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
- "dev": true,
- "requires": {
- "has-flag": "^3.0.0"
- }
- }
- }
- },
- "cliui": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz",
- "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==",
- "dev": true,
- "requires": {
- "string-width": "^3.1.0",
- "strip-ansi": "^5.2.0",
- "wrap-ansi": "^5.1.0"
- }
- },
- "emoji-regex": {
- "version": "7.0.3",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
- "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
- "dev": true
- },
- "emojis-list": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz",
- "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=",
- "dev": true
- },
- "enhanced-resolve": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz",
- "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==",
- "dev": true,
- "requires": {
- "graceful-fs": "^4.1.2",
- "memory-fs": "^0.4.0",
- "tapable": "^1.0.0"
- }
- },
- "get-caller-file": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
- "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
- "dev": true
- },
- "invert-kv": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz",
- "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==",
- "dev": true
- },
- "json5": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
- "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
- "dev": true,
- "requires": {
- "minimist": "^1.2.0"
- }
- },
- "lcid": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz",
- "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==",
- "dev": true,
- "requires": {
- "invert-kv": "^2.0.0"
- }
- },
- "loader-utils": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz",
- "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==",
- "dev": true,
- "requires": {
- "big.js": "^5.2.2",
- "emojis-list": "^2.0.0",
- "json5": "^1.0.1"
- }
- },
- "os-locale": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz",
- "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==",
- "dev": true,
- "requires": {
- "execa": "^1.0.0",
- "lcid": "^2.0.0",
- "mem": "^4.0.0"
- }
- },
- "require-main-filename": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
- "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==",
- "dev": true
- },
- "string-width": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
- "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
- "dev": true,
- "requires": {
- "emoji-regex": "^7.0.1",
- "is-fullwidth-code-point": "^2.0.0",
- "strip-ansi": "^5.1.0"
- }
- },
- "strip-ansi": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
- "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
- "dev": true,
- "requires": {
- "ansi-regex": "^4.1.0"
- }
- },
- "supports-color": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
- "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
- "dev": true,
- "requires": {
- "has-flag": "^3.0.0"
- }
- },
- "v8-compile-cache": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.0.3.tgz",
- "integrity": "sha512-CNmdbwQMBjwr9Gsmohvm0pbL954tJrNzf6gWL3K+QMQf00PF7ERGrEiLgjuU3mKreLC2MeGhUsNV9ybTbLgd3w==",
- "dev": true
- },
- "which-module": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
- "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=",
- "dev": true
- },
- "wrap-ansi": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz",
- "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==",
- "dev": true,
- "requires": {
- "ansi-styles": "^3.2.0",
- "string-width": "^3.0.0",
- "strip-ansi": "^5.0.0"
- }
- },
- "yargs": {
- "version": "13.2.4",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.2.4.tgz",
- "integrity": "sha512-HG/DWAJa1PAnHT9JAhNa8AbAv3FPaiLzioSjCcmuXXhP8MlpHO5vwls4g4j6n30Z74GVQj8Xa62dWVx1QCGklg==",
- "dev": true,
- "requires": {
- "cliui": "^5.0.0",
- "find-up": "^3.0.0",
- "get-caller-file": "^2.0.1",
- "os-locale": "^3.1.0",
- "require-directory": "^2.1.1",
- "require-main-filename": "^2.0.0",
- "set-blocking": "^2.0.0",
- "string-width": "^3.0.0",
- "which-module": "^2.0.0",
- "y18n": "^4.0.0",
- "yargs-parser": "^13.1.0"
- }
- },
- "yargs-parser": {
- "version": "13.1.1",
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz",
- "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==",
- "dev": true,
- "requires": {
- "camelcase": "^5.0.0",
- "decamelize": "^1.2.0"
- }
- }
- }
- },
- "webpack-dev-middleware": {
- "version": "3.7.2",
- "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.2.tgz",
- "integrity": "sha512-1xC42LxbYoqLNAhV6YzTYacicgMZQTqRd27Sim9wn5hJrX3I5nxYy1SxSd4+gjUFsz1dQFj+yEe6zEVmSkeJjw==",
- "dev": true,
- "requires": {
- "memory-fs": "^0.4.1",
- "mime": "^2.4.4",
- "mkdirp": "^0.5.1",
- "range-parser": "^1.2.1",
- "webpack-log": "^2.0.0"
- },
- "dependencies": {
- "mime": {
- "version": "2.4.4",
- "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz",
- "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==",
- "dev": true
- }
- }
- },
- "webpack-dev-server": {
- "version": "3.10.3",
- "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.10.3.tgz",
- "integrity": "sha512-e4nWev8YzEVNdOMcNzNeCN947sWJNd43E5XvsJzbAL08kGc2frm1tQ32hTJslRS+H65LCb/AaUCYU7fjHCpDeQ==",
- "dev": true,
- "requires": {
- "ansi-html": "0.0.7",
- "bonjour": "^3.5.0",
- "chokidar": "^2.1.8",
- "compression": "^1.7.4",
- "connect-history-api-fallback": "^1.6.0",
- "debug": "^4.1.1",
- "del": "^4.1.1",
- "express": "^4.17.1",
- "html-entities": "^1.2.1",
- "http-proxy-middleware": "0.19.1",
- "import-local": "^2.0.0",
- "internal-ip": "^4.3.0",
- "ip": "^1.1.5",
- "is-absolute-url": "^3.0.3",
- "killable": "^1.0.1",
- "loglevel": "^1.6.6",
- "opn": "^5.5.0",
- "p-retry": "^3.0.1",
- "portfinder": "^1.0.25",
- "schema-utils": "^1.0.0",
- "selfsigned": "^1.10.7",
- "semver": "^6.3.0",
- "serve-index": "^1.9.1",
- "sockjs": "0.3.19",
- "sockjs-client": "1.4.0",
- "spdy": "^4.0.1",
- "strip-ansi": "^3.0.1",
- "supports-color": "^6.1.0",
- "url": "^0.11.0",
- "webpack-dev-middleware": "^3.7.2",
- "webpack-log": "^2.0.0",
- "ws": "^6.2.1",
- "yargs": "12.0.5"
- },
- "dependencies": {
- "ansi-regex": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
- "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
- "dev": true
- },
- "cliui": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz",
- "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==",
- "dev": true,
- "requires": {
- "string-width": "^2.1.1",
- "strip-ansi": "^4.0.0",
- "wrap-ansi": "^2.0.0"
- },
- "dependencies": {
- "strip-ansi": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
- "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
- "dev": true,
- "requires": {
- "ansi-regex": "^3.0.0"
- }
- }
- }
- },
- "debug": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
- "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
- "dev": true,
- "requires": {
- "ms": "^2.1.1"
- }
- },
- "invert-kv": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz",
- "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==",
- "dev": true
- },
- "lcid": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz",
- "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==",
- "dev": true,
- "requires": {
- "invert-kv": "^2.0.0"
- }
- },
- "ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
- "dev": true
- },
- "opn": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz",
- "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==",
- "dev": true,
- "requires": {
- "is-wsl": "^1.1.0"
- }
- },
- "os-locale": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz",
- "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==",
- "dev": true,
- "requires": {
- "execa": "^1.0.0",
- "lcid": "^2.0.0",
- "mem": "^4.0.0"
- }
- },
- "schema-utils": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz",
- "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==",
- "dev": true,
- "requires": {
- "ajv": "^6.1.0",
- "ajv-errors": "^1.0.0",
- "ajv-keywords": "^3.1.0"
- }
- },
- "semver": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
- "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
- "dev": true
- },
- "supports-color": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
- "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
- "dev": true,
- "requires": {
- "has-flag": "^3.0.0"
- }
- },
- "which-module": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
- "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=",
- "dev": true
- },
- "ws": {
- "version": "6.2.1",
- "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz",
- "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==",
- "dev": true,
- "requires": {
- "async-limiter": "~1.0.0"
- }
- },
- "yargs": {
- "version": "12.0.5",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz",
- "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==",
- "dev": true,
- "requires": {
- "cliui": "^4.0.0",
- "decamelize": "^1.2.0",
- "find-up": "^3.0.0",
- "get-caller-file": "^1.0.1",
- "os-locale": "^3.0.0",
- "require-directory": "^2.1.1",
- "require-main-filename": "^1.0.1",
- "set-blocking": "^2.0.0",
- "string-width": "^2.0.0",
- "which-module": "^2.0.0",
- "y18n": "^3.2.1 || ^4.0.0",
- "yargs-parser": "^11.1.1"
- }
- },
- "yargs-parser": {
- "version": "11.1.1",
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz",
- "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==",
- "dev": true,
- "requires": {
- "camelcase": "^5.0.0",
- "decamelize": "^1.2.0"
- }
- }
- }
- },
- "webpack-hot-middleware": {
- "version": "2.25.0",
- "resolved": "https://registry.npmjs.org/webpack-hot-middleware/-/webpack-hot-middleware-2.25.0.tgz",
- "integrity": "sha512-xs5dPOrGPCzuRXNi8F6rwhawWvQQkeli5Ro48PRuQh8pYPCPmNnltP9itiUPT4xI8oW+y0m59lyyeQk54s5VgA==",
- "dev": true,
- "requires": {
- "ansi-html": "0.0.7",
- "html-entities": "^1.2.0",
- "querystring": "^0.2.0",
- "strip-ansi": "^3.0.0"
- }
- },
- "webpack-log": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz",
- "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==",
- "dev": true,
- "requires": {
- "ansi-colors": "^3.0.0",
- "uuid": "^3.3.2"
- }
- },
- "webpack-material-design-icons": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/webpack-material-design-icons/-/webpack-material-design-icons-0.1.0.tgz",
- "integrity": "sha1-K0g5nxSBf3M9mRQ8l7gAjzQtL9Q=",
- "dev": true,
- "requires": {
- "material-design-icons": "^3.0.1"
- }
- },
- "webpack-sources": {
- "version": "1.4.3",
- "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz",
- "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==",
- "dev": true,
- "requires": {
- "source-list-map": "^2.0.0",
- "source-map": "~0.6.1"
- },
- "dependencies": {
- "source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
- "dev": true
- }
- }
- },
- "websocket-driver": {
- "version": "0.7.3",
- "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.3.tgz",
- "integrity": "sha512-bpxWlvbbB459Mlipc5GBzzZwhoZgGEZLuqPaR0INBGnPAY1vdBX6hPnoFXiw+3yWxDuHyQjO2oXTMyS8A5haFg==",
- "dev": true,
- "requires": {
- "http-parser-js": ">=0.4.0 <0.4.11",
- "safe-buffer": ">=5.1.0",
- "websocket-extensions": ">=0.1.1"
- }
- },
- "websocket-extensions": {
- "version": "0.1.3",
- "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz",
- "integrity": "sha1-XS/yKXcAPsaHpLhwc9+7rBRszyk=",
- "dev": true
- },
- "whatwg-fetch": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz",
- "integrity": "sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q=="
- },
- "which": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
- "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
- "dev": true,
- "requires": {
- "isexe": "^2.0.0"
- }
- },
- "which-module": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz",
- "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=",
- "dev": true
- },
- "wide-align": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz",
- "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==",
- "dev": true,
- "requires": {
- "string-width": "^1.0.2 || 2"
- }
- },
- "word-wrap": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
- "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
- "dev": true
- },
- "wordwrap": {
- "version": "0.0.3",
- "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz",
- "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=",
- "dev": true
- },
- "worker-farm": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz",
- "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==",
- "dev": true,
- "requires": {
- "errno": "~0.1.7"
- }
- },
- "wrap-ansi": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz",
- "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=",
- "dev": true,
- "requires": {
- "string-width": "^1.0.1",
- "strip-ansi": "^3.0.1"
- },
- "dependencies": {
- "is-fullwidth-code-point": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
- "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
- "dev": true,
- "requires": {
- "number-is-nan": "^1.0.0"
- }
- },
- "string-width": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
- "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
- "dev": true,
- "requires": {
- "code-point-at": "^1.0.0",
- "is-fullwidth-code-point": "^1.0.0",
- "strip-ansi": "^3.0.0"
- }
- }
- }
- },
- "wrappy": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
- "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
- },
- "write": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz",
- "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==",
- "dev": true,
- "requires": {
- "mkdirp": "^0.5.1"
- }
- },
- "write-file-atomic": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.1.tgz",
- "integrity": "sha512-JPStrIyyVJ6oCSz/691fAjFtefZ6q+fP6tm+OS4Qw6o+TGQxNp1ziY2PgS+X/m0V8OWhZiO/m4xSj+Pr4RrZvw==",
- "dev": true,
- "requires": {
- "imurmurhash": "^0.1.4",
- "is-typedarray": "^1.0.0",
- "signal-exit": "^3.0.2",
- "typedarray-to-buffer": "^3.1.5"
- }
- },
- "ws": {
- "version": "1.1.5",
- "resolved": "https://registry.npmjs.org/ws/-/ws-1.1.5.tgz",
- "integrity": "sha1-y9nm514J/F0skAFfIfDECHXg3VE=",
- "requires": {
- "options": ">=0.0.5",
- "ultron": "1.0.x"
- }
- },
- "x-is-string": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/x-is-string/-/x-is-string-0.1.0.tgz",
- "integrity": "sha1-R0tQhlrzpJqcRlfwWs0UVFj3fYI=",
- "dev": true
- },
- "xtend": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
- "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
- "dev": true
- },
- "y18n": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz",
- "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==",
- "dev": true
- },
- "yallist": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
- "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI="
- },
- "yaml": {
- "version": "1.7.2",
- "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.7.2.tgz",
- "integrity": "sha512-qXROVp90sb83XtAoqE8bP9RwAkTTZbugRUTm5YeFCBfNRPEp2YzTeqWiz7m5OORHzEvrA/qcGS8hp/E+MMROYw==",
- "dev": true,
- "requires": {
- "@babel/runtime": "^7.6.3"
- }
- },
- "yargs": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz",
- "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=",
- "dev": true,
- "requires": {
- "camelcase": "^3.0.0",
- "cliui": "^3.2.0",
- "decamelize": "^1.1.1",
- "get-caller-file": "^1.0.1",
- "os-locale": "^1.4.0",
- "read-pkg-up": "^1.0.1",
- "require-directory": "^2.1.1",
- "require-main-filename": "^1.0.1",
- "set-blocking": "^2.0.0",
- "string-width": "^1.0.2",
- "which-module": "^1.0.0",
- "y18n": "^3.2.1",
- "yargs-parser": "^5.0.0"
- },
- "dependencies": {
- "camelcase": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz",
- "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=",
- "dev": true
- },
- "find-up": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz",
- "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=",
- "dev": true,
- "requires": {
- "path-exists": "^2.0.0",
- "pinkie-promise": "^2.0.0"
- }
- },
- "is-fullwidth-code-point": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
- "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
- "dev": true,
- "requires": {
- "number-is-nan": "^1.0.0"
- }
- },
- "load-json-file": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
- "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=",
- "dev": true,
- "requires": {
- "graceful-fs": "^4.1.2",
- "parse-json": "^2.2.0",
- "pify": "^2.0.0",
- "pinkie-promise": "^2.0.0",
- "strip-bom": "^2.0.0"
- }
- },
- "path-exists": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz",
- "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=",
- "dev": true,
- "requires": {
- "pinkie-promise": "^2.0.0"
- }
- },
- "path-type": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz",
- "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=",
- "dev": true,
- "requires": {
- "graceful-fs": "^4.1.2",
- "pify": "^2.0.0",
- "pinkie-promise": "^2.0.0"
- }
- },
- "pify": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
- "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
- "dev": true
- },
- "read-pkg": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz",
- "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=",
- "dev": true,
- "requires": {
- "load-json-file": "^1.0.0",
- "normalize-package-data": "^2.3.2",
- "path-type": "^1.0.0"
- }
- },
- "read-pkg-up": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz",
- "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=",
- "dev": true,
- "requires": {
- "find-up": "^1.0.0",
- "read-pkg": "^1.0.0"
- }
- },
- "string-width": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
- "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
- "dev": true,
- "requires": {
- "code-point-at": "^1.0.0",
- "is-fullwidth-code-point": "^1.0.0",
- "strip-ansi": "^3.0.0"
- }
- },
- "strip-bom": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz",
- "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
- "dev": true,
- "requires": {
- "is-utf8": "^0.2.0"
- }
- },
- "y18n": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz",
- "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=",
- "dev": true
- }
- }
- },
- "yargs-parser": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz",
- "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=",
- "dev": true,
- "requires": {
- "camelcase": "^3.0.0"
- },
- "dependencies": {
- "camelcase": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz",
- "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=",
- "dev": true
- }
- }
- }
- }
-}
diff --git a/ui/package.json b/ui/package.json
deleted file mode 100644
index 6181e70de0..0000000000
--- a/ui/package.json
+++ /dev/null
@@ -1,179 +0,0 @@
-{
- "name": "thingsboard",
- "private": true,
- "version": "2.5.0",
- "description": "ThingsBoard UI",
- "licenses": [
- {
- "type": "Apache-2.0",
- "url": "http://www.apache.org/licenses/LICENSE-2.0"
- }
- ],
- "scripts": {
- "start": "babel-node --max_old_space_size=4096 server.js",
- "build": "cross-env NODE_OPTIONS=--max_old_space_size=4096 NODE_ENV=production webpack"
- },
- "dependencies": {
- "@flowjs/ng-flow": "^2.7.1",
- "angular": "1.5.8",
- "angular-animate": "1.5.8",
- "angular-aria": "1.5.8",
- "angular-breadcrumb": "^0.4.1",
- "angular-carousel": "^1.0.1",
- "angular-cookies": "1.5.8",
- "angular-drag-and-drop-lists": "^1.4.0",
- "angular-fixed-table-header": "^0.2.1",
- "angular-fullscreen": "git://github.com/fabiobiondi/angular-fullscreen.git#master",
- "angular-gridster": "^0.13.14",
- "angular-hotkeys": "^1.7.0",
- "angular-jwt": "^0.1.11",
- "angular-material": "1.1.19",
- "angular-material-data-table": "^0.10.9",
- "angular-material-expansion-panel": "^0.7.2",
- "angular-material-icons": "^0.7.1",
- "angular-messages": "1.5.8",
- "angular-route": "1.5.8",
- "angular-sanitize": "1.5.8",
- "angular-socialshare": "^2.3.8",
- "angular-storage": "0.0.15",
- "angular-touch": "1.5.8",
- "angular-translate": "2.18.1",
- "angular-translate-handler-log": "2.18.1",
- "angular-translate-interpolation-messageformat": "2.18.1",
- "angular-translate-loader-static-files": "2.18.1",
- "angular-translate-storage-cookie": "2.18.1",
- "angular-translate-storage-local": "2.18.1",
- "angular-ui-ace": "^0.2.3",
- "angular-ui-router": "^0.3.1",
- "angular-websocket": "^2.0.1",
- "base64-js": "^1.2.1",
- "brace": "^0.10.0",
- "canvas-gauges": "^2.0.9",
- "clipboard": "^1.5.15",
- "compass-sass-mixins": "^0.12.7",
- "event-source-polyfill": "0.0.9",
- "flot": "git://github.com/thingsboard/flot.git#0.9-work",
- "flot.curvedlines": "git://github.com/MichaelZinsmaier/CurvedLines.git#master",
- "font-awesome": "^4.6.3",
- "javascript-detect-element-resize": "^0.5.3",
- "jquery": "^3.4.1",
- "jquery.terminal": "^1.5.0",
- "js-beautify": "^1.10.0",
- "json-schema-defaults": "^0.2.0",
- "jstree": "^3.3.8",
- "jszip": "^3.2.2",
- "jstree-bootstrap-theme": "^1.0.1",
- "leaflet": "^1.5.1",
- "leaflet-polylinedecorator": "^1.6.0",
- "leaflet-providers": "^1.8.0",
- "leaflet.markercluster": "^1.4.1",
- "material-steppers": "git://github.com/thingsboard/material-steppers.git#master",
- "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.24.0",
- "ngFlowchart": "git://github.com/thingsboard/ngFlowchart.git#master",
- "ngclipboard": "^1.1.1",
- "ngreact": "^0.3.0",
- "objectpath": "^1.2.1",
- "oclazyload": "^1.0.9",
- "raphael": "^2.2.8",
- "rc-select": "^6.6.1",
- "react": "^15.4.1",
- "react-ace": "^4.1.0",
- "react-dom": "^15.4.1",
- "react-dropzone": "^3.7.3",
- "react-schema-form": "^0.3.1",
- "react-tap-event-plugin": "^2.0.1",
- "reactcss": "^1.0.9",
- "sass-material-colors": "0.0.5",
- "schema-inspector": "^1.6.6",
- "split.js": "1.3.5",
- "tinycolor2": "^1.4.1",
- "tooltipster": "^4.2.4",
- "typeface-roboto": "0.0.22",
- "v-accordion": "^1.6.0"
- },
- "devDependencies": {
- "@babel/cli": "^7.5.5",
- "@babel/core": "^7.5.5",
- "@babel/node": "^7.5.5",
- "@babel/preset-env": "^7.5.5",
- "@babel/preset-react": "^7.0.0",
- "babel-eslint": "^10.0.2",
- "babel-loader": "^8.0.6",
- "browserslist": "^4.6.6",
- "compression-webpack-plugin": "^3.0.0",
- "connect-history-api-fallback": "^1.6.0",
- "copy-webpack-plugin": "^5.0.3",
- "cross-env": "^5.2.0",
- "css-loader": "^3.1.0",
- "directory-tree": "^2.2.3",
- "eslint": "^6.0.1",
- "eslint-config-angular": "^0.5.0",
- "eslint-loader": "^2.2.1",
- "eslint-plugin-angular": "^4.0.1",
- "eslint-plugin-import": "^2.18.1",
- "file-loader": "^4.1.0",
- "html-loader": "^0.5.5",
- "html-minifier": "^4.0.0",
- "html-minifier-loader": "^1.4.1",
- "html-webpack-plugin": "^3.2.0",
- "imagemin": "^6.0.0",
- "img-loader": "^3.0.1",
- "jsonminify": "^0.4.1",
- "less": "^3.9.0",
- "less-loader": "^5.0.0",
- "mini-css-extract-plugin": "^0.8.0",
- "ng-annotate-loader": "^0.6.1",
- "ng-annotate-patched": "^1.10.0",
- "ngtemplate-loader": "^2.0.1",
- "node-sass": "^4.12.0",
- "postcss-loader": "^3.0.0",
- "raw-loader": "^3.1.0",
- "react-hot-loader": "^4.12.8",
- "sass-loader": "^7.1.0",
- "style-loader": "^0.23.1",
- "stylelint": "13.0.0",
- "stylelint-config-recommended-scss": "4.1.0",
- "stylelint-config-standard": "19.0.0",
- "stylelint-order": "4.0.0",
- "stylelint-scss": "3.13.0",
- "stylelint-webpack-plugin": "^1.2.1",
- "uglifyjs-webpack-plugin": "^2.1.3",
- "url-loader": "^2.1.0",
- "webpack": "^4.37.0",
- "webpack-cli": "^3.3.6",
- "webpack-dev-middleware": "^3.7.0",
- "webpack-dev-server": "^3.7.2",
- "webpack-hot-middleware": "^2.25.0",
- "webpack-material-design-icons": "^0.1.0"
- },
- "engines": {
- "node": ">=8.0.0 <11.0.0"
- },
- "nyc": {
- "exclude": [
- "test",
- "__tests__",
- "node_modules",
- "target"
- ]
- },
- "browserslist": [
- "> 0.5%",
- "last 2 versions",
- "Firefox ESR",
- "not ie <= 10",
- "not ie_mob <= 10",
- "not bb <= 10",
- "not op_mob <= 12.1"
- ],
- "postcss": {
- "plugins": {
- "autoprefixer": true
- }
- }
-}
diff --git a/ui/pom.xml b/ui/pom.xml
deleted file mode 100644
index fc652eebea..0000000000
--- a/ui/pom.xml
+++ /dev/null
@@ -1,142 +0,0 @@
-
-
- 4.0.0
-
- org.thingsboard
- 2.5.0-SNAPSHOT
- thingsboard
-
- org.thingsboard
- ui
- jar
-
- Thingsboard Server UI
- https://thingsboard.io
-
-
- UTF-8
- ${basedir}/..
-
-
-
-
-
- ${project.build.directory}/generated-resources
-
-
-
-
- com.github.eirslett
- frontend-maven-plugin
- 1.0
-
- target
- ${basedir}
-
-
-
- install node and npm
-
- install-node-and-npm
-
-
- v10.16.0
- 6.4.1
-
-
-
- npm install
-
- npm
-
-
- install
-
-
-
-
-
-
-
-
- npm-build
-
- true
-
-
-
-
- com.github.eirslett
- frontend-maven-plugin
- 1.0
-
- target
- ${basedir}
-
-
-
- npm build
-
- npm
-
-
- run build
-
-
-
-
-
-
-
-
- npm-start
-
-
- npm-start
-
-
-
-
-
- com.github.eirslett
- frontend-maven-plugin
- 1.0
-
- target
- ${basedir}
-
-
-
- npm start
-
- npm
-
-
-
- start
-
-
-
-
-
-
-
-
-
diff --git a/ui/server.js b/ui/server.js
deleted file mode 100644
index e6cb1d650d..0000000000
--- a/ui/server.js
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-/* eslint-disable import/no-commonjs */
-/* eslint-disable global-require */
-/* eslint-disable import/no-nodejs-modules */
-
-const path = require('path');
-const webpack = require('webpack');
-const historyApiFallback = require("connect-history-api-fallback");
-const webpackDevMiddleware = require('webpack-dev-middleware');
-const webpackHotMiddleware = require('webpack-hot-middleware');
-const config = require('./webpack.config');
-
-const express = require('express');
-const http = require('http');
-const httpProxy = require('http-proxy');
-const forwardHost = 'localhost';
-const forwardPort = 8080;
-
-const ruleNodeUiforwardHost = 'localhost';
-const ruleNodeUiforwardPort = 8080;
-
-const app = express();
-const server = http.createServer(app);
-
-const PORT = 3000;
-
-const compiler = webpack(config);
-
-app.use(historyApiFallback());
-app.use(webpackDevMiddleware(compiler, {noInfo: true, publicPath: config.output.publicPath}));
-app.use(webpackHotMiddleware(compiler));
-
-const root = path.join(__dirname, '/src');
-
-app.use('/static', express.static(root));
-
-const apiProxy = httpProxy.createProxyServer({
- target: {
- host: forwardHost,
- port: forwardPort
- }
-});
-
-const ruleNodeUiApiProxy = httpProxy.createProxyServer({
- target: {
- host: ruleNodeUiforwardHost,
- port: ruleNodeUiforwardPort
- }
-});
-
-apiProxy.on('error', function (err, req, res) {
- console.warn('API proxy error: ' + err);
- res.end('Error.');
-});
-
-ruleNodeUiApiProxy.on('error', function (err, req, res) {
- console.warn('RuleNode UI API proxy error: ' + err);
- res.end('Error.');
-});
-
-console.info(`Forwarding API requests to http://${forwardHost}:${forwardPort}`);
-console.info(`Forwarding Rule Node UI requests to http://${ruleNodeUiforwardHost}:${ruleNodeUiforwardPort}`);
-
-app.all('/api/*', (req, res) => {
- apiProxy.web(req, res);
-});
-
-app.all('/static/rulenode/*', (req, res) => {
- ruleNodeUiApiProxy.web(req, res);
-});
-
-app.get('*', function(req, res) {
- res.sendFile(path.join(__dirname, 'src/index.html'));
-});
-
-server.on('upgrade', (req, socket, head) => {
- apiProxy.ws(req, socket, head);
-});
-
-server.listen(PORT, '0.0.0.0', (error) => {
- if (error) {
- console.error(error);
- } else {
- console.info(`==> 🌎 Listening on port ${PORT}. Open up http://localhost:${PORT}/ in your browser.`);
- }
-});
diff --git a/ui/src/app/admin/admin.controller.js b/ui/src/app/admin/admin.controller.js
deleted file mode 100644
index 8a2f04c621..0000000000
--- a/ui/src/app/admin/admin.controller.js
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Copyright © 2016-2020 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 './settings-card.scss';
-
-/*@ngInject*/
-export default function AdminController(adminService, toast, $scope, $rootScope, $state, $translate) {
-
- var vm = this;
- vm.save = save;
- vm.sendTestMail = sendTestMail;
- vm.smtpProtocols = ('smtp smtps').split(' ').map(function (protocol) {
- return protocol;
- });
-
- vm.tlsVersions = ['TLSv1', 'TLSv1.1', 'TLSv1.2', 'TLSv1.3'];
-
- $translate('admin.test-mail-sent').then(function (translation) {
- vm.testMailSent = translation;
- }, function (translationId) {
- vm.testMailSent = translationId;
- });
-
-
- loadSettings();
-
- function loadSettings() {
- adminService.getAdminSettings($state.$current.data.key).then(function success(settings) {
- vm.settings = settings;
- });
- }
-
- function save() {
- adminService.saveAdminSettings(vm.settings).then(function success(settings) {
- vm.settings = settings;
- vm.settingsForm.$setPristine();
- });
- }
-
- function sendTestMail() {
- adminService.sendTestMail(vm.settings).then(function success() {
- toast.showSuccess($translate.instant('admin.test-mail-sent'));
- });
- }
-
-}
diff --git a/ui/src/app/admin/admin.routes.js b/ui/src/app/admin/admin.routes.js
deleted file mode 100644
index c35117e27c..0000000000
--- a/ui/src/app/admin/admin.routes.js
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-/* eslint-disable import/no-unresolved, import/default */
-
-import generalSettingsTemplate from '../admin/general-settings.tpl.html';
-import outgoingMailSettingsTemplate from '../admin/outgoing-mail-settings.tpl.html';
-import securitySettingsTemplate from '../admin/security-settings.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-/*@ngInject*/
-export default function AdminRoutes($stateProvider) {
- $stateProvider
- .state('home.settings', {
- url: '/settings',
- module: 'private',
- auth: ['SYS_ADMIN'],
- redirectTo: 'home.settings.general',
- ncyBreadcrumb: {
- label: '{"icon": "settings", "label": "admin.system-settings"}'
- }
- })
- .state('home.settings.general', {
- url: '/general',
- module: 'private',
- auth: ['SYS_ADMIN'],
- views: {
- "content@home": {
- templateUrl: generalSettingsTemplate,
- controllerAs: 'vm',
- controller: 'AdminController'
- }
- },
- data: {
- key: 'general',
- pageTitle: 'admin.general-settings'
- },
- ncyBreadcrumb: {
- label: '{"icon": "settings_applications", "label": "admin.general"}'
- }
- })
- .state('home.settings.outgoing-mail', {
- url: '/outgoing-mail',
- module: 'private',
- auth: ['SYS_ADMIN'],
- views: {
- "content@home": {
- templateUrl: outgoingMailSettingsTemplate,
- controllerAs: 'vm',
- controller: 'AdminController'
- }
- },
- data: {
- key: 'mail',
- pageTitle: 'admin.outgoing-mail-settings'
- },
- ncyBreadcrumb: {
- label: '{"icon": "mail", "label": "admin.outgoing-mail"}'
- }
- })
- .state('home.settings.security-settings', {
- url: '/security-settings',
- module: 'private',
- auth: ['SYS_ADMIN'],
- views: {
- "content@home": {
- templateUrl: securitySettingsTemplate,
- controllerAs: 'vm',
- controller: 'SecuritySettingsController'
- }
- },
- data: {
- pageTitle: 'admin.security-settings'
- },
- ncyBreadcrumb: {
- label: '{"icon": "security", "label": "admin.security-settings"}'
- }
- });
-}
diff --git a/ui/src/app/admin/general-settings.tpl.html b/ui/src/app/admin/general-settings.tpl.html
deleted file mode 100644
index b6eea094bf..0000000000
--- a/ui/src/app/admin/general-settings.tpl.html
+++ /dev/null
@@ -1,45 +0,0 @@
-
-
-
-
-
- admin.general-settings
-
-
-
-
-
-
-
-
-
-
diff --git a/ui/src/app/admin/index.js b/ui/src/app/admin/index.js
deleted file mode 100644
index d0d47247f9..0000000000
--- a/ui/src/app/admin/index.js
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Copyright © 2016-2020 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 uiRouter from 'angular-ui-router';
-import ngMaterial from 'angular-material';
-import ngMessages from 'angular-messages';
-import thingsboardApiAdmin from '../api/admin.service';
-import thingsboardConfirmOnExit from '../components/confirm-on-exit.directive';
-import thingsboardToast from '../services/toast';
-
-import AdminRoutes from './admin.routes';
-import AdminController from './admin.controller';
-import SecuritySettingsController from './security-settings.controller';
-
-export default angular.module('thingsboard.admin', [
- uiRouter,
- ngMaterial,
- ngMessages,
- thingsboardApiAdmin,
- thingsboardConfirmOnExit,
- thingsboardToast
-])
- .config(AdminRoutes)
- .controller('AdminController', AdminController)
- .controller('SecuritySettingsController', SecuritySettingsController)
- .name;
diff --git a/ui/src/app/admin/outgoing-mail-settings.tpl.html b/ui/src/app/admin/outgoing-mail-settings.tpl.html
deleted file mode 100644
index edb2e4e520..0000000000
--- a/ui/src/app/admin/outgoing-mail-settings.tpl.html
+++ /dev/null
@@ -1,107 +0,0 @@
-
-
-
-
-
- admin.outgoing-mail-settings
-
-
-
-
-
-
-
-
-
-
-
diff --git a/ui/src/app/admin/security-settings.controller.js b/ui/src/app/admin/security-settings.controller.js
deleted file mode 100644
index 40152e6497..0000000000
--- a/ui/src/app/admin/security-settings.controller.js
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright © 2016-2020 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 './settings-card.scss';
-
-/*@ngInject*/
-export default function SecuritySettingsController(adminService, $mdExpansionPanel) {
-
- var vm = this;
- vm.$mdExpansionPanel = $mdExpansionPanel;
-
- vm.save = save;
-
- loadSettings();
-
- function loadSettings() {
- adminService.getSecuritySettings().then(function success(securitySettings) {
- vm.securitySettings = securitySettings;
- });
- }
-
- function save() {
- adminService.saveSecuritySettings(vm.securitySettings).then(function success(securitySettings) {
- vm.securitySettings = securitySettings;
- vm.settingsForm.$setPristine();
- });
- }
-
-}
diff --git a/ui/src/app/admin/security-settings.tpl.html b/ui/src/app/admin/security-settings.tpl.html
deleted file mode 100644
index 311e7c0600..0000000000
--- a/ui/src/app/admin/security-settings.tpl.html
+++ /dev/null
@@ -1,167 +0,0 @@
-
-
-
-
-
- admin.security-settings
-
-
-
-
-
-
-
-
-
-
-
diff --git a/ui/src/app/admin/settings-card.scss b/ui/src/app/admin/settings-card.scss
deleted file mode 100644
index 4639207096..0000000000
--- a/ui/src/app/admin/settings-card.scss
+++ /dev/null
@@ -1,26 +0,0 @@
-/**
- * Copyright © 2016-2020 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%;
- }
-
- md-icon.md-expansion-panel-icon {
- margin-right: 0;
- }
-}
diff --git a/ui/src/app/alarm/alarm-details-dialog.controller.js b/ui/src/app/alarm/alarm-details-dialog.controller.js
deleted file mode 100644
index 412c4218b9..0000000000
--- a/ui/src/app/alarm/alarm-details-dialog.controller.js
+++ /dev/null
@@ -1,141 +0,0 @@
-/*
- * Copyright © 2016-2020 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 'brace/ext/language_tools';
-import 'brace/ext/searchbox';
-import 'brace/mode/json';
-import 'brace/theme/github';
-import beautify from 'js-beautify';
-
-import './alarm-details-dialog.scss';
-
-const js_beautify = beautify.js;
-
-/*@ngInject*/
-export default function AlarmDetailsDialogController($mdDialog, $filter, $translate, types,
- alarmService, alarmId, allowAcknowledgment, allowClear, displayDetails, showingCallback) {
-
- var vm = this;
-
- vm.alarmId = alarmId;
- vm.allowAcknowledgment = allowAcknowledgment;
- vm.allowClear = allowClear;
- vm.displayDetails = displayDetails;
- vm.types = types;
- vm.alarm = null;
-
- vm.alarmUpdated = false;
-
- showingCallback.onShowing = function(scope, element) {
- if (vm.displayDetails) {
- updateEditorSize(element);
- }
- }
-
- vm.alarmDetailsOptions = {
- useWrapMode: false,
- mode: 'json',
- showGutter: false,
- showPrintMargin: false,
- theme: 'github',
- advanced: {
- enableSnippets: false,
- enableBasicAutocompletion: false,
- enableLiveAutocompletion: false
- },
- onLoad: function (_ace) {
- vm.editor = _ace;
- }
- };
-
- vm.close = close;
- vm.acknowledge = acknowledge;
- vm.clear = clear;
-
- loadAlarm();
-
- function updateEditorSize(element) {
- var newWidth = 600;
- var newHeight = 200;
- angular.element('#tb-alarm-details', element).height(newHeight.toString() + "px")
- .width(newWidth.toString() + "px");
- vm.editor.resize();
- }
-
- function loadAlarm() {
- alarmService.getAlarmInfo(vm.alarmId).then(
- function success(alarm) {
- vm.alarm = alarm;
- loadAlarmFields();
- },
- function fail() {
- vm.alarm = null;
- }
- );
- }
-
- function loadAlarmFields() {
- vm.createdTime = $filter('date')(vm.alarm.createdTime, 'yyyy-MM-dd HH:mm:ss');
- vm.startTime = null;
- if (vm.alarm.startTs) {
- vm.startTime = $filter('date')(vm.alarm.startTs, 'yyyy-MM-dd HH:mm:ss');
- }
- vm.endTime = null;
- if (vm.alarm.endTs) {
- vm.endTime = $filter('date')(vm.alarm.endTs, 'yyyy-MM-dd HH:mm:ss');
- }
- vm.ackTime = null;
- if (vm.alarm.ackTs) {
- vm.ackTime = $filter('date')(vm.alarm.ackTs, 'yyyy-MM-dd HH:mm:ss')
- }
- vm.clearTime = null;
- if (vm.alarm.clearTs) {
- vm.clearTime = $filter('date')(vm.alarm.clearTs, 'yyyy-MM-dd HH:mm:ss');
- }
-
- vm.alarmSeverity = $translate.instant(types.alarmSeverity[vm.alarm.severity].name);
-
- vm.alarmStatus = $translate.instant('alarm.display-status.' + vm.alarm.status);
-
- vm.alarmDetails = null;
- if (vm.alarm.details) {
- vm.alarmDetails = angular.toJson(vm.alarm.details);
- vm.alarmDetails = js_beautify(vm.alarmDetails, {indent_size: 4});
- }
- }
-
- function acknowledge () {
- alarmService.ackAlarm(vm.alarmId).then(
- function success() {
- vm.alarmUpdated = true;
- loadAlarm();
- }
- );
- }
-
- function clear () {
- alarmService.clearAlarm(vm.alarmId).then(
- function success() {
- vm.alarmUpdated = true;
- loadAlarm();
- }
- );
- }
-
- function close () {
- $mdDialog.hide(vm.alarmUpdated ? vm.alarm : null);
- }
-
-}
diff --git a/ui/src/app/alarm/alarm-details-dialog.scss b/ui/src/app/alarm/alarm-details-dialog.scss
deleted file mode 100644
index a15e51044a..0000000000
--- a/ui/src/app/alarm/alarm-details-dialog.scss
+++ /dev/null
@@ -1,27 +0,0 @@
-/**
- * Copyright © 2016-2020 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-alarm-details-panel {
- height: 100%;
- margin-left: 15px;
- border: 1px solid #c0c0c0;
-
- #tb-alarm-details {
- width: 100%;
- min-width: 600px;
- height: 100%;
- min-height: 200px;
- }
-}
diff --git a/ui/src/app/alarm/alarm-details-dialog.tpl.html b/ui/src/app/alarm/alarm-details-dialog.tpl.html
deleted file mode 100644
index f5e7ec1a0b..0000000000
--- a/ui/src/app/alarm/alarm-details-dialog.tpl.html
+++ /dev/null
@@ -1,107 +0,0 @@
-
-
-
-
-
alarm.alarm-details
-
-
-
-
-
-
-
-
-
-
- {{ 'alarm.acknowledge' |
- translate }}
-
- {{ 'alarm.clear' |
- translate }}
-
-
- {{ 'action.close' |
- translate }}
-
-
-
diff --git a/ui/src/app/alarm/alarm-header.directive.js b/ui/src/app/alarm/alarm-header.directive.js
deleted file mode 100644
index 08e61bc741..0000000000
--- a/ui/src/app/alarm/alarm-header.directive.js
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-/* eslint-disable import/no-unresolved, import/default */
-
-import alarmHeaderTemplate from './alarm-header.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-/*@ngInject*/
-export default function AlarmHeaderDirective($compile, $templateCache) {
-
- var linker = function (scope, element) {
-
- var template = $templateCache.get(alarmHeaderTemplate);
- element.html(template);
- $compile(element.contents())(scope);
-
- }
-
- return {
- restrict: "A",
- replace: false,
- link: linker,
- scope: false
- };
-}
diff --git a/ui/src/app/alarm/alarm-header.tpl.html b/ui/src/app/alarm/alarm-header.tpl.html
deleted file mode 100644
index 06fa429912..0000000000
--- a/ui/src/app/alarm/alarm-header.tpl.html
+++ /dev/null
@@ -1,23 +0,0 @@
-
-alarm.created-time
-alarm.originator
-alarm.type
-alarm.severity
-alarm.status
-alarm.details
diff --git a/ui/src/app/alarm/alarm-row.directive.js b/ui/src/app/alarm/alarm-row.directive.js
deleted file mode 100644
index 63afb57afe..0000000000
--- a/ui/src/app/alarm/alarm-row.directive.js
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-/* eslint-disable import/no-unresolved, import/default */
-
-import alarmDetailsDialogTemplate from './alarm-details-dialog.tpl.html';
-
-import alarmRowTemplate from './alarm-row.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-/*@ngInject*/
-export default function AlarmRowDirective($compile, $templateCache, types, $mdDialog, $document) {
-
- var linker = function (scope, element, attrs) {
-
- var template = $templateCache.get(alarmRowTemplate);
- element.html(template);
-
- scope.alarm = attrs.alarm;
- scope.types = types;
-
- scope.showAlarmDetails = function($event) {
- var onShowingCallback = {
- onShowing: function(){}
- }
- $mdDialog.show({
- controller: 'AlarmDetailsDialogController',
- controllerAs: 'vm',
- templateUrl: alarmDetailsDialogTemplate,
- locals: {
- alarmId: scope.alarm.id.id,
- allowAcknowledgment: true,
- allowClear: true,
- displayDetails: true,
- showingCallback: onShowingCallback
- },
- parent: angular.element($document[0].body),
- targetEvent: $event,
- fullscreen: true,
- multiple: true,
- onShowing: function(scope, element) {
- onShowingCallback.onShowing(scope, element);
- }
- }).then(function (alarm) {
- if (alarm) {
- scope.alarm = alarm;
- }
- });
- }
-
- $compile(element.contents())(scope);
- }
-
- return {
- restrict: "A",
- replace: false,
- link: linker,
- scope: false
- };
-}
diff --git a/ui/src/app/alarm/alarm-row.tpl.html b/ui/src/app/alarm/alarm-row.tpl.html
deleted file mode 100644
index d71d4a7494..0000000000
--- a/ui/src/app/alarm/alarm-row.tpl.html
+++ /dev/null
@@ -1,37 +0,0 @@
-
-{{alarm.createdTime | date : 'yyyy-MM-dd HH:mm:ss'}}
-{{alarm.originatorName}}
-{{alarm.type}}
-
- {{ alarm ? (types.alarmSeverity[alarm.severity].name | translate) : '' }}
-
-{{ alarm ? (('alarm.display-status.' + alarm.status) | translate) : '' }}
-
-
-
- {{ 'alarm.details' | translate }}
-
-
- more_horiz
-
-
-
diff --git a/ui/src/app/alarm/alarm-table.directive.js b/ui/src/app/alarm/alarm-table.directive.js
deleted file mode 100644
index 28b15392a9..0000000000
--- a/ui/src/app/alarm/alarm-table.directive.js
+++ /dev/null
@@ -1,213 +0,0 @@
-/*
- * Copyright © 2016-2020 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 './alarm.scss';
-
-/* eslint-disable import/no-unresolved, import/default */
-
-import alarmTableTemplate from './alarm-table.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-/*@ngInject*/
-export default function AlarmTableDirective($compile, $templateCache, $rootScope, types, alarmService) {
-
- var linker = function (scope, element) {
-
- var template = $templateCache.get(alarmTableTemplate);
-
- element.html(template);
-
- scope.types = types;
-
- scope.alarmSearchStatus = types.alarmSearchStatus.any;
-
- var pageSize = 20;
- var startTime = 0;
- var endTime = 0;
-
- scope.timewindow = {
- history: {
- timewindowMs: 24 * 60 * 60 * 1000 // 1 day
- }
- };
-
- scope.topIndex = 0;
-
- scope.theAlarms = {
- getItemAtIndex: function (index) {
- if (index > scope.alarms.data.length) {
- scope.theAlarms.fetchMoreItems_(index);
- return null;
- }
- var item = scope.alarms.data[index];
- if (item) {
- item.indexNumber = index + 1;
- }
- return item;
- },
-
- getLength: function () {
- if (scope.alarms.hasNext) {
- return scope.alarms.data.length + scope.alarms.nextPageLink.limit;
- } else {
- return scope.alarms.data.length;
- }
- },
-
- fetchMoreItems_: function () {
- if (scope.alarms.hasNext && !scope.alarms.pending) {
- if (scope.entityType && scope.entityId && scope.alarmSearchStatus) {
- var promise = alarmService.getAlarms(scope.entityType, scope.entityId,
- scope.alarms.nextPageLink, scope.alarmSearchStatus, null, true, false);
- if (promise) {
- scope.alarms.pending = true;
- promise.then(
- function success(alarms) {
- scope.alarms.data = scope.alarms.data.concat(alarms.data);
- scope.alarms.nextPageLink = alarms.nextPageLink;
- scope.alarms.hasNext = alarms.hasNext;
- if (scope.alarms.hasNext) {
- scope.alarms.nextPageLink.limit = pageSize;
- }
- scope.alarms.pending = false;
- },
- function fail() {
- scope.alarms.hasNext = false;
- scope.alarms.pending = false;
- });
- } else {
- scope.alarms.hasNext = false;
- }
- } else {
- scope.alarms.hasNext = false;
- }
- }
- }
- };
-
- scope.reload = reload;
-
- scope.$watch("entityId", function(newVal, prevVal) {
- if (newVal && !angular.equals(newVal, prevVal)) {
- resetFilter();
- reload();
- }
- });
-
-
-
- function destroyWatchers() {
- if (scope.alarmSearchStatusWatchHandle) {
- scope.alarmSearchStatusWatchHandle();
- scope.alarmSearchStatusWatchHandle = null;
- }
- if (scope.timewindowWatchHandle) {
- scope.timewindowWatchHandle();
- scope.timewindowWatchHandle = null;
- }
- }
-
- function initWatchers() {
- scope.alarmSearchStatusWatchHandle = scope.$watch("alarmSearchStatus", function(newVal, prevVal) {
- if (newVal && !angular.equals(newVal, prevVal)) {
- reload();
- }
- });
- scope.timewindowWatchHandle = scope.$watch("timewindow", function(newVal, prevVal) {
- if (newVal && !angular.equals(newVal, prevVal)) {
- reload();
- }
- }, true);
- }
-
- function resetFilter() {
- destroyWatchers();
- scope.timewindow = {
- history: {
- timewindowMs: 24 * 60 * 60 * 1000 // 1 day
- }
- };
- scope.alarmSearchStatus = types.alarmSearchStatus.any;
- initWatchers();
- }
-
- function updateTimeWindowRange () {
- if (scope.timewindow.history.timewindowMs) {
- var currentTime = (new Date).getTime();
- startTime = currentTime - scope.timewindow.history.timewindowMs;
- endTime = currentTime;
- } else {
- startTime = scope.timewindow.history.fixedTimewindow.startTimeMs;
- endTime = scope.timewindow.history.fixedTimewindow.endTimeMs;
- }
- }
-
- function reload () {
- scope.topIndex = 0;
- scope.selected = [];
- updateTimeWindowRange();
- scope.alarms = {
- data: [],
- nextPageLink: {
- limit: pageSize,
- startTime: startTime,
- endTime: endTime
- },
- hasNext: true,
- pending: false
- };
- scope.theAlarms.getItemAtIndex(pageSize);
- }
-
- scope.noData = function() {
- return scope.alarms.data.length == 0 && !scope.alarms.hasNext;
- }
-
- scope.hasData = function() {
- return scope.alarms.data.length > 0;
- }
-
- scope.loading = function() {
- return $rootScope.loading;
- }
-
- scope.hasScroll = function() {
- var repeatContainer = scope.repeatContainer[0];
- if (repeatContainer) {
- var scrollElement = repeatContainer.children[0];
- if (scrollElement) {
- return scrollElement.scrollHeight > scrollElement.clientHeight;
- }
- }
- return false;
- }
-
- reload();
-
- initWatchers();
-
- $compile(element.contents())(scope);
- }
-
- return {
- restrict: "E",
- link: linker,
- scope: {
- entityType: '=',
- entityId: '='
- }
- };
-}
diff --git a/ui/src/app/alarm/alarm-table.tpl.html b/ui/src/app/alarm/alarm-table.tpl.html
deleted file mode 100644
index 38719cfe5c..0000000000
--- a/ui/src/app/alarm/alarm-table.tpl.html
+++ /dev/null
@@ -1,56 +0,0 @@
-
-
-
-
-
-
-
- {{ ('alarm.search-status.' + searchStatus) | translate }}
-
-
-
-
-
- refresh
-
- {{ 'action.refresh' | translate }}
-
-
-
-
-
-
-
-
- alarm.no-alarms-prompt
-
-
-
-
-
-
-
-
-
-
diff --git a/ui/src/app/alarm/alarm.scss b/ui/src/app/alarm/alarm.scss
deleted file mode 100644
index 893327604d..0000000000
--- a/ui/src/app/alarm/alarm.scss
+++ /dev/null
@@ -1,77 +0,0 @@
-/**
- * Copyright © 2016-2020 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-alarm-container {
- overflow-x: auto;
-}
-
-md-list.tb-alarm-table {
- min-width: 700px;
- padding: 0;
-
- md-list-item {
- padding: 0;
- }
-
- .tb-row {
- height: 48px;
- padding: 0;
- overflow: hidden;
- }
-
- .tb-row:hover {
- background-color: #eee;
- }
-
- .tb-header:hover {
- background: none;
- }
-
- .tb-header {
- .tb-cell {
- font-size: 12px;
- font-weight: 700;
- color: rgba(0, 0, 0, .54);
- white-space: nowrap;
- background: none;
- }
- }
-
- .tb-cell {
- padding: 0 24px;
- margin: auto 0;
- overflow: hidden;
- font-size: 13px;
- color: rgba(0, 0, 0, .87);
- text-align: left;
- vertical-align: middle;
-
- .md-button {
- padding: 0;
- margin: 0;
- }
- }
-
- .tb-cell.tb-number {
- text-align: right;
- }
-}
-
-#tb-alarm-content {
- width: 100%;
- min-width: 400px;
- height: 100%;
- min-height: 50px;
-}
diff --git a/ui/src/app/alarm/index.js b/ui/src/app/alarm/index.js
deleted file mode 100644
index 221f2a6e73..0000000000
--- a/ui/src/app/alarm/index.js
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright © 2016-2020 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 AlarmDetailsDialogController from './alarm-details-dialog.controller';
-import AlarmHeaderDirective from './alarm-header.directive';
-import AlarmRowDirective from './alarm-row.directive';
-import AlarmTableDirective from './alarm-table.directive';
-
-export default angular.module('thingsboard.alarm', [])
- .controller('AlarmDetailsDialogController', AlarmDetailsDialogController)
- .directive('tbAlarmHeader', AlarmHeaderDirective)
- .directive('tbAlarmRow', AlarmRowDirective)
- .directive('tbAlarmTable', AlarmTableDirective)
- .name;
diff --git a/ui/src/app/api/admin.service.js b/ui/src/app/api/admin.service.js
deleted file mode 100644
index c679fc6532..0000000000
--- a/ui/src/app/api/admin.service.js
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-export default angular.module('thingsboard.api.admin', [])
- .factory('adminService', AdminService)
- .name;
-
-/*@ngInject*/
-function AdminService($http, $q) {
-
- var service = {
- getAdminSettings: getAdminSettings,
- saveAdminSettings: saveAdminSettings,
- getSecuritySettings: getSecuritySettings,
- saveSecuritySettings: saveSecuritySettings,
- sendTestMail: sendTestMail,
- checkUpdates: checkUpdates
- }
-
- return service;
-
- function getAdminSettings(key) {
- var deferred = $q.defer();
- var url = '/api/admin/settings/' + key;
- $http.get(url, null).then(function success(response) {
- deferred.resolve(response.data);
- }, function fail() {
- deferred.reject();
- });
- return deferred.promise;
- }
-
- function saveAdminSettings(settings) {
- var deferred = $q.defer();
- var url = '/api/admin/settings';
- $http.post(url, settings).then(function success(response) {
- deferred.resolve(response.data);
- }, function fail(response) {
- deferred.reject(response.data);
- });
- return deferred.promise;
- }
-
- function getSecuritySettings() {
- var deferred = $q.defer();
- var url = '/api/admin/securitySettings';
- $http.get(url, null).then(function success(response) {
- deferred.resolve(response.data);
- }, function fail() {
- deferred.reject();
- });
- return deferred.promise;
- }
-
- function saveSecuritySettings(securitySettings) {
- var deferred = $q.defer();
- var url = '/api/admin/securitySettings';
- $http.post(url, securitySettings).then(function success(response) {
- deferred.resolve(response.data);
- }, function fail(response) {
- deferred.reject(response.data);
- });
- return deferred.promise;
- }
-
- function sendTestMail(settings) {
- var deferred = $q.defer();
- var url = '/api/admin/settings/testMail';
- $http.post(url, settings).then(function success() {
- deferred.resolve();
- }, function fail(response) {
- deferred.reject(response.data);
- });
- return deferred.promise;
- }
-
- function checkUpdates() {
- var deferred = $q.defer();
- var url = '/api/admin/updates';
- $http.get(url, null).then(function success(response) {
- deferred.resolve(response.data);
- }, function fail() {
- deferred.reject();
- });
- return deferred.promise;
- }
-}
diff --git a/ui/src/app/api/alarm.service.js b/ui/src/app/api/alarm.service.js
deleted file mode 100644
index f7f4111ec9..0000000000
--- a/ui/src/app/api/alarm.service.js
+++ /dev/null
@@ -1,356 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-export default angular.module('thingsboard.api.alarm', [])
- .factory('alarmService', AlarmService)
- .name;
-
-/*@ngInject*/
-function AlarmService($http, $q, $interval, $filter, $timeout, utils, types) {
-
- var alarmSourceListeners = {};
-
- var simulatedAlarm = {
- createdTime: (new Date).getTime(),
- startTs: (new Date).getTime(),
- endTs: 0,
- ackTs: 0,
- clearTs: 0,
- originatorName: 'Simulated',
- originator: {
- entityType: "DEVICE",
- id: "1"
- },
- type: 'TEMPERATURE',
- severity: "MAJOR",
- status: types.alarmStatus.activeUnack,
- details: {
- message: "Temperature is high!"
- }
- };
-
- var service = {
- getAlarm: getAlarm,
- getAlarmInfo: getAlarmInfo,
- saveAlarm: saveAlarm,
- ackAlarm: ackAlarm,
- clearAlarm: clearAlarm,
- deleteAlarm: deleteAlarm,
- getAlarms: getAlarms,
- getHighestAlarmSeverity: getHighestAlarmSeverity,
- pollAlarms: pollAlarms,
- cancelPollAlarms: cancelPollAlarms,
- subscribeForAlarms: subscribeForAlarms,
- unsubscribeFromAlarms: unsubscribeFromAlarms
- }
-
- return service;
-
- function getAlarm(alarmId, ignoreErrors, config) {
- var deferred = $q.defer();
- var url = '/api/alarm/' + alarmId;
- if (!config) {
- config = {};
- }
- config = Object.assign(config, { ignoreErrors: ignoreErrors });
- $http.get(url, config).then(function success(response) {
- deferred.resolve(response.data);
- }, function fail() {
- deferred.reject();
- });
- return deferred.promise;
- }
-
- function getAlarmInfo(alarmId, ignoreErrors, config) {
- var deferred = $q.defer();
- var url = '/api/alarm/info/' + alarmId;
- if (!config) {
- config = {};
- }
- config = Object.assign(config, { ignoreErrors: ignoreErrors });
- $http.get(url, config).then(function success(response) {
- deferred.resolve(response.data);
- }, function fail() {
- deferred.reject();
- });
- return deferred.promise;
- }
-
- function saveAlarm(alarm, ignoreErrors, config) {
- var deferred = $q.defer();
- var url = '/api/alarm';
- if (!config) {
- config = {};
- }
- config = Object.assign(config, { ignoreErrors: ignoreErrors });
- $http.post(url, alarm, config).then(function success(response) {
- deferred.resolve(response.data);
- }, function fail() {
- deferred.reject();
- });
- return deferred.promise;
- }
-
- function ackAlarm(alarmId, ignoreErrors, config) {
- var deferred = $q.defer();
- var url = '/api/alarm/' + alarmId + '/ack';
- if (!config) {
- config = {};
- }
- config = Object.assign(config, { ignoreErrors: ignoreErrors });
- $http.post(url, null, config).then(function success(response) {
- deferred.resolve(response.data);
- }, function fail() {
- deferred.reject();
- });
- return deferred.promise;
- }
-
- function clearAlarm(alarmId, ignoreErrors, config) {
- var deferred = $q.defer();
- var url = '/api/alarm/' + alarmId + '/clear';
- if (!config) {
- config = {};
- }
- config = Object.assign(config, { ignoreErrors: ignoreErrors });
- $http.post(url, null, config).then(function success(response) {
- deferred.resolve(response.data);
- }, function fail() {
- deferred.reject();
- });
- return deferred.promise;
- }
-
- function deleteAlarm(alarmId, ignoreErrors, config) {
- var deferred = $q.defer();
- var url = '/api/alarm/' + alarmId;
- if (!config) {
- config = {};
- }
- config = Object.assign(config, { ignoreErrors: ignoreErrors });
- $http.delete(url, config).then(function success(response) {
- deferred.resolve(response.data);
- }, function fail() {
- deferred.reject();
- });
- return deferred.promise;
- }
-
- function getAlarms(entityType, entityId, pageLink, alarmSearchStatus, alarmStatus, fetchOriginator, ascOrder, config) {
- var deferred = $q.defer();
- var url = '/api/alarm/' + entityType + '/' + entityId + '?limit=' + pageLink.limit;
-
- if (angular.isDefined(pageLink.startTime) && pageLink.startTime != null) {
- url += '&startTime=' + pageLink.startTime;
- }
- if (angular.isDefined(pageLink.endTime) && pageLink.endTime != null) {
- url += '&endTime=' + pageLink.endTime;
- }
- if (angular.isDefined(pageLink.idOffset) && pageLink.idOffset != null) {
- url += '&offset=' + pageLink.idOffset;
- }
- if (alarmSearchStatus) {
- url += '&searchStatus=' + alarmSearchStatus;
- }
- if (alarmStatus) {
- url += '&status=' + alarmStatus;
- }
- if (fetchOriginator) {
- url += '&fetchOriginator=' + ((fetchOriginator===true) ? 'true' : 'false');
- }
- if (angular.isDefined(ascOrder) && ascOrder != null) {
- url += '&ascOrder=' + (ascOrder ? 'true' : 'false');
- }
-
- $http.get(url, config).then(function success(response) {
- deferred.resolve(response.data);
- }, function fail() {
- deferred.reject();
- });
- return deferred.promise;
- }
-
- function getHighestAlarmSeverity(entityType, entityId, alarmSearchStatus, alarmStatus, config) {
- var deferred = $q.defer();
- var url = '/api/alarm/highestSeverity/' + entityType + '/' + entityId;
-
- if (alarmSearchStatus) {
- url += '?searchStatus=' + alarmSearchStatus;
- } else if (alarmStatus) {
- url += '?status=' + alarmStatus;
- }
- $http.get(url, config).then(function success(response) {
- deferred.resolve(response.data);
- }, function fail() {
- deferred.reject();
- });
- return deferred.promise;
- }
-
- function fetchAlarms(alarmsQuery, pageLink, deferred, leftToLoad, alarmsList) {
- getAlarms(alarmsQuery.entityType, alarmsQuery.entityId,
- pageLink, alarmsQuery.alarmSearchStatus, alarmsQuery.alarmStatus,
- alarmsQuery.fetchOriginator, false, {ignoreLoading: true}).then(
- function success(alarms) {
- if (!alarmsList) {
- alarmsList = [];
- }
- alarmsList = alarmsList.concat(alarms.data);
- if (angular.isDefined(leftToLoad)) {
- leftToLoad -= pageLink.limit;
- if (leftToLoad === 0) {
- alarmsList = $filter('orderBy')(alarmsList, ['-createdTime']);
- deferred.resolve(alarmsList);
- return;
- }
- if (leftToLoad < pageLink.limit) {
- alarms.nextPageLink.limit = leftToLoad;
- }
- }
- if (alarms.hasNext && !alarmsQuery.limit) {
- fetchAlarms(alarmsQuery, alarms.nextPageLink, deferred, leftToLoad, alarmsList);
- } else {
- alarmsList = $filter('orderBy')(alarmsList, ['-createdTime']);
- deferred.resolve(alarmsList);
- }
- },
- function fail() {
- deferred.reject();
- }
- );
- }
-
- function getAlarmsByQuery(alarmsQuery) {
- var deferred = $q.defer();
- var time = Date.now();
- var pageLink;
- var leftToLoad;
- if (alarmsQuery.limit) {
- pageLink = {
- limit: alarmsQuery.limit
- };
- } else if (alarmsQuery.interval) {
- pageLink = {
- limit: alarmsQuery.alarmsFetchSize || 100,
- startTime: time - alarmsQuery.interval
- };
- } else if (alarmsQuery.startTime) {
- pageLink = {
- limit: alarmsQuery.alarmsFetchSize || 100,
- startTime: Math.round(alarmsQuery.startTime)
- };
- if (alarmsQuery.endTime) {
- pageLink.endTime = Math.round(alarmsQuery.endTime);
- }
- }
-
- if (angular.isDefined(alarmsQuery.alarmsMaxCountLoad) && alarmsQuery.alarmsMaxCountLoad !== 0) {
- leftToLoad = alarmsQuery.alarmsMaxCountLoad;
- if (leftToLoad < pageLink.limit) {
- pageLink.limit = leftToLoad;
- }
- }
-
- fetchAlarms(alarmsQuery, pageLink, deferred, leftToLoad);
- return deferred.promise;
- }
-
- function onPollAlarms(alarmsQuery) {
- getAlarmsByQuery(alarmsQuery).then(
- function success(alarms) {
- alarmsQuery.onAlarms(alarms);
- },
- function fail() {}
- );
- }
-
- function pollAlarms(entityType, entityId, alarmStatus, interval, limit, pollingInterval, onAlarms) {
- var alarmsQuery = {
- entityType: entityType,
- entityId: entityId,
- alarmSearchStatus: null,
- alarmStatus: alarmStatus,
- fetchOriginator: false,
- interval: interval,
- limit: limit,
- onAlarms: onAlarms
- };
- onPollAlarms(alarmsQuery);
- return $interval(onPollAlarms, pollingInterval, 0, false, alarmsQuery);
- }
-
- function cancelPollAlarms(pollPromise) {
- if (angular.isDefined(pollPromise)) {
- $interval.cancel(pollPromise);
- }
- }
-
- function subscribeForAlarms(alarmSourceListener) {
- alarmSourceListener.id = utils.guid();
- alarmSourceListeners[alarmSourceListener.id] = alarmSourceListener;
- var alarmSource = alarmSourceListener.alarmSource;
- if (alarmSource.type == types.datasourceType.function) {
- $timeout(function() {
- alarmSourceListener.alarmsUpdated([simulatedAlarm], false);
- });
- } else if (alarmSource.entityType && alarmSource.entityId) {
- var pollingInterval = alarmSourceListener.alarmsPollingInterval;
- alarmSourceListener.alarmsQuery = {
- entityType: alarmSource.entityType,
- entityId: alarmSource.entityId,
- alarmSearchStatus: alarmSourceListener.alarmSearchStatus,
- alarmStatus: null,
- alarmsMaxCountLoad: alarmSourceListener.alarmsMaxCountLoad,
- alarmsFetchSize: alarmSourceListener.alarmsFetchSize
- };
- var originatorKeys = $filter('filter')(alarmSource.dataKeys, {name: 'originator'});
- if (originatorKeys && originatorKeys.length) {
- alarmSourceListener.alarmsQuery.fetchOriginator = true;
- }
- var subscriptionTimewindow = alarmSourceListener.subscriptionTimewindow;
- if (subscriptionTimewindow.realtimeWindowMs) {
- alarmSourceListener.alarmsQuery.startTime = subscriptionTimewindow.startTs;
- } else {
- alarmSourceListener.alarmsQuery.startTime = subscriptionTimewindow.fixedWindow.startTimeMs;
- alarmSourceListener.alarmsQuery.endTime = subscriptionTimewindow.fixedWindow.endTimeMs;
- }
- alarmSourceListener.alarmsQuery.onAlarms = function(alarms) {
- if (subscriptionTimewindow.realtimeWindowMs) {
- var now = Date.now();
- if (alarmSourceListener.lastUpdateTs) {
- var interval = now - alarmSourceListener.lastUpdateTs;
- alarmSourceListener.alarmsQuery.startTime += interval;
- }
- alarmSourceListener.lastUpdateTs = now;
- }
- alarmSourceListener.alarmsUpdated(alarms, false);
- }
- onPollAlarms(alarmSourceListener.alarmsQuery);
- alarmSourceListener.pollPromise = $interval(onPollAlarms, pollingInterval,
- 0, false, alarmSourceListener.alarmsQuery);
- }
-
- }
-
- function unsubscribeFromAlarms(alarmSourceListener) {
- if (alarmSourceListener && alarmSourceListener.id) {
- if (alarmSourceListener.pollPromise) {
- $interval.cancel(alarmSourceListener.pollPromise);
- alarmSourceListener.pollPromise = null;
- }
- delete alarmSourceListeners[alarmSourceListener.id];
- }
- }
-}
diff --git a/ui/src/app/api/alias-controller.js b/ui/src/app/api/alias-controller.js
deleted file mode 100644
index 3f570a904f..0000000000
--- a/ui/src/app/api/alias-controller.js
+++ /dev/null
@@ -1,322 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-export default class AliasController {
-
- constructor($scope, $q, $filter, utils, types, entityService, stateController, entityAliases) {
- this.$scope = $scope;
- this.$q = $q;
- this.$filter = $filter;
- this.utils = utils;
- this.types = types;
- this.entityService = entityService;
- this.stateController = stateController;
- this.entityAliases = angular.copy(entityAliases);
- this.resolvedAliases = {};
- this.resolvedAliasesPromise = {};
- this.resolvedAliasesToStateEntities = {};
- }
-
- updateEntityAliases(newEntityAliases) {
- var changedAliasIds = [];
- for (var aliasId in newEntityAliases) {
- var newEntityAlias = newEntityAliases[aliasId];
- var prevEntityAlias = this.entityAliases[aliasId];
- if (!angular.equals(newEntityAlias, prevEntityAlias)) {
- changedAliasIds.push(aliasId);
- this.setAliasUnresolved(aliasId);
- }
- }
- for (aliasId in this.entityAliases) {
- if (!newEntityAliases[aliasId]) {
- changedAliasIds.push(aliasId);
- this.setAliasUnresolved(aliasId);
- }
- }
- this.entityAliases = angular.copy(newEntityAliases);
- if (changedAliasIds.length) {
- this.$scope.$broadcast('entityAliasesChanged', changedAliasIds);
- }
- }
-
- dashboardStateChanged() {
- var changedAliasIds = [];
- for (var aliasId in this.resolvedAliasesToStateEntities) {
- var stateEntityInfo = this.resolvedAliasesToStateEntities[aliasId];
- var newEntityId = this.stateController.getEntityId(stateEntityInfo.entityParamName);
- var prevEntityId = stateEntityInfo.entityId;
- if (!angular.equals(newEntityId, prevEntityId)) {
- changedAliasIds.push(aliasId);
- this.setAliasUnresolved(aliasId);
- }
- }
- if (changedAliasIds.length) {
- this.$scope.$broadcast('entityAliasesChanged', changedAliasIds);
- }
- }
-
- setAliasUnresolved(aliasId) {
- delete this.resolvedAliases[aliasId];
- delete this.resolvedAliasesPromise[aliasId];
- delete this.resolvedAliasesToStateEntities[aliasId];
- }
-
- getEntityAliases() {
- return this.entityAliases;
- }
-
- getEntityAliasId(aliasName) {
- for (var aliasId in this.entityAliases) {
- var alias = this.entityAliases[aliasId];
- if (alias.alias == aliasName) {
- return aliasId;
- }
- }
- return null;
- }
-
- getAliasInfo(aliasId) {
- var deferred = this.$q.defer();
- var aliasInfo = this.resolvedAliases[aliasId];
- if (aliasInfo) {
- deferred.resolve(aliasInfo);
- return deferred.promise;
- } else if (this.resolvedAliasesPromise[aliasId]) {
- return this.resolvedAliasesPromise[aliasId];
- } else {
- this.resolvedAliasesPromise[aliasId] = deferred.promise;
- var aliasCtrl = this;
- var entityAlias = this.entityAliases[aliasId];
- if (entityAlias) {
- this.entityService.resolveAlias(entityAlias, this.stateController.getStateParams()).then(
- function success(aliasInfo) {
- aliasCtrl.resolvedAliases[aliasId] = aliasInfo;
- delete aliasCtrl.resolvedAliasesPromise[aliasId];
- if (aliasInfo.stateEntity) {
- var stateEntityInfo = {
- entityParamName: aliasInfo.entityParamName,
- entityId: aliasCtrl.stateController.getEntityId(aliasInfo.entityParamName)
- };
- aliasCtrl.resolvedAliasesToStateEntities[aliasId] =
- stateEntityInfo;
- }
- aliasCtrl.$scope.$broadcast('entityAliasResolved', aliasId);
- deferred.resolve(aliasInfo);
- },
- function fail() {
- deferred.reject();
- delete aliasCtrl.resolvedAliasesPromise[aliasId];
- }
- );
- } else {
- deferred.reject();
- delete aliasCtrl.resolvedAliasesPromise[aliasId];
- }
- return this.resolvedAliasesPromise[aliasId];
- }
- }
-
- resolveDatasource(datasource, isSingle) {
- var deferred = this.$q.defer();
- if (datasource.type === this.types.datasourceType.entity) {
- if (datasource.entityAliasId) {
- this.getAliasInfo(datasource.entityAliasId).then(
- function success(aliasInfo) {
- datasource.aliasName = aliasInfo.alias;
- if (aliasInfo.resolveMultiple && !isSingle) {
- var newDatasource;
- var resolvedEntities = aliasInfo.resolvedEntities;
- if (resolvedEntities && resolvedEntities.length) {
- var datasources = [];
- for (var i=0;i 0 ? true : false;
- datasources.push(newDatasource);
- }
- deferred.resolve(datasources);
- } else {
- if (aliasInfo.stateEntity) {
- newDatasource = angular.copy(datasource);
- newDatasource.unresolvedStateEntity = true;
- deferred.resolve([newDatasource]);
- } else {
- deferred.reject();
- }
- }
- } else {
- var entity = aliasInfo.currentEntity;
- if (entity) {
- if (entity.origEntity) {
- datasource.entity = angular.copy(entity.origEntity);
- } else {
- datasource.entity = {};
- }
- datasource.entityId = entity.id;
- datasource.entityType = entity.entityType;
- datasource.entityName = entity.name;
- datasource.entityLabel = entity.label;
- datasource.name = entity.name;
- datasource.entityDescription = entity.entityDescription;
- deferred.resolve([datasource]);
- } else {
- if (aliasInfo.stateEntity) {
- datasource.unresolvedStateEntity = true;
- deferred.resolve([datasource]);
- } else {
- deferred.reject();
- }
- }
- }
- },
- function fail() {
- deferred.reject();
- }
- );
- } else { // entityId
- datasource.aliasName = datasource.entityName;
- datasource.name = datasource.entityName;
- deferred.resolve([datasource]);
- }
- } else { // function
- deferred.resolve([datasource]);
- }
- return deferred.promise;
- }
-
- resolveAlarmSource(alarmSource) {
- var deferred = this.$q.defer();
- var aliasCtrl = this;
- this.resolveDatasource(alarmSource, true).then(
- function success(datasources) {
- var datasource = datasources[0];
- if (datasource.type === aliasCtrl.types.datasourceType.function) {
- var name;
- if (datasource.name && datasource.name.length) {
- name = datasource.name;
- } else {
- name = aliasCtrl.types.datasourceType.function;
- }
- datasource.name = name;
- datasource.aliasName = name;
- datasource.entityName = name;
- } else if (datasource.unresolvedStateEntity) {
- datasource.name = "Unresolved";
- datasource.entityName = "Unresolved";
- }
- deferred.resolve(datasource);
- },
- function fail() {
- deferred.reject();
- }
- );
- return deferred.promise;
- }
-
- resolveDatasources(datasources) {
-
- var aliasCtrl = this;
-
- function updateDataKeyLabel(dataKey, datasource) {
- if (!dataKey.pattern) {
- dataKey.pattern = angular.copy(dataKey.label);
- }
- dataKey.label = aliasCtrl.utils.createLabelFromDatasource(datasource, dataKey.pattern);
- }
-
- function updateDatasourceKeyLabels(datasource) {
- for (var dk = 0; dk < datasource.dataKeys.length; dk++) {
- updateDataKeyLabel(datasource.dataKeys[dk], datasource);
- }
- }
-
- var deferred = this.$q.defer();
- var newDatasources = angular.copy(datasources);
- var datasorceResolveTasks = [];
-
- newDatasources.forEach(function (datasource) {
- var resolveDatasourceTask = aliasCtrl.resolveDatasource(datasource);
- datasorceResolveTasks.push(resolveDatasourceTask);
- });
- this.$q.all(datasorceResolveTasks).then(
- function success(datasourcesArrays) {
- var datasources = [].concat.apply([], datasourcesArrays);
- datasources = aliasCtrl.$filter('orderBy')(datasources, '+generated');
- var index = 0;
- var functionIndex = 0;
- datasources.forEach(function(datasource) {
- if (datasource.type === aliasCtrl.types.datasourceType.function) {
- var name;
- if (datasource.name && datasource.name.length) {
- name = datasource.name;
- } else {
- functionIndex++;
- name = aliasCtrl.types.datasourceType.function;
- if (functionIndex > 1) {
- name += ' ' + functionIndex;
- }
- }
- datasource.name = name;
- datasource.aliasName = name;
- datasource.entityName = name;
- } else if (datasource.unresolvedStateEntity) {
- datasource.name = "Unresolved";
- datasource.entityName = "Unresolved";
- }
- datasource.dataKeys.forEach(function(dataKey) {
- if (datasource.generated) {
- dataKey._hash = Math.random();
- dataKey.color = aliasCtrl.utils.getMaterialColor(index);
- }
- index++;
- });
- updateDatasourceKeyLabels(datasource);
- });
- deferred.resolve(datasources);
- },
- function fail() {
- deferred.reject();
- }
- );
- return deferred.promise;
- }
-
- getInstantAliasInfo(aliasId) {
- return this.resolvedAliases[aliasId];
- }
-
- updateCurrentAliasEntity(aliasId, currentEntity) {
- var aliasInfo = this.resolvedAliases[aliasId];
- if (aliasInfo) {
- var prevCurrentEntity = aliasInfo.currentEntity;
- if (!angular.equals(currentEntity, prevCurrentEntity)) {
- aliasInfo.currentEntity = currentEntity;
- this.$scope.$broadcast('entityAliasesChanged', [aliasId]);
- }
- }
- }
-
-}
\ No newline at end of file
diff --git a/ui/src/app/api/asset.service.js b/ui/src/app/api/asset.service.js
deleted file mode 100644
index a936e33915..0000000000
--- a/ui/src/app/api/asset.service.js
+++ /dev/null
@@ -1,292 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-export default angular.module('thingsboard.api.asset', [])
- .factory('assetService', AssetService)
- .name;
-
-/*@ngInject*/
-function AssetService($http, $q, customerService, userService) {
-
- var service = {
- getAsset: getAsset,
- getAssets: getAssets,
- saveAsset: saveAsset,
- deleteAsset: deleteAsset,
- assignAssetToCustomer: assignAssetToCustomer,
- unassignAssetFromCustomer: unassignAssetFromCustomer,
- makeAssetPublic: makeAssetPublic,
- getTenantAssets: getTenantAssets,
- getCustomerAssets: getCustomerAssets,
- findByQuery: findByQuery,
- fetchAssetsByNameFilter: fetchAssetsByNameFilter,
- getAssetTypes: getAssetTypes,
- findByName: findByName
- }
-
- return service;
-
- function getAsset(assetId, ignoreErrors, config) {
- var deferred = $q.defer();
- var url = '/api/asset/' + assetId;
- if (!config) {
- config = {};
- }
- config = Object.assign(config, { ignoreErrors: ignoreErrors });
- $http.get(url, config).then(function success(response) {
- deferred.resolve(response.data);
- }, function fail() {
- deferred.reject();
- });
- return deferred.promise;
- }
-
- function getAssets(assetIds, config) {
- var deferred = $q.defer();
- var ids = '';
- for (var i=0;i0) {
- ids += ',';
- }
- ids += assetIds[i];
- }
- var url = '/api/assets?assetIds=' + ids;
- $http.get(url, config).then(function success(response) {
- var assets = response.data;
- assets.sort(function (asset1, asset2) {
- var id1 = asset1.id.id;
- var id2 = asset2.id.id;
- var index1 = assetIds.indexOf(id1);
- var index2 = assetIds.indexOf(id2);
- return index1 - index2;
- });
- deferred.resolve(assets);
- }, function fail() {
- deferred.reject();
- });
- return deferred.promise;
- }
-
- function saveAsset(asset, ignoreErrors, config) {
- var deferred = $q.defer();
- var url = '/api/asset';
- if (!config) {
- config = {};
- }
- config = Object.assign(config, { ignoreErrors: ignoreErrors });
- $http.post(url, asset, config).then(function success(response) {
- deferred.resolve(response.data);
- }, function fail() {
- deferred.reject();
- });
- return deferred.promise;
- }
-
- function deleteAsset(assetId, ignoreErrors, config) {
- var deferred = $q.defer();
- var url = '/api/asset/' + assetId;
- if (!config) {
- config = {};
- }
- config = Object.assign(config, { ignoreErrors: ignoreErrors });
- $http.delete(url, config).then(function success() {
- deferred.resolve();
- }, function fail() {
- deferred.reject();
- });
- return deferred.promise;
- }
-
- function assignAssetToCustomer(customerId, assetId, ignoreErrors, config) {
- var deferred = $q.defer();
- var url = '/api/customer/' + customerId + '/asset/' + assetId;
- if (!config) {
- config = {};
- }
- config = Object.assign(config, { ignoreErrors: ignoreErrors });
- $http.post(url, null, config).then(function success(response) {
- deferred.resolve(response.data);
- }, function fail() {
- deferred.reject();
- });
- return deferred.promise;
- }
-
- function unassignAssetFromCustomer(assetId, ignoreErrors, config) {
- var deferred = $q.defer();
- var url = '/api/customer/asset/' + assetId;
- if (!config) {
- config = {};
- }
- config = Object.assign(config, { ignoreErrors: ignoreErrors });
- $http.delete(url, config).then(function success(response) {
- deferred.resolve(response.data);
- }, function fail() {
- deferred.reject();
- });
- return deferred.promise;
- }
-
- function makeAssetPublic(assetId, ignoreErrors, config) {
- var deferred = $q.defer();
- var url = '/api/customer/public/asset/' + assetId;
- if (!config) {
- config = {};
- }
- config = Object.assign(config, { ignoreErrors: ignoreErrors });
- $http.post(url, null, config).then(function success(response) {
- deferred.resolve(response.data);
- }, function fail() {
- deferred.reject();
- });
- return deferred.promise;
- }
-
- function getTenantAssets(pageLink, applyCustomersInfo, config, type) {
- var deferred = $q.defer();
- var url = '/api/tenant/assets?limit=' + pageLink.limit;
- if (angular.isDefined(pageLink.textSearch)) {
- url += '&textSearch=' + pageLink.textSearch;
- }
- if (angular.isDefined(pageLink.idOffset)) {
- url += '&idOffset=' + pageLink.idOffset;
- }
- if (angular.isDefined(pageLink.textOffset)) {
- url += '&textOffset=' + pageLink.textOffset;
- }
- if (angular.isDefined(type) && type.length) {
- url += '&type=' + type;
- }
- $http.get(url, config).then(function success(response) {
- if (applyCustomersInfo) {
- customerService.applyAssignedCustomersInfo(response.data.data).then(
- function success(data) {
- response.data.data = data;
- deferred.resolve(response.data);
- },
- function fail() {
- deferred.reject();
- }
- );
- } else {
- deferred.resolve(response.data);
- }
- }, function fail() {
- deferred.reject();
- });
- return deferred.promise;
- }
-
- function getCustomerAssets(customerId, pageLink, applyCustomersInfo, config, type) {
- var deferred = $q.defer();
- var url = '/api/customer/' + customerId + '/assets?limit=' + pageLink.limit;
- if (angular.isDefined(pageLink.textSearch)) {
- url += '&textSearch=' + pageLink.textSearch;
- }
- if (angular.isDefined(pageLink.idOffset)) {
- url += '&idOffset=' + pageLink.idOffset;
- }
- if (angular.isDefined(pageLink.textOffset)) {
- url += '&textOffset=' + pageLink.textOffset;
- }
- if (angular.isDefined(type) && type.length) {
- url += '&type=' + type;
- }
- $http.get(url, config).then(function success(response) {
- if (applyCustomersInfo) {
- customerService.applyAssignedCustomerInfo(response.data.data, customerId).then(
- function success(data) {
- response.data.data = data;
- deferred.resolve(response.data);
- },
- function fail() {
- deferred.reject();
- }
- );
- } else {
- deferred.resolve(response.data);
- }
- }, function fail() {
- deferred.reject();
- });
-
- return deferred.promise;
- }
-
- function findByQuery(query, ignoreErrors, config) {
- var deferred = $q.defer();
- var url = '/api/assets';
- if (!config) {
- config = {};
- }
- config = Object.assign(config, { ignoreErrors: ignoreErrors });
- $http.post(url, query, config).then(function success(response) {
- deferred.resolve(response.data);
- }, function fail() {
- deferred.reject();
- });
- return deferred.promise;
- }
-
- function fetchAssetsByNameFilter(assetNameFilter, limit, applyCustomersInfo, config) {
- var deferred = $q.defer();
- var user = userService.getCurrentUser();
- var promise;
- var pageLink = {limit: limit, textSearch: assetNameFilter};
- if (user.authority === 'CUSTOMER_USER') {
- var customerId = user.customerId;
- promise = getCustomerAssets(customerId, pageLink, applyCustomersInfo, config);
- } else {
- promise = getTenantAssets(pageLink, applyCustomersInfo, config);
- }
- promise.then(
- function success(result) {
- if (result.data && result.data.length > 0) {
- deferred.resolve(result.data);
- } else {
- deferred.resolve(null);
- }
- },
- function fail() {
- deferred.resolve(null);
- }
- );
- return deferred.promise;
- }
-
- function getAssetTypes(config) {
- var deferred = $q.defer();
- var url = '/api/asset/types';
- $http.get(url, config).then(function success(response) {
- deferred.resolve(response.data);
- }, function fail() {
- deferred.reject();
- });
- return deferred.promise;
- }
-
- function findByName(assetName, config) {
- config = config || {};
- var deferred = $q.defer();
- var url = '/api/tenant/assets?assetName=' + assetName;
- $http.get(url, config).then(function success(response) {
- deferred.resolve(response.data);
- }, function fail() {
- deferred.reject();
- });
- return deferred.promise;
- }
-
-}
diff --git a/ui/src/app/api/attribute.service.js b/ui/src/app/api/attribute.service.js
deleted file mode 100644
index 54655d7e29..0000000000
--- a/ui/src/app/api/attribute.service.js
+++ /dev/null
@@ -1,356 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-export default angular.module('thingsboard.api.attribute', [])
- .factory('attributeService', AttributeService)
- .name;
-
-/*@ngInject*/
-function AttributeService($http, $q, $filter, types, telemetryWebsocketService) {
-
- var entityAttributesSubscriptionMap = {};
-
- var service = {
- getEntityKeys: getEntityKeys,
- getEntityTimeseriesValues: getEntityTimeseriesValues,
- getEntityAttributesValues: getEntityAttributesValues,
- getEntityAttributes: getEntityAttributes,
- subscribeForEntityAttributes: subscribeForEntityAttributes,
- unsubscribeForEntityAttributes: unsubscribeForEntityAttributes,
- saveEntityAttributes: saveEntityAttributes,
- deleteEntityAttributes: deleteEntityAttributes,
- saveEntityTimeseries: saveEntityTimeseries,
- deleteEntityTimeseries: deleteEntityTimeseries
- }
-
- return service;
-
- function getEntityKeys(entityType, entityId, query, type, config) {
- var deferred = $q.defer();
- var url = '/api/plugins/telemetry/' + entityType + '/' + entityId + '/keys/';
- if (type === types.dataKeyType.timeseries) {
- url += 'timeseries';
- } else if (type === types.dataKeyType.attribute) {
- url += 'attributes';
- }
- $http.get(url, config).then(function success(response) {
- var result = [];
- if (response.data) {
- if (query) {
- var dataKeys = response.data;
- var lowercaseQuery = angular.lowercase(query);
- for (var i=0; i -1) {
- attribute = attributes[index];
- } else {
- attribute = {
- key: key
- };
- index = attributes.push(attribute)-1;
- keys[key] = index;
- }
- var attrData = data[key][0];
- attribute.lastUpdateTs = attrData[0];
- attribute.value = attrData[1];
- }
- if (entityAttributesSubscription.subscriptionCallback) {
- entityAttributesSubscription.subscriptionCallback(attributes);
- }
- }
- }
-
- function subscribeForEntityAttributes(entityType, entityId, attributeScope) {
- var subscriptionId = entityType + entityId + attributeScope;
- var entityAttributesSubscription = entityAttributesSubscriptionMap[subscriptionId];
- if (!entityAttributesSubscription) {
- var subscriptionCommand = {
- entityType: entityType,
- entityId: entityId,
- scope: attributeScope
- };
-
- var type = attributeScope === types.latestTelemetry.value ?
- types.dataKeyType.timeseries : types.dataKeyType.attribute;
-
- var subscriber = {
- subscriptionCommands: [subscriptionCommand],
- type: type,
- onData: function (data) {
- if (data.data) {
- onSubscriptionData(data.data, subscriptionId);
- }
- }
- };
- entityAttributesSubscription = {
- subscriber: subscriber,
- attributes: null
- };
- entityAttributesSubscriptionMap[subscriptionId] = entityAttributesSubscription;
- telemetryWebsocketService.subscribe(subscriber);
- }
- return subscriptionId;
- }
-
- function unsubscribeForEntityAttributes(subscriptionId) {
- var entityAttributesSubscription = entityAttributesSubscriptionMap[subscriptionId];
- if (entityAttributesSubscription) {
- telemetryWebsocketService.unsubscribe(entityAttributesSubscription.subscriber);
- delete entityAttributesSubscriptionMap[subscriptionId];
- }
- }
-
- function saveEntityAttributes(entityType, entityId, attributeScope, attributes, config) {
- config = config || {};
- var deferred = $q.defer();
- var attributesData = {};
- var deleteAttributes = [];
- for (var a=0; a 0) {
- keys += ',';
- }
- keys += attributes[i].key;
- }
- var url = '/api/plugins/telemetry/' + entityType + '/' + entityId + '/' + attributeScope + '?keys=' + keys;
- $http.delete(url, config).then(function success() {
- deferred.resolve();
- }, function fail() {
- deferred.reject();
- });
- return deferred.promise;
- }
-
- function deleteEntityTimeseries(entityType, entityId, timeseries, config, deleteAllDataForKeys) {
- config = config || {};
- deleteAllDataForKeys = deleteAllDataForKeys || false;
- var deferred = $q.defer();
- var keys = '';
- for (var i = 0; i < timeseries.length; i++) {
- if (i > 0) {
- keys += ',';
- }
- keys += timeseries[i].key;
- }
- var url = '/api/plugins/telemetry/' + entityType + '/' + entityId + '/timeseries/delete' +
- '?keys=' + keys +
- '&deleteAllDataForKeys=' + deleteAllDataForKeys;
- $http.delete(url, config).then(function success() {
- deferred.resolve();
- }, function fail() {
- deferred.reject();
- });
- return deferred.promise;
- }
-
-}
diff --git a/ui/src/app/api/audit-log.service.js b/ui/src/app/api/audit-log.service.js
deleted file mode 100644
index 3cb18ca040..0000000000
--- a/ui/src/app/api/audit-log.service.js
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-export default angular.module('thingsboard.api.auditLog', [])
- .factory('auditLogService', AuditLogService)
- .name;
-
-/*@ngInject*/
-function AuditLogService($http, $q) {
-
- var service = {
- getAuditLogsByEntityId: getAuditLogsByEntityId,
- getAuditLogsByUserId: getAuditLogsByUserId,
- getAuditLogsByCustomerId: getAuditLogsByCustomerId,
- getAuditLogs: getAuditLogs
- }
-
- return service;
-
- function getAuditLogsByEntityId (entityType, entityId, pageLink) {
- var deferred = $q.defer();
- var url = `/api/audit/logs/entity/${entityType}/${entityId}?limit=${pageLink.limit}`;
-
- if (angular.isDefined(pageLink.startTime) && pageLink.startTime != null) {
- url += '&startTime=' + pageLink.startTime;
- }
- if (angular.isDefined(pageLink.endTime) && pageLink.endTime != null) {
- url += '&endTime=' + pageLink.endTime;
- }
- if (angular.isDefined(pageLink.idOffset) && pageLink.idOffset != null) {
- url += '&offset=' + pageLink.idOffset;
- }
- $http.get(url, null).then(function success(response) {
- deferred.resolve(response.data);
- }, function fail() {
- deferred.reject();
- });
- return deferred.promise;
- }
-
- function getAuditLogsByUserId (userId, pageLink) {
- var deferred = $q.defer();
- var url = `/api/audit/logs/user/${userId}?limit=${pageLink.limit}`;
-
- if (angular.isDefined(pageLink.startTime) && pageLink.startTime != null) {
- url += '&startTime=' + pageLink.startTime;
- }
- if (angular.isDefined(pageLink.endTime) && pageLink.endTime != null) {
- url += '&endTime=' + pageLink.endTime;
- }
- if (angular.isDefined(pageLink.idOffset) && pageLink.idOffset != null) {
- url += '&offset=' + pageLink.idOffset;
- }
- $http.get(url, null).then(function success(response) {
- deferred.resolve(response.data);
- }, function fail() {
- deferred.reject();
- });
- return deferred.promise;
- }
-
- function getAuditLogsByCustomerId (customerId, pageLink) {
- var deferred = $q.defer();
- var url = `/api/audit/logs/customer/${customerId}?limit=${pageLink.limit}`;
-
- if (angular.isDefined(pageLink.startTime) && pageLink.startTime != null) {
- url += '&startTime=' + pageLink.startTime;
- }
- if (angular.isDefined(pageLink.endTime) && pageLink.endTime != null) {
- url += '&endTime=' + pageLink.endTime;
- }
- if (angular.isDefined(pageLink.idOffset) && pageLink.idOffset != null) {
- url += '&offset=' + pageLink.idOffset;
- }
- $http.get(url, null).then(function success(response) {
- deferred.resolve(response.data);
- }, function fail() {
- deferred.reject();
- });
- return deferred.promise;
- }
-
- function getAuditLogs (pageLink) {
- var deferred = $q.defer();
- var url = `/api/audit/logs?limit=${pageLink.limit}`;
-
- if (angular.isDefined(pageLink.startTime) && pageLink.startTime != null) {
- url += '&startTime=' + pageLink.startTime;
- }
- if (angular.isDefined(pageLink.endTime) && pageLink.endTime != null) {
- url += '&endTime=' + pageLink.endTime;
- }
- if (angular.isDefined(pageLink.idOffset) && pageLink.idOffset != null) {
- url += '&offset=' + pageLink.idOffset;
- }
- $http.get(url, null).then(function success(response) {
- deferred.resolve(response.data);
- }, function fail() {
- deferred.reject();
- });
- return deferred.promise;
- }
-
-}
diff --git a/ui/src/app/api/component-descriptor.service.js b/ui/src/app/api/component-descriptor.service.js
deleted file mode 100644
index 3c17d6ca45..0000000000
--- a/ui/src/app/api/component-descriptor.service.js
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-export default angular.module('thingsboard.api.componentDescriptor', [])
- .factory('componentDescriptorService', ComponentDescriptorService).name;
-
-/*@ngInject*/
-function ComponentDescriptorService($http, $q) {
-
- var componentsByType = {};
- var componentsByClazz = {};
- var actionsByPlugin = {};
-
- var service = {
- getComponentDescriptorsByType: getComponentDescriptorsByType,
- getComponentDescriptorByClazz: getComponentDescriptorByClazz,
- getPluginActionsByPluginClazz: getPluginActionsByPluginClazz,
- getComponentDescriptorsByTypes: getComponentDescriptorsByTypes
- }
-
- return service;
-
- function getComponentDescriptorsByType(componentType) {
- var deferred = $q.defer();
- if (componentsByType[componentType]) {
- deferred.resolve(componentsByType[componentType]);
- } else {
- var url = '/api/components/' + componentType;
- $http.get(url, null).then(function success(response) {
- componentsByType[componentType] = response.data;
- for (var i = 0; i < componentsByType[componentType].length; i++) {
- var component = componentsByType[componentType][i];
- componentsByClazz[component.clazz] = component;
- }
- deferred.resolve(componentsByType[componentType]);
- }, function fail() {
- deferred.reject();
- });
-
- }
- return deferred.promise;
- }
-
- function getComponentDescriptorsByTypes(componentTypes) {
- var deferred = $q.defer();
- var result = [];
- for (var i=componentTypes.length-1;i>=0;i--) {
- var componentType = componentTypes[i];
- if (componentsByType[componentType]) {
- result = result.concat(componentsByType[componentType]);
- componentTypes.splice(i, 1);
- }
- }
- if (!componentTypes.length) {
- deferred.resolve(result);
- } else {
- var url = '/api/components?componentTypes=' + componentTypes.join(',');
- $http.get(url, null).then(function success(response) {
- var components = response.data;
- for (var i = 0; i < components.length; i++) {
- var component = components[i];
- var componentsList = componentsByType[component.type];
- if (!componentsList) {
- componentsList = [];
- componentsByType[component.type] = componentsList;
- }
- componentsList.push(component);
- componentsByClazz[component.clazz] = component;
- }
- result = result.concat(components);
- deferred.resolve(components);
- }, function fail() {
- deferred.reject();
- });
- }
- return deferred.promise;
- }
-
- function getComponentDescriptorByClazz(componentDescriptorClazz) {
- var deferred = $q.defer();
- if (componentsByClazz[componentDescriptorClazz]) {
- deferred.resolve(componentsByClazz[componentDescriptorClazz]);
- } else {
- var url = '/api/component/' + componentDescriptorClazz;
- $http.get(url, null).then(function success(response) {
- componentsByClazz[componentDescriptorClazz] = response.data;
- deferred.resolve(componentsByClazz[componentDescriptorClazz]);
- }, function fail() {
- deferred.reject();
- });
- }
- return deferred.promise;
- }
-
- function getPluginActionsByPluginClazz(pluginClazz) {
- var deferred = $q.defer();
- if (actionsByPlugin[pluginClazz]) {
- deferred.resolve(actionsByPlugin[pluginClazz]);
- } else {
- var url = '/api/components/actions/' + pluginClazz;
- $http.get(url, null).then(function success(response) {
- actionsByPlugin[pluginClazz] = response.data;
- deferred.resolve(actionsByPlugin[pluginClazz]);
- }, function fail() {
- deferred.reject();
- });
- }
- return deferred.promise;
- }
-
-}
diff --git a/ui/src/app/api/customer.service.js b/ui/src/app/api/customer.service.js
deleted file mode 100644
index 2042130ae8..0000000000
--- a/ui/src/app/api/customer.service.js
+++ /dev/null
@@ -1,170 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-export default angular.module('thingsboard.api.customer', [])
- .factory('customerService', CustomerService)
- .name;
-
-/*@ngInject*/
-function CustomerService($http, $q, types) {
-
- var service = {
- getCustomers: getCustomers,
- getCustomer: getCustomer,
- getShortCustomerInfo: getShortCustomerInfo,
- applyAssignedCustomersInfo: applyAssignedCustomersInfo,
- applyAssignedCustomerInfo: applyAssignedCustomerInfo,
- deleteCustomer: deleteCustomer,
- saveCustomer: saveCustomer
- }
-
- return service;
-
- function getCustomers(pageLink, config) {
- var deferred = $q.defer();
- var url = '/api/customers?limit=' + pageLink.limit;
- if (angular.isDefined(pageLink.textSearch)) {
- url += '&textSearch=' + pageLink.textSearch;
- }
- if (angular.isDefined(pageLink.idOffset)) {
- url += '&idOffset=' + pageLink.idOffset;
- }
- if (angular.isDefined(pageLink.textOffset)) {
- url += '&textOffset=' + pageLink.textOffset;
- }
- $http.get(url, config).then(function success(response) {
- deferred.resolve(response.data);
- }, function fail() {
- deferred.reject();
- });
- return deferred.promise;
- }
-
- function getCustomer(customerId, config) {
- var deferred = $q.defer();
- var url = '/api/customer/' + customerId;
- $http.get(url, config).then(function success(response) {
- deferred.resolve(response.data);
- }, function fail(response) {
- deferred.reject(response.data);
- });
- return deferred.promise;
- }
-
- function getShortCustomerInfo(customerId) {
- var deferred = $q.defer();
- var url = '/api/customer/' + customerId + '/shortInfo';
- $http.get(url, null).then(function success(response) {
- deferred.resolve(response.data);
- }, function fail(response) {
- deferred.reject(response.data);
- });
- return deferred.promise;
- }
-
- function applyAssignedCustomersInfo(items) {
- var deferred = $q.defer();
- var assignedCustomersMap = {};
- function loadNextCustomerInfoOrComplete(i) {
- i++;
- if (i < items.length) {
- loadNextCustomerInfo(i);
- } else {
- deferred.resolve(items);
- }
- }
-
- function loadNextCustomerInfo(i) {
- var item = items[i];
- item.assignedCustomer = {};
- if (item.customerId && item.customerId.id != types.id.nullUid) {
- item.assignedCustomer.id = item.customerId.id;
- var assignedCustomer = assignedCustomersMap[item.customerId.id];
- if (assignedCustomer){
- item.assignedCustomer = assignedCustomer;
- loadNextCustomerInfoOrComplete(i);
- } else {
- getShortCustomerInfo(item.customerId.id).then(
- function success(info) {
- assignedCustomer = {
- id: item.customerId.id,
- title: info.title,
- isPublic: info.isPublic
- };
- assignedCustomersMap[assignedCustomer.id] = assignedCustomer;
- item.assignedCustomer = assignedCustomer;
- loadNextCustomerInfoOrComplete(i);
- },
- function fail() {
- loadNextCustomerInfoOrComplete(i);
- }
- );
- }
- } else {
- loadNextCustomerInfoOrComplete(i);
- }
- }
- if (items.length > 0) {
- loadNextCustomerInfo(0);
- } else {
- deferred.resolve(items);
- }
- return deferred.promise;
- }
-
- function applyAssignedCustomerInfo(items, customerId) {
- var deferred = $q.defer();
- getShortCustomerInfo(customerId).then(
- function success(info) {
- var assignedCustomer = {
- id: customerId,
- title: info.title,
- isPublic: info.isPublic
- }
- items.forEach(function(item) {
- item.assignedCustomer = assignedCustomer;
- });
- deferred.resolve(items);
- },
- function fail() {
- deferred.reject();
- }
- );
- return deferred.promise;
- }
-
- function saveCustomer(customer) {
- var deferred = $q.defer();
- var url = '/api/customer';
- $http.post(url, customer).then(function success(response) {
- deferred.resolve(response.data);
- }, function fail(response) {
- deferred.reject(response.data);
- });
- return deferred.promise;
- }
-
- function deleteCustomer(customerId) {
- var deferred = $q.defer();
- var url = '/api/customer/' + customerId;
- $http.delete(url).then(function success() {
- deferred.resolve();
- }, function fail(response) {
- deferred.reject(response.data);
- });
- return deferred.promise;
- }
-
-}
diff --git a/ui/src/app/api/dashboard.service.js b/ui/src/app/api/dashboard.service.js
deleted file mode 100644
index dbe8f44d0a..0000000000
--- a/ui/src/app/api/dashboard.service.js
+++ /dev/null
@@ -1,295 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-export default angular.module('thingsboard.api.dashboard', [])
- .factory('dashboardService', DashboardService).name;
-
-/*@ngInject*/
-function DashboardService($rootScope, $http, $q, $location, $filter) {
-
- var stDiffPromise;
-
- $rootScope.dadshboardServiceStateChangeStartHandle = $rootScope.$on('$stateChangeStart', function () {
- stDiffPromise = undefined;
- });
-
-
- var service = {
- assignDashboardToCustomer: assignDashboardToCustomer,
- getCustomerDashboards: getCustomerDashboards,
- getServerTimeDiff: getServerTimeDiff,
- getDashboard: getDashboard,
- getDashboardInfo: getDashboardInfo,
- getTenantDashboardsByTenantId: getTenantDashboardsByTenantId,
- getTenantDashboards: getTenantDashboards,
- deleteDashboard: deleteDashboard,
- saveDashboard: saveDashboard,
- unassignDashboardFromCustomer: unassignDashboardFromCustomer,
- updateDashboardCustomers: updateDashboardCustomers,
- addDashboardCustomers: addDashboardCustomers,
- removeDashboardCustomers: removeDashboardCustomers,
- makeDashboardPublic: makeDashboardPublic,
- makeDashboardPrivate: makeDashboardPrivate,
- getPublicDashboardLink: getPublicDashboardLink
- }
-
- return service;
-
- function getTenantDashboardsByTenantId(tenantId, pageLink, config) {
- var deferred = $q.defer();
- var url = '/api/tenant/' + tenantId + '/dashboards?limit=' + pageLink.limit;
- if (angular.isDefined(pageLink.textSearch)) {
- url += '&textSearch=' + pageLink.textSearch;
- }
- if (angular.isDefined(pageLink.idOffset)) {
- url += '&idOffset=' + pageLink.idOffset;
- }
- if (angular.isDefined(pageLink.textOffset)) {
- url += '&textOffset=' + pageLink.textOffset;
- }
- $http.get(url, config).then(function success(response) {
- deferred.resolve(prepareDashboards(response.data));
- }, function fail() {
- deferred.reject();
- });
- return deferred.promise;
- }
-
- function getTenantDashboards(pageLink, config) {
- var deferred = $q.defer();
- var url = '/api/tenant/dashboards?limit=' + pageLink.limit;
- if (angular.isDefined(pageLink.textSearch)) {
- url += '&textSearch=' + pageLink.textSearch;
- }
- if (angular.isDefined(pageLink.idOffset)) {
- url += '&idOffset=' + pageLink.idOffset;
- }
- if (angular.isDefined(pageLink.textOffset)) {
- url += '&textOffset=' + pageLink.textOffset;
- }
- $http.get(url, config).then(function success(response) {
- deferred.resolve(prepareDashboards(response.data));
- }, function fail() {
- deferred.reject();
- });
- return deferred.promise;
- }
-
- function getCustomerDashboards(customerId, pageLink, config) {
- var deferred = $q.defer();
- var url = '/api/customer/' + customerId + '/dashboards?limit=' + pageLink.limit;
- if (angular.isDefined(pageLink.idOffset)) {
- url += '&offset=' + pageLink.idOffset;
- }
- $http.get(url, config).then(function success(response) {
- response.data = prepareDashboards(response.data);
- if (pageLink.textSearch) {
- response.data.data = $filter('filter')(response.data.data, {title: pageLink.textSearch});
- }
- deferred.resolve(response.data);
- }, function fail() {
- deferred.reject();
- });
- return deferred.promise;
- }
-
- function getServerTimeDiff() {
- if (stDiffPromise) {
- return stDiffPromise;
- } else {
- var deferred = $q.defer();
- stDiffPromise = deferred.promise;
- var url = '/api/dashboard/serverTime';
- var ct1 = Date.now();
- $http.get(url, {ignoreLoading: true}).then(function success(response) {
- var ct2 = Date.now();
- var st = response.data;
- var stDiff = Math.ceil(st - (ct1 + ct2) / 2);
- deferred.resolve(stDiff);
- }, function fail() {
- deferred.reject();
- });
- }
- return stDiffPromise;
- }
-
- function getDashboard(dashboardId) {
- var deferred = $q.defer();
- var url = '/api/dashboard/' + dashboardId;
- $http.get(url, null).then(function success(response) {
- deferred.resolve(prepareDashboard(response.data));
- }, function fail() {
- deferred.reject();
- });
- return deferred.promise;
- }
-
- function getDashboardInfo(dashboardId, config) {
- var deferred = $q.defer();
- var url = '/api/dashboard/info/' + dashboardId;
- $http.get(url, config).then(function success(response) {
- deferred.resolve(prepareDashboard(response.data));
- }, function fail() {
- deferred.reject();
- });
- return deferred.promise;
- }
-
- function saveDashboard(dashboard) {
- var deferred = $q.defer();
- var url = '/api/dashboard';
- $http.post(url, cleanDashboard(dashboard)).then(function success(response) {
- deferred.resolve(prepareDashboard(response.data));
- }, function fail() {
- deferred.reject();
- });
- return deferred.promise;
- }
-
- function deleteDashboard(dashboardId) {
- var deferred = $q.defer();
- var url = '/api/dashboard/' + dashboardId;
- $http.delete(url).then(function success() {
- deferred.resolve();
- }, function fail() {
- deferred.reject();
- });
- return deferred.promise;
- }
-
- function assignDashboardToCustomer(customerId, dashboardId) {
- var deferred = $q.defer();
- var url = '/api/customer/' + customerId + '/dashboard/' + dashboardId;
- $http.post(url, null).then(function success(response) {
- deferred.resolve(prepareDashboard(response.data));
- }, function fail() {
- deferred.reject();
- });
- return deferred.promise;
- }
-
- function unassignDashboardFromCustomer(customerId, dashboardId) {
- var deferred = $q.defer();
- var url = '/api/customer/' + customerId + '/dashboard/' + dashboardId;
- $http.delete(url).then(function success(response) {
- deferred.resolve(prepareDashboard(response.data));
- }, function fail() {
- deferred.reject();
- });
- return deferred.promise;
- }
-
- function updateDashboardCustomers(dashboardId, customerIds) {
- var deferred = $q.defer();
- var url = '/api/dashboard/' + dashboardId + '/customers';
- $http.post(url, customerIds).then(function success(response) {
- deferred.resolve(prepareDashboard(response.data));
- }, function fail() {
- deferred.reject();
- });
- return deferred.promise;
- }
-
- function addDashboardCustomers(dashboardId, customerIds) {
- var deferred = $q.defer();
- var url = '/api/dashboard/' + dashboardId + '/customers/add';
- $http.post(url, customerIds).then(function success(response) {
- deferred.resolve(prepareDashboard(response.data));
- }, function fail() {
- deferred.reject();
- });
- return deferred.promise;
- }
-
- function removeDashboardCustomers(dashboardId, customerIds) {
- var deferred = $q.defer();
- var url = '/api/dashboard/' + dashboardId + '/customers/remove';
- $http.post(url, customerIds).then(function success(response) {
- deferred.resolve(prepareDashboard(response.data));
- }, function fail() {
- deferred.reject();
- });
- return deferred.promise;
- }
-
- function makeDashboardPublic(dashboardId) {
- var deferred = $q.defer();
- var url = '/api/customer/public/dashboard/' + dashboardId;
- $http.post(url, null).then(function success(response) {
- deferred.resolve(prepareDashboard(response.data));
- }, function fail() {
- deferred.reject();
- });
- return deferred.promise;
- }
-
- function makeDashboardPrivate(dashboardId) {
- var deferred = $q.defer();
- var url = '/api/customer/public/dashboard/' + dashboardId;
- $http.delete(url).then(function success(response) {
- deferred.resolve(prepareDashboard(response.data));
- }, function fail() {
- deferred.reject();
- });
- return deferred.promise;
- }
-
- function getPublicDashboardLink(dashboard) {
- var url = $location.protocol() + '://' + $location.host();
- var port = $location.port();
- if (port != 80 && port != 443) {
- url += ":" + port;
- }
- url += "/dashboard/" + dashboard.id.id + "?publicId=" + dashboard.publicCustomerId;
- return url;
- }
-
- function prepareDashboards(dashboardsData) {
- if (dashboardsData.data) {
- for (var i = 0; i < dashboardsData.data.length; i++) {
- dashboardsData.data[i] = prepareDashboard(dashboardsData.data[i]);
- }
- }
- return dashboardsData;
- }
-
- function prepareDashboard(dashboard) {
- dashboard.publicCustomerId = null;
- dashboard.assignedCustomersText = "";
- dashboard.assignedCustomersIds = [];
- if (dashboard.assignedCustomers && dashboard.assignedCustomers.length) {
- var assignedCustomersTitles = [];
- for (var i = 0; i < dashboard.assignedCustomers.length; i++) {
- var assignedCustomer = dashboard.assignedCustomers[i];
- dashboard.assignedCustomersIds.push(assignedCustomer.customerId.id);
- if (assignedCustomer.public) {
- dashboard.publicCustomerId = assignedCustomer.customerId.id;
- } else {
- assignedCustomersTitles.push(assignedCustomer.title);
- }
- }
- dashboard.assignedCustomersText = assignedCustomersTitles.join(', ');
- }
- return dashboard;
- }
-
- function cleanDashboard(dashboard) {
- delete dashboard.publicCustomerId;
- delete dashboard.assignedCustomersText;
- delete dashboard.assignedCustomersIds;
- return dashboard;
- }
-
-}
diff --git a/ui/src/app/api/data-aggregator.js b/ui/src/app/api/data-aggregator.js
deleted file mode 100644
index 6efdeff4e7..0000000000
--- a/ui/src/app/api/data-aggregator.js
+++ /dev/null
@@ -1,316 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-export default class DataAggregator {
-
- constructor(onDataCb, tsKeyNames, startTs, limit, aggregationType, timeWindow, interval,
- stateData, types, $timeout, $filter) {
- this.onDataCb = onDataCb;
- this.tsKeyNames = tsKeyNames;
- this.dataBuffer = {};
- for (var k = 0; k < tsKeyNames.length; k++) {
- this.dataBuffer[tsKeyNames[k]] = [];
- }
- this.startTs = startTs;
- this.aggregationType = aggregationType;
- this.types = types;
- this.$timeout = $timeout;
- this.$filter = $filter;
- this.dataReceived = false;
- this.resetPending = false;
- this.noAggregation = aggregationType === types.aggregation.none.value;
- this.limit = limit;
- this.timeWindow = timeWindow;
- this.interval = interval;
- this.stateData = stateData;
- if (this.stateData) {
- this.lastPrevKvPairData = {};
- }
- this.aggregationTimeout = Math.max(this.interval, 1000);
- switch (aggregationType) {
- case types.aggregation.min.value:
- this.aggFunction = min;
- break;
- case types.aggregation.max.value:
- this.aggFunction = max;
- break;
- case types.aggregation.avg.value:
- this.aggFunction = avg;
- break;
- case types.aggregation.sum.value:
- this.aggFunction = sum;
- break;
- case types.aggregation.count.value:
- this.aggFunction = count;
- break;
- case types.aggregation.none.value:
- this.aggFunction = none;
- break;
- default:
- this.aggFunction = avg;
- }
- }
-
- reset(startTs, timeWindow, interval) {
- if (this.intervalTimeoutHandle) {
- this.$timeout.cancel(this.intervalTimeoutHandle);
- this.intervalTimeoutHandle = null;
- }
- this.intervalScheduledTime = currentTime();
- this.startTs = startTs;
- this.timeWindow = timeWindow;
- this.interval = interval;
- this.endTs = this.startTs + this.timeWindow;
- this.elapsed = 0;
- this.aggregationTimeout = Math.max(this.interval, 1000);
- this.resetPending = true;
- var self = this;
- this.intervalTimeoutHandle = this.$timeout(function() {
- self.onInterval();
- }, this.aggregationTimeout, false);
- }
-
- onData(data, update, history, apply) {
- if (!this.dataReceived || this.resetPending) {
- var updateIntervalScheduledTime = true;
- if (!this.dataReceived) {
- this.elapsed = 0;
- this.dataReceived = true;
- this.endTs = this.startTs + this.timeWindow;
- }
- if (this.resetPending) {
- this.resetPending = false;
- updateIntervalScheduledTime = false;
- }
- if (update) {
- this.aggregationMap = {};
- updateAggregatedData(this.aggregationMap, this.aggregationType === this.types.aggregation.count.value,
- this.noAggregation, this.aggFunction, data.data, this.interval, this.startTs);
- } else {
- this.aggregationMap = processAggregatedData(data.data, this.aggregationType === this.types.aggregation.count.value, this.noAggregation);
- }
- if (updateIntervalScheduledTime) {
- this.intervalScheduledTime = currentTime();
- }
- this.onInterval(history, apply);
- } else {
- updateAggregatedData(this.aggregationMap, this.aggregationType === this.types.aggregation.count.value,
- this.noAggregation, this.aggFunction, data.data, this.interval, this.startTs);
- if (history) {
- this.intervalScheduledTime = currentTime();
- this.onInterval(history, apply);
- }
- }
- }
-
- onInterval(history, apply) {
- var now = currentTime();
- this.elapsed += now - this.intervalScheduledTime;
- this.intervalScheduledTime = now;
- if (this.intervalTimeoutHandle) {
- this.$timeout.cancel(this.intervalTimeoutHandle);
- this.intervalTimeoutHandle = null;
- }
- if (!history) {
- var delta = Math.floor(this.elapsed / this.interval);
- if (delta || !this.data) {
- this.startTs += delta * this.interval;
- this.endTs += delta * this.interval;
- this.data = this.updateData();
- this.elapsed = this.elapsed - delta * this.interval;
- }
- } else {
- this.data = this.updateData();
- }
- if (this.onDataCb) {
- this.onDataCb(this.data, apply);
- }
-
- var self = this;
- if (!history) {
- this.intervalTimeoutHandle = this.$timeout(function() {
- self.onInterval();
- }, this.aggregationTimeout, false);
- }
- }
-
- updateData() {
- for (var k = 0; k < this.tsKeyNames.length; k++) {
- this.dataBuffer[this.tsKeyNames[k]] = [];
- }
- for (var key in this.aggregationMap) {
- var aggKeyData = this.aggregationMap[key];
- var keyData = this.dataBuffer[key];
- for (var aggTimestamp in aggKeyData) {
- if (aggTimestamp <= this.startTs) {
- if (this.stateData &&
- (!this.lastPrevKvPairData[key] || this.lastPrevKvPairData[key][0] < aggTimestamp)) {
- this.lastPrevKvPairData[key] = [Number(aggTimestamp), aggKeyData[aggTimestamp].aggValue];
- }
- delete aggKeyData[aggTimestamp];
- } else if (aggTimestamp <= this.endTs) {
- var aggData = aggKeyData[aggTimestamp];
- var kvPair = [Number(aggTimestamp), aggData.aggValue];
- keyData.push(kvPair);
- }
- }
- keyData = this.$filter('orderBy')(keyData, '+this[0]');
- if (this.stateData) {
- this.updateStateBounds(keyData, angular.copy(this.lastPrevKvPairData[key]));
- }
- if (keyData.length > this.limit) {
- keyData = keyData.slice(keyData.length - this.limit);
- }
- this.dataBuffer[key] = keyData;
- }
- return this.dataBuffer;
- }
-
- updateStateBounds(keyData, lastPrevKvPair) {
- if (lastPrevKvPair) {
- lastPrevKvPair[0] = this.startTs;
- }
- var firstKvPair;
- if (!keyData.length) {
- if (lastPrevKvPair) {
- firstKvPair = lastPrevKvPair;
- keyData.push(firstKvPair);
- }
- } else {
- firstKvPair = keyData[0];
- }
- if (firstKvPair && firstKvPair[0] > this.startTs) {
- if (lastPrevKvPair) {
- keyData.unshift(lastPrevKvPair);
- }
- }
- if (keyData.length) {
- var lastKvPair = keyData[keyData.length-1];
- if (lastKvPair[0] < this.endTs) {
- lastKvPair = angular.copy(lastKvPair);
- lastKvPair[0] = this.endTs;
- keyData.push(lastKvPair);
- }
- }
- }
-
- destroy() {
- if (this.intervalTimeoutHandle) {
- this.$timeout.cancel(this.intervalTimeoutHandle);
- this.intervalTimeoutHandle = null;
- }
- this.aggregationMap = null;
- }
-
-}
-
-/* eslint-disable */
-function currentTime() {
- return window.performance && window.performance.now ?
- window.performance.now() : Date.now();
-}
-/* eslint-enable */
-
-function processAggregatedData(data, isCount, noAggregation) {
- var aggregationMap = {};
- for (var key in data) {
- var aggKeyData = aggregationMap[key];
- if (!aggKeyData) {
- aggKeyData = {};
- aggregationMap[key] = aggKeyData;
- }
- var keyData = data[key];
- for (var i = 0; i < keyData.length; i++) {
- var kvPair = keyData[i];
- var timestamp = kvPair[0];
- var value = convertValue(kvPair[1], noAggregation);
- var aggKey = timestamp;
- var aggData = {
- count: isCount ? value : 1,
- sum: value,
- aggValue: value
- }
- aggKeyData[aggKey] = aggData;
- }
- }
- return aggregationMap;
-}
-
-function updateAggregatedData(aggregationMap, isCount, noAggregation, aggFunction, data, interval, startTs) {
- for (var key in data) {
- var aggKeyData = aggregationMap[key];
- if (!aggKeyData) {
- aggKeyData = {};
- aggregationMap[key] = aggKeyData;
- }
- var keyData = data[key];
- for (var i = 0; i < keyData.length; i++) {
- var kvPair = keyData[i];
- var timestamp = kvPair[0];
- var value = convertValue(kvPair[1], noAggregation);
- var aggTimestamp = noAggregation ? timestamp : (startTs + Math.floor((timestamp - startTs) / interval) * interval + interval/2);
- var aggData = aggKeyData[aggTimestamp];
- if (!aggData) {
- aggData = {
- count: 1,
- sum: value,
- aggValue: isCount ? 1 : value
- }
- aggKeyData[aggTimestamp] = aggData;
- } else {
- aggFunction(aggData, value);
- }
- }
- }
-}
-
-function convertValue(value, noAggregation) {
- if (!noAggregation || value && isNumeric(value)) {
- return Number(value);
- } else {
- return value;
- }
-}
-
-function isNumeric(value) {
- return (value - parseFloat( value ) + 1) >= 0;
-}
-
-function avg(aggData, value) {
- aggData.count++;
- aggData.sum += value;
- aggData.aggValue = aggData.sum / aggData.count;
-}
-
-function min(aggData, value) {
- aggData.aggValue = Math.min(aggData.aggValue, value);
-}
-
-function max(aggData, value) {
- aggData.aggValue = Math.max(aggData.aggValue, value);
-}
-
-function sum(aggData, value) {
- aggData.aggValue = aggData.aggValue + value;
-}
-
-function count(aggData) {
- aggData.count++;
- aggData.aggValue = aggData.count;
-}
-
-function none(aggData, value) {
- aggData.aggValue = value;
-}
diff --git a/ui/src/app/api/datasource.service.js b/ui/src/app/api/datasource.service.js
deleted file mode 100644
index 72a1a3087d..0000000000
--- a/ui/src/app/api/datasource.service.js
+++ /dev/null
@@ -1,747 +0,0 @@
-/*
- * Copyright © 2016-2020 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 thingsboardApiDevice from './device.service';
-import thingsboardApiTelemetryWebsocket from './telemetry-websocket.service';
-import thingsboardTypes from '../common/types.constant';
-import thingsboardUtils from '../common/utils.service';
-import DataAggregator from './data-aggregator';
-
-export default angular.module('thingsboard.api.datasource', [thingsboardApiDevice, thingsboardApiTelemetryWebsocket, thingsboardTypes, thingsboardUtils])
- .factory('datasourceService', DatasourceService)
- .name;
-
-const YEAR = 1000 * 60 * 60 * 24 * 365;
-
-/*@ngInject*/
-function DatasourceService($timeout, $filter, $log, telemetryWebsocketService, types, utils) {
-
- var subscriptions = {};
-
- var service = {
- subscribeToDatasource: subscribeToDatasource,
- unsubscribeFromDatasource: unsubscribeFromDatasource
- }
-
- return service;
-
- function subscribeToDatasource(listener) {
- var datasource = listener.datasource;
-
- if (datasource.type === types.datasourceType.entity && (!listener.entityId || !listener.entityType)) {
- return;
- }
-
- var subscriptionDataKeys = [];
- for (var d = 0; d < datasource.dataKeys.length; d++) {
- var dataKey = datasource.dataKeys[d];
- var subscriptionDataKey = {
- name: dataKey.name,
- type: dataKey.type,
- funcBody: dataKey.funcBody,
- postFuncBody: dataKey.postFuncBody
- }
- subscriptionDataKeys.push(subscriptionDataKey);
- }
-
- var datasourceSubscription = {
- datasourceType: datasource.type,
- dataKeys: subscriptionDataKeys,
- type: listener.subscriptionType
- };
-
- if (listener.subscriptionType === types.widgetType.timeseries.value) {
- datasourceSubscription.subscriptionTimewindow = angular.copy(listener.subscriptionTimewindow);
- }
- if (datasourceSubscription.datasourceType === types.datasourceType.entity) {
- datasourceSubscription.entityType = listener.entityType;
- datasourceSubscription.entityId = listener.entityId;
- }
-
- listener.datasourceSubscriptionKey = utils.objectHashCode(datasourceSubscription);
- var subscription;
- if (subscriptions[listener.datasourceSubscriptionKey]) {
- subscription = subscriptions[listener.datasourceSubscriptionKey];
- subscription.syncListener(listener);
- } else {
- subscription = new DatasourceSubscription(datasourceSubscription, telemetryWebsocketService, $timeout, $filter, $log, types, utils);
- subscriptions[listener.datasourceSubscriptionKey] = subscription;
- subscription.start();
- }
- subscription.addListener(listener);
- }
-
- function unsubscribeFromDatasource(listener) {
- if (listener.datasourceSubscriptionKey) {
- if (subscriptions[listener.datasourceSubscriptionKey]) {
- var subscription = subscriptions[listener.datasourceSubscriptionKey];
- subscription.removeListener(listener);
- if (!subscription.hasListeners()) {
- subscription.unsubscribe();
- delete subscriptions[listener.datasourceSubscriptionKey];
- }
- }
- listener.datasourceSubscriptionKey = null;
- }
- }
-
-}
-
-function DatasourceSubscription(datasourceSubscription, telemetryWebsocketService, $timeout, $filter, $log, types, utils) {
-
- var listeners = [];
- var datasourceType = datasourceSubscription.datasourceType;
- var datasourceData = {};
- var dataSourceOrigData = {};
- var dataKeys = {};
- var subscribers = [];
- var history = datasourceSubscription.subscriptionTimewindow &&
- datasourceSubscription.subscriptionTimewindow.fixedWindow;
- var realtime = datasourceSubscription.subscriptionTimewindow &&
- datasourceSubscription.subscriptionTimewindow.realtimeWindowMs;
- var timer;
- var frequency;
- var tickElapsed = 0;
- var tickScheduledTime = 0;
- var dataAggregator;
-
- var subscription = {
- addListener: addListener,
- hasListeners: hasListeners,
- removeListener: removeListener,
- syncListener: syncListener,
- start: start,
- unsubscribe: unsubscribe
- }
-
- initializeSubscription();
-
- return subscription;
-
- function initializeSubscription() {
- for (var i = 0; i < datasourceSubscription.dataKeys.length; i++) {
- var dataKey = angular.copy(datasourceSubscription.dataKeys[i]);
- dataKey.index = i;
- var key;
- if (datasourceType === types.datasourceType.function) {
- if (!dataKey.func) {
- dataKey.func = new Function("time", "prevValue", dataKey.funcBody);
- }
- } else {
- if (dataKey.postFuncBody && !dataKey.postFunc) {
- dataKey.postFunc = new Function("time", "value", "prevValue", "timePrev", "prevOrigValue", dataKey.postFuncBody);
- }
- }
- if (datasourceType === types.datasourceType.entity || datasourceSubscription.type === types.widgetType.timeseries.value) {
- if (datasourceType === types.datasourceType.function) {
- key = dataKey.name + '_' + dataKey.index + '_' + dataKey.type;
- } else {
- key = dataKey.name + '_' + dataKey.type;
- }
- var dataKeysList = dataKeys[key];
- if (!dataKeysList) {
- dataKeysList = [];
- dataKeys[key] = dataKeysList;
- }
- var index = dataKeysList.push(dataKey) - 1;
- datasourceData[key + '_' + index] = {
- data: []
- };
- } else {
- key = utils.objectHashCode(dataKey);
- datasourceData[key] = {
- data: []
- };
- dataKeys[key] = dataKey;
- }
- dataSourceOrigData = angular.copy(datasourceData);
- dataKey.key = key;
- }
- if (datasourceType === types.datasourceType.function) {
- frequency = 1000;
- if (datasourceSubscription.type === types.widgetType.timeseries.value) {
- frequency = Math.min(datasourceSubscription.subscriptionTimewindow.aggregation.interval, 5000);
- }
- }
- }
-
- function addListener(listener) {
- listeners.push(listener);
- if (history) {
- start();
- }
- }
-
- function hasListeners() {
- return listeners.length > 0;
- }
-
- function removeListener(listener) {
- listeners.splice(listeners.indexOf(listener), 1);
- }
-
- function syncListener(listener) {
- var key;
- var dataKey;
- if (datasourceType === types.datasourceType.entity || datasourceSubscription.type === types.widgetType.timeseries.value) {
- for (key in dataKeys) {
- var dataKeysList = dataKeys[key];
- for (var i = 0; i < dataKeysList.length; i++) {
- dataKey = dataKeysList[i];
- var datasourceKey = key + '_' + i;
- listener.dataUpdated(datasourceData[datasourceKey],
- listener.datasourceIndex,
- dataKey.index, false);
- }
- }
- } else {
- for (key in dataKeys) {
- dataKey = dataKeys[key];
- listener.dataUpdated(datasourceData[key],
- listener.datasourceIndex,
- dataKey.index, false);
- }
- }
- }
-
- function start() {
- if (history && !hasListeners()) {
- return;
- }
- var subsTw = datasourceSubscription.subscriptionTimewindow;
- var tsKeyNames = [];
- var dataKey;
-
- if (datasourceType === types.datasourceType.entity) {
-
- //send subscribe command
-
- var tsKeys = '';
- var attrKeys = '';
-
- for (var key in dataKeys) {
- var dataKeysList = dataKeys[key];
- dataKey = dataKeysList[0];
- if (dataKey.type === types.dataKeyType.timeseries) {
- if (tsKeys.length > 0) {
- tsKeys += ',';
- }
- tsKeys += dataKey.name;
- tsKeyNames.push(dataKey.name);
- } else if (dataKey.type === types.dataKeyType.attribute) {
- if (attrKeys.length > 0) {
- attrKeys += ',';
- }
- attrKeys += dataKey.name;
- }
- }
-
- if (tsKeys.length > 0) {
-
- var subscriber;
-
- if (history) {
-
- var historyCommand = {
- entityType: datasourceSubscription.entityType,
- entityId: datasourceSubscription.entityId,
- keys: tsKeys,
- startTs: subsTw.fixedWindow.startTimeMs,
- endTs: subsTw.fixedWindow.endTimeMs,
- interval: subsTw.aggregation.interval,
- limit: subsTw.aggregation.limit,
- agg: subsTw.aggregation.type
- };
-
- subscriber = {
- historyCommands: [ historyCommand ],
- type: types.dataKeyType.timeseries,
- subsTw: subsTw
- };
-
- if (subsTw.aggregation.stateData) {
- subscriber.firstStateHistoryCommand = createFirstStateHistoryCommand(subsTw.fixedWindow.startTimeMs, tsKeys);
- subscriber.historyCommands.push(subscriber.firstStateHistoryCommand);
- }
-
- subscriber.onData = function (data, subscriptionId) {
- if (this.subsTw.aggregation.stateData &&
- this.firstStateHistoryCommand && this.firstStateHistoryCommand.cmdId == subscriptionId) {
- if (this.data) {
- onStateHistoryData(data, this.data, this.subsTw.aggregation.limit,
- subsTw.fixedWindow.startTimeMs, this.subsTw.fixedWindow.endTimeMs,
- (data) => {
- onData(data.data, types.dataKeyType.timeseries, true);
- });
- } else {
- this.firstStateData = data;
- }
- } else {
- if (this.subsTw.aggregation.stateData) {
- if (this.firstStateData) {
- onStateHistoryData(this.firstStateData, data, this.subsTw.aggregation.limit,
- this.subsTw.fixedWindow.startTimeMs, this.subsTw.fixedWindow.endTimeMs,
- (data) => {
- onData(data.data, types.dataKeyType.timeseries, true);
- });
- } else {
- this.data = data;
- }
- } else {
- for (key in data.data) {
- var keyData = data.data[key];
- data.data[key] = $filter('orderBy')(keyData, '+this[0]');
- }
- onData(data.data, types.dataKeyType.timeseries, true);
- }
- }
- };
- subscriber.onReconnected = function() {};
- telemetryWebsocketService.subscribe(subscriber);
- subscribers.push(subscriber);
-
- } else {
-
- var subscriptionCommand = {
- entityType: datasourceSubscription.entityType,
- entityId: datasourceSubscription.entityId,
- keys: tsKeys
- };
-
- subscriber = {
- subscriptionCommands: [subscriptionCommand],
- type: types.dataKeyType.timeseries
- };
-
- if (datasourceSubscription.type === types.widgetType.timeseries.value) {
- subscriber.subsTw = subsTw;
- updateRealtimeSubscriptionCommand(subscriptionCommand, subsTw);
-
- if (subsTw.aggregation.stateData) {
- subscriber.firstStateSubscriptionCommand = createFirstStateHistoryCommand(subsTw.startTs, tsKeys);
- subscriber.historyCommands = [subscriber.firstStateSubscriptionCommand];
- }
- dataAggregator = createRealtimeDataAggregator(subsTw, tsKeyNames, types.dataKeyType.timeseries);
- subscriber.onData = function(data, subscriptionId) {
- if (this.subsTw.aggregation.stateData &&
- this.firstStateSubscriptionCommand && this.firstStateSubscriptionCommand.cmdId == subscriptionId) {
- if (this.data) {
- onStateHistoryData(data, this.data, this.subsTw.aggregation.limit,
- this.subsTw.startTs, this.subsTw.startTs + this.subsTw.aggregation.timeWindow,
- (data) => {
- dataAggregator.onData(data, false, false, true);
- });
- this.stateDataReceived = true;
- } else {
- this.firstStateData = data;
- }
- } else {
- if (this.subsTw.aggregation.stateData && !this.stateDataReceived) {
- if (this.firstStateData) {
- onStateHistoryData(this.firstStateData, data, this.subsTw.aggregation.limit,
- this.subsTw.startTs, this.subsTw.startTs + this.subsTw.aggregation.timeWindow,
- (data) => {
- dataAggregator.onData(data, false, false, true);
- });
- this.stateDataReceived = true;
- } else {
- this.data = data;
- }
- } else {
- dataAggregator.onData(data, false, false, true);
- }
- }
- }
- subscriber.onReconnected = function() {
- var newSubsTw = null;
- for (var i2 = 0; i2 < listeners.length; i2++) {
- var listener = listeners[i2];
- if (!newSubsTw) {
- newSubsTw = listener.updateRealtimeSubscription();
- } else {
- listener.setRealtimeSubscription(newSubsTw);
- }
- }
- this.subsTw = newSubsTw;
- this.firstStateData = null;
- this.data = null;
- this.stateDataReceived = false;
- updateRealtimeSubscriptionCommand(this.subscriptionCommands[0], this.subsTw);
- if (this.subsTw.aggregation.stateData) {
- updateFirstStateHistoryCommand(this.firstStateSubscriptionCommand, this.subsTw.startTs);
- }
- dataAggregator.reset(newSubsTw.startTs, newSubsTw.aggregation.timeWindow, newSubsTw.aggregation.interval);
- }
- } else {
- subscriber.onReconnected = function() {}
- subscriber.onData = function(data) {
- if (data.data) {
- onData(data.data, types.dataKeyType.timeseries, true);
- }
- }
- }
-
- telemetryWebsocketService.subscribe(subscriber);
- subscribers.push(subscriber);
-
- }
- }
-
- if (attrKeys.length > 0) {
-
- var attrsSubscriptionCommand = {
- entityType: datasourceSubscription.entityType,
- entityId: datasourceSubscription.entityId,
- keys: attrKeys
- };
-
- subscriber = {
- subscriptionCommands: [attrsSubscriptionCommand],
- type: types.dataKeyType.attribute,
- onData: function (data) {
- if (data.data) {
- onData(data.data, types.dataKeyType.attribute, true);
- }
- },
- onReconnected: function() {}
- };
-
- telemetryWebsocketService.subscribe(subscriber);
- subscribers.push(subscriber);
-
- }
-
- } else if (datasourceType === types.datasourceType.function) {
- if (datasourceSubscription.type === types.widgetType.timeseries.value) {
- for (key in dataKeys) {
- var dataKeyList = dataKeys[key];
- for (var index = 0; index < dataKeyList.length; index++) {
- dataKey = dataKeyList[index];
- tsKeyNames.push(dataKey.name+'_'+dataKey.index);
- }
- }
- dataAggregator = createRealtimeDataAggregator(subsTw, tsKeyNames, types.dataKeyType.function);
- }
- tickScheduledTime = currentTime();
- if (history) {
- onTick(false);
- } else {
- timer = $timeout(
- function() {
- onTick(true)
- },
- 0,
- false
- );
- }
- }
- }
-
- function createFirstStateHistoryCommand(startTs, tsKeys) {
- return {
- entityType: datasourceSubscription.entityType,
- entityId: datasourceSubscription.entityId,
- keys: tsKeys,
- startTs: startTs - YEAR,
- endTs: startTs,
- interval: 1000,
- limit: 1,
- agg: types.aggregation.none.value
- };
- }
-
- function updateFirstStateHistoryCommand(stateHistoryCommand, startTs) {
- stateHistoryCommand.startTs = startTs - YEAR;
- stateHistoryCommand.endTs = startTs;
- }
-
- function onStateHistoryData(firstStateData, data, limit, startTs, endTs, onData) {
- for (var key in data.data) {
- var keyData = data.data[key];
- data.data[key] = $filter('orderBy')(keyData, '+this[0]');
- keyData = data.data[key];
- if (keyData.length < limit) {
- var firstStateKeyData = firstStateData.data[key];
- if (firstStateKeyData.length) {
- var firstStateDataTsKv = firstStateKeyData[0];
- firstStateDataTsKv[0] = startTs;
- firstStateKeyData = [
- [ startTs, firstStateKeyData[0][1] ]
- ];
- keyData.unshift(firstStateDataTsKv);
- }
- }
- if (keyData.length) {
- var lastTsKv = angular.copy(keyData[keyData.length-1]);
- lastTsKv[0] = endTs;
- keyData.push(lastTsKv);
- }
- }
- onData(data);
- }
-
- function createRealtimeDataAggregator(subsTw, tsKeyNames, dataKeyType) {
- return new DataAggregator(
- function(data, apply) {
- onData(data, dataKeyType, apply);
- },
- tsKeyNames,
- subsTw.startTs,
- subsTw.aggregation.limit,
- subsTw.aggregation.type,
- subsTw.aggregation.timeWindow,
- subsTw.aggregation.interval,
- subsTw.aggregation.stateData,
- types,
- $timeout,
- $filter
- );
- }
-
- function updateRealtimeSubscriptionCommand(subscriptionCommand, subsTw) {
- subscriptionCommand.startTs = subsTw.startTs;
- subscriptionCommand.timeWindow = subsTw.aggregation.timeWindow;
- subscriptionCommand.interval = subsTw.aggregation.interval;
- subscriptionCommand.limit = subsTw.aggregation.limit;
- subscriptionCommand.agg = subsTw.aggregation.type;
- }
-
- function unsubscribe() {
- if (timer) {
- $timeout.cancel(timer);
- timer = null;
- }
- if (datasourceType === types.datasourceType.entity) {
- for (var i=0;i 0) {
- prevSeries = datasourceKeyData[datasourceKeyData.length - 1];
- } else {
- prevSeries = [0, 0];
- }
- for (var time = startTime; time <= endTime && (timer || history); time += frequency) {
- var series = [];
- series.push(time);
- var value = dataKey.func(time, prevSeries[1]);
- series.push(value);
- data.push(series);
- prevSeries = series;
- }
- if (data.length > 0) {
- dataKey.lastUpdateTime = data[data.length - 1][0];
- }
- return data;
- }
-
- function generateLatest(dataKey, apply) {
- var prevSeries;
- var datasourceKeyData = datasourceData[dataKey.key].data;
- if (datasourceKeyData.length > 0) {
- prevSeries = datasourceKeyData[datasourceKeyData.length - 1];
- } else {
- prevSeries = [0, 0];
- }
- var series = [];
- var time = (new Date).getTime();
- series.push(time);
- var value = dataKey.func(time, prevSeries[1]);
- series.push(value);
- datasourceData[dataKey.key].data = [series];
- for (var i = 0; i < listeners.length; i++) {
- var listener = listeners[i];
- listener.dataUpdated(datasourceData[dataKey.key],
- listener.datasourceIndex,
- dataKey.index, apply);
- }
- }
-
- /* eslint-disable */
- function currentTime() {
- return window.performance && window.performance.now ?
- window.performance.now() : Date.now();
- }
- /* eslint-enable */
-
-
- function onTick(apply) {
-
- var now = currentTime();
- tickElapsed += now - tickScheduledTime;
- tickScheduledTime = now;
-
- if (timer) {
- $timeout.cancel(timer);
- }
-
- var key;
- if (datasourceSubscription.type === types.widgetType.timeseries.value) {
- var startTime;
- var endTime;
- var delta;
- var generatedData = {
- data: {
- }
- };
- if (!history) {
- delta = Math.floor(tickElapsed / frequency);
- }
- var deltaElapsed = history ? frequency : delta * frequency;
- tickElapsed = tickElapsed - deltaElapsed;
- for (key in dataKeys) {
- var dataKeyList = dataKeys[key];
- for (var index = 0; index < dataKeyList.length && (timer || history); index ++) {
- var dataKey = dataKeyList[index];
- if (!startTime) {
- if (realtime) {
- if (dataKey.lastUpdateTime) {
- startTime = dataKey.lastUpdateTime + frequency;
- endTime = dataKey.lastUpdateTime + deltaElapsed;
- } else {
- startTime = datasourceSubscription.subscriptionTimewindow.startTs;
- endTime = startTime + datasourceSubscription.subscriptionTimewindow.realtimeWindowMs + frequency;
- if (datasourceSubscription.subscriptionTimewindow.aggregation.type == types.aggregation.none.value) {
- var time = endTime - frequency * datasourceSubscription.subscriptionTimewindow.aggregation.limit;
- startTime = Math.max(time, startTime);
- }
- }
- } else {
- startTime = datasourceSubscription.subscriptionTimewindow.fixedWindow.startTimeMs;
- endTime = datasourceSubscription.subscriptionTimewindow.fixedWindow.endTimeMs;
- }
- }
- var data = generateSeries(dataKey, index, startTime, endTime);
- generatedData.data[dataKey.name+'_'+dataKey.index] = data;
- }
- }
- if (dataAggregator) {
- dataAggregator.onData(generatedData, true, history, apply);
- }
- } else if (datasourceSubscription.type === types.widgetType.latest.value) {
- for (key in dataKeys) {
- generateLatest(dataKeys[key], apply);
- }
- }
-
- if (!history) {
- timer = $timeout(function() {onTick(true)}, frequency, false);
- }
- }
-
- function isNumeric(val) {
- return (val - parseFloat( val ) + 1) >= 0;
- }
-
- function convertValue(val) {
- if (val && isNumeric(val)) {
- return Number(val);
- } else {
- return val;
- }
- }
-
- function onData(sourceData, type, apply) {
- for (var keyName in sourceData) {
- var keyData = sourceData[keyName];
- var key = keyName + '_' + type;
- var dataKeyList = dataKeys[key];
- for (var keyIndex = 0; dataKeyList && keyIndex < dataKeyList.length; keyIndex++) {
- var datasourceKey = key + "_" + keyIndex;
- if (datasourceData[datasourceKey].data) {
- var dataKey = dataKeyList[keyIndex];
- var data = [];
- var prevSeries;
- var prevOrigSeries;
- var datasourceKeyData;
- var datasourceOrigKeyData;
- var update = false;
- if (realtime) {
- datasourceKeyData = [];
- datasourceOrigKeyData = [];
- } else {
- datasourceKeyData = datasourceData[datasourceKey].data;
- datasourceOrigKeyData = dataSourceOrigData[datasourceKey].data;
- }
- if (datasourceKeyData.length > 0) {
- prevSeries = datasourceKeyData[datasourceKeyData.length - 1];
- prevOrigSeries = datasourceOrigKeyData[datasourceOrigKeyData.length -1];
- } else {
- prevSeries = [0, 0];
- prevOrigSeries = [0, 0];
- }
- dataSourceOrigData[datasourceKey].data = [];
- if (datasourceSubscription.type === types.widgetType.timeseries.value) {
- var series, time, value;
- for (var i = 0; i < keyData.length; i++) {
- series = keyData[i];
- time = series[0];
- dataSourceOrigData[datasourceKey].data.push(series);
- value = convertValue(series[1]);
- if (dataKey.postFunc) {
- value = dataKey.postFunc(time, value, prevSeries[1], prevOrigSeries[0], prevOrigSeries[1]);
- }
- prevOrigSeries = series;
- series = [time, value];
- data.push(series);
- prevSeries = series;
- }
- update = true;
- } else if (datasourceSubscription.type === types.widgetType.latest.value) {
- if (keyData.length > 0) {
- series = keyData[0];
- time = series[0];
- dataSourceOrigData[datasourceKey].data.push(series);
- value = convertValue(series[1]);
- if (dataKey.postFunc) {
- value = dataKey.postFunc(time, value, prevSeries[1], prevOrigSeries[0], prevOrigSeries[1]);
- }
- series = [time, value];
- data.push(series);
- }
- update = true;
- }
- if (update) {
- datasourceData[datasourceKey].data = data;
- for (var i2 = 0; i2 < listeners.length; i2++) {
- var listener = listeners[i2];
- if (angular.isFunction(listener))
- continue;
- listener.dataUpdated(datasourceData[datasourceKey],
- listener.datasourceIndex,
- dataKey.index, apply);
- }
- }
- }
- }
- }
- }
-}
diff --git a/ui/src/app/api/device.service.js b/ui/src/app/api/device.service.js
deleted file mode 100644
index b803ec333a..0000000000
--- a/ui/src/app/api/device.service.js
+++ /dev/null
@@ -1,361 +0,0 @@
-/*
- * Copyright © 2016-2020 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 thingsboardTypes from '../common/types.constant';
-
-export default angular.module('thingsboard.api.device', [thingsboardTypes])
- .factory('deviceService', DeviceService)
- .name;
-
-/*@ngInject*/
-function DeviceService($http, $q, $window, userService, attributeService, customerService, types) {
-
- var service = {
- assignDeviceToCustomer: assignDeviceToCustomer,
- deleteDevice: deleteDevice,
- getCustomerDevices: getCustomerDevices,
- getDevice: getDevice,
- getDevices: getDevices,
- getDeviceCredentials: getDeviceCredentials,
- getTenantDevices: getTenantDevices,
- saveDevice: saveDevice,
- saveDeviceCredentials: saveDeviceCredentials,
- unassignDeviceFromCustomer: unassignDeviceFromCustomer,
- makeDevicePublic: makeDevicePublic,
- getDeviceAttributes: getDeviceAttributes,
- subscribeForDeviceAttributes: subscribeForDeviceAttributes,
- unsubscribeForDeviceAttributes: unsubscribeForDeviceAttributes,
- saveDeviceAttributes: saveDeviceAttributes,
- deleteDeviceAttributes: deleteDeviceAttributes,
- sendOneWayRpcCommand: sendOneWayRpcCommand,
- sendTwoWayRpcCommand: sendTwoWayRpcCommand,
- findByQuery: findByQuery,
- getDeviceTypes: getDeviceTypes,
- findByName: findByName,
- claimDevice: claimDevice,
- unclaimDevice: unclaimDevice
- };
-
- return service;
-
- function getTenantDevices(pageLink, applyCustomersInfo, config, type) {
- var deferred = $q.defer();
- var url = '/api/tenant/devices?limit=' + pageLink.limit;
- if (angular.isDefined(pageLink.textSearch)) {
- url += '&textSearch=' + pageLink.textSearch;
- }
- if (angular.isDefined(pageLink.idOffset)) {
- url += '&idOffset=' + pageLink.idOffset;
- }
- if (angular.isDefined(pageLink.textOffset)) {
- url += '&textOffset=' + pageLink.textOffset;
- }
- if (angular.isDefined(type) && type.length) {
- url += '&type=' + type;
- }
- $http.get(url, config).then(function success(response) {
- if (applyCustomersInfo) {
- customerService.applyAssignedCustomersInfo(response.data.data).then(
- function success(data) {
- response.data.data = data;
- deferred.resolve(response.data);
- },
- function fail() {
- deferred.reject();
- }
- );
- } else {
- deferred.resolve(response.data);
- }
- }, function fail() {
- deferred.reject();
- });
- return deferred.promise;
- }
-
- function getCustomerDevices(customerId, pageLink, applyCustomersInfo, config, type) {
- var deferred = $q.defer();
- var url = '/api/customer/' + customerId + '/devices?limit=' + pageLink.limit;
- if (angular.isDefined(pageLink.textSearch)) {
- url += '&textSearch=' + pageLink.textSearch;
- }
- if (angular.isDefined(pageLink.idOffset)) {
- url += '&idOffset=' + pageLink.idOffset;
- }
- if (angular.isDefined(pageLink.textOffset)) {
- url += '&textOffset=' + pageLink.textOffset;
- }
- if (angular.isDefined(type) && type.length) {
- url += '&type=' + type;
- }
- $http.get(url, config).then(function success(response) {
- if (applyCustomersInfo) {
- customerService.applyAssignedCustomerInfo(response.data.data, customerId).then(
- function success(data) {
- response.data.data = data;
- deferred.resolve(response.data);
- },
- function fail() {
- deferred.reject();
- }
- );
- } else {
- deferred.resolve(response.data);
- }
- }, function fail() {
- deferred.reject();
- });
-
- return deferred.promise;
- }
-
- function getDevice(deviceId, ignoreErrors, config) {
- var deferred = $q.defer();
- var url = '/api/device/' + deviceId;
- if (!config) {
- config = {};
- }
- config = Object.assign(config, {ignoreErrors: ignoreErrors});
- $http.get(url, config).then(function success(response) {
- deferred.resolve(response.data);
- }, function fail(response) {
- deferred.reject(response.data);
- });
- return deferred.promise;
- }
-
- function getDevices(deviceIds, config) {
- var deferred = $q.defer();
- var ids = '';
- for (var i = 0; i < deviceIds.length; i++) {
- if (i > 0) {
- ids += ',';
- }
- ids += deviceIds[i];
- }
- var url = '/api/devices?deviceIds=' + ids;
- $http.get(url, config).then(function success(response) {
- var devices = response.data;
- devices.sort(function (device1, device2) {
- var id1 = device1.id.id;
- var id2 = device2.id.id;
- var index1 = deviceIds.indexOf(id1);
- var index2 = deviceIds.indexOf(id2);
- return index1 - index2;
- });
- deferred.resolve(devices);
- }, function fail(response) {
- deferred.reject(response.data);
- });
- return deferred.promise;
- }
-
- function saveDevice(device, config) {
- config = config || {};
- var deferred = $q.defer();
- var url = '/api/device';
- $http.post(url, device, config).then(function success(response) {
- deferred.resolve(response.data);
- }, function fail() {
- deferred.reject();
- });
- return deferred.promise;
- }
-
- function deleteDevice(deviceId) {
- var deferred = $q.defer();
- var url = '/api/device/' + deviceId;
- $http.delete(url).then(function success() {
- deferred.resolve();
- }, function fail() {
- deferred.reject();
- });
- return deferred.promise;
- }
-
- function getDeviceCredentials(deviceId, sync, config) {
- config = config || {};
- var deferred = $q.defer();
- var url = '/api/device/' + deviceId + '/credentials';
- if (sync) {
- var request = new $window.XMLHttpRequest();
- request.open('GET', url, false);
- request.setRequestHeader("Accept", "application/json, text/plain, */*");
- userService.setAuthorizationRequestHeader(request);
- request.send(null);
- if (request.status === 200) {
- deferred.resolve(angular.fromJson(request.responseText));
- } else {
- deferred.reject();
- }
- } else {
- $http.get(url, config).then(function success(response) {
- deferred.resolve(response.data);
- }, function fail() {
- deferred.reject();
- });
- }
- return deferred.promise;
- }
-
- function saveDeviceCredentials(deviceCredentials, config) {
- config = config || {};
- var deferred = $q.defer();
- var url = '/api/device/credentials';
- $http.post(url, deviceCredentials, config).then(function success(response) {
- deferred.resolve(response.data);
- }, function fail() {
- deferred.reject();
- });
- return deferred.promise;
- }
-
- function assignDeviceToCustomer(customerId, deviceId) {
- var deferred = $q.defer();
- var url = '/api/customer/' + customerId + '/device/' + deviceId;
- $http.post(url, null).then(function success(response) {
- deferred.resolve(response.data);
- }, function fail() {
- deferred.reject();
- });
- return deferred.promise;
- }
-
- function unassignDeviceFromCustomer(deviceId) {
- var deferred = $q.defer();
- var url = '/api/customer/device/' + deviceId;
- $http.delete(url).then(function success(response) {
- deferred.resolve(response.data);
- }, function fail() {
- deferred.reject();
- });
- return deferred.promise;
- }
-
- function makeDevicePublic(deviceId) {
- var deferred = $q.defer();
- var url = '/api/customer/public/device/' + deviceId;
- $http.post(url, null).then(function success(response) {
- deferred.resolve(response.data);
- }, function fail() {
- deferred.reject();
- });
- return deferred.promise;
- }
-
- function getDeviceAttributes(deviceId, attributeScope, query, successCallback, config) {
- return attributeService.getEntityAttributes(types.entityType.device, deviceId, attributeScope, query, successCallback, config);
- }
-
- function subscribeForDeviceAttributes(deviceId, attributeScope) {
- return attributeService.subscribeForEntityAttributes(types.entityType.device, deviceId, attributeScope);
- }
-
- function unsubscribeForDeviceAttributes(subscriptionId) {
- attributeService.unsubscribeForEntityAttributes(subscriptionId);
- }
-
- function saveDeviceAttributes(deviceId, attributeScope, attributes) {
- return attributeService.saveEntityAttributes(types.entityType.device, deviceId, attributeScope, attributes);
- }
-
- function deleteDeviceAttributes(deviceId, attributeScope, attributes) {
- return attributeService.deleteEntityAttributes(types.entityType.device, deviceId, attributeScope, attributes);
- }
-
- function sendOneWayRpcCommand(deviceId, requestBody) {
- var deferred = $q.defer();
- var url = '/api/plugins/rpc/oneway/' + deviceId;
- $http.post(url, requestBody).then(function success(response) {
- deferred.resolve(response.data);
- }, function fail(rejection) {
- deferred.reject(rejection);
- });
- return deferred.promise;
- }
-
- function sendTwoWayRpcCommand(deviceId, requestBody) {
- var deferred = $q.defer();
- var url = '/api/plugins/rpc/twoway/' + deviceId;
- $http.post(url, requestBody).then(function success(response) {
- deferred.resolve(response.data);
- }, function fail(rejection) {
- deferred.reject(rejection);
- });
- return deferred.promise;
- }
-
- function findByQuery(query, ignoreErrors, config) {
- var deferred = $q.defer();
- var url = '/api/devices';
- if (!config) {
- config = {};
- }
- config = Object.assign(config, {ignoreErrors: ignoreErrors});
- $http.post(url, query, config).then(function success(response) {
- deferred.resolve(response.data);
- }, function fail() {
- deferred.reject();
- });
- return deferred.promise;
- }
-
- function getDeviceTypes(config) {
- var deferred = $q.defer();
- var url = '/api/device/types';
- $http.get(url, config).then(function success(response) {
- deferred.resolve(response.data);
- }, function fail() {
- deferred.reject();
- });
- return deferred.promise;
- }
-
- function findByName(deviceName, config) {
- config = config || {};
- var deferred = $q.defer();
- var url = '/api/tenant/devices?deviceName=' + deviceName;
- $http.get(url, config).then(function success(response) {
- deferred.resolve(response.data);
- }, function fail() {
- deferred.reject();
- });
- return deferred.promise;
- }
-
- function claimDevice(deviceName, deviceSecret, config) {
- deviceSecret = deviceSecret || {};
- config = config || {};
- const deferred = $q.defer();
- const url = '/api/customer/device/' + deviceName + '/claim';
- $http.post(url, deviceSecret, config).then(function success(response) {
- deferred.resolve(response.data);
- }, function fail(rejection) {
- deferred.reject(rejection);
- });
- return deferred.promise;
- }
-
- function unclaimDevice(deviceName) {
- const deferred = $q.defer();
- const url = '/api/customer/device/' + deviceName + '/claim';
- $http.delete(url).then(function success(response) {
- deferred.resolve(response.data);
- }, function fail(rejection) {
- deferred.reject(rejection);
- });
- return deferred.promise;
- }
-}
diff --git a/ui/src/app/api/entity-relation.service.js b/ui/src/app/api/entity-relation.service.js
deleted file mode 100644
index cfa287da8e..0000000000
--- a/ui/src/app/api/entity-relation.service.js
+++ /dev/null
@@ -1,189 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-export default angular.module('thingsboard.api.entityRelation', [])
- .factory('entityRelationService', EntityRelationService)
- .name;
-
-/*@ngInject*/
-function EntityRelationService($http, $q) {
-
- var service = {
- saveRelation: saveRelation,
- deleteRelation: deleteRelation,
- deleteRelations: deleteRelations,
- getRelation: getRelation,
- findByFrom: findByFrom,
- findInfoByFrom: findInfoByFrom,
- findByFromAndType: findByFromAndType,
- findByTo: findByTo,
- findInfoByTo: findInfoByTo,
- findByToAndType: findByToAndType,
- findByQuery: findByQuery,
- findInfoByQuery: findInfoByQuery
- }
-
- return service;
-
- function saveRelation(relation) {
- var deferred = $q.defer();
- var url = '/api/relation';
- $http.post(url, relation).then(function success(response) {
- deferred.resolve(response.data);
- }, function fail() {
- deferred.reject();
- });
- return deferred.promise;
- }
-
- function deleteRelation(fromId, fromType, relationType, toId, toType) {
- var deferred = $q.defer();
- var url = '/api/relation?fromId=' + fromId;
- url += '&fromType=' + fromType;
- url += '&relationType=' + relationType;
- url += '&toId=' + toId;
- url += '&toType=' + toType;
- $http.delete(url).then(function success() {
- deferred.resolve();
- }, function fail() {
- deferred.reject();
- });
- return deferred.promise;
- }
-
- function deleteRelations(entityId, entityType) {
- var deferred = $q.defer();
- var url = '/api/relations?entityId=' + entityId;
- url += '&entityType=' + entityType;
- $http.delete(url).then(function success() {
- deferred.resolve();
- }, function fail() {
- deferred.reject();
- });
- return deferred.promise;
- }
-
- function getRelation(fromId, fromType, relationType, toId, toType) {
- var deferred = $q.defer();
- var url = '/api/relation?fromId=' + fromId;
- url += '&fromType=' + fromType;
- url += '&relationType=' + relationType;
- url += '&toId=' + toId;
- url += '&toType=' + toType;
- $http.get(url).then(function success(response) {
- deferred.resolve(response.data);
- }, function fail() {
- deferred.reject();
- });
- return deferred.promise;
- }
-
- function findByFrom(fromId, fromType) {
- var deferred = $q.defer();
- var url = '/api/relations?fromId=' + fromId;
- url += '&fromType=' + fromType;
- $http.get(url, null).then(function success(response) {
- deferred.resolve(response.data);
- }, function fail() {
- deferred.reject();
- });
- return deferred.promise;
- }
-
- function findInfoByFrom(fromId, fromType) {
- var deferred = $q.defer();
- var url = '/api/relations/info?fromId=' + fromId;
- url += '&fromType=' + fromType;
- $http.get(url, null).then(function success(response) {
- deferred.resolve(response.data);
- }, function fail() {
- deferred.reject();
- });
- return deferred.promise;
- }
-
- function findByFromAndType(fromId, fromType, relationType) {
- var deferred = $q.defer();
- var url = '/api/relations?fromId=' + fromId;
- url += '&fromType=' + fromType;
- url += '&relationType=' + relationType;
- $http.get(url, null).then(function success(response) {
- deferred.resolve(response.data);
- }, function fail() {
- deferred.reject();
- });
- return deferred.promise;
- }
-
- function findByTo(toId, toType) {
- var deferred = $q.defer();
- var url = '/api/relations?toId=' + toId;
- url += '&toType=' + toType;
- $http.get(url, null).then(function success(response) {
- deferred.resolve(response.data);
- }, function fail() {
- deferred.reject();
- });
- return deferred.promise;
- }
-
- function findInfoByTo(toId, toType) {
- var deferred = $q.defer();
- var url = '/api/relations/info?toId=' + toId;
- url += '&toType=' + toType;
- $http.get(url, null).then(function success(response) {
- deferred.resolve(response.data);
- }, function fail() {
- deferred.reject();
- });
- return deferred.promise;
- }
-
- function findByToAndType(toId, toType, relationType) {
- var deferred = $q.defer();
- var url = '/api/relations?toId=' + toId;
- url += '&toType=' + toType;
- url += '&relationType=' + relationType;
- $http.get(url, null).then(function success(response) {
- deferred.resolve(response.data);
- }, function fail() {
- deferred.reject();
- });
- return deferred.promise;
- }
-
- function findByQuery(query, config) {
- var deferred = $q.defer();
- var url = '/api/relations';
- $http.post(url, query, config).then(function success(response) {
- deferred.resolve(response.data);
- }, function fail(e) {
- deferred.reject(e);
- });
- return deferred.promise;
- }
-
- function findInfoByQuery(query, config) {
- var deferred = $q.defer();
- var url = '/api/relations/info';
- $http.post(url, query, config).then(function success(response) {
- deferred.resolve(response.data);
- }, function fail() {
- deferred.reject();
- });
- return deferred.promise;
- }
-
-}
diff --git a/ui/src/app/api/entity-view.service.js b/ui/src/app/api/entity-view.service.js
deleted file mode 100644
index 83e4b49fd0..0000000000
--- a/ui/src/app/api/entity-view.service.js
+++ /dev/null
@@ -1,224 +0,0 @@
-/*
- * Copyright © 2016-2020 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 thingsboardTypes from '../common/types.constant';
-
-export default angular.module('thingsboard.api.entityView', [thingsboardTypes])
- .factory('entityViewService', EntityViewService)
- .name;
-
-/*@ngInject*/
-function EntityViewService($http, $q, $window, userService, attributeService, customerService, types) {
-
- var service = {
- assignEntityViewToCustomer: assignEntityViewToCustomer,
- deleteEntityView: deleteEntityView,
- getCustomerEntityViews: getCustomerEntityViews,
- getEntityView: getEntityView,
- getTenantEntityViews: getTenantEntityViews,
- saveEntityView: saveEntityView,
- unassignEntityViewFromCustomer: unassignEntityViewFromCustomer,
- getEntityViewAttributes: getEntityViewAttributes,
- subscribeForEntityViewAttributes: subscribeForEntityViewAttributes,
- unsubscribeForEntityViewAttributes: unsubscribeForEntityViewAttributes,
- findByQuery: findByQuery,
- getEntityViewTypes: getEntityViewTypes,
- makeEntityViewPublic: makeEntityViewPublic
- }
-
- return service;
-
- function getTenantEntityViews(pageLink, applyCustomersInfo, config, type) {
- var deferred = $q.defer();
- var url = '/api/tenant/entityViews?limit=' + pageLink.limit;
- if (angular.isDefined(pageLink.textSearch)) {
- url += '&textSearch=' + pageLink.textSearch;
- }
- if (angular.isDefined(pageLink.idOffset)) {
- url += '&idOffset=' + pageLink.idOffset;
- }
- if (angular.isDefined(pageLink.textOffset)) {
- url += '&textOffset=' + pageLink.textOffset;
- }
- if (angular.isDefined(type) && type.length) {
- url += '&type=' + type;
- }
- $http.get(url, config).then(function success(response) {
- if (applyCustomersInfo) {
- customerService.applyAssignedCustomersInfo(response.data.data).then(
- function success(data) {
- response.data.data = data;
- deferred.resolve(response.data);
- },
- function fail() {
- deferred.reject();
- }
- );
- } else {
- deferred.resolve(response.data);
- }
- }, function fail() {
- deferred.reject();
- });
- return deferred.promise;
- }
-
- function getCustomerEntityViews(customerId, pageLink, applyCustomersInfo, config, type) {
- var deferred = $q.defer();
- var url = '/api/customer/' + customerId + '/entityViews?limit=' + pageLink.limit;
- if (angular.isDefined(pageLink.textSearch)) {
- url += '&textSearch=' + pageLink.textSearch;
- }
- if (angular.isDefined(pageLink.idOffset)) {
- url += '&idOffset=' + pageLink.idOffset;
- }
- if (angular.isDefined(pageLink.textOffset)) {
- url += '&textOffset=' + pageLink.textOffset;
- }
- if (angular.isDefined(type) && type.length) {
- url += '&type=' + type;
- }
- $http.get(url, config).then(function success(response) {
- if (applyCustomersInfo) {
- customerService.applyAssignedCustomerInfo(response.data.data, customerId).then(
- function success(data) {
- response.data.data = data;
- deferred.resolve(response.data);
- },
- function fail() {
- deferred.reject();
- }
- );
- } else {
- deferred.resolve(response.data);
- }
- }, function fail() {
- deferred.reject();
- });
-
- return deferred.promise;
- }
-
- function getEntityView(entityViewId, ignoreErrors, config) {
- var deferred = $q.defer();
- var url = '/api/entityView/' + entityViewId;
- if (!config) {
- config = {};
- }
- config = Object.assign(config, { ignoreErrors: ignoreErrors });
- $http.get(url, config).then(function success(response) {
- deferred.resolve(response.data);
- }, function fail(response) {
- deferred.reject(response.data);
- });
- return deferred.promise;
- }
-
- function saveEntityView(entityView) {
- var deferred = $q.defer();
- var url = '/api/entityView';
-
- $http.post(url, entityView).then(function success(response) {
- deferred.resolve(response.data);
- }, function fail() {
- deferred.reject();
- });
- return deferred.promise;
- }
-
- function deleteEntityView(entityViewId) {
- var deferred = $q.defer();
- var url = '/api/entityView/' + entityViewId;
- $http.delete(url).then(function success() {
- deferred.resolve();
- }, function fail() {
- deferred.reject();
- });
- return deferred.promise;
- }
-
- function assignEntityViewToCustomer(customerId, entityViewId) {
- var deferred = $q.defer();
- var url = '/api/customer/' + customerId + '/entityView/' + entityViewId;
- $http.post(url, null).then(function success(response) {
- deferred.resolve(response.data);
- }, function fail() {
- deferred.reject();
- });
- return deferred.promise;
- }
-
- function unassignEntityViewFromCustomer(entityViewId) {
- var deferred = $q.defer();
- var url = '/api/customer/entityView/' + entityViewId;
- $http.delete(url).then(function success(response) {
- deferred.resolve(response.data);
- }, function fail() {
- deferred.reject();
- });
- return deferred.promise;
- }
-
- function getEntityViewAttributes(entityViewId, attributeScope, query, successCallback, config) {
- return attributeService.getEntityAttributes(types.entityType.entityView, entityViewId, attributeScope, query, successCallback, config);
- }
-
- function subscribeForEntityViewAttributes(entityViewId, attributeScope) {
- return attributeService.subscribeForEntityAttributes(types.entityType.entityView, entityViewId, attributeScope);
- }
-
- function unsubscribeForEntityViewAttributes(subscriptionId) {
- attributeService.unsubscribeForEntityAttributes(subscriptionId);
- }
-
- function findByQuery(query, ignoreErrors, config) {
- var deferred = $q.defer();
- var url = '/api/entityViews';
- if (!config) {
- config = {};
- }
- config = Object.assign(config, { ignoreErrors: ignoreErrors });
- $http.post(url, query, config).then(function success(response) {
- deferred.resolve(response.data);
- }, function fail() {
- deferred.reject();
- });
- return deferred.promise;
- }
-
- function getEntityViewTypes(config) {
- var deferred = $q.defer();
- var url = '/api/entityView/types';
- $http.get(url, config).then(function success(response) {
- deferred.resolve(response.data);
- }, function fail() {
- deferred.reject();
- });
- return deferred.promise;
- }
-
- function makeEntityViewPublic(entityViewId) {
- var deferred = $q.defer();
- var url = '/api/customer/public/entityView/' + entityViewId;
- $http.post(url, null).then(function success(response) {
- deferred.resolve(response.data);
- }, function fail() {
- deferred.reject();
- });
- return deferred.promise;
- }
-
-
-}
diff --git a/ui/src/app/api/entity.service.js b/ui/src/app/api/entity.service.js
deleted file mode 100644
index f692c99051..0000000000
--- a/ui/src/app/api/entity.service.js
+++ /dev/null
@@ -1,1581 +0,0 @@
-/*
- * Copyright © 2016-2020 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 thingsboardTypes from '../common/types.constant';
-
-export default angular.module('thingsboard.api.entity', [thingsboardTypes])
- .factory('entityService', EntityService)
- .name;
-
-/*@ngInject*/
-function EntityService($http, $q, $filter, $translate, $log, userService, deviceService, assetService, tenantService,
- customerService, ruleChainService, dashboardService, entityRelationService, attributeService,
- entityViewService, types, utils) {
- var service = {
- getEntity: getEntity,
- getEntities: getEntities,
- getEntitiesByNameFilter: getEntitiesByNameFilter,
- resolveAlias: resolveAlias,
- resolveAliasFilter: resolveAliasFilter,
- checkEntityAlias: checkEntityAlias,
- filterAliasByEntityTypes: filterAliasByEntityTypes,
- getAliasFilterTypesByEntityTypes: getAliasFilterTypesByEntityTypes,
- prepareAllowedEntityTypesList: prepareAllowedEntityTypesList,
- getEntityKeys: getEntityKeys,
- createDatasourcesFromSubscriptionsInfo: createDatasourcesFromSubscriptionsInfo,
- createAlarmSourceFromSubscriptionInfo: createAlarmSourceFromSubscriptionInfo,
- getRelatedEntities: getRelatedEntities,
- saveRelatedEntity: saveRelatedEntity,
- saveEntityParameters: saveEntityParameters,
- getRelatedEntity: getRelatedEntity,
- deleteRelatedEntity: deleteRelatedEntity,
- moveEntity: moveEntity,
- copyEntity: copyEntity
- };
-
- return service;
-
- function getEntityPromise(entityType, entityId, config) {
- var promise;
- switch (entityType) {
- case types.entityType.device:
- promise = deviceService.getDevice(entityId, true, config);
- break;
- case types.entityType.asset:
- promise = assetService.getAsset(entityId, true, config);
- break;
- case types.entityType.entityView:
- promise = entityViewService.getEntityView(entityId, true, config);
- break;
- case types.entityType.tenant:
- promise = tenantService.getTenant(entityId, config);
- break;
- case types.entityType.customer:
- promise = customerService.getCustomer(entityId, config);
- break;
- case types.entityType.dashboard:
- promise = dashboardService.getDashboardInfo(entityId, config);
- break;
- case types.entityType.user:
- promise = userService.getUser(entityId, true, config);
- break;
- case types.entityType.rulechain:
- promise = ruleChainService.getRuleChain(entityId, config);
- break;
- case types.entityType.alarm:
- $log.error('Get Alarm Entity is not implemented!');
- break;
- }
- return promise;
- }
-
- function getEntity(entityType, entityId, config) {
- var deferred = $q.defer();
- var promise = getEntityPromise(entityType, entityId, config);
- if (promise) {
- promise.then(
- function success(result) {
- deferred.resolve(result);
- },
- function fail() {
- deferred.reject();
- }
- );
- } else {
- deferred.reject();
- }
- return deferred.promise;
- }
-
- function getEntitiesByIdsPromise(fetchEntityFunction, entityIds) {
- var tasks = [];
- var deferred = $q.defer();
- for (var i=0;i entityViewService.getEntityView(id, config), entityIds);
- break;
- case types.entityType.tenant:
- promise = getEntitiesByIdsPromise(
- (id) => tenantService.getTenant(id, config), entityIds);
- break;
- case types.entityType.customer:
- promise = getEntitiesByIdsPromise(
- (id) => customerService.getCustomer(id, config), entityIds);
- break;
- case types.entityType.dashboard:
- promise = getEntitiesByIdsPromise(
- (id) => dashboardService.getDashboardInfo(id, config), entityIds);
- break;
- case types.entityType.user:
- promise = getEntitiesByIdsPromise(
- (id) => userService.getUser(id, true, config), entityIds);
- break;
- case types.entityType.alarm:
- $log.error('Get Alarm Entity is not implemented!');
- break;
- }
- return promise;
- }
-
- function getEntities(entityType, entityIds, config) {
- var deferred = $q.defer();
- var promise = getEntitiesPromise(entityType, entityIds, config);
- if (promise) {
- promise.then(
- function success(result) {
- deferred.resolve(result);
- },
- function fail() {
- deferred.reject();
- }
- );
- } else {
- deferred.reject();
- }
- return deferred.promise;
- }
-
- function getSingleTenantByPageLinkPromise(pageLink, config) {
- var user = userService.getCurrentUser();
- var tenantId = user.tenantId;
- var deferred = $q.defer();
- tenantService.getTenant(tenantId, config).then(
- function success(tenant) {
- var tenantName = tenant.name;
- var result = {
- data: [],
- nextPageLink: pageLink,
- hasNext: false
- };
- if (tenantName.toLowerCase().startsWith(pageLink.textSearch)) {
- result.data.push(tenant);
- }
- deferred.resolve(result);
- },
- function fail() {
- deferred.reject();
- }
- );
- return deferred.promise;
- }
-
- function getSingleCustomerByPageLinkPromise(pageLink, config) {
- var user = userService.getCurrentUser();
- var customerId = user.customerId;
- var deferred = $q.defer();
- customerService.getCustomer(customerId, config).then(
- function success(customer) {
- var customerName = customer.name;
- var result = {
- data: [],
- nextPageLink: pageLink,
- hasNext: false
- };
- if (customerName.toLowerCase().startsWith(pageLink.textSearch)) {
- result.data.push(customer);
- }
- deferred.resolve(result);
- },
- function fail() {
- deferred.reject();
- }
- );
- return deferred.promise;
- }
-
- function getEntitiesByPageLinkPromise(entityType, pageLink, config, subType) {
- var promise;
- var user = userService.getCurrentUser();
- var customerId = user.customerId;
- switch (entityType) {
- case types.entityType.device:
- if (user.authority === 'CUSTOMER_USER') {
- promise = deviceService.getCustomerDevices(customerId, pageLink, false, config, subType);
- } else {
- promise = deviceService.getTenantDevices(pageLink, false, config, subType);
- }
- break;
- case types.entityType.asset:
- if (user.authority === 'CUSTOMER_USER') {
- promise = assetService.getCustomerAssets(customerId, pageLink, false, config, subType);
- } else {
- promise = assetService.getTenantAssets(pageLink, false, config, subType);
- }
- break;
- case types.entityType.entityView:
- if (user.authority === 'CUSTOMER_USER') {
- promise = entityViewService.getCustomerEntityViews(customerId, pageLink, false, config, subType);
- } else {
- promise = entityViewService.getTenantEntityViews(pageLink, false, config, subType);
- }
- break;
- case types.entityType.tenant:
- if (user.authority === 'TENANT_ADMIN') {
- promise = getSingleTenantByPageLinkPromise(pageLink, config);
- } else {
- promise = tenantService.getTenants(pageLink, config);
- }
- break;
- case types.entityType.customer:
- if (user.authority === 'CUSTOMER_USER') {
- promise = getSingleCustomerByPageLinkPromise(pageLink, config);
- } else {
- promise = customerService.getCustomers(pageLink, config);
- }
- break;
- case types.entityType.rulechain:
- promise = ruleChainService.getRuleChains(pageLink, config);
- break;
- case types.entityType.dashboard:
- if (user.authority === 'CUSTOMER_USER') {
- promise = dashboardService.getCustomerDashboards(customerId, pageLink, config);
- } else {
- promise = dashboardService.getTenantDashboards(pageLink, config);
- }
- break;
- case types.entityType.user:
- $log.error('Get User Entities is not implemented!');
- break;
- case types.entityType.alarm:
- $log.error('Get Alarm Entities is not implemented!');
- break;
- }
- return promise;
- }
-
- function getEntitiesByPageLink(entityType, pageLink, config, subType, data, deferred) {
- var promise = getEntitiesByPageLinkPromise(entityType, pageLink, config, subType);
- if (promise) {
- promise.then(
- function success(result) {
- data = data.concat(result.data);
- if (result.hasNext) {
- pageLink = result.nextPageLink;
- getEntitiesByPageLink(entityType, pageLink, config, subType, data, deferred);
- } else {
- if (data && data.length > 0) {
- deferred.resolve(data);
- } else {
- deferred.resolve(null);
- }
- }
- },
- function fail() {
- deferred.resolve(null);
- }
- );
- } else {
- deferred.resolve(null);
- }
- }
-
- function getEntitiesByNameFilter(entityType, entityNameFilter, limit, config, subType) {
- var deferred = $q.defer();
- var pageLink = {limit: limit, textSearch: entityNameFilter};
- if (limit == -1) { // all
- var data = [];
- pageLink.limit = 100;
- getEntitiesByPageLink(entityType, pageLink, config, subType, data, deferred);
- } else {
- var promise = getEntitiesByPageLinkPromise(entityType, pageLink, config, subType);
- if (promise) {
- promise.then(
- function success(result) {
- if (result.data && result.data.length > 0) {
- deferred.resolve(result.data);
- } else {
- deferred.resolve(null);
- }
- },
- function fail() {
- deferred.resolve(null);
- }
- );
- } else {
- deferred.resolve(null);
- }
- }
- return deferred.promise;
- }
-
- function entityToEntityInfo(entity) {
- return {
- origEntity: entity,
- name: entity.name,
- label: entity.label?entity.label:"",
- entityType: entity.id.entityType,
- id: entity.id.id,
- entityDescription: entity.additionalInfo?entity.additionalInfo.description:""
- };
- }
-
- function entityRelationInfoToEntityInfo(entityRelationInfo, direction) {
- var deferred = $q.defer();
- var entityId = direction == types.entitySearchDirection.from ? entityRelationInfo.to : entityRelationInfo.from;
- getEntity(entityId.entityType, entityId.id, {ignoreLoading: true}).then(
- function success(entity) {
- deferred.resolve(entityToEntityInfo(entity));
- },
- function fail() {
- deferred.reject();
- }
- );
- return deferred.promise;
- }
-
- function entitiesToEntitiesInfo(entities) {
- var entitiesInfo = [];
- if (entities) {
- for (var d = 0; d < entities.length; d++) {
- entitiesInfo.push(entityToEntityInfo(entities[d]));
- }
- }
- return entitiesInfo;
- }
-
- function entityRelationInfosToEntitiesInfo(entityRelations, direction) {
- var deferred = $q.defer();
- var entitiesInfoTaks = [];
- if (entityRelations) {
- for (var d = 0; d < entityRelations.length; d++) {
- entitiesInfoTaks.push(entityRelationInfoToEntityInfo(entityRelations[d], direction));
- }
- }
- $q.all(entitiesInfoTaks).then(
- function success(entitiesInfo) {
- deferred.resolve(entitiesInfo);
- },
- function fail() {
- deferred.reject();
- }
- );
- return deferred.promise;
- }
-
-
- function resolveAlias(entityAlias, stateParams) {
- var deferred = $q.defer();
- var filter = entityAlias.filter;
- resolveAliasFilter(filter, stateParams, -1, false).then(
- function (result) {
- var aliasInfo = {
- alias: entityAlias.alias,
- stateEntity: result.stateEntity,
- entityParamName: result.entityParamName,
- resolveMultiple: filter.resolveMultiple
- };
- aliasInfo.resolvedEntities = result.entities;
- aliasInfo.currentEntity = null;
- if (aliasInfo.resolvedEntities.length) {
- aliasInfo.currentEntity = aliasInfo.resolvedEntities[0];
- }
- deferred.resolve(aliasInfo);
- },
- function fail() {
- deferred.reject();
- }
- );
- return deferred.promise;
- }
-
- function resolveAliasEntityId(entityType, id) {
- var entityId = {
- entityType: entityType,
- id: id
- };
- if (entityType == types.aliasEntityType.current_customer) {
- var user = userService.getCurrentUser();
- entityId.entityType = types.entityType.customer;
- if (user.authority === 'CUSTOMER_USER') {
- entityId.id = user.customerId;
- }
- } else if (entityType === types.aliasEntityType.current_tenant){
- let user = userService.getCurrentUser();
- entityId.entityType = types.entityType.tenant;
- entityId.id = user.tenantId;
- }
- return entityId;
- }
-
- function getStateEntityInfo(filter, stateParams) {
- var entityId = null;
- if (stateParams) {
- if (filter.stateEntityParamName && filter.stateEntityParamName.length) {
- if (stateParams[filter.stateEntityParamName]) {
- entityId = stateParams[filter.stateEntityParamName].entityId;
- }
- } else {
- entityId = stateParams.entityId;
- }
- }
- if (!entityId) {
- entityId = filter.defaultStateEntity;
- }
- if (entityId) {
- entityId = resolveAliasEntityId(entityId.entityType, entityId.id);
- }
- return {
- entityId: entityId
- };
- }
-
- function resolveAliasFilter(filter, stateParams, maxItems, failOnEmpty) {
- var deferred = $q.defer();
- var result = {
- entities: [],
- stateEntity: false
- };
- if (filter.stateEntityParamName && filter.stateEntityParamName.length) {
- result.entityParamName = filter.stateEntityParamName;
- }
- var stateEntityInfo = getStateEntityInfo(filter, stateParams);
- var stateEntityId = stateEntityInfo.entityId;
- switch (filter.type) {
- case types.aliasFilterType.singleEntity.value:
- var aliasEntityId = resolveAliasEntityId(filter.singleEntity.entityType, filter.singleEntity.id);
- getEntity(aliasEntityId.entityType, aliasEntityId.id, {ignoreLoading: true}).then(
- function success(entity) {
- result.entities = entitiesToEntitiesInfo([entity]);
- deferred.resolve(result);
- },
- function fail() {
- deferred.reject();
- }
- );
- break;
- case types.aliasFilterType.entityList.value:
- getEntities(filter.entityType, filter.entityList, {ignoreLoading: true}).then(
- function success(entities) {
- if (entities && entities.length || !failOnEmpty) {
- result.entities = entitiesToEntitiesInfo(entities);
- deferred.resolve(result);
- } else {
- deferred.reject();
- }
- },
- function fail() {
- deferred.reject();
- }
- );
- break;
- case types.aliasFilterType.entityName.value:
- getEntitiesByNameFilter(filter.entityType, filter.entityNameFilter, maxItems, {ignoreLoading: true}).then(
- function success(entities) {
- if (entities && entities.length || !failOnEmpty) {
- result.entities = entitiesToEntitiesInfo(entities);
- deferred.resolve(result);
- } else {
- deferred.reject();
- }
- },
- function fail() {
- deferred.reject();
- }
- );
- break;
- case types.aliasFilterType.stateEntity.value:
- result.stateEntity = true;
- if (stateEntityId) {
- getEntity(stateEntityId.entityType, stateEntityId.id, {ignoreLoading: true}).then(
- function success(entity) {
- result.entities = entitiesToEntitiesInfo([entity]);
- deferred.resolve(result);
- },
- function fail() {
- deferred.resolve(result);
- }
- );
- } else {
- deferred.resolve(result);
- }
- break;
- case types.aliasFilterType.assetType.value:
- getEntitiesByNameFilter(types.entityType.asset, filter.assetNameFilter, maxItems, {ignoreLoading: true}, filter.assetType).then(
- function success(entities) {
- if (entities && entities.length || !failOnEmpty) {
- result.entities = entitiesToEntitiesInfo(entities);
- deferred.resolve(result);
- } else {
- deferred.reject();
- }
- },
- function fail() {
- deferred.reject();
- }
- );
- break;
- case types.aliasFilterType.deviceType.value:
- getEntitiesByNameFilter(types.entityType.device, filter.deviceNameFilter, maxItems, {ignoreLoading: true}, filter.deviceType).then(
- function success(entities) {
- if (entities && entities.length || !failOnEmpty) {
- result.entities = entitiesToEntitiesInfo(entities);
- deferred.resolve(result);
- } else {
- deferred.reject();
- }
- },
- function fail() {
- deferred.reject();
- }
- );
- break;
- case types.aliasFilterType.entityViewType.value:
- getEntitiesByNameFilter(types.entityType.entityView, filter.entityViewNameFilter, maxItems, {ignoreLoading: true}, filter.entityViewType).then(
- function success(entities) {
- if (entities && entities.length || !failOnEmpty) {
- result.entities = entitiesToEntitiesInfo(entities);
- deferred.resolve(result);
- } else {
- deferred.reject();
- }
- },
- function fail() {
- deferred.reject();
- }
- );
- break;
- case types.aliasFilterType.relationsQuery.value:
- result.stateEntity = filter.rootStateEntity;
- var rootEntityType;
- var rootEntityId;
- if (result.stateEntity && stateEntityId) {
- rootEntityType = stateEntityId.entityType;
- rootEntityId = stateEntityId.id;
- } else if (!result.stateEntity) {
- rootEntityType = filter.rootEntity.entityType;
- rootEntityId = filter.rootEntity.id;
- }
- if (rootEntityType && rootEntityId) {
- var relationQueryRootEntityId = resolveAliasEntityId(rootEntityType, rootEntityId);
- var searchQuery = {
- parameters: {
- rootId: relationQueryRootEntityId.id,
- rootType: relationQueryRootEntityId.entityType,
- direction: filter.direction,
- fetchLastLevelOnly: filter.fetchLastLevelOnly
- },
- filters: filter.filters
- };
- searchQuery.parameters.maxLevel = filter.maxLevel && filter.maxLevel > 0 ? filter.maxLevel : -1;
- entityRelationService.findInfoByQuery(searchQuery, {ignoreLoading: true}).then(
- function success(allRelations) {
- if (allRelations && allRelations.length || !failOnEmpty) {
- if (angular.isDefined(maxItems) && maxItems > 0 && allRelations) {
- var limit = Math.min(allRelations.length, maxItems);
- allRelations.length = limit;
- }
- entityRelationInfosToEntitiesInfo(allRelations, filter.direction).then(
- function success(entities) {
- result.entities = entities;
- deferred.resolve(result);
- },
- function fail() {
- deferred.reject();
- }
- );
- } else {
- deferred.reject();
- }
- },
- function fail() {
- deferred.reject();
- }
- );
- } else {
- deferred.resolve(result);
- }
- break;
- case types.aliasFilterType.assetSearchQuery.value:
- case types.aliasFilterType.deviceSearchQuery.value:
- case types.aliasFilterType.entityViewSearchQuery.value:
- result.stateEntity = filter.rootStateEntity;
- if (result.stateEntity && stateEntityId) {
- rootEntityType = stateEntityId.entityType;
- rootEntityId = stateEntityId.id;
- } else if (!result.stateEntity) {
- rootEntityType = filter.rootEntity.entityType;
- rootEntityId = filter.rootEntity.id;
- }
- if (rootEntityType && rootEntityId) {
- var searchQueryRootEntityId = resolveAliasEntityId(rootEntityType, rootEntityId);
- searchQuery = {
- parameters: {
- rootId: searchQueryRootEntityId.id,
- rootType: searchQueryRootEntityId.entityType,
- direction: filter.direction,
- fetchLastLevelOnly: filter.fetchLastLevelOnly
- },
- relationType: filter.relationType
- };
- searchQuery.parameters.maxLevel = filter.maxLevel && filter.maxLevel > 0 ? filter.maxLevel : -1;
- var findByQueryPromise;
- if (filter.type == types.aliasFilterType.assetSearchQuery.value) {
- searchQuery.assetTypes = filter.assetTypes;
- findByQueryPromise = assetService.findByQuery(searchQuery, false, {ignoreLoading: true});
- } else if (filter.type == types.aliasFilterType.deviceSearchQuery.value) {
- searchQuery.deviceTypes = filter.deviceTypes;
- findByQueryPromise = deviceService.findByQuery(searchQuery, false, {ignoreLoading: true});
- } else if (filter.type == types.aliasFilterType.entityViewSearchQuery.value) {
- searchQuery.entityViewTypes = filter.entityViewTypes;
- findByQueryPromise = entityViewService.findByQuery(searchQuery, false, {ignoreLoading: true});
- }
- findByQueryPromise.then(
- function success(entities) {
- if (entities && entities.length || !failOnEmpty) {
- if (angular.isDefined(maxItems) && maxItems > 0 && entities) {
- var limit = Math.min(entities.length, maxItems);
- entities.length = limit;
- }
- result.entities = entitiesToEntitiesInfo(entities);
- deferred.resolve(result);
- } else {
- deferred.reject();
- }
- },
- function fail() {
- deferred.reject();
- }
- );
- } else {
- deferred.resolve(result);
- }
- break;
- }
- return deferred.promise;
- }
-
- function filterAliasByEntityTypes(entityAlias, entityTypes) {
- var filter = entityAlias.filter;
- if (filterAliasFilterTypeByEntityTypes(filter.type, entityTypes)) {
- switch (filter.type) {
- case types.aliasFilterType.singleEntity.value:
- return entityTypes.indexOf(filter.singleEntity.entityType) > -1 ? true : false;
- case types.aliasFilterType.entityList.value:
- return entityTypes.indexOf(filter.entityType) > -1 ? true : false;
- case types.aliasFilterType.entityName.value:
- return entityTypes.indexOf(filter.entityType) > -1 ? true : false;
- case types.aliasFilterType.stateEntity.value:
- return true;
- case types.aliasFilterType.assetType.value:
- return entityTypes.indexOf(types.entityType.asset) > -1 ? true : false;
- case types.aliasFilterType.deviceType.value:
- return entityTypes.indexOf(types.entityType.device) > -1 ? true : false;
- case types.aliasFilterType.entityViewType.value:
- return entityTypes.indexOf(types.entityType.entityView) > -1 ? true : false;
- case types.aliasFilterType.relationsQuery.value:
- if (filter.filters && filter.filters.length) {
- var match = false;
- for (var f=0;f -1) {
- match = true;
- break;
- }
- }
- } else {
- match = true;
- break;
- }
- }
- return match;
- } else {
- return true;
- }
- case types.aliasFilterType.assetSearchQuery.value:
- return entityTypes.indexOf(types.entityType.asset) > -1 ? true : false;
- case types.aliasFilterType.deviceSearchQuery.value:
- return entityTypes.indexOf(types.entityType.device) > -1 ? true : false;
- case types.aliasFilterType.entityViewSearchQuery.value:
- return entityTypes.indexOf(types.entityType.entityView) > -1 ? true : false;
- }
- }
- return false;
- }
-
- function filterAliasFilterTypeByEntityType(aliasFilterType, entityType) {
- switch (aliasFilterType) {
- case types.aliasFilterType.singleEntity.value:
- return true;
- case types.aliasFilterType.entityList.value:
- return true;
- case types.aliasFilterType.entityName.value:
- return true;
- case types.aliasFilterType.stateEntity.value:
- return true;
- case types.aliasFilterType.assetType.value:
- return entityType === types.entityType.asset;
- case types.aliasFilterType.deviceType.value:
- return entityType === types.entityType.device;
- case types.aliasFilterType.entityViewType.value:
- return entityType === types.entityType.entityView;
- case types.aliasFilterType.relationsQuery.value:
- return true;
- case types.aliasFilterType.assetSearchQuery.value:
- return entityType === types.entityType.asset;
- case types.aliasFilterType.deviceSearchQuery.value:
- return entityType === types.entityType.device;
- case types.aliasFilterType.entityViewSearchQuery.value:
- return entityType === types.entityType.entityView;
- }
- return false;
- }
-
- function filterAliasFilterTypeByEntityTypes(aliasFilterType, entityTypes) {
- if (!entityTypes || !entityTypes.length) {
- return true;
- }
- var valid = false;
- entityTypes.forEach(function(entityType) {
- valid = valid || filterAliasFilterTypeByEntityType(aliasFilterType, entityType);
- });
- return valid;
- }
-
- function getAliasFilterTypesByEntityTypes(entityTypes) {
- var allAliasFilterTypes = types.aliasFilterType;
- if (!entityTypes || !entityTypes.length) {
- return allAliasFilterTypes;
- }
- var result = {};
- for (var type in allAliasFilterTypes) {
- var aliasFilterType = allAliasFilterTypes[type];
- if (filterAliasFilterTypeByEntityTypes(aliasFilterType.value, entityTypes)) {
- result[type] = aliasFilterType;
- }
- }
- return result;
- }
-
- function prepareAllowedEntityTypesList(allowedEntityTypes, useAliasEntityTypes) {
- var authority = userService.getAuthority();
- var entityTypes = {};
- switch(authority) {
- case 'SYS_ADMIN':
- entityTypes.tenant = types.entityType.tenant;
- break;
- case 'TENANT_ADMIN':
- entityTypes.device = types.entityType.device;
- entityTypes.asset = types.entityType.asset;
- entityTypes.entityView = types.entityType.entityView;
- entityTypes.tenant = types.entityType.tenant;
- entityTypes.customer = types.entityType.customer;
- entityTypes.dashboard = types.entityType.dashboard;
- if (useAliasEntityTypes) {
- entityTypes.current_customer = types.aliasEntityType.current_customer;
- entityTypes.current_tenant = types.aliasEntityType.current_tenant;
- }
- break;
- case 'CUSTOMER_USER':
- entityTypes.device = types.entityType.device;
- entityTypes.asset = types.entityType.asset;
- entityTypes.entityView = types.entityType.entityView;
- entityTypes.customer = types.entityType.customer;
- entityTypes.dashboard = types.entityType.dashboard;
- if (useAliasEntityTypes) {
- entityTypes.current_customer = types.aliasEntityType.current_customer;
- }
- break;
- }
-
- if (allowedEntityTypes) {
- for (var entityType in entityTypes) {
- if (allowedEntityTypes.indexOf(entityTypes[entityType]) === -1) {
- delete entityTypes[entityType];
- }
- }
- }
- return entityTypes;
- }
-
-
- function checkEntityAlias(entityAlias) {
- var deferred = $q.defer();
- resolveAliasFilter(entityAlias.filter, null, 1, true).then(
- function success(result) {
- if (result.stateEntity) {
- deferred.resolve(true);
- } else {
- var entities = result.entities;
- if (entities && entities.length) {
- deferred.resolve(true);
- } else {
- deferred.resolve(false);
- }
- }
- },
- function fail() {
- deferred.resolve(false);
- }
- );
- return deferred.promise;
- }
-
- function getEntityFieldKeys (entityType, searchText) {
- let entityFieldKeys = [];
- let query = searchText ? searchText.toLowerCase() : "";
- switch(entityType) {
- case types.entityType.user:
- entityFieldKeys.push(types.entityField.name.keyName);
- entityFieldKeys.push(types.entityField.email.keyName);
- entityFieldKeys.push(types.entityField.firstName.keyName);
- entityFieldKeys.push(types.entityField.lastName.keyName);
- break;
- case types.entityType.tenant:
- case types.entityType.customer:
- entityFieldKeys.push(types.entityField.title.keyName);
- entityFieldKeys.push(types.entityField.email.keyName);
- entityFieldKeys.push(types.entityField.country.keyName);
- entityFieldKeys.push(types.entityField.state.keyName);
- entityFieldKeys.push(types.entityField.city.keyName);
- entityFieldKeys.push(types.entityField.address.keyName);
- entityFieldKeys.push(types.entityField.address2.keyName);
- entityFieldKeys.push(types.entityField.zip.keyName);
- entityFieldKeys.push(types.entityField.phone.keyName);
- break;
- case types.entityType.entityView:
- entityFieldKeys.push(types.entityField.name.keyName);
- entityFieldKeys.push(types.entityField.type.keyName);
- break;
- case types.entityType.device:
- case types.entityType.asset:
- entityFieldKeys.push(types.entityField.name.keyName);
- entityFieldKeys.push(types.entityField.type.keyName);
- entityFieldKeys.push(types.entityField.label.keyName);
- break;
- case types.entityType.dashboard:
- entityFieldKeys.push(types.entityField.title.keyName);
- break;
- }
-
- return query ? entityFieldKeys.filter((entityField) => entityField.toLowerCase().indexOf(query) === 0) : entityFieldKeys;
- }
-
- function getEntityKeys(entityType, entityId, query, type, config) {
- if (type === types.dataKeyType.entityField) {
- return $q.when(getEntityFieldKeys(entityType, query));
- }
- var deferred = $q.defer();
- var url = '/api/plugins/telemetry/' + entityType + '/' + entityId + '/keys/';
- if (type === types.dataKeyType.timeseries) {
- url += 'timeseries';
- } else if (type === types.dataKeyType.attribute) {
- url += 'attributes';
- }
- $http.get(url, config).then(function success(response) {
- var result = [];
- if (response.data) {
- if (query) {
- var dataKeys = response.data;
- var lowercaseQuery = angular.lowercase(query);
- for (var i=0; i 0) {
- for (var i = 0; i < entities.length; i++) {
- var entity = entities[i];
- createDatasourceFromSubscription(subscriptionInfo, datasources, entity);
- }
- }
- index++;
- processSubscriptionsInfo(index, subscriptionsInfo, datasources, deferred);
- },
- function fail() {
- index++;
- processSubscriptionsInfo(index, subscriptionsInfo, datasources, deferred);
- }
- )
- } else {
- index++;
- processSubscriptionsInfo(index, subscriptionsInfo, datasources, deferred);
- }
- } else if (subscriptionInfo.type === types.datasourceType.function) {
- createDatasourceFromSubscription(subscriptionInfo, datasources);
- index++;
- processSubscriptionsInfo(index, subscriptionsInfo, datasources, deferred);
- }
- } else {
- deferred.resolve(datasources);
- }
- }
-
- function validateSubscriptionInfo(subscriptionInfo) {
- if (subscriptionInfo.type === 'device') {
- subscriptionInfo.type = types.datasourceType.entity;
- subscriptionInfo.entityType = types.entityType.device;
- if (subscriptionInfo.deviceId) {
- subscriptionInfo.entityId = subscriptionInfo.deviceId;
- } else if (subscriptionInfo.deviceName) {
- subscriptionInfo.entityName = subscriptionInfo.deviceName;
- } else if (subscriptionInfo.deviceNamePrefix) {
- subscriptionInfo.entityNamePrefix = subscriptionInfo.deviceNamePrefix;
- } else if (subscriptionInfo.deviceIds) {
- subscriptionInfo.entityIds = subscriptionInfo.deviceIds;
- }
- }
- return subscriptionInfo;
- }
-
- function createDatasourceFromSubscription(subscriptionInfo, datasources, entity) {
- var datasource;
- if (subscriptionInfo.type === types.datasourceType.entity) {
- datasource = {
- type: subscriptionInfo.type,
- entityName: entity.name ? entity.name : entity.title,
- name: entity.name ? entity.name : entity.title,
- entityType: subscriptionInfo.entityType,
- entityId: entity.id.id,
- dataKeys: []
- }
- } else if (subscriptionInfo.type === types.datasourceType.function) {
- datasource = {
- type: subscriptionInfo.type,
- name: subscriptionInfo.name || types.datasourceType.function,
- dataKeys: []
- }
- }
- datasources.push(datasource);
- if (subscriptionInfo.timeseries) {
- createDatasourceKeys(subscriptionInfo.timeseries, types.dataKeyType.timeseries, datasource, datasources);
- }
- if (subscriptionInfo.attributes) {
- createDatasourceKeys(subscriptionInfo.attributes, types.dataKeyType.attribute, datasource, datasources);
- }
- if (subscriptionInfo.functions) {
- createDatasourceKeys(subscriptionInfo.functions, types.dataKeyType.function, datasource, datasources);
- }
- if (subscriptionInfo.alarmFields) {
- createDatasourceKeys(subscriptionInfo.alarmFields, types.dataKeyType.alarm, datasource, datasources);
- }
- }
-
- function createDatasourceKeys(keyInfos, type, datasource, datasources) {
- for (var i=0;i -1) {
- var deleteRelatedEntityPromise = deleteRelatedEntity(relationEntityId, deleteRelatedEntityTypes);
- deleteRelatedEntitiesTasks.push(deleteRelatedEntityPromise);
- }
- }
- deleteRelatedEntitiesTasks.push(deleteEntityPromise(entityId));
- $q.all(deleteRelatedEntitiesTasks).then(
- function success() {
- deferred.resolve();
- },
- function fail() {
- deferred.reject();
- }
- );
- },
- function fail() {
- deferred.reject();
- }
- )
- } else {
- deleteEntityPromise(entityId).then(
- function success() {
- deferred.resolve();
- },
- function fail() {
- deferred.reject();
- }
- );
- }
- return deferred.promise;
- }
-
- function moveEntity(entityId, prevParentId, targetParentId) {
- var deferred = $q.defer();
- entityRelationService.deleteRelation(prevParentId.id, prevParentId.entityType,
- types.entityRelationType.contains, entityId.id, entityId.entityType).then(
- function success() {
- var relation = {
- from: targetParentId,
- to: entityId,
- type: types.entityRelationType.contains
- };
- entityRelationService.saveRelation(relation).then(
- function success() {
- deferred.resolve();
- },
- function fail() {
- deferred.reject();
- }
- );
- },
- function fail() {
- deferred.reject();
- }
- );
- return deferred.promise;
- }
-
- function copyEntity(entity, targetParentId, keys) {
- var deferred = $q.defer();
- if (!entity.id && !entity.id.id) {
- deferred.reject();
- } else {
- getRelatedEntity(entity.id, keys).then(
- function success(relatedEntity) {
- delete relatedEntity.id.id;
- relatedEntity.name = entity.name;
- saveRelatedEntity(relatedEntity, targetParentId, keys).then(
- function success(savedEntity) {
- deferred.resolve(savedEntity);
- },
- function fail() {
- deferred.reject();
- }
- );
- },
- function fail() {
- deferred.reject();
- }
- );
- }
- return deferred.promise;
- }
-
- function saveEntityPromise(entity) {
- var entityType = entity.id.entityType;
- if (!entity.id.id) {
- delete entity.id;
- }
- if (entityType == types.entityType.asset) {
- return assetService.saveAsset(entity);
- } else if (entityType == types.entityType.device) {
- return deviceService.saveDevice(entity);
- } else if (entityType == types.entityType.entityView) {
- return entityViewService.saveEntityView(entity);
- }
- }
-
- function addRelatedEntity(relatedEntity, parentEntityId, keys, deferred, relation, direction) {
- var entity = {};
- entity.id = relatedEntity.id;
- entity.name = relatedEntity.name;
- entity.type = relatedEntity.type;
- saveEntityPromise(entity).then(
- function success(entity) {
- relatedEntity.id = entity.id;
- if (!relation) {
- relation = {
- type: types.entityRelationType.contains
- };
- }
-
- if (direction == types.entitySearchDirection.from) {
- relation.from = parentEntityId;
- relation.to = relatedEntity.id;
- } else {
- relation.from = relatedEntity.id;
- relation.to = parentEntityId;
- }
-
- entityRelationService.saveRelation(relation).then(
- function success() {
- updateEntity(entity, relatedEntity, keys, deferred, relation);
- },
- function fail() {
- deferred.reject();
- }
- );
- },
- function fail() {
- deferred.reject();
- }
- );
- }
-
- function updateRelatedEntity(relatedEntity, keys, deferred, relation, direction) {
- getEntityPromise(relatedEntity.id.entityType, relatedEntity.id.id, {ignoreLoading: true}).then(
- function success(entity) {
- if (relation) {
- if (direction == types.entitySearchDirection.from) {
- relation.to = relatedEntity.id;
- } else {
- relation.from = relatedEntity.id;
- }
- entityRelationService.saveRelation(relation).then(
- function success() {
- updateEntity(entity, relatedEntity, keys, deferred);
- },
- function fail() {
- deferred.reject();
- }
- );
- } else {
- updateEntity(entity, relatedEntity, keys, deferred);
- }
- },
- function fail() {
- deferred.reject();
- }
- );
- }
-
- function updateEntity(entity, relatedEntity, keys, deferred) {
- if (!angular.equals(entity.name, relatedEntity.name) || !angular.equals(entity.type, relatedEntity.type)) {
- entity.name = relatedEntity.name;
- entity.type = relatedEntity.type;
- saveEntityPromise(entity).then(
- function success (entity) {
- updateEntityAttributes(entity, relatedEntity, keys, deferred);
- },
- function fail() {
- deferred.reject();
- }
- );
- } else {
- updateEntityAttributes(entity, relatedEntity, keys, deferred);
- }
- }
-
- function updateEntityAttributes(entity, relatedEntity, keys, deferred) {
- var attributes = [];
- for (var i = 0; i < keys.length; i++) {
- var key = keys[i];
- attributes.push({key: key, value: relatedEntity[key]});
- }
- attributeService.saveEntityAttributes(entity.id.entityType, entity.id.id, types.attributesScope.server.value, attributes)
- .then(
- function success() {
- deferred.resolve(relatedEntity);
- },
- function fail() {
- deferred.reject();
- }
- );
- }
-
- function constructRelatedEntitiesSearchQuery(rootEntityId, entityType, entitySubTypes, maxLevel, relationType, direction, fetchLastLevelOnly) {
-
- var searchQuery = {
- parameters: {
- rootId: rootEntityId.id,
- rootType: rootEntityId.entityType,
- direction: direction,
- fetchLastLevelOnly: !!fetchLastLevelOnly
- },
- relationType: relationType
- };
- if (!direction) {
- searchQuery.parameters.direction = types.entitySearchDirection.from;
- }
- if (!relationType) {
- searchQuery.relationType = types.entityRelationType.contains;
- }
-
- if (maxLevel) {
- searchQuery.parameters.maxLevel = maxLevel;
- } else {
- searchQuery.parameters.maxLevel = 1;
- }
-
- if (entityType == types.entityType.asset) {
- searchQuery.assetTypes = entitySubTypes;
- } else if (entityType == types.entityType.device) {
- searchQuery.deviceTypes = entitySubTypes;
- } else if (entityType == types.entityType.entityView) {
- searchQuery.entityViewTypes = entitySubTypes;
- } else {
- return null; //Not supported
- }
-
- return searchQuery;
- }
-
- function constructEntity(entity, keys, typeTranslatePrefix) {
- var deferred = $q.defer();
- if (typeTranslatePrefix) {
- entity.typeName = $translate.instant(typeTranslatePrefix+'.'+entity.type);
- } else {
- entity.typeName = entity.type;
- }
- attributeService.getEntityAttributesValues(entity.id.entityType, entity.id.id,
- types.attributesScope.server.value, keys.join(','),
- {ignoreLoading: true}).then(
- function success(attributes) {
- if (attributes && attributes.length > 0) {
- for (var i=0;i 0) {
- return foundAttributes[0].value;
- } else {
- return null;
- }
- }
-
-}
diff --git a/ui/src/app/api/event.service.js b/ui/src/app/api/event.service.js
deleted file mode 100644
index 99cdae3e47..0000000000
--- a/ui/src/app/api/event.service.js
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-export default angular.module('thingsboard.api.event', [])
- .factory('eventService', EventService)
- .name;
-
-/*@ngInject*/
-function EventService($http, $q) {
-
- var service = {
- getEvents: getEvents
- }
-
- return service;
-
- function getEvents (entityType, entityId, eventType, tenantId, pageLink) {
- var deferred = $q.defer();
- var url = '/api/events/'+entityType+'/'+entityId+'/'+eventType+'?tenantId=' + tenantId + '&limit=' + pageLink.limit;
-
- if (angular.isDefined(pageLink.startTime) && pageLink.startTime != null) {
- url += '&startTime=' + pageLink.startTime;
- }
- if (angular.isDefined(pageLink.endTime) && pageLink.endTime != null) {
- url += '&endTime=' + pageLink.endTime;
- }
- if (angular.isDefined(pageLink.idOffset) && pageLink.idOffset != null) {
- url += '&offset=' + pageLink.idOffset;
- }
- $http.get(url, null).then(function success(response) {
- deferred.resolve(response.data);
- }, function fail() {
- deferred.reject();
- });
- return deferred.promise;
- }
-
-}
diff --git a/ui/src/app/api/login.service.js b/ui/src/app/api/login.service.js
deleted file mode 100644
index 292268642f..0000000000
--- a/ui/src/app/api/login.service.js
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-export default angular.module('thingsboard.api.login', [])
- .factory('loginService', LoginService)
- .name;
-
-/*@ngInject*/
-function LoginService($http, $q, $rootScope) {
-
- var service = {
- activate: activate,
- changePassword: changePassword,
- hasUser: hasUser,
- login: login,
- publicLogin: publicLogin,
- resetPassword: resetPassword,
- sendResetPasswordLink: sendResetPasswordLink,
- loadOAuth2Clients: loadOAuth2Clients
- }
-
- return service;
-
- function hasUser() {
- return true;
- }
-
- function login(user) {
- var deferred = $q.defer();
- var loginRequest = {
- username: user.name,
- password: user.password
- };
- $http.post('/api/auth/login', loginRequest).then(function success(response) {
- deferred.resolve(response);
- }, function fail(response) {
- deferred.reject(response);
- });
- return deferred.promise;
- }
-
- function publicLogin(publicId) {
- var deferred = $q.defer();
- var pubilcLoginRequest = {
- publicId: publicId
- };
- $http.post('/api/auth/login/public', pubilcLoginRequest).then(function success(response) {
- deferred.resolve(response);
- }, function fail(response) {
- deferred.reject(response);
- });
- return deferred.promise;
- }
-
- function sendResetPasswordLink(email) {
- var deferred = $q.defer();
- var url = '/api/noauth/resetPasswordByEmail';
- $http.post(url, {email: email}).then(function success(response) {
- deferred.resolve(response);
- }, function fail() {
- deferred.reject();
- });
- return deferred.promise;
- }
-
- function resetPassword(resetToken, password) {
- var deferred = $q.defer();
- var url = '/api/noauth/resetPassword';
- $http.post(url, {resetToken: resetToken, password: password}).then(function success(response) {
- deferred.resolve(response);
- }, function fail() {
- deferred.reject();
- });
- return deferred.promise;
- }
-
- function activate(activateToken, password, sendActivationMail) {
- var deferred = $q.defer();
- var url = '/api/noauth/activate';
- if(sendActivationMail === true || sendActivationMail === false) {
- url += '?sendActivationMail=' + sendActivationMail;
- }
- $http.post(url, {activateToken: activateToken, password: password}).then(function success(response) {
- deferred.resolve(response);
- }, function fail() {
- deferred.reject();
- });
- return deferred.promise;
- }
-
- function changePassword(currentPassword, newPassword) {
- var deferred = $q.defer();
- var url = '/api/auth/changePassword';
- $http.post(url, {currentPassword: currentPassword, newPassword: newPassword}).then(function success(response) {
- deferred.resolve(response);
- }, function fail() {
- deferred.reject();
- });
- return deferred.promise;
- }
-
- function loadOAuth2Clients(){
- var deferred = $q.defer();
- var url = '/api/noauth/oauth2Clients';
- $http.post(url).then(function success(response) {
- $rootScope.oauth2Clients = response.data;
- deferred.resolve();
- }, function fail() {
- deferred.reject();
- });
- return deferred.promise;
- }
-}
diff --git a/ui/src/app/api/queue.service.js b/ui/src/app/api/queue.service.js
deleted file mode 100644
index 0fe93e5fa6..0000000000
--- a/ui/src/app/api/queue.service.js
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-
-export default angular.module('thingsboard.api.queue', [])
- .factory('queueService', queueService)
- .name;
-
-/*@ngInject*/
-function queueService($http, $q) {
- var service = {
- getTenantQueuesByServiceType: getTenantQueuesByServiceType
- };
-
- return service;
-
- function getTenantQueuesByServiceType(serviceType, config) {
- let deferred = $q.defer();
- let url = '/api/tenant/queues?serviceType=' + serviceType;
-
- $http.get(url, config).then(function success(data) {
- deferred.resolve(data);
- }, function fail() {
- deferred.reject();
- });
- return deferred.promise;
- }
-}
\ No newline at end of file
diff --git a/ui/src/app/api/rule-chain.service.js b/ui/src/app/api/rule-chain.service.js
deleted file mode 100644
index 87d2df5cae..0000000000
--- a/ui/src/app/api/rule-chain.service.js
+++ /dev/null
@@ -1,302 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-export default angular.module('thingsboard.api.ruleChain', [])
- .factory('ruleChainService', RuleChainService).name;
-
-/*@ngInject*/
-function RuleChainService($http, $q, $filter, $ocLazyLoad, $translate, types, componentDescriptorService) {
-
- var ruleNodeComponents = null;
-
- var service = {
- getRuleChains: getRuleChains,
- getRuleChain: getRuleChain,
- saveRuleChain: saveRuleChain,
- setRootRuleChain: setRootRuleChain,
- deleteRuleChain: deleteRuleChain,
- getRuleChainMetaData: getRuleChainMetaData,
- saveRuleChainMetaData: saveRuleChainMetaData,
- getRuleNodeComponents: getRuleNodeComponents,
- getRuleNodeComponentByClazz: getRuleNodeComponentByClazz,
- getRuleNodeSupportedLinks: getRuleNodeSupportedLinks,
- ruleNodeAllowCustomLinks: ruleNodeAllowCustomLinks,
- resolveTargetRuleChains: resolveTargetRuleChains,
- testScript: testScript,
- getLatestRuleNodeDebugInput: getLatestRuleNodeDebugInput
- };
-
- return service;
-
- function getRuleChains (pageLink, config) {
- var deferred = $q.defer();
- var url = '/api/ruleChains?limit=' + pageLink.limit;
- if (angular.isDefined(pageLink.textSearch)) {
- url += '&textSearch=' + pageLink.textSearch;
- }
- if (angular.isDefined(pageLink.idOffset)) {
- url += '&idOffset=' + pageLink.idOffset;
- }
- if (angular.isDefined(pageLink.textOffset)) {
- url += '&textOffset=' + pageLink.textOffset;
- }
- $http.get(url, config).then(function success(response) {
- deferred.resolve(response.data);
- }, function fail() {
- deferred.reject();
- });
- return deferred.promise;
- }
-
- function getRuleChain(ruleChainId, config) {
- var deferred = $q.defer();
- var url = '/api/ruleChain/' + ruleChainId;
- $http.get(url, config).then(function success(response) {
- deferred.resolve(response.data);
- }, function fail() {
- deferred.reject();
- });
- return deferred.promise;
- }
-
- function saveRuleChain(ruleChain) {
- var deferred = $q.defer();
- var url = '/api/ruleChain';
- $http.post(url, ruleChain).then(function success(response) {
- deferred.resolve(response.data);
- }, function fail() {
- deferred.reject();
- });
- return deferred.promise;
- }
-
- function setRootRuleChain(ruleChainId) {
- var deferred = $q.defer();
- var url = '/api/ruleChain/' + ruleChainId + '/root';
- $http.post(url).then(function success(response) {
- deferred.resolve(response.data);
- }, function fail() {
- deferred.reject();
- });
- return deferred.promise;
- }
-
- function deleteRuleChain(ruleChainId) {
- var deferred = $q.defer();
- var url = '/api/ruleChain/' + ruleChainId;
- $http.delete(url).then(function success() {
- deferred.resolve();
- }, function fail() {
- deferred.reject();
- });
- return deferred.promise;
- }
-
- function getRuleChainMetaData(ruleChainId, config) {
- var deferred = $q.defer();
- var url = '/api/ruleChain/' + ruleChainId + '/metadata';
- $http.get(url, config).then(function success(response) {
- deferred.resolve(response.data);
- }, function fail() {
- deferred.reject();
- });
- return deferred.promise;
- }
-
- function saveRuleChainMetaData(ruleChainMetaData) {
- var deferred = $q.defer();
- var url = '/api/ruleChain/metadata';
- $http.post(url, ruleChainMetaData).then(function success(response) {
- deferred.resolve(response.data);
- }, function fail() {
- deferred.reject();
- });
- return deferred.promise;
- }
-
- function getRuleNodeSupportedLinks(component) {
- var relationTypes = component.configurationDescriptor.nodeDefinition.relationTypes;
- var linkLabels = {};
- for (var i=0;i {
- resolveRuleNodeComponentsUiResources(components).then(
- (components) => {
- ruleNodeComponents = components;
- ruleNodeComponents.push(
- types.ruleChainNodeComponent
- );
- ruleNodeComponents.sort(
- (comp1, comp2) => {
- var result = comp1.type.localeCompare(comp2.type);
- if (result == 0) {
- result = comp1.name.localeCompare(comp2.name);
- }
- return result;
- }
- );
- deferred.resolve(ruleNodeComponents);
- },
- () => {
- deferred.reject();
- }
- );
- },
- () => {
- deferred.reject();
- }
- );
- }
- return deferred.promise;
- }
-
- function resolveRuleNodeComponentsUiResources(components) {
- var deferred = $q.defer();
- var tasks = [];
- for (var i=0;i {
- deferred.resolve(components);
- },
- () => {
- deferred.resolve(components);
- }
- );
- return deferred.promise;
- }
-
- function resolveRuleNodeComponentUiResources(component) {
- var deferred = $q.defer();
- var uiResources = component.configurationDescriptor.nodeDefinition.uiResources;
- if (uiResources && uiResources.length) {
- var tasks = [];
- for (var i=0;i {
- deferred.resolve(component);
- },
- () => {
- component.configurationDescriptor.nodeDefinition.uiResourceLoadError = $translate.instant('rulenode.ui-resources-load-error');
- deferred.resolve(component);
- }
- )
- } else {
- deferred.resolve(component);
- }
- return deferred.promise;
- }
-
- function getRuleNodeComponentByClazz(clazz) {
- var res = $filter('filter')(ruleNodeComponents, {clazz: clazz}, true);
- if (res && res.length) {
- return res[0];
- }
- var unknownComponent = angular.copy(types.unknownNodeComponent);
- unknownComponent.clazz = clazz;
- unknownComponent.configurationDescriptor.nodeDefinition.details = "Unknown Rule Node class: " + clazz;
- return unknownComponent;
- }
-
- function resolveTargetRuleChains(ruleChainConnections) {
- var deferred = $q.defer();
- if (ruleChainConnections && ruleChainConnections.length) {
- var tasks = [];
- for (var i = 0; i < ruleChainConnections.length; i++) {
- tasks.push(resolveRuleChain(ruleChainConnections[i].targetRuleChainId.id));
- }
- $q.all(tasks).then(
- (ruleChains) => {
- var ruleChainsMap = {};
- for (var i = 0; i < ruleChains.length; i++) {
- ruleChainsMap[ruleChains[i].id.id] = ruleChains[i];
- }
- deferred.resolve(ruleChainsMap);
- },
- () => {
- deferred.reject();
- }
- );
- } else {
- deferred.resolve({});
- }
- return deferred.promise;
- }
-
- function resolveRuleChain(ruleChainId) {
- var deferred = $q.defer();
- getRuleChain(ruleChainId, {ignoreErrors: true}).then(
- (ruleChain) => {
- deferred.resolve(ruleChain);
- },
- () => {
- deferred.resolve({
- id: {id: ruleChainId, entityType: types.entityType.rulechain}
- });
- }
- );
- return deferred.promise;
- }
-
- function loadRuleNodeComponents() {
- return componentDescriptorService.getComponentDescriptorsByTypes(types.ruleNodeTypeComponentTypes);
- }
-
- function testScript(inputParams) {
- var deferred = $q.defer();
- var url = '/api/ruleChain/testScript';
- $http.post(url, inputParams).then(function success(response) {
- deferred.resolve(response.data);
- }, function fail() {
- deferred.reject();
- });
- return deferred.promise;
- }
-
- function getLatestRuleNodeDebugInput(ruleNodeId) {
- var deferred = $q.defer();
- var url = '/api/ruleNode/' + ruleNodeId + '/debugIn';
- $http.get(url).then(function success(response) {
- deferred.resolve(response.data);
- }, function fail() {
- deferred.reject();
- });
- return deferred.promise;
- }
-
-}
diff --git a/ui/src/app/api/subscription.js b/ui/src/app/api/subscription.js
deleted file mode 100644
index 3f4b0e0183..0000000000
--- a/ui/src/app/api/subscription.js
+++ /dev/null
@@ -1,1072 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-/*
- options = {
- type,
- targetDeviceAliasIds, // RPC
- targetDeviceIds, // RPC
- datasources,
- timeWindowConfig,
- useDashboardTimewindow,
- legendConfig,
- decimals,
- units,
- callbacks
- }
- */
-
-export default class Subscription {
- constructor(subscriptionContext, options) {
-
- this.ctx = subscriptionContext;
- this.type = options.type;
- this.callbacks = options.callbacks;
- this.id = this.ctx.utils.guid();
- this.cafs = {};
- this.registrations = [];
- this.hasResolvedData = false;
-
- var subscription = this;
- var deferred = this.ctx.$q.defer();
-
- if (this.type === this.ctx.types.widgetType.rpc.value) {
- this.callbacks.rpcStateChanged = this.callbacks.rpcStateChanged || function(){};
- this.callbacks.onRpcSuccess = this.callbacks.onRpcSuccess || function(){};
- this.callbacks.onRpcFailed = this.callbacks.onRpcFailed || function(){};
- this.callbacks.onRpcErrorCleared = this.callbacks.onRpcErrorCleared || function(){};
-
- this.targetDeviceAliasIds = options.targetDeviceAliasIds;
- this.targetDeviceIds = options.targetDeviceIds;
-
- this.targetDeviceAliasId = null;
- this.targetDeviceId = null;
-
- this.rpcRejection = null;
- this.rpcErrorText = null;
- this.rpcEnabled = false;
- this.executingRpcRequest = false;
- this.executingPromises = [];
- this.initRpc().then(
- function() {
- deferred.resolve(subscription);
- }
- );
- } else if (this.type === this.ctx.types.widgetType.alarm.value) {
- this.callbacks.onDataUpdated = this.callbacks.onDataUpdated || function(){};
- this.callbacks.onDataUpdateError = this.callbacks.onDataUpdateError || function(){};
- this.callbacks.dataLoading = this.callbacks.dataLoading || function(){};
- this.callbacks.timeWindowUpdated = this.callbacks.timeWindowUpdated || function(){};
- this.alarmSource = options.alarmSource;
-
- this.alarmSearchStatus = angular.isDefined(options.alarmSearchStatus) ?
- options.alarmSearchStatus : this.ctx.types.alarmSearchStatus.any;
- this.alarmsPollingInterval = angular.isDefined(options.alarmsPollingInterval) ?
- options.alarmsPollingInterval : 5000;
- this.alarmsMaxCountLoad = angular.isDefined(options.alarmsMaxCountLoad) ?
- options.alarmsMaxCountLoad : 0;
- this.alarmsFetchSize = angular.isDefined(options.alarmsFetchSize) ?
- options.alarmsFetchSize : 100;
-
- this.alarmSourceListener = null;
- this.alarms = [];
-
- this.originalTimewindow = null;
- this.timeWindow = {};
- this.useDashboardTimewindow = options.useDashboardTimewindow;
-
- if (this.useDashboardTimewindow) {
- this.timeWindowConfig = angular.copy(options.dashboardTimewindow);
- } else {
- this.timeWindowConfig = angular.copy(options.timeWindowConfig);
- }
-
- this.subscriptionTimewindow = null;
-
- this.loadingData = false;
- this.displayLegend = false;
- this.initAlarmSubscription().then(
- function success() {
- deferred.resolve(subscription);
- },
- function fail() {
- deferred.reject();
- }
- );
- } else {
- this.callbacks.onDataUpdated = this.callbacks.onDataUpdated || function(){};
- this.callbacks.onDataUpdateError = this.callbacks.onDataUpdateError || function(){};
- this.callbacks.dataLoading = this.callbacks.dataLoading || function(){};
- this.callbacks.legendDataUpdated = this.callbacks.legendDataUpdated || function(){};
- this.callbacks.timeWindowUpdated = this.callbacks.timeWindowUpdated || function(){};
-
- this.datasources = this.ctx.utils.validateDatasources(options.datasources);
- this.datasourceListeners = [];
-
- /*
- * data = array of datasourceData
- * datasourceData = {
- * tbDatasource,
- * dataKey, { name, config }
- * data = array of [time, value]
- * }
- */
- this.data = [];
- this.hiddenData = [];
- this.originalTimewindow = null;
- this.timeWindow = {};
- this.useDashboardTimewindow = options.useDashboardTimewindow;
- this.stateData = options.stateData;
- if (this.useDashboardTimewindow) {
- this.timeWindowConfig = angular.copy(options.dashboardTimewindow);
- } else {
- this.timeWindowConfig = angular.copy(options.timeWindowConfig);
- }
-
- this.subscriptionTimewindow = null;
- this.comparisonEnabled = options.comparisonEnabled;
- if (this.comparisonEnabled) {
- this.timeForComparison = options.timeForComparison;
-
- this.comparisonTimeWindow = {};
- this.timewindowForComparison = null;
- }
-
- this.units = options.units || '';
- this.decimals = angular.isDefined(options.decimals) ? options.decimals : 2;
-
- this.loadingData = false;
-
- if (options.legendConfig) {
- this.legendConfig = options.legendConfig;
- this.legendData = {
- keys: [],
- data: []
- };
- this.displayLegend = true;
- } else {
- this.displayLegend = false;
- }
- this.caulculateLegendData = this.displayLegend &&
- this.type === this.ctx.types.widgetType.timeseries.value &&
- (this.legendConfig.showMin === true ||
- this.legendConfig.showMax === true ||
- this.legendConfig.showAvg === true ||
- this.legendConfig.showTotal === true);
- this.initDataSubscription().then(
- function success() {
- deferred.resolve(subscription);
- },
- function fail() {
- deferred.reject();
- }
- );
- }
-
- return deferred.promise;
- }
-
- getFirstEntityInfo() {
- var entityId, entityName, entityLabel = null;
- if (this.type === this.ctx.types.widgetType.rpc.value) {
- if (this.targetDeviceId) {
- entityId = {
- entityType: this.ctx.types.entityType.device,
- id: this.targetDeviceId
- };
- entityName = this.targetDeviceName;
- }
- } else if (this.type == this.ctx.types.widgetType.alarm.value) {
- if (this.alarmSource && this.alarmSource.entityType && this.alarmSource.entityId) {
- entityId = {
- entityType: this.alarmSource.entityType,
- id: this.alarmSource.entityId
- };
- entityName = this.alarmSource.entityName;
- entityLabel = this.alarmSource.entityLabel;
- }
- } else {
- for (var i=0;i {
- this.timeWindow.stDiff = stDiff;
- deferred.resolve();
- },
- () => {
- this.timeWindow.stDiff = 0;
- deferred.resolve();
- }
- );
- } else {
- if (this.timeWindow) {
- this.timeWindow.stDiff = 0;
- }
- deferred.resolve();
- }
- return deferred.promise;
- }
-
- initAlarmSubscription() {
- var deferred = this.ctx.$q.defer();
- var subscription = this;
- this.loadStDiff().then(() => {
- if (!subscription.ctx.aliasController) {
- subscription.hasResolvedData = true;
- subscription.configureAlarmsData();
- deferred.resolve();
- } else {
- subscription.ctx.aliasController.resolveAlarmSource(subscription.alarmSource).then(
- function success(alarmSource) {
- subscription.alarmSource = alarmSource;
- if (alarmSource) {
- subscription.hasResolvedData = true;
- }
- subscription.configureAlarmsData();
- deferred.resolve();
- },
- function fail() {
- deferred.reject();
- }
- );
- }
- });
- return deferred.promise;
- }
-
- configureAlarmsData() {
- var subscription = this;
- var registration;
- if (this.useDashboardTimewindow) {
- registration = this.ctx.$scope.$on('dashboardTimewindowChanged', function (event, newDashboardTimewindow) {
- if (!angular.equals(subscription.timeWindowConfig, newDashboardTimewindow) && newDashboardTimewindow) {
- subscription.timeWindowConfig = angular.copy(newDashboardTimewindow);
- subscription.update();
- }
- });
- this.registrations.push(registration);
- } else {
- this.startWatchingTimewindow();
- }
- registration = this.ctx.$scope.$watch(function () {
- return subscription.alarmSearchStatus;
- }, function (newAlarmSearchStatus, prevAlarmSearchStatus) {
- if (!angular.equals(newAlarmSearchStatus, prevAlarmSearchStatus)) {
- subscription.update();
- }
- }, true);
- this.registrations.push(registration);
- }
-
- initDataSubscription() {
- var deferred = this.ctx.$q.defer();
- var subscription = this;
- this.loadStDiff().then(() => {
- if (!subscription.ctx.aliasController) {
- subscription.hasResolvedData = true;
- subscription.configureData();
- deferred.resolve();
- } else {
- subscription.ctx.aliasController.resolveDatasources(subscription.datasources).then(
- function success(datasources) {
- subscription.datasources = datasources;
- if (datasources && datasources.length) {
- subscription.hasResolvedData = true;
- }
- subscription.configureData();
- deferred.resolve();
- },
- function fail() {
- subscription.notifyDataLoaded();
- deferred.reject();
- }
- );
- }
- });
- return deferred.promise;
- }
-
- configureData() {
- var additionalDatasources = [];
- var dataIndex = 0;
- var additionalKeysNumber = 0;
- for (var i = 0; i < this.datasources.length; i++) {
- var datasource = this.datasources[i];
- var additionalDataKeys = [];
- let datasourceAdditionalKeysNumber = 0;
-
- for (var a = 0; a < datasource.dataKeys.length; a++) {
- var dataKey = datasource.dataKeys[a];
- dataKey.hidden = dataKey.settings.hideDataByDefault ? true : false;
- dataKey.inLegend = dataKey.settings.removeFromLegend ? false : true;
- dataKey.pattern = angular.copy(dataKey.label);
-
- if (this.comparisonEnabled && dataKey.settings.comparisonSettings && dataKey.settings.comparisonSettings.showValuesForComparison) {
- datasourceAdditionalKeysNumber++;
- additionalKeysNumber++;
- let additionalDataKey = this.ctx.utils.createAdditionalDataKey(dataKey,datasource, this.timeForComparison,this.datasources,additionalKeysNumber);
- dataKey.settings.comparisonSettings.color = additionalDataKey.color;
-
- additionalDataKeys.push(additionalDataKey);
- }
-
- var datasourceData = {
- datasource: datasource,
- dataKey: dataKey,
- data: []
- };
- if (dataKey.type === this.ctx.types.dataKeyType.entityField) {
- if(datasource.entity && datasource.entity[this.ctx.types.entityField[dataKey.name].value]){
- datasourceData.data.push([Date.now(), datasource.entity[this.ctx.types.entityField[dataKey.name].value]]);
- }
- }
- this.data.push(datasourceData);
- this.hiddenData.push({data: []});
- if (this.displayLegend) {
- var legendKey = {
- dataKey: dataKey,
- dataIndex: dataIndex++
- };
- this.legendData.keys.push(legendKey);
- var legendKeyData = {
- min: null,
- max: null,
- avg: null,
- total: null,
- hidden: false
- };
- this.legendData.data.push(legendKeyData);
- }
- }
-
- if (datasourceAdditionalKeysNumber > 0) {
- let additionalDatasource = angular.copy(datasource);
- additionalDatasource.dataKeys = additionalDataKeys;
- additionalDatasource.isAdditional = true;
- additionalDatasources.push(additionalDatasource);
- }
- }
-
- for (var j=0; j < additionalDatasources.length; j++) {
- let additionalDatasource = additionalDatasources[j];
- for (var k=0; k < additionalDatasource.dataKeys.length; k++) {
- let additionalDataKey = additionalDatasource.dataKeys[k];
- var additionalDatasourceData = {
- datasource: additionalDatasource,
- dataKey: additionalDataKey,
- data: []
- };
- this.data.push(additionalDatasourceData);
- this.hiddenData.push({data: []});
- if (this.displayLegend) {
- var additionalLegendKey = {
- dataKey: additionalDataKey,
- dataIndex: dataIndex++
- };
- this.legendData.keys.push(additionalLegendKey);
- var additionalLegendKeyData = {
- min: null,
- max: null,
- avg: null,
- total: null,
- hidden: false
- };
- this.legendData.data.push(additionalLegendKeyData);
- }
- }
- }
-
- this.datasources = this.datasources.concat(additionalDatasources);
-
- var subscription = this;
- var registration;
-
- if (this.displayLegend) {
- this.legendData.keys = this.ctx.$filter('orderBy')(this.legendData.keys, '+label');
- registration = this.ctx.$scope.$watch(
- function() {
- return subscription.legendData.keys;
- },
- function (newValue, oldValue) {
- for(var i = 0; i < newValue.length; i++) {
- if(newValue[i].dataKey.hidden != oldValue[i].dataKey.hidden) {
- subscription.updateDataVisibility(i);
- }
- }
- }, true);
- this.registrations.push(registration);
- }
-
- if (this.type === this.ctx.types.widgetType.timeseries.value) {
- if (this.useDashboardTimewindow) {
- registration = this.ctx.$scope.$on('dashboardTimewindowChanged', function (event, newDashboardTimewindow) {
- if (!angular.equals(subscription.timeWindowConfig, newDashboardTimewindow) && newDashboardTimewindow) {
- subscription.timeWindowConfig = angular.copy(newDashboardTimewindow);
- subscription.update();
- }
- });
- this.registrations.push(registration);
- } else {
- this.startWatchingTimewindow();
- }
- }
- }
-
- resetData() {
- for (var i=0;i -1) {
- this.registrations.splice(index, 1);
- }
- }
- }
-
- initRpc() {
- var deferred = this.ctx.$q.defer();
- if (this.targetDeviceAliasIds && this.targetDeviceAliasIds.length > 0) {
- this.targetDeviceAliasId = this.targetDeviceAliasIds[0];
- var subscription = this;
- this.ctx.aliasController.getAliasInfo(this.targetDeviceAliasId).then(
- function success(aliasInfo) {
- if (aliasInfo.currentEntity && aliasInfo.currentEntity.entityType == subscription.ctx.types.entityType.device) {
- subscription.targetDeviceId = aliasInfo.currentEntity.id;
- subscription.targetDeviceName = aliasInfo.currentEntity.name;
- if (subscription.targetDeviceId) {
- subscription.rpcEnabled = true;
- } else {
- subscription.rpcEnabled = subscription.ctx.$scope.widgetEditMode ? true : false;
- }
- subscription.hasResolvedData = subscription.rpcEnabled;
- subscription.callbacks.rpcStateChanged(subscription);
- deferred.resolve();
- } else {
- subscription.rpcEnabled = false;
- subscription.callbacks.rpcStateChanged(subscription);
- deferred.resolve();
- }
- },
- function fail () {
- subscription.rpcEnabled = false;
- subscription.callbacks.rpcStateChanged(subscription);
- deferred.resolve();
- }
- );
- } else {
- if (this.targetDeviceIds && this.targetDeviceIds.length > 0) {
- this.targetDeviceId = this.targetDeviceIds[0];
- }
- if (this.targetDeviceId) {
- this.rpcEnabled = true;
- } else {
- this.rpcEnabled = this.ctx.$scope.widgetEditMode ? true : false;
- }
- this.hasResolvedData = true;
- this.callbacks.rpcStateChanged(this);
- deferred.resolve();
- }
- return deferred.promise;
- }
-
- clearRpcError() {
- this.rpcRejection = null;
- this.rpcErrorText = null;
- this.callbacks.onRpcErrorCleared(this);
- }
-
- sendOneWayCommand(method, params, timeout) {
- return this.sendCommand(true, method, params, timeout);
- }
-
- sendTwoWayCommand(method, params, timeout) {
- return this.sendCommand(false, method, params, timeout);
- }
-
- sendCommand(oneWayElseTwoWay, method, params, timeout) {
- if (!this.rpcEnabled) {
- return this.ctx.$q.reject();
- }
-
- if (this.rpcRejection && this.rpcRejection.status !== 408) {
- this.rpcRejection = null;
- this.rpcErrorText = null;
- this.callbacks.onRpcErrorCleared(this);
- }
-
- var subscription = this;
-
- var requestBody = {
- method: method,
- params: params
- };
-
- if (timeout && timeout > 0) {
- requestBody.timeout = timeout;
- }
-
- var deferred = this.ctx.$q.defer();
- this.executingRpcRequest = true;
- this.callbacks.rpcStateChanged(this);
- if (this.ctx.$scope.widgetEditMode) {
- this.ctx.$timeout(function() {
- subscription.executingRpcRequest = false;
- subscription.callbacks.rpcStateChanged(subscription);
- if (oneWayElseTwoWay) {
- deferred.resolve();
- } else {
- deferred.resolve(requestBody);
- }
- }, 500);
- } else {
- this.executingPromises.push(deferred.promise);
- var targetSendFunction = oneWayElseTwoWay ? this.ctx.deviceService.sendOneWayRpcCommand : this.ctx.deviceService.sendTwoWayRpcCommand;
- targetSendFunction(this.targetDeviceId, requestBody).then(
- function success(responseBody) {
- subscription.rpcRejection = null;
- subscription.rpcErrorText = null;
- var index = subscription.executingPromises.indexOf(deferred.promise);
- if (index >= 0) {
- subscription.executingPromises.splice( index, 1 );
- }
- subscription.executingRpcRequest = subscription.executingPromises.length > 0;
- subscription.callbacks.onRpcSuccess(subscription);
- deferred.resolve(responseBody);
- },
- function fail(rejection) {
- var index = subscription.executingPromises.indexOf(deferred.promise);
- if (index >= 0) {
- subscription.executingPromises.splice( index, 1 );
- }
- subscription.executingRpcRequest = subscription.executingPromises.length > 0;
- subscription.callbacks.rpcStateChanged(subscription);
- if (!subscription.executingRpcRequest || rejection.status === 408) {
- subscription.rpcRejection = rejection;
- if (rejection.status === 408) {
- subscription.rpcErrorText = 'Device is offline.';
- } else {
- subscription.rpcErrorText = 'Error : ' + rejection.status + ' - ' + rejection.statusText;
- if (rejection.data && rejection.data.length > 0) {
- subscription.rpcErrorText += '';
- subscription.rpcErrorText += rejection.data;
- }
- }
- subscription.callbacks.onRpcFailed(subscription);
- }
- deferred.reject(rejection);
- }
- );
- }
- return deferred.promise;
- }
-
- updateDataVisibility(index) {
- var hidden = this.legendData.keys[index].dataKey.hidden;
- if (hidden) {
- this.hiddenData[index].data = this.data[index].data;
- this.data[index].data = [];
- } else {
- this.data[index].data = this.hiddenData[index].data;
- this.hiddenData[index].data = [];
- }
- this.onDataUpdated();
- }
-
- onAliasesChanged(aliasIds) {
- if (this.type === this.ctx.types.widgetType.rpc.value) {
- return this.checkRpcTarget(aliasIds);
- } else if (this.type === this.ctx.types.widgetType.alarm.value) {
- return this.checkAlarmSource(aliasIds);
- } else {
- return this.checkSubscriptions(aliasIds);
- }
- }
-
- onDataUpdated(apply) {
- if (this.cafs['dataUpdated']) {
- this.cafs['dataUpdated']();
- this.cafs['dataUpdated'] = null;
- }
- var subscription = this;
- this.cafs['dataUpdated'] = this.ctx.tbRaf(function() {
- try {
- subscription.callbacks.onDataUpdated(subscription, apply);
- } catch (e) {
- subscription.callbacks.onDataUpdateError(subscription, e);
- }
- });
- if (apply) {
- this.ctx.$scope.$digest();
- }
- }
-
- updateTimewindowConfig(newTimewindow) {
- this.timeWindowConfig = newTimewindow;
- }
-
- onResetTimewindow() {
- if (this.useDashboardTimewindow) {
- this.ctx.dashboardTimewindowApi.onResetTimewindow();
- } else {
- if (this.originalTimewindow) {
- this.stopWatchingTimewindow();
- this.timeWindowConfig = angular.copy(this.originalTimewindow);
- this.originalTimewindow = null;
- this.callbacks.timeWindowUpdated(this, this.timeWindowConfig);
- this.update();
- this.startWatchingTimewindow();
- }
- }
- }
-
- onUpdateTimewindow(startTimeMs, endTimeMs) {
- if (this.useDashboardTimewindow) {
- this.ctx.dashboardTimewindowApi.onUpdateTimewindow(startTimeMs, endTimeMs);
- } else {
- this.stopWatchingTimewindow();
- if (!this.originalTimewindow) {
- this.originalTimewindow = angular.copy(this.timeWindowConfig);
- }
- this.timeWindowConfig = this.ctx.timeService.toHistoryTimewindow(this.timeWindowConfig, startTimeMs, endTimeMs);
- this.callbacks.timeWindowUpdated(this, this.timeWindowConfig);
- this.update();
- this.startWatchingTimewindow();
- }
- }
-
- notifyDataLoading() {
- this.loadingData = true;
- this.callbacks.dataLoading(this);
- }
-
- notifyDataLoaded() {
- this.loadingData = false;
- this.callbacks.dataLoading(this);
- }
-
- updateTimewindow() {
- this.timeWindow.interval = this.subscriptionTimewindow.aggregation.interval || 1000;
- if (this.subscriptionTimewindow.realtimeWindowMs) {
- this.timeWindow.maxTime = (moment()).valueOf() + this.timeWindow.stDiff;//eslint-disable-line
- this.timeWindow.minTime = this.timeWindow.maxTime - this.subscriptionTimewindow.realtimeWindowMs;
- } else if (this.subscriptionTimewindow.fixedWindow) {
- this.timeWindow.maxTime = this.subscriptionTimewindow.fixedWindow.endTimeMs;
- this.timeWindow.minTime = this.subscriptionTimewindow.fixedWindow.startTimeMs;
- }
- }
-
- updateRealtimeSubscription(subscriptionTimewindow) {
- if (subscriptionTimewindow) {
- this.subscriptionTimewindow = subscriptionTimewindow;
- } else {
- this.subscriptionTimewindow =
- this.ctx.timeService.createSubscriptionTimewindow(
- this.timeWindowConfig,
- this.timeWindow.stDiff, this.stateData);
- }
- this.updateTimewindow();
- return this.subscriptionTimewindow;
- }
-
- updateComparisonTimewindow() {
- this.comparisonTimeWindow.interval = this.timewindowForComparison.aggregation.interval || 1000;
- if (this.timewindowForComparison.realtimeWindowMs) {
- this.comparisonTimeWindow.maxTime = moment(this.timeWindow.maxTime).subtract(1, this.timeForComparison).valueOf(); //eslint-disable-line
- this.comparisonTimeWindow.minTime = this.comparisonTimeWindow.maxTime - this.timewindowForComparison.realtimeWindowMs;
- } else if (this.timewindowForComparison.fixedWindow) {
- this.comparisonTimeWindow.maxTime = this.timewindowForComparison.fixedWindow.endTimeMs;
- this.comparisonTimeWindow.minTime = this.timewindowForComparison.fixedWindow.startTimeMs;
- }
- }
-
- updateSubscriptionForComparison() {
- if (!this.subscriptionTimewindow) {
- this.subscriptionTimewindow = this.updateRealtimeSubscription();
- }
- this.timewindowForComparison = this.ctx.timeService.createTimewindowForComparison(this.subscriptionTimewindow, this.timeForComparison);
- this.updateComparisonTimewindow();
- return this.timewindowForComparison;
- }
-
- dataUpdated(sourceData, datasourceIndex, dataKeyIndex, apply) {
- for (var x = 0; x < this.datasourceListeners.length; x++) {
- this.datasources[x].dataReceived = this.datasources[x].dataReceived === true;
- if (this.datasourceListeners[x].datasourceIndex === datasourceIndex && sourceData.data.length > 0) {
- this.datasources[x].dataReceived = true;
- }
- }
- this.notifyDataLoaded();
- var update = true;
- var currentData;
- if (this.displayLegend && this.legendData.keys[datasourceIndex + dataKeyIndex].dataKey.hidden) {
- currentData = this.hiddenData[datasourceIndex + dataKeyIndex];
- } else {
- currentData = this.data[datasourceIndex + dataKeyIndex];
- }
- if (this.type === this.ctx.types.widgetType.latest.value) {
- var prevData = currentData.data;
- if (!sourceData.data.length) {
- update = false;
- } else if (prevData && prevData[0] && prevData[0].length > 1 && sourceData.data.length > 0) {
- var prevTs = prevData[0][0];
- var prevValue = prevData[0][1];
- if (prevTs === sourceData.data[0][0] && prevValue === sourceData.data[0][1]) {
- update = false;
- }
- }
- }
- if (update) {
- if (this.subscriptionTimewindow && this.subscriptionTimewindow.realtimeWindowMs) {
- this.updateTimewindow();
- if (this.timewindowForComparison && this.timewindowForComparison.realtimeWindowMs) {
- this.updateComparisonTimewindow();
- }
- }
- currentData.data = sourceData.data;
- if (this.caulculateLegendData) {
- this.updateLegend(datasourceIndex + dataKeyIndex, sourceData.data, apply);
- }
- this.onDataUpdated(apply);
- }
- }
-
- alarmsUpdated(alarms, apply) {
- this.notifyDataLoaded();
- var updated = !this.alarms || !angular.equals(this.alarms, alarms);
- this.alarms = alarms;
- if (this.subscriptionTimewindow && this.subscriptionTimewindow.realtimeWindowMs) {
- this.updateTimewindow();
- }
- if (updated) {
- this.onDataUpdated(apply);
- }
- }
-
- updateLegend(dataIndex, data, apply) {
- var dataKey = this.legendData.keys[dataIndex].dataKey;
- var decimals = angular.isDefined(dataKey.decimals) ? dataKey.decimals : this.decimals;
- var units = dataKey.units && dataKey.units.length ? dataKey.units : this.units;
- var legendKeyData = this.legendData.data[dataIndex];
- if (this.legendConfig.showMin) {
- legendKeyData.min = this.ctx.widgetUtils.formatValue(calculateMin(data), decimals, units);
- }
- if (this.legendConfig.showMax) {
- legendKeyData.max = this.ctx.widgetUtils.formatValue(calculateMax(data), decimals, units);
- }
- if (this.legendConfig.showAvg) {
- legendKeyData.avg = this.ctx.widgetUtils.formatValue(calculateAvg(data), decimals, units);
- }
- if (this.legendConfig.showTotal) {
- legendKeyData.total = this.ctx.widgetUtils.formatValue(calculateTotal(data), decimals, units);
- }
- this.callbacks.legendDataUpdated(this, apply !== false);
- }
-
- update() {
- this.unsubscribe();
- this.subscribe();
- }
-
- subscribe() {
- if (this.type === this.ctx.types.widgetType.rpc.value) {
- return;
- }
- if (this.type === this.ctx.types.widgetType.alarm.value) {
- this.alarmsSubscribe();
- } else {
- this.notifyDataLoading();
- if (this.type === this.ctx.types.widgetType.timeseries.value && this.timeWindowConfig) {
- this.updateRealtimeSubscription();
- if (this.comparisonEnabled) {
- this.updateSubscriptionForComparison();
- }
- if (this.subscriptionTimewindow.fixedWindow) {
- this.onDataUpdated();
- }
- }
- var index = 0;
- for (var i = 0; i < this.datasources.length; i++) {
- var datasource = this.datasources[i];
- if (angular.isFunction(datasource))
- continue;
-
- var subscription = this;
-
- var listener = {
- subscriptionType: this.type,
- subscriptionTimewindow: this.subscriptionTimewindow,
- datasource: datasource,
- entityType: datasource.entityType,
- entityId: datasource.entityId,
- dataUpdated: function (data, datasourceIndex, dataKeyIndex, apply) {
- subscription.dataUpdated(data, datasourceIndex, dataKeyIndex, apply);
- },
- updateRealtimeSubscription: function () {
- this.subscriptionTimewindow = subscription.updateRealtimeSubscription();
- return this.subscriptionTimewindow;
- },
- setRealtimeSubscription: function (subscriptionTimewindow) {
- subscription.updateRealtimeSubscription(angular.copy(subscriptionTimewindow));
- },
- datasourceIndex: index
- };
-
- if (this.comparisonEnabled && datasource.isAdditional) {
- listener.subscriptionTimewindow = this.timewindowForComparison;
- listener.updateRealtimeSubscription = function () {
- this.subscriptionTimewindow = subscription.updateSubscriptionForComparison();
- return this.subscriptionTimewindow;
- };
- listener.setRealtimeSubscription = function () {
- subscription.updateSubscriptionForComparison();
- };
- }
-
- var entityFieldKey = false;
-
- for (var a = 0; a < datasource.dataKeys.length; a++) {
- if (datasource.dataKeys[a].type !== this.ctx.types.dataKeyType.entityField) {
- this.data[index + a].data = [];
- } else {
- entityFieldKey = true;
- }
- }
-
- index += datasource.dataKeys.length;
-
- this.datasourceListeners.push(listener);
-
- if (datasource.dataKeys.length) {
- this.ctx.datasourceService.subscribeToDatasource(listener);
- }
-
- var forceUpdate = false;
- if (datasource.unresolvedStateEntity || entityFieldKey ||
- !datasource.dataKeys.length ||
- (datasource.type === this.ctx.types.datasourceType.entity && !datasource.entityId)
- ) {
- forceUpdate = true;
- }
-
- if (forceUpdate) {
- this.notifyDataLoaded();
- this.onDataUpdated();
- }
- }
- }
- }
-
- alarmsSubscribe() {
- this.notifyDataLoading();
- if (this.timeWindowConfig) {
- this.updateRealtimeSubscription();
- if (this.subscriptionTimewindow.fixedWindow) {
- this.onDataUpdated();
- }
- }
- var subscription = this;
- this.alarmSourceListener = {
- subscriptionTimewindow: this.subscriptionTimewindow,
- alarmSource: this.alarmSource,
- alarmSearchStatus: this.alarmSearchStatus,
- alarmsPollingInterval: this.alarmsPollingInterval,
- alarmsMaxCountLoad: this.alarmsMaxCountLoad,
- alarmsFetchSize: this.alarmsFetchSize,
- alarmsUpdated: function(alarms, apply) {
- subscription.alarmsUpdated(alarms, apply);
- }
- }
- this.alarms = null;
-
- this.ctx.alarmService.subscribeForAlarms(this.alarmSourceListener);
-
- var forceUpdate = false;
- if (this.alarmSource.unresolvedStateEntity ||
- (this.alarmSource.type === this.ctx.types.datasourceType.entity && !this.alarmSource.entityId)
- ) {
- forceUpdate = true;
- }
-
- if (forceUpdate) {
- this.notifyDataLoaded();
- this.onDataUpdated();
- }
- }
-
- unsubscribe() {
- if (this.type !== this.ctx.types.widgetType.rpc.value) {
- if (this.type == this.ctx.types.widgetType.alarm.value) {
- this.alarmsUnsubscribe();
- } else {
- for (var i = 0; i < this.datasourceListeners.length; i++) {
- var listener = this.datasourceListeners[i];
- this.ctx.datasourceService.unsubscribeFromDatasource(listener);
- }
- this.datasourceListeners = [];
- this.resetData();
- }
- }
- }
-
- alarmsUnsubscribe() {
- if (this.alarmSourceListener) {
- this.ctx.alarmService.unsubscribeFromAlarms(this.alarmSourceListener);
- this.alarmSourceListener = null;
- }
- }
-
- checkRpcTarget(aliasIds) {
- if (aliasIds.indexOf(this.targetDeviceAliasId) > -1) {
- return true;
- } else {
- return false;
- }
- }
-
- checkAlarmSource(aliasIds) {
- if (this.alarmSource && this.alarmSource.entityAliasId) {
- return aliasIds.indexOf(this.alarmSource.entityAliasId) > -1;
- } else {
- return false;
- }
- }
-
- checkSubscriptions(aliasIds) {
- var subscriptionsChanged = false;
- for (var i = 0; i < this.datasourceListeners.length; i++) {
- var listener = this.datasourceListeners[i];
- if (listener.datasource.entityAliasId) {
- if (aliasIds.indexOf(listener.datasource.entityAliasId) > -1) {
- subscriptionsChanged = true;
- break;
- }
- }
- }
- return subscriptionsChanged;
- }
-
- isDataResolved() {
- return this.hasResolvedData;
- }
-
- destroy() {
- this.unsubscribe();
- for (var cafId in this.cafs) {
- if (this.cafs[cafId]) {
- this.cafs[cafId]();
- this.cafs[cafId] = null;
- }
- }
- this.registrations.forEach(function (registration) {
- registration();
- });
- this.registrations = [];
- }
-}
-
-function calculateMin(data) {
- if (data.length > 0) {
- var result = Number(data[0][1]);
- for (var i=1;i 0) {
- var result = Number(data[0][1]);
- for (var i=1;i 0) {
- return calculateTotal(data)/data.length;
- } else {
- return null;
- }
-}
-
-function calculateTotal(data) {
- if (data.length > 0) {
- var result = 0;
- for (var i = 0; i < data.length; i++) {
- result += Number(data[i][1]);
- }
- return result;
- } else {
- return null;
- }
-}
diff --git a/ui/src/app/api/telemetry-websocket.service.js b/ui/src/app/api/telemetry-websocket.service.js
deleted file mode 100644
index edc1fb3147..0000000000
--- a/ui/src/app/api/telemetry-websocket.service.js
+++ /dev/null
@@ -1,362 +0,0 @@
-/*
- * Copyright © 2016-2020 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 'angular-websocket';
-import thingsboardTypes from '../common/types.constant';
-
-export default angular.module('thingsboard.api.telemetryWebsocket', [thingsboardTypes])
- .factory('telemetryWebsocketService', TelemetryWebsocketService)
- .name;
-
-const RECONNECT_INTERVAL = 2000;
-const WS_IDLE_TIMEOUT = 90000;
-
-const MAX_PUBLISH_COMMANDS = 10;
-
-/*@ngInject*/
-function TelemetryWebsocketService($rootScope, $websocket, $timeout, $window, $mdUtil, $log, toast, types, userService) {
-
- var isOpening = false,
- isOpened = false,
- isActive = false,
- isReconnect = false,
- reconnectSubscribers = [],
- lastCmdId = 0,
- subscribers = {},
- subscribersCount = 0,
- commands = {},
- cmdsWrapper = {
- tsSubCmds: [],
- historyCmds: [],
- attrSubCmds: []
- },
- telemetryUri,
- dataStream,
- location = $window.location,
- socketCloseTimer,
- reconnectTimer;
-
- var port = location.port;
- if (location.protocol === "https:") {
- if (!port) {
- port = "443";
- }
- telemetryUri = "wss:";
- } else {
- if (!port) {
- port = "80";
- }
- telemetryUri = "ws:";
- }
- telemetryUri += "//" + location.hostname + ":" + port;
- telemetryUri += "/api/ws/plugins/telemetry";
-
- var service = {
- subscribe: subscribe,
- unsubscribe: unsubscribe
- }
-
- $rootScope.telemetryWsLogoutHandle = $rootScope.$on('unauthenticated', function (event, doLogout) {
- if (doLogout) {
- reset(true);
- }
- });
-
- $rootScope.telemetryWsLoginHandle = $rootScope.$on('authenticated', function () {
- reset(true);
- });
-
- return service;
-
- function publishCommands () {
- while(isOpened && hasCommands()) {
- dataStream.send(preparePublishCommands()).then(function () {
- checkToClose();
- });
- }
- tryOpenSocket();
- }
-
- function hasCommands() {
- return cmdsWrapper.tsSubCmds.length > 0 ||
- cmdsWrapper.historyCmds.length > 0 ||
- cmdsWrapper.attrSubCmds.length > 0;
- }
-
- function preparePublishCommands() {
- var preparedWrapper = {};
- var leftCount = MAX_PUBLISH_COMMANDS;
- preparedWrapper.tsSubCmds = popCmds(cmdsWrapper.tsSubCmds, leftCount);
- leftCount -= preparedWrapper.tsSubCmds.length;
- preparedWrapper.historyCmds = popCmds(cmdsWrapper.historyCmds, leftCount);
- leftCount -= preparedWrapper.historyCmds.length;
- preparedWrapper.attrSubCmds = popCmds(cmdsWrapper.attrSubCmds, leftCount);
- return preparedWrapper;
- }
-
- function popCmds(cmds, leftCount) {
- var toPublish = Math.min(cmds.length, leftCount);
- if (toPublish > 0) {
- return cmds.splice(0, toPublish);
- } else {
- return [];
- }
- }
-
- function onError (errorEvent) {
- if (errorEvent) {
- //showWsError(0, errorEvent);
- $log.warn('WebSocket error event', errorEvent);
- }
- isOpening = false;
- }
-
- function onOpen () {
- isOpening = false;
- isOpened = true;
- if (reconnectTimer) {
- $timeout.cancel(reconnectTimer);
- reconnectTimer = null;
- }
- if (isReconnect) {
- isReconnect = false;
- for (var r=0; r 1000 && closeEvent.code !== 1006) {
- showWsError(closeEvent.code, closeEvent.reason);
- }
- isOpening = false;
- isOpened = false;
- if (isActive) {
- if (!isReconnect) {
- reconnectSubscribers = [];
- for (var id in subscribers) {
- var subscriber = subscribers[id];
- if (reconnectSubscribers.indexOf(subscriber) === -1) {
- reconnectSubscribers.push(subscriber);
- }
- }
- reset(false);
- isReconnect = true;
- }
- if (reconnectTimer) {
- $timeout.cancel(reconnectTimer);
- }
- reconnectTimer = $timeout(tryOpenSocket, RECONNECT_INTERVAL, false);
- }
- }
-
- function onMessage (message) {
- if (message.data) {
- var data = angular.fromJson(message.data);
- if (data.errorCode) {
- showWsError(data.errorCode, data.errorMsg);
- } else if (data.subscriptionId) {
- var subscriber = subscribers[data.subscriptionId];
- if (subscriber && data) {
- var keys = fetchKeys(data.subscriptionId);
- if (!data.data) {
- data.data = {};
- }
- for (var k = 0; k < keys.length; k++) {
- var key = keys[k];
- if (!data.data[key]) {
- data.data[key] = [];
- }
- }
- subscriber.onData(data, data.subscriptionId);
- }
- }
- }
- checkToClose();
- }
-
- function showWsError(errorCode, errorMsg) {
- var message = 'WebSocket Error: ';
- if (errorMsg) {
- message += errorMsg;
- } else {
- message += "error code - " + errorCode + ".";
- }
- $mdUtil.nextTick(function () {
- toast.showError(message);
- });
- }
-
- function fetchKeys(subscriptionId) {
- var command = commands[subscriptionId];
- if (command && command.keys && command.keys.length > 0) {
- return command.keys.split(",");
- } else {
- return [];
- }
- }
-
- function nextCmdId () {
- lastCmdId++;
- return lastCmdId;
- }
-
- function subscribe (subscriber) {
- isActive = true;
- var cmdId;
- if (angular.isDefined(subscriber.subscriptionCommands)) {
- for (var i=0;i -1) {
- reconnectSubscribers.splice(index, 1);
- }
- subscribersCount--;
- publishCommands();
- }
- }
-
- function checkToClose () {
- if (subscribersCount === 0 && isOpened) {
- if (!socketCloseTimer) {
- socketCloseTimer = $timeout(closeSocket, WS_IDLE_TIMEOUT, false);
- }
- }
- }
-
- function tryOpenSocket () {
- if (isActive) {
- if (!isOpened && !isOpening) {
- isOpening = true;
- if (userService.isJwtTokenValid()) {
- openSocket(userService.getJwtToken());
- } else {
- userService.refreshJwtToken().then(function success() {
- openSocket(userService.getJwtToken());
- }, function fail() {
- isOpening = false;
- $rootScope.$broadcast('unauthenticated');
- });
- }
- }
- if (socketCloseTimer) {
- $timeout.cancel(socketCloseTimer);
- socketCloseTimer = null;
- }
- }
- }
-
- function openSocket(token) {
- dataStream = $websocket(telemetryUri + '?token=' + token);
- dataStream.onError(onError);
- dataStream.onOpen(onOpen);
- dataStream.onClose(onClose);
- dataStream.onMessage(onMessage, {autoApply: false});
- }
-
- function closeSocket() {
- isActive = false;
- if (isOpened) {
- dataStream.close();
- }
- }
-
- function reset(close) {
- if (socketCloseTimer) {
- $timeout.cancel(socketCloseTimer);
- socketCloseTimer = null;
- }
- lastCmdId = 0;
- subscribers = {};
- subscribersCount = 0;
- commands = {};
- cmdsWrapper.tsSubCmds = [];
- cmdsWrapper.historyCmds = [];
- cmdsWrapper.attrSubCmds = [];
- if (close) {
- closeSocket();
- }
- }
-}
diff --git a/ui/src/app/api/tenant.service.js b/ui/src/app/api/tenant.service.js
deleted file mode 100644
index dfc83a13f9..0000000000
--- a/ui/src/app/api/tenant.service.js
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-export default angular.module('thingsboard.api.tenant', [])
- .factory('tenantService', TenantService)
- .name;
-
-/*@ngInject*/
-function TenantService($http, $q) {
-
- var service = {
- deleteTenant: deleteTenant,
- getTenant: getTenant,
- getTenants: getTenants,
- saveTenant: saveTenant,
- }
-
- return service;
-
- function getTenants (pageLink, config) {
- var deferred = $q.defer();
- var url = '/api/tenants?limit=' + pageLink.limit;
- if (angular.isDefined(pageLink.textSearch)) {
- url += '&textSearch=' + pageLink.textSearch;
- }
- if (angular.isDefined(pageLink.idOffset)) {
- url += '&idOffset=' + pageLink.idOffset;
- }
- if (angular.isDefined(pageLink.textOffset)) {
- url += '&textOffset=' + pageLink.textOffset;
- }
- $http.get(url, config).then(function success(response) {
- deferred.resolve(response.data);
- }, function fail() {
- deferred.reject();
- });
- return deferred.promise;
- }
-
- function getTenant (tenantId, config) {
- var deferred = $q.defer();
- var url = '/api/tenant/' + tenantId;
- $http.get(url, config).then(function success(response) {
- deferred.resolve(response.data);
- }, function fail(response) {
- deferred.reject(response.data);
- });
- return deferred.promise;
- }
-
- function saveTenant (tenant) {
- var deferred = $q.defer();
- var url = '/api/tenant';
- $http.post(url, tenant).then(function success(response) {
- deferred.resolve(response.data);
- }, function fail(response) {
- deferred.reject(response.data);
- });
- return deferred.promise;
- }
-
- function deleteTenant (tenantId) {
- var deferred = $q.defer();
- var url = '/api/tenant/' + tenantId;
- $http.delete(url).then(function success() {
- deferred.resolve();
- }, function fail(response) {
- deferred.reject(response.data);
- });
- return deferred.promise;
- }
-
-}
diff --git a/ui/src/app/api/time.service.js b/ui/src/app/api/time.service.js
deleted file mode 100644
index 93c0db302c..0000000000
--- a/ui/src/app/api/time.service.js
+++ /dev/null
@@ -1,413 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-export default angular.module('thingsboard.api.time', [])
- .factory('timeService', TimeService)
- .name;
-
-const SECOND = 1000;
-const MINUTE = 60 * SECOND;
-const HOUR = 60 * MINUTE;
-const DAY = 24 * HOUR;
-
-const MIN_INTERVAL = SECOND;
-const MAX_INTERVAL = 365 * 20 * DAY;
-
-const MIN_LIMIT = 10;
-//const AVG_LIMIT = 200;
-//const MAX_LIMIT = 500;
-
-/*@ngInject*/
-function TimeService($translate, $http, $q, types) {
-
- var predefIntervals;
- var maxDatapointsLimit;
-
- var service = {
- loadMaxDatapointsLimit: loadMaxDatapointsLimit,
- minIntervalLimit: minIntervalLimit,
- maxIntervalLimit: maxIntervalLimit,
- boundMinInterval: boundMinInterval,
- boundMaxInterval: boundMaxInterval,
- getIntervals: getIntervals,
- matchesExistingInterval: matchesExistingInterval,
- boundToPredefinedInterval: boundToPredefinedInterval,
- defaultTimewindow: defaultTimewindow,
- toHistoryTimewindow: toHistoryTimewindow,
- createSubscriptionTimewindow: createSubscriptionTimewindow,
- createTimewindowForComparison: createTimewindowForComparison,
- getMaxDatapointsLimit: function () {
- return maxDatapointsLimit;
- },
- getMinDatapointsLimit: function () {
- return MIN_LIMIT;
- }
- }
-
- return service;
-
- function loadMaxDatapointsLimit() {
- var deferred = $q.defer();
- var url = '/api/dashboard/maxDatapointsLimit';
- $http.get(url, {ignoreLoading: true}).then(function success(response) {
- maxDatapointsLimit = response.data;
- if (!maxDatapointsLimit || maxDatapointsLimit <= MIN_LIMIT) {
- maxDatapointsLimit = MIN_LIMIT + 1;
- }
- deferred.resolve();
- }, function fail() {
- deferred.reject();
- });
- return deferred.promise;
- }
-
- function minIntervalLimit(timewindow) {
- var min = timewindow / 500;
- return boundMinInterval(min);
- }
-
- function avgInterval(timewindow) {
- var avg = timewindow / 200;
- return boundMinInterval(avg);
- }
-
- function maxIntervalLimit(timewindow) {
- var max = timewindow / MIN_LIMIT;
- return boundMaxInterval(max);
- }
-
- function boundMinInterval(min) {
- return toBound(min, MIN_INTERVAL, MAX_INTERVAL, MIN_INTERVAL);
- }
-
- function boundMaxInterval(max) {
- return toBound(max, MIN_INTERVAL, MAX_INTERVAL, MAX_INTERVAL);
- }
-
- function toBound(value, min, max, defValue) {
- if (angular.isDefined(value)) {
- value = Math.max(value, min);
- value = Math.min(value, max);
- return value;
- } else {
- return defValue;
- }
- }
-
- function getIntervals(min, max) {
- min = boundMinInterval(min);
- max = boundMaxInterval(max);
- var intervals = [];
- initPredefIntervals();
- for (var i in predefIntervals) {
- var interval = predefIntervals[i];
- if (interval.value >= min && interval.value <= max) {
- intervals.push(interval);
- }
- }
- return intervals;
- }
-
- function initPredefIntervals() {
- if (!predefIntervals) {
- predefIntervals = [
- {
- name: $translate.instant('timeinterval.seconds-interval', {seconds: 1}, 'messageformat'),
- value: 1 * SECOND
- },
- {
- name: $translate.instant('timeinterval.seconds-interval', {seconds: 5}, 'messageformat'),
- value: 5 * SECOND
- },
- {
- name: $translate.instant('timeinterval.seconds-interval', {seconds: 10}, 'messageformat'),
- value: 10 * SECOND
- },
- {
- name: $translate.instant('timeinterval.seconds-interval', {seconds: 15}, 'messageformat'),
- value: 15 * SECOND
- },
- {
- name: $translate.instant('timeinterval.seconds-interval', {seconds: 30}, 'messageformat'),
- value: 30 * SECOND
- },
- {
- name: $translate.instant('timeinterval.minutes-interval', {minutes: 1}, 'messageformat'),
- value: 1 * MINUTE
- },
- {
- name: $translate.instant('timeinterval.minutes-interval', {minutes: 2}, 'messageformat'),
- value: 2 * MINUTE
- },
- {
- name: $translate.instant('timeinterval.minutes-interval', {minutes: 5}, 'messageformat'),
- value: 5 * MINUTE
- },
- {
- name: $translate.instant('timeinterval.minutes-interval', {minutes: 10}, 'messageformat'),
- value: 10 * MINUTE
- },
- {
- name: $translate.instant('timeinterval.minutes-interval', {minutes: 15}, 'messageformat'),
- value: 15 * MINUTE
- },
- {
- name: $translate.instant('timeinterval.minutes-interval', {minutes: 30}, 'messageformat'),
- value: 30 * MINUTE
- },
- {
- name: $translate.instant('timeinterval.hours-interval', {hours: 1}, 'messageformat'),
- value: 1 * HOUR
- },
- {
- name: $translate.instant('timeinterval.hours-interval', {hours: 2}, 'messageformat'),
- value: 2 * HOUR
- },
- {
- name: $translate.instant('timeinterval.hours-interval', {hours: 5}, 'messageformat'),
- value: 5 * HOUR
- },
- {
- name: $translate.instant('timeinterval.hours-interval', {hours: 10}, 'messageformat'),
- value: 10 * HOUR
- },
- {
- name: $translate.instant('timeinterval.hours-interval', {hours: 12}, 'messageformat'),
- value: 12 * HOUR
- },
- {
- name: $translate.instant('timeinterval.days-interval', {days: 1}, 'messageformat'),
- value: 1 * DAY
- },
- {
- name: $translate.instant('timeinterval.days-interval', {days: 7}, 'messageformat'),
- value: 7 * DAY
- },
- {
- name: $translate.instant('timeinterval.days-interval', {days: 30}, 'messageformat'),
- value: 30 * DAY
- }
- ];
- }
- }
-
- function matchesExistingInterval(min, max, intervalMs) {
- var intervals = getIntervals(min, max);
- for (var i in intervals) {
- var interval = intervals[i];
- if (intervalMs === interval.value) {
- return true;
- }
- }
- return false;
- }
-
- function boundToPredefinedInterval(min, max, intervalMs) {
- var intervals = getIntervals(min, max);
- var minDelta = MAX_INTERVAL;
- var boundedInterval = intervalMs || min;
- var matchedInterval;
- for (var i in intervals) {
- var interval = intervals[i];
- var delta = Math.abs(interval.value - boundedInterval);
- if (delta < minDelta) {
- matchedInterval = interval;
- minDelta = delta;
- }
- }
- boundedInterval = matchedInterval.value;
- return boundedInterval;
- }
-
- function defaultTimewindow() {
- var currentTime = (new Date).getTime();
- var timewindow = {
- displayValue: "",
- selectedTab: 0,
- hideInterval: false,
- hideAggregation: false,
- hideAggInterval: false,
- realtime: {
- interval: SECOND,
- timewindowMs: MINUTE // 1 min by default
- },
- history: {
- historyType: 0,
- interval: SECOND,
- timewindowMs: MINUTE, // 1 min by default
- fixedTimewindow: {
- startTimeMs: currentTime - DAY, // 1 day by default
- endTimeMs: currentTime
- }
- },
- aggregation: {
- type: types.aggregation.avg.value,
- limit: Math.floor(maxDatapointsLimit / 2)
- }
- }
- return timewindow;
- }
-
- function toHistoryTimewindow(timewindow, startTimeMs, endTimeMs, interval) {
- if (timewindow.history) {
- interval = angular.isDefined(interval) ? interval : timewindow.history.interval;
- } else if (timewindow.realtime) {
- interval = timewindow.realtime.interval;
- } else {
- interval = 0;
- }
-
- var aggType;
- var limit;
- if (timewindow.aggregation) {
- aggType = timewindow.aggregation.type || types.aggregation.avg.value;
- limit = timewindow.aggregation.limit || maxDatapointsLimit;
- } else {
- aggType = types.aggregation.avg.value;
- limit = maxDatapointsLimit;
- }
-
-
- var historyTimewindow = {
- hideInterval: timewindow.hideInterval || false,
- hideAggregation: timewindow.hideAggregation || false,
- hideAggInterval: timewindow.hideAggInterval || false,
- history: {
- fixedTimewindow: {
- startTimeMs: startTimeMs,
- endTimeMs: endTimeMs
- },
- interval: boundIntervalToTimewindow(endTimeMs - startTimeMs, interval, types.aggregation.avg.value)
- },
- aggregation: {
- type: aggType,
- limit: limit
- }
- }
-
- return historyTimewindow;
- }
-
- function createSubscriptionTimewindow(timewindow, stDiff, stateData) {
-
- var subscriptionTimewindow = {
- fixedWindow: null,
- realtimeWindowMs: null,
- aggregation: {
- interval: SECOND,
- limit: maxDatapointsLimit,
- type: types.aggregation.avg.value
- }
- };
- var aggTimewindow = 0;
- if (stateData) {
- subscriptionTimewindow.aggregation = {
- interval: SECOND,
- limit: maxDatapointsLimit,
- type: types.aggregation.none.value,
- stateData: true
- };
- } else {
- subscriptionTimewindow.aggregation = {
- interval: SECOND,
- limit: maxDatapointsLimit,
- type: types.aggregation.avg.value
- };
- }
-
- if (angular.isDefined(timewindow.aggregation) && !stateData) {
- subscriptionTimewindow.aggregation = {
- type: timewindow.aggregation.type || types.aggregation.avg.value,
- limit: timewindow.aggregation.limit || maxDatapointsLimit
- };
- }
- if (angular.isDefined(timewindow.realtime)) {
- subscriptionTimewindow.realtimeWindowMs = timewindow.realtime.timewindowMs;
- subscriptionTimewindow.aggregation.interval =
- boundIntervalToTimewindow(subscriptionTimewindow.realtimeWindowMs, timewindow.realtime.interval,
- subscriptionTimewindow.aggregation.type);
- subscriptionTimewindow.startTs = (new Date).getTime() + stDiff - subscriptionTimewindow.realtimeWindowMs;
- var startDiff = subscriptionTimewindow.startTs % subscriptionTimewindow.aggregation.interval;
- aggTimewindow = subscriptionTimewindow.realtimeWindowMs;
- if (startDiff) {
- subscriptionTimewindow.startTs -= startDiff;
- aggTimewindow += subscriptionTimewindow.aggregation.interval;
- }
- } else if (angular.isDefined(timewindow.history)) {
- if (angular.isDefined(timewindow.history.timewindowMs)) {
- var currentTime = (new Date).getTime();
- subscriptionTimewindow.fixedWindow = {
- startTimeMs: currentTime - timewindow.history.timewindowMs,
- endTimeMs: currentTime
- }
- aggTimewindow = timewindow.history.timewindowMs;
-
- } else {
- subscriptionTimewindow.fixedWindow = {
- startTimeMs: timewindow.history.fixedTimewindow.startTimeMs,
- endTimeMs: timewindow.history.fixedTimewindow.endTimeMs
- }
- aggTimewindow = subscriptionTimewindow.fixedWindow.endTimeMs - subscriptionTimewindow.fixedWindow.startTimeMs;
- }
- subscriptionTimewindow.startTs = subscriptionTimewindow.fixedWindow.startTimeMs;
- subscriptionTimewindow.aggregation.interval =
- boundIntervalToTimewindow(aggTimewindow, timewindow.history.interval, subscriptionTimewindow.aggregation.type);
- }
- var aggregation = subscriptionTimewindow.aggregation;
- aggregation.timeWindow = aggTimewindow;
- if (aggregation.type !== types.aggregation.none.value) {
- aggregation.limit = Math.ceil(aggTimewindow / subscriptionTimewindow.aggregation.interval);
- }
- return subscriptionTimewindow;
- }
-
- function boundIntervalToTimewindow(timewindow, intervalMs, aggType) {
- if (aggType === types.aggregation.none.value) {
- return SECOND;
- } else {
- var min = minIntervalLimit(timewindow);
- var max = maxIntervalLimit(timewindow);
- if (intervalMs) {
- return toBound(intervalMs, min, max, intervalMs);
- } else {
- return boundToPredefinedInterval(min, max, avgInterval(timewindow));
- }
- }
- }
-
- function createTimewindowForComparison(subscriptionTimewindow, timeUnit) {
- var timewindowForComparison = {
- fixedWindow: null,
- realtimeWindowMs: null,
- aggregation: subscriptionTimewindow.aggregation
- };
-
- if (subscriptionTimewindow.realtimeWindowMs) {
- timewindowForComparison.startTs = moment(subscriptionTimewindow.startTs).subtract(1, timeUnit).valueOf(); //eslint-disable-line
- timewindowForComparison.realtimeWindowMs = subscriptionTimewindow.realtimeWindowMs;
- } else if (subscriptionTimewindow.fixedWindow) {
- var timeInterval = subscriptionTimewindow.fixedWindow.endTimeMs - subscriptionTimewindow.fixedWindow.startTimeMs;
- var endTimeMs = moment(subscriptionTimewindow.fixedWindow.endTimeMs).subtract(1, timeUnit).valueOf(); //eslint-disable-line
-
- timewindowForComparison.startTs = endTimeMs - timeInterval;
- timewindowForComparison.fixedWindow = {
- startTimeMs: timewindowForComparison.startTs,
- endTimeMs: endTimeMs
- };
- }
-
- return timewindowForComparison;
- }
-}
diff --git a/ui/src/app/api/user.service.js b/ui/src/app/api/user.service.js
deleted file mode 100644
index b84bcf8428..0000000000
--- a/ui/src/app/api/user.service.js
+++ /dev/null
@@ -1,688 +0,0 @@
-/*
- * Copyright © 2016-2020 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 thingsboardApiLogin from './login.service';
-import angularStorage from 'angular-storage';
-
-export default angular.module('thingsboard.api.user', [thingsboardApiLogin,
- angularStorage])
- .factory('userService', UserService)
- .name;
-
-/*@ngInject*/
-function UserService($http, $q, $rootScope, adminService, dashboardService, timeService, loginService, toast, store, jwtHelper, $translate, $state, $location, $mdDialog) {
- var currentUser = null,
- currentUserDetails = null,
- lastPublicDashboardId = null,
- allowedDashboardIds = [],
- redirectParams = null,
- userTokenAccessEnabled = false,
- userLoaded = false;
-
- var refreshTokenQueue = [];
-
- var service = {
- deleteUser: deleteUser,
- getAuthority: getAuthority,
- isPublic: isPublic,
- getPublicId: getPublicId,
- parsePublicId: parsePublicId,
- isAuthenticated: isAuthenticated,
- getCurrentUser: getCurrentUser,
- getCustomerUsers: getCustomerUsers,
- getUser: getUser,
- getTenantAdmins: getTenantAdmins,
- isUserLoaded: isUserLoaded,
- saveUser: saveUser,
- sendActivationEmail: sendActivationEmail,
- getActivationLink: getActivationLink,
- setUserFromJwtToken: setUserFromJwtToken,
- getJwtToken: getJwtToken,
- clearJwtToken: clearJwtToken,
- isJwtTokenValid : isJwtTokenValid,
- validateJwtToken: validateJwtToken,
- refreshJwtToken: refreshJwtToken,
- refreshTokenPending: refreshTokenPending,
- updateAuthorizationHeader: updateAuthorizationHeader,
- setAuthorizationRequestHeader: setAuthorizationRequestHeader,
- setRedirectParams: setRedirectParams,
- gotoDefaultPlace: gotoDefaultPlace,
- forceDefaultPlace: forceDefaultPlace,
- updateLastPublicDashboardId: updateLastPublicDashboardId,
- logout: logout,
- reloadUser: reloadUser,
- isUserTokenAccessEnabled: isUserTokenAccessEnabled,
- loginAsUser: loginAsUser,
- setUserCredentialsEnabled: setUserCredentialsEnabled
- }
-
- reloadUser();
-
- return service;
-
- function reloadUser() {
- userLoaded = false;
- loadUser(true).then(function success() {
- notifyUserLoaded();
- }, function fail() {
- notifyUserLoaded();
- });
- }
-
- function updateAndValidateToken(token, prefix, notify) {
- var valid = false;
- var tokenData = jwtHelper.decodeToken(token);
- var issuedAt = tokenData.iat;
- var expTime = tokenData.exp;
- if (issuedAt && expTime) {
- var ttl = expTime - issuedAt;
- if (ttl > 0) {
- var clientExpiration = new Date().valueOf() + ttl*1000;
- store.set(prefix, token);
- store.set(prefix + '_expiration', clientExpiration);
- valid = true;
- }
- }
- if (!valid && notify) {
- $rootScope.$broadcast('unauthenticated');
- }
- }
-
- function clearTokenData() {
- store.remove('jwt_token');
- store.remove('jwt_token_expiration');
- store.remove('refresh_token');
- store.remove('refresh_token_expiration');
- }
-
- function setUserFromJwtToken(jwtToken, refreshToken, notify, doLogout) {
- currentUser = null;
- currentUserDetails = null;
- lastPublicDashboardId = null;
- userTokenAccessEnabled = false;
- allowedDashboardIds = [];
- if (!jwtToken) {
- clearTokenData();
- if (notify) {
- $rootScope.$broadcast('unauthenticated', doLogout);
- }
- } else {
- updateAndValidateToken(jwtToken, 'jwt_token', true);
- updateAndValidateToken(refreshToken, 'refresh_token', true);
- if (notify) {
- loadUser(false).then(function success() {
- $rootScope.$broadcast('authenticated');
- }, function fail() {
- $rootScope.$broadcast('unauthenticated');
- });
- } else {
- loadUser(false);
- }
- }
- }
-
- function isAuthenticated() {
- return store.get('jwt_token');
- }
-
- function getJwtToken() {
- return store.get('jwt_token');
- }
-
- function logout() {
- $http.post('/api/auth/logout', null, {ignoreErrors: true}).then(function success() {
- clearJwtToken(true);
- }, function fail() {
- clearJwtToken(true);
- });
- }
-
- function clearJwtToken(doLogout) {
- setUserFromJwtToken(null, null, true, doLogout);
- }
-
- function isJwtTokenValid() {
- return isTokenValid('jwt_token');
- }
-
- function isTokenValid(prefix) {
- var clientExpiration = store.get(prefix + '_expiration');
- return clientExpiration && clientExpiration > new Date().valueOf();
- }
-
- function validateJwtToken(doRefresh) {
- var deferred = $q.defer();
- if (!isTokenValid('jwt_token')) {
- if (doRefresh) {
- refreshJwtToken().then(function success() {
- deferred.resolve();
- }, function fail() {
- deferred.reject();
- });
- } else {
- clearJwtToken(false);
- deferred.reject();
- }
- } else {
- deferred.resolve();
- }
- return deferred.promise;
- }
-
- function resolveRefreshTokenQueue(data) {
- for (var q=0; q < refreshTokenQueue.length;q++) {
- refreshTokenQueue[q].resolve(data);
- }
- refreshTokenQueue = [];
- }
-
- function rejectRefreshTokenQueue(message) {
- for (var q=0;q 0;
- }
-
- function refreshJwtToken() {
- var deferred = $q.defer();
- refreshTokenQueue.push(deferred);
- if (refreshTokenQueue.length === 1) {
- var refreshToken = store.get('refresh_token');
- var refreshTokenValid = isTokenValid('refresh_token');
- setUserFromJwtToken(null, null, false, false);
- if (!refreshTokenValid) {
- rejectRefreshTokenQueue($translate.instant('access.refresh-token-expired'));
- } else {
- var refreshTokenRequest = {
- refreshToken: refreshToken
- };
- $http.post('/api/auth/token', refreshTokenRequest).then(function success(response) {
- var token = response.data.token;
- var refreshToken = response.data.refreshToken;
- setUserFromJwtToken(token, refreshToken, false);
- resolveRefreshTokenQueue(response.data);
- }, function fail() {
- clearJwtToken(false);
- rejectRefreshTokenQueue($translate.instant('access.refresh-token-failed'));
- });
- }
- }
- return deferred.promise;
- }
-
- function getCurrentUser() {
- return currentUser;
- }
-
- function getAuthority() {
- if (currentUser) {
- return currentUser.authority;
- } else {
- return '';
- }
- }
-
- function isPublic() {
- if (currentUser) {
- return currentUser.isPublic;
- } else {
- return false;
- }
- }
-
- function getPublicId() {
- if (isPublic()) {
- return currentUser.sub;
- } else {
- return null;
- }
- }
-
- function parsePublicId() {
- var token = getJwtToken();
- if (token) {
- var tokenData = jwtHelper.decodeToken(token);
- if (tokenData && tokenData.isPublic) {
- return tokenData.sub;
- }
- }
- return null;
- }
-
- function isUserLoaded() {
- return userLoaded;
- }
-
- function loadUser(doTokenRefresh) {
-
- var deferred = $q.defer();
-
- function fetchAllowedDashboardIds() {
- var pageLink = {limit: 100};
- var fetchDashboardsPromise;
- if (currentUser.authority === 'TENANT_ADMIN') {
- fetchDashboardsPromise = dashboardService.getTenantDashboards(pageLink);
- } else {
- fetchDashboardsPromise = dashboardService.getCustomerDashboards(currentUser.customerId, pageLink);
- }
- fetchDashboardsPromise.then(
- function success(result) {
- var dashboards = result.data;
- for (var d=0;d 0) {
- currentUser.authority = currentUser.scopes[0];
- } else if (currentUser) {
- currentUser.authority = "ANONYMOUS";
- }
- var sysParamsPromise = loadSystemParams();
- if (currentUser.isPublic) {
- $rootScope.forceFullscreen = true;
- sysParamsPromise.then(
- () => { fetchAllowedDashboardIds(); },
- () => { deferred.reject(); }
- );
- } else if (currentUser.userId) {
- getUser(currentUser.userId, true).then(
- function success(user) {
- sysParamsPromise.then(
- () => {
- currentUserDetails = user;
- updateUserLang();
- $rootScope.forceFullscreen = false;
- if (userForceFullscreen()) {
- $rootScope.forceFullscreen = true;
- }
- if ($rootScope.forceFullscreen && (currentUser.authority === 'TENANT_ADMIN' ||
- currentUser.authority === 'CUSTOMER_USER')) {
- fetchAllowedDashboardIds();
- } else {
- deferred.resolve();
- }
- },
- () => {
- deferred.reject();
- logout();
- }
- );
- },
- function fail() {
- deferred.reject();
- logout();
- }
- )
- } else {
- deferred.reject();
- }
- }, function fail() {
- deferred.reject();
- });
- }
-
- if (!currentUser) {
- var locationSearch = $location.search();
- if (locationSearch.publicId) {
- loginService.publicLogin(locationSearch.publicId).then(function success(response) {
- var token = response.data.token;
- var refreshToken = response.data.refreshToken;
- updateAndValidateToken(token, 'jwt_token', false);
- updateAndValidateToken(refreshToken, 'refresh_token', false);
- procceedJwtTokenValidate();
- }, function fail() {
- $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 if (locationSearch.username && locationSearch.password) {
- var user = {};
- user.name = locationSearch.username;
- user.password = locationSearch.password;
- $location.search('username', null);
- $location.search('password', null);
-
- loginService.login(user).then(function success(response) {
- var token = response.data.token;
- var refreshToken = response.data.refreshToken;
- try {
- updateAndValidateToken(token, 'jwt_token', false);
- updateAndValidateToken(refreshToken, 'refresh_token', false);
- } catch (e) {
- deferred.reject();
- }
- procceedJwtTokenValidate();
- }, function fail() {
- deferred.reject();
- });
- } else if (locationSearch.loginError) {
- showLoginErrorDialog(locationSearch.loginError);
- $location.search('loginError', null);
- deferred.reject();
- } else {
- procceedJwtTokenValidate();
- }
- } else {
- deferred.resolve();
- }
- return deferred.promise;
- }
-
- function showLoginErrorDialog(loginError) {
- $translate(['login.error',
- 'action.close']).then(function (translations) {
- var alert = $mdDialog.alert()
- .title(translations['login.error'])
- .htmlContent(loginError)
- .ok(translations['action.close']);
- $mdDialog.show(alert);
- });
- }
-
- function loadIsUserTokenAccessEnabled() {
- var deferred = $q.defer();
- if (currentUser.authority === 'SYS_ADMIN' || currentUser.authority === 'TENANT_ADMIN') {
- var url = '/api/user/tokenAccessEnabled';
- $http.get(url).then(function success(response) {
- userTokenAccessEnabled = response.data;
- deferred.resolve(response.data);
- }, function fail() {
- userTokenAccessEnabled = false;
- deferred.reject();
- });
- } else {
- userTokenAccessEnabled = false;
- deferred.resolve(false);
- }
- return deferred.promise;
- }
-
- function loadSystemParams() {
- var promises = [];
- promises.push(loadIsUserTokenAccessEnabled());
- promises.push(timeService.loadMaxDatapointsLimit());
- return $q.all(promises);
- }
-
- function notifyUserLoaded() {
- if (!userLoaded) {
- userLoaded = true;
- $rootScope.$broadcast('userLoaded');
- }
- }
-
- function updateAuthorizationHeader(headers) {
- var jwtToken = store.get('jwt_token');
- if (jwtToken) {
- headers['X-Authorization'] = 'Bearer ' + jwtToken;
- }
- return jwtToken;
- }
-
- function setAuthorizationRequestHeader(request) {
- var jwtToken = store.get('jwt_token');
- if (jwtToken) {
- request.setRequestHeader('X-Authorization', 'Bearer ' + jwtToken);
- }
- return jwtToken;
- }
-
- function getTenantAdmins(tenantId, pageLink) {
- var deferred = $q.defer();
- var url = '/api/tenant/' + tenantId + '/users?limit=' + pageLink.limit;
- if (angular.isDefined(pageLink.textSearch)) {
- url += '&textSearch=' + pageLink.textSearch;
- }
- if (angular.isDefined(pageLink.idOffset)) {
- url += '&idOffset=' + pageLink.idOffset;
- }
- if (angular.isDefined(pageLink.textOffset)) {
- url += '&textOffset=' + pageLink.textOffset;
- }
- $http.get(url, null).then(function success(response) {
- deferred.resolve(response.data);
- }, function fail() {
- deferred.reject();
- });
- return deferred.promise;
- }
-
- function getCustomerUsers(customerId, pageLink) {
- var deferred = $q.defer();
- var url = '/api/customer/' + customerId + '/users?limit=' + pageLink.limit;
- if (angular.isDefined(pageLink.textSearch)) {
- url += '&textSearch=' + pageLink.textSearch;
- }
- if (angular.isDefined(pageLink.idOffset)) {
- url += '&idOffset=' + pageLink.idOffset;
- }
- if (angular.isDefined(pageLink.textOffset)) {
- url += '&textOffset=' + pageLink.textOffset;
- }
- $http.get(url, null).then(function success(response) {
- deferred.resolve(response.data);
- }, function fail() {
- deferred.reject();
- });
- return deferred.promise;
- }
-
- function saveUser(user, sendActivationMail) {
- var deferred = $q.defer();
- var url = '/api/user';
- if (angular.isDefined(sendActivationMail)) {
- url += '?sendActivationMail=' + sendActivationMail;
- }
- $http.post(url, user).then(function success(response) {
- deferred.resolve(response.data);
- }, function fail() {
- deferred.reject();
- });
- return deferred.promise;
- }
-
- function setUserCredentialsEnabled(userId, userCredentialsEnabled) {
- var deferred = $q.defer();
- var url = '/api/user/' + userId + '/userCredentialsEnabled';
- if (angular.isDefined(userCredentialsEnabled)) {
- url += '?userCredentialsEnabled=' + userCredentialsEnabled;
- }
- $http.post(url, null).then(function success() {
- deferred.resolve();
- }, function fail() {
- deferred.reject();
- });
- return deferred.promise;
- }
-
- function getUser(userId, ignoreErrors, config) {
- var deferred = $q.defer();
- var url = '/api/user/' + userId;
- if (!config) {
- config = {};
- }
- config = Object.assign(config, { ignoreErrors: ignoreErrors });
- $http.get(url, config).then(function success(response) {
- deferred.resolve(response.data);
- }, function fail() {
- deferred.reject();
- });
- return deferred.promise;
- }
-
- function deleteUser(userId) {
- var deferred = $q.defer();
- var url = '/api/user/' + userId;
- $http.delete(url).then(function success() {
- deferred.resolve();
- }, function fail() {
- deferred.reject();
- });
- return deferred.promise;
- }
-
- function sendActivationEmail(email) {
- var deferred = $q.defer();
- var url = '/api/user/sendActivationMail?email=' + email;
- $http.post(url, null).then(function success(response) {
- deferred.resolve(response);
- }, function fail() {
- deferred.reject();
- });
- return deferred.promise;
- }
-
- function getActivationLink(userId) {
- var deferred = $q.defer();
- var url = `/api/user/${userId}/activationLink`
- $http.get(url).then(function success(response) {
- deferred.resolve(response.data);
- }, function fail() {
- deferred.reject();
- });
- return deferred.promise;
- }
-
- function forceDefaultPlace(to, params) {
- if (currentUser && isAuthenticated()) {
- if (currentUser.authority === 'TENANT_ADMIN' || currentUser.authority === 'CUSTOMER_USER') {
- if ((userHasDefaultDashboard() && $rootScope.forceFullscreen) || isPublic()) {
- if (to.name === 'home.profile') {
- if (userHasProfile()) {
- return false;
- } else {
- return true;
- }
- } else if ((to.name === 'home.dashboards.dashboard' || to.name === 'dashboard')
- && allowedDashboardIds.indexOf(params.dashboardId) > -1) {
- return false;
- } else {
- return true;
- }
- }
- }
- }
- return false;
- }
-
- function setRedirectParams(params) {
- redirectParams = params;
- }
-
- function gotoDefaultPlace(params) {
- if (currentUser && isAuthenticated()) {
- var place = redirectParams ? redirectParams.toName : 'home.links';
- params = redirectParams ? redirectParams.params : params;
- redirectParams = null;
- if (currentUser.authority === 'TENANT_ADMIN' || currentUser.authority === 'CUSTOMER_USER') {
- if (userHasDefaultDashboard()) {
- place = $rootScope.forceFullscreen ? 'dashboard' : 'home.dashboards.dashboard';
- params = {dashboardId: currentUserDetails.additionalInfo.defaultDashboardId};
- } else if (isPublic()) {
- place = 'dashboard';
- params = {dashboardId: lastPublicDashboardId};
- }
- } else if (currentUser.authority === 'SYS_ADMIN') {
- adminService.checkUpdates().then(
- function (updateMessage) {
- if (updateMessage && updateMessage.updateAvailable) {
- toast.showInfo(updateMessage.message, 0, null, 'bottom right');
- }
- }
- );
- }
- $state.go(place, params, {reload: true});
- } else {
- $state.go('login', params);
- }
- }
-
- function userHasDefaultDashboard() {
- return currentUserDetails &&
- currentUserDetails.additionalInfo &&
- currentUserDetails.additionalInfo.defaultDashboardId;
- }
-
- function userForceFullscreen() {
- return (currentUser && currentUser.isPublic) ||
- (currentUserDetails.additionalInfo &&
- currentUserDetails.additionalInfo.defaultDashboardFullscreen &&
- currentUserDetails.additionalInfo.defaultDashboardFullscreen === true);
- }
-
- function userHasProfile() {
- return currentUser && !currentUser.isPublic;
- }
-
- function updateLastPublicDashboardId(dashboardId) {
- if (isPublic()) {
- lastPublicDashboardId = dashboardId;
- }
- }
-
- function isUserTokenAccessEnabled() {
- return userTokenAccessEnabled;
- }
-
- function loginAsUser(userId) {
- var url = '/api/user/' + userId + '/token';
- $http.get(url).then(function success(response) {
- var token = response.data.token;
- var refreshToken = response.data.refreshToken;
- setUserFromJwtToken(token, refreshToken, true);
- }, function fail() {
- });
- }
-
-}
diff --git a/ui/src/app/api/widget.service.js b/ui/src/app/api/widget.service.js
deleted file mode 100644
index 4b706e827d..0000000000
--- a/ui/src/app/api/widget.service.js
+++ /dev/null
@@ -1,832 +0,0 @@
-/*
- * Copyright © 2016-2020 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 $ from 'jquery';
-import moment from 'moment';
-import tinycolor from 'tinycolor2';
-
-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 thingsboardMultipleInputWidget from '../widget/lib/multiple-input-widget';
-import thingsboardWebCameraInputWidget from '../widget/lib/web-camera-input-widget';
-
-import thingsboardRpcWidgets from '../widget/lib/rpc';
-
-import thingsboardJsonToString from '../components/tb-json-to-string.directive';
-
-import TbFlot from '../widget/lib/flot-widget';
-import TbAnalogueLinearGauge from '../widget/lib/analogue-linear-gauge';
-import TbAnalogueRadialGauge from '../widget/lib/analogue-radial-gauge';
-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';
-
-import 'oclazyload';
-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,
- thingsboardEntitiesHierarchyWidget, thingsboardExtensionsTableWidget, thingsboardDateRangeNavigatorWidget,
- thingsboardMultipleInputWidget, thingsboardWebCameraInputWidget, thingsboardRpcWidgets, thingsboardTypes,
- thingsboardUtils, thingsboardJsonToString, TripAnimationWidget])
- .factory('widgetService', WidgetService)
- .name;
-
-/*@ngInject*/
-function WidgetService($rootScope, $http, $q, $filter, $ocLazyLoad, $window, $translate, types, utils) {
-
- $window.$ = $;
- $window.jQuery = $;
- $window.moment = moment;
- $window.tinycolor = tinycolor;
- $window.lazyLoad = $ocLazyLoad;
-
- $window.TbFlot = TbFlot;
- $window.TbAnalogueLinearGauge = TbAnalogueLinearGauge;
- $window.TbAnalogueRadialGauge = TbAnalogueRadialGauge;
- $window.TbAnalogueCompass = TbAnalogueCompass;
- $window.TbCanvasDigitalGauge = TbCanvasDigitalGauge;
- $window.TbMapWidget = TbMapWidget;
- $window.TbMapWidgetV2 = TbMapWidgetV2;
-
- $window.cssjs = cssjs;
-
- var cssParser = new cssjs();
- cssParser.testMode = false;
-
- var missingWidgetType;
- var errorWidgetType;
-
- var editingWidgetType;
-
- var widgetsInfoInMemoryCache = {};
- var widgetsTypeFunctionsInMemoryCache = {};
- var widgetsInfoFetchQueue = {};
-
- var allWidgetsBundles = undefined;
- var systemWidgetsBundles = undefined;
- var tenantWidgetsBundles = undefined;
-
- $rootScope.widgetServiceStateChangeStartHandle = $rootScope.$on('$stateChangeStart', function () {
- invalidateWidgetsBundleCache();
- });
-
- initEditingWidgetType();
- initWidgetPlaceholders();
-
- var service = {
- getWidgetTemplate: getWidgetTemplate,
- getSystemWidgetsBundles: getSystemWidgetsBundles,
- getTenantWidgetsBundles: getTenantWidgetsBundles,
- getAllWidgetsBundles: getAllWidgetsBundles,
- getSystemWidgetsBundlesByPageLink: getSystemWidgetsBundlesByPageLink,
- getTenantWidgetsBundlesByPageLink: getTenantWidgetsBundlesByPageLink,
- getAllWidgetsBundlesByPageLink: getAllWidgetsBundlesByPageLink,
- getWidgetsBundleByAlias: getWidgetsBundleByAlias,
- saveWidgetsBundle: saveWidgetsBundle,
- getWidgetsBundle: getWidgetsBundle,
- deleteWidgetsBundle: deleteWidgetsBundle,
- getBundleWidgetTypes: getBundleWidgetTypes,
- getWidgetInfo: getWidgetInfo,
- getWidgetTypeFunction: getWidgetTypeFunction,
- getInstantWidgetInfo: getInstantWidgetInfo,
- deleteWidgetType: deleteWidgetType,
- saveWidgetType: saveWidgetType,
- saveImportedWidgetType: saveImportedWidgetType,
- getWidgetType: getWidgetType,
- getWidgetTypeById: getWidgetTypeById,
- toWidgetInfo: toWidgetInfo
- }
-
- return service;
-
- function initEditingWidgetType() {
- if ($rootScope.widgetEditMode) {
- editingWidgetType =
- toWidgetType({
- widgetName: $rootScope.editWidgetInfo.widgetName,
- alias: 'customWidget',
- type: $rootScope.editWidgetInfo.type,
- sizeX: $rootScope.editWidgetInfo.sizeX,
- sizeY: $rootScope.editWidgetInfo.sizeY,
- resources: $rootScope.editWidgetInfo.resources,
- templateHtml: $rootScope.editWidgetInfo.templateHtml,
- templateCss: $rootScope.editWidgetInfo.templateCss,
- controllerScript: $rootScope.editWidgetInfo.controllerScript,
- settingsSchema: $rootScope.editWidgetInfo.settingsSchema,
- dataKeySettingsSchema: $rootScope.editWidgetInfo.dataKeySettingsSchema,
- defaultConfig: $rootScope.editWidgetInfo.defaultConfig
- }, {id: '1'}, { id: types.id.nullUid }, 'customWidgetBundle');
- }
- }
-
- function initWidgetPlaceholders() {
-
- missingWidgetType = {
- widgetName: 'Widget type not found',
- alias: 'undefined',
- sizeX: 8,
- sizeY: 6,
- resources: [],
- templateHtml: '',
- templateCss: '',
- controllerScript: 'self.onInit = function() {}',
- settingsSchema: '{}\n',
- dataKeySettingsSchema: '{}\n',
- defaultConfig: '{\n' +
- '"title": "Widget type not found",\n' +
- '"datasources": [],\n' +
- '"settings": {}\n' +
- '}\n'
- };
-
- errorWidgetType = {
- widgetName: 'Error loading widget',
- alias: 'error',
- sizeX: 8,
- sizeY: 6,
- resources: [],
- templateHtml: 'widget.widget-type-load-error
',
- templateCss: '',
- controllerScript: 'self.onInit = function() {}',
- settingsSchema: '{}\n',
- dataKeySettingsSchema: '{}\n',
- defaultConfig: '{\n' +
- '"title": "Widget failed to load",\n' +
- '"datasources": [],\n' +
- '"settings": {}\n' +
- '}\n'
- };
- }
-
- function toWidgetInfo(widgetType) {
-
- var widgetInfo = {
- widgetName: widgetType.name,
- alias: widgetType.alias
- }
-
- var descriptor = widgetType.descriptor;
-
- widgetInfo.type = descriptor.type;
- widgetInfo.sizeX = descriptor.sizeX;
- widgetInfo.sizeY = descriptor.sizeY;
- widgetInfo.resources = descriptor.resources;
- widgetInfo.templateHtml = descriptor.templateHtml;
- widgetInfo.templateCss = descriptor.templateCss;
- widgetInfo.controllerScript = descriptor.controllerScript;
- widgetInfo.settingsSchema = descriptor.settingsSchema;
- widgetInfo.dataKeySettingsSchema = descriptor.dataKeySettingsSchema;
- widgetInfo.defaultConfig = descriptor.defaultConfig;
-
- return widgetInfo;
- }
-
- function toWidgetType(widgetInfo, id, tenantId, bundleAlias) {
- var widgetType = {
- id: id,
- tenantId: tenantId,
- bundleAlias: bundleAlias,
- alias: widgetInfo.alias,
- name: widgetInfo.widgetName
- }
-
- var descriptor = {
- type: widgetInfo.type,
- sizeX: widgetInfo.sizeX,
- sizeY: widgetInfo.sizeY,
- resources: widgetInfo.resources,
- templateHtml: widgetInfo.templateHtml,
- templateCss: widgetInfo.templateCss,
- controllerScript: widgetInfo.controllerScript,
- settingsSchema: widgetInfo.settingsSchema,
- dataKeySettingsSchema: widgetInfo.dataKeySettingsSchema,
- defaultConfig: widgetInfo.defaultConfig
- }
-
- widgetType.descriptor = descriptor;
-
- return widgetType;
- }
-
- function getWidgetTemplate(type) {
- var deferred = $q.defer();
- var templateWidgetType = types.widgetType.timeseries;
- for (var t in types.widgetType) {
- var widgetType = types.widgetType[t];
- if (widgetType.value === type) {
- templateWidgetType = widgetType;
- break;
- }
- }
- getWidgetType(templateWidgetType.template.bundleAlias,
- templateWidgetType.template.alias, true).then(
- function success(widgetType) {
- var widgetInfo = toWidgetInfo(widgetType);
- widgetInfo.alias = undefined;
- deferred.resolve(widgetInfo);
- },
- function fail() {
- deferred.reject();
- }
- );
- return deferred.promise;
- }
-
- /** Cache functions **/
-
- function createWidgetInfoCacheKey(bundleAlias, widgetTypeAlias, isSystem) {
- return (isSystem ? 'sys_' : '') + bundleAlias + '_' + widgetTypeAlias;
- }
-
- function getWidgetInfoFromCache(bundleAlias, widgetTypeAlias, isSystem) {
- var key = createWidgetInfoCacheKey(bundleAlias, widgetTypeAlias, isSystem);
- return widgetsInfoInMemoryCache[key];
- }
-
- function getWidgetTypeFunctionFromCache(bundleAlias, widgetTypeAlias, isSystem) {
- var key = createWidgetInfoCacheKey(bundleAlias, widgetTypeAlias, isSystem);
- return widgetsTypeFunctionsInMemoryCache[key];
- }
-
- function putWidgetInfoToCache(widgetInfo, bundleAlias, widgetTypeAlias, isSystem) {
- var key = createWidgetInfoCacheKey(bundleAlias, widgetTypeAlias, isSystem);
- widgetsInfoInMemoryCache[key] = widgetInfo;
- }
-
- function putWidgetTypeFunctionToCache(widgetTypeFunction, bundleAlias, widgetTypeAlias, isSystem) {
- var key = createWidgetInfoCacheKey(bundleAlias, widgetTypeAlias, isSystem);
- widgetsTypeFunctionsInMemoryCache[key] = widgetTypeFunction;
- }
-
- function deleteWidgetInfoFromCache(bundleAlias, widgetTypeAlias, isSystem) {
- var key = createWidgetInfoCacheKey(bundleAlias, widgetTypeAlias, isSystem);
- delete widgetsInfoInMemoryCache[key];
- delete widgetsTypeFunctionsInMemoryCache[key];
- }
-
- function deleteWidgetsBundleFromCache(bundleAlias, isSystem) {
- var key = (isSystem ? 'sys_' : '') + bundleAlias;
- for (var cacheKey in widgetsInfoInMemoryCache) {
- if (cacheKey.startsWith(key)) {
- delete widgetsInfoInMemoryCache[cacheKey];
- delete widgetsTypeFunctionsInMemoryCache[cacheKey];
- }
- }
- }
-
- /** Bundle functions **/
-
- function invalidateWidgetsBundleCache() {
- allWidgetsBundles = undefined;
- systemWidgetsBundles = undefined;
- tenantWidgetsBundles = undefined;
- }
-
- function loadWidgetsBundleCache(config) {
- var deferred = $q.defer();
- if (!allWidgetsBundles) {
- var url = '/api/widgetsBundles';
- $http.get(url, config).then(function success(response) {
- allWidgetsBundles = response.data;
- systemWidgetsBundles = [];
- tenantWidgetsBundles = [];
- allWidgetsBundles = $filter('orderBy')(allWidgetsBundles, ['+title', '-createdTime']);
- for (var i = 0; i < allWidgetsBundles.length; i++) {
- var widgetsBundle = allWidgetsBundles[i];
- if (widgetsBundle.tenantId.id === types.id.nullUid) {
- systemWidgetsBundles.push(widgetsBundle);
- } else {
- tenantWidgetsBundles.push(widgetsBundle);
- }
- }
- deferred.resolve();
- }, function fail() {
- deferred.reject();
- });
- } else {
- deferred.resolve();
- }
- return deferred.promise;
- }
-
-
- function getSystemWidgetsBundles(config) {
- var deferred = $q.defer();
- loadWidgetsBundleCache(config).then(
- function success() {
- deferred.resolve(systemWidgetsBundles);
- },
- function fail() {
- deferred.reject();
- }
- );
- return deferred.promise;
- }
-
- function getTenantWidgetsBundles(config) {
- var deferred = $q.defer();
- loadWidgetsBundleCache(config).then(
- function success() {
- deferred.resolve(tenantWidgetsBundles);
- },
- function fail() {
- deferred.reject();
- }
- );
- return deferred.promise;
- }
-
- function getAllWidgetsBundles(config) {
- var deferred = $q.defer();
- loadWidgetsBundleCache(config).then(
- function success() {
- deferred.resolve(allWidgetsBundles);
- },
- function fail() {
- deferred.reject();
- }
- );
- return deferred.promise;
- }
-
- function getSystemWidgetsBundlesByPageLink(pageLink) {
- var deferred = $q.defer();
- loadWidgetsBundleCache().then(
- function success() {
- utils.filterSearchTextEntities(systemWidgetsBundles, 'title', pageLink, deferred);
- },
- function fail() {
- deferred.reject();
- }
- );
- return deferred.promise;
- }
-
- function getTenantWidgetsBundlesByPageLink(pageLink) {
- var deferred = $q.defer();
- loadWidgetsBundleCache().then(
- function success() {
- utils.filterSearchTextEntities(tenantWidgetsBundles, 'title', pageLink, deferred);
- },
- function fail() {
- deferred.reject();
- }
- );
- return deferred.promise;
- }
-
- function getAllWidgetsBundlesByPageLink(pageLink) {
- var deferred = $q.defer();
- loadWidgetsBundleCache().then(
- function success() {
- utils.filterSearchTextEntities(allWidgetsBundles, 'title', pageLink, deferred);
- },
- function fail() {
- deferred.reject();
- }
- );
- return deferred.promise;
- }
-
- function getWidgetsBundleByAlias(bundleAlias) {
- var deferred = $q.defer();
- loadWidgetsBundleCache().then(
- function success() {
- var widgetsBundles = $filter('filter')(allWidgetsBundles, {alias: bundleAlias});
- if (widgetsBundles.length > 0) {
- deferred.resolve(widgetsBundles[0]);
- } else {
- deferred.resolve();
- }
- },
- function fail() {
- deferred.reject();
- }
- );
- return deferred.promise;
- }
-
- function saveWidgetsBundle(widgetsBundle) {
- var deferred = $q.defer();
- var url = '/api/widgetsBundle';
- $http.post(url, widgetsBundle).then(function success(response) {
- invalidateWidgetsBundleCache();
- deferred.resolve(response.data);
- }, function fail(response) {
- deferred.reject(response.data);
- });
- return deferred.promise;
- }
-
- function getWidgetsBundle(widgetsBundleId) {
- var deferred = $q.defer();
-
- var url = '/api/widgetsBundle/' + widgetsBundleId;
- $http.get(url, null).then(function success(response) {
- deferred.resolve(response.data);
- }, function fail(response) {
- deferred.reject(response.data);
- });
-
- return deferred.promise;
- }
-
- function deleteWidgetsBundle(widgetsBundleId) {
- var deferred = $q.defer();
-
- getWidgetsBundle(widgetsBundleId).then(
- function success(response) {
- var widgetsBundle = response;
- var url = '/api/widgetsBundle/' + widgetsBundleId;
- $http.delete(url).then(function success() {
- invalidateWidgetsBundleCache();
- deleteWidgetsBundleFromCache(widgetsBundle.alias,
- widgetsBundle.tenantId.id === types.id.nullUid);
- deferred.resolve();
- }, function fail(response) {
- deferred.reject(response.data);
- });
- },
- function fail() {
- deferred.reject();
- }
- );
-
- return deferred.promise;
- }
-
- function getBundleWidgetTypes(bundleAlias, isSystem) {
- var deferred = $q.defer();
- var url = '/api/widgetTypes?isSystem=' + (isSystem ? 'true' : 'false') +
- '&bundleAlias='+bundleAlias;
- $http.get(url, null).then(function success(response) {
- deferred.resolve(response.data);
- }, function fail(response) {
- deferred.reject(response.data);
- });
- return deferred.promise;
- }
-
- /** Widget type functions **/
-
- function getInstantWidgetInfo(widget) {
- var widgetInfo = getWidgetInfoFromCache(widget.bundleAlias, widget.typeAlias, widget.isSystemType);
- if (widgetInfo) {
- return widgetInfo;
- } else {
- return {};
- }
- }
-
- function resolveWidgetsInfoFetchQueue(key, widgetInfo) {
- var fetchQueue = widgetsInfoFetchQueue[key];
- if (fetchQueue) {
- for (var q in fetchQueue) {
- if (isNaN(q))
- continue;
- fetchQueue[q].resolve(widgetInfo);
- }
- delete widgetsInfoFetchQueue[key];
- }
- }
-
- function getWidgetInfo(bundleAlias, widgetTypeAlias, isSystem) {
- var deferred = $q.defer();
- var widgetInfo = getWidgetInfoFromCache(bundleAlias, widgetTypeAlias, isSystem);
- if (widgetInfo) {
- deferred.resolve(widgetInfo);
- } else {
- if ($rootScope.widgetEditMode) {
- loadWidget(editingWidgetType, bundleAlias, isSystem, deferred);
- } else {
- var key = createWidgetInfoCacheKey(bundleAlias, widgetTypeAlias, isSystem);
- var fetchQueue = widgetsInfoFetchQueue[key];
- if (fetchQueue) {
- fetchQueue.push(deferred);
- } else {
- fetchQueue = [];
- widgetsInfoFetchQueue[key] = fetchQueue;
- getWidgetType(bundleAlias, widgetTypeAlias, isSystem).then(
- function success(widgetType) {
- loadWidget(widgetType, bundleAlias, isSystem, deferred);
- }, function fail() {
- deferred.resolve(missingWidgetType);
- resolveWidgetsInfoFetchQueue(key, missingWidgetType);
- }
- );
- }
- }
- }
- return deferred.promise;
- }
-
- function getWidgetTypeFunction(bundleAlias, widgetTypeAlias, isSystem) {
- var widgetType = getWidgetTypeFunctionFromCache(bundleAlias, widgetTypeAlias, isSystem);
- return widgetType;
- }
-
- function createWidgetTypeFunction(widgetInfo, name) {
- var widgetTypeFunctionBody = 'return function '+ name +' (ctx) {\n' +
- ' var self = this;\n' +
- ' self.ctx = ctx;\n\n'; /*+
-
- ' self.onInit = function() {\n\n' +
-
- ' }\n\n' +
-
- ' self.onDataUpdated = function() {\n\n' +
-
- ' }\n\n' +
-
- ' self.useCustomDatasources = function() {\n\n' +
-
- ' }\n\n' +
-
- ' self.typeParameters = function() {\n\n' +
- return {
- useCustomDatasources: false,
- maxDatasources: -1, //unlimited
- maxDataKeys: -1, //unlimited
- dataKeysOptional: false,
- stateData: false
- };
- ' }\n\n' +
-
- ' self.actionSources = function() {\n\n' +
- return {
- 'headerButton': {
- name: 'Header button',
- multiple: true
- }
- };
- }\n\n' +
- ' self.onResize = function() {\n\n' +
-
- ' }\n\n' +
-
- ' self.onEditModeChanged = function() {\n\n' +
-
- ' }\n\n' +
-
- ' self.onMobileModeChanged = function() {\n\n' +
-
- ' }\n\n' +
-
- ' self.getSettingsSchema = function() {\n\n' +
-
- ' }\n\n' +
-
- ' self.getDataKeySettingsSchema = function() {\n\n' +
-
- ' }\n\n' +
-
- ' self.onDestroy = function() {\n\n' +
-
- ' }\n\n' +
- '}';*/
-
- widgetTypeFunctionBody += widgetInfo.controllerScript;
- widgetTypeFunctionBody += '\n};\n';
- try {
- var widgetTypeFunction = new Function(widgetTypeFunctionBody);
- var widgetType = widgetTypeFunction.apply(this);
- var widgetTypeInstance = new widgetType();
- var result = {
- widgetTypeFunction: widgetType
- };
- if (angular.isFunction(widgetTypeInstance.getSettingsSchema)) {
- result.settingsSchema = widgetTypeInstance.getSettingsSchema();
- }
- if (angular.isFunction(widgetTypeInstance.getDataKeySettingsSchema)) {
- result.dataKeySettingsSchema = widgetTypeInstance.getDataKeySettingsSchema();
- }
- if (angular.isFunction(widgetTypeInstance.typeParameters)) {
- result.typeParameters = widgetTypeInstance.typeParameters();
- } else {
- result.typeParameters = {};
- }
- if (angular.isFunction(widgetTypeInstance.useCustomDatasources)) {
- result.typeParameters.useCustomDatasources = widgetTypeInstance.useCustomDatasources();
- } else {
- result.typeParameters.useCustomDatasources = false;
- }
- if (angular.isUndefined(result.typeParameters.maxDatasources)) {
- result.typeParameters.maxDatasources = -1;
- }
- if (angular.isUndefined(result.typeParameters.maxDataKeys)) {
- result.typeParameters.maxDataKeys = -1;
- }
- if (angular.isUndefined(result.typeParameters.dataKeysOptional)) {
- result.typeParameters.dataKeysOptional = false;
- }
- if (angular.isUndefined(result.typeParameters.stateData)) {
- result.typeParameters.stateData = false;
- }
- if (angular.isFunction(widgetTypeInstance.actionSources)) {
- result.actionSources = widgetTypeInstance.actionSources();
- } else {
- result.actionSources = {};
- }
- for (var actionSourceId in types.widgetActionSources) {
- result.actionSources[actionSourceId] = angular.copy(types.widgetActionSources[actionSourceId]);
- result.actionSources[actionSourceId].name = $translate.instant(result.actionSources[actionSourceId].name) + '';
- }
-
- return result;
- } catch (e) {
- utils.processWidgetException(e);
- throw e;
- }
- }
-
- function processWidgetLoadError(errorMessages, cacheKey, deferred) {
- var widgetInfo = angular.copy(errorWidgetType);
- for (var e in errorMessages) {
- var error = errorMessages[e];
- widgetInfo.templateHtml += '
' + error + '
';
- }
- widgetInfo.templateHtml += '
';
- deferred.resolve(widgetInfo);
- resolveWidgetsInfoFetchQueue(cacheKey, widgetInfo);
- }
-
- function loadWidget(widgetType, bundleAlias, isSystem, deferred) {
- var widgetInfo = toWidgetInfo(widgetType);
- var key = createWidgetInfoCacheKey(bundleAlias, widgetInfo.alias, isSystem);
- loadWidgetResources(widgetInfo, bundleAlias, isSystem).then(
- function success() {
- var widgetType = null;
- try {
- widgetType = createWidgetTypeFunction(widgetInfo, key);
- } catch (e) {
- var details = utils.parseException(e);
- var errorMessage = 'Failed to compile widget script. \n Error: ' + details.message;
- processWidgetLoadError([errorMessage], key, deferred);
- }
- if (widgetType) {
- if (widgetType.settingsSchema) {
- widgetInfo.typeSettingsSchema = widgetType.settingsSchema;
- }
- if (widgetType.dataKeySettingsSchema) {
- widgetInfo.typeDataKeySettingsSchema = widgetType.dataKeySettingsSchema;
- }
- widgetInfo.typeParameters = widgetType.typeParameters;
- widgetInfo.actionSources = widgetType.actionSources;
- putWidgetInfoToCache(widgetInfo, bundleAlias, widgetInfo.alias, isSystem);
- putWidgetTypeFunctionToCache(widgetType.widgetTypeFunction, bundleAlias, widgetInfo.alias, isSystem);
- deferred.resolve(widgetInfo);
- resolveWidgetsInfoFetchQueue(key, widgetInfo);
- }
- }, function fail(errorMessages) {
- processWidgetLoadError(errorMessages, key, deferred);
- }
- );
- }
-
- function getWidgetType(bundleAlias, widgetTypeAlias, isSystem) {
- var deferred = $q.defer();
- var url = '/api/widgetType?isSystem=' + (isSystem ? 'true' : 'false') +
- '&bundleAlias='+bundleAlias+'&alias='+widgetTypeAlias;
- $http.get(url, null).then(function success(response) {
- var widgetType = response.data;
- deferred.resolve(widgetType);
- }, function fail() {
- deferred.reject();
- });
- return deferred.promise;
- }
-
- function getWidgetTypeById(widgetTypeId) {
- var deferred = $q.defer();
- var url = '/api/widgetType/' + widgetTypeId;
- $http.get(url, null).then(function success(response) {
- var widgetType = response.data;
- deferred.resolve(widgetType);
- }, function fail() {
- deferred.reject();
- });
- return deferred.promise;
- }
-
- function deleteWidgetType(bundleAlias, widgetTypeAlias, isSystem) {
- var deferred = $q.defer();
- getWidgetType(bundleAlias, widgetTypeAlias, isSystem).then(
- function success(widgetType) {
- var url = '/api/widgetType/' + widgetType.id.id;
- $http.delete(url).then(function success() {
- deleteWidgetInfoFromCache(bundleAlias, widgetTypeAlias, isSystem);
- deferred.resolve();
- }, function fail() {
- deferred.reject();
- });
- },
- function fail() {
- deferred.reject();
- }
- );
- return deferred.promise;
- }
-
- function saveWidgetType(widgetInfo, id, bundleAlias) {
- var deferred = $q.defer();
- var widgetType = toWidgetType(widgetInfo, id, undefined, bundleAlias);
- var url = '/api/widgetType';
- $http.post(url, widgetType).then(function success(response) {
- var widgetType = response.data;
- deleteWidgetInfoFromCache(widgetType.bundleAlias, widgetType.alias, widgetType.tenantId.id === types.id.nullUid);
- deferred.resolve(widgetType);
- }, function fail() {
- deferred.reject();
- });
- return deferred.promise;
- }
-
- function saveImportedWidgetType(widgetType) {
- var deferred = $q.defer();
- var url = '/api/widgetType';
- $http.post(url, widgetType).then(function success(response) {
- var widgetType = response.data;
- deleteWidgetInfoFromCache(widgetType.bundleAlias, widgetType.alias, widgetType.tenantId.id === types.id.nullUid);
- deferred.resolve(widgetType);
- }, function fail() {
- deferred.reject();
- });
- return deferred.promise;
- }
-
- function loadWidgetResources(widgetInfo, bundleAlias, isSystem) {
-
- var deferred = $q.defer();
- var errors = [];
-
- var widgetNamespace = "widget-type-" + (isSystem ? 'sys-' : '') + bundleAlias + '-' + widgetInfo.alias;
- cssParser.cssPreviewNamespace = widgetNamespace;
- cssParser.createStyleElement(widgetNamespace, widgetInfo.templateCss);
-
- function loadNextOrComplete(i) {
- i++;
- if (i < widgetInfo.resources.length) {
- loadNext(i);
- } else {
- if (errors.length > 0) {
- deferred.reject(errors);
- } else {
- deferred.resolve();
- }
- }
- }
-
- function loadNext(i) {
- var resourceUrl = widgetInfo.resources[i].url;
- if (resourceUrl && resourceUrl.length > 0) {
- $ocLazyLoad.load(resourceUrl).then(
- function success() {
- loadNextOrComplete(i);
- },
- function fail() {
- errors.push('Failed to load widget resource: \'' + resourceUrl + '\'');
- loadNextOrComplete(i);
- }
- );
- } else {
- loadNextOrComplete(i);
- }
- }
-
- if (widgetInfo.resources.length > 0) {
- loadNext(0);
- } else {
- deferred.resolve();
- }
-
- return deferred.promise;
- }
-
-}
diff --git a/ui/src/app/app.config.js b/ui/src/app/app.config.js
deleted file mode 100644
index 82b4f923ce..0000000000
--- a/ui/src/app/app.config.js
+++ /dev/null
@@ -1,174 +0,0 @@
-/*
- * Copyright © 2016-2020 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 injectTapEventPlugin from 'react-tap-event-plugin';
-import UrlHandler from './url.handler';
-
-/* eslint-disable import/no-unresolved, import/default */
-
-import mdiIconSet from '../svg/mdi.svg';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-const PRIMARY_BACKGROUND_COLOR = "#305680";//#2856b6";//"#3f51b5";
-const SECONDARY_BACKGROUND_COLOR = "#527dad";
-const HUE3_COLOR = "#a7c1de";
-
-/*@ngInject*/
-export default function AppConfig($provide,
- $urlRouterProvider,
- $locationProvider,
- $mdIconProvider,
- ngMdIconServiceProvider,
- $mdThemingProvider,
- $httpProvider,
- $translateProvider,
- storeProvider) {
-
- injectTapEventPlugin();
- $locationProvider.html5Mode(true);
- $urlRouterProvider.otherwise(UrlHandler);
- storeProvider.setCaching(false);
-
- $translateProvider.useSanitizeValueStrategy(null)
- .useMissingTranslationHandler('tbMissingTranslationHandler')
- .addInterpolation('$translateMessageFormatInterpolation')
- .useStaticFilesLoader({
- files: [
- {
- prefix: PUBLIC_PATH + 'locale/locale.constant-', //eslint-disable-line
- suffix: '.json'
- }
- ]
- })
- .registerAvailableLanguageKeys(SUPPORTED_LANGS, getLanguageAliases(SUPPORTED_LANGS)) //eslint-disable-line
- .fallbackLanguage('en_US') // must be before determinePreferredLanguage
- .uniformLanguageTag('java') // must be before determinePreferredLanguage
- .determinePreferredLanguage();
-
- $httpProvider.interceptors.push('globalInterceptor');
-
- $provide.decorator("$exceptionHandler", ['$delegate', '$injector', function ($delegate/*, $injector*/) {
- return function (exception, cause) {
-/* var rootScope = $injector.get("$rootScope");
- var $window = $injector.get("$window");
- var utils = $injector.get("utils");
- if (rootScope.widgetEditMode) {
- var parentScope = $window.parent.angular.element($window.frameElement).scope();
- var data = utils.parseException(exception);
- parentScope.$emit('widgetException', data);
- parentScope.$apply();
- }*/
- $delegate(exception, cause);
- };
- }]);
-
- $mdIconProvider.iconSet('mdi', mdiIconSet);
-
- ngMdIconServiceProvider
- .addShape('alpha-a-circle-outline', '')
- .addShape('alpha-e-circle-outline', '');
-
- configureTheme();
-
- function blueGrayTheme() {
- var tbPrimaryPalette = $mdThemingProvider.extendPalette('blue-grey');
- var tbAccentPalette = $mdThemingProvider.extendPalette('orange', {
- 'contrastDefaultColor': 'light'
- });
-
- $mdThemingProvider.definePalette('tb-primary', tbPrimaryPalette);
- $mdThemingProvider.definePalette('tb-accent', tbAccentPalette);
-
- $mdThemingProvider.theme('default')
- .primaryPalette('tb-primary')
- .accentPalette('tb-accent');
-
- $mdThemingProvider.theme('tb-dark')
- .primaryPalette('tb-primary')
- .accentPalette('tb-accent')
- .backgroundPalette('tb-primary')
- .dark();
- }
-
- function indigoTheme() {
- var tbPrimaryPalette = $mdThemingProvider.extendPalette('indigo', {
- '500': PRIMARY_BACKGROUND_COLOR,
- '600': SECONDARY_BACKGROUND_COLOR,
- 'A100': HUE3_COLOR
- });
-
- var tbAccentPalette = $mdThemingProvider.extendPalette('deep-orange');
-
- $mdThemingProvider.definePalette('tb-primary', tbPrimaryPalette);
- $mdThemingProvider.definePalette('tb-accent', tbAccentPalette);
-
- var tbDarkPrimaryPalette = $mdThemingProvider.extendPalette('tb-primary', {
- '500': '#9fa8da'
- });
-
- var tbDarkPrimaryBackgroundPalette = $mdThemingProvider.extendPalette('tb-primary', {
- '800': PRIMARY_BACKGROUND_COLOR
- });
-
- $mdThemingProvider.definePalette('tb-dark-primary', tbDarkPrimaryPalette);
- $mdThemingProvider.definePalette('tb-dark-primary-background', tbDarkPrimaryBackgroundPalette);
-
- $mdThemingProvider.theme('default')
- .primaryPalette('tb-primary')
- .accentPalette('tb-accent');
-
- $mdThemingProvider.theme('tb-dark')
- .primaryPalette('tb-dark-primary')
- .accentPalette('tb-accent')
- .backgroundPalette('tb-dark-primary-background')
- .dark();
- }
-
- function configureTheme() {
-
- var theme = 'indigo';
-
- if (theme === 'blueGray') {
- blueGrayTheme();
- } else {
- indigoTheme();
- }
-
- $mdThemingProvider.setDefaultTheme('default');
- //$mdThemingProvider.alwaysWatchTheme(true);
- }
-
- function getLanguageAliases(supportedLangs) {
- var aliases = {};
-
- supportedLangs.sort().forEach(function(item, index, array) {
- if (item.length === 2) {
- aliases[item] = item;
- aliases[item + '_*'] = item;
- } else {
- var key = item.slice(0, 2);
- if (index === 0 || key !== array[index - 1].slice(0, 2)) {
- aliases[key] = item;
- aliases[key + '_*'] = item;
- } else {
- aliases[item] = item;
- }
- }
- });
-
- return aliases;
- }
-}
diff --git a/ui/src/app/app.js b/ui/src/app/app.js
deleted file mode 100644
index 0b48a76cdb..0000000000
--- a/ui/src/app/app.js
+++ /dev/null
@@ -1,163 +0,0 @@
-/*
- * Copyright © 2016-2020 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 './ie.support';
-
-import 'event-source-polyfill';
-
-import angular from 'angular';
-import ngMaterial from 'angular-material';
-import ngMdIcons from 'angular-material-icons';
-import ngCookies from 'angular-cookies';
-import angularSocialshare from 'angular-socialshare';
-import 'angular-translate';
-import 'angular-translate-loader-static-files';
-import 'angular-translate-storage-local';
-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';
-import vAccordion from 'v-accordion';
-import ngAnimate from 'angular-animate';
-import 'angular-websocket';
-import uiRouter from 'angular-ui-router';
-import angularJwt from 'angular-jwt';
-import 'angular-drag-and-drop-lists';
-import mdDataTable from 'angular-material-data-table';
-import fixedTableHeader from 'angular-fixed-table-header';
-import 'angular-material-expansion-panel';
-import ngTouch from 'angular-touch';
-import 'angular-carousel';
-import 'clipboard';
-import 'ngclipboard';
-import 'react';
-import 'react-dom';
-import 'material-ui';
-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 'material-steppers/dist/material-steppers';
-import 'material-steppers/dist/material-steppers.css'
-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';
-import 'angular-material-icons/angular-material-icons.css';
-import 'angular-gridster/dist/angular-gridster.min.css';
-import 'v-accordion/dist/v-accordion.min.css';
-import 'md-color-picker/dist/mdColorPicker.min.css';
-import 'mdPickers/dist/mdPickers.min.css';
-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';
-import thingsboardTranslateHandler from './locale/translate-handler';
-import thingsboardLogin from './login';
-import thingsboardDialogs from './components/datakey-config-dialog.controller';
-import thingsboardMenu from './services/menu.service';
-import thingsboardRaf from './common/raf.provider';
-import thingsboardUtils from './common/utils.service';
-import thingsboardDashboardUtils from './common/dashboard-utils.service';
-import thingsboardTypes from './common/types.constant';
-import thingsboardApiTime from './api/time.service';
-import thingsboardKeyboardShortcut from './components/keyboard-shortcut.filter';
-import thingsboardHelp from './help/help.directive';
-import thingsboardToast from './services/toast';
-import thingsboardClipboard from './services/clipboard.service';
-import thingsboardHome from './layout';
-import thingsboardApiLogin from './api/login.service';
-import thingsboardApiDevice from './api/device.service';
-import thingsboardApiEntityView from './api/entity-view.service';
-import thingsboardApiUser from './api/user.service';
-import thingsboardApiEntityRelation from './api/entity-relation.service';
-import thingsboardApiAsset from './api/asset.service';
-import thingsboardApiAttribute from './api/attribute.service';
-import thingsboardApiEntity from './api/entity.service';
-import thingsboardApiAlarm from './api/alarm.service';
-import thingsboardApiAuditLog from './api/audit-log.service';
-import thingsboardApiComponentDescriptor from './api/component-descriptor.service';
-import thingsboardApiRuleChain from './api/rule-chain.service';
-
-import AppConfig from './app.config';
-import GlobalInterceptor from './global-interceptor.service';
-import AppRun from './app.run';
-
-angular.module('thingsboard', [
- ngMaterial,
- ngMdIcons,
- ngCookies,
- angularSocialshare,
- 'pascalprecht.translate',
- 'mdColorPicker',
- 'ngMaterialDateRangePicker',
- mdPickers,
- ngSanitize,
- FBAngular.name,
- vAccordion,
- ngAnimate,
- 'ngWebSocket',
- angularJwt,
- 'dndLists',
- mdDataTable,
- fixedTableHeader,
- 'material.components.expansionPanels',
- ngTouch,
- 'angular-carousel',
- 'ngclipboard',
- react.name,
- 'flow',
- 'flowchart',
- 'mdSteppers',
- thingsboardThirdpartyFix,
- thingsboardTranslateHandler,
- thingsboardLogin,
- thingsboardDialogs,
- thingsboardMenu,
- thingsboardRaf,
- thingsboardUtils,
- thingsboardDashboardUtils,
- thingsboardTypes,
- thingsboardApiTime,
- thingsboardKeyboardShortcut,
- thingsboardHelp,
- thingsboardToast,
- thingsboardClipboard,
- thingsboardHome,
- thingsboardApiLogin,
- thingsboardApiDevice,
- thingsboardApiEntityView,
- thingsboardApiUser,
- thingsboardApiEntityRelation,
- thingsboardApiAsset,
- thingsboardApiAttribute,
- thingsboardApiEntity,
- thingsboardApiAlarm,
- thingsboardApiAuditLog,
- thingsboardApiComponentDescriptor,
- thingsboardApiRuleChain,
- uiRouter])
- .config(AppConfig)
- .factory('globalInterceptor', GlobalInterceptor)
- .run(AppRun);
diff --git a/ui/src/app/app.run.js b/ui/src/app/app.run.js
deleted file mode 100644
index 3255c0a917..0000000000
--- a/ui/src/app/app.run.js
+++ /dev/null
@@ -1,210 +0,0 @@
-/*
- * Copyright © 2016-2020 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 Flow from '@flowjs/ng-flow/dist/ng-flow-standalone.min';
-import UrlHandler from './url.handler';
-
-/*@ngInject*/
-export default function AppRun($rootScope, $window, $injector, $location, $log, $state, $mdDialog, $filter, $q, loginService, userService, $translate) {
-
- $window.Flow = Flow;
- var frame = null;
- try {
- frame = $window.frameElement;
- } catch(e) {
- // ie11 fix
- }
-
- var forbiddenDialog = null;
-
- $rootScope.iframeMode = false;
-
- if (frame) {
- $rootScope.iframeMode = true;
- var dataWidgetAttr = angular.element(frame).attr('data-widget');
- if (dataWidgetAttr) {
- $rootScope.editWidgetInfo = angular.fromJson(dataWidgetAttr);
- $rootScope.widgetEditMode = true;
- }
- }
-
- initWatchers();
-
- var skipStateChange = false;
-
- function initWatchers() {
- $rootScope.unauthenticatedHandle = $rootScope.$on('unauthenticated', function (event, doLogout) {
- if (doLogout) {
- gotoPublicModule('login');
- } else {
- UrlHandler($injector, $location);
- }
- });
-
- $rootScope.authenticatedHandle = $rootScope.$on('authenticated', function () {
- UrlHandler($injector, $location);
- });
-
- $rootScope.forbiddenHandle = $rootScope.$on('forbidden', function () {
- showForbiddenDialog();
- });
-
- $rootScope.stateChangeStartHandle = $rootScope.$on('$stateChangeStart', function (evt, to, params) {
-
- if (skipStateChange) {
- skipStateChange = false;
- return;
- }
-
- function waitForUserLoaded() {
- if ($rootScope.userLoadedHandle) {
- $rootScope.userLoadedHandle();
- }
- $rootScope.userLoadedHandle = $rootScope.$on('userLoaded', function () {
- $rootScope.userLoadedHandle();
- $state.go(to.name, params);
- });
- }
-
- function reloadUserFromPublicId() {
- userService.setUserFromJwtToken(null, null, false);
- waitForUserLoaded();
- userService.reloadUser();
- }
-
- var locationSearch = $location.search();
- var publicId = locationSearch.publicId;
- var activateToken = locationSearch.activateToken;
-
- if (to.url === '/createPassword?activateToken' && activateToken && activateToken.length) {
- userService.setUserFromJwtToken(null, null, false);
- }
-
- if (userService.isUserLoaded() === true) {
- if (userService.isAuthenticated()) {
- if (userService.isPublic()) {
- if (userService.parsePublicId() !== publicId) {
- evt.preventDefault();
- if (publicId && publicId.length > 0) {
- reloadUserFromPublicId();
- } else {
- userService.logout();
- }
- return;
- }
- }
- if (userService.forceDefaultPlace(to, params)) {
- evt.preventDefault();
- gotoDefaultPlace(params);
- } else {
- var authority = userService.getAuthority();
- if (to.module === 'public') {
- evt.preventDefault();
- gotoDefaultPlace(params);
- } else if (angular.isDefined(to.auth) &&
- to.auth.indexOf(authority) === -1) {
- evt.preventDefault();
- showForbiddenDialog();
- } else if (to.redirectTo) {
- evt.preventDefault();
- $state.go(to.redirectTo, params);
- } else if (to.name === 'home.dashboards.dashboard' && $rootScope.forceFullscreen) {
- evt.preventDefault();
- $state.go('dashboard', params);
- }
- }
- } else {
- if (publicId && publicId.length > 0) {
- evt.preventDefault();
- reloadUserFromPublicId();
- } else if (to.module === 'private') {
- evt.preventDefault();
- var redirectParams = {};
- redirectParams.toName = to.name;
- redirectParams.params = params;
- userService.setRedirectParams(redirectParams);
- gotoPublicModule('login', params);
- } else {
- evt.preventDefault();
- gotoPublicModule(to.name, params);
- }
- }
- } else {
- evt.preventDefault();
- waitForUserLoaded();
- }
- })
-
- $rootScope.pageTitle = 'ThingsBoard';
-
- $rootScope.stateChangeSuccessHandle = $rootScope.$on('$stateChangeSuccess', function (evt, to, params) {
- if (userService.isPublic() && to.name === 'dashboard') {
- $location.search('publicId', userService.getPublicId());
- userService.updateLastPublicDashboardId(params.dashboardId);
- }
- if (angular.isDefined(to.data.pageTitle)) {
- $translate(to.data.pageTitle).then(function (translation) {
- $rootScope.pageTitle = 'ThingsBoard | ' + translation;
- }, function (translationId) {
- $rootScope.pageTitle = 'ThingsBoard | ' + translationId;
- });
- }
- })
- }
-
- function gotoDefaultPlace(params) {
- userService.gotoDefaultPlace(params);
- }
-
- function gotoPublicModule(name, params) {
- let tasks = [];
- if (name === "login") {
- tasks.push(loginService.loadOAuth2Clients());
- }
- $q.all(tasks).then(
- () => {
- skipStateChange = true;
- $state.go(name, params);
- },
- () => {
- skipStateChange = true;
- $state.go(name, params);
- }
- );
- }
-
- function showForbiddenDialog() {
- if (forbiddenDialog === null) {
- $translate(['access.access-forbidden',
- 'access.access-forbidden-text',
- 'action.cancel',
- 'action.sign-in']).then(function (translations) {
- if (forbiddenDialog === null) {
- forbiddenDialog = $mdDialog.confirm()
- .title(translations['access.access-forbidden'])
- .htmlContent(translations['access.access-forbidden-text'])
- .cancel(translations['action.cancel'])
- .ok(translations['action.sign-in']);
- $mdDialog.show(forbiddenDialog).then(function () {
- forbiddenDialog = null;
- userService.logout();
- }, function () {
- forbiddenDialog = null;
- });
- }
- });
- }
- }
-}
diff --git a/ui/src/app/asset/add-asset.tpl.html b/ui/src/app/asset/add-asset.tpl.html
deleted file mode 100644
index fafd91329f..0000000000
--- a/ui/src/app/asset/add-asset.tpl.html
+++ /dev/null
@@ -1,45 +0,0 @@
-
-
-
-
diff --git a/ui/src/app/asset/add-assets-to-customer.controller.js b/ui/src/app/asset/add-assets-to-customer.controller.js
deleted file mode 100644
index 932fe2f78c..0000000000
--- a/ui/src/app/asset/add-assets-to-customer.controller.js
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-/*@ngInject*/
-export default function AddAssetsToCustomerController(assetService, $mdDialog, $q, customerId, assets) {
-
- var vm = this;
-
- vm.assets = assets;
- vm.searchText = '';
-
- vm.assign = assign;
- vm.cancel = cancel;
- vm.hasData = hasData;
- vm.noData = noData;
- vm.searchAssetTextUpdated = searchAssetTextUpdated;
- vm.toggleAssetSelection = toggleAssetSelection;
-
- vm.theAssets = {
- getItemAtIndex: function (index) {
- if (index > vm.assets.data.length) {
- vm.theAssets.fetchMoreItems_(index);
- return null;
- }
- var item = vm.assets.data[index];
- if (item) {
- item.indexNumber = index + 1;
- }
- return item;
- },
-
- getLength: function () {
- if (vm.assets.hasNext) {
- return vm.assets.data.length + vm.assets.nextPageLink.limit;
- } else {
- return vm.assets.data.length;
- }
- },
-
- fetchMoreItems_: function () {
- if (vm.assets.hasNext && !vm.assets.pending) {
- vm.assets.pending = true;
- assetService.getTenantAssets(vm.assets.nextPageLink, false).then(
- function success(assets) {
- vm.assets.data = vm.assets.data.concat(assets.data);
- vm.assets.nextPageLink = assets.nextPageLink;
- vm.assets.hasNext = assets.hasNext;
- if (vm.assets.hasNext) {
- vm.assets.nextPageLink.limit = vm.assets.pageSize;
- }
- vm.assets.pending = false;
- },
- function fail() {
- vm.assets.hasNext = false;
- vm.assets.pending = false;
- });
- }
- }
- };
-
- function cancel () {
- $mdDialog.cancel();
- }
-
- function assign() {
- var tasks = [];
- for (var assetId in vm.assets.selections) {
- tasks.push(assetService.assignAssetToCustomer(customerId, assetId));
- }
- $q.all(tasks).then(function () {
- $mdDialog.hide();
- });
- }
-
- function noData() {
- return vm.assets.data.length == 0 && !vm.assets.hasNext;
- }
-
- function hasData() {
- return vm.assets.data.length > 0;
- }
-
- function toggleAssetSelection($event, asset) {
- $event.stopPropagation();
- var selected = angular.isDefined(asset.selected) && asset.selected;
- asset.selected = !selected;
- if (asset.selected) {
- vm.assets.selections[asset.id.id] = true;
- vm.assets.selectedCount++;
- } else {
- delete vm.assets.selections[asset.id.id];
- vm.assets.selectedCount--;
- }
- }
-
- function searchAssetTextUpdated() {
- vm.assets = {
- pageSize: vm.assets.pageSize,
- data: [],
- nextPageLink: {
- limit: vm.assets.pageSize,
- textSearch: vm.searchText
- },
- selections: {},
- selectedCount: 0,
- hasNext: true,
- pending: false
- };
- }
-
-}
diff --git a/ui/src/app/asset/add-assets-to-customer.tpl.html b/ui/src/app/asset/add-assets-to-customer.tpl.html
deleted file mode 100644
index 6bbf5a01c4..0000000000
--- a/ui/src/app/asset/add-assets-to-customer.tpl.html
+++ /dev/null
@@ -1,77 +0,0 @@
-
-
-
-
\ No newline at end of file
diff --git a/ui/src/app/asset/asset-card.tpl.html b/ui/src/app/asset/asset-card.tpl.html
deleted file mode 100644
index 3ef288d850..0000000000
--- a/ui/src/app/asset/asset-card.tpl.html
+++ /dev/null
@@ -1,22 +0,0 @@
-
-
-
{{vm.item.type}}
-
{{'asset.assignedToCustomer' | translate}} '{{vm.item.assignedCustomer.title}}'
-
{{'asset.public' | translate}}
-
diff --git a/ui/src/app/asset/asset-fieldset.tpl.html b/ui/src/app/asset/asset-fieldset.tpl.html
deleted file mode 100644
index cc08b40f0a..0000000000
--- a/ui/src/app/asset/asset-fieldset.tpl.html
+++ /dev/null
@@ -1,75 +0,0 @@
-
-{{ 'asset.make-public' | translate }}
-{{ 'asset.assign-to-customer' | translate }}
-{{ isPublic ? 'asset.make-private' : 'asset.unassign-from-customer' | translate }}
-{{ 'asset.delete' | translate }}
-
-
-
-
- asset.copyId
-
-
-
-
-
-
-
-
-
- {{ 'asset.asset-public' | translate }}
-
-
-
diff --git a/ui/src/app/asset/asset.controller.js b/ui/src/app/asset/asset.controller.js
deleted file mode 100644
index a25951b046..0000000000
--- a/ui/src/app/asset/asset.controller.js
+++ /dev/null
@@ -1,534 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-/* eslint-disable import/no-unresolved, import/default */
-
-import addAssetTemplate from './add-asset.tpl.html';
-import assetCard from './asset-card.tpl.html';
-import assignToCustomerTemplate from './assign-to-customer.tpl.html';
-import addAssetsToCustomerTemplate from './add-assets-to-customer.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-/*@ngInject*/
-export function AssetCardController(types) {
-
- var vm = this;
-
- vm.types = types;
-
- vm.isAssignedToCustomer = function() {
- if (vm.item && vm.item.customerId && vm.parentCtl.assetsScope === 'tenant' &&
- vm.item.customerId.id != vm.types.id.nullUid && !vm.item.assignedCustomer.isPublic) {
- return true;
- }
- return false;
- }
-
- vm.isPublic = function() {
- if (vm.item && vm.item.assignedCustomer && vm.parentCtl.assetsScope === 'tenant' && vm.item.assignedCustomer.isPublic) {
- return true;
- }
- return false;
- }
-}
-
-
-/*@ngInject*/
-export function AssetController($rootScope, userService, assetService, customerService, $state, $stateParams,
- $document, $mdDialog, $q, $translate, types, importExport) {
-
- var customerId = $stateParams.customerId;
-
- var assetActionsList = [];
-
- var assetGroupActionsList = [];
-
- var assetAddItemActionsList = [
- {
- onAction: function ($event) {
- vm.grid.addItem($event);
- },
- name: function() { return $translate.instant('action.add') },
- details: function() { return $translate.instant('asset.add-asset-text') },
- icon: "insert_drive_file"
- },
- {
- onAction: function ($event) {
- importExport.importEntities($event, types.entityType.asset).then(
- function() {
- vm.grid.refreshList();
- }
- );
- },
- name: function() { return $translate.instant('action.import') },
- details: function() { return $translate.instant('asset.import') },
- icon: "file_upload"
- }
- ];
-
- var vm = this;
-
- vm.types = types;
-
- vm.assetGridConfig = {
- deleteItemTitleFunc: deleteAssetTitle,
- deleteItemContentFunc: deleteAssetText,
- deleteItemsTitleFunc: deleteAssetsTitle,
- deleteItemsActionTitleFunc: deleteAssetsActionTitle,
- deleteItemsContentFunc: deleteAssetsText,
-
- saveItemFunc: saveAsset,
-
- getItemTitleFunc: getAssetTitle,
-
- itemCardController: 'AssetCardController',
- itemCardTemplateUrl: assetCard,
- parentCtl: vm,
-
- actionsList: assetActionsList,
- groupActionsList: assetGroupActionsList,
- addItemActions: assetAddItemActionsList,
-
- onGridInited: gridInited,
-
- addItemTemplateUrl: addAssetTemplate,
-
- addItemText: function() { return $translate.instant('asset.add-asset-text') },
- noItemsText: function() { return $translate.instant('asset.no-assets-text') },
- itemDetailsText: function() { return $translate.instant('asset.asset-details') },
- isDetailsReadOnly: isCustomerUser,
- isSelectionEnabled: function () {
- return !isCustomerUser();
- }
- };
-
- if (angular.isDefined($stateParams.items) && $stateParams.items !== null) {
- vm.assetGridConfig.items = $stateParams.items;
- }
-
- if (angular.isDefined($stateParams.topIndex) && $stateParams.topIndex > 0) {
- vm.assetGridConfig.topIndex = $stateParams.topIndex;
- }
-
- vm.assetsScope = $state.$current.data.assetsType;
-
- vm.assignToCustomer = assignToCustomer;
- vm.makePublic = makePublic;
- vm.unassignFromCustomer = unassignFromCustomer;
-
- initController();
-
- function initController() {
- var fetchAssetsFunction = null;
- var deleteAssetFunction = null;
- var refreshAssetsParamsFunction = null;
-
- var user = userService.getCurrentUser();
-
- if (user.authority === 'CUSTOMER_USER') {
- vm.assetsScope = 'customer_user';
- customerId = user.customerId;
- }
- if (customerId) {
- vm.customerAssetsTitle = $translate.instant('customer.assets');
- customerService.getShortCustomerInfo(customerId).then(
- function success(info) {
- if (info.isPublic) {
- vm.customerAssetsTitle = $translate.instant('customer.public-assets');
- }
- }
- );
- }
-
- if (vm.assetsScope === 'tenant') {
- fetchAssetsFunction = function (pageLink, assetType) {
- return assetService.getTenantAssets(pageLink, true, null, assetType);
- };
- deleteAssetFunction = function (assetId) {
- return assetService.deleteAsset(assetId);
- };
- refreshAssetsParamsFunction = function() {
- return {"topIndex": vm.topIndex};
- };
-
- assetActionsList.push({
- onAction: function ($event, item) {
- makePublic($event, item);
- },
- name: function() { return $translate.instant('action.share') },
- details: function() { return $translate.instant('asset.make-public') },
- icon: "share",
- isEnabled: function(asset) {
- return asset && (!asset.customerId || asset.customerId.id === types.id.nullUid);
- }
- });
-
- assetActionsList.push(
- {
- onAction: function ($event, item) {
- assignToCustomer($event, [ item.id.id ]);
- },
- name: function() { return $translate.instant('action.assign') },
- details: function() { return $translate.instant('asset.assign-to-customer') },
- icon: "assignment_ind",
- isEnabled: function(asset) {
- return asset && (!asset.customerId || asset.customerId.id === types.id.nullUid);
- }
- }
- );
-
- assetActionsList.push(
- {
- onAction: function ($event, item) {
- unassignFromCustomer($event, item, false);
- },
- name: function() { return $translate.instant('action.unassign') },
- details: function() { return $translate.instant('asset.unassign-from-customer') },
- icon: "assignment_return",
- isEnabled: function(asset) {
- return asset && asset.customerId && asset.customerId.id !== types.id.nullUid && !asset.assignedCustomer.isPublic;
- }
- }
- );
-
- assetActionsList.push({
- onAction: function ($event, item) {
- unassignFromCustomer($event, item, true);
- },
- name: function() { return $translate.instant('action.make-private') },
- details: function() { return $translate.instant('asset.make-private') },
- icon: "reply",
- isEnabled: function(asset) {
- return asset && asset.customerId && asset.customerId.id !== types.id.nullUid && asset.assignedCustomer.isPublic;
- }
- });
-
- assetActionsList.push(
- {
- onAction: function ($event, item) {
- vm.grid.deleteItem($event, item);
- },
- name: function() { return $translate.instant('action.delete') },
- details: function() { return $translate.instant('asset.delete') },
- icon: "delete"
- }
- );
-
- assetGroupActionsList.push(
- {
- onAction: function ($event, items) {
- assignAssetsToCustomer($event, items);
- },
- name: function() { return $translate.instant('asset.assign-assets') },
- details: function(selectedCount) {
- return $translate.instant('asset.assign-assets-text', {count: selectedCount}, "messageformat");
- },
- icon: "assignment_ind"
- }
- );
-
- assetGroupActionsList.push(
- {
- onAction: function ($event) {
- vm.grid.deleteItems($event);
- },
- name: function() { return $translate.instant('asset.delete-assets') },
- details: deleteAssetsActionTitle,
- icon: "delete"
- }
- );
-
-
-
- } else if (vm.assetsScope === 'customer' || vm.assetsScope === 'customer_user') {
- fetchAssetsFunction = function (pageLink, assetType) {
- return assetService.getCustomerAssets(customerId, pageLink, true, null, assetType);
- };
- deleteAssetFunction = function (assetId) {
- return assetService.unassignAssetFromCustomer(assetId);
- };
- refreshAssetsParamsFunction = function () {
- return {"customerId": customerId, "topIndex": vm.topIndex};
- };
-
- if (vm.assetsScope === 'customer') {
- assetActionsList.push(
- {
- onAction: function ($event, item) {
- unassignFromCustomer($event, item, false);
- },
- name: function() { return $translate.instant('action.unassign') },
- details: function() { return $translate.instant('asset.unassign-from-customer') },
- icon: "assignment_return",
- isEnabled: function(asset) {
- return asset && !asset.assignedCustomer.isPublic;
- }
- }
- );
- assetActionsList.push(
- {
- onAction: function ($event, item) {
- unassignFromCustomer($event, item, true);
- },
- name: function() { return $translate.instant('action.make-private') },
- details: function() { return $translate.instant('asset.make-private') },
- icon: "reply",
- isEnabled: function(asset) {
- return asset && asset.assignedCustomer.isPublic;
- }
- }
- );
-
- assetGroupActionsList.push(
- {
- onAction: function ($event, items) {
- unassignAssetsFromCustomer($event, items);
- },
- name: function() { return $translate.instant('asset.unassign-assets') },
- details: function(selectedCount) {
- return $translate.instant('asset.unassign-assets-action-title', {count: selectedCount}, "messageformat");
- },
- icon: "assignment_return"
- }
- );
-
- vm.assetGridConfig.addItemAction = {
- onAction: function ($event) {
- addAssetsToCustomer($event);
- },
- name: function() { return $translate.instant('asset.assign-assets') },
- details: function() { return $translate.instant('asset.assign-new-asset') },
- icon: "add"
- };
-
-
- } else if (vm.assetsScope === 'customer_user') {
- vm.assetGridConfig.addItemAction = {};
- }
- vm.assetGridConfig.addItemActions = [];
-
- }
-
- vm.assetGridConfig.refreshParamsFunc = refreshAssetsParamsFunction;
- vm.assetGridConfig.fetchItemsFunc = fetchAssetsFunction;
- vm.assetGridConfig.deleteItemFunc = deleteAssetFunction;
-
- }
-
- function deleteAssetTitle(asset) {
- return $translate.instant('asset.delete-asset-title', {assetName: asset.name});
- }
-
- function deleteAssetText() {
- return $translate.instant('asset.delete-asset-text');
- }
-
- function deleteAssetsTitle(selectedCount) {
- return $translate.instant('asset.delete-assets-title', {count: selectedCount}, 'messageformat');
- }
-
- function deleteAssetsActionTitle(selectedCount) {
- return $translate.instant('asset.delete-assets-action-title', {count: selectedCount}, 'messageformat');
- }
-
- function deleteAssetsText () {
- return $translate.instant('asset.delete-assets-text');
- }
-
- function gridInited(grid) {
- vm.grid = grid;
- }
-
- function getAssetTitle(asset) {
- return asset ? asset.name : '';
- }
-
- function saveAsset(asset) {
- var deferred = $q.defer();
- assetService.saveAsset(asset).then(
- function success(savedAsset) {
- $rootScope.$broadcast('assetSaved');
- var assets = [ savedAsset ];
- customerService.applyAssignedCustomersInfo(assets).then(
- function success(items) {
- if (items && items.length == 1) {
- deferred.resolve(items[0]);
- } else {
- deferred.reject();
- }
- },
- function fail() {
- deferred.reject();
- }
- );
- },
- function fail() {
- deferred.reject();
- }
- );
- return deferred.promise;
- }
-
- function isCustomerUser() {
- return vm.assetsScope === 'customer_user';
- }
-
- function assignToCustomer($event, assetIds) {
- if ($event) {
- $event.stopPropagation();
- }
- var pageSize = 10;
- customerService.getCustomers({limit: pageSize, textSearch: ''}).then(
- function success(_customers) {
- var customers = {
- pageSize: pageSize,
- data: _customers.data,
- nextPageLink: _customers.nextPageLink,
- selection: null,
- hasNext: _customers.hasNext,
- pending: false
- };
- if (customers.hasNext) {
- customers.nextPageLink.limit = pageSize;
- }
- $mdDialog.show({
- controller: 'AssignAssetToCustomerController',
- controllerAs: 'vm',
- templateUrl: assignToCustomerTemplate,
- locals: {assetIds: assetIds, customers: customers},
- parent: angular.element($document[0].body),
- fullscreen: true,
- targetEvent: $event
- }).then(function () {
- vm.grid.refreshList();
- }, function () {
- });
- },
- function fail() {
- });
- }
-
- function addAssetsToCustomer($event) {
- if ($event) {
- $event.stopPropagation();
- }
- var pageSize = 10;
- assetService.getTenantAssets({limit: pageSize, textSearch: ''}, false).then(
- function success(_assets) {
- var assets = {
- pageSize: pageSize,
- data: _assets.data,
- nextPageLink: _assets.nextPageLink,
- selections: {},
- selectedCount: 0,
- hasNext: _assets.hasNext,
- pending: false
- };
- if (assets.hasNext) {
- assets.nextPageLink.limit = pageSize;
- }
- $mdDialog.show({
- controller: 'AddAssetsToCustomerController',
- controllerAs: 'vm',
- templateUrl: addAssetsToCustomerTemplate,
- locals: {customerId: customerId, assets: assets},
- parent: angular.element($document[0].body),
- fullscreen: true,
- targetEvent: $event
- }).then(function () {
- vm.grid.refreshList();
- }, function () {
- });
- },
- function fail() {
- });
- }
-
- function assignAssetsToCustomer($event, items) {
- var assetIds = [];
- for (var id in items.selections) {
- assetIds.push(id);
- }
- assignToCustomer($event, assetIds);
- }
-
- function unassignFromCustomer($event, asset, isPublic) {
- if ($event) {
- $event.stopPropagation();
- }
- var title;
- var content;
- var label;
- if (isPublic) {
- title = $translate.instant('asset.make-private-asset-title', {assetName: asset.name});
- content = $translate.instant('asset.make-private-asset-text');
- label = $translate.instant('asset.make-private');
- } else {
- title = $translate.instant('asset.unassign-asset-title', {assetName: asset.name});
- content = $translate.instant('asset.unassign-asset-text');
- label = $translate.instant('asset.unassign-asset');
- }
- var confirm = $mdDialog.confirm()
- .targetEvent($event)
- .title(title)
- .htmlContent(content)
- .ariaLabel(label)
- .cancel($translate.instant('action.no'))
- .ok($translate.instant('action.yes'));
- $mdDialog.show(confirm).then(function () {
- assetService.unassignAssetFromCustomer(asset.id.id).then(function success() {
- vm.grid.refreshList();
- });
- });
- }
-
- function unassignAssetsFromCustomer($event, items) {
- var confirm = $mdDialog.confirm()
- .targetEvent($event)
- .title($translate.instant('asset.unassign-assets-title', {count: items.selectedCount}, 'messageformat'))
- .htmlContent($translate.instant('asset.unassign-assets-text'))
- .ariaLabel($translate.instant('asset.unassign-asset'))
- .cancel($translate.instant('action.no'))
- .ok($translate.instant('action.yes'));
- $mdDialog.show(confirm).then(function () {
- var tasks = [];
- for (var id in items.selections) {
- tasks.push(assetService.unassignAssetFromCustomer(id));
- }
- $q.all(tasks).then(function () {
- vm.grid.refreshList();
- });
- });
- }
-
- function makePublic($event, asset) {
- if ($event) {
- $event.stopPropagation();
- }
- var confirm = $mdDialog.confirm()
- .targetEvent($event)
- .title($translate.instant('asset.make-public-asset-title', {assetName: asset.name}))
- .htmlContent($translate.instant('asset.make-public-asset-text'))
- .ariaLabel($translate.instant('asset.make-public'))
- .cancel($translate.instant('action.no'))
- .ok($translate.instant('action.yes'));
- $mdDialog.show(confirm).then(function () {
- assetService.makeAssetPublic(asset.id.id).then(function success() {
- vm.grid.refreshList();
- });
- });
- }
-}
diff --git a/ui/src/app/asset/asset.directive.js b/ui/src/app/asset/asset.directive.js
deleted file mode 100644
index 2c2bd1f673..0000000000
--- a/ui/src/app/asset/asset.directive.js
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-/* eslint-disable import/no-unresolved, import/default */
-
-import assetFieldsetTemplate from './asset-fieldset.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-/*@ngInject*/
-export default function AssetDirective($compile, $templateCache, toast, $translate, types, assetService, customerService) {
- var linker = function (scope, element) {
- var template = $templateCache.get(assetFieldsetTemplate);
- element.html(template);
-
- scope.types = types;
- scope.isAssignedToCustomer = false;
- scope.isPublic = false;
- scope.assignedCustomer = null;
-
- scope.$watch('asset', function(newVal) {
- if (newVal) {
- if (scope.asset.customerId && scope.asset.customerId.id !== types.id.nullUid) {
- scope.isAssignedToCustomer = true;
- customerService.getShortCustomerInfo(scope.asset.customerId.id).then(
- function success(customer) {
- scope.assignedCustomer = customer;
- scope.isPublic = customer.isPublic;
- }
- );
- } else {
- scope.isAssignedToCustomer = false;
- scope.isPublic = false;
- scope.assignedCustomer = null;
- }
- }
- });
-
- scope.onAssetIdCopied = function() {
- toast.showSuccess($translate.instant('asset.idCopiedMessage'), 750, angular.element(element).parent().parent(), 'bottom left');
- };
-
-
- $compile(element.contents())(scope);
- }
- return {
- restrict: "E",
- link: linker,
- scope: {
- asset: '=',
- isEdit: '=',
- assetScope: '=',
- theForm: '=',
- onAssignToCustomer: '&',
- onMakePublic: '&',
- onUnassignFromCustomer: '&',
- onDeleteAsset: '&'
- }
- };
-}
diff --git a/ui/src/app/asset/asset.routes.js b/ui/src/app/asset/asset.routes.js
deleted file mode 100644
index cfc4e77315..0000000000
--- a/ui/src/app/asset/asset.routes.js
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-/* eslint-disable import/no-unresolved, import/default */
-
-import assetsTemplate from './assets.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-/*@ngInject*/
-export default function AssetRoutes($stateProvider, types) {
- $stateProvider
- .state('home.assets', {
- url: '/assets',
- params: {'topIndex': 0},
- module: 'private',
- auth: ['TENANT_ADMIN', 'CUSTOMER_USER'],
- views: {
- "content@home": {
- templateUrl: assetsTemplate,
- controller: 'AssetController',
- controllerAs: 'vm'
- }
- },
- data: {
- assetsType: 'tenant',
- searchEnabled: true,
- searchByEntitySubtype: true,
- searchEntityType: types.entityType.asset,
- pageTitle: 'asset.assets'
- },
- ncyBreadcrumb: {
- label: '{"icon": "domain", "label": "asset.assets"}'
- }
- })
- .state('home.customers.assets', {
- url: '/:customerId/assets',
- params: {'topIndex': 0},
- module: 'private',
- auth: ['TENANT_ADMIN'],
- views: {
- "content@home": {
- templateUrl: assetsTemplate,
- controllerAs: 'vm',
- controller: 'AssetController'
- }
- },
- data: {
- assetsType: 'customer',
- searchEnabled: true,
- searchByEntitySubtype: true,
- searchEntityType: types.entityType.asset,
- pageTitle: 'customer.assets'
- },
- ncyBreadcrumb: {
- label: '{"icon": "domain", "label": "{{ vm.customerAssetsTitle }}", "translate": "false"}'
- }
- });
-
-}
diff --git a/ui/src/app/asset/assets.tpl.html b/ui/src/app/asset/assets.tpl.html
deleted file mode 100644
index 7023c1104d..0000000000
--- a/ui/src/app/asset/assets.tpl.html
+++ /dev/null
@@ -1,75 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/ui/src/app/asset/assign-to-customer.controller.js b/ui/src/app/asset/assign-to-customer.controller.js
deleted file mode 100644
index b5d331c8af..0000000000
--- a/ui/src/app/asset/assign-to-customer.controller.js
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-/*@ngInject*/
-export default function AssignAssetToCustomerController(customerService, assetService, $mdDialog, $q, assetIds, customers) {
-
- var vm = this;
-
- vm.customers = customers;
- vm.searchText = '';
-
- vm.assign = assign;
- vm.cancel = cancel;
- vm.isCustomerSelected = isCustomerSelected;
- vm.hasData = hasData;
- vm.noData = noData;
- vm.searchCustomerTextUpdated = searchCustomerTextUpdated;
- vm.toggleCustomerSelection = toggleCustomerSelection;
-
- vm.theCustomers = {
- getItemAtIndex: function (index) {
- if (index > vm.customers.data.length) {
- vm.theCustomers.fetchMoreItems_(index);
- return null;
- }
- var item = vm.customers.data[index];
- if (item) {
- item.indexNumber = index + 1;
- }
- return item;
- },
-
- getLength: function () {
- if (vm.customers.hasNext) {
- return vm.customers.data.length + vm.customers.nextPageLink.limit;
- } else {
- return vm.customers.data.length;
- }
- },
-
- fetchMoreItems_: function () {
- if (vm.customers.hasNext && !vm.customers.pending) {
- vm.customers.pending = true;
- customerService.getCustomers(vm.customers.nextPageLink).then(
- function success(customers) {
- vm.customers.data = vm.customers.data.concat(customers.data);
- vm.customers.nextPageLink = customers.nextPageLink;
- vm.customers.hasNext = customers.hasNext;
- if (vm.customers.hasNext) {
- vm.customers.nextPageLink.limit = vm.customers.pageSize;
- }
- vm.customers.pending = false;
- },
- function fail() {
- vm.customers.hasNext = false;
- vm.customers.pending = false;
- });
- }
- }
- };
-
- function cancel() {
- $mdDialog.cancel();
- }
-
- function assign() {
- var tasks = [];
- for (var i=0;i 0;
- }
-
- function toggleCustomerSelection($event, customer) {
- $event.stopPropagation();
- if (vm.isCustomerSelected(customer)) {
- vm.customers.selection = null;
- } else {
- vm.customers.selection = customer;
- }
- }
-
- function isCustomerSelected(customer) {
- return vm.customers.selection != null && customer &&
- customer.id.id === vm.customers.selection.id.id;
- }
-
- function searchCustomerTextUpdated() {
- vm.customers = {
- pageSize: vm.customers.pageSize,
- data: [],
- nextPageLink: {
- limit: vm.customers.pageSize,
- textSearch: vm.searchText
- },
- selection: null,
- hasNext: true,
- pending: false
- };
- }
-}
diff --git a/ui/src/app/asset/assign-to-customer.tpl.html b/ui/src/app/asset/assign-to-customer.tpl.html
deleted file mode 100644
index 031fc9fd1e..0000000000
--- a/ui/src/app/asset/assign-to-customer.tpl.html
+++ /dev/null
@@ -1,76 +0,0 @@
-
-
-
-
\ No newline at end of file
diff --git a/ui/src/app/asset/index.js b/ui/src/app/asset/index.js
deleted file mode 100644
index c771826f61..0000000000
--- a/ui/src/app/asset/index.js
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright © 2016-2020 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 uiRouter from 'angular-ui-router';
-import thingsboardGrid from '../components/grid.directive';
-import thingsboardApiUser from '../api/user.service';
-import thingsboardApiAsset from '../api/asset.service';
-import thingsboardApiCustomer from '../api/customer.service';
-
-import AssetRoutes from './asset.routes';
-import {AssetController, AssetCardController} from './asset.controller';
-import AssignAssetToCustomerController from './assign-to-customer.controller';
-import AddAssetsToCustomerController from './add-assets-to-customer.controller';
-import AssetDirective from './asset.directive';
-
-export default angular.module('thingsboard.asset', [
- uiRouter,
- thingsboardGrid,
- thingsboardApiUser,
- thingsboardApiAsset,
- thingsboardApiCustomer
-])
- .config(AssetRoutes)
- .controller('AssetController', AssetController)
- .controller('AssetCardController', AssetCardController)
- .controller('AssignAssetToCustomerController', AssignAssetToCustomerController)
- .controller('AddAssetsToCustomerController', AddAssetsToCustomerController)
- .directive('tbAsset', AssetDirective)
- .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
deleted file mode 100644
index 88d5d00ef6..0000000000
--- a/ui/src/app/audit/audit-log-details-dialog.controller.js
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- * Copyright © 2016-2020 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 $ from 'jquery';
-import 'brace/ext/language_tools';
-import 'brace/ext/searchbox';
-import 'brace/mode/java';
-import 'brace/theme/github';
-
-/* eslint-disable angular/angularelement */
-
-import './audit-log-details-dialog.scss';
-
-/*@ngInject*/
-export default function AuditLogDetailsDialogController($mdDialog, types, auditLog, showingCallback) {
-
- var vm = this;
-
- showingCallback.onShowing = function(scope, element) {
- updateEditorSize(element, vm.actionData, 'tb-audit-log-action-data');
- vm.actionDataEditor.resize();
- if (vm.displayFailureDetails) {
- updateEditorSize(element, vm.actionFailureDetails, 'tb-audit-log-failure-details');
- vm.failureDetailsEditor.resize();
- }
- };
-
- vm.types = types;
- vm.auditLog = auditLog;
- vm.displayFailureDetails = auditLog.actionStatus == types.auditLogActionStatus.FAILURE.value;
- vm.actionData = auditLog.actionDataText;
- vm.actionFailureDetails = auditLog.actionFailureDetails;
-
- vm.actionDataContentOptions = {
- useWrapMode: false,
- mode: 'java',
- showGutter: false,
- showPrintMargin: false,
- theme: 'github',
- advanced: {
- enableSnippets: false,
- enableBasicAutocompletion: false,
- enableLiveAutocompletion: false
- },
- onLoad: function (_ace) {
- vm.actionDataEditor = _ace;
- }
- };
-
- vm.failureDetailsContentOptions = {
- useWrapMode: false,
- mode: 'java',
- showGutter: false,
- showPrintMargin: false,
- theme: 'github',
- advanced: {
- enableSnippets: false,
- enableBasicAutocompletion: false,
- enableLiveAutocompletion: false
- },
- onLoad: function (_ace) {
- vm.failureDetailsEditor = _ace;
- }
- };
-
- function updateEditorSize(element, content, editorId) {
- var newHeight = 200;
- var newWidth = 600;
- if (content && content.length > 0) {
- var lines = content.split('\n');
- newHeight = 16 * lines.length + 16;
- var maxLineLength = 0;
- for (var i in lines) {
- var line = lines[i].replace(/\t/g, ' ').replace(/\n/g, '');
- var lineLength = line.length;
- maxLineLength = Math.max(maxLineLength, lineLength);
- }
- newWidth = 8 * maxLineLength + 16;
- }
- $('#'+editorId, element).height(newHeight.toString() + "px").css('min-height', newHeight.toString() + "px")
- .width(newWidth.toString() + "px");
- }
-
- vm.close = close;
-
- function close () {
- $mdDialog.hide();
- }
-
-}
-
-/* eslint-enable angular/angularelement */
diff --git a/ui/src/app/audit/audit-log-details-dialog.scss b/ui/src/app/audit/audit-log-details-dialog.scss
deleted file mode 100644
index f2ec6e641b..0000000000
--- a/ui/src/app/audit/audit-log-details-dialog.scss
+++ /dev/null
@@ -1,23 +0,0 @@
-/**
- * Copyright © 2016-2020 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-audit-log-action-data,
-#tb-audit-log-failure-details {
- width: 100%;
- min-width: 400px;
- height: 100%;
- min-height: 50px;
- border: 1px solid #c0c0c0;
-}
diff --git a/ui/src/app/audit/audit-log-details-dialog.tpl.html b/ui/src/app/audit/audit-log-details-dialog.tpl.html
deleted file mode 100644
index 7201082477..0000000000
--- a/ui/src/app/audit/audit-log-details-dialog.tpl.html
+++ /dev/null
@@ -1,49 +0,0 @@
-
-
-
-
-
audit-log.audit-log-details
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {{ 'action.close' |
- translate }}
-
-
-
diff --git a/ui/src/app/audit/audit-log-header.directive.js b/ui/src/app/audit/audit-log-header.directive.js
deleted file mode 100644
index 56fd9638c2..0000000000
--- a/ui/src/app/audit/audit-log-header.directive.js
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-/* eslint-disable import/no-unresolved, import/default */
-
-import auditLogHeaderTemplate from './audit-log-header.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-/*@ngInject*/
-export default function AuditLogHeaderDirective($compile, $templateCache, types) {
-
- var linker = function (scope, element, attrs) {
-
- var template = $templateCache.get(auditLogHeaderTemplate);
- element.html(template);
- scope.auditLogMode = attrs.auditLogMode;
- scope.types = types;
- $compile(element.contents())(scope);
-
- };
-
- return {
- restrict: "A",
- replace: false,
- link: linker,
- scope: false
- };
-}
diff --git a/ui/src/app/audit/audit-log-header.tpl.html b/ui/src/app/audit/audit-log-header.tpl.html
deleted file mode 100644
index 6ff13a9bd3..0000000000
--- a/ui/src/app/audit/audit-log-header.tpl.html
+++ /dev/null
@@ -1,24 +0,0 @@
-
-audit-log.timestamp
-audit-log.entity-type
-audit-log.entity-name
-audit-log.user
-audit-log.type
-audit-log.status
-audit-log.details
diff --git a/ui/src/app/audit/audit-log-row.directive.js b/ui/src/app/audit/audit-log-row.directive.js
deleted file mode 100644
index 7e17a97ecf..0000000000
--- a/ui/src/app/audit/audit-log-row.directive.js
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-/* eslint-disable import/no-unresolved, import/default */
-
-import auditLogDetailsDialogTemplate from './audit-log-details-dialog.tpl.html';
-
-import auditLogRowTemplate from './audit-log-row.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-/*@ngInject*/
-export default function AuditLogRowDirective($compile, $templateCache, types, $mdDialog, $document) {
-
- var linker = function (scope, element, attrs) {
-
- var template = $templateCache.get(auditLogRowTemplate);
- element.html(template);
-
- scope.auditLog = attrs.auditLog;
- scope.auditLogMode = attrs.auditLogMode;
- scope.types = types;
-
- scope.showAuditLogDetails = function($event) {
- var onShowingCallback = {
- onShowing: function(){}
- }
- $mdDialog.show({
- controller: 'AuditLogDetailsDialogController',
- controllerAs: 'vm',
- templateUrl: auditLogDetailsDialogTemplate,
- locals: {
- auditLog: scope.auditLog,
- showingCallback: onShowingCallback
- },
- parent: angular.element($document[0].body),
- targetEvent: $event,
- fullscreen: true,
- multiple: true,
- onShowing: function(scope, element) {
- onShowingCallback.onShowing(scope, element);
- }
- });
- }
-
- $compile(element.contents())(scope);
- }
-
- return {
- restrict: "A",
- replace: false,
- link: linker,
- scope: false
- };
-}
diff --git a/ui/src/app/audit/audit-log-row.tpl.html b/ui/src/app/audit/audit-log-row.tpl.html
deleted file mode 100644
index c490b38d35..0000000000
--- a/ui/src/app/audit/audit-log-row.tpl.html
+++ /dev/null
@@ -1,36 +0,0 @@
-
-{{ auditLog.createdTime | date : 'yyyy-MM-dd HH:mm:ss' }}
-{{ auditLog.entityTypeText }}
-{{ auditLog.entityName }}
-{{ auditLog.userName }}
-{{ auditLog.actionTypeText }}
-{{ auditLog.actionStatusText }}
-
-
-
- {{ 'audit-log.details' | translate }}
-
-
- more_horiz
-
-
-
diff --git a/ui/src/app/audit/audit-log-table.directive.js b/ui/src/app/audit/audit-log-table.directive.js
deleted file mode 100644
index 1df16b88c5..0000000000
--- a/ui/src/app/audit/audit-log-table.directive.js
+++ /dev/null
@@ -1,262 +0,0 @@
-/*
- * Copyright © 2016-2020 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 './audit-log.scss';
-
-/* eslint-disable import/no-unresolved, import/default */
-
-import auditLogTableTemplate from './audit-log-table.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-/*@ngInject*/
-export default function AuditLogTableDirective($compile, $templateCache, $rootScope, $filter, $translate, types, auditLogService) {
-
- var linker = function (scope, element) {
-
- var template = $templateCache.get(auditLogTableTemplate);
-
- element.html(template);
-
- scope.types = types;
-
- var pageSize = 20;
- var startTime = 0;
- var endTime = 0;
-
- scope.timewindow = {
- history: {
- timewindowMs: 24 * 60 * 60 * 1000 // 1 day
- }
- }
-
- scope.topIndex = 0;
- scope.searchText = '';
-
- scope.theAuditLogs = {
- getItemAtIndex: function (index) {
- if (index > scope.auditLogs.filtered.length) {
- scope.theAuditLogs.fetchMoreItems_(index);
- return null;
- }
- return scope.auditLogs.filtered[index];
- },
-
- getLength: function () {
- if (scope.auditLogs.hasNext) {
- return scope.auditLogs.filtered.length + scope.auditLogs.nextPageLink.limit;
- } else {
- return scope.auditLogs.filtered.length;
- }
- },
-
- fetchMoreItems_: function () {
- if (scope.auditLogs.hasNext && !scope.auditLogs.pending) {
- var promise = getAuditLogsPromise(scope.auditLogs.nextPageLink);
- if (promise) {
- scope.auditLogs.pending = true;
- promise.then(
- function success(auditLogs) {
- scope.auditLogs.data = scope.auditLogs.data.concat(prepareAuditLogsData(auditLogs.data));
- scope.auditLogs.filtered = $filter('filter')(scope.auditLogs.data, {$: scope.searchText});
- scope.auditLogs.nextPageLink = auditLogs.nextPageLink;
- scope.auditLogs.hasNext = auditLogs.hasNext;
- if (scope.auditLogs.hasNext) {
- scope.auditLogs.nextPageLink.limit = pageSize;
- }
- scope.auditLogs.pending = false;
- },
- function fail() {
- scope.auditLogs.hasNext = false;
- scope.auditLogs.pending = false;
- });
- } else {
- scope.auditLogs.hasNext = false;
- }
- }
- }
- };
-
- function prepareAuditLogsData(data) {
- data.forEach(
- auditLog => {
- auditLog.entityTypeText = $translate.instant(types.entityTypeTranslations[auditLog.entityId.entityType].type);
- auditLog.actionTypeText = $translate.instant(types.auditLogActionType[auditLog.actionType].name);
- auditLog.actionStatusText = $translate.instant(types.auditLogActionStatus[auditLog.actionStatus].name);
- auditLog.actionDataText = auditLog.actionData ? angular.toJson(auditLog.actionData, true) : '';
- }
- );
- return data;
- }
-
- scope.$watch("entityId", function(newVal, prevVal) {
- if (newVal && !angular.equals(newVal, prevVal)) {
- resetFilter();
- scope.reload();
- }
- });
-
- scope.$watch("userId", function(newVal, prevVal) {
- if (newVal && !angular.equals(newVal, prevVal)) {
- resetFilter();
- scope.reload();
- }
- });
-
- scope.$watch("customerId", function(newVal, prevVal) {
- if (newVal && !angular.equals(newVal, prevVal)) {
- resetFilter();
- scope.reload();
- }
- });
-
- function getAuditLogsPromise(pageLink) {
- switch(scope.auditLogMode) {
- case types.auditLogMode.tenant:
- return auditLogService.getAuditLogs(pageLink);
- case types.auditLogMode.entity:
- if (scope.entityType && scope.entityId) {
- return auditLogService.getAuditLogsByEntityId(scope.entityType, scope.entityId,
- pageLink);
- } else {
- return null;
- }
- case types.auditLogMode.user:
- if (scope.userId) {
- return auditLogService.getAuditLogsByUserId(scope.userId, pageLink);
- } else {
- return null;
- }
- case types.auditLogMode.customer:
- if (scope.customerId) {
- return auditLogService.getAuditLogsByCustomerId(scope.customerId, pageLink);
- } else {
- return null;
- }
- }
- }
-
- function destroyWatchers() {
- if (scope.timewindowWatchHandle) {
- scope.timewindowWatchHandle();
- scope.timewindowWatchHandle = null;
- }
- if (scope.searchTextWatchHandle) {
- scope.searchTextWatchHandle();
- scope.searchTextWatchHandle = null;
- }
- }
-
- function initWatchers() {
- scope.timewindowWatchHandle = scope.$watch("timewindow", function(newVal, prevVal) {
- if (newVal && !angular.equals(newVal, prevVal)) {
- scope.reload();
- }
- }, true);
-
- scope.searchTextWatchHandle = scope.$watch("searchText", function(newVal, prevVal) {
- if (!angular.equals(newVal, prevVal)) {
- scope.searchTextUpdated();
- }
- }, true);
- }
-
- function resetFilter() {
- destroyWatchers();
- scope.timewindow = {
- history: {
- timewindowMs: 24 * 60 * 60 * 1000 // 1 day
- }
- };
- scope.searchText = '';
- initWatchers();
- }
-
- function updateTimeWindowRange () {
- if (scope.timewindow.history.timewindowMs) {
- var currentTime = (new Date).getTime();
- startTime = currentTime - scope.timewindow.history.timewindowMs;
- endTime = currentTime;
- } else {
- startTime = scope.timewindow.history.fixedTimewindow.startTimeMs;
- endTime = scope.timewindow.history.fixedTimewindow.endTimeMs;
- }
- }
-
- scope.reload = function() {
- scope.topIndex = 0;
- updateTimeWindowRange();
- scope.auditLogs = {
- data: [],
- filtered: [],
- nextPageLink: {
- limit: pageSize,
- startTime: startTime,
- endTime: endTime
- },
- hasNext: true,
- pending: false
- };
- scope.theAuditLogs.getItemAtIndex(pageSize);
- }
-
- scope.searchTextUpdated = function() {
- scope.auditLogs.filtered = $filter('filter')(scope.auditLogs.data, {$: scope.searchText});
- scope.theAuditLogs.getItemAtIndex(pageSize);
- }
-
- scope.noData = function() {
- return scope.auditLogs.data.length == 0 && !scope.auditLogs.hasNext;
- }
-
- scope.hasData = function() {
- return scope.auditLogs.data.length > 0;
- }
-
- scope.loading = function() {
- return $rootScope.loading;
- }
-
- scope.hasScroll = function() {
- var repeatContainer = scope.repeatContainer[0];
- if (repeatContainer) {
- var scrollElement = repeatContainer.children[0];
- if (scrollElement) {
- return scrollElement.scrollHeight > scrollElement.clientHeight;
- }
- }
- return false;
- }
-
- scope.reload();
-
- initWatchers();
-
- $compile(element.contents())(scope);
- }
-
- return {
- restrict: "E",
- link: linker,
- scope: {
- entityType: '=?',
- entityId: '=?',
- userId: '=?',
- customerId: '=?',
- auditLogMode: '@',
- pageMode: '@?'
- }
- };
-}
diff --git a/ui/src/app/audit/audit-log-table.tpl.html b/ui/src/app/audit/audit-log-table.tpl.html
deleted file mode 100644
index b2fb4f8594..0000000000
--- a/ui/src/app/audit/audit-log-table.tpl.html
+++ /dev/null
@@ -1,68 +0,0 @@
-
-
-
-
-
-
-
-
-
- audit-log.no-audit-logs-prompt
-
-
-
-
-
-
-
-
-
-
-
diff --git a/ui/src/app/audit/audit-log.routes.js b/ui/src/app/audit/audit-log.routes.js
deleted file mode 100644
index 762f4395ad..0000000000
--- a/ui/src/app/audit/audit-log.routes.js
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-/* eslint-disable import/no-unresolved, import/default */
-
-import auditLogsTemplate from './audit-logs.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-/*@ngInject*/
-export default function AuditLogRoutes($stateProvider) {
- $stateProvider
- .state('home.auditLogs', {
- url: '/auditLogs',
- module: 'private',
- auth: ['TENANT_ADMIN'],
- views: {
- "content@home": {
- templateUrl: auditLogsTemplate,
- controller: 'AuditLogsController',
- controllerAs: 'vm'
- }
- },
- data: {
- searchEnabled: false,
- pageTitle: 'audit-log.audit-logs'
- },
- ncyBreadcrumb: {
- label: '{"icon": "track_changes", "label": "audit-log.audit-logs"}'
- }
- });
-}
diff --git a/ui/src/app/audit/audit-log.scss b/ui/src/app/audit/audit-log.scss
deleted file mode 100644
index 728b77b254..0000000000
--- a/ui/src/app/audit/audit-log.scss
+++ /dev/null
@@ -1,92 +0,0 @@
-/**
- * Copyright © 2016-2020 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-audit-logs {
- background-color: #fff;
-
- .tb-audit-log-margin-18px {
- margin-bottom: 18px;
- }
-
- .tb-audit-log-toolbar {
- font-size: 20px;
- }
-
- md-input-container.tb-audit-log-search-input {
- .md-errors-spacer {
- min-height: 0;
- }
- }
-}
-
-.tb-audit-log-container {
- overflow-x: auto;
-}
-
-md-list.tb-audit-log-table {
- min-width: 700px;
- padding: 0;
-
- &.tb-audit-log-table-full {
- min-width: 900px;
- }
-
- md-list-item {
- padding: 0;
- }
-
- .tb-row {
- height: 48px;
- padding: 0;
- overflow: hidden;
- }
-
- .tb-row:hover {
- background-color: #eee;
- }
-
- .tb-header:hover {
- background: none;
- }
-
- .tb-header {
- .tb-cell {
- font-size: 12px;
- font-weight: 700;
- color: rgba(0, 0, 0, .54);
- white-space: nowrap;
- background: none;
- }
- }
-
- .tb-cell {
- padding: 0 24px;
- margin: auto 0;
- overflow: hidden;
- font-size: 13px;
- color: rgba(0, 0, 0, .87);
- text-align: left;
- vertical-align: middle;
-
- .md-button {
- padding: 0;
- margin: 0;
- }
- }
-
- .tb-cell.tb-number {
- text-align: right;
- }
-}
diff --git a/ui/src/app/audit/audit-logs.controller.js b/ui/src/app/audit/audit-logs.controller.js
deleted file mode 100644
index 94df0a5e08..0000000000
--- a/ui/src/app/audit/audit-logs.controller.js
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-/*@ngInject*/
-export default function AuditLogsController(types) {
-
- var vm = this;
-
- vm.types = types;
-
-}
\ No newline at end of file
diff --git a/ui/src/app/audit/audit-logs.tpl.html b/ui/src/app/audit/audit-logs.tpl.html
deleted file mode 100644
index 0a3d377989..0000000000
--- a/ui/src/app/audit/audit-logs.tpl.html
+++ /dev/null
@@ -1,22 +0,0 @@
-
-
-
diff --git a/ui/src/app/audit/index.js b/ui/src/app/audit/index.js
deleted file mode 100644
index e2e29ea193..0000000000
--- a/ui/src/app/audit/index.js
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright © 2016-2020 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 AuditLogRoutes from './audit-log.routes';
-import AuditLogsController from './audit-logs.controller';
-import AuditLogDetailsDialogController from './audit-log-details-dialog.controller';
-import AuditLogHeaderDirective from './audit-log-header.directive';
-import AuditLogRowDirective from './audit-log-row.directive';
-import AuditLogTableDirective from './audit-log-table.directive';
-
-export default angular.module('thingsboard.auditLog', [])
- .config(AuditLogRoutes)
- .controller('AuditLogsController', AuditLogsController)
- .controller('AuditLogDetailsDialogController', AuditLogDetailsDialogController)
- .directive('tbAuditLogHeader', AuditLogHeaderDirective)
- .directive('tbAuditLogRow', AuditLogRowDirective)
- .directive('tbAuditLogTable', AuditLogTableDirective)
- .name;
diff --git a/ui/src/app/common/dashboard-utils.service.js b/ui/src/app/common/dashboard-utils.service.js
deleted file mode 100644
index fcad288865..0000000000
--- a/ui/src/app/common/dashboard-utils.service.js
+++ /dev/null
@@ -1,566 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-export default angular.module('thingsboard.dashboardUtils', [])
- .factory('dashboardUtils', DashboardUtils)
- .name;
-
-/*@ngInject*/
-function DashboardUtils(types, utils, timeService) {
-
- var service = {
- validateAndUpdateDashboard: validateAndUpdateDashboard,
- validateAndUpdateWidget: validateAndUpdateWidget,
- getRootStateId: getRootStateId,
- createSingleWidgetDashboard: createSingleWidgetDashboard,
- createSingleEntityFilter: createSingleEntityFilter,
- getStateLayoutsData: getStateLayoutsData,
- createDefaultState: createDefaultState,
- createDefaultLayoutData: createDefaultLayoutData,
- setLayouts: setLayouts,
- updateLayoutSettings: updateLayoutSettings,
- addWidgetToLayout: addWidgetToLayout,
- removeWidgetFromLayout: removeWidgetFromLayout,
- isSingleLayoutDashboard: isSingleLayoutDashboard,
- removeUnusedWidgets: removeUnusedWidgets,
- getWidgetsArray: getWidgetsArray
- };
-
- return service;
-
- function validateAndUpdateEntityAliases(configuration, datasourcesByAliasId, targetDevicesByAliasId) {
- var aliasId, entityAlias;
- if (angular.isUndefined(configuration.entityAliases)) {
- configuration.entityAliases = {};
- if (configuration.deviceAliases) {
- var deviceAliases = configuration.deviceAliases;
- for (aliasId in deviceAliases) {
- var deviceAlias = deviceAliases[aliasId];
- entityAlias = validateAndUpdateDeviceAlias(aliasId, deviceAlias, datasourcesByAliasId, targetDevicesByAliasId);
- configuration.entityAliases[entityAlias.id] = entityAlias;
- }
- delete configuration.deviceAliases;
- }
- } else {
- var entityAliases = configuration.entityAliases;
- for (aliasId in entityAliases) {
- entityAlias = entityAliases[aliasId];
- entityAlias = validateAndUpdateEntityAlias(aliasId, entityAlias, datasourcesByAliasId, targetDevicesByAliasId);
- if (aliasId != entityAlias.id) {
- delete entityAliases[aliasId];
- }
- entityAliases[entityAlias.id] = entityAlias;
- }
- }
- return configuration;
- }
-
- function validateAliasId(aliasId, datasourcesByAliasId, targetDevicesByAliasId) {
- if (!aliasId || !angular.isString(aliasId) || aliasId.length != 36) {
- var newAliasId = utils.guid();
- var aliasDatasources = datasourcesByAliasId[aliasId];
- if (aliasDatasources) {
- aliasDatasources.forEach(
- function(datasource) {
- datasource.entityAliasId = newAliasId;
- }
- );
- }
- var targetDeviceAliasIdsList = targetDevicesByAliasId[aliasId];
- if (targetDeviceAliasIdsList) {
- targetDeviceAliasIdsList.forEach(
- function(targetDeviceAliasIds) {
- targetDeviceAliasIds[0] = newAliasId;
- }
- );
- }
- return newAliasId;
- } else {
- return aliasId;
- }
- }
-
- function validateAndUpdateDeviceAlias(aliasId, deviceAlias, datasourcesByAliasId, targetDevicesByAliasId) {
- aliasId = validateAliasId(aliasId, datasourcesByAliasId, targetDevicesByAliasId);
- var alias = deviceAlias.alias;
- var entityAlias = {
- id: aliasId,
- alias: alias,
- filter: {
- type: null,
- entityType: types.entityType.device,
- resolveMultiple: false
- },
- }
- if (deviceAlias.deviceFilter) {
- entityAlias.filter.type =
- deviceAlias.deviceFilter.useFilter ? types.aliasFilterType.entityName.value : types.aliasFilterType.entityList.value;
- if (entityAlias.filter.type == types.aliasFilterType.entityList.value) {
- entityAlias.filter.entityList = deviceAlias.deviceFilter.deviceList;
- } else {
- entityAlias.filter.entityNameFilter = deviceAlias.deviceFilter.deviceNameFilter;
- }
- } else {
- entityAlias.filter.type = types.aliasFilterType.entityList.value;
- entityAlias.filter.entityList = [deviceAlias.deviceId];
- }
- return entityAlias;
- }
-
- function validateAndUpdateEntityAlias(aliasId, entityAlias, datasourcesByAliasId, targetDevicesByAliasId) {
- entityAlias.id = validateAliasId(aliasId, datasourcesByAliasId, targetDevicesByAliasId);
- if (!entityAlias.filter) {
- entityAlias.filter = {
- type: entityAlias.entityFilter.useFilter ? types.aliasFilterType.entityName.value : types.aliasFilterType.entityList.value,
- entityType: entityAlias.entityType,
- resolveMultiple: false
- }
- if (entityAlias.filter.type == types.aliasFilterType.entityList.value) {
- entityAlias.filter.entityList = entityAlias.entityFilter.entityList;
- } else {
- entityAlias.filter.entityNameFilter = entityAlias.entityFilter.entityNameFilter;
- }
- delete entityAlias.entityType;
- delete entityAlias.entityFilter;
- }
- return entityAlias;
- }
-
- function validateAndUpdateWidget(widget) {
- if (!widget.config) {
- widget.config = {};
- }
- if (!widget.config.datasources) {
- widget.config.datasources = [];
- }
- widget.config.datasources.forEach(function(datasource) {
- if (datasource.type === 'device') {
- datasource.type = types.datasourceType.entity;
- }
- if (datasource.deviceAliasId) {
- datasource.entityAliasId = datasource.deviceAliasId;
- delete datasource.deviceAliasId;
- }
- });
- //TODO: Temp workaround
- if (widget.isSystemType && widget.bundleAlias == 'charts' && widget.typeAlias == 'timeseries') {
- widget.typeAlias = 'basic_timeseries';
- }
- return widget;
- }
-
- function createDefaultLayoutData() {
- return {
- widgets: {},
- gridSettings: {
- backgroundColor: '#eeeeee',
- color: 'rgba(0,0,0,0.870588)',
- columns: 24,
- margins: [10, 10],
- backgroundSizeMode: '100%'
- }
- };
- }
-
- function createDefaultLayouts() {
- return {
- 'main': createDefaultLayoutData()
- };
- }
-
- function createDefaultState(name, root) {
- return {
- name: name,
- root: root,
- layouts: createDefaultLayouts()
- }
- }
-
- function validateAndUpdateDashboard(dashboard) {
- if (!dashboard.configuration) {
- dashboard.configuration = {};
- }
- if (angular.isUndefined(dashboard.configuration.widgets)) {
- dashboard.configuration.widgets = {};
- } else if (angular.isArray(dashboard.configuration.widgets)) {
- var widgetsMap = {};
- dashboard.configuration.widgets.forEach(function (widget) {
- if (!widget.id) {
- widget.id = utils.guid();
- }
- widgetsMap[widget.id] = widget;
- });
- dashboard.configuration.widgets = widgetsMap;
- }
- for (var id in dashboard.configuration.widgets) {
- var widget = dashboard.configuration.widgets[id];
- dashboard.configuration.widgets[id] = validateAndUpdateWidget(widget);
- }
- if (angular.isUndefined(dashboard.configuration.states)) {
- dashboard.configuration.states = {
- 'default': createDefaultState(dashboard.title, true)
- };
-
- var mainLayout = dashboard.configuration.states['default'].layouts['main'];
- for (id in dashboard.configuration.widgets) {
- widget = dashboard.configuration.widgets[id];
- mainLayout.widgets[id] = {
- sizeX: widget.sizeX,
- sizeY: widget.sizeY,
- row: widget.row,
- col: widget.col,
- };
- if (angular.isDefined(widget.config.mobileHeight)) {
- mainLayout.widgets[id].mobileHeight = widget.config.mobileHeight;
- }
- if (angular.isDefined(widget.config.mobileOrder)) {
- mainLayout.widgets[id].mobileOrder = widget.config.mobileOrder;
- }
- }
- } else {
- var states = dashboard.configuration.states;
- var rootFound = false;
- for (var stateId in states) {
- var state = states[stateId];
- if (angular.isUndefined(state.root)) {
- state.root = false;
- } else if (state.root) {
- rootFound = true;
- }
- }
- if (!rootFound) {
- var firstStateId = Object.keys(states)[0];
- states[firstStateId].root = true;
- }
- }
-
- var datasourcesByAliasId = {};
- var targetDevicesByAliasId = {};
- for (var widgetId in dashboard.configuration.widgets) {
- widget = dashboard.configuration.widgets[widgetId];
- widget.config.datasources.forEach(function (datasource) {
- if (datasource.entityAliasId) {
- var aliasId = datasource.entityAliasId;
- var aliasDatasources = datasourcesByAliasId[aliasId];
- if (!aliasDatasources) {
- aliasDatasources = [];
- datasourcesByAliasId[aliasId] = aliasDatasources;
- }
- aliasDatasources.push(datasource);
- }
- });
- if (widget.config.targetDeviceAliasIds && widget.config.targetDeviceAliasIds.length) {
- var aliasId = widget.config.targetDeviceAliasIds[0];
- var targetDeviceAliasIdsList = targetDevicesByAliasId[aliasId];
- if (!targetDeviceAliasIdsList) {
- targetDeviceAliasIdsList = [];
- targetDevicesByAliasId[aliasId] = targetDeviceAliasIdsList;
- }
- targetDeviceAliasIdsList.push(widget.config.targetDeviceAliasIds);
- }
- }
-
- dashboard.configuration = validateAndUpdateEntityAliases(dashboard.configuration, datasourcesByAliasId, targetDevicesByAliasId);
-
- if (angular.isUndefined(dashboard.configuration.timewindow)) {
- dashboard.configuration.timewindow = timeService.defaultTimewindow();
- }
- if (angular.isUndefined(dashboard.configuration.settings)) {
- dashboard.configuration.settings = {};
- dashboard.configuration.settings.stateControllerId = 'entity';
- dashboard.configuration.settings.showTitle = false;
- dashboard.configuration.settings.showDashboardsSelect = true;
- dashboard.configuration.settings.showEntitiesSelect = true;
- dashboard.configuration.settings.showDashboardTimewindow = true;
- dashboard.configuration.settings.showDashboardExport = true;
- dashboard.configuration.settings.toolbarAlwaysOpen = true;
- } else {
- if (angular.isUndefined(dashboard.configuration.settings.stateControllerId)) {
- dashboard.configuration.settings.stateControllerId = 'entity';
- }
- }
- if (angular.isDefined(dashboard.configuration.gridSettings)) {
- var gridSettings = dashboard.configuration.gridSettings;
- if (angular.isDefined(gridSettings.showTitle)) {
- dashboard.configuration.settings.showTitle = gridSettings.showTitle;
- delete gridSettings.showTitle;
- }
- if (angular.isDefined(gridSettings.titleColor)) {
- dashboard.configuration.settings.titleColor = gridSettings.titleColor;
- delete gridSettings.titleColor;
- }
- if (angular.isDefined(gridSettings.showDevicesSelect)) {
- dashboard.configuration.settings.showEntitiesSelect = gridSettings.showDevicesSelect;
- delete gridSettings.showDevicesSelect;
- }
- if (angular.isDefined(gridSettings.showEntitiesSelect)) {
- dashboard.configuration.settings.showEntitiesSelect = gridSettings.showEntitiesSelect;
- delete gridSettings.showEntitiesSelect;
- }
- if (angular.isDefined(gridSettings.showDashboardTimewindow)) {
- dashboard.configuration.settings.showDashboardTimewindow = gridSettings.showDashboardTimewindow;
- delete gridSettings.showDashboardTimewindow;
- }
- if (angular.isDefined(gridSettings.showDashboardExport)) {
- dashboard.configuration.settings.showDashboardExport = gridSettings.showDashboardExport;
- delete gridSettings.showDashboardExport;
- }
- dashboard.configuration.states['default'].layouts['main'].gridSettings = gridSettings;
- delete dashboard.configuration.gridSettings;
- }
- return dashboard;
- }
-
- function getRootStateId(states) {
- for (var stateId in states) {
- var state = states[stateId];
- if (state.root) {
- return stateId;
- }
- }
- return Object.keys(states)[0];
- }
-
- function createSingleWidgetDashboard(widget) {
- if (!widget.id) {
- widget.id = utils.guid();
- }
- var dashboard = {};
- dashboard = validateAndUpdateDashboard(dashboard);
- dashboard.configuration.widgets[widget.id] = widget;
- dashboard.configuration.states['default'].layouts['main'].widgets[widget.id] = {
- sizeX: widget.sizeX,
- sizeY: widget.sizeY,
- row: widget.row,
- col: widget.col,
- };
- return dashboard;
- }
-
- function createSingleEntityFilter(entityType, entityId) {
- return {
- type: types.aliasFilterType.singleEntity.value,
- singleEntity: { entityType: entityType, id: entityId },
- resolveMultiple: false
- };
- }
-
- function getStateLayoutsData(dashboard, targetState) {
- var dashboardConfiguration = dashboard.configuration;
- var states = dashboardConfiguration.states;
- var state = states[targetState];
- if (state) {
- var allWidgets = dashboardConfiguration.widgets;
- var result = {};
- for (var l in state.layouts) {
- var layout = state.layouts[l];
- if (layout) {
- result[l] = {
- widgets: [],
- widgetLayouts: {},
- gridSettings: {}
- }
- for (var id in layout.widgets) {
- result[l].widgets.push(allWidgets[id]);
- }
- result[l].widgetLayouts = layout.widgets;
- result[l].gridSettings = layout.gridSettings;
- }
- }
- return result;
- } else {
- return null;
- }
- }
-
- function setLayouts(dashboard, targetState, newLayouts) {
- var dashboardConfiguration = dashboard.configuration;
- var states = dashboardConfiguration.states;
- var state = states[targetState];
- var addedCount = 0;
- var removedCount = 0;
- for (var l in state.layouts) {
- if (!newLayouts[l]) {
- removedCount++;
- }
- }
- for (l in newLayouts) {
- if (!state.layouts[l]) {
- addedCount++;
- }
- }
- state.layouts = newLayouts;
- var layoutsCount = Object.keys(state.layouts).length;
- var newColumns;
- if (addedCount) {
- for (l in state.layouts) {
- newColumns = state.layouts[l].gridSettings.columns * (layoutsCount - addedCount) / layoutsCount;
- state.layouts[l].gridSettings.columns = newColumns;
- }
- }
- if (removedCount) {
- for (l in state.layouts) {
- newColumns = state.layouts[l].gridSettings.columns * (layoutsCount + removedCount) / layoutsCount;
- state.layouts[l].gridSettings.columns = newColumns;
- }
- }
- removeUnusedWidgets(dashboard);
- }
-
- function updateLayoutSettings(layout, gridSettings) {
- var prevGridSettings = layout.gridSettings;
- var prevColumns = prevGridSettings ? prevGridSettings.columns : 24;
- var ratio = gridSettings.columns / prevColumns;
- layout.gridSettings = gridSettings;
- var maxRow = 0;
- for (var w in layout.widgets) {
- var widget = layout.widgets[w];
- maxRow = Math.max(maxRow, widget.row + widget.sizeY);
- }
- var newMaxRow = Math.round(maxRow * ratio);
- for (w in layout.widgets) {
- widget = layout.widgets[w];
- if (widget.row + widget.sizeY == maxRow) {
- widget.row = Math.round(widget.row * ratio);
- widget.sizeY = newMaxRow - widget.row;
- } else {
- widget.row = Math.round(widget.row * ratio);
- widget.sizeY = Math.round(widget.sizeY * ratio);
- }
- widget.sizeX = Math.round(widget.sizeX * ratio);
- widget.col = Math.round(widget.col * ratio);
- if (widget.col + widget.sizeX > gridSettings.columns) {
- widget.sizeX = gridSettings.columns - widget.col;
- }
- }
- }
-
- function addWidgetToLayout(dashboard, targetState, targetLayout, widget, originalColumns, originalSize, row, column) {
- var dashboardConfiguration = dashboard.configuration;
- var states = dashboardConfiguration.states;
- var state = states[targetState];
- var layout = state.layouts[targetLayout];
- var layoutCount = Object.keys(state.layouts).length;
- if (!widget.id) {
- widget.id = utils.guid();
- }
- if (!dashboardConfiguration.widgets[widget.id]) {
- dashboardConfiguration.widgets[widget.id] = widget;
- }
- var widgetLayout = {
- sizeX: originalSize ? originalSize.sizeX : widget.sizeX,
- sizeY: originalSize ? originalSize.sizeY : widget.sizeY,
- mobileOrder: widget.config.mobileOrder,
- mobileHeight: widget.config.mobileHeight
- };
-
- if (angular.isUndefined(originalColumns)) {
- originalColumns = 24;
- }
-
- var gridSettings = layout.gridSettings;
- var columns = 24;
- if (gridSettings && gridSettings.columns) {
- columns = gridSettings.columns;
- }
-
- columns = columns * layoutCount;
-
- if (columns != originalColumns) {
- var ratio = columns / originalColumns;
- widgetLayout.sizeX *= ratio;
- widgetLayout.sizeY *= ratio;
- }
-
- if (row > -1 && column > - 1) {
- widgetLayout.row = row;
- widgetLayout.col = column;
- } else {
- row = 0;
- for (var w in layout.widgets) {
- var existingLayout = layout.widgets[w];
- var wRow = existingLayout.row ? existingLayout.row : 0;
- var wSizeY = existingLayout.sizeY ? existingLayout.sizeY : 1;
- var bottom = wRow + wSizeY;
- row = Math.max(row, bottom);
- }
- widgetLayout.row = row;
- widgetLayout.col = 0;
- }
-
- layout.widgets[widget.id] = widgetLayout;
- }
-
- function removeWidgetFromLayout(dashboard, targetState, targetLayout, widgetId) {
- var dashboardConfiguration = dashboard.configuration;
- var states = dashboardConfiguration.states;
- var state = states[targetState];
- var layout = state.layouts[targetLayout];
- delete layout.widgets[widgetId];
- removeUnusedWidgets(dashboard);
- }
-
- function isSingleLayoutDashboard(dashboard) {
- var dashboardConfiguration = dashboard.configuration;
- var states = dashboardConfiguration.states;
- var stateKeys = Object.keys(states);
- if (stateKeys.length === 1) {
- var state = states[stateKeys[0]];
- var layouts = state.layouts;
- var layoutKeys = Object.keys(layouts);
- if (layoutKeys.length === 1) {
- return {
- state: stateKeys[0],
- layout: layoutKeys[0]
- }
- }
- }
- return null;
- }
-
- function removeUnusedWidgets(dashboard) {
- var dashboardConfiguration = dashboard.configuration;
- var states = dashboardConfiguration.states;
- var widgets = dashboardConfiguration.widgets;
- for (var widgetId in widgets) {
- var found = false;
- for (var s in states) {
- var state = states[s];
- for (var l in state.layouts) {
- var layout = state.layouts[l];
- if (layout.widgets[widgetId]) {
- found = true;
- break;
- }
- }
- }
- if (!found) {
- delete dashboardConfiguration.widgets[widgetId];
- }
-
- }
- }
-
- function getWidgetsArray(dashboard) {
- var widgetsArray = [];
- var dashboardConfiguration = dashboard.configuration;
- var widgets = dashboardConfiguration.widgets;
- for (var widgetId in widgets) {
- var widget = widgets[widgetId];
- widgetsArray.push(widget);
- }
- return widgetsArray;
- }
-}
diff --git a/ui/src/app/common/raf.provider.js b/ui/src/app/common/raf.provider.js
deleted file mode 100644
index f0859d9c4f..0000000000
--- a/ui/src/app/common/raf.provider.js
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-export default angular.module('thingsboard.raf', [])
- .provider('tbRaf', TbRAFProvider)
- .name;
-
-function TbRAFProvider() {
- /*@ngInject*/
- this.$get = function($window, $timeout) {
- var requestAnimationFrame = $window.requestAnimationFrame ||
- $window.webkitRequestAnimationFrame;
-
- var cancelAnimationFrame = $window.cancelAnimationFrame ||
- $window.webkitCancelAnimationFrame ||
- $window.webkitCancelRequestAnimationFrame;
-
- var rafSupported = !!requestAnimationFrame;
- var raf = rafSupported
- ? function(fn) {
- var id = requestAnimationFrame(fn);
- return function() {
- cancelAnimationFrame(id);
- };
- }
- : function(fn) {
- var timer = $timeout(fn, 16.66, false);
- return function() {
- $timeout.cancel(timer);
- };
- };
-
- raf.supported = rafSupported;
-
- return raf;
- };
-}
diff --git a/ui/src/app/common/thirdparty-fix.js b/ui/src/app/common/thirdparty-fix.js
deleted file mode 100644
index 3176ca1295..0000000000
--- a/ui/src/app/common/thirdparty-fix.js
+++ /dev/null
@@ -1,458 +0,0 @@
-/*
- * Copyright © 2016-2020 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 tinycolor from 'tinycolor2';
-import moment from 'moment';
-
-export default angular.module('thingsboard.thirdpartyFix', [])
- .factory('Fullscreen', Fullscreen)
- .factory('$mdColorPicker', mdColorPicker)
- .provider('$mdpDatePicker', mdpDatePicker)
- .provider('$mdpTimePicker', mdpTimePicker)
- .name;
-
-/*@ngInject*/
-function Fullscreen($document, $rootScope) {
-
- /* eslint-disable */
-
- var document = $document[0];
-
- // ensure ALLOW_KEYBOARD_INPUT is available and enabled
- var isKeyboardAvailbleOnFullScreen = (typeof Element !== 'undefined' && 'ALLOW_KEYBOARD_INPUT' in Element) && Element.ALLOW_KEYBOARD_INPUT;
-
- var emitter = $rootScope.$new();
-
- // listen event on document instead of element to avoid firefox limitation
- // see https://developer.mozilla.org/en-US/docs/Web/Guide/API/DOM/Using_full_screen_mode
- $document.on('fullscreenchange webkitfullscreenchange mozfullscreenchange MSFullscreenChange', function(){
- emitter.$emit('FBFullscreen.change', serviceInstance.isEnabled());
- });
-
- var serviceInstance = {
- $on: angular.bind(emitter, emitter.$on),
- all: function() {
- serviceInstance.enable( document.documentElement );
- },
- enable: function(element) {
- if(element.requestFullScreen) {
- element.requestFullScreen();
- } else if(element.mozRequestFullScreen) {
- element.mozRequestFullScreen();
- } else if(element.webkitRequestFullscreen) {
- // Safari temporary fix
- //if (/Version\/[\d]{1,2}(\.[\d]{1,2}){1}(\.(\d){1,2}){0,1} Safari/.test(navigator.userAgent)) {
- if (/Safari/.test(navigator.userAgent)) {
- element.webkitRequestFullscreen();
- } else {
- element.webkitRequestFullscreen(isKeyboardAvailbleOnFullScreen);
- }
- } else if (element.msRequestFullscreen) {
- element.msRequestFullscreen();
- }
- },
- cancel: function() {
- if(document.cancelFullScreen) {
- document.cancelFullScreen();
- } else if(document.mozCancelFullScreen) {
- document.mozCancelFullScreen();
- } else if(document.webkitExitFullscreen) {
- document.webkitExitFullscreen();
- } else if (document.msExitFullscreen) {
- document.msExitFullscreen();
- }
- },
- isEnabled: function(){
- var fullscreenElement = document.fullscreenElement || document.mozFullScreenElement || document.webkitFullscreenElement || document.msFullscreenElement;
- return fullscreenElement ? true : false;
- },
- toggleAll: function(){
- serviceInstance.isEnabled() ? serviceInstance.cancel() : serviceInstance.all();
- },
- isSupported: function(){
- var docElm = document.documentElement;
- var requestFullscreen = docElm.requestFullScreen || docElm.mozRequestFullScreen || docElm.webkitRequestFullscreen || docElm.msRequestFullscreen;
- return requestFullscreen ? true : false;
- }
- };
-
- /* eslint-enable */
-
- return serviceInstance;
-}
-
-/*@ngInject*/
-function mdColorPicker($q, $mdDialog, mdColorPickerHistory) {
- var dialog;
-
- /* eslint-disable angular/definedundefined */
-
- return {
- show: function (options)
- {
- if ( options === undefined ) {
- options = {};
- }
- //console.log( 'DIALOG OPTIONS', options );
- // Defaults
- // Dialog Properties
- options.hasBackdrop = options.hasBackdrop === undefined ? true : options.hasBackdrop;
- options.clickOutsideToClose = options.clickOutsideToClose === undefined ? true : options.clickOutsideToClose;
- options.defaultValue = options.defaultValue === undefined ? '#FFFFFF' : options.defaultValue;
- options.focusOnOpen = options.focusOnOpen === undefined ? false : options.focusOnOpen;
- options.preserveScope = options.preserveScope === undefined ? true : options.preserveScope;
- if (options.skipHide !== undefined) {
- options.multiple = options.skipHide;
- }
- if (options.multiple === undefined) {
- options.multiple = true;
- }
-
- // mdColorPicker Properties
- options.mdColorAlphaChannel = options.mdColorAlphaChannel === undefined ? false : options.mdColorAlphaChannel;
- options.mdColorSpectrum = options.mdColorSpectrum === undefined ? true : options.mdColorSpectrum;
- options.mdColorSliders = options.mdColorSliders === undefined ? true : options.mdColorSliders;
- options.mdColorGenericPalette = options.mdColorGenericPalette === undefined ? true : options.mdColorGenericPalette;
- options.mdColorMaterialPalette = options.mdColorMaterialPalette === undefined ? true : options.mdColorMaterialPalette;
- options.mdColorHistory = options.mdColorHistory === undefined ? true : options.mdColorHistory;
-
-
- dialog = $mdDialog.show({
- templateUrl: 'mdColorPickerDialog.tpl.html',
- hasBackdrop: options.hasBackdrop,
- clickOutsideToClose: options.clickOutsideToClose,
-
- controller: ['$scope', 'options', function( $scope, options ) {
- //console.log( "DIALOG CONTROLLER OPEN", Date.now() - dateClick );
- $scope.close = function close()
- {
- $mdDialog.cancel();
- };
- $scope.ok = function ok()
- {
- $mdDialog.hide( $scope.value );
- };
- $scope.hide = $scope.ok;
-
-
-
- $scope.value = options.value;
- $scope.default = options.defaultValue;
- $scope.random = options.random;
-
- $scope.mdColorAlphaChannel = options.mdColorAlphaChannel;
- $scope.mdColorSpectrum = options.mdColorSpectrum;
- $scope.mdColorSliders = options.mdColorSliders;
- $scope.mdColorGenericPalette = options.mdColorGenericPalette;
- $scope.mdColorMaterialPalette = options.mdColorMaterialPalette;
- $scope.mdColorHistory = options.mdColorHistory;
- $scope.mdColorDefaultTab = options.mdColorDefaultTab;
-
- }],
-
- locals: {
- options: options,
- },
- preserveScope: options.preserveScope,
- multiple: options.multiple,
-
- targetEvent: options.$event,
- focusOnOpen: options.focusOnOpen,
- autoWrap: false,
- onShowing: function() {
- // console.log( "DIALOG OPEN START", Date.now() - dateClick );
- },
- onComplete: function() {
- // console.log( "DIALOG OPEN COMPLETE", Date.now() - dateClick );
- }
- });
-
- dialog.then(function (value) {
- mdColorPickerHistory.add(new tinycolor(value));
- }, function () { });
-
- return dialog;
- },
- hide: function() {
- return dialog.hide();
- },
- cancel: function() {
- return dialog.cancel();
- }
- };
-
- /* eslint-enable angular/definedundefined */
-}
-
-function DatePickerCtrl($scope, $mdDialog, $mdMedia, $timeout, currentDate, options) {
- var self = this;
-
- this.date = moment(currentDate);
- this.minDate = options.minDate && moment(options.minDate).isValid() ? moment(options.minDate) : null;
- this.maxDate = options.maxDate && moment(options.maxDate).isValid() ? moment(options.maxDate) : null;
- this.displayFormat = options.displayFormat || "ddd, MMM DD";
- this.dateFilter = angular.isFunction(options.dateFilter) ? options.dateFilter : null;
- this.selectingYear = false;
-
- // validate min and max date
- if (this.minDate && this.maxDate) {
- if (this.maxDate.isBefore(this.minDate)) {
- this.maxDate = moment(this.minDate).add(1, 'days');
- }
- }
-
- if (this.date) {
- // check min date
- if (this.minDate && this.date.isBefore(this.minDate)) {
- this.date = moment(this.minDate);
- }
-
- // check max date
- if (this.maxDate && this.date.isAfter(this.maxDate)) {
- this.date = moment(this.maxDate);
- }
- }
-
- this.yearItems = {
- currentIndex_: 0,
- PAGE_SIZE: 5,
- START: (self.minDate ? self.minDate.year() : 1900),
- END: (self.maxDate ? self.maxDate.year() : 0),
- getItemAtIndex: function(index) {
- if(this.currentIndex_ < index)
- this.currentIndex_ = index;
-
- return this.START + index;
- },
- getLength: function() {
- return Math.min(
- this.currentIndex_ + Math.floor(this.PAGE_SIZE / 2),
- Math.abs(this.START - this.END) + 1
- );
- }
- };
-
- $scope.$mdMedia = $mdMedia;
- $scope.year = this.date.year();
-
- this.selectYear = function(year) {
- self.date.year(year);
- $scope.year = year;
- self.selectingYear = false;
- self.animate();
- };
-
- this.showYear = function() {
- self.yearTopIndex = (self.date.year() - self.yearItems.START) + Math.floor(self.yearItems.PAGE_SIZE / 2);
- self.yearItems.currentIndex_ = (self.date.year() - self.yearItems.START) + 1;
- self.selectingYear = true;
- };
-
- this.showCalendar = function() {
- self.selectingYear = false;
- };
-
- this.cancel = function() {
- $mdDialog.cancel();
- };
-
- this.confirm = function() {
- var date = this.date;
-
- if (this.minDate && this.date.isBefore(this.minDate)) {
- date = moment(this.minDate);
- }
-
- if (this.maxDate && this.date.isAfter(this.maxDate)) {
- date = moment(this.maxDate);
- }
-
- $mdDialog.hide(date.toDate());
- };
-
- this.animate = function() {
- self.animating = true;
- $timeout(angular.noop).then(function() {
- self.animating = false;
- })
- };
-}
-
-/*@ngInject*/
-function mdpDatePicker() {
- var LABEL_OK = "OK",
- LABEL_CANCEL = "Cancel",
- DISPLAY_FORMAT = "ddd, MMM DD";
-
- this.setDisplayFormat = function(format) {
- DISPLAY_FORMAT = format;
- };
-
- this.setOKButtonLabel = function(label) {
- LABEL_OK = label;
- };
-
- this.setCancelButtonLabel = function(label) {
- LABEL_CANCEL = label;
- };
-
- /*@ngInject*/
- this.$get = function($mdDialog) {
- var datePicker = function(currentDate, options) {
- if (!angular.isDate(currentDate)) currentDate = Date.now();
- if (!angular.isObject(options)) options = {};
-
- options.displayFormat = DISPLAY_FORMAT;
-
- return $mdDialog.show({
- controller: ['$scope', '$mdDialog', '$mdMedia', '$timeout', 'currentDate', 'options', DatePickerCtrl],
- controllerAs: 'datepicker',
- clickOutsideToClose: true,
- template: '' +
- '' +
- '' +
- '' +
- '{{ datepicker.date.format(\'YYYY\') }}' +
- '{{ datepicker.date.format(datepicker.displayFormat) }} ' +
- '' +
- '
' +
- '' +
- '
' +
- '
' +
- '' +
- '{{ item }}' +
- '
' +
- '' +
- '
' +
- '
' +
- '
' +
- '' +
- '' + LABEL_CANCEL + '' +
- '' + LABEL_OK + '' +
- '' +
- '
' +
- '' +
- '',
- targetEvent: options.targetEvent,
- locals: {
- currentDate: currentDate,
- options: options
- },
- multiple: true
- });
- };
-
- return datePicker;
- };
-
-}
-
-function TimePickerCtrl($scope, $mdDialog, time, autoSwitch, $mdMedia) {
- var self = this;
- this.VIEW_HOURS = 1;
- this.VIEW_MINUTES = 2;
- this.currentView = this.VIEW_HOURS;
- this.time = moment(time);
- this.autoSwitch = !!autoSwitch;
-
- this.clockHours = parseInt(this.time.format("h"));
- this.clockMinutes = parseInt(this.time.minutes());
-
- $scope.$mdMedia = $mdMedia;
-
- this.switchView = function() {
- self.currentView = self.currentView == self.VIEW_HOURS ? self.VIEW_MINUTES : self.VIEW_HOURS;
- };
-
- this.setAM = function() {
- if(self.time.hours() >= 12)
- self.time.hour(self.time.hour() - 12);
- };
-
- this.setPM = function() {
- if(self.time.hours() < 12)
- self.time.hour(self.time.hour() + 12);
- };
-
- this.cancel = function() {
- $mdDialog.cancel();
- };
-
- this.confirm = function() {
- $mdDialog.hide(this.time.toDate());
- };
-}
-
-/*@ngInject*/
-function mdpTimePicker() {
- var LABEL_OK = "OK",
- LABEL_CANCEL = "Cancel";
-
- this.setOKButtonLabel = function(label) {
- LABEL_OK = label;
- };
-
- this.setCancelButtonLabel = function(label) {
- LABEL_CANCEL = label;
- };
-
- /*@ngInject*/
- this.$get = function($mdDialog) {
- var timePicker = function(time, options) {
- if(!angular.isDate(time)) time = Date.now();
- if (!angular.isObject(options)) options = {};
-
- return $mdDialog.show({
- controller: ['$scope', '$mdDialog', 'time', 'autoSwitch', '$mdMedia', TimePickerCtrl],
- controllerAs: 'timepicker',
- clickOutsideToClose: true,
- template: '' +
- '' +
- '' +
- '' +
- '{{ timepicker.time.format("h") }}:' +
- '{{ timepicker.time.format("mm") }}' +
- '
' +
- '' +
- 'AM' +
- 'PM' +
- '
' +
- '' +
- '' +
- '
' +
- '' +
- '' +
- '
' +
-
- '
' +
- '' +
- '' + LABEL_CANCEL + '' +
- '' + LABEL_OK + '' +
- '' +
- '
' +
- '' +
- '',
- targetEvent: options.targetEvent,
- locals: {
- time: time,
- autoSwitch: options.autoSwitch
- },
- multiple: true
- });
- };
-
- return timePicker;
- };
-}
diff --git a/ui/src/app/common/types.constant.js b/ui/src/app/common/types.constant.js
deleted file mode 100644
index 8285430c56..0000000000
--- a/ui/src/app/common/types.constant.js
+++ /dev/null
@@ -1,991 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-export default angular.module('thingsboard.types', [])
- .constant('types',
- {
- serverErrorCode: {
- general: 2,
- authentication: 10,
- jwtTokenExpired: 11,
- credentialsExpired: 15,
- permissionDenied: 20,
- invalidArguments: 30,
- badRequestParams: 31,
- itemNotFound: 32,
- tooManyRequests: 33,
- tooManyUpdates: 34
- },
- entryPoints: {
- login: "/api/auth/login",
- tokenRefresh: "/api/auth/token",
- nonTokenBased: "/api/noauth"
- },
- id: {
- nullUid: "13814000-1dd2-11b2-8080-808080808080",
- },
- aggregation: {
- min: {
- value: "MIN",
- name: "aggregation.min"
- },
- max: {
- value: "MAX",
- name: "aggregation.max"
- },
- avg: {
- value: "AVG",
- name: "aggregation.avg"
- },
- sum: {
- value: "SUM",
- name: "aggregation.sum"
- },
- count: {
- value: "COUNT",
- name: "aggregation.count"
- },
- none: {
- value: "NONE",
- name: "aggregation.none"
- }
- },
- alarmFields: {
- createdTime: {
- keyName: 'createdTime',
- value: "createdTime",
- name: "alarm.created-time",
- time: true
- },
- startTime: {
- keyName: 'startTime',
- value: "startTs",
- name: "alarm.start-time",
- time: true
- },
- endTime: {
- keyName: 'endTime',
- value: "endTs",
- name: "alarm.end-time",
- time: true
- },
- ackTime: {
- keyName: 'ackTime',
- value: "ackTs",
- name: "alarm.ack-time",
- time: true
- },
- clearTime: {
- keyName: 'clearTime',
- value: "clearTs",
- name: "alarm.clear-time",
- time: true
- },
- originator: {
- keyName: 'originator',
- value: "originatorName",
- name: "alarm.originator"
- },
- originatorType: {
- keyName: 'originatorType',
- value: "originator.entityType",
- name: "alarm.originator-type"
- },
- type: {
- keyName: 'type',
- value: "type",
- name: "alarm.type"
- },
- severity: {
- keyName: 'severity',
- value: "severity",
- name: "alarm.severity"
- },
- status: {
- keyName: 'status',
- value: "status",
- name: "alarm.status"
- }
- },
- alarmStatus: {
- activeUnack: "ACTIVE_UNACK",
- activeAck: "ACTIVE_ACK",
- clearedUnack: "CLEARED_UNACK",
- clearedAck: "CLEARED_ACK"
- },
- alarmSearchStatus: {
- any: "ANY",
- active: "ACTIVE",
- cleared: "CLEARED",
- ack: "ACK",
- unack: "UNACK"
- },
- alarmSeverity: {
- "CRITICAL": {
- name: "alarm.severity-critical",
- class: "tb-critical",
- color: "red"
- },
- "MAJOR": {
- name: "alarm.severity-major",
- class: "tb-major",
- color: "orange"
- },
- "MINOR": {
- name: "alarm.severity-minor",
- class: "tb-minor",
- color: "#ffca3d"
- },
- "WARNING": {
- name: "alarm.severity-warning",
- class: "tb-warning",
- color: "#abab00"
- },
- "INDETERMINATE": {
- name: "alarm.severity-indeterminate",
- class: "tb-indeterminate",
- color: "green"
- }
- },
- auditLogActionType: {
- "ADDED": {
- name: "audit-log.type-added"
- },
- "DELETED": {
- name: "audit-log.type-deleted"
- },
- "UPDATED": {
- name: "audit-log.type-updated"
- },
- "ATTRIBUTES_UPDATED": {
- name: "audit-log.type-attributes-updated"
- },
- "ATTRIBUTES_DELETED": {
- name: "audit-log.type-attributes-deleted"
- },
- "RPC_CALL": {
- name: "audit-log.type-rpc-call"
- },
- "CREDENTIALS_UPDATED": {
- name: "audit-log.type-credentials-updated"
- },
- "ASSIGNED_TO_CUSTOMER": {
- name: "audit-log.type-assigned-to-customer"
- },
- "UNASSIGNED_FROM_CUSTOMER": {
- name: "audit-log.type-unassigned-from-customer"
- },
- "ACTIVATED": {
- name: "audit-log.type-activated"
- },
- "SUSPENDED": {
- name: "audit-log.type-suspended"
- },
- "CREDENTIALS_READ": {
- name: "audit-log.type-credentials-read"
- },
- "ATTRIBUTES_READ": {
- name: "audit-log.type-attributes-read"
- },
- "RELATION_ADD_OR_UPDATE": {
- name: "audit-log.type-relation-add-or-update"
- },
- "RELATION_DELETED": {
- name: "audit-log.type-relation-delete"
- },
- "RELATIONS_DELETED": {
- name: "audit-log.type-relations-delete"
- },
- "ALARM_ACK": {
- name: "audit-log.type-alarm-ack"
- },
- "ALARM_CLEAR": {
- name: "audit-log.type-alarm-clear"
- },
- "LOGIN": {
- name: "audit-log.type-login"
- },
- "LOGOUT": {
- name: "audit-log.type-logout"
- },
- "LOCKOUT": {
- name: "audit-log.type-lockout"
- }
- },
- auditLogActionStatus: {
- "SUCCESS": {
- value: "SUCCESS",
- name: "audit-log.status-success"
- },
- "FAILURE": {
- value: "FAILURE",
- name: "audit-log.status-failure"
- }
- },
- auditLogMode: {
- tenant: "tenant",
- entity: "entity",
- user: "user",
- customer: "customer"
- },
- aliasFilterType: {
- singleEntity: {
- value: 'singleEntity',
- name: 'alias.filter-type-single-entity'
- },
- entityList: {
- value: 'entityList',
- name: 'alias.filter-type-entity-list'
- },
- entityName: {
- value: 'entityName',
- name: 'alias.filter-type-entity-name'
- },
- stateEntity: {
- value: 'stateEntity',
- name: 'alias.filter-type-state-entity'
- },
- assetType: {
- value: 'assetType',
- name: 'alias.filter-type-asset-type'
- },
- deviceType: {
- value: 'deviceType',
- name: 'alias.filter-type-device-type'
- },
- entityViewType: {
- value: 'entityViewType',
- name: 'alias.filter-type-entity-view-type'
- },
- relationsQuery: {
- value: 'relationsQuery',
- name: 'alias.filter-type-relations-query'
- },
- assetSearchQuery: {
- value: 'assetSearchQuery',
- name: 'alias.filter-type-asset-search-query'
- },
- deviceSearchQuery: {
- value: 'deviceSearchQuery',
- name: 'alias.filter-type-device-search-query'
- },
- entityViewSearchQuery: {
- value: 'entityViewSearchQuery',
- name: 'alias.filter-type-entity-view-search-query'
- }
- },
- direction: {
- column: {
- value: "column",
- name: "direction.column"
- },
- row: {
- value: "row",
- name: "direction.row"
- }
- },
- position: {
- top: {
- value: "top",
- name: "position.top"
- },
- bottom: {
- value: "bottom",
- name: "position.bottom"
- },
- left: {
- value: "left",
- name: "position.left"
- },
- right: {
- value: "right",
- name: "position.right"
- }
- },
- datasourceType: {
- function: "function",
- entity: "entity"
- },
- dataKeyType: {
- timeseries: "timeseries",
- attribute: "attribute",
- function: "function",
- alarm: "alarm",
- entityField: "entityField"
- },
- contentType: {
- "JSON": {
- value: "JSON",
- name: "content-type.json",
- code: "json"
- },
- "TEXT": {
- value: "TEXT",
- name: "content-type.text",
- code: "text"
- },
- "BINARY": {
- value: "BINARY",
- name: "content-type.binary",
- code: "text"
- }
- },
- componentType: {
- enrichment: "ENRICHMENT",
- filter: "FILTER",
- transformation: "TRANSFORMATION",
- action: "ACTION",
- external: "EXTERNAL"
- },
- entityType: {
- device: "DEVICE",
- asset: "ASSET",
- tenant: "TENANT",
- customer: "CUSTOMER",
- user: "USER",
- dashboard: "DASHBOARD",
- alarm: "ALARM",
- rulechain: "RULE_CHAIN",
- rulenode: "RULE_NODE",
- entityView: "ENTITY_VIEW"
- },
- importEntityColumnType: {
- name: {
- name: 'import.column-type.name',
- value: 'name'
- },
- type: {
- name: 'import.column-type.type',
- value: 'type'
- },
- label: {
- name: 'import.column-type.label',
- value: 'label'
- },
- clientAttribute: {
- name: 'import.column-type.client-attribute',
- value: 'CLIENT_ATTRIBUTE'
- },
- sharedAttribute: {
- name: 'import.column-type.shared-attribute',
- value: 'SHARED_ATTRIBUTE'
- },
- serverAttribute: {
- name: 'import.column-type.server-attribute',
- value: 'SERVER_ATTRIBUTE'
- },
- timeseries: {
- name: 'import.column-type.timeseries',
- value: 'TIMESERIES'
- },
- entityField: {
- name: 'import.column-type.entity-field',
- value: 'ENTITY_FIELD'
- },
- accessToken: {
- name: 'import.column-type.access-token',
- value: 'ACCESS_TOKEN'
- },
- isGateway: {
- name: 'import.column-type.isgateway',
- value: 'gateway'
- },
- description: {
- name: 'import.column-type.description',
- value: 'description'
- }
- },
- aliasEntityType: {
- current_customer: "CURRENT_CUSTOMER",
- current_tenant: "CURRENT_TENANT"
- },
- entityTypeTranslations: {
- "DEVICE": {
- type: 'entity.type-device',
- typePlural: 'entity.type-devices',
- list: 'entity.list-of-devices',
- nameStartsWith: 'entity.device-name-starts-with'
- },
- "ASSET": {
- type: 'entity.type-asset',
- typePlural: 'entity.type-assets',
- list: 'entity.list-of-assets',
- nameStartsWith: 'entity.asset-name-starts-with'
- },
- "ENTITY_VIEW": {
- type: 'entity.type-entity-view',
- typePlural: 'entity.type-entity-views',
- list: 'entity.list-of-entity-views',
- nameStartsWith: 'entity.entity-view-name-starts-with'
- },
- "TENANT": {
- type: 'entity.type-tenant',
- typePlural: 'entity.type-tenants',
- list: 'entity.list-of-tenants',
- nameStartsWith: 'entity.tenant-name-starts-with'
- },
- "CUSTOMER": {
- type: 'entity.type-customer',
- typePlural: 'entity.type-customers',
- list: 'entity.list-of-customers',
- nameStartsWith: 'entity.customer-name-starts-with'
- },
- "USER": {
- type: 'entity.type-user',
- typePlural: 'entity.type-users',
- list: 'entity.list-of-users',
- nameStartsWith: 'entity.user-name-starts-with'
- },
- "DASHBOARD": {
- type: 'entity.type-dashboard',
- typePlural: 'entity.type-dashboards',
- list: 'entity.list-of-dashboards',
- nameStartsWith: 'entity.dashboard-name-starts-with'
- },
- "ALARM": {
- type: 'entity.type-alarm',
- typePlural: 'entity.type-alarms',
- list: 'entity.list-of-alarms',
- nameStartsWith: 'entity.alarm-name-starts-with'
- },
- "RULE_CHAIN": {
- type: 'entity.type-rulechain',
- typePlural: 'entity.type-rulechains',
- list: 'entity.list-of-rulechains',
- nameStartsWith: 'entity.rulechain-name-starts-with'
- },
- "RULE_NODE": {
- type: 'entity.type-rulenode',
- typePlural: 'entity.type-rulenodes',
- list: 'entity.list-of-rulenodes',
- nameStartsWith: 'entity.rulenode-name-starts-with'
- },
- "CURRENT_CUSTOMER": {
- type: 'entity.type-current-customer',
- list: 'entity.type-current-customer'
- },
- "CURRENT_TENANT": {
- type: 'entity.type-current-tenant',
- list: 'entity.type-current-tenant'
- }
- },
- entityField: {
- createdTime: {
- keyName: 'createdTime',
- name: 'entity-field.created-time',
- value: 'createdTime',
- time: true
- },
- name: {
- keyName: 'name',
- name: 'entity-field.name',
- value: 'name'
- },
- type: {
- keyName: 'type',
- name: 'entity-field.type',
- value: 'type'
- },
- firstName: {
- keyName: 'firstName',
- name: 'entity-field.first-name',
- value: 'firstName'
- },
- lastName: {
- keyName: 'lastName',
- name: 'entity-field.last-name',
- value: 'lastName'
- },
- email: {
- keyName: 'email',
- name: 'entity-field.email',
- value: 'email'
- },
- title: {
- keyName: 'title',
- name: 'entity-field.title',
- value: 'title'
- },
- country: {
- keyName: 'country',
- name: 'entity-field.country',
- value: 'country'
- },
- state: {
- keyName: 'state',
- name: 'entity-field.state',
- value: 'state'
- },
- city: {
- keyName: 'city',
- name: 'entity-field.city',
- value: 'city'
- },
- address: {
- keyName: 'address',
- name: 'entity-field.address',
- value: 'address'
- },
- address2: {
- keyName: 'address2',
- name: 'entity-field.address2',
- value: 'address2'
- },
- zip: {
- keyName: 'zip',
- name: 'entity-field.zip',
- value: 'zip'
- },
- phone: {
- keyName: 'phone',
- name: 'entity-field.phone',
- value: 'phone'
- },
- label: {
- keyName: 'label',
- name: 'entity-field.label',
- value: 'label'
- }
- },
- entitySearchDirection: {
- from: "FROM",
- to: "TO"
- },
- entityRelationType: {
- contains: "Contains",
- manages: "Manages"
- },
- eventType: {
- error: {
- value: "ERROR",
- name: "event.type-error"
- },
- lcEvent: {
- value: "LC_EVENT",
- name: "event.type-lc-event"
- },
- stats: {
- value: "STATS",
- name: "event.type-stats"
- }
- },
- debugEventType: {
- debugRuleNode: {
- value: "DEBUG_RULE_NODE",
- name: "event.type-debug-rule-node"
- },
- debugRuleChain: {
- value: "DEBUG_RULE_CHAIN",
- name: "event.type-debug-rule-chain"
- }
- },
- extensionType: {
- http: "HTTP",
- mqtt: "MQTT",
- opc: "OPC UA",
- modbus: "MODBUS"
- },
- gatewayConfigType: {
- mqtt: {
- value: "mqtt",
- name: "MQTT"
- },
- modbus: {
- value: "modbus",
- name: "Modbus"
- },
- opcua: {
- value: "opcua",
- name: "OPC-UA"
- },
- ble: {
- value: "ble",
- name: "BLE"
- },
- request: {
- value: "request",
- name: "Request"
- },
- can: {
- value: "can",
- name: "CAN"
- },
- bacnet: {
- value: "bacnet",
- name: "BACnet"
- },
- custom: {
- value: "custom",
- name: "Custom"
- }
- },
- gatewayLogLevel: {
- none: "NONE",
- critical: "CRITICAL",
- error: "ERROR",
- warning: "WARNING",
- info: "INFO",
- debug: "DEBUG"
- },
- extensionValueType: {
- string: 'value.string',
- long: 'value.long',
- double: 'value.double',
- boolean: 'value.boolean'
- },
- extensionTransformerType: {
- toDouble: 'extension.to-double',
- custom: 'extension.custom'
- },
- mqttConverterTypes: {
- json: 'extension.converter-json',
- custom: 'extension.custom'
- },
- mqttCredentialTypes: {
- anonymous: {
- value: "anonymous",
- name: "extension.anonymous"
- },
- basic: {
- value: "basic",
- name: "extension.basic"
- },
- pem: {
- value: "cert.PEM",
- name: "extension.pem"
- }
- },
- extensionOpcSecurityTypes: {
- Basic128Rsa15: "Basic128Rsa15",
- Basic256: "Basic256",
- Basic256Sha256: "Basic256Sha256",
- None: "None"
- },
- extensionIdentityType: {
- anonymous: "extension.anonymous",
- username: "extension.username"
- },
- extensionKeystoreType: {
- PKCS12: "PKCS12",
- JKS: "JKS"
- },
- extensionModbusFunctionCodes: {
- 1: "Read Coils (1)",
- 2: "Read Discrete Inputs (2)",
- 3: "Read Multiple Holding Registers (3)",
- 4: "Read Input Registers (4)"
- },
- extensionModbusTransports: {
- tcp: "TCP",
- udp: "UDP",
- rtu: "RTU"
- },
- extensionModbusRtuParities: {
- none: "none",
- even: "even",
- odd: "odd"
- },
- extensionModbusRtuEncodings: {
- ascii: "ascii",
- rtu: "rtu"
- },
- latestTelemetry: {
- value: "LATEST_TELEMETRY",
- name: "attribute.scope-latest-telemetry",
- clientSide: true
- },
- attributesScope: {
- client: {
- value: "CLIENT_SCOPE",
- name: "attribute.scope-client",
- clientSide: true
- },
- server: {
- value: "SERVER_SCOPE",
- name: "attribute.scope-server",
- clientSide: false
- },
- shared: {
- value: "SHARED_SCOPE",
- name: "attribute.scope-shared",
- clientSide: false
- }
- },
- ruleNodeTypeComponentTypes: ["FILTER", "ENRICHMENT", "TRANSFORMATION", "ACTION", "EXTERNAL"],
- ruleChainNodeComponent: {
- type: 'RULE_CHAIN',
- name: 'rule chain',
- clazz: 'tb.internal.RuleChain',
- configurationDescriptor: {
- nodeDefinition: {
- description: "",
- details: "Forwards incoming messages to specified Rule Chain",
- inEnabled: true,
- outEnabled: false,
- relationTypes: [],
- customRelations: false,
- defaultConfiguration: {}
- }
- }
- },
- unknownNodeComponent: {
- type: 'UNKNOWN',
- name: 'unknown',
- clazz: 'tb.internal.Unknown',
- configurationDescriptor: {
- nodeDefinition: {
- description: "",
- details: "",
- inEnabled: true,
- outEnabled: true,
- relationTypes: [],
- customRelations: false,
- defaultConfiguration: {}
- }
- }
- },
- inputNodeComponent: {
- type: 'INPUT',
- name: 'Input',
- clazz: 'tb.internal.Input'
- },
- ruleNodeType: {
- FILTER: {
- value: "FILTER",
- name: "rulenode.type-filter",
- details: "rulenode.type-filter-details",
- nodeClass: "tb-filter-type",
- icon: "filter_list"
- },
- ENRICHMENT: {
- value: "ENRICHMENT",
- name: "rulenode.type-enrichment",
- details: "rulenode.type-enrichment-details",
- nodeClass: "tb-enrichment-type",
- icon: "playlist_add"
- },
- TRANSFORMATION: {
- value: "TRANSFORMATION",
- name: "rulenode.type-transformation",
- details: "rulenode.type-transformation-details",
- nodeClass: "tb-transformation-type",
- icon: "transform"
- },
- ACTION: {
- value: "ACTION",
- name: "rulenode.type-action",
- details: "rulenode.type-action-details",
- nodeClass: "tb-action-type",
- icon: "flash_on"
- },
- EXTERNAL: {
- value: "EXTERNAL",
- name: "rulenode.type-external",
- details: "rulenode.type-external-details",
- nodeClass: "tb-external-type",
- icon: "cloud_upload"
- },
- RULE_CHAIN: {
- value: "RULE_CHAIN",
- name: "rulenode.type-rule-chain",
- details: "rulenode.type-rule-chain-details",
- nodeClass: "tb-rule-chain-type",
- icon: "settings_ethernet"
- },
- INPUT: {
- value: "INPUT",
- name: "rulenode.type-input",
- details: "rulenode.type-input-details",
- nodeClass: "tb-input-type",
- icon: "input",
- special: true
- },
- UNKNOWN: {
- value: "UNKNOWN",
- name: "rulenode.type-unknown",
- details: "rulenode.type-unknown-details",
- nodeClass: "tb-unknown-type",
- icon: "help_outline"
- }
- },
- messageType: {
- 'POST_ATTRIBUTES_REQUEST': {
- name: 'Post attributes',
- value: 'POST_ATTRIBUTES_REQUEST'
- },
- 'POST_TELEMETRY_REQUEST': {
- name: 'Post telemetry',
- value: 'POST_TELEMETRY_REQUEST'
- },
- 'TO_SERVER_RPC_REQUEST': {
- name: 'RPC Request from Device',
- value: 'TO_SERVER_RPC_REQUEST'
- },
- 'RPC_CALL_FROM_SERVER_TO_DEVICE': {
- name: 'RPC Request to Device',
- value: 'RPC_CALL_FROM_SERVER_TO_DEVICE'
- },
- 'ACTIVITY_EVENT': {
- name: 'Activity Event',
- value: 'ACTIVITY_EVENT'
- },
- 'INACTIVITY_EVENT': {
- name: 'Inactivity Event',
- value: 'INACTIVITY_EVENT'
- },
- 'CONNECT_EVENT': {
- name: 'Connect Event',
- value: 'CONNECT_EVENT'
- },
- 'DISCONNECT_EVENT': {
- name: 'Disconnect Event',
- value: 'DISCONNECT_EVENT'
- },
- 'ENTITY_CREATED': {
- name: 'Entity Created',
- value: 'ENTITY_CREATED'
- },
- 'ENTITY_UPDATED': {
- name: 'Entity Updated',
- value: 'ENTITY_UPDATED'
- },
- 'ENTITY_DELETED': {
- name: 'Entity Deleted',
- value: 'ENTITY_DELETED'
- },
- 'ENTITY_ASSIGNED': {
- name: 'Entity Assigned',
- value: 'ENTITY_ASSIGNED'
- },
- 'ENTITY_UNASSIGNED': {
- name: 'Entity Unassigned',
- value: 'ENTITY_UNASSIGNED'
- },
- 'ATTRIBUTES_UPDATED': {
- name: 'Attributes Updated',
- value: 'ATTRIBUTES_UPDATED'
- },
- 'ATTRIBUTES_DELETED': {
- name: 'Attributes Deleted',
- value: 'ATTRIBUTES_DELETED'
- }
- },
- valueType: {
- string: {
- value: "string",
- name: "value.string",
- icon: "mdi:format-text"
- },
- integer: {
- value: "integer",
- name: "value.integer",
- icon: "mdi:numeric"
- },
- double: {
- value: "double",
- name: "value.double",
- icon: "mdi:numeric"
- },
- boolean: {
- value: "boolean",
- name: "value.boolean",
- icon: "mdi:checkbox-marked-outline"
- },
- json: {
- value: "json",
- name: "value.json",
- icon: "mdi:json"
- }
- },
- widgetType: {
- timeseries: {
- value: "timeseries",
- name: "widget.timeseries",
- template: {
- bundleAlias: "charts",
- alias: "basic_timeseries"
- }
- },
- latest: {
- value: "latest",
- name: "widget.latest-values",
- template: {
- bundleAlias: "cards",
- alias: "attributes_card"
- }
- },
- rpc: {
- value: "rpc",
- name: "widget.rpc",
- template: {
- bundleAlias: "gpio_widgets",
- alias: "basic_gpio_control"
- }
- },
- alarm: {
- value: "alarm",
- name: "widget.alarm",
- template: {
- bundleAlias: "alarm_widgets",
- alias: "alarms_table"
- }
- },
- static: {
- value: "static",
- name: "widget.static",
- template: {
- bundleAlias: "cards",
- alias: "html_card"
- }
- }
- },
- widgetActionSources: {
- headerButton: {
- name: 'widget-action.header-button',
- value: 'headerButton',
- multiple: true
- }
- },
- widgetActionTypes: {
- openDashboardState: {
- name: 'widget-action.open-dashboard-state',
- value: 'openDashboardState'
- },
- updateDashboardState: {
- name: 'widget-action.update-dashboard-state',
- value: 'updateDashboardState'
- },
- openDashboard: {
- name: 'widget-action.open-dashboard',
- value: 'openDashboard'
- },
- custom: {
- name: 'widget-action.custom',
- value: 'custom'
- },
- customPretty: {
- name: 'widget-action.custom-pretty',
- value: 'customPretty'
- }
- },
- systemBundleAlias: {
- charts: "charts",
- cards: "cards"
- },
- translate: {
- customTranslationsPrefix: "custom."
- }
- }
- ).name;
diff --git a/ui/src/app/common/utf8-support.js b/ui/src/app/common/utf8-support.js
deleted file mode 100644
index ce749a7732..0000000000
--- a/ui/src/app/common/utf8-support.js
+++ /dev/null
@@ -1,137 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-export function utf8Encode(str) {
- var result;
-
- if (angular.isUndefined(Uint8Array)) { // eslint-disable-line no-undef
- result = utf8ToBytes(str);
- } else {
- result = new Uint8Array(utf8ToBytes(str)); // eslint-disable-line no-undef
- }
-
- return result;
-}
-
-export function utf8Decode(bytes) {
- return utf8Slice(bytes, 0, bytes.length);
-}
-
-function utf8Slice (buf, start, end) {
- var res = ''
- var tmp = ''
- end = Math.min(buf.length, end || Infinity)
- start = start || 0;
-
- for (var i = start; i < end; i++) {
- if (buf[i] <= 0x7F) {
- res += decodeUtf8Char(tmp) + String.fromCharCode(buf[i])
- tmp = ''
- } else {
- tmp += '%' + buf[i].toString(16)
- }
- }
-
- return res + decodeUtf8Char(tmp)
-}
-
-function decodeUtf8Char (str) {
- try {
- return decodeURIComponent(str)
- } catch (err) {
- return String.fromCharCode(0xFFFD) // UTF 8 invalid char
- }
-}
-
-function utf8ToBytes (string, units) {
- units = units || Infinity
- var codePoint
- var length = string.length
- var leadSurrogate = null
- var bytes = []
- var i = 0
-
- for (; i < length; i++) {
- codePoint = string.charCodeAt(i)
-
- // is surrogate component
- if (codePoint > 0xD7FF && codePoint < 0xE000) {
- // last char was a lead
- if (leadSurrogate) {
- // 2 leads in a row
- if (codePoint < 0xDC00) {
- if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
- leadSurrogate = codePoint
- continue
- } else {
- // valid surrogate pair
- codePoint = leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00 | 0x10000
- leadSurrogate = null
- }
- } else {
- // no lead yet
-
- if (codePoint > 0xDBFF) {
- // unexpected trail
- if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
- continue
- } else if (i + 1 === length) {
- // unpaired lead
- if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
- continue
- } else {
- // valid lead
- leadSurrogate = codePoint
- continue
- }
- }
- } else if (leadSurrogate) {
- // valid bmp char, but last char was a lead
- if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
- leadSurrogate = null
- }
-
- // encode utf8
- if (codePoint < 0x80) {
- if ((units -= 1) < 0) break
- bytes.push(codePoint)
- } else if (codePoint < 0x800) {
- if ((units -= 2) < 0) break
- bytes.push(
- codePoint >> 0x6 | 0xC0,
- codePoint & 0x3F | 0x80
- )
- } else if (codePoint < 0x10000) {
- if ((units -= 3) < 0) break
- bytes.push(
- codePoint >> 0xC | 0xE0,
- codePoint >> 0x6 & 0x3F | 0x80,
- codePoint & 0x3F | 0x80
- )
- } else if (codePoint < 0x200000) {
- if ((units -= 4) < 0) break
- bytes.push(
- codePoint >> 0x12 | 0xF0,
- codePoint >> 0xC & 0x3F | 0x80,
- codePoint >> 0x6 & 0x3F | 0x80,
- codePoint & 0x3F | 0x80
- )
- } else {
- throw new Error('Invalid code point')
- }
- }
-
- return bytes
-}
\ No newline at end of file
diff --git a/ui/src/app/common/utils.service.js b/ui/src/app/common/utils.service.js
deleted file mode 100644
index 97a04bbcf2..0000000000
--- a/ui/src/app/common/utils.service.js
+++ /dev/null
@@ -1,608 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-/* eslint-disable import/no-unresolved, import/default */
-
-import materialIconsCodepoints from 'raw-loader!material-design-icons/iconfont/codepoints';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-import tinycolor from 'tinycolor2';
-import jsonSchemaDefaults from 'json-schema-defaults';
-import base64js from 'base64-js';
-import {utf8Encode, utf8Decode} from './utf8-support';
-
-import thingsboardTypes from './types.constant';
-
-export default angular.module('thingsboard.utils', [thingsboardTypes])
- .factory('utils', Utils)
- .name;
-
-const varsRegex = /\$\{([^}]*)\}/g;
-
-/*@ngInject*/
-function Utils($mdColorPalette, $rootScope, $window, $translate, $q, $timeout, types) {
-
- var predefinedFunctions = {},
- predefinedFunctionsList = [],
- materialColors = [],
- materialIcons = [];
-
- var commonMaterialIcons = [ 'more_horiz', 'more_vert', 'open_in_new', 'visibility', 'play_arrow', 'arrow_back', 'arrow_downward',
- 'arrow_forward', 'arrow_upwards', 'close', 'refresh', 'menu', 'show_chart', 'multiline_chart', 'pie_chart', 'insert_chart', 'people',
- 'person', 'domain', 'devices_other', 'now_widgets', 'dashboards', 'map', 'pin_drop', 'my_location', 'extension', 'search',
- 'settings', 'notifications', 'notifications_active', 'info', 'info_outline', 'warning', 'list', 'file_download', 'import_export',
- 'share', 'add', 'edit', 'done' ];
-
- predefinedFunctions['Sin'] = "return Math.round(1000*Math.sin(time/5000));";
- predefinedFunctions['Cos'] = "return Math.round(1000*Math.cos(time/5000));";
- predefinedFunctions['Random'] =
- "var value = prevValue + Math.random() * 100 - 50;\n" +
- "var multiplier = Math.pow(10, 2 || 0);\n" +
- "var value = Math.round(value * multiplier) / multiplier;\n" +
- "if (value < -1000) {\n" +
- " value = -1000;\n" +
- "} else if (value > 1000) {\n" +
- " value = 1000;\n" +
- "}\n" +
- "return value;";
-
- for (var func in predefinedFunctions) {
- predefinedFunctionsList.push(func);
- }
-
- var colorPalettes = ['blue', 'green', 'red', 'amber', 'blue-grey', 'purple', 'light-green', 'indigo', 'pink', 'yellow', 'light-blue', 'orange', 'deep-purple', 'lime', 'teal', 'brown', 'cyan', 'deep-orange', 'grey'];
- var colorSpectrum = ['500', 'A700', '600', '700', '800', '900', '300', '400', 'A200', 'A400'];
-
- angular.forEach($mdColorPalette, function (value, key) {
- angular.forEach(value, function (color, label) {
- if (colorSpectrum.indexOf(label) > -1) {
- var rgb = 'rgb(' + color.value[0] + ',' + color.value[1] + ',' + color.value[2] + ')';
- color = tinycolor(rgb);
- var isDark = color.isDark();
- var colorItem = {
- value: color.toHexString(),
- group: key,
- label: label,
- isDark: isDark
- };
- materialColors.push(colorItem);
- }
- });
- });
-
- materialColors.sort(function (colorItem1, colorItem2) {
- var spectrumIndex1 = colorSpectrum.indexOf(colorItem1.label);
- var spectrumIndex2 = colorSpectrum.indexOf(colorItem2.label);
- var result = spectrumIndex1 - spectrumIndex2;
- if (result === 0) {
- var paletteIndex1 = colorPalettes.indexOf(colorItem1.group);
- var paletteIndex2 = colorPalettes.indexOf(colorItem2.group);
- result = paletteIndex1 - paletteIndex2;
- }
- return result;
- });
-
- var defaultDataKey = {
- name: 'f(x)',
- type: types.dataKeyType.function,
- label: 'Sin',
- color: getMaterialColor(0),
- funcBody: getPredefinedFunctionBody('Sin'),
- settings: {},
- _hash: Math.random()
- };
-
- var defaultDatasource = {
- type: types.datasourceType.function,
- name: types.datasourceType.function,
- dataKeys: [angular.copy(defaultDataKey)]
- };
-
- var defaultAlarmFields = [
- types.alarmFields.createdTime.keyName,
- types.alarmFields.originator.keyName,
- types.alarmFields.type.keyName,
- types.alarmFields.severity.keyName,
- types.alarmFields.status.keyName
- ];
-
- var defaultAlarmDataKeys = [];
-
- var imageAspectMap = {};
-
- var service = {
- getDefaultDatasource: getDefaultDatasource,
- generateObjectFromJsonSchema: generateObjectFromJsonSchema,
- getDefaultDatasourceJson: getDefaultDatasourceJson,
- getDefaultAlarmDataKeys: getDefaultAlarmDataKeys,
- getMaterialColor: getMaterialColor,
- getMaterialIcons: getMaterialIcons,
- getCommonMaterialIcons: getCommonMaterialIcons,
- getPredefinedFunctionBody: getPredefinedFunctionBody,
- getPredefinedFunctionsList: getPredefinedFunctionsList,
- genMaterialColor: genMaterialColor,
- objectHashCode: objectHashCode,
- parseException: parseException,
- processWidgetException: processWidgetException,
- isDescriptorSchemaNotEmpty: isDescriptorSchemaNotEmpty,
- filterSearchTextEntities: filterSearchTextEntities,
- guid: guid,
- cleanCopy: cleanCopy,
- isLocalUrl: isLocalUrl,
- validateDatasources: validateDatasources,
- createKey: createKey,
- createAdditionalDataKey: createAdditionalDataKey,
- createLabelFromDatasource: createLabelFromDatasource,
- insertVariable: insertVariable,
- customTranslation: customTranslation,
- objToBase64: objToBase64,
- base64toObj: base64toObj,
- loadImageAspect: loadImageAspect
- }
-
- return service;
-
- function getPredefinedFunctionsList() {
- return predefinedFunctionsList;
- }
-
- function getPredefinedFunctionBody(func) {
- return predefinedFunctions[func];
- }
-
- function getMaterialColor(index) {
- var colorIndex = index % materialColors.length;
- return materialColors[colorIndex].value;
- }
-
- function getMaterialIcons() {
- var deferred = $q.defer();
- if (materialIcons.length) {
- deferred.resolve(materialIcons);
- } else {
- $timeout(function() {
- var codepointsArray = materialIconsCodepoints.split("\n");
- codepointsArray.forEach(function (codepoint) {
- if (codepoint && codepoint.length) {
- var values = codepoint.split(' ');
- if (values && values.length == 2) {
- materialIcons.push(values[0]);
- }
- }
- });
- deferred.resolve(materialIcons);
- });
- }
- return deferred.promise;
- }
-
- function getCommonMaterialIcons() {
- return commonMaterialIcons;
- }
-
- function genMaterialColor(str) {
- var hash = Math.abs(hashCode(str));
- return getMaterialColor(hash);
- }
-
- function hashCode(str) {
- var hash = 0;
- var i, char;
- if (str.length == 0) return hash;
- for (i = 0; i < str.length; i++) {
- char = str.charCodeAt(i);
- hash = ((hash << 5) - hash) + char;
- hash = hash & hash; // Convert to 32bit integer
- }
- return hash;
- }
-
- function objectHashCode(obj) {
- var hash = 0;
- if (obj) {
- var str = angular.toJson(obj);
- hash = hashCode(str);
- }
- return hash;
- }
-
- function parseException(exception, lineOffset) {
- var data = {};
- if (exception) {
- if (angular.isString(exception) || exception instanceof String) {
- data.message = exception;
- } else {
- if (exception.name) {
- data.name = exception.name;
- } else {
- data.name = 'UnknownError';
- }
- if (exception.message) {
- data.message = exception.message;
- }
- if (exception.lineNumber) {
- data.lineNumber = exception.lineNumber;
- if (exception.columnNumber) {
- data.columnNumber = exception.columnNumber;
- }
- } else if (exception.stack) {
- var lineInfoRegexp = /(.*):(\d*)(:)?(\d*)?/g;
- var lineInfoGroups = lineInfoRegexp.exec(exception.stack);
- if (lineInfoGroups != null && lineInfoGroups.length >= 3) {
- if (angular.isUndefined(lineOffset)) {
- lineOffset = -2;
- }
- data.lineNumber = Number(lineInfoGroups[2]) + lineOffset;
- if (lineInfoGroups.length >= 5) {
- data.columnNumber = lineInfoGroups[4];
- }
- }
- }
- }
- }
- return data;
- }
-
- function processWidgetException(exception) {
- var parentScope = $window.parent.angular.element($window.frameElement).scope();
- var data = parseException(exception, -5);
- if ($rootScope.widgetEditMode) {
- parentScope.$emit('widgetException', data);
- parentScope.$apply();
- }
- return data;
- }
-
- function getDefaultDatasource(dataKeySchema) {
- var datasource = angular.copy(defaultDatasource);
- if (angular.isDefined(dataKeySchema)) {
- datasource.dataKeys[0].settings = generateObjectFromJsonSchema(dataKeySchema);
- }
- return datasource;
- }
-
- function generateObjectFromJsonSchema(schema) {
- var obj = jsonSchemaDefaults(schema);
- deleteNullProperties(obj);
- return obj;
- }
-
- function deleteNullProperties(obj) {
- if (angular.isUndefined(obj) || obj == null) {
- return;
- }
- for (var propName in obj) {
- if (obj[propName] === null || angular.isUndefined(obj[propName])) {
- delete obj[propName];
- } else if (angular.isObject(obj[propName])) {
- deleteNullProperties(obj[propName]);
- } else if (angular.isArray(obj[propName])) {
- for (var i=0;i 0) {
- var comparison = text.localeCompare(pageLink.textOffset);
- if (comparison === 0
- && createdTime < pageLink.createdTimeOffset) {
- response.data.push(entity);
- if (response.data.length === limit) {
- break;
- }
- } else if (comparison > 0 && text.startsWith(textSearch)) {
- response.data.push(entity);
- if (response.data.length === limit) {
- break;
- }
- }
- } else if (textSearch.length > 0) {
- if (text.startsWith(textSearch)) {
- response.data.push(entity);
- if (response.data.length === limit) {
- break;
- }
- }
- } else {
- response.data.push(entity);
- if (response.data.length === limit) {
- break;
- }
- }
- }
- if (response.data.length === limit) {
- var lastEntity = response.data[limit-1];
- response.nextPageLink = {
- limit: pageLink.limit,
- textSearch: textSearch,
- idOffset: lastEntity.id.id,
- createdTimeOffset: lastEntity.createdTime,
- textOffset: lastEntity[searchTextField].toLowerCase()
- };
- response.hasNext = true;
- }
- deferred.resolve(response);
- }
-
- function guid() {
- function s4() {
- return Math.floor((1 + Math.random()) * 0x10000)
- .toString(16)
- .substring(1);
- }
- return s4() + s4() + '-' + s4() + '-' + s4() + '-' +
- s4() + '-' + s4() + s4() + s4();
- }
-
- function cleanCopy(object) {
- var copy = angular.copy(object);
- for (var prop in copy) {
- if (prop && prop.startsWith('$$')) {
- delete copy[prop];
- }
- }
- return copy;
- }
-
- function genNextColor(datasources, initialIndex) {
- var index = initialIndex || 0;
- if (datasources) {
- for (var i = 0; i < datasources.length; i++) {
- var datasource = datasources[i];
- index += datasource.dataKeys.length;
- }
- }
- return getMaterialColor(index);
- }
-
- function isLocalUrl(url) {
- var parser = document.createElement('a'); //eslint-disable-line
- parser.href = url;
- var host = parser.hostname;
- if (host === "localhost" || host === "127.0.0.1") {
- return true;
- } else {
- return false;
- }
- }
-
- function validateDatasources(datasources) {
- datasources.forEach(function (datasource) {
- if (datasource.type === 'device') {
- datasource.type = types.datasourceType.entity;
- datasource.entityType = types.entityType.device;
- if (datasource.deviceId) {
- datasource.entityId = datasource.deviceId;
- } else if (datasource.deviceAliasId) {
- datasource.entityAliasId = datasource.deviceAliasId;
- }
- if (datasource.deviceName) {
- datasource.entityName = datasource.deviceName;
- }
- }
- if (datasource.type === types.datasourceType.entity && datasource.entityId) {
- datasource.name = datasource.entityName;
- }
- });
- return datasources;
- }
-
- function createKey(keyInfo, type, datasources) {
- var label;
- if (type === types.dataKeyType.alarm && !keyInfo.label) {
- var alarmField = types.alarmFields[keyInfo.name];
- if (alarmField) {
- label = $translate.instant(alarmField.name)+'';
- }
- }
- if (!label) {
- label = keyInfo.label || keyInfo.name;
- }
- var dataKey = {
- name: keyInfo.name,
- type: type,
- label: label,
- funcBody: keyInfo.funcBody,
- settings: {},
- _hash: Math.random()
- }
- if (keyInfo.units) {
- dataKey.units = keyInfo.units;
- }
- if (angular.isDefined(keyInfo.decimals)) {
- dataKey.decimals = keyInfo.decimals;
- }
- if (keyInfo.color) {
- dataKey.color = keyInfo.color;
- } else {
- dataKey.color = genNextColor(datasources);
- }
- if (keyInfo.postFuncBody && keyInfo.postFuncBody.length) {
- dataKey.usePostProcessing = true;
- dataKey.postFuncBody = keyInfo.postFuncBody;
- }
- return dataKey;
- }
-
- function createAdditionalDataKey(dataKey, datasource, timeUnit, datasources, additionalKeysNumber) {
- let additionalDataKey = angular.copy(dataKey);
- if (dataKey.settings.comparisonSettings.comparisonValuesLabel) {
- additionalDataKey.label = createLabelFromDatasource(datasource, dataKey.settings.comparisonSettings.comparisonValuesLabel);
- } else {
- additionalDataKey.label = dataKey.label + ' ' + $translate.instant('legend.comparison-time-ago.'+timeUnit);
- }
- additionalDataKey.pattern = additionalDataKey.label;
- if (dataKey.settings.comparisonSettings.color) {
- additionalDataKey.color = dataKey.settings.comparisonSettings.color;
- } else {
- additionalDataKey.color = genNextColor(datasources, additionalKeysNumber);
- }
- additionalDataKey._hash = Math.random();
- return additionalDataKey;
- }
-
- function createLabelFromDatasource(datasource, pattern) {
- var label = angular.copy(pattern);
- var match = varsRegex.exec(pattern);
- while (match !== null) {
- var variable = match[0];
- var variableName = match[1];
- if (variableName === 'dsName') {
- label = label.split(variable).join(datasource.name);
- } else if (variableName === 'entityName') {
- label = label.split(variable).join(datasource.entityName);
- } else if (variableName === 'deviceName') {
- label = label.split(variable).join(datasource.entityName);
- } else if (variableName === 'entityLabel') {
- label = label.split(variable).join(datasource.entityLabel || 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);
- }
- return label;
- }
-
- function insertVariable(pattern, name, value) {
- var result = angular.copy(pattern);
- var match = varsRegex.exec(pattern);
- while (match !== null) {
- var variable = match[0];
- var variableName = match[1];
- if (variableName === name) {
- result = result.split(variable).join(value);
- }
- match = varsRegex.exec(pattern);
- }
- return result;
- }
-
- function customTranslation(translationValue, defaultValue) {
- var result = '';
- var translationId = types.translate.customTranslationsPrefix + translationValue;
- var translation = $translate.instant(translationId);
- if (translation != translationId) {
- result = translation + '';
- } else {
- result = defaultValue;
- }
- return result;
- }
-
- function objToBase64(obj) {
- var json = angular.toJson(obj);
- var encoded = utf8Encode(json);
- var b64Encoded = base64js.fromByteArray(encoded);
- return b64Encoded;
- }
-
- function base64toObj(b64Encoded) {
- var encoded = base64js.toByteArray(b64Encoded);
- var json = utf8Decode(encoded);
- var obj = angular.fromJson(json);
- return obj;
- }
-
- function loadImageAspect(imageUrl) {
- var deferred = $q.defer();
- if (imageUrl && imageUrl.length) {
- var urlHashCode = hashCode(imageUrl);
- var aspect = imageAspectMap[urlHashCode];
- if (angular.isUndefined(aspect)) {
- var testImage = document.createElement('img'); // eslint-disable-line
- testImage.style.position = 'absolute';
- testImage.style.left = '-99999px';
- testImage.style.top = '-99999px';
- testImage.onload = function() {
- aspect = testImage.width / testImage.height;
- document.body.removeChild(testImage); //eslint-disable-line
- imageAspectMap[urlHashCode] = aspect;
- deferred.resolve(aspect);
- };
- testImage.onerror = function() {
- aspect = 0;
- imageAspectMap[urlHashCode] = aspect;
- deferred.resolve(aspect);
- };
- document.body.appendChild(testImage); //eslint-disable-line
- testImage.src = imageUrl;
- } else {
- deferred.resolve(aspect);
- }
- } else {
- deferred.resolve(0);
- }
- return deferred.promise;
- }
-
-}
diff --git a/ui/src/app/components/ace-editor-fix.js b/ui/src/app/components/ace-editor-fix.js
deleted file mode 100644
index 907307c20f..0000000000
--- a/ui/src/app/components/ace-editor-fix.js
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-export default function fixAceEditor(aceEditor) {
- aceEditor.$blockScrolling = Infinity;
- aceEditor.on("showGutterTooltip", function (tooltip) {
- if (!tooltip.isAttachedToBody) {
- document.body.appendChild(tooltip.$element); //eslint-disable-line
- tooltip.isAttachedToBody = true;
- onElementRemoved(tooltip.$parentNode, () => {
- if (tooltip.$element.parentNode != null) {
- tooltip.$element.parentNode.removeChild(tooltip.$element);
- }
- });
- }
- });
-}
-
-function onElementRemoved(element, callback) {
- if (!document.body.contains(element)) { //eslint-disable-line
- callback();
- } else {
- var observer;
- observer = new MutationObserver(function(mutations) { //eslint-disable-line
- if (!document.body.contains(element)) { //eslint-disable-line
- callback();
- observer.disconnect();
- }
- });
- observer.observe(document.body, {childList: true}); //eslint-disable-line
- }
-}
diff --git a/ui/src/app/components/circular-progress.directive.js b/ui/src/app/components/circular-progress.directive.js
deleted file mode 100644
index d33b057ce5..0000000000
--- a/ui/src/app/components/circular-progress.directive.js
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Copyright © 2016-2020 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 $ from 'jquery';
-
-export default angular.module('thingsboard.directives.circularProgress', [])
- .directive('tbCircularProgress', CircularProgress)
- .name;
-
-/* eslint-disable angular/angularelement */
-
-/*@ngInject*/
-function CircularProgress($compile) {
-
- var linker = function (scope, element) {
-
- var circularProgressElement = angular.element('');
-
- $compile(circularProgressElement)(scope);
-
- var children = null;
- var cssWidth = element.prop('style')['width'];
- var width = null;
- if (!cssWidth) {
- $(element).css('width', width + 'px');
- }
-
- scope.$watch('circularProgress', function (newCircularProgress, prevCircularProgress) {
- if (newCircularProgress != prevCircularProgress) {
- if (newCircularProgress) {
- if (!cssWidth) {
- $(element).css('width', '');
- width = element.prop('offsetWidth');
- $(element).css('width', width + 'px');
- }
- children = $(element).children();
- $(element).empty();
- $(element).append($(circularProgressElement));
- } else {
- $(element).empty();
- $(element).append(children);
- if (cssWidth) {
- $(element).css('width', cssWidth);
- } else {
- $(element).css('width', '');
- }
- }
- }
- });
-
- }
-
- return {
- restrict: "A",
- link: linker,
- scope: {
- circularProgress: "=tbCircularProgress"
- }
- };
-}
-
-/* eslint-enable angular/angularelement */
diff --git a/ui/src/app/components/confirm-on-exit.directive.js b/ui/src/app/components/confirm-on-exit.directive.js
deleted file mode 100644
index 37ffe272c0..0000000000
--- a/ui/src/app/components/confirm-on-exit.directive.js
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-export default angular.module('thingsboard.directives.confirmOnExit', [])
- .directive('tbConfirmOnExit', ConfirmOnExit)
- .name;
-
-/*@ngInject*/
-function ConfirmOnExit($state, $mdDialog, $window, $filter, $parse, userService) {
- return {
- link: function ($scope, $element, $attributes) {
- $scope.confirmForm = $scope.$eval($attributes.confirmForm);
- $window.onbeforeunload = function () {
- if (userService.isAuthenticated() && (($scope.confirmForm && $scope.confirmForm.$dirty) || $scope.$eval($attributes.isDirty))) {
- return $filter('translate')('confirm-on-exit.message');
- }
- }
- $scope.$on('$stateChangeStart', function (event, next, current, params) {
- if (userService.isAuthenticated() && (($scope.confirmForm && $scope.confirmForm.$dirty) || $scope.$eval($attributes.isDirty))) {
- event.preventDefault();
- var confirm = $mdDialog.confirm()
- .title($filter('translate')('confirm-on-exit.title'))
- .htmlContent($filter('translate')('confirm-on-exit.html-message'))
- .ariaLabel($filter('translate')('confirm-on-exit.title'))
- .cancel($filter('translate')('action.cancel'))
- .ok($filter('translate')('action.ok'));
- $mdDialog.show(confirm).then(function () {
- if ($scope.confirmForm) {
- $scope.confirmForm.$setPristine();
- } else {
- var remoteSetter = $parse($attributes.isDirty).assign;
- remoteSetter($scope, false);
- //$scope.isDirty = false;
- }
- $state.go(next.name, params);
- }, function () {
- });
- }
- });
- },
- scope: false
- };
-}
\ No newline at end of file
diff --git a/ui/src/app/components/contact-short.filter.js b/ui/src/app/components/contact-short.filter.js
deleted file mode 100644
index d577d36389..0000000000
--- a/ui/src/app/components/contact-short.filter.js
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-export default angular.module('thingsboard.filters.contactShort', [])
- .filter('contactShort', ContactShort)
- .name;
-
-/*@ngInject*/
-function ContactShort($filter) {
- return function (contact) {
- var contactShort = '';
- if (contact) {
- if (contact.address) {
- contactShort += contact.address;
- contactShort += ' ';
- }
- if (contact.address2) {
- contactShort += contact.address2;
- contactShort += ' ';
- }
- if (contact.city) {
- contactShort += contact.city;
- contactShort += ' ';
- }
- if (contact.state) {
- contactShort += contact.state;
- contactShort += ' ';
- }
- if (contact.zip) {
- contactShort += contact.zip;
- contactShort += ' ';
- }
- if (contact.country) {
- contactShort += contact.country;
- }
- }
- if (contactShort === '') {
- contactShort = $filter('translate')('contact.no-address');
- }
- return contactShort;
- };
-}
diff --git a/ui/src/app/components/contact.directive.js b/ui/src/app/components/contact.directive.js
deleted file mode 100644
index 3746aefdd9..0000000000
--- a/ui/src/app/components/contact.directive.js
+++ /dev/null
@@ -1,323 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-/* eslint-disable import/no-unresolved, import/default */
-
-import contactTemplate from './contact.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-export default angular.module('thingsboard.directives.contact', [])
- .directive('tbContact', Contact)
- .name;
-
-/*@ngInject*/
-function Contact($compile, $templateCache) {
- var countries = [
- "Afghanistan",
- "Åland Islands",
- "Albania",
- "Algeria",
- "American Samoa",
- "Andorra",
- "Angola",
- "Anguilla",
- "Antarctica",
- "Antigua and Barbuda",
- "Argentina",
- "Armenia",
- "Aruba",
- "Australia",
- "Austria",
- "Azerbaijan",
- "Bahamas",
- "Bahrain",
- "Bangladesh",
- "Barbados",
- "Belarus",
- "Belgium",
- "Belize",
- "Benin",
- "Bermuda",
- "Bhutan",
- "Bolivia",
- "Bonaire, Sint Eustatius and Saba",
- "Bosnia and Herzegovina",
- "Botswana",
- "Bouvet Island",
- "Brazil",
- "British Indian Ocean Territory",
- "Brunei Darussalam",
- "Bulgaria",
- "Burkina Faso",
- "Burundi",
- "Cambodia",
- "Cameroon",
- "Canada",
- "Cape Verde",
- "Cayman Islands",
- "Central African Republic",
- "Chad",
- "Chile",
- "China",
- "Christmas Island",
- "Cocos (Keeling) Islands",
- "Colombia",
- "Comoros",
- "Congo",
- "Congo, The Democratic Republic of the",
- "Cook Islands",
- "Costa Rica",
- "Côte d'Ivoire",
- "Croatia",
- "Cuba",
- "Curaçao",
- "Cyprus",
- "Czech Republic",
- "Denmark",
- "Djibouti",
- "Dominica",
- "Dominican Republic",
- "Ecuador",
- "Egypt",
- "El Salvador",
- "Equatorial Guinea",
- "Eritrea",
- "Estonia",
- "Ethiopia",
- "Falkland Islands (Malvinas)",
- "Faroe Islands",
- "Fiji",
- "Finland",
- "France",
- "French Guiana",
- "French Polynesia",
- "French Southern Territories",
- "Gabon",
- "Gambia",
- "Georgia",
- "Germany",
- "Ghana",
- "Gibraltar",
- "Greece",
- "Greenland",
- "Grenada",
- "Guadeloupe",
- "Guam",
- "Guatemala",
- "Guernsey",
- "Guinea",
- "Guinea-Bissau",
- "Guyana",
- "Haiti",
- "Heard Island and McDonald Islands",
- "Holy See (Vatican City State)",
- "Honduras",
- "Hong Kong",
- "Hungary",
- "Iceland",
- "India",
- "Indonesia",
- "Iran, Islamic Republic of",
- "Iraq",
- "Ireland",
- "Isle of Man",
- "Israel",
- "Italy",
- "Jamaica",
- "Japan",
- "Jersey",
- "Jordan",
- "Kazakhstan",
- "Kenya",
- "Kiribati",
- "Korea, Democratic People's Republic of",
- "Korea, Republic of",
- "Kuwait",
- "Kyrgyzstan",
- "Lao People's Democratic Republic",
- "Latvia",
- "Lebanon",
- "Lesotho",
- "Liberia",
- "Libya",
- "Liechtenstein",
- "Lithuania",
- "Luxembourg",
- "Macao",
- "Macedonia, Republic Of",
- "Madagascar",
- "Malawi",
- "Malaysia",
- "Maldives",
- "Mali",
- "Malta",
- "Marshall Islands",
- "Martinique",
- "Mauritania",
- "Mauritius",
- "Mayotte",
- "Mexico",
- "Micronesia, Federated States of",
- "Moldova, Republic of",
- "Monaco",
- "Mongolia",
- "Montenegro",
- "Montserrat",
- "Morocco",
- "Mozambique",
- "Myanmar",
- "Namibia",
- "Nauru",
- "Nepal",
- "Netherlands",
- "New Caledonia",
- "New Zealand",
- "Nicaragua",
- "Niger",
- "Nigeria",
- "Niue",
- "Norfolk Island",
- "Northern Mariana Islands",
- "Norway",
- "Oman",
- "Pakistan",
- "Palau",
- "Palestinian Territory, Occupied",
- "Panama",
- "Papua New Guinea",
- "Paraguay",
- "Peru",
- "Philippines",
- "Pitcairn",
- "Poland",
- "Portugal",
- "Puerto Rico",
- "Qatar",
- "Reunion",
- "Romania",
- "Russian Federation",
- "Rwanda",
- "Saint Barthélemy",
- "Saint Helena, Ascension and Tristan da Cunha",
- "Saint Kitts and Nevis",
- "Saint Lucia",
- "Saint Martin (French Part)",
- "Saint Pierre and Miquelon",
- "Saint Vincent and the Grenadines",
- "Samoa",
- "San Marino",
- "Sao Tome and Principe",
- "Saudi Arabia",
- "Senegal",
- "Serbia",
- "Seychelles",
- "Sierra Leone",
- "Singapore",
- "Sint Maarten (Dutch Part)",
- "Slovakia",
- "Slovenia",
- "Solomon Islands",
- "Somalia",
- "South Africa",
- "South Georgia and the South Sandwich Islands",
- "South Sudan",
- "Spain",
- "Sri Lanka",
- "Sudan",
- "Suriname",
- "Svalbard and Jan Mayen",
- "Swaziland",
- "Sweden",
- "Switzerland",
- "Syrian Arab Republic",
- "Taiwan",
- "Tajikistan",
- "Tanzania, United Republic of",
- "Thailand",
- "Timor-Leste",
- "Togo",
- "Tokelau",
- "Tonga",
- "Trinidad and Tobago",
- "Tunisia",
- "Turkey",
- "Turkmenistan",
- "Turks and Caicos Islands",
- "Tuvalu",
- "Uganda",
- "Ukraine",
- "United Arab Emirates",
- "United Kingdom",
- "United States",
- "United States Minor Outlying Islands",
- "Uruguay",
- "Uzbekistan",
- "Vanuatu",
- "Venezuela",
- "Viet Nam",
- "Virgin Islands, British",
- "Virgin Islands, U.S.",
- "Wallis and Futuna",
- "Western Sahara",
- "Yemen",
- "Zambia",
- "Zimbabwe"
- ];
-
- var postalCodePatterns = {
- "United States": "(\\d{5}([\\-]\\d{4})?)",
- "Australia": "[0-9]{4}",
- "Austria": "[0-9]{4}",
- "Belgium": "[0-9]{4}",
- "Brazil": "[0-9]{5}[\\-]?[0-9]{3}",
- "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}",
- "Germany": "[0-9]{5}",
- "Hungary": "[0-9]{4}",
- "Italy": "[0-9]{5}",
- "Japan": "\\d{3}-\\d{4}",
- "Luxembourg": "(L\\s*(-|—|–))\\s*?[\\d]{4}",
- "Poland": "[0-9]{2}\\-[0-9]{3}",
- "Spain": "((0[1-9]|5[0-2])|[1-4][0-9])[0-9]{3}",
- "Sweden": "\\d{3}\\s?\\d{2}",
- "United Kingdom": "[A-Za-z]{1,2}[0-9Rr][0-9A-Za-z]? [0-9][ABD-HJLNP-UW-Zabd-hjlnp-uw-z]{2}"
- };
-
- var linker = function (scope, element) {
-
- scope.countries = countries;
-
- scope.postalCodePatterns = postalCodePatterns;
-
- var template = $templateCache.get(contactTemplate);
-
- element.html(template);
-
- $compile(element.contents())(scope);
- }
-
- return {
- restrict: "E",
- link: linker,
- scope: {
- contact: '=',
- isEdit: '=',
- theForm: '='
- }
- };
-}
diff --git a/ui/src/app/components/contact.tpl.html b/ui/src/app/components/contact.tpl.html
deleted file mode 100644
index 57f1fdc6ad..0000000000
--- a/ui/src/app/components/contact.tpl.html
+++ /dev/null
@@ -1,59 +0,0 @@
-
-
-
-
-
- {{country}}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/ui/src/app/components/dashboard-autocomplete.directive.js b/ui/src/app/components/dashboard-autocomplete.directive.js
deleted file mode 100644
index d8280bf102..0000000000
--- a/ui/src/app/components/dashboard-autocomplete.directive.js
+++ /dev/null
@@ -1,146 +0,0 @@
-/*
- * Copyright © 2016-2020 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 './dashboard-autocomplete.scss';
-
-import thingsboardApiDashboard from '../api/dashboard.service';
-import thingsboardApiUser from '../api/user.service';
-
-/* eslint-disable import/no-unresolved, import/default */
-
-import dashboardAutocompleteTemplate from './dashboard-autocomplete.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-
-export default angular.module('thingsboard.directives.dashboardAutocomplete', [thingsboardApiDashboard, thingsboardApiUser])
- .directive('tbDashboardAutocomplete', DashboardAutocomplete)
- .name;
-
-/*@ngInject*/
-function DashboardAutocomplete($compile, $templateCache, $q, dashboardService, userService) {
-
- var linker = function (scope, element, attrs, ngModelCtrl) {
- var template = $templateCache.get(dashboardAutocompleteTemplate);
- element.html(template);
-
- scope.tbRequired = angular.isDefined(scope.tbRequired) ? scope.tbRequired : false;
- scope.dashboard = null;
- scope.dashboardSearchText = '';
-
- scope.fetchDashboards = function(searchText) {
- var pageLink = {limit: 50, textSearch: searchText};
-
- var deferred = $q.defer();
-
- var promise;
- if (scope.dashboardsScope === 'customer' || userService.getAuthority() === 'CUSTOMER_USER') {
- if (scope.customerId) {
- promise = dashboardService.getCustomerDashboards(scope.customerId, pageLink, {ignoreLoading: true});
- } else {
- promise = $q.when({data: []});
- }
- } else {
- if (userService.getAuthority() === 'SYS_ADMIN') {
- if (scope.tenantId) {
- promise = dashboardService.getTenantDashboardsByTenantId(scope.tenantId, pageLink, {ignoreLoading: true});
- } else {
- promise = $q.when({data: []});
- }
- } else {
- promise = dashboardService.getTenantDashboards(pageLink, {ignoreLoading: true});
- }
- }
-
- promise.then(function success(result) {
- deferred.resolve(result.data);
- }, function fail() {
- deferred.reject();
- });
-
- return deferred.promise;
- }
-
- scope.dashboardSearchTextChanged = function() {
- }
-
- scope.updateView = function () {
- if (!scope.disabled) {
- ngModelCtrl.$setViewValue(scope.dashboard ? scope.dashboard.id.id : null);
- }
- }
-
- ngModelCtrl.$render = function () {
- if (ngModelCtrl.$viewValue) {
- dashboardService.getDashboardInfo(ngModelCtrl.$viewValue).then(
- function success(dashboard) {
- scope.dashboard = dashboard;
- startWatchers();
- },
- function fail() {
- scope.dashboard = null;
- scope.updateView();
- startWatchers();
- }
- );
- } else {
- scope.dashboard = null;
- startWatchers();
- }
- }
-
- function startWatchers() {
- scope.$watch('dashboard', function (newVal, prevVal) {
- if (!angular.equals(newVal, prevVal)) {
- scope.updateView();
- }
- });
- scope.$watch('disabled', function (newVal, prevVal) {
- if (!angular.equals(newVal, prevVal)) {
- scope.updateView();
- }
- });
- }
-
- if (scope.selectFirstDashboard) {
- var pageLink = {limit: 1, textSearch: ''};
- scope.dashboardFetchFunction(pageLink).then(function success(result) {
- var dashboards = result.data;
- if (dashboards.length > 0) {
- scope.dashboard = dashboards[0];
- scope.updateView();
- }
- }, function fail() {
- });
- }
-
- $compile(element.contents())(scope);
- }
-
- return {
- restrict: "E",
- require: "^ngModel",
- link: linker,
- scope: {
- dashboardsScope: '@',
- tenantId: '=',
- customerId: '=',
- theForm: '=?',
- tbRequired: '=?',
- disabled:'=ngDisabled',
- selectFirstDashboard: '='
- }
- };
-}
diff --git a/ui/src/app/components/dashboard-autocomplete.scss b/ui/src/app/components/dashboard-autocomplete.scss
deleted file mode 100644
index 176918f5c4..0000000000
--- a/ui/src/app/components/dashboard-autocomplete.scss
+++ /dev/null
@@ -1,32 +0,0 @@
-/**
- * Copyright © 2016-2020 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-dashboard-autocomplete {
- .tb-not-found {
- display: block;
- height: 48px;
- line-height: 1.5;
- }
-
- .tb-dashboard-item {
- display: block;
- height: 48px;
- }
-
- li {
- height: auto !important;
- white-space: normal !important;
- }
-}
diff --git a/ui/src/app/components/dashboard-autocomplete.tpl.html b/ui/src/app/components/dashboard-autocomplete.tpl.html
deleted file mode 100644
index 74b801280d..0000000000
--- a/ui/src/app/components/dashboard-autocomplete.tpl.html
+++ /dev/null
@@ -1,43 +0,0 @@
-
-
-
-
- {{item.title}}
-
-
-
-
- dashboard.no-dashboards-matching
-
-
-
-
dashboard.dashboard-required
-
-
diff --git a/ui/src/app/components/dashboard-select-panel.controller.js b/ui/src/app/components/dashboard-select-panel.controller.js
deleted file mode 100644
index 913fa89933..0000000000
--- a/ui/src/app/components/dashboard-select-panel.controller.js
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-/*@ngInject*/
-export default function DashboardSelectPanelController(mdPanelRef, $scope, $filter, dashboards, dashboardId, onDashboardSelected) {
-
- var vm = this;
- vm._mdPanelRef = mdPanelRef;
- vm.dashboards = dashboards;
- vm.dashboardId = dashboardId;
-
- vm.dashboardSelected = dashboardSelected;
-
- function dashboardSelected(dashboardId) {
- if (onDashboardSelected) {
- onDashboardSelected(dashboardId);
- }
- }
-}
diff --git a/ui/src/app/components/dashboard-select-panel.tpl.html b/ui/src/app/components/dashboard-select-panel.tpl.html
deleted file mode 100644
index 17736dd536..0000000000
--- a/ui/src/app/components/dashboard-select-panel.tpl.html
+++ /dev/null
@@ -1,31 +0,0 @@
-
-
-
-
-
-
-
-
- {{dashboard.title}}
-
-
-
-
-
-
diff --git a/ui/src/app/components/dashboard-select.directive.js b/ui/src/app/components/dashboard-select.directive.js
deleted file mode 100644
index 872b2b76c7..0000000000
--- a/ui/src/app/components/dashboard-select.directive.js
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
- * Copyright © 2016-2020 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 './dashboard-select.scss';
-
-import thingsboardApiDashboard from '../api/dashboard.service';
-import thingsboardApiUser from '../api/user.service';
-
-/* eslint-disable import/no-unresolved, import/default */
-
-import dashboardSelectTemplate from './dashboard-select.tpl.html';
-import dashboardSelectPanelTemplate from './dashboard-select-panel.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-import DashboardSelectPanelController from './dashboard-select-panel.controller';
-
-
-export default angular.module('thingsboard.directives.dashboardSelect', [thingsboardApiDashboard, thingsboardApiUser])
- .directive('tbDashboardSelect', DashboardSelect)
- .controller('DashboardSelectPanelController', DashboardSelectPanelController)
- .name;
-
-/*@ngInject*/
-function DashboardSelect($compile, $templateCache, $q, $mdMedia, $mdPanel, $document, types, dashboardService, userService) {
-
- var linker = function (scope, element, attrs, ngModelCtrl) {
- var template = $templateCache.get(dashboardSelectTemplate);
- element.html(template);
-
- scope.tbRequired = angular.isDefined(scope.tbRequired) ? scope.tbRequired : false;
- scope.dashboardId = null;
-
- var pageLink = {limit: 100};
-
- var promise;
- if (scope.dashboardsScope === 'customer' || userService.getAuthority() === 'CUSTOMER_USER') {
- if (scope.customerId && scope.customerId != types.id.nullUid) {
- promise = dashboardService.getCustomerDashboards(scope.customerId, pageLink, {ignoreLoading: true});
- } else {
- promise = $q.when({data: []});
- }
- } else {
- promise = dashboardService.getTenantDashboards(pageLink, {ignoreLoading: true});
- }
-
- promise.then(function success(result) {
- scope.dashboards = result.data;
- }, function fail() {
- scope.dashboards = [];
- });
-
- scope.updateView = function () {
- ngModelCtrl.$setViewValue(scope.dashboardId);
- }
-
- ngModelCtrl.$render = function () {
- if (ngModelCtrl.$viewValue) {
- scope.dashboardId = ngModelCtrl.$viewValue;
- } else {
- scope.dashboardId = null;
- }
- }
-
- scope.$watch('dashboardId', function () {
- scope.updateView();
- });
-
- scope.openDashboardSelectPanel = function (event) {
- if (scope.disabled) {
- return;
- }
- var position;
- var panelHeight = $mdMedia('min-height: 350px') ? 250 : 150;
- var panelWidth = 300;
- var offset = element[0].getBoundingClientRect();
- var bottomY = offset.bottom - $(window).scrollTop(); //eslint-disable-line
- var leftX = offset.left - $(window).scrollLeft(); //eslint-disable-line
- var yPosition;
- var xPosition;
- if (bottomY + panelHeight > $( window ).height()) { //eslint-disable-line
- yPosition = $mdPanel.yPosition.ABOVE;
- } else {
- yPosition = $mdPanel.yPosition.BELOW;
- }
- if (leftX + panelWidth > $( window ).width()) { //eslint-disable-line
- xPosition = $mdPanel.xPosition.CENTER;
- } else {
- xPosition = $mdPanel.xPosition.ALIGN_START;
- }
- position = $mdPanel.newPanelPosition()
- .relativeTo(element)
- .addPanelPosition(xPosition, yPosition);
- var config = {
- attachTo: angular.element($document[0].body),
- controller: 'DashboardSelectPanelController',
- controllerAs: 'vm',
- templateUrl: dashboardSelectPanelTemplate,
- panelClass: 'tb-dashboard-select-panel',
- position: position,
- fullscreen: false,
- locals: {
- dashboards: scope.dashboards,
- dashboardId: scope.dashboardId,
- onDashboardSelected: (dashboardId) => {
- if (scope.panelRef) {
- scope.panelRef.close();
- }
- scope.dashboardId = dashboardId;
- }
- },
- openFrom: event,
- clickOutsideToClose: true,
- escapeToClose: true,
- focusOnOpen: false
- };
- $mdPanel.open(config).then(function(result) {
- scope.panelRef = result;
- });
- }
-
- $compile(element.contents())(scope);
- }
-
- return {
- restrict: "E",
- require: "^ngModel",
- link: linker,
- scope: {
- dashboardsScope: '@',
- customerId: '=',
- tbRequired: '=?',
- disabled:'=ngDisabled'
- }
- };
-}
diff --git a/ui/src/app/components/dashboard-select.scss b/ui/src/app/components/dashboard-select.scss
deleted file mode 100644
index ed582c3299..0000000000
--- a/ui/src/app/components/dashboard-select.scss
+++ /dev/null
@@ -1,66 +0,0 @@
-/**
- * Copyright © 2016-2020 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";
-
-tb-dashboard-select {
- min-width: 52px;
-
- md-select {
- max-width: 300px;
- pointer-events: all;
- }
-}
-
-.tb-dashboard-select {
- min-height: 32px;
-
- span {
- pointer-events: all;
- cursor: pointer;
- }
-}
-
-.md-panel {
- &.tb-dashboard-select-panel {
- position: absolute;
- }
-}
-
-.tb-dashboard-select-panel {
- min-width: 300px;
- max-width: 320px;
- max-height: 150px;
- overflow-x: hidden;
- overflow-y: auto;
- background: #fff;
- border-radius: 4px;
- box-shadow:
- 0 7px 8px -4px rgba(0, 0, 0, .2),
- 0 13px 19px 2px rgba(0, 0, 0, .14),
- 0 5px 24px 4px rgba(0, 0, 0, .12);
-
- @media (min-height: 350px) {
- max-height: 250px;
- }
-
- @media (min-width: $layout-breakpoint-xs) {
- max-width: 100%;
- }
-
- md-content {
- background-color: #fff;
- }
-}
diff --git a/ui/src/app/components/dashboard-select.tpl.html b/ui/src/app/components/dashboard-select.tpl.html
deleted file mode 100644
index c5694e71f5..0000000000
--- a/ui/src/app/components/dashboard-select.tpl.html
+++ /dev/null
@@ -1,34 +0,0 @@
-
-
-
- {{dashboard.title}}
-
-
-
-
-
- {{ 'dashboard.select-dashboard' | translate }}
-
- dashboards
-
-
\ No newline at end of file
diff --git a/ui/src/app/components/dashboard.directive.js b/ui/src/app/components/dashboard.directive.js
deleted file mode 100644
index c046c90c3b..0000000000
--- a/ui/src/app/components/dashboard.directive.js
+++ /dev/null
@@ -1,1095 +0,0 @@
-/*
- * Copyright © 2016-2020 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 './dashboard.scss';
-
-import 'javascript-detect-element-resize/detect-element-resize';
-import angularGridster from 'angular-gridster';
-import thingsboardTypes from '../common/types.constant';
-import thingsboardApiWidget from '../api/widget.service';
-import thingsboardWidget from './widget/widget.directive';
-import thingsboardToast from '../services/toast';
-import thingsboardTimewindow from './timewindow.directive';
-import thingsboardEvents from './tb-event-directives';
-import thingsboardMousepointMenu from './mousepoint-menu.directive';
-
-/* eslint-disable import/no-unresolved, import/default */
-
-import dashboardTemplate from './dashboard.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-/* eslint-disable angular/angularelement */
-
-export default angular.module('thingsboard.directives.dashboard', [thingsboardTypes,
- thingsboardToast,
- thingsboardApiWidget,
- thingsboardWidget,
- thingsboardTimewindow,
- thingsboardEvents,
- thingsboardMousepointMenu,
- angularGridster.name])
- .directive('tbDashboard', Dashboard)
- .name;
-
-/*@ngInject*/
-function Dashboard() {
- return {
- restrict: "E",
- scope: true,
- bindToController: {
- widgets: '=',
- widgetLayouts: '=?',
- aliasController: '=',
- stateController: '=',
- dashboardTimewindow: '=?',
- columns: '=',
- margins: '=',
- isEdit: '=',
- autofillHeight: '=',
- mobileAutofillHeight: '=?',
- mobileRowHeight: '=?',
- isMobile: '=',
- isMobileDisabled: '=?',
- isEditActionEnabled: '=',
- isExportActionEnabled: '=',
- isRemoveActionEnabled: '=',
- onEditWidget: '&?',
- onExportWidget: '&?',
- onRemoveWidget: '&?',
- onWidgetMouseDown: '&?',
- onWidgetClicked: '&?',
- prepareDashboardContextMenu: '&?',
- prepareWidgetContextMenu: '&?',
- loadWidgets: '&?',
- onInit: '&?',
- onInitFailed: '&?',
- dashboardStyle: '=?',
- dashboardClass: '=?',
- ignoreLoading: '=?'
- },
- controller: DashboardController,
- controllerAs: 'vm',
- templateUrl: dashboardTemplate
- };
-}
-
-/*@ngInject*/
-function DashboardController($scope, $rootScope, $element, $timeout, $mdMedia, $mdUtil, $q, timeService, types, utils) {
-
- var highlightedMode = false;
- var highlightedWidget = null;
- var selectedWidget = null;
-
- var gridsterParent = angular.element('#gridster-parent', $element);
- var gridsterElement = angular.element('#gridster-child', gridsterParent);
-
- var vm = this;
-
- vm.gridster = null;
-
- vm.isMobileDisabled = angular.isDefined(vm.isMobileDisabled) ? vm.isMobileDisabled : false;
-
- vm.isMobileSize = false;
-
- if (!('dashboardTimewindow' in vm)) {
- vm.dashboardTimewindow = timeService.defaultTimewindow();
- }
-
- vm.dashboardLoading = true;
- vm.visibleRect = {
- top: 0,
- bottom: 0,
- left: 0,
- right: 0
- };
- vm.gridsterOpts = {
- pushing: false,
- floating: false,
- swapping: false,
- maxRows: 100,
- columns: vm.columns ? vm.columns : 24,
- margins: vm.margins ? vm.margins : [10, 10],
- minSizeX: 1,
- minSizeY: 1,
- defaultSizeX: 8,
- defaultSizeY: 6,
- resizable: {
- enabled: vm.isEdit
- },
- draggable: {
- enabled: vm.isEdit
- },
- saveGridItemCalculatedHeightInMobile: true
- };
-
- updateMobileOpts();
-
- vm.widgetLayoutInfo = {
- };
-
- vm.widgetIds = [];
-
- vm.widgetItemMap = {
- sizeX: 'vm.widgetLayoutInfo[widget.id].sizeX',
- sizeY: 'vm.widgetLayoutInfo[widget.id].sizeY',
- row: 'vm.widgetLayoutInfo[widget.id].row',
- col: 'vm.widgetLayoutInfo[widget.id].col',
- minSizeY: 'widget.minSizeY',
- maxSizeY: 'widget.maxSizeY'
- };
-
- /*vm.widgetItemMap = {
- sizeX: 'vm.widgetSizeX(widget)',
- sizeY: 'vm.widgetSizeY(widget)',
- row: 'vm.widgetRow(widget)',
- col: 'vm.widgetCol(widget)',
- minSizeY: 'widget.minSizeY',
- maxSizeY: 'widget.maxSizeY'
- };*/
-
- vm.isWidgetExpanded = false;
- vm.isHighlighted = isHighlighted;
- vm.isNotHighlighted = isNotHighlighted;
- vm.selectWidget = selectWidget;
- vm.getSelectedWidget = getSelectedWidget;
- vm.highlightWidget = highlightWidget;
- vm.resetHighlight = resetHighlight;
-
- vm.onWidgetFullscreenChanged = onWidgetFullscreenChanged;
-
- vm.isAutofillHeight = autofillHeight;
-
- vm.widgetMouseDown = widgetMouseDown;
- vm.widgetClicked = widgetClicked;
-
- vm.widgetSizeX = widgetSizeX;
- vm.widgetSizeY = widgetSizeY;
- vm.widgetRow = widgetRow;
- vm.widgetCol = widgetCol;
- vm.widgetStyle = widgetStyle;
- vm.showWidgetTitle = showWidgetTitle;
- vm.showWidgetTitleIcon = showWidgetTitleIcon;
- vm.hasWidgetTitleTemplate = hasWidgetTitleTemplate;
- vm.widgetTitleTemplate = widgetTitleTemplate;
- vm.showWidgetTitlePanel = showWidgetTitlePanel;
- vm.showWidgetActions = showWidgetActions;
- vm.widgetTitleStyle = widgetTitleStyle;
- vm.widgetTitle = widgetTitle;
- vm.widgetTitleIcon = widgetTitleIcon;
- vm.widgetTitleIconStyle = widgetTitleIconStyle;
- vm.widgetTitleTooltip = widgetTitleTooltip;
- vm.customWidgetHeaderActions = customWidgetHeaderActions;
- vm.widgetActions = widgetActions;
- vm.dropWidgetShadow = dropWidgetShadow;
- vm.enableWidgetFullscreen = enableWidgetFullscreen;
- vm.hasTimewindow = hasTimewindow;
- vm.hasAggregation = hasAggregation;
- vm.editWidget = editWidget;
- vm.exportWidget = exportWidget;
- vm.removeWidget = removeWidget;
- vm.loading = loading;
-
- vm.openDashboardContextMenu = openDashboardContextMenu;
- vm.openWidgetContextMenu = openWidgetContextMenu;
-
- vm.getEventGridPosition = getEventGridPosition;
- vm.reload = reload;
-
- vm.contextMenuItems = [];
- vm.contextMenuEvent = null;
-
- vm.widgetContextMenuItems = [];
- vm.widgetContextMenuEvent = null;
-
- vm.dashboardTimewindowApi = {
- onResetTimewindow: function() {
- $timeout(function() {
- if (vm.originalDashboardTimewindow) {
- vm.dashboardTimewindow = angular.copy(vm.originalDashboardTimewindow);
- vm.originalDashboardTimewindow = null;
- }
- }, 0);
- },
- onUpdateTimewindow: function(startTimeMs, endTimeMs, interval) {
- if (!vm.originalDashboardTimewindow) {
- vm.originalDashboardTimewindow = angular.copy(vm.dashboardTimewindow);
- }
- $timeout(function() {
- vm.dashboardTimewindow = timeService.toHistoryTimewindow(vm.dashboardTimewindow, startTimeMs, endTimeMs, interval);
- }, 0);
- },
- };
-
- addResizeListener(gridsterParent[0], onGridsterParentResize); // eslint-disable-line no-undef
-
- $scope.$on("$destroy", function () {
- removeResizeListener(gridsterParent[0], onGridsterParentResize); // eslint-disable-line no-undef
- });
-
- function onGridsterParentResize() {
- if (gridsterParent.height() && autofillHeight()) {
- updateMobileOpts();
- }
- }
-
- //TODO: widgets visibility
- /*gridsterParent.scroll(function () {
- updateVisibleRect();
- });
-
- gridsterParent.resize(function () {
- updateVisibleRect();
- });*/
-
- function updateMobileOpts() {
- var isMobileDisabled = vm.isMobileDisabled === true;
- var isMobile = vm.isMobile === true && !isMobileDisabled;
- var mobileBreakPoint = isMobileDisabled ? 0 : (isMobile ? 20000 : 960);
-
- if (!isMobile && !isMobileDisabled) {
- isMobile = !$mdMedia('gt-sm');
- }
-
- if (vm.gridsterOpts.isMobile != isMobile) {
- vm.gridsterOpts.isMobile = isMobile;
- vm.gridsterOpts.mobileModeEnabled = isMobile;
- }
- if (vm.gridsterOpts.mobileBreakPoint != mobileBreakPoint) {
- vm.gridsterOpts.mobileBreakPoint = mobileBreakPoint;
- }
- detectRowSize(isMobile).then(
- function(rowHeight) {
- if (vm.gridsterOpts.rowHeight != rowHeight) {
- vm.gridsterOpts.rowHeight = rowHeight;
- }
- }
- );
- vm.isMobileSize = checkIsMobileSize();
- }
-
- function checkIsMobileSize() {
- var isMobileDisabled = vm.isMobileDisabled === true;
- var isMobileSize = vm.isMobile === true && !isMobileDisabled;
- if (!isMobileSize && !isMobileDisabled) {
- isMobileSize = !$mdMedia('gt-sm');
- }
- return isMobileSize;
- }
-
- $scope.$watch('vm.columns', function () {
- var columns = vm.columns ? vm.columns : 24;
- if (vm.gridsterOpts.columns != columns) {
- vm.gridsterOpts.columns = columns;
- if (vm.gridster) {
- vm.gridster.columns = vm.columns;
- updateGridsterParams();
- }
- //TODO: widgets visibility
- //updateVisibleRect();
- }
- });
-
- $scope.$watch(function() {
- return $mdMedia('gt-sm') + ',' + vm.isMobile + ',' + vm.isMobileDisabled;
- }, function() {
- updateMobileOpts();
- sortWidgets();
- });
-
- $scope.$watch(function() {
- return vm.autofillHeight + ',' + vm.mobileAutofillHeight + ',' + vm.mobileRowHeight;
- }, function () {
- updateMobileOpts();
- });
-
- $scope.$watch('vm.margins', function () {
- var margins = vm.margins ? vm.margins : [10, 10];
- if (!angular.equals(vm.gridsterOpts.margins, margins)) {
- vm.gridsterOpts.margins = margins;
- updateMobileOpts();
- if (vm.gridster) {
- vm.gridster.margins = vm.margins;
- updateGridsterParams();
- }
- //TODO: widgets visibility
- //updateVisibleRect();
- }
- });
-
- $scope.$watch('vm.isEdit', function () {
- vm.gridsterOpts.resizable.enabled = vm.isEdit;
- vm.gridsterOpts.draggable.enabled = vm.isEdit;
- $scope.$broadcast('toggleDashboardEditMode', vm.isEdit);
- });
-
- $scope.$watch('vm.isMobileSize', function (newVal, prevVal) {
- if (!angular.equals(newVal, prevVal)) {
- $scope.$broadcast('mobileModeChanged', vm.isMobileSize);
- }
- });
-
- $scope.$watchCollection('vm.widgets', function () {
- var ids = [];
- for (var i=0;i= 0) {
- order = vm.widgetLayouts[widget.id].mobileOrder;
- } else if (angular.isDefined(widget.config.mobileOrder) && widget.config.mobileOrder >= 0) {
- order = widget.config.mobileOrder;
- } else if (hasLayout) {
- order = vm.widgetLayouts[widget.id].row;
- } else {
- order = widget.row;
- }
- return order;
- }
-
- $scope.$on('widgetPositionChanged', function () {
- sortWidgets();
- });
-
- loadDashboard();
-
- function sortWidgets() {
- vm.widgets.sort(function (widget1, widget2) {
- var row1 = widgetOrder(widget1);
- var row2 = widgetOrder(widget2);
- var res = row1 - row2;
- if (res === 0) {
- res = widgetCol(widget1) - widgetCol(widget2);
- }
- return res;
- });
- }
-
- function reload() {
- loadDashboard();
- }
-
- function loadDashboard() {
- $timeout(function () {
- if (vm.loadWidgets) {
- var promise = vm.loadWidgets();
- if (promise) {
- promise.then(function () {
- dashboardLoaded();
- }, function () {
- dashboardLoaded();
- });
- } else {
- dashboardLoaded();
- }
- } else {
- dashboardLoaded();
- }
- }, 0, false);
- }
-
- function updateGridsterParams() {
- if (vm.gridster) {
- if (vm.gridster.colWidth === 'auto') {
- vm.gridster.curColWidth = (vm.gridster.curWidth + (vm.gridster.outerMargin ? -vm.gridster.margins[1] : vm.gridster.margins[1])) / vm.gridster.columns;
- } else {
- vm.gridster.curColWidth = vm.gridster.colWidth;
- }
- vm.gridster.curRowHeight = vm.gridster.rowHeight;
- if (angular.isString(vm.gridster.rowHeight)) {
- if (vm.gridster.rowHeight === 'match') {
- vm.gridster.curRowHeight = Math.round(vm.gridster.curColWidth);
- } else if (vm.gridster.rowHeight.indexOf('*') !== -1) {
- vm.gridster.curRowHeight = Math.round(vm.gridster.curColWidth * vm.gridster.rowHeight.replace('*', '').replace(' ', ''));
- } else if (vm.gridster.rowHeight.indexOf('/') !== -1) {
- vm.gridster.curRowHeight = Math.round(vm.gridster.curColWidth / vm.gridster.rowHeight.replace('/', '').replace(' ', ''));
- }
- }
- }
- }
-
- //TODO: widgets visibility
- /*function updateVisibleRect (force, containerResized) {
- if (vm.gridster) {
- var position = $(vm.gridster.$element).position()
- if (position) {
- var viewportWidth = gridsterParent.width();
- var viewportHeight = gridsterParent.height();
- var top = -position.top;
- var bottom = top + viewportHeight;
- var left = -position.left;
- var right = left + viewportWidth;
-
- var newVisibleRect = {
- top: vm.gridster.pixelsToRows(top),
- topPx: top,
- bottom: vm.gridster.pixelsToRows(bottom),
- bottomPx: bottom,
- left: vm.gridster.pixelsToColumns(left),
- right: vm.gridster.pixelsToColumns(right),
- isMobile: vm.gridster.isMobile,
- curRowHeight: vm.gridster.curRowHeight,
- containerResized: containerResized
- };
-
- if (force ||
- newVisibleRect.top != vm.visibleRect.top ||
- newVisibleRect.topPx != vm.visibleRect.topPx ||
- newVisibleRect.bottom != vm.visibleRect.bottom ||
- newVisibleRect.bottomPx != vm.visibleRect.bottomPx ||
- newVisibleRect.left != vm.visibleRect.left ||
- newVisibleRect.right != vm.visibleRect.right ||
- newVisibleRect.isMobile != vm.visibleRect.isMobile ||
- newVisibleRect.curRowHeight != vm.visibleRect.curRowHeight ||
- newVisibleRect.containerResized != vm.visibleRect.containerResized) {
- vm.visibleRect = newVisibleRect;
- $scope.$broadcast('visibleRectChanged', vm.visibleRect);
- }
- }
- }
- }*/
-
- function checkIsLocalGridsterElement (gridster) {
- return gridsterElement && gridsterElement[0] === gridster.$element[0];
- }
-
- function onWidgetFullscreenChanged(expanded, widget) {
- vm.isWidgetExpanded = expanded;
- $scope.$broadcast('onWidgetFullscreenChanged', vm.isWidgetExpanded, widget);
- }
-
- function widgetMouseDown ($event, widget) {
- if (vm.onWidgetMouseDown) {
- vm.onWidgetMouseDown({event: $event, widget: widget});
- }
- }
-
- function widgetClicked ($event, widget) {
- if (vm.onWidgetClicked) {
- vm.onWidgetClicked({event: $event, widget: widget});
- }
- }
-
- function openDashboardContextMenu($event, $mdOpenMousepointMenu) {
- if (vm.prepareDashboardContextMenu) {
- vm.contextMenuItems = vm.prepareDashboardContextMenu();
- if (vm.contextMenuItems && vm.contextMenuItems.length > 0) {
- vm.contextMenuEvent = $event;
- $mdOpenMousepointMenu($event);
- }
- }
- }
-
- function openWidgetContextMenu($event, widget, $mdOpenMousepointMenu) {
- if (vm.prepareWidgetContextMenu) {
- vm.widgetContextMenuItems = vm.prepareWidgetContextMenu({widget: widget});
- if (vm.widgetContextMenuItems && vm.widgetContextMenuItems.length > 0) {
- vm.widgetContextMenuEvent = $event;
- $mdOpenMousepointMenu($event);
- }
- }
- }
-
- function getEventGridPosition(event) {
- var pos = {
- row: 0,
- column: 0
- }
- if (!gridsterParent) {
- return pos;
- }
- var offset = gridsterParent.offset();
- var x = event.pageX - offset.left + gridsterParent.scrollLeft();
- var y = event.pageY - offset.top + gridsterParent.scrollTop();
- if (vm.gridster) {
- pos.row = vm.gridster.pixelsToRows(y);
- pos.column = vm.gridster.pixelsToColumns(x);
- }
- return pos;
- }
-
- function editWidget ($event, widget) {
- if ($event) {
- $event.stopPropagation();
- }
- if (vm.isEditActionEnabled && vm.onEditWidget) {
- vm.onEditWidget({event: $event, widget: widget});
- }
- }
-
- function exportWidget ($event, widget) {
- if ($event) {
- $event.stopPropagation();
- }
- if (vm.isExportActionEnabled && vm.onExportWidget) {
- vm.onExportWidget({event: $event, widget: widget});
- }
- }
-
- function removeWidget($event, widget) {
- if ($event) {
- $event.stopPropagation();
- }
- if (vm.isRemoveActionEnabled && vm.onRemoveWidget) {
- vm.onRemoveWidget({event: $event, widget: widget});
- }
- }
-
- function highlightWidget(widget, delay) {
- if (!highlightedMode || highlightedWidget != widget) {
- highlightedMode = true;
- highlightedWidget = widget;
- scrollToWidget(widget, delay);
- }
- }
-
- function selectWidget(widget, delay) {
- if (selectedWidget != widget) {
- selectedWidget = widget;
- scrollToWidget(widget, delay);
- }
- }
-
- function scrollToWidget(widget, delay) {
- if (vm.gridster) {
- var item = angular.element('.gridster-item', vm.gridster.$element)[vm.widgets.indexOf(widget)];
- if (item) {
- var height = angular.element(item).outerHeight(true);
- var rectHeight = gridsterParent.height();
- var offset = (rectHeight - height) / 2;
- var scrollTop = item.offsetTop;
- if (offset > 0) {
- scrollTop -= offset;
- }
- gridsterParent.animate({
- scrollTop: scrollTop
- }, delay);
- }
- }
- }
-
- function getSelectedWidget() {
- return selectedWidget;
- }
-
- function resetHighlight() {
- highlightedMode = false;
- highlightedWidget = null;
- selectedWidget = null;
- }
-
- function isHighlighted(widget) {
- return (highlightedMode && highlightedWidget === widget) || (selectedWidget === widget);
- }
-
- function isNotHighlighted(widget) {
- return highlightedMode && highlightedWidget != widget;
- }
-
- function widgetSizeX(widget) {
- if (vm.widgetLayouts && vm.widgetLayouts[widget.id]) {
- return vm.widgetLayouts[widget.id].sizeX;
- } else {
- return widget.sizeX;
- }
- }
-
- function setWidgetSizeX(widget, sizeX) {
- if (!vm.gridsterOpts.isMobile) {
- if (vm.widgetLayouts && vm.widgetLayouts[widget.id]) {
- vm.widgetLayouts[widget.id].sizeX = sizeX;
- } else {
- widget.sizeX = sizeX;
- }
- }
- }
-
- function widgetSizeY(widget) {
- if (vm.gridsterOpts.isMobile && !vm.mobileAutofillHeight) {
- var mobileHeight;
- if (vm.widgetLayouts && vm.widgetLayouts[widget.id]) {
- mobileHeight = vm.widgetLayouts[widget.id].mobileHeight;
- }
- if (!mobileHeight && widget.config.mobileHeight) {
- mobileHeight = widget.config.mobileHeight;
- }
- if (mobileHeight) {
- return mobileHeight;
- } else {
- return widget.sizeY * 24 / vm.gridsterOpts.columns;
- }
- } else {
- if (vm.widgetLayouts && vm.widgetLayouts[widget.id]) {
- return vm.widgetLayouts[widget.id].sizeY;
- } else {
- return widget.sizeY;
- }
- }
- }
-
- function setWidgetSizeY(widget, sizeY) {
- if (!vm.gridsterOpts.isMobile && !vm.autofillHeight) {
- if (vm.widgetLayouts && vm.widgetLayouts[widget.id]) {
- vm.widgetLayouts[widget.id].sizeY = sizeY;
- } else {
- widget.sizeY = sizeY;
- }
- }
- }
-
- function widgetRow(widget) {
- if (vm.widgetLayouts && vm.widgetLayouts[widget.id]) {
- return vm.widgetLayouts[widget.id].row;
- } else {
- return widget.row;
- }
- }
-
- function setWidgetRow(widget, row) {
- if (!vm.gridsterOpts.isMobile) {
- if (vm.widgetLayouts && vm.widgetLayouts[widget.id]) {
- vm.widgetLayouts[widget.id].row = row;
- } else {
- widget.row = row;
- }
- }
- }
-
- function widgetCol(widget) {
- if (vm.widgetLayouts && vm.widgetLayouts[widget.id]) {
- return vm.widgetLayouts[widget.id].col;
- } else {
- return widget.col;
- }
- }
-
- function setWidgetCol(widget, col) {
- if (!vm.gridsterOpts.isMobile) {
- if (vm.widgetLayouts && vm.widgetLayouts[widget.id]) {
- vm.widgetLayouts[widget.id].col = col;
- } else {
- widget.col = col;
- }
- }
- }
-
- function widgetStyle(widget) {
- var style = {cursor: 'pointer',
- color: widgetColor(widget),
- backgroundColor: widgetBackgroundColor(widget),
- padding: widgetPadding(widget),
- margin: widgetMargin(widget)};
- if (angular.isDefined(widget.config.widgetStyle)) {
- Object.assign(style, widget.config.widgetStyle);
- }
- return style;
- }
-
- function widgetColor(widget) {
- if (widget.config.color) {
- return widget.config.color;
- } else {
- return 'rgba(0, 0, 0, 0.87)';
- }
- }
-
- function widgetBackgroundColor(widget) {
- if (widget.config.backgroundColor) {
- return widget.config.backgroundColor;
- } else {
- return '#fff';
- }
- }
-
- function widgetPadding(widget) {
- if (widget.config.padding) {
- return widget.config.padding;
- } else {
- return '8px';
- }
- }
-
- function widgetMargin(widget) {
- if (widget.config.margin) {
- return widget.config.margin;
- } else {
- return '0px';
- }
- }
-
- function showWidgetTitle(widget) {
- if (angular.isDefined(widget.config.showTitle)) {
- return widget.config.showTitle;
- } else {
- return true;
- }
- }
-
- function showWidgetTitleIcon(widget) {
- if (angular.isDefined(widget.config.showTitleIcon)) {
- return widget.config.showTitleIcon;
- } else {
- return false;
- }
- }
-
- function hasWidgetTitleTemplate(widget) {
- var ctx = widgetContext(widget);
- if (ctx && ctx.widgetTitleTemplate) {
- return true;
- } else {
- return false;
- }
- }
-
- function widgetTitleTemplate(widget) {
- var ctx = widgetContext(widget);
- if (ctx && ctx.widgetTitleTemplate) {
- return ctx.widgetTitleTemplate;
- } else {
- return '';
- }
- }
-
- function showWidgetTitlePanel(widget) {
- var ctx = widgetContext(widget);
- if (ctx && ctx.hideTitlePanel) {
- return false;
- } else {
- return hasWidgetTitleTemplate(widget) || showWidgetTitle(widget) || hasTimewindow(widget);
- }
- }
-
- function showWidgetActions(widget) {
- var ctx = widgetContext(widget);
- if (ctx && ctx.hideTitlePanel) {
- return false;
- } else {
- return true;
- }
- }
-
- function widgetTitleStyle(widget) {
- if (angular.isDefined(widget.config.titleStyle)) {
- return widget.config.titleStyle;
- } else {
- return {};
- }
- }
-
- function widgetTitle(widget) {
- var ctx = widgetContext(widget);
- if (ctx && ctx.widgetTitle
- && ctx.widgetTitle.length) {
- return ctx.widgetTitle;
- } else {
- return widget.config.title;
- }
- }
-
- function widgetTitleIcon(widget) {
- if (angular.isDefined(widget.config.titleIcon)) {
- return widget.config.titleIcon;
- } else {
- return '';
- }
- }
-
- function widgetTitleIconStyle(widget) {
- var style = {};
- if (angular.isDefined(widget.config.iconColor)) {
- style.color = widget.config.iconColor;
- }
- if (angular.isDefined(widget.config.iconSize)) {
- style.fontSize = widget.config.iconSize;
- }
- return style;
- }
-
- function widgetTitleTooltip(widget) {
- var ctx = widgetContext(widget);
- if (ctx && ctx.widgetTitleTooltip
- && ctx.widgetTitleTooltip.length) {
- return ctx.widgetTitleTooltip;
- } else {
- return widget.config.titleTooltip;
- }
- }
-
- function customWidgetHeaderActions(widget) {
- var ctx = widgetContext(widget);
- if (ctx && ctx.customHeaderActions && ctx.customHeaderActions.length) {
- return ctx.customHeaderActions;
- } else {
- return [];
- }
- }
-
- function widgetActions(widget) {
- var ctx = widgetContext(widget);
- if (ctx && ctx.widgetActions && ctx.widgetActions.length) {
- return ctx.widgetActions;
- } else {
- return [];
- }
- }
-
- function widgetContext(widget) {
- var context;
- if (widget.$ctx) {
- context = widget.$ctx();
- }
- return context;
- }
-
- function dropWidgetShadow(widget) {
- if (angular.isDefined(widget.config.dropShadow)) {
- return widget.config.dropShadow;
- } else {
- return true;
- }
- }
-
- function enableWidgetFullscreen(widget) {
- if (angular.isDefined(widget.config.enableFullscreen)) {
- return widget.config.enableFullscreen;
- } else {
- return true;
- }
- }
-
- function hasTimewindow(widget) {
- if (widget.type === types.widgetType.timeseries.value || widget.type === types.widgetType.alarm.value) {
- return angular.isDefined(widget.config.useDashboardTimewindow) ?
- (!widget.config.useDashboardTimewindow && (angular.isUndefined(widget.config.displayTimewindow) || widget.config.displayTimewindow)) : false;
- } else {
- return false;
- }
- }
-
- function hasAggregation(widget) {
- return widget.type === types.widgetType.timeseries.value;
- }
-
- function adoptMaxRows() {
- if (vm.widgets) {
- var maxRows = vm.gridsterOpts.maxRows;
- for (var i = 0; i < vm.widgets.length; i++) {
- var w = vm.widgets[i];
- var bottom = widgetRow(w) + widgetSizeY(w);
- maxRows = Math.max(maxRows, bottom);
- }
- vm.gridsterOpts.maxRows = Math.max(maxRows, vm.gridsterOpts.maxRows);
- }
- }
-
- function dashboardLoaded() {
- $mdUtil.nextTick(function () {
- if (vm.dashboardTimewindowWatch) {
- vm.dashboardTimewindowWatch();
- vm.dashboardTimewindowWatch = null;
- }
- vm.dashboardTimewindowWatch = $scope.$watch('vm.dashboardTimewindow', function () {
- $scope.$broadcast('dashboardTimewindowChanged', vm.dashboardTimewindow);
- }, true);
- adoptMaxRows();
- vm.dashboardLoading = false;
- if ($scope.gridsterScopeWatcher) {
- $scope.gridsterScopeWatcher();
- }
- $scope.gridsterScopeWatcher = $scope.$watch(
- function() {
- var hasScope = gridsterElement.scope() ? true : false;
- return hasScope;
- },
- function(hasScope) {
- if (hasScope) {
- $scope.gridsterScopeWatcher();
- $scope.gridsterScopeWatcher = null;
- var gridsterScope = gridsterElement.scope();
- vm.gridster = gridsterScope.gridster;
- setupGridster(vm.gridster);
- if (vm.onInit) {
- vm.onInit({dashboard: vm});
- }
- }
- }
- );
- });
- }
-
- function setupGridster(gridster) {
- if (gridster) {
- if (!gridster.origMoveOverlappingItems) {
- gridster.origMoveOverlappingItems = gridster.moveOverlappingItems;
- gridster.moveOverlappingItems = () => {};
- }
- }
- }
-
- function loading() {
- return !vm.ignoreLoading && $rootScope.loading;
- }
-
-}
-
-/* eslint-enable angular/angularelement */
diff --git a/ui/src/app/components/dashboard.scss b/ui/src/app/components/dashboard.scss
deleted file mode 100644
index 6ba550fbf2..0000000000
--- a/ui/src/app/components/dashboard.scss
+++ /dev/null
@@ -1,126 +0,0 @@
-/**
- * Copyright © 2016-2020 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 "~compass-sass-mixins/lib/compass";
-
-div.tb-widget {
- position: relative;
- height: 100%;
- margin: 0;
- overflow: hidden;
- outline: none;
-
- transition: all .2s ease-in-out;
-
- .tb-widget-title {
- max-height: 65px;
- padding-top: 5px;
- padding-left: 5px;
- overflow: hidden;
-
- tb-timewindow {
- font-size: 14px;
- opacity: .85;
- }
-
- .title{
- width: 100%;
- overflow: hidden;
- text-overflow: ellipsis;
- }
- }
-
- .tb-widget-actions {
- z-index: 19;
- margin: 5px 0 0;
-
- &-absolute{
- position: absolute;
- top: 3px;
- right: 8px;
- }
-
- .md-button.md-icon-button {
- width: 32px;
- min-width: 32px;
- height: 32px;
- min-height: 32px;
- padding: 0 !important;
- margin: 0 !important;
- line-height: 20px;
-
- md-icon,
- ng-md-icon {
- width: 20px;
- min-width: 20px;
- height: 20px;
- min-height: 20px;
- font-size: 20px;
- }
- }
- }
-
- .tb-widget-content {
- tb-widget {
- position: relative;
- width: 100%;
- }
- }
-}
-
-div.tb-widget.tb-highlighted {
- border: 1px solid #039be5;
- box-shadow: 0 0 20px #039be5;
-}
-
-div.tb-widget.tb-not-highlighted {
- opacity: .5;
-}
-
-tb-dashboard {
- position: absolute;
- top: 0;
- right: 0;
- bottom: 0;
- left: 0;
-}
-
-md-content.tb-dashboard-content {
- position: absolute;
- top: 0;
- right: 0;
- bottom: 0;
- left: 0;
- background: none;
- outline: none;
-
- .gridster-item {
- transition: none;
- }
-}
-
-.tb-widget-error-container {
- position: absolute;
- width: 100%;
- height: 100%;
- background-color: #fff;
-}
-
-.tb-widget-error-msg {
- padding: 5px;
- font-size: 16px;
- color: #f00;
- word-wrap: break-word;
-}
diff --git a/ui/src/app/components/dashboard.tpl.html b/ui/src/app/components/dashboard.tpl.html
deleted file mode 100644
index fd9eac4a99..0000000000
--- a/ui/src/app/components/dashboard.tpl.html
+++ /dev/null
@@ -1,158 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
diff --git a/ui/src/app/components/datakey-config-dialog.controller.js b/ui/src/app/components/datakey-config-dialog.controller.js
deleted file mode 100644
index 3e34420671..0000000000
--- a/ui/src/app/components/datakey-config-dialog.controller.js
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Copyright © 2016-2020 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 thingsboardDatakeyConfig from './datakey-config.directive';
-
-export default angular.module('thingsboard.dialogs.datakeyConfigDialog', [thingsboardDatakeyConfig])
- .controller('DatakeyConfigDialogController', DatakeyConfigDialogController)
- .name;
-
-/*@ngInject*/
-function DatakeyConfigDialogController($scope, $mdDialog, $q, entityService, dataKey, dataKeySettingsSchema, entityAlias, aliasController) {
-
- var vm = this;
-
- vm.dataKey = dataKey;
- vm.dataKeySettingsSchema = dataKeySettingsSchema;
- vm.entityAlias = entityAlias;
- vm.aliasController = aliasController;
-
- vm.hide = function () {
- $mdDialog.hide();
- };
-
- vm.cancel = function () {
- $mdDialog.cancel();
- };
-
- vm.fetchEntityKeys = function (entityAliasId, query, type) {
- var deferred = $q.defer();
- vm.aliasController.getAliasInfo(entityAliasId).then(
- function success(aliasInfo) {
- var entity = aliasInfo.currentEntity;
- if (entity) {
- entityService.getEntityKeys(entity.entityType, entity.id, query, type, {ignoreLoading: true}).then(
- function success(keys) {
- deferred.resolve(keys);
- },
- function fail() {
- deferred.resolve([]);
- }
- );
- } else {
- deferred.resolve([]);
- }
- },
- function fail() {
- deferred.resolve([]);
- }
- );
- return deferred.promise;
- };
-
- vm.save = function () {
- $scope.$broadcast('form-submit');
- if ($scope.theForm.$valid) {
- $scope.theForm.$setPristine();
- $mdDialog.hide(vm.dataKey);
- }
- };
-}
\ No newline at end of file
diff --git a/ui/src/app/components/datakey-config-dialog.tpl.html b/ui/src/app/components/datakey-config-dialog.tpl.html
deleted file mode 100644
index 05344bccd8..0000000000
--- a/ui/src/app/components/datakey-config-dialog.tpl.html
+++ /dev/null
@@ -1,46 +0,0 @@
-
-
-
-
diff --git a/ui/src/app/components/datakey-config.directive.js b/ui/src/app/components/datakey-config.directive.js
deleted file mode 100644
index 593bbaa76d..0000000000
--- a/ui/src/app/components/datakey-config.directive.js
+++ /dev/null
@@ -1,167 +0,0 @@
-/*
- * Copyright © 2016-2020 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 './datakey-config.scss';
-
-import thingsboardJsonForm from "./json-form.directive";
-import thingsboardTypes from '../common/types.constant';
-import thingsboardJsFunc from './js-func.directive';
-
-/* eslint-disable import/no-unresolved, import/default */
-
-import datakeyConfigTemplate from './datakey-config.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-export default angular.module('thingsboard.directives.datakeyConfig', [thingsboardTypes, thingsboardJsFunc, thingsboardJsonForm])
- .directive('tbDatakeyConfig', DatakeyConfig)
- .name;
-
-/*@ngInject*/
-function DatakeyConfig($compile, $templateCache, $q, types) {
-
- var linker = function (scope, element, attrs, ngModelCtrl) {
- var template = $templateCache.get(datakeyConfigTemplate);
-
- if (scope.datakeySettingsSchema.schema) {
- scope.dataKeySchema = scope.datakeySettingsSchema.schema;
- scope.dataKeyForm = scope.datakeySettingsSchema.form || ['*'];
- template = '\n' +
- '\n' +
- template +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '' +
- '' +
- '' +
- '\n' +
- '
\n' +
- '\n' +
- '\n' +
- '';
- }
-
- element.html(template);
-
- scope.types = types;
-
- scope.alarmFields = [];
- for (var alarmField in types.alarmFields) {
- scope.alarmFields.push(alarmField);
- }
-
- scope.selectedKey = null;
- scope.keySearchText = null;
- scope.usePostProcessing = false;
-
- scope.functions = {};
-
- ngModelCtrl.$render = function () {
- scope.model = {};
- if (ngModelCtrl.$viewValue) {
- scope.model.type = ngModelCtrl.$viewValue.type;
- scope.model.name = ngModelCtrl.$viewValue.name;
- scope.model.label = ngModelCtrl.$viewValue.label;
- scope.model.color = ngModelCtrl.$viewValue.color;
- scope.model.units = ngModelCtrl.$viewValue.units;
- scope.model.decimals = ngModelCtrl.$viewValue.decimals;
- scope.model.funcBody = ngModelCtrl.$viewValue.funcBody;
- scope.model.postFuncBody = ngModelCtrl.$viewValue.postFuncBody;
- scope.model.usePostProcessing = scope.model.postFuncBody ? true : false;
- scope.model.settings = ngModelCtrl.$viewValue.settings;
- }
- };
-
- scope.$watch('model', function (newVal, oldVal) {
- if (newVal.usePostProcessing != oldVal.usePostProcessing) {
- if (scope.model.usePostProcessing && !scope.model.postFuncBody) {
- scope.model.postFuncBody = "return value;";
- } else if (!scope.model.usePostProcessing && scope.model.postFuncBody) {
- delete scope.model.postFuncBody;
- }
- }
- if (ngModelCtrl.$viewValue) {
- var value = ngModelCtrl.$viewValue;
- value.type = scope.model.type;
- value.name = scope.model.name;
- value.label = scope.model.label;
- value.color = scope.model.color;
- value.units = scope.model.units;
- value.decimals = scope.model.decimals;
- value.funcBody = scope.model.funcBody;
- if (!scope.model.postFuncBody) {
- delete value.postFuncBody;
- } else {
- value.postFuncBody = scope.model.postFuncBody;
- }
- ngModelCtrl.$setViewValue(value);
- }
- }, true);
-
- scope.keysSearch = function (searchText) {
- if (scope.model.type === types.dataKeyType.alarm) {
- var dataKeys = searchText ? scope.alarmFields.filter(
- scope.createFilterForDataKey(searchText)) : scope.alarmFields;
- dataKeys.push(searchText);
- return dataKeys;
- } else {
- if (scope.entityAlias) {
- var deferred = $q.defer();
- scope.fetchEntityKeys({
- entityAliasId: scope.entityAlias.id,
- query: searchText,
- type: scope.model.type
- })
- .then(function (keys) {
- keys.push(searchText);
- deferred.resolve(keys);
- }, function (e) {
- deferred.reject(e);
- });
- return deferred.promise;
- } else {
- return $q.when([]);
- }
- }
- };
-
- scope.createFilterForDataKey = function (query) {
- var lowercaseQuery = angular.lowercase(query);
- return function filterFn(dataKey) {
- return (angular.lowercase(dataKey).indexOf(lowercaseQuery) === 0);
- };
- };
-
- $compile(element.contents())(scope);
- }
-
- return {
- restrict: 'E',
- require: '^ngModel',
- scope: {
- entityAlias: '=',
- fetchEntityKeys: '&',
- datakeySettingsSchema: '='
- },
- link: linker
- };
-}
\ No newline at end of file
diff --git a/ui/src/app/components/datakey-config.scss b/ui/src/app/components/datakey-config.scss
deleted file mode 100644
index 1337dbe106..0000000000
--- a/ui/src/app/components/datakey-config.scss
+++ /dev/null
@@ -1,29 +0,0 @@
-/**
- * Copyright © 2016-2020 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-datakey-config {
- min-width: 500px !important;
- min-height: 500px !important;
-
- md-content {
- background-color: #fff;
- }
-}
-
-tb-datakey-config {
- md-content {
- background-color: #fff;
- }
-}
diff --git a/ui/src/app/components/datakey-config.tpl.html b/ui/src/app/components/datakey-config.tpl.html
deleted file mode 100644
index dde2fd40cc..0000000000
--- a/ui/src/app/components/datakey-config.tpl.html
+++ /dev/null
@@ -1,88 +0,0 @@
-
-
-
- {{item}}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- datakey.data-generation-func
-
-
-
-
-
-
- {{ 'datakey.use-data-post-processing-func' | translate }}
-
-
-
-
-
-
diff --git a/ui/src/app/components/datasource-entity.directive.js b/ui/src/app/components/datasource-entity.directive.js
deleted file mode 100644
index edc891b2c8..0000000000
--- a/ui/src/app/components/datasource-entity.directive.js
+++ /dev/null
@@ -1,314 +0,0 @@
-/*
- * Copyright © 2016-2020 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 './datasource-entity.scss';
-
-import 'md-color-picker';
-import tinycolor from 'tinycolor2';
-import $ from 'jquery';
-import thingsboardTypes from '../common/types.constant';
-import thingsboardDatakeyConfigDialog from './datakey-config-dialog.controller';
-import thingsboardTruncate from './truncate.filter';
-
-/* eslint-disable import/no-unresolved, import/default */
-
-import datasourceEntityTemplate from './datasource-entity.tpl.html';
-import datakeyConfigDialogTemplate from './datakey-config-dialog.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-/* eslint-disable angular/angularelement */
-
-export default angular.module('thingsboard.directives.datasourceEntity', [thingsboardTruncate, thingsboardTypes, thingsboardDatakeyConfigDialog])
- .directive('tbDatasourceEntity', DatasourceEntity)
- .name;
-
-/*@ngInject*/
-function DatasourceEntity($compile, $templateCache, $q, $mdDialog, $window, $document, $mdColorPicker, $mdConstant, types) {
-
- var linker = function (scope, element, attrs, ngModelCtrl) {
- var template = $templateCache.get(datasourceEntityTemplate);
- element.html(template);
-
- scope.ngModelCtrl = ngModelCtrl;
- scope.types = types;
-
- scope.alarmFields = [];
- for (var alarmField in types.alarmFields) {
- scope.alarmFields.push(alarmField);
- }
-
- scope.selectedDataKey = null;
- scope.dataKeySearchText = null;
-
- scope.selectedAlarmDataKey = null;
- scope.alarmDataKeySearchText = null;
-
- scope.updateValidity = function () {
- if (ngModelCtrl.$viewValue) {
- var value = ngModelCtrl.$viewValue;
- var dataValid = angular.isDefined(value) && value != null;
- ngModelCtrl.$setValidity('entityData', dataValid);
- if (dataValid) {
- ngModelCtrl.$setValidity('entityAlias',
- angular.isDefined(value.entityAliasId) &&
- value.entityAliasId != null);
- if (scope.optDataKeys) {
- ngModelCtrl.$setValidity('entityKeys', true);
- } else {
- ngModelCtrl.$setValidity('entityKeys',
- angular.isDefined(value.dataKeys) &&
- value.dataKeys != null &&
- value.dataKeys.length > 0);
- }
- }
- }
- };
-
- scope.$watch('entityAlias', function () {
- if (ngModelCtrl.$viewValue) {
- if (scope.entityAlias) {
- ngModelCtrl.$viewValue.entityAliasId = scope.entityAlias.id;
- } else {
- ngModelCtrl.$viewValue.entityAliasId = null;
- }
- scope.updateValidity();
- scope.selectedEntityAliasChange();
- }
- });
-
- scope.$watch('dataKeys', function () {
- updateDataKeys();
- }, true);
-
- scope.$watch('alarmDataKeys', function () {
- updateDataKeys();
- }, true);
-
- function updateDataKeys() {
- if (ngModelCtrl.$viewValue) {
- var dataKeys = [];
- dataKeys = dataKeys.concat(scope.dataKeys);
- dataKeys = dataKeys.concat(scope.alarmDataKeys);
- if (!angular.equals(ngModelCtrl.$viewValue.dataKeys, dataKeys))
- {
- ngModelCtrl.$setDirty();
- ngModelCtrl.$viewValue.dataKeys = dataKeys;
- }
- scope.updateValidity();
- }
- }
-
- ngModelCtrl.$render = function () {
- if (ngModelCtrl.$viewValue) {
- var entityAliasId = ngModelCtrl.$viewValue.entityAliasId;
- var entityAliases = scope.aliasController.getEntityAliases();
- if (entityAliases[entityAliasId]) {
- scope.entityAlias = entityAliases[entityAliasId];
- } else {
- scope.entityAlias = null;
- }
- var dataKeys = [];
- var alarmDataKeys = [];
- for (var d in ngModelCtrl.$viewValue.dataKeys) {
- var dataKey = ngModelCtrl.$viewValue.dataKeys[d];
- if ((dataKey.type === types.dataKeyType.timeseries) || (dataKey.type === types.dataKeyType.attribute) || (dataKey.type === types.dataKeyType.entityField)) {
- dataKeys.push(dataKey);
- } else if (dataKey.type === types.dataKeyType.alarm) {
- alarmDataKeys.push(dataKey);
- }
- }
- scope.dataKeys = dataKeys;
- scope.alarmDataKeys = alarmDataKeys;
- }
- };
-
- scope.textIsNotEmpty = function(text) {
- return (text && text != null && text.length > 0) ? true : false;
- }
-
- scope.selectedEntityAliasChange = function () {
- if (!scope.dataKeySearchText || scope.dataKeySearchText === '') {
- scope.dataKeySearchText = scope.dataKeySearchText === '' ? null : '';
- }
- if (!scope.alarmDataKeySearchText || scope.alarmDataKeySearchText === '') {
- scope.alarmDataKeySearchText = scope.alarmDataKeySearchText === '' ? null : '';
- }
- };
-
- scope.transformDataKeyChip = function (chip) {
- if (scope.maxDataKeys > 0 && ngModelCtrl.$viewValue.dataKeys.length >= scope.maxDataKeys ) {
- return null;
- } else {
- if (chip.type) {
- return scope.generateDataKey({chip: chip.name, type: chip.type});
- } else {
- if (scope.widgetType != types.widgetType.latest.value) {
- return scope.generateDataKey({chip: chip, type: types.dataKeyType.timeseries});
- } else {
- return null;
- }
- }
- }
- };
-
- scope.transformAlarmDataKeyChip = function (chip) {
- if (chip.type) {
- return scope.generateDataKey({chip: chip.name, type: chip.type});
- } else {
- return scope.generateDataKey({chip: chip, type: types.dataKeyType.alarm});
- }
- };
-
- scope.showColorPicker = function (event, dataKey) {
- $mdColorPicker.show({
- value: dataKey.color,
- defaultValue: '#fff',
- random: tinycolor.random(),
- clickOutsideToClose: false,
- hasBackdrop: false,
- multiple: true,
- preserveScope: false,
-
- mdColorAlphaChannel: true,
- mdColorSpectrum: true,
- mdColorSliders: true,
- mdColorGenericPalette: false,
- mdColorMaterialPalette: true,
- mdColorHistory: false,
- mdColorDefaultTab: 2,
-
- $event: event
-
- }).then(function (color) {
- dataKey.color = color;
- ngModelCtrl.$setDirty();
- });
- };
-
- scope.editDataKey = function (event, dataKey) {
-
- $mdDialog.show({
- controller: 'DatakeyConfigDialogController',
- controllerAs: 'vm',
- templateUrl: datakeyConfigDialogTemplate,
- locals: {
- dataKey: angular.copy(dataKey),
- dataKeySettingsSchema: scope.datakeySettingsSchema,
- entityAlias: scope.entityAlias,
- aliasController: scope.aliasController
- },
- parent: angular.element($document[0].body),
- fullscreen: true,
- targetEvent: event,
- multiple: true,
- onComplete: function () {
- var w = angular.element($window);
- w.triggerHandler('resize');
- }
- }).then(function (newDataKey) {
- if ((newDataKey.type === types.dataKeyType.timeseries) || (newDataKey.type === types.dataKeyType.attribute) || (newDataKey.type === types.dataKeyType.entityField)) {
- let index = scope.dataKeys.indexOf(dataKey);
- scope.dataKeys[index] = newDataKey;
- } else if (newDataKey.type === types.dataKeyType.alarm) {
- let index = scope.alarmDataKeys.indexOf(dataKey);
- scope.alarmDataKeys[index] = newDataKey;
- }
- ngModelCtrl.$setDirty();
- }, function () {
- });
- };
-
- scope.dataKeysSearch = function (searchText) {
- if (scope.widgetType == types.widgetType.alarm.value) {
- var dataKeys = searchText ? scope.alarmFields.filter(
- scope.createFilterForDataKey(searchText)) : scope.alarmFields;
- return dataKeys;
- } else {
- if (scope.entityAlias) {
- var deferred = $q.defer();
- scope.fetchEntityKeys({entityAliasId: scope.entityAlias.id, query: searchText, type: types.dataKeyType.timeseries})
- .then(function (dataKeys) {
- var items = [];
- for (var i = 0; i < dataKeys.length; i++) {
- items.push({ name: dataKeys[i], type: types.dataKeyType.timeseries });
- }
- if (scope.widgetType == types.widgetType.latest.value) {
- var keysType = [types.dataKeyType.attribute, types.dataKeyType.entityField];
- var promises = [];
- keysType.forEach((type) => {
- promises.push(scope.fetchEntityKeys({entityAliasId: scope.entityAlias.id, query: searchText, type: type}));
- });
- $q.all(promises).then(function (dataKeys) {
- for (var i = 0; i < dataKeys.length; i++) {
- for (var j = 0; j < dataKeys[i].length; j++) {
- items.push({name: dataKeys[i][j], type: keysType[i]});
- }
- }
- deferred.resolve(items);
- }, function (e) {
- deferred.reject(e);
- });
- }
- else
- deferred.resolve(items);
- }, function (e) {
- deferred.reject(e);
- });
- return deferred.promise;
- } else {
- return $q.when([]);
- }
- }
- };
-
- scope.createFilterForDataKey = function (query) {
- var lowercaseQuery = angular.lowercase(query);
- return function filterFn(dataKey) {
- return (angular.lowercase(dataKey).indexOf(lowercaseQuery) === 0);
- };
- };
-
- scope.createKey = function (event, type, chipsId) {
- var chipsChild = $(chipsId, element)[0].firstElementChild;
- var el = angular.element(chipsChild);
- var chipBuffer = el.scope().$mdChipsCtrl.getChipBuffer();
- event.preventDefault();
- event.stopPropagation();
- el.scope().$mdChipsCtrl.appendChip({ name: chipBuffer.trim(), type: type});
- el.scope().$mdChipsCtrl.resetChipBuffer();
- }
-
- $compile(element.contents())(scope);
- }
-
- return {
- restrict: "E",
- require: "^ngModel",
- scope: {
- widgetType: '=',
- maxDataKeys: '=',
- optDataKeys: '=',
- aliasController: '=',
- datakeySettingsSchema: '=',
- generateDataKey: '&',
- fetchEntityKeys: '&',
- onCreateEntityAlias: '&'
- },
- link: linker
- };
-}
-
-/* eslint-enable angular/angularelement */
diff --git a/ui/src/app/components/datasource-entity.scss b/ui/src/app/components/datasource-entity.scss
deleted file mode 100644
index 41465df44d..0000000000
--- a/ui/src/app/components/datasource-entity.scss
+++ /dev/null
@@ -1,51 +0,0 @@
-/**
- * Copyright © 2016-2020 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";
-
-.tb-entity-alias-autocomplete,
-.tb-datakey-autocomplete,
-.tb-timeseries-datakey-autocomplete,
-.tb-attribute-datakey-autocomplete,
-.tb-alarm-datakey-autocomplete {
- .tb-not-found {
- display: block;
- height: 48px;
- line-height: 1.5;
- white-space: normal !important;
-
- .tb-no-entries {
- line-height: 48px;
- }
- }
-
- li {
- height: auto !important;
- }
-}
-
-tb-datasource-entity {
- @media (min-width: $layout-breakpoint-sm) {
- padding-right: 4px;
- padding-left: 4px;
- }
-
- tb-entity-alias-select {
- @media (min-width: $layout-breakpoint-sm) {
- width: 200px;
- max-width: 200px;
- }
- }
-}
diff --git a/ui/src/app/components/datasource-entity.tpl.html b/ui/src/app/components/datasource-entity.tpl.html
deleted file mode 100644
index 645e326360..0000000000
--- a/ui/src/app/components/datasource-entity.tpl.html
+++ /dev/null
@@ -1,182 +0,0 @@
-
-
-
-
-
-
-
-
-
- {{'datakey.attributes' | translate }}
-
-
-
- {{'datakey.entity-field' | translate }}
-
-
-
- {{'datakey.timeseries' | translate }}
-
-
- {{item.name}}
-
-
-
- entity.no-keys-found
-
-
- entity.no-key-matching
- {{'entity.create-new-key' | translate }}
-
- {{'datakey.attributes' | translate }}
-
-
-
- {{'datakey.entity-field' | translate }}
-
-
-
- {{'datakey.timeseries' | translate }}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {{'datakey.attributes' | translate }}
-
-
-
- {{'datakey.entity-field' | translate }}
-
-
-
- {{'datakey.timeseries' | translate }}
-
-
- {{$chip.label}}
-
-
:
-
- {{$chip.name}}
- f({{$chip.name}})
-
-
-
- edit
-
-
-
-
-
-
- {{item}}
-
-
-
- entity.no-keys-found
-
-
-
-
-
-
-
-
-
-
-
-
-
- {{$chip.label}}
-
-
:
-
- {{$chip.name}}
- f({{$chip.name}})
-
-
-
- edit
-
-
-
-
-
-
-
datakey.timeseries-required
-
datakey.timeseries-or-attributes-required
-
datakey.alarm-fields-required
-
-
-
-
diff --git a/ui/src/app/components/datasource-func.directive.js b/ui/src/app/components/datasource-func.directive.js
deleted file mode 100644
index 6a8b38fbcb..0000000000
--- a/ui/src/app/components/datasource-func.directive.js
+++ /dev/null
@@ -1,243 +0,0 @@
-/*
- * Copyright © 2016-2020 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 './datasource-func.scss';
-
-import 'md-color-picker';
-import tinycolor from 'tinycolor2';
-import $ from 'jquery';
-import thingsboardTypes from '../common/types.constant';
-import thingsboardUtils from '../common/utils.service';
-import thingsboardDatakeyConfigDialog from './datakey-config-dialog.controller';
-
-/* eslint-disable import/no-unresolved, import/default */
-
-import datasourceFuncTemplate from './datasource-func.tpl.html';
-import datakeyConfigDialogTemplate from './datakey-config-dialog.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-/* eslint-disable angular/angularelement */
-
-export default angular.module('thingsboard.directives.datasourceFunc', [thingsboardTypes, thingsboardUtils, thingsboardDatakeyConfigDialog])
- .directive('tbDatasourceFunc', DatasourceFunc)
- .name;
-
-/*@ngInject*/
-function DatasourceFunc($compile, $templateCache, $mdDialog, $window, $document, $mdColorPicker, types, utils) {
-
- var linker = function (scope, element, attrs, ngModelCtrl) {
- var template = $templateCache.get(datasourceFuncTemplate);
- element.html(template);
-
- scope.ngModelCtrl = ngModelCtrl;
- scope.types = types;
-
- scope.functionTypes = utils.getPredefinedFunctionsList();
- scope.alarmFields = [];
- for (var alarmField in types.alarmFields) {
- scope.alarmFields.push(alarmField);
- }
-
- scope.selectedDataKey = null;
- scope.dataKeySearchText = null;
-
- scope.selectedAlarmDataKey = null;
- scope.alarmDataKeySearchText = null;
-
- scope.updateValidity = function () {
- if (ngModelCtrl.$viewValue) {
- var value = ngModelCtrl.$viewValue;
- var dataValid = angular.isDefined(value) && value != null;
- ngModelCtrl.$setValidity('deviceData', dataValid);
- if (dataValid) {
- if (scope.optDataKeys) {
- ngModelCtrl.$setValidity('datasourceKeys', true);
- } else {
- ngModelCtrl.$setValidity('datasourceKeys',
- angular.isDefined(value.dataKeys) &&
- value.dataKeys != null &&
- value.dataKeys.length > 0);
- }
- }
- }
- };
-
- scope.$watch('funcDataKeys', function () {
- updateDataKeys();
- }, true);
-
- scope.$watch('alarmDataKeys', function () {
- updateDataKeys();
- }, true);
-
- function updateDataKeys() {
- if (ngModelCtrl.$viewValue) {
- var dataKeys = [];
- dataKeys = dataKeys.concat(scope.funcDataKeys);
- dataKeys = dataKeys.concat(scope.alarmDataKeys);
- if (ngModelCtrl.$viewValue.dataKeys != dataKeys)
- {
- ngModelCtrl.$setDirty();
- ngModelCtrl.$viewValue.dataKeys = dataKeys;
- }
- scope.updateValidity();
- }
- }
-
- scope.$watch('datasourceName', function () {
- if (ngModelCtrl.$viewValue) {
- ngModelCtrl.$viewValue.name = scope.datasourceName;
- scope.updateValidity();
- }
- });
-
- ngModelCtrl.$render = function () {
- if (ngModelCtrl.$viewValue) {
- var funcDataKeys = [];
- var alarmDataKeys = [];
- if (ngModelCtrl.$viewValue.dataKeys) {
- for (var d=0;d 0 && ngModelCtrl.$viewValue.dataKeys.length >= scope.maxDataKeys ) {
- return null;
- } else {
- return scope.generateDataKey({chip: chip, type: types.dataKeyType.function});
- }
- };
-
- scope.transformAlarmDataKeyChip = function (chip) {
- return scope.generateDataKey({chip: chip, type: types.dataKeyType.alarm});
- };
-
- scope.showColorPicker = function (event, dataKey) {
- $mdColorPicker.show({
- value: dataKey.color,
- defaultValue: '#fff',
- random: tinycolor.random(),
- clickOutsideToClose: false,
- hasBackdrop: false,
- multiple: true,
- preserveScope: false,
-
- mdColorAlphaChannel: true,
- mdColorSpectrum: true,
- mdColorSliders: true,
- mdColorGenericPalette: false,
- mdColorMaterialPalette: true,
- mdColorHistory: false,
- mdColorDefaultTab: 2,
-
- $event: event
-
- }).then(function (color) {
- dataKey.color = color;
- ngModelCtrl.$setDirty();
- });
- }
-
- scope.editDataKey = function (event, dataKey) {
-
- $mdDialog.show({
- controller: 'DatakeyConfigDialogController',
- controllerAs: 'vm',
- templateUrl: datakeyConfigDialogTemplate,
- locals: {
- dataKey: angular.copy(dataKey),
- dataKeySettingsSchema: scope.datakeySettingsSchema,
- entityAlias: null,
- aliasController: null
- },
- parent: angular.element($document[0].body),
- fullscreen: true,
- targetEvent: event,
- multiple: true,
- onComplete: function () {
- var w = angular.element($window);
- w.triggerHandler('resize');
- }
- }).then(function (newDataKey) {
- if (newDataKey.type === types.dataKeyType.function) {
- let index = scope.funcDataKeys.indexOf(dataKey);
- scope.funcDataKeys[index] = newDataKey;
- } else if (newDataKey.type === types.dataKeyType.alarm) {
- let index = scope.alarmDataKeys.indexOf(dataKey);
- scope.alarmDataKeys[index] = newDataKey;
- }
- ngModelCtrl.$setDirty();
- }, function () {
- });
- };
-
- scope.textIsNotEmpty = function(text) {
- return (text && text != null && text.length > 0) ? true : false;
- }
-
- scope.dataKeysSearch = function (dataKeySearchText) {
- var targetKeys = scope.widgetType == types.widgetType.alarm.value ? scope.alarmFields : scope.functionTypes;
- var dataKeys = dataKeySearchText ? targetKeys.filter(
- scope.createFilterForDataKey(dataKeySearchText)) : targetKeys;
- return dataKeys;
- };
-
- scope.createFilterForDataKey = function (query) {
- var lowercaseQuery = angular.lowercase(query);
- return function filterFn(dataKey) {
- return (angular.lowercase(dataKey).indexOf(lowercaseQuery) === 0);
- };
- };
-
- scope.createKey = function (event, chipsId) {
- var chipsChild = $(chipsId, element)[0].firstElementChild;
- var el = angular.element(chipsChild);
- var chipBuffer = el.scope().$mdChipsCtrl.getChipBuffer();
- event.preventDefault();
- event.stopPropagation();
- el.scope().$mdChipsCtrl.appendChip(chipBuffer.trim());
- el.scope().$mdChipsCtrl.resetChipBuffer();
- }
-
- $compile(element.contents())(scope);
- }
-
- return {
- restrict: "E",
- require: "^ngModel",
- scope: {
- widgetType: '=',
- maxDataKeys: '=',
- optDataKeys: '=',
- generateDataKey: '&',
- datakeySettingsSchema: '='
- },
- link: linker
- };
-}
-
-/* eslint-enable angular/angularelement */
diff --git a/ui/src/app/components/datasource-func.scss b/ui/src/app/components/datasource-func.scss
deleted file mode 100644
index 4d28989820..0000000000
--- a/ui/src/app/components/datasource-func.scss
+++ /dev/null
@@ -1,46 +0,0 @@
-/**
- * Copyright © 2016-2020 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";
-
-.tb-datasource-func {
- @media (min-width: $layout-breakpoint-sm) {
- padding-left: 8px;
- }
-
- md-input-container.tb-datasource-name {
- .md-errors-spacer {
- display: none;
- }
- }
-}
-
-.tb-func-datakey-autocomplete,
-.tb-alarm-datakey-autocomplete {
- .tb-not-found {
- display: block;
- height: 48px;
- line-height: 1.5;
-
- .tb-no-entries {
- line-height: 48px;
- }
- }
-
- li {
- height: auto !important;
- white-space: normal !important;
- }
-}
diff --git a/ui/src/app/components/datasource-func.tpl.html b/ui/src/app/components/datasource-func.tpl.html
deleted file mode 100644
index 97629ef6e3..0000000000
--- a/ui/src/app/components/datasource-func.tpl.html
+++ /dev/null
@@ -1,147 +0,0 @@
-
-
-
-
-
-
-
-
- {{item}}
-
-
-
- device.no-keys-found
-
-
-
-
-
-
-
-
-
-
-
-
-
- {{$chip.label}}
-
-
:
-
- {{$chip.name}}
-
-
-
- edit
-
-
-
-
-
-
- {{item}}
-
-
-
- entity.no-keys-found
-
-
-
-
-
-
-
-
-
-
-
-
-
- {{$chip.label}}
-
-
:
-
- {{$chip.name}}
- f({{$chip.name}})
-
-
-
- edit
-
-
-
-
-
-
datakey.function-types-required
-
datakey.alarm-fields-required
-
-
-
-
diff --git a/ui/src/app/components/datasource.directive.js b/ui/src/app/components/datasource.directive.js
deleted file mode 100644
index 64670f81f4..0000000000
--- a/ui/src/app/components/datasource.directive.js
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- * Copyright © 2016-2020 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 './datasource.scss';
-
-import thingsboardTypes from '../common/types.constant';
-import thingsboardDatasourceFunc from './datasource-func.directive'
-import thingsboardDatasourceEntity from './datasource-entity.directive';
-
-/* eslint-disable import/no-unresolved, import/default */
-
-import datasourceTemplate from './datasource.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-export default angular.module('thingsboard.directives.datasource', [thingsboardTypes, thingsboardDatasourceFunc, thingsboardDatasourceEntity])
- .directive('tbDatasource', Datasource)
- .name;
-
-/*@ngInject*/
-function Datasource($compile, $templateCache, utils, types) {
-
- var linker = function (scope, element, attrs, ngModelCtrl) {
-
- var template = $templateCache.get(datasourceTemplate);
- element.html(template);
-
- scope.types = types;
-
- if (scope.functionsOnly) {
- scope.datasourceTypes = [types.datasourceType.function];
- } else{
- scope.datasourceTypes = [types.datasourceType.entity, types.datasourceType.function];
- }
-
- scope.updateView = function () {
- if (!scope.model.dataKeys) {
- scope.model.dataKeys = [];
- }
- ngModelCtrl.$setViewValue(scope.model);
- }
-
- scope.$watch('model.type', function (newType, prevType) {
- if (newType && prevType && newType != prevType) {
- if (scope.widgetType == types.widgetType.alarm.value) {
- scope.model.dataKeys = utils.getDefaultAlarmDataKeys();
- } else {
- scope.model.dataKeys = [];
- }
- }
- });
-
- scope.$watch('model', function () {
- scope.updateView();
- }, true);
-
- ngModelCtrl.$render = function () {
- if (ngModelCtrl.$viewValue) {
- scope.model = ngModelCtrl.$viewValue;
- } else {
- scope.model = {};
- }
- };
-
- $compile(element.contents())(scope);
- }
-
- return {
- restrict: "E",
- require: "^ngModel",
- scope: {
- aliasController: '=',
- maxDataKeys: '=',
- optDataKeys: '=',
- widgetType: '=',
- functionsOnly: '=',
- datakeySettingsSchema: '=',
- generateDataKey: '&',
- fetchEntityKeys: '&',
- onCreateEntityAlias: '&'
- },
- link: linker
- };
-}
diff --git a/ui/src/app/components/datasource.scss b/ui/src/app/components/datasource.scss
deleted file mode 100644
index 8e73561cbd..0000000000
--- a/ui/src/app/components/datasource.scss
+++ /dev/null
@@ -1,78 +0,0 @@
-/**
- * Copyright © 2016-2020 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-datasource {
- #entity-autocomplete {
- height: 30px;
- margin-top: 18px;
-
- md-autocomplete-wrap {
- height: 30px;
- }
-
- input,
- input:not(.md-input) {
- height: 30px;
- }
- }
-}
-
-@mixin tb-checkered-bg() {
- background-color: #fff;
- background-image:
- linear-gradient(45deg, #ddd 25%, transparent 25%, transparent 75%, #ddd 75%, #ddd),
- linear-gradient(45deg, #ddd 25%, transparent 25%, transparent 75%, #ddd 75%, #ddd);
- background-position: 0 0, 4px 4px;
- background-size: 8px 8px;
-}
-
-.tb-color-preview {
- position: relative;
- width: 24px;
- min-width: 24px;
- height: 24px;
- overflow: hidden;
- content: "";
- border: 2px solid #fff;
- border-radius: 50%;
- box-shadow: 0 3px 1px -2px rgba(0, 0, 0, .14), 0 2px 2px 0 rgba(0, 0, 0, .098), 0 1px 5px 0 rgba(0, 0, 0, .084);
-
- @include tb-checkered-bg();
-
- .tb-color-result {
- width: 100%;
- height: 100%;
- }
-}
-
-.tb-attribute-chip {
- .tb-chip-drag-handle {
- cursor: move;
-
- ng-md-icon {
- pointer-events: none;
- }
- }
-
- .tb-chip-label {
- overflow: hidden;
- text-overflow: ellipsis;
- white-space: nowrap;
- }
-
- .tb-chip-separator {
- white-space: pre;
- }
-}
diff --git a/ui/src/app/components/datasource.tpl.html b/ui/src/app/components/datasource.tpl.html
deleted file mode 100644
index 65bfc766bc..0000000000
--- a/ui/src/app/components/datasource.tpl.html
+++ /dev/null
@@ -1,51 +0,0 @@
-
-
-
-
-
- {{ datasourceType | translate }}
-
-
-
-
-
diff --git a/ui/src/app/components/datetime-period.directive.js b/ui/src/app/components/datetime-period.directive.js
deleted file mode 100644
index f17bf316b7..0000000000
--- a/ui/src/app/components/datetime-period.directive.js
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * Copyright © 2016-2020 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 './datetime-period.scss';
-
-/* eslint-disable import/no-unresolved, import/default */
-
-import datetimePeriodTemplate from './datetime-period.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-export default angular.module('thingsboard.directives.datetimePeriod', [])
- .directive('tbDatetimePeriod', DatetimePeriod)
- .name;
-
-/*@ngInject*/
-function DatetimePeriod($compile, $templateCache) {
-
- var linker = function (scope, element, attrs, ngModelCtrl) {
-
- var template = $templateCache.get(datetimePeriodTemplate);
- element.html(template);
-
- ngModelCtrl.$render = function () {
- var date = new Date();
- scope.startDate = new Date(
- date.getFullYear(),
- date.getMonth(),
- date.getDate() - 1);
- scope.endDate = date;
- if (ngModelCtrl.$viewValue) {
- var value = ngModelCtrl.$viewValue;
- scope.startDate = new Date(value.startTimeMs);
- scope.endDate = new Date(value.endTimeMs);
- }
- }
-
- scope.updateMinMaxDates = function () {
- scope.maxStartDate = angular.copy(new Date(scope.endDate.getTime() - 1000));
- scope.minEndDate = angular.copy(new Date(scope.startDate.getTime() + 1000));
- scope.maxEndDate = new Date();
- }
-
- scope.updateView = function () {
- var value = null;
- if (scope.startDate && scope.endDate) {
- value = {
- startTimeMs: scope.startDate.getTime(),
- endTimeMs: scope.endDate.getTime()
- };
- ngModelCtrl.$setValidity('datetimePeriod', true);
- } else {
- ngModelCtrl.$setValidity('datetimePeriod', !scope.required);
- }
- ngModelCtrl.$setViewValue(value);
- }
-
- scope.$watch('required', function () {
- scope.updateView();
- });
-
- scope.$watch('startDate', function (newDate) {
- if (newDate) {
- if (newDate.getTime() > scope.maxStartDate) {
- scope.startDate = angular.copy(scope.maxStartDate);
- }
- scope.updateMinMaxDates();
- }
- scope.updateView();
- });
-
- scope.$watch('endDate', function (newDate) {
- if (newDate) {
- if (newDate.getTime() < scope.minEndDate) {
- scope.endDate = angular.copy(scope.minEndDate);
- } else if (newDate.getTime() > scope.maxEndDate) {
- scope.endDate = angular.copy(scope.maxEndDate);
- }
- scope.updateMinMaxDates();
- }
- scope.updateView();
- });
-
- $compile(element.contents())(scope);
-
- }
-
- return {
- restrict: "E",
- require: "^ngModel",
- scope: {
- required: '=ngRequired'
- },
- link: linker
- };
-}
diff --git a/ui/src/app/components/datetime-period.scss b/ui/src/app/components/datetime-period.scss
deleted file mode 100644
index 9bac9c3145..0000000000
--- a/ui/src/app/components/datetime-period.scss
+++ /dev/null
@@ -1,30 +0,0 @@
-/**
- * Copyright © 2016-2020 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-datetime-period {
- md-input-container {
- margin-bottom: 0;
-
- .md-errors-spacer {
- min-height: 0;
- }
- }
-
- mdp-date-picker {
- .md-input {
- width: 150px !important;
- }
- }
-}
diff --git a/ui/src/app/components/datetime-period.tpl.html b/ui/src/app/components/datetime-period.tpl.html
deleted file mode 100644
index 4518b0ef13..0000000000
--- a/ui/src/app/components/datetime-period.tpl.html
+++ /dev/null
@@ -1,31 +0,0 @@
-
-
\ No newline at end of file
diff --git a/ui/src/app/components/details-sidenav.directive.js b/ui/src/app/components/details-sidenav.directive.js
deleted file mode 100644
index dba2eca356..0000000000
--- a/ui/src/app/components/details-sidenav.directive.js
+++ /dev/null
@@ -1,151 +0,0 @@
-/*
- * Copyright © 2016-2020 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 './details-sidenav.scss';
-
-/* eslint-disable import/no-unresolved, import/default */
-
-import detailsSidenavTemplate from './details-sidenav.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-export default angular.module('thingsboard.directives.detailsSidenav', [])
- .directive('tbDetailsSidenav', DetailsSidenav)
- .name;
-
-/*@ngInject*/
-function DetailsSidenav($timeout, $mdUtil, $q, $animate) {
-
- var linker = function (scope, element, attrs) {
-
- if (angular.isUndefined(attrs.isReadOnly)) {
- attrs.isReadOnly = false;
- }
-
- if (angular.isUndefined(scope.headerHeightPx)) {
- scope.headerHeightPx = 100;
- }
-
- if (angular.isDefined(attrs.isAlwaysEdit) && attrs.isAlwaysEdit) {
- scope.isEdit = true;
- }
-
- var backdrop;
- var previousContainerStyles;
-
- if (Object.prototype.hasOwnProperty.call(attrs,'tbEnableBackdrop')) {
- backdrop = $mdUtil.createBackdrop(scope, "md-sidenav-backdrop md-opaque ng-enter");
- element.on('$destroy', function() {
- backdrop && backdrop.remove();
- });
- scope.$on('$destroy', function(){
- backdrop && backdrop.remove();
- });
- scope.$watch('isOpen', updateIsOpen);
- }
-
- function updateIsOpen(isOpen) {
- backdrop[isOpen ? 'on' : 'off']('click', (ev)=>{
- ev.preventDefault();
- scope.isOpen = false;
- scope.$apply();
- });
- var parent = element.parent();
- var restorePositioning = updateContainerPositions(parent, isOpen);
-
- return $q.all([
- isOpen && backdrop ? $animate.enter(backdrop, parent) : backdrop ?
- $animate.leave(backdrop) : $q.when(true)
- ]).then(function() {
- restorePositioning && restorePositioning();
- });
- }
-
- function updateContainerPositions(parent, willOpen) {
- var drawerEl = element[0];
- var scrollTop = parent[0].scrollTop;
- if (willOpen && scrollTop) {
- previousContainerStyles = {
- top: drawerEl.style.top,
- bottom: drawerEl.style.bottom,
- height: drawerEl.style.height
- };
- var positionStyle = {
- top: scrollTop + 'px',
- bottom: 'auto',
- height: parent[0].clientHeight + 'px'
- };
- backdrop.css(positionStyle);
- }
- if (!willOpen && previousContainerStyles) {
- return function() {
- backdrop[0].style.top = null;
- backdrop[0].style.bottom = null;
- backdrop[0].style.height = null;
- previousContainerStyles = null;
- };
- }
- }
-
- scope.toggleDetailsEditMode = function () {
- if (!scope.isAlwaysEdit) {
- if (!scope.isEdit) {
- scope.isEdit = true;
- } else {
- scope.isEdit = false;
- }
- }
- $timeout(function () {
- scope.onToggleDetailsEditMode();
- });
- };
-
- scope.detailsApply = function () {
- $timeout(function () {
- scope.onApplyDetails();
- });
- }
-
- scope.closeDetails = function () {
- scope.isOpen = false;
- $timeout(function () {
- scope.onCloseDetails();
- });
- };
- }
-
- return {
- restrict: "E",
- transclude: {
- headerPane: '?headerPane',
- detailsButtons: '?detailsButtons'
- },
- scope: {
- headerTitle: '@',
- headerSubtitle: '@',
- headerHeightPx: '@',
- isReadOnly: '=',
- isOpen: '=',
- isEdit: '=?',
- isAlwaysEdit: '=?',
- theForm: '=',
- onCloseDetails: '&',
- onToggleDetailsEditMode: '&',
- onApplyDetails: '&'
- },
- link: linker,
- templateUrl: detailsSidenavTemplate
- };
-}
\ No newline at end of file
diff --git a/ui/src/app/components/details-sidenav.scss b/ui/src/app/components/details-sidenav.scss
deleted file mode 100644
index 414f123069..0000000000
--- a/ui/src/app/components/details-sidenav.scss
+++ /dev/null
@@ -1,66 +0,0 @@
-/**
- * Copyright © 2016-2020 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";
-
-.tb-details-title {
- width: inherit;
- margin: 20px 8px 0 0;
- overflow: hidden;
- font-size: 1rem;
- font-weight: 400;
- text-overflow: ellipsis;
- text-transform: uppercase;
- white-space: nowrap;
-
- @media (min-width: $layout-breakpoint-gt-sm) {
- font-size: 1.6rem;
- }
-}
-
-.tb-details-subtitle {
- width: inherit;
- margin: 10px 0;
- overflow: hidden;
- font-size: 1rem;
- text-overflow: ellipsis;
- white-space: nowrap;
- opacity: .8;
-}
-
-md-sidenav.tb-sidenav-details {
- .md-toolbar-tools {
- height: 100%;
- min-height: 100px;
- max-height: 120px;
- }
- z-index: 59 !important;
- width: 100% !important;
- max-width: 100% !important;
-
- @media (min-width: $layout-breakpoint-gt-sm) {
- width: 80% !important;
- }
-
- @media (min-width: $layout-breakpoint-gt-md) {
- width: 65% !important;
- }
-
- tb-dashboard {
- md-content {
- background-color: $primary-hue-3;
- }
- }
-}
diff --git a/ui/src/app/components/details-sidenav.tpl.html b/ui/src/app/components/details-sidenav.tpl.html
deleted file mode 100644
index dee66b0f40..0000000000
--- a/ui/src/app/components/details-sidenav.tpl.html
+++ /dev/null
@@ -1,61 +0,0 @@
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/ui/src/app/components/entity-alias-select.directive.js b/ui/src/app/components/entity-alias-select.directive.js
deleted file mode 100644
index f1a0b065f3..0000000000
--- a/ui/src/app/components/entity-alias-select.directive.js
+++ /dev/null
@@ -1,150 +0,0 @@
-/*
- * Copyright © 2016-2020 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 $ from 'jquery';
-
-import './entity-alias-select.scss';
-
-/* eslint-disable import/no-unresolved, import/default */
-
-import entityAliasSelectTemplate from './entity-alias-select.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-
-/* eslint-disable angular/angularelement */
-
-export default angular.module('thingsboard.directives.entityAliasSelect', [])
- .directive('tbEntityAliasSelect', EntityAliasSelect)
- .name;
-
-/*@ngInject*/
-function EntityAliasSelect($compile, $templateCache, $mdConstant, entityService) {
-
- var linker = function (scope, element, attrs, ngModelCtrl) {
- var template = $templateCache.get(entityAliasSelectTemplate);
- element.html(template);
-
- scope.tbRequired = angular.isDefined(scope.tbRequired) ? scope.tbRequired : false;
-
- scope.ngModelCtrl = ngModelCtrl;
- scope.entityAliasList = [];
- scope.entityAlias = null;
-
- scope.updateValidity = function () {
- var value = ngModelCtrl.$viewValue;
- var valid = angular.isDefined(value) && value != null || !scope.tbRequired;
- ngModelCtrl.$setValidity('entityAlias', valid);
- };
-
- scope.$watch('aliasController', function () {
- scope.entityAliasList = [];
- var entityAliases = scope.aliasController.getEntityAliases();
- for (var aliasId in entityAliases) {
- if (scope.allowedEntityTypes) {
- if (!entityService.filterAliasByEntityTypes(entityAliases[aliasId], scope.allowedEntityTypes)) {
- continue;
- }
- }
- scope.entityAliasList.push(entityAliases[aliasId]);
- }
- });
-
- scope.$watch('entityAlias', function () {
- scope.updateView();
- });
-
- scope.entityAliasSearch = function (entityAliasSearchText) {
- return entityAliasSearchText ? scope.entityAliasList.filter(
- scope.createFilterForEntityAlias(entityAliasSearchText)) : scope.entityAliasList;
- };
-
- scope.createFilterForEntityAlias = function (query) {
- var lowercaseQuery = angular.lowercase(query);
- return function filterFn(entityAlias) {
- return (angular.lowercase(entityAlias.alias).indexOf(lowercaseQuery) === 0);
- };
- };
-
- scope.updateView = function () {
- ngModelCtrl.$setViewValue(scope.entityAlias);
- scope.updateValidity();
- }
-
- ngModelCtrl.$render = function () {
- if (ngModelCtrl.$viewValue) {
- scope.entityAlias = ngModelCtrl.$viewValue;
- }
- }
-
- scope.textIsNotEmpty = function(text) {
- return (text && text != null && text.length > 0) ? true : false;
- }
-
- scope.entityAliasEnter = function($event) {
- if ($event.keyCode === $mdConstant.KEY_CODE.ENTER) {
- $event.preventDefault();
- if (!scope.entityAlias) {
- var found = scope.entityAliasSearch(scope.entityAliasSearchText);
- found = found.length > 0;
- if (!found) {
- scope.createEntityAlias($event, scope.entityAliasSearchText);
- }
- }
- }
- }
-
- scope.createEntityAlias = function (event, alias) {
- var autoChild = $('#entity-autocomplete', element)[0].firstElementChild;
- var el = angular.element(autoChild);
- el.scope().$mdAutocompleteCtrl.hidden = true;
- el.scope().$mdAutocompleteCtrl.hasNotFound = false;
- event.preventDefault();
- var promise = scope.onCreateEntityAlias({event: event, alias: alias, allowedEntityTypes: scope.allowedEntityTypes});
- if (promise) {
- promise.then(
- function success(newAlias) {
- el.scope().$mdAutocompleteCtrl.hasNotFound = true;
- if (newAlias) {
- scope.entityAliasList.push(newAlias);
- scope.entityAlias = newAlias;
- }
- },
- function fail() {
- el.scope().$mdAutocompleteCtrl.hasNotFound = true;
- }
- );
- } else {
- el.scope().$mdAutocompleteCtrl.hasNotFound = true;
- }
- };
-
- $compile(element.contents())(scope);
- }
-
- return {
- restrict: "E",
- require: "^ngModel",
- link: linker,
- scope: {
- tbRequired: '=?',
- aliasController: '=',
- allowedEntityTypes: '=?',
- onCreateEntityAlias: '&'
- }
- };
-}
-
-/* eslint-enable angular/angularelement */
diff --git a/ui/src/app/components/entity-alias-select.scss b/ui/src/app/components/entity-alias-select.scss
deleted file mode 100644
index 544602ba32..0000000000
--- a/ui/src/app/components/entity-alias-select.scss
+++ /dev/null
@@ -1,31 +0,0 @@
-/**
- * Copyright © 2016-2020 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-entity-alias-autocomplete {
- .tb-not-found {
- display: block;
- height: 48px;
- line-height: 1.5;
-
- .tb-no-entries {
- line-height: 48px;
- }
- }
-
- li {
- height: auto !important;
- white-space: normal !important;
- }
-}
diff --git a/ui/src/app/components/entity-alias-select.tpl.html b/ui/src/app/components/entity-alias-select.tpl.html
deleted file mode 100644
index 5192f3d758..0000000000
--- a/ui/src/app/components/entity-alias-select.tpl.html
+++ /dev/null
@@ -1,53 +0,0 @@
-
-
-
-
- {{item.alias}}
-
-
-
-
- entity.no-aliases-found
-
-
-
-
-
-
-
entity.alias-required
-
-
diff --git a/ui/src/app/components/expand-fullscreen.directive.js b/ui/src/app/components/expand-fullscreen.directive.js
deleted file mode 100644
index 4aafb5b69a..0000000000
--- a/ui/src/app/components/expand-fullscreen.directive.js
+++ /dev/null
@@ -1,162 +0,0 @@
-/*
- * Copyright © 2016-2020 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 './expand-fullscreen.scss';
-
-import $ from 'jquery';
-
-export default angular.module('thingsboard.directives.expandFullscreen', [])
- .directive('tbExpandFullscreen', ExpandFullscreen)
- .name;
-
-/* eslint-disable angular/angularelement */
-
-/*@ngInject*/
-function ExpandFullscreen($compile, $document, $timeout) {
-
- var uniqueId = 1;
- var linker = function (scope, element, attrs) {
-
- scope.body = angular.element($document.find('body').eq(0));
- scope.fullscreenParentId = 'fullscreen-parent' + uniqueId;
- scope.fullscreenParent = $('#' + scope.fullscreenParentId, scope.body)[0];
- if (!scope.fullscreenParent) {
- uniqueId++;
- var fullscreenParent = angular.element('');
- scope.body.append(fullscreenParent);
- scope.fullscreenParent = $('#' + scope.fullscreenParentId, scope.body)[0];
- scope.fullscreenParent = angular.element(scope.fullscreenParent);
- scope.fullscreenParent.css('display', 'none');
- } else {
- scope.fullscreenParent = angular.element(scope.fullscreenParent);
- }
-
- scope.$on('$destroy', function () {
- scope.fullscreenParent.remove();
- });
-
- scope.elementParent = null;
- scope.expanded = false;
- scope.fullscreenZindex = scope.fullscreenZindex();
-
- if (!scope.fullscreenZindex) {
- scope.fullscreenZindex = '70';
- }
-
- scope.$watch('expanded', function (newExpanded, prevExpanded) {
- if (newExpanded != prevExpanded) {
- if (scope.expanded) {
- scope.elementParent = element.parent();
- element.detach();
- if (scope.backgroundStyle) {
- scope.fullscreenParent.attr("ng-style","backgroundStyle");
- $compile(scope.fullscreenParent)(scope);
- }
- scope.fullscreenParent.append(element);
- scope.fullscreenParent.css('display', '');
- scope.fullscreenParent.css('z-index', scope.fullscreenZindex);
- element.addClass('tb-fullscreen');
- } else {
- if (scope.elementParent) {
- element.detach();
- scope.elementParent.append(element);
- scope.elementParent = null;
- }
- element.removeClass('tb-fullscreen');
- scope.fullscreenParent.css('display', 'none');
- scope.fullscreenParent.css('z-index', '');
- }
- if (scope.onFullscreenChanged) {
- scope.onFullscreenChanged({expanded: scope.expanded});
- }
- }
- });
-
- scope.$watch(function () {
- return scope.expand();
- }, function (newExpanded) {
- scope.expanded = newExpanded;
- });
-
- scope.toggleExpand = function ($event) {
- if ($event) {
- $event.stopPropagation();
- }
- scope.expanded = !scope.expanded;
- }
-
- var buttonSize;
- if (attrs.expandButtonSize) {
- buttonSize = attrs.expandButtonSize;
- }
-
- var tooltipDirection = angular.isDefined(attrs.expandTooltipDirection) ? attrs.expandTooltipDirection : 'top';
-
- var html = '' +
- '{{(expanded ? \'fullscreen.exit\' : \'fullscreen.expand\') | translate}}' +
- '' +
- '' +
- '';
-
- if (attrs.expandButtonId) {
- $timeout(function() {
- var expandButton = $('#' + attrs.expandButtonId, element)[0];
- renderExpandButton(expandButton);
- });
- } else {
- renderExpandButton();
- }
-
- function renderExpandButton(expandButton) {
- if (expandButton) {
- expandButton = angular.element(expandButton);
- if (scope.hideExpandButton()) {
- expandButton.remove();
- } else {
- expandButton.attr('md-ink-ripple', 'false');
- expandButton.append(html);
-
- $compile(expandButton.contents())(scope);
-
- expandButton.on("click", scope.toggleExpand);
- }
- } else if (!scope.hideExpandButton()) {
- var button = angular.element('' +
- html +
- '');
-
- $compile(button)(scope);
-
- element.prepend(button);
- }
- }
- }
-
- return {
- restrict: "A",
- link: linker,
- scope: {
- expand: "&tbExpandFullscreen",
- hideExpandButton: "&hideExpandButton",
- onFullscreenChanged: "&onFullscreenChanged",
- fullscreenZindex: "&fullscreenZindex",
- backgroundStyle: "=?fullscreenBackgroundStyle"
- }
- };
-}
-
-/* eslint-enable angular/angularelement */
diff --git a/ui/src/app/components/expand-fullscreen.scss b/ui/src/app/components/expand-fullscreen.scss
deleted file mode 100644
index 843d616cea..0000000000
--- a/ui/src/app/components/expand-fullscreen.scss
+++ /dev/null
@@ -1,54 +0,0 @@
-/**
- * Copyright © 2016-2020 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";
-
-.tb-fullscreen {
- position: fixed !important;
- top: 0;
- left: 0;
- width: 100% !important;
- height: 100% !important;
-
- section.header-buttons {
- top: 25px;
- }
-}
-
-.tb-fullscreen-parent {
- position: fixed;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
- background-color: $gray;
-}
-
-.md-button.tb-fullscreen-button-style,
-.tb-fullscreen-button-style {
- background: #ccc;
- opacity: .85;
-
- ng-md-icon {
- color: #666;
- }
-}
-
-.md-button.tb-fullscreen-button-pos,
-.tb-fullscreen-button-pos {
- position: absolute;
- top: 10px;
- right: 10px;
-}
diff --git a/ui/src/app/components/finish-render.directive.js b/ui/src/app/components/finish-render.directive.js
deleted file mode 100644
index 37add22505..0000000000
--- a/ui/src/app/components/finish-render.directive.js
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-export default angular.module('thingsboard.directives.finishRender', [])
- .directive('tbOnFinishRender', OnFinishRender)
- .name;
-
-/*@ngInject*/
-function OnFinishRender($timeout) {
- return {
- restrict: 'A',
- link: function (scope, element, attr) {
- if (scope.$last === true) {
- $timeout(function () {
- scope.$emit(attr.tbOnFinishRender);
- });
- }
- }
- };
-}
diff --git a/ui/src/app/components/gateway/gateway-config-dialog.tpl.html b/ui/src/app/components/gateway/gateway-config-dialog.tpl.html
deleted file mode 100644
index 87195ac584..0000000000
--- a/ui/src/app/components/gateway/gateway-config-dialog.tpl.html
+++ /dev/null
@@ -1,75 +0,0 @@
-
-
-
-
diff --git a/ui/src/app/components/gateway/gateway-config-select.directive.js b/ui/src/app/components/gateway/gateway-config-select.directive.js
deleted file mode 100644
index 79ff454475..0000000000
--- a/ui/src/app/components/gateway/gateway-config-select.directive.js
+++ /dev/null
@@ -1,141 +0,0 @@
-/*
- * Copyright © 2016-2020 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 './gateway-config-select.scss';
-
-/* eslint-disable import/no-unresolved, import/default */
-
-import gatewaySelectTemplate from './gateway-config-select.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-
-/* eslint-disable angular/angularelement */
-
-export default angular.module('thingsboard.directives.gatewayConfigSelect', [])
- .directive('tbGatewayConfigSelect', GatewayConfigSelect)
- .name;
-
-/*@ngInject*/
-function GatewayConfigSelect($compile, $templateCache, $mdConstant, $translate, $mdDialog) {
-
- var linker = function (scope, element, attrs, ngModelCtrl) {
- const template = $templateCache.get(gatewaySelectTemplate);
- element.html(template);
-
- scope.tbRequired = angular.isDefined(scope.tbRequired) ? scope.tbRequired : false;
- scope.gateway = null;
- scope.gatewaySearchText = '';
-
- scope.updateValidity = function () {
- var value = ngModelCtrl.$viewValue;
- var valid = angular.isDefined(value) && value != null || !scope.tbRequired;
- ngModelCtrl.$setValidity('gateway', valid);
- };
-
- function startWatchers() {
- scope.$watch('gateway', function (newVal, prevVal) {
- if (!angular.equals(newVal, prevVal) && newVal !== null) {
- scope.updateView();
- }
- });
- }
-
- scope.gatewayNameSearch = function (gatewaySearchText) {
- return gatewaySearchText ? scope.gatewayList.filter(
- scope.createFilterForGatewayName(gatewaySearchText)) : scope.gatewayList;
- };
-
- scope.createFilterForGatewayName = function (query) {
- var lowercaseQuery = query.toLowerCase();
- return function filterFn(device) {
- return (device.name.toLowerCase().indexOf(lowercaseQuery) === 0);
- };
- };
-
- scope.updateView = function () {
- ngModelCtrl.$setViewValue(scope.gateway);
- scope.updateValidity();
- scope.getAccessToken(scope.gateway.id);
- };
-
- ngModelCtrl.$render = function () {
- if (ngModelCtrl.$viewValue) {
- scope.gateway = ngModelCtrl.$viewValue;
- startWatchers();
- }
- };
-
- scope.textIsEmpty = function (str) {
- return (!str || 0 === str.length);
- };
-
- scope.gatewayNameEnter = function ($event) {
- if ($event.keyCode === $mdConstant.KEY_CODE.ENTER) {
- $event.preventDefault();
- let indexRes = scope.gatewayList.findIndex((element) => element.key === scope.gatewaySearchText);
- if (indexRes === -1) {
- scope.createNewGatewayDialog($event, scope.gatewaySearchText);
- }
- }
- };
-
- scope.createNewGatewayDialog = function ($event, deviceName) {
- if ($event) {
- $event.stopPropagation();
- }
- var title = $translate.instant('gateway.create-new-gateway');
- var content = $translate.instant('gateway.create-new-gateway-text', {gatewayName: deviceName});
- var confirm = $mdDialog.confirm()
- .targetEvent($event)
- .title(title)
- .htmlContent(content)
- .ariaLabel(title)
- .cancel($translate.instant('action.no'))
- .ok($translate.instant('action.yes'));
- $mdDialog.show(confirm).then(
- () => {
- let deviceObj = {
- name: deviceName,
- type: "Gateway",
- additionalInfo: {
- gateway: true
- }
- };
- scope.createDevice(deviceObj);
- },
- () => {
- scope.gatewaySearchText = "";
- }
- );
- };
- $compile(element.contents())(scope);
- };
-
- return {
- restrict: "E",
- require: "^ngModel",
- link: linker,
- scope: {
- tbRequired: '=?',
- gatewayList: '=?',
- getAccessToken: '=',
- createDevice: '=',
- theForm: '='
- }
- };
-}
-
-/* eslint-enable angular/angularelement */
diff --git a/ui/src/app/components/gateway/gateway-config-select.scss b/ui/src/app/components/gateway/gateway-config-select.scss
deleted file mode 100644
index da2e7ba432..0000000000
--- a/ui/src/app/components/gateway/gateway-config-select.scss
+++ /dev/null
@@ -1,29 +0,0 @@
-/**
- * Copyright © 2016-2020 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-gateway-autocomplete {
- .tb-not-found {
- line-height: 1.5;
- white-space: normal;
-
- .tb-no-gateway {
- line-height: 48px;
- }
- }
-}
-
-.tb-gateway-autocomplete-container.md-virtual-repeat-container.md-autocomplete-suggestions-container{
- z-index: 70;
-}
diff --git a/ui/src/app/components/gateway/gateway-config-select.tpl.html b/ui/src/app/components/gateway/gateway-config-select.tpl.html
deleted file mode 100644
index 9a7f6ed655..0000000000
--- a/ui/src/app/components/gateway/gateway-config-select.tpl.html
+++ /dev/null
@@ -1,53 +0,0 @@
-
-
-
-
- {{item.name}}
-
-
-
-
- gateway.no-gateway-found
-
-
-
-
-
-
gateway.gateway-name-required
-
-
-
diff --git a/ui/src/app/components/gateway/gateway-config.directive.js b/ui/src/app/components/gateway/gateway-config.directive.js
deleted file mode 100644
index 19e7f554b9..0000000000
--- a/ui/src/app/components/gateway/gateway-config.directive.js
+++ /dev/null
@@ -1,175 +0,0 @@
-/*
- * Copyright © 2016-2020 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 './gateway-config.scss';
-
-/* eslint-disable import/no-unresolved, import/default */
-
-import gatewayConfigTemplate from './gateway-config.tpl.html';
-import gatewayConfigDialogTemplate from './gateway-config-dialog.tpl.html';
-import beautify from "js-beautify";
-
-/* eslint-enable import/no-unresolved, import/default */
-const js_beautify = beautify.js;
-
-export default angular.module('thingsboard.directives.gatewayConfig', [])
- .directive('tbGatewayConfig', GatewayConfig)
- .name;
-
-/*@ngInject*/
-function GatewayConfig() {
- return {
- restrict: "E",
- scope: true,
- bindToController: {
- disabled: '=ngDisabled',
- gatewayConfig: '=',
- changeAlignment: '=',
- theForm: '=',
- isReadOnly: '='
- },
- controller: GatewayConfigController,
- controllerAs: 'vm',
- templateUrl: gatewayConfigTemplate
- };
-}
-
-/*@ngInject*/
-function GatewayConfigController($scope, $document, $mdDialog, $mdUtil, $window, types) {
- let vm = this;
- vm.types = types;
-
- vm.removeConnector = (index) => {
- if (index > -1) {
- vm.gatewayConfig.splice(index, 1);
- }
- };
-
- vm.addNewConnector = () => {
- vm.gatewayConfig.push({
- enabled: false,
- configType: '',
- config: {},
- name: ''
- });
- };
-
- vm.openConfigDialog = ($event, index, config, typeName) => {
- if ($event) {
- $event.stopPropagation();
- }
- $mdDialog.show({
- controller: GatewayDialogController,
- controllerAs: 'vm',
- templateUrl: gatewayConfigDialogTemplate,
- parent: angular.element($document[0].body),
- locals: {
- config: config,
- typeName: typeName
- },
- targetEvent: $event,
- fullscreen: true,
- multiple: true,
- }).then(function (config) {
- if (config && index > -1) {
- console.log(config); //eslint-disable-line
- if (!angular.equals(vm.gatewayConfig[index].config, config)) {
- $scope.gatewayConfiguration.$setDirty();
- }
- vm.gatewayConfig[index].config = config;
- }
- });
-
- };
-
- vm.changeConnectorType = (connector) => {
- for (let gatewayConfigTypeKey in types.gatewayConfigType) {
- if (types.gatewayConfigType[gatewayConfigTypeKey].value === connector.configType) {
- if (!connector.name) {
- connector.name = generateConnectorName(types.gatewayConfigType[gatewayConfigTypeKey].name, 0);
- break;
- }
- }
- }
- };
-
- vm.changeConnectorName = (connector, currentConnectorIndex) => {
- connector.name = validateConnectorName(connector.name, 0, currentConnectorIndex);
- };
-
- function generateConnectorName(name, index) {
- let newKeyName = index ? name + index : name;
- let indexRes = vm.gatewayConfig.findIndex((element) => element.name === newKeyName);
- return indexRes === -1 ? newKeyName : generateConnectorName(name, ++index);
- }
-
- function validateConnectorName(name, index, currentConnectorIndex) {
- for (let i = 0; i < vm.gatewayConfig.length; i++) {
- let nameEq = (index === 0) ? name : name + index;
- if (i !== currentConnectorIndex && vm.gatewayConfig[i].name === nameEq) {
- index++;
- validateConnectorName(name, index, currentConnectorIndex);
- }
- }
- return (index === 0) ? name : name + index;
- }
-
- vm.validateJSON = (config) => {
- return angular.equals({}, config);
- };
-}
-
-/*@ngInject*/
-function GatewayDialogController($scope, $mdDialog, $document, $window, config, typeName) {
- let vm = this;
- vm.config = js_beautify(angular.toJson(config), {indent_size: 4});
- vm.typeName = typeName;
- vm.configAreaOptions = {
- useWrapMode: true,
- mode: 'json',
- advanced: {
- enableSnippets: true,
- enableBasicAutocompletion: true,
- enableLiveAutocompletion: true
- },
- onLoad: function (_ace) {
- _ace.$blockScrolling = 1;
- }
- };
-
- vm.validateConfig = (model, editorName) => {
- if (model && model.length) {
- try {
- angular.fromJson(model);
- $scope.theForm[editorName].$setValidity('config', true);
- } catch (e) {
- $scope.theForm[editorName].$setValidity('config', false);
- }
- }
- };
-
- vm.save = () => {
- $mdDialog.hide(angular.fromJson(vm.config));
- };
-
- vm.cancel = () => {
- $mdDialog.hide();
- };
-
- vm.beautifyJson = () => {
- vm.config = js_beautify(vm.config, {indent_size: 4});
- };
-}
-
diff --git a/ui/src/app/components/gateway/gateway-config.scss b/ui/src/app/components/gateway/gateway-config.scss
deleted file mode 100644
index 45d9532927..0000000000
--- a/ui/src/app/components/gateway/gateway-config.scss
+++ /dev/null
@@ -1,85 +0,0 @@
-/**
- * Copyright © 2016-2020 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.
- */
-.gateway-config {
- span.no-data-found {
- position: relative;
- display: flex;
- height: 40px;
- text-transform: uppercase;
-
- &.disabled {
- color: rgba(0, 0, 0, .38);
- }
- }
-
- .gateway-config-row{
- md-input-container{
- margin-bottom: 0;
- }
-
- &.gateway-config-row-vertical {
- flex-direction: column;
- }
- }
-
- .action-buttons.gateway-config-row-vertical {
- flex-direction: column;
- justify-content: space-evenly;
- }
-}
-
-.gateway-config-dialog{
- .md-button.tidy{
- min-width: 32px;
- min-height: 15px;
- padding: 4px;
- margin: 0 5px 0 0;
- font-size: .8rem;
- line-height: 15px;
- color: #7b7b7b;
- background: rgba(220, 220, 220, .35);
- }
-
- .tb-json-toolbar{
- height: 40px;
- }
-}
-
-.tb-json-panel {
- height: calc(100% - 80px);
- margin-left: 15px;
- border: 1px solid #c0c0c0;
-
- .tb-json-input {
- width: 100%;
- min-width: 400px;
- height: 100%;
-
- &:not(.fill-height) {
- min-height: 200px;
- }
- }
-}
-
-@media (max-width: 425px){
- .gateway-config-dialog{
- .tb-json-panel {
- .tb-json-input {
- min-width: 200px;
- }
- }
- }
-}
diff --git a/ui/src/app/components/gateway/gateway-config.tpl.html b/ui/src/app/components/gateway/gateway-config.tpl.html
deleted file mode 100644
index e4525b2bf2..0000000000
--- a/ui/src/app/components/gateway/gateway-config.tpl.html
+++ /dev/null
@@ -1,81 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
- {{configType.value}}
-
-
-
-
gateway.connector-type-required
-
-
-
-
-
-
gateway.connector-name-required
-
-
-
-
-
- more_horiz
-
- {{ 'gateway.update-config' | translate }}
-
-
-
- close
-
- {{ 'gateway.delete' | translate }}
-
-
-
-
- {{'gateway.no-connectors'}}
-
-
-
- {{ 'gateway.connector-add' | translate }}
-
- action.add
-
-
-
diff --git a/ui/src/app/components/gateway/gateway-form.directive.js b/ui/src/app/components/gateway/gateway-form.directive.js
deleted file mode 100644
index 436bc6bcd5..0000000000
--- a/ui/src/app/components/gateway/gateway-form.directive.js
+++ /dev/null
@@ -1,493 +0,0 @@
-/*
- * Copyright © 2016-2020 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 './gateway-form.scss';
-/* eslint-disable import/no-unresolved, import/default */
-
-import gatewayFormTemplate from './gateway-form.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-export default angular.module('thingsboard.directives.gatewayForm', [])
- .directive('tbGatewayForm', GatewayForm)
- .name;
-
-/*@ngInject*/
-function GatewayForm() {
- return {
- restrict: "E",
- scope: true,
- bindToController: {
- formId: '=',
- ctx: '=',
- isStateForm: '=',
- deviceName: '=',
- isReadOnly: '=',
- isState: '='
- },
- controller: GatewayFormController,
- controllerAs: 'vm',
- templateUrl: gatewayFormTemplate,
- };
-}
-
-/*@ngInject*/
-function GatewayFormController($scope, $injector, $document, $mdExpansionPanel, toast, importExport, attributeService, deviceService, userService, $mdDialog, $mdUtil, types, $window, $q, entityService, utils, $translate) {
- let vm = this;
- const currentConfigurationAttribute = "current_configuration";
- const configurationDraftsAttribute = "configuration_drafts";
- const configurationAttribute = "configuration";
- const remoteLoggingLevelAttribute = "RemoteLoggingLevel";
-
- const templateLogsConfig = '[loggers]}}keys=root, service, connector, converter, tb_connection, storage, extension}}[handlers]}}keys=consoleHandler, serviceHandler, connectorHandler, converterHandler, tb_connectionHandler, storageHandler, extensionHandler}}[formatters]}}keys=LogFormatter}}[logger_root]}}level=ERROR}}handlers=consoleHandler}}[logger_connector]}}level={ERROR}}}handlers=connectorHandler}}formatter=LogFormatter}}qualname=connector}}[logger_storage]}}level={ERROR}}}handlers=storageHandler}}formatter=LogFormatter}}qualname=storage}}[logger_tb_connection]}}level={ERROR}}}handlers=tb_connectionHandler}}formatter=LogFormatter}}qualname=tb_connection}}[logger_service]}}level={ERROR}}}handlers=serviceHandler}}formatter=LogFormatter}}qualname=service}}[logger_converter]}}level={ERROR}}}handlers=converterHandler}}formatter=LogFormatter}}qualname=converter}}[logger_extension]}}level={ERROR}}}handlers=connectorHandler}}formatter=LogFormatter}}qualname=extension}}[handler_consoleHandler]}}class=StreamHandler}}level={ERROR}}}formatter=LogFormatter}}args=(sys.stdout,)}}[handler_connectorHandler]}}level={ERROR}}}class=logging.handlers.TimedRotatingFileHandler}}formatter=LogFormatter}}args=("{./logs/}connector.log", "d", 1, 7,)}}[handler_storageHandler]}}level={ERROR}}}class=logging.handlers.TimedRotatingFileHandler}}formatter=LogFormatter}}args=("{./logs/}storage.log", "d", 1, 7,)}}[handler_serviceHandler]}}level={ERROR}}}class=logging.handlers.TimedRotatingFileHandler}}formatter=LogFormatter}}args=("{./logs/}service.log", "d", 1, 7,)}}[handler_converterHandler]}}level={ERROR}}}class=logging.handlers.TimedRotatingFileHandler}}formatter=LogFormatter}}args=("{./logs/}converter.log", "d", 1, 3,)}}[handler_extensionHandler]}}level={ERROR}}}class=logging.handlers.TimedRotatingFileHandler}}formatter=LogFormatter}}args=("{./logs/}extension.log", "d", 1, 3,)}}[handler_tb_connectionHandler]}}level={ERROR}}}class=logging.handlers.TimedRotatingFileHandler}}formatter=LogFormatter}}args=("{./logs/}tb_connection.log", "d", 1, 3,)}}[formatter_LogFormatter]}}format="%(asctime)s - %(levelname)s - [%(filename)s] - %(module)s - %(lineno)d - %(message)s" }}datefmt="%Y-%m-%d %H:%M:%S"';
-
- vm.types = types;
- vm.deviceNameForm = (vm.deviceName) ? vm.deviceName : null;
- vm.idForm = Math.random().toString(36).replace(/^0\.[0-9]*/, '');
- vm.configurations = {
- gateway: '',
- host: $document[0].domain,
- port: 1883,
- remoteConfiguration: true,
- accessToken: '',
- storageType: "memoryStorage",
- readRecordsCount: 100,
- maxRecordsCount: 10000,
- dataFolderPath: './data/',
- maxFilesCount: 5,
- securityType: "accessToken",
- caCertPath: '/etc/thingsboard-gateway/ca.pem',
- privateKeyPath: '/etc/thingsboard-gateway/privateKey.pem',
- certPath: '/etc/thingsboard-gateway/certificate.pem',
- connectors: [],
- remoteLoggingLevel: "DEBUG",
- remoteLoggingPathToLogs: './logs/'
- };
-
- let archiveFileName = '';
- let gatewayNameExists = '';
- let successfulSaved = '';
- vm.securityTypes = [{
- name: 'gateway.security-types.access-token',
- value: 'accessToken'
- }, {
- name: 'gateway.security-types.tls',
- value: 'tls'
- }];
-
- vm.storageTypes = [{
- name: 'gateway.storage-types.memory-storage',
- value: 'memoryStorage'
- }, {
- name: 'gateway.storage-types.file-storage',
- value: 'fileStorage'
- }];
-
- $scope.$watch('vm.ctx', function () {
- if (vm.ctx) {
- vm.isStateForm = $scope.isStateForm;
- vm.settings = vm.ctx.settings;
- vm.widgetConfig = vm.ctx.widgetConfig;
- if (vm.ctx.datasources && vm.ctx.datasources.length) {
- vm.deviceNameForm = vm.ctx.datasources[0].name;
- }
- }
- initializeConfig();
- });
-
-
- $scope.$on('gateway-form-resize', function (event, formId) {
- if (vm.formId == formId) {
- updateWidgetDisplaying();
- }
- });
-
- function updateWidgetDisplaying() {
- if (vm.ctx) {
- vm.changeAlignment = (vm.ctx.$container[0].offsetWidth <= 425);
- }
- }
-
- function initWidgetSettings() {
- let widgetTitle;
- if (vm.settings) {
- vm.isReadOnlyForm = (vm.settings.readOnly) ? vm.settings.readOnly : false;
- if (vm.settings.gatewayTitle && vm.settings.gatewayTitle.length) {
- widgetTitle = utils.customTranslation(vm.settings.gatewayTitle, vm.settings.gatewayTitle);
- }
- } else {
- vm.isReadOnlyForm = false;
- widgetTitle = $translate.instant('gateway.gateway');
- }
- if (vm.ctx) {
- vm.ctx.widgetTitle = widgetTitle;
- }
-
- archiveFileName = vm.settings && vm.settings.archiveFileName && vm.settings.archiveFileName.length ? vm.settings.archiveFileName : 'gatewayConfiguration';
- if (vm.settings) {
- gatewayNameExists = utils.customTranslation(vm.settings.deviceNameExist, vm.settings.deviceNameExist) || $translate.instant('gateway.gateway-exists');
- successfulSaved = utils.customTranslation(vm.settings.successfulSave, vm.settings.successfulSave) || $translate.instant('gateway.gateway-saved');
- } else {
- gatewayNameExists = $translate.instant('gateway.gateway-exists');
- successfulSaved = $translate.instant('gateway.gateway-saved');
- }
- }
-
- function initializeConfig() {
- updateWidgetDisplaying();
- initWidgetSettings();
- getGatewaysList(true);
- }
-
-
- vm.getAccessToken = (deviceId) => {
- if (deviceId.id) {
- getDeviceCredentials(deviceId.id);
- }
- };
-
- vm.collapsePanel = function (panelId) {
- $mdExpansionPanel(panelId).collapse();
- };
-
- function getDeviceCredentials(deviceId) {
- return deviceService.getDeviceCredentials(deviceId).then(
- (deviceCredentials) => {
- vm.configurations.accessToken = deviceCredentials.credentialsId;
- getAttributes();
- }
- );
- }
-
- vm.createDevice = (deviceObj) => {
- deviceService.findByName(deviceObj.name, {ignoreErrors: true})
- .then(
- function () {
- toast.showError(gatewayNameExists, angular.element('.gateway-form'), 'top left');
- },
- function () {
- if (vm.settings.gatewayType && vm.settings.gatewayType.length) {
- deviceObj.type = vm.settings.gatewayType;
- }
- deviceService.saveDevice(deviceObj).then(
- (device) => {
- getDeviceCredentials(device.id.id).then(() => {
- getGatewaysList();
- });
- }
- );
- });
- };
-
- vm.saveAttributeConfig = () => {
- $q.all([
- saveAttribute(configurationAttribute, $window.btoa(angular.toJson(getGatewayConfigJSON())), types.attributesScope.shared.value),
- saveAttribute(configurationDraftsAttribute, $window.btoa(angular.toJson(getDraftConnectorJSON())), types.attributesScope.server.value),
- saveAttribute(remoteLoggingLevelAttribute, vm.configurations.remoteLoggingLevel.toUpperCase(), types.attributesScope.shared.value)
- ]).then(() => {
- toast.showSuccess(successfulSaved, 2000, angular.element('.gateway-form'), 'top left');
- })
- };
-
- function getAttributes() {
- let promises = [];
- promises.push(getAttribute(currentConfigurationAttribute, types.attributesScope.client.value));
- promises.push(getAttribute(configurationDraftsAttribute, types.attributesScope.server.value));
- promises.push(getAttribute(remoteLoggingLevelAttribute, types.attributesScope.shared.value));
- $q.all(promises).then((response) => {
- processCurrentConfiguration(response[0]);
- processConfigurationDrafts(response[1]);
- processLoggingLevel(response[2]);
- });
- }
-
- function getAttribute(attributeName, attributeScope) {
- return attributeService.getEntityAttributesValues(vm.configurations.gateway.id.entityType, vm.configurations.gateway.id.id, attributeScope, attributeName);
- }
-
- function saveAttribute(attributeName, attributeValue, attributeScope) {
- let attributes = [{
- key: attributeName,
- value: attributeValue
- }];
- return attributeService.saveEntityAttributes(vm.configurations.gateway.id.entityType, vm.configurations.gateway.id.id, attributeScope, attributes);
- }
-
- vm.exportConfig = () => {
- let filesZip = {};
- filesZip["tb_gateway.yaml"] = generateYAMLConfigurationFile();
- generateConfigConnectorFiles(filesZip);
- generateLogConfigFile(filesZip);
- importExport.exportJSZip(filesZip, archiveFileName);
- saveAttribute(remoteLoggingLevelAttribute, vm.configurations.remoteLoggingLevel.toUpperCase(), types.attributesScope.shared.value);
- };
-
- function generateYAMLConfigurationFile() {
- let config;
- config = 'thingsboard:\n';
- config += ' host: ' + vm.configurations.host + '\n';
- config += ' remoteConfiguration: ' + vm.configurations.remoteConfiguration + '\n';
- config += ' port: ' + vm.configurations.port + '\n';
- config += ' security:\n';
- if (vm.configurations.securityType === 'accessToken') {
- config += ' access-token: ' + vm.configurations.accessToken + '\n';
- } else if (vm.configurations.securityType === 'tls') {
- config += ' ca_cert: ' + vm.configurations.caCertPath + '\n';
- config += ' privateKey: ' + vm.configurations.privateKeyPath + '\n';
- config += ' cert: ' + vm.configurations.certPath + '\n';
- }
- config += 'storage:\n';
- if (vm.configurations.storageType === 'memoryStorage') {
- config += ' type: memory\n';
- config += ' read_records_count: ' + vm.configurations.readRecordsCount + '\n';
- config += ' max_records_count: ' + vm.configurations.maxRecordsCount + '\n';
- } else if (vm.configurations.storageType === 'fileStorage') {
- config += ' type: file\n';
- config += ' data_folder_path: ' + vm.configurations.dataFolderPath + '\n';
- config += ' max_file_count: ' + vm.configurations.maxFilesCount + '\n';
- config += ' max_read_records_count: ' + vm.configurations.readRecordsCount + '\n';
- config += ' max_records_per_file: ' + vm.configurations.maxRecordsCount + '\n';
- }
- config += 'connectors:\n';
- for (let i = 0; i < vm.configurations.connectors.length; i++) {
- if (vm.configurations.connectors[i].enabled) {
- config += ' -\n';
- config += ' name: ' + vm.configurations.connectors[i].name + '\n';
- config += ' type: ' + vm.configurations.connectors[i].configType + '\n';
- config += ' configuration: ' + generateFileName(vm.configurations.connectors[i].name) + '\n';
- }
- }
- return config;
- }
-
- function generateConfigConnectorFiles(fileZipAdd) {
- for (let i = 0; i < vm.configurations.connectors.length; i++) {
- if (vm.configurations.connectors[i].enabled) {
- fileZipAdd[generateFileName(vm.configurations.connectors[i].name)] = angular.toJson(vm.configurations.connectors[i].config);
- }
- }
- }
-
- function generateLogConfigFile(fileZipAdd) {
- fileZipAdd["logs.conf"] = getLogsConfig();
- }
-
- function getLogsConfig() {
- return templateLogsConfig
- .replace(/{ERROR}/g, vm.configurations.remoteLoggingLevel)
- .replace(/{.\/logs\/}/g, vm.configurations.remoteLoggingPathToLogs);
- }
-
- function getGatewayConfigJSON() {
- let gatewayConfig = {};
- gatewayConfig["thingsboard"] = gatewayMainConfigJSON();
- gatewayConnectorConfigJSON(gatewayConfig);
- return gatewayConfig;
- }
-
- function gatewayMainConfigJSON() {
- let configuration = {};
-
- let thingsBoard = {};
- thingsBoard.host = vm.configurations.host;
- thingsBoard.remoteConfiguration = vm.configurations.remoteConfiguration;
- thingsBoard.port = vm.configurations.port;
- let security = {};
- if (vm.configurations.securityType === 'accessToken') {
- security.accessToken = (vm.configurations.accessToken) ? vm.configurations.accessToken : ""
- } else {
- security.caCert = vm.configurations.caCertPath;
- security.privateKey = vm.configurations.privateKeyPath;
- security.cert = vm.configurations.certPath;
- }
- thingsBoard.security = security;
- configuration.thingsboard = thingsBoard;
-
- let storage = {};
- if (vm.configurations.storageType === 'memoryStorage') {
- storage.type = "memory";
- storage.read_records_count = vm.configurations.readRecordsCount;
- storage.max_records_count = vm.configurations.maxRecordsCount;
- } else if (vm.configurations.storageType === 'fileStorage') {
- storage.type = "file";
- storage.data_folder_path = vm.configurations.dataFolderPath;
- storage.max_file_count = vm.configurations.maxFilesCount;
- storage.max_read_records_count = vm.configurations.readRecordsCount;
- storage.max_records_per_file = vm.configurations.maxRecordsCount;
- }
- configuration.storage = storage;
-
- let connectors = [];
- for (let i = 0; i < vm.configurations.connectors.length; i++) {
- if (vm.configurations.connectors[i].enabled) {
- let connector = {
- configuration: generateFileName(vm.configurations.connectors[i].name),
- name: vm.configurations.connectors[i].name,
- type: vm.configurations.connectors[i].configType
- };
- connectors.push(connector);
- }
- }
- configuration.connectors = connectors;
-
- configuration.logs = $window.btoa(getLogsConfig());
-
- return configuration;
- }
-
- function gatewayConnectorConfigJSON(gatewayConfiguration) {
- for (let i = 0; i < vm.configurations.connectors.length; i++) {
- if (vm.configurations.connectors[i].enabled) {
- let typeConnector = vm.configurations.connectors[i].configType;
- if (!angular.isArray(gatewayConfiguration[typeConnector])) {
- gatewayConfiguration[typeConnector] = [];
- }
-
- let connectorConfig = {
- name: vm.configurations.connectors[i].name,
- config: vm.configurations.connectors[i].config
- };
- gatewayConfiguration[typeConnector].push(connectorConfig);
- }
- }
- }
-
- function getDraftConnectorJSON() {
- let draftConnector = {};
- for (let i = 0; i < vm.configurations.connectors.length; i++) {
- if (!vm.configurations.connectors[i].enabled) {
- let connector = {
- connector: vm.configurations.connectors[i].configType,
- config: vm.configurations.connectors[i].config
- };
- draftConnector[vm.configurations.connectors[i].name] = connector;
- }
- }
- return draftConnector;
- }
-
- function getGatewaysList(firstInit) {
- vm.gateways = [];
- entityService.getEntitiesByNameFilter(types.entityType.device, "", -1).then((devices) => {
- for (let i = 0; i < devices.length; i++) {
- const device = devices[i];
- if (device.additionalInfo !== null && device.additionalInfo.gateway === true) {
- vm.gateways.push(device);
- if (vm.deviceNameForm && firstInit && vm.gateways.length && device.name === vm.deviceNameForm) {
- vm.configurations.gateway = device;
- vm.getAccessToken(device.id);
- } else if (firstInit && vm.gateways.length && device.name === vm.gateways[0].name) {
- vm.configurations.gateway = device;
- vm.getAccessToken(device.id);
- }
- }
- }
- });
- }
-
- function processCurrentConfiguration(response) {
- if (response.length > 0) {
- vm.configurations.connectors = [];
- let attribute = angular.fromJson($window.atob(response[0].value));
- for (var attributeKey in attribute) {
- let keyValue = attribute[attributeKey];
- if (attributeKey === "thingsboard") {
- if (keyValue !== null && Object.keys(keyValue).length > 0) {
- setConfigGateway(keyValue);
- }
- } else {
- for (let connectorType in keyValue) {
- let name = "No name";
- if (Object.prototype.hasOwnProperty.call(keyValue[connectorType], 'name')) {
- name = keyValue[connectorType].name;
- }
- let connector = {
- enabled: true,
- configType: attributeKey,
- config: keyValue[connectorType].config,
- name: name
- };
- vm.configurations.connectors.push(connector);
- }
- }
- }
- }
- }
-
- function processConfigurationDrafts(response) {
- if (response.length > 0) {
- let attribute = angular.fromJson($window.atob(response[0].value));
- for (let key in attribute) {
- let connector = {
- enabled: false,
- configType: attribute[key].connector,
- config: attribute[key].config,
- name: key
- };
- vm.configurations.connectors.push(connector);
- }
- }
- }
-
- function processLoggingLevel(response) {
- if (response.length > 0) {
- if (vm.types.gatewayLogLevel[response[0].value.toLowerCase()]) {
- vm.configurations.remoteLoggingLevel = response[0].value.toUpperCase();
- }
- } else {
- vm.configurations.remoteLoggingLevel = vm.types.gatewayLogLevel.debug;
- }
- }
-
- function setConfigGateway(keyValue) {
- if (Object.prototype.hasOwnProperty.call(keyValue, 'thingsboard')) {
- vm.configurations.host = keyValue.thingsboard.host;
- vm.configurations.port = keyValue.thingsboard.port;
- vm.configurations.remoteConfiguration = keyValue.thingsboard.remoteConfiguration;
- if (Object.prototype.hasOwnProperty.call(keyValue.thingsboard.security, 'accessToken')) {
- vm.configurations.securityType = 'accessToken';
- vm.configurations.accessToken = keyValue.thingsboard.security.accessToken;
- } else {
- vm.configurations.securityType = 'tls';
- vm.configurations.caCertPath = keyValue.thingsboard.security.caCert;
- vm.configurations.privateKeyPath = keyValue.thingsboard.security.private_key;
- vm.configurations.certPath = keyValue.thingsboard.security.cert;
- }
- }
-
- if (Object.prototype.hasOwnProperty.call(keyValue, 'storage') && Object.prototype.hasOwnProperty.call(keyValue.storage, 'type')) {
- if (keyValue.storage.type === 'memory') {
- vm.configurations.storageType = 'memoryStorage';
- vm.configurations.readRecordsCount = keyValue.storage.read_records_count;
- vm.configurations.maxRecordsCount = keyValue.storage.max_records_count;
- } else if (keyValue.storage.type === 'file') {
- vm.configurations.storageType = 'fileStorage';
- vm.configurations.dataFolderPath = keyValue.storage.data_folder_path;
- vm.configurations.maxFilesCount = keyValue.storage.max_file_count;
- vm.configurations.readRecordsCount = keyValue.storage.read_records_count;
- vm.configurations.maxRecordsCount = keyValue.storage.max_records_count;
- }
- }
- }
-
- function generateFileName(fileName) {
- return fileName.replace("_", "")
- .replace("-", "")
- .replace(/^\s+|\s+/g, '')
- .toLowerCase() + '.json';
- }
-}
-
-
diff --git a/ui/src/app/components/gateway/gateway-form.scss b/ui/src/app/components/gateway/gateway-form.scss
deleted file mode 100644
index f6851c7688..0000000000
--- a/ui/src/app/components/gateway/gateway-form.scss
+++ /dev/null
@@ -1,42 +0,0 @@
-/**
- * Copyright © 2016-2020 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.
- */
-.gateway-form{
- height: 100%;
- padding: 5px 5px 0;
- background-color: transparent;
-
- .gateway-form-row{
- md-input-container{
- margin-bottom: 0;
- }
-
- &.gateway-config-row-vertical{
- flex-direction: column;
-
- .md-select-container{
- margin-bottom: 14px;
- }
- }
- }
-
- .security-type {
- margin-top: 18px;
- }
-
- .form-action-buttons{
- padding-top: 8px;
- }
-}
diff --git a/ui/src/app/components/gateway/gateway-form.tpl.html b/ui/src/app/components/gateway/gateway-form.tpl.html
deleted file mode 100644
index 13603b2cfc..0000000000
--- a/ui/src/app/components/gateway/gateway-form.tpl.html
+++ /dev/null
@@ -1,229 +0,0 @@
-
-
-
-
diff --git a/ui/src/app/components/grid.directive.js b/ui/src/app/components/grid.directive.js
deleted file mode 100644
index e22c167a48..0000000000
--- a/ui/src/app/components/grid.directive.js
+++ /dev/null
@@ -1,718 +0,0 @@
-/*
- * Copyright © 2016-2020 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 './grid.scss';
-
-import thingsboardScopeElement from './scope-element.directive';
-import thingsboardDetailsSidenav from './details-sidenav.directive';
-
-/* eslint-disable import/no-unresolved, import/default */
-
-import gridTemplate from './grid.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-export default angular.module('thingsboard.directives.grid', [thingsboardScopeElement, thingsboardDetailsSidenav])
- .directive('tbGrid', Grid)
- .controller('AddItemController', AddItemController)
- .controller('ItemCardController', ItemCardController)
- .directive('tbGridCardContent', GridCardContent)
- .filter('range', RangeFilter)
- .name;
-
-/*@ngInject*/
-function RangeFilter() {
- return function(input, total) {
- total = parseInt(total);
-
- for (var i=0; i= vm.items.rowData.length) {
- vm.itemRows.fetchMoreItems_(index);
- return null;
- }
- return vm.items.rowData[index];
- },
-
- getLength: function () {
- if (vm.items.hasNext && !vm.items.pending) {
- return vm.items.rowData.length + pageSize;
- } else {
- return vm.items.rowData.length;
- }
- },
-
- fetchMoreItems_: function () {
- if (vm.items.hasNext && !vm.items.pending) {
- var promise = vm.fetchItemsFunc(vm.items.nextPageLink, $scope.searchConfig.searchEntitySubtype);
- if (promise) {
- vm.items.pending = true;
- promise.then(
- function success(items) {
- if (vm.items.reloadPending) {
- vm.items.pending = false;
- reload();
- } else {
- vm.items.data = vm.items.data.concat(items.data);
- var startIndex = vm.items.data.length - items.data.length;
- var endIndex = vm.items.data.length;
- for (var i = startIndex; i < endIndex; i++) {
- var item = vm.items.data[i];
- item.index = i;
- var row = Math.floor(i / vm.columns);
- var itemRow = vm.items.rowData[row];
- if (!itemRow) {
- itemRow = [];
- vm.items.rowData.push(itemRow);
- }
- itemRow.push(item);
- }
- vm.items.nextPageLink = items.nextPageLink;
- vm.items.hasNext = items.hasNext;
- if (vm.items.hasNext) {
- vm.items.nextPageLink.limit = pageSize;
- }
- vm.items.pending = false;
- if (vm.items.loadCallback) {
- vm.items.loadCallback();
- vm.items.loadCallback = null;
- }
- }
- },
- function fail() {
- vm.items.hasNext = false;
- vm.items.pending = false;
- });
- } else {
- vm.items.hasNext = false;
- }
- }
- }
- };
-
- function columnsUpdated(newColumns) {
- if (vm.columns !== newColumns) {
- var newTopIndex = Math.ceil(vm.columns * vm.topIndex / newColumns);
- pageSize = 10 * newColumns;
- vm.items.rowData = [];
- if (vm.items.nextPageLink) {
- vm.items.nextPageLink.limit = pageSize;
- }
-
- for (var i = 0; i < vm.items.data.length; i++) {
- var item = vm.items.data[i];
- var row = Math.floor(i / newColumns);
- var itemRow = vm.items.rowData[row];
- if (!itemRow) {
- itemRow = [];
- vm.items.rowData.push(itemRow);
- }
- itemRow.push(item);
- }
-
- vm.columns = newColumns;
- vm.topIndex = newTopIndex;
- vm.itemRows.getItemAtIndex(newTopIndex+pageSize);
- $timeout(function() {
- moveToIndex(newTopIndex);
- }, 500);
- }
- }
-
- function initGridConfiguration() {
- vm.gridConfiguration = vm.gridConfiguration || function () {
- return {};
- };
-
- vm.config = vm.gridConfiguration();
-
- vm.itemHeight = vm.config.itemHeight || 199;
-
- vm.refreshParamsFunc = vm.config.refreshParamsFunc || function () {
- return {"topIndex": vm.topIndex};
- };
-
- vm.deleteItemTitleFunc = vm.config.deleteItemTitleFunc || function () {
- return $translate.instant('grid.delete-item-title');
- };
-
- vm.deleteItemContentFunc = vm.config.deleteItemContentFunc || function () {
- return $translate.instant('grid.delete-item-text');
- };
-
- vm.deleteItemsTitleFunc = vm.config.deleteItemsTitleFunc || function () {
- return $translate.instant('grid.delete-items-title', {count: vm.items.selectedCount}, 'messageformat');
- };
-
- vm.deleteItemsActionTitleFunc = vm.config.deleteItemsActionTitleFunc || function (selectedCount) {
- return $translate.instant('grid.delete-items-action-title', {count: selectedCount}, 'messageformat');
- };
-
- vm.deleteItemsContentFunc = vm.config.deleteItemsContentFunc || function () {
- return $translate.instant('grid.delete-items-text');
- };
-
- vm.fetchItemsFunc = vm.config.fetchItemsFunc || function () {
- return $q.when([]);
- };
-
- vm.loadItemDetailsFunc = vm.config.loadItemDetailsFunc || function (item) {
- return $q.when(item);
- };
-
- vm.saveItemFunc = vm.config.saveItemFunc || function (item) {
- return $q.when(item);
- };
-
- vm.deleteItemFunc = vm.config.deleteItemFunc || function () {
- return $q.when();
- };
-
- vm.clickItemFunc = vm.config.clickItemFunc || function ($event, item) {
- vm.openItem($event, item);
- };
-
- vm.itemCardTemplate = '';
- if (vm.config.itemCardTemplate) {
- vm.itemCardTemplate = vm.config.itemCardTemplate;
- } else if (vm.config.itemCardTemplateUrl) {
- vm.itemCardTemplate = $templateCache.get(vm.config.itemCardTemplateUrl);
- }
- if (vm.config.itemCardController) {
- vm.itemCardController = vm.config.itemCardController;
- } else {
- vm.itemCardController = 'ItemCardController';
- }
- if (vm.config.addItemController) {
- vm.addItemController = vm.config.addItemController;
- } else {
- vm.addItemController = 'AddItemController';
- }
-
- vm.parentCtl = vm.config.parentCtl || vm;
-
- vm.getItemTitleFunc = vm.config.getItemTitleFunc || function () {
- return '';
- };
-
- vm.actionsList = vm.config.actionsList || [];
-
- for (var i = 0; i < vm.actionsList.length; i++) {
- var action = vm.actionsList[i];
- action.isEnabled = action.isEnabled || function() {
- return true;
- };
- }
-
- vm.groupActionsList = vm.config.groupActionsList || [
- {
- onAction: function ($event) {
- deleteItems($event);
- },
- name: function() { return $translate.instant('action.delete') },
- details: vm.deleteItemsActionTitleFunc,
- icon: "delete"
- }
- ];
-
- vm.addItemText = vm.config.addItemText || function () {
- return $translate.instant('grid.add-item-text');
- };
-
- vm.addItemAction = vm.config.addItemAction || {
- onAction: function ($event) {
- addItem($event);
- },
- name: function() { return $translate.instant('action.add') },
- details: function() { return vm.addItemText() },
- icon: "add"
- };
-
- vm.addItemActionsOpen = false;
-
- vm.addItemActions = vm.config.addItemActions || [];
-
- vm.onGridInited = vm.config.onGridInited || function () {
- };
-
- vm.addItemTemplateUrl = vm.config.addItemTemplateUrl;
-
- vm.noItemsText = vm.config.noItemsText || function () {
- return $translate.instant('grid.no-items-text');
- };
-
- vm.itemDetailsText = vm.config.itemDetailsText || function () {
- return $translate.instant('grid.item-details');
- };
-
- vm.isDetailsReadOnly = vm.config.isDetailsReadOnly || function () {
- return false;
- };
-
- vm.isSelectionEnabled = vm.config.isSelectionEnabled || function () {
- return true;
- };
-
- vm.topIndex = vm.config.topIndex || 0;
-
- vm.items = vm.config.items || {
- data: [],
- rowData: [],
- nextPageLink: {
- limit: vm.topIndex + pageSize,
- textSearch: $scope.searchConfig.searchText
- },
- selections: {},
- selectedCount: 0,
- hasNext: true,
- pending: false
- };
-
- vm.detailsConfig = {
- isDetailsOpen: false,
- isDetailsEditMode: false,
- currentItem: null,
- editingItem: null
- };
- }
-
- $scope.$on('searchTextUpdated', function () {
- reload();
- });
-
- $scope.$on('searchEntitySubtypeUpdated', function () {
- reload();
- });
-
- vm.onGridInited(vm);
-
- vm.itemRows.getItemAtIndex(pageSize);
-
- function reload() {
- if (vm.items && vm.items.pending) {
- vm.items.reloadPending = true;
- } else {
- vm.items.data.length = 0;
- vm.items.rowData.length = 0;
- vm.items.nextPageLink = {
- limit: pageSize,
- textSearch: $scope.searchConfig.searchText
- };
- vm.items.selections = {};
- vm.items.selectedCount = 0;
- vm.items.hasNext = true;
- vm.items.pending = false;
- vm.detailsConfig.isDetailsOpen = false;
- vm.items.reloadPending = false;
- vm.itemRows.getItemAtIndex(pageSize);
- }
- }
-
- function refreshList() {
- let preservedTopIndex = vm.topIndex;
- vm.items.data.length = 0;
- vm.items.rowData.length = 0;
- vm.items.nextPageLink = {
- limit: preservedTopIndex + pageSize,
- textSearch: $scope.searchConfig.searchText
- };
- vm.items.selections = {};
- vm.items.selectedCount = 0;
- vm.items.hasNext = true;
- vm.items.pending = false;
- vm.detailsConfig.isDetailsOpen = false;
- vm.items.reloadPending = false;
- vm.items.loadCallback = () => {
- $mdUtil.nextTick(() => {
- moveToIndex(preservedTopIndex);
- });
- };
- vm.itemRows.getItemAtIndex(preservedTopIndex+pageSize);
- }
-
- function addItem($event) {
- $mdDialog.show({
- controller: vm.addItemController,
- controllerAs: 'vm',
- templateUrl: vm.addItemTemplateUrl,
- parent: angular.element($document[0].body),
- locals: {saveItemFunction: vm.saveItemFunc},
- fullscreen: true,
- targetEvent: $event
- }).then(function () {
- refreshList();
- }, function () {
- });
- }
-
- function openItem($event, item) {
- $event.stopPropagation();
- if (vm.detailsConfig.currentItem != null && vm.detailsConfig.currentItem.id.id === item.id.id) {
- if (vm.detailsConfig.isDetailsOpen) {
- vm.detailsConfig.isDetailsOpen = false;
- return;
- }
- }
- vm.loadItemDetailsFunc(item).then(function success(detailsItem) {
- detailsItem.index = item.index;
- vm.detailsConfig.currentItem = detailsItem;
- vm.detailsConfig.isDetailsEditMode = false;
- vm.detailsConfig.isDetailsOpen = true;
- });
- }
-
- function isCurrentItem(item) {
- if (item != null && vm.detailsConfig.currentItem != null &&
- vm.detailsConfig.currentItem.id.id === item.id.id) {
- return vm.detailsConfig.isDetailsOpen;
- } else {
- return false;
- }
- }
-
- function onToggleDetailsEditMode(theForm) {
- if (!vm.detailsConfig.isDetailsEditMode) {
- theForm.$setPristine();
- }
- }
-
- function onCloseDetails() {
- vm.detailsConfig.currentItem = null;
- }
-
- function operatingItem() {
- if (!vm.detailsConfig.isDetailsEditMode) {
- if (vm.detailsConfig.editingItem) {
- vm.detailsConfig.editingItem = null;
- }
- return vm.detailsConfig.currentItem;
- } else {
- if (!vm.detailsConfig.editingItem) {
- vm.detailsConfig.editingItem = angular.copy(vm.detailsConfig.currentItem);
- }
- return vm.detailsConfig.editingItem;
- }
- }
-
- function saveItem(theForm) {
- vm.saveItemFunc(vm.detailsConfig.editingItem).then(function success(item) {
- theForm.$setPristine();
- vm.detailsConfig.isDetailsEditMode = false;
- var index = vm.detailsConfig.currentItem.index;
- item.index = index;
- vm.detailsConfig.currentItem = item;
- vm.items.data[index] = item;
- var row = Math.floor(index / vm.columns);
- var itemRow = vm.items.rowData[row];
- var column = index % vm.columns;
- itemRow[column] = item;
- });
- }
-
- function deleteItem($event, item) {
- if ($event) {
- $event.stopPropagation();
- }
- var confirm = $mdDialog.confirm()
- .targetEvent($event)
- .title(vm.deleteItemTitleFunc(item))
- .htmlContent(vm.deleteItemContentFunc(item))
- .ariaLabel($translate.instant('grid.delete-item'))
- .cancel($translate.instant('action.no'))
- .ok($translate.instant('action.yes'));
- $mdDialog.show(confirm).then(function () {
- vm.deleteItemFunc(item.id.id).then(function success() {
- refreshList();
- });
- },
- function () {
- });
-
- }
-
- function deleteItems($event) {
- var confirm = $mdDialog.confirm()
- .targetEvent($event)
- .title(vm.deleteItemsTitleFunc(vm.items.selectedCount))
- .htmlContent(vm.deleteItemsContentFunc())
- .ariaLabel($translate.instant('grid.delete-items'))
- .cancel($translate.instant('action.no'))
- .ok($translate.instant('action.yes'));
- $mdDialog.show(confirm).then(function () {
- var tasks = [];
- for (var id in vm.items.selections) {
- tasks.push(vm.deleteItemFunc(id));
- }
- $q.all(tasks).then(function () {
- refreshList();
- });
- },
- function () {
- });
- }
-
-
- function toggleItemSelection($event, item) {
- $event.stopPropagation();
- var selected = angular.isDefined(item.selected) && item.selected;
- item.selected = !selected;
- if (item.selected) {
- vm.items.selections[item.id.id] = true;
- vm.items.selectedCount++;
- } else {
- delete vm.items.selections[item.id.id];
- vm.items.selectedCount--;
- }
- }
-
- function triggerResize() {
- var w = angular.element($window);
- w.triggerHandler('resize');
- }
-
- function isTenantAdmin() {
- return userService.getAuthority() == 'TENANT_ADMIN';
- }
-
- function moveToTop() {
- moveToIndex(0, true);
- }
-
- function moveToIndex(index, animate) {
- var repeatContainer = $scope.repeatContainer[0];
- var scrollElement = repeatContainer.children[0];
- var startY = scrollElement.scrollTop;
- var stopY = index * vm.itemHeight;
- if (stopY > 0) {
- stopY+= 16;
- }
- var distance = Math.abs(startY - stopY);
- if (distance < 100 || !animate) {
- scrollElement.scrollTop = stopY;
- return;
- }
- var upElseDown = stopY < startY;
- var speed = Math.round(distance / 100);
- if (speed >= 20) speed = 20;
- var step = Math.round(distance / 25);
-
- var leapY = upElseDown ? startY - step : startY + step;
- var timer = 0;
- for (var i = startY; upElseDown ? (i > stopY) : (i < stopY); upElseDown ? (i -= step) : (i += step)) {
- $timeout(function (topY) {
- scrollElement.scrollTop = topY;
- }, timer * speed, true, leapY);
- if (upElseDown) {
- leapY -= step;
- if (leapY < stopY) {
- leapY = stopY;
- }
- } else {
- leapY += step;
- if (leapY > stopY) {
- leapY = stopY;
- }
- }
- timer++;
- }
-
- }
-
- function noData() {
- return vm.items.data.length == 0 && !vm.items.hasNext;
- }
-
- function hasData() {
- return vm.items.data.length > 0;
- }
-
-}
-
-/*@ngInject*/
-function AddItemController($scope, $mdDialog, saveItemFunction, helpLinks) {
-
- var vm = this;
-
- vm.helpLinks = helpLinks;
- vm.item = {};
-
- vm.add = add;
- vm.cancel = cancel;
-
- function cancel() {
- $mdDialog.cancel();
- }
-
- function add() {
- saveItemFunction(vm.item).then(function success(item) {
- vm.item = item;
- $scope.theForm.$setPristine();
- $mdDialog.hide();
- });
- }
-}
\ No newline at end of file
diff --git a/ui/src/app/components/grid.scss b/ui/src/app/components/grid.scss
deleted file mode 100644
index 8e254c40b2..0000000000
--- a/ui/src/app/components/grid.scss
+++ /dev/null
@@ -1,58 +0,0 @@
-/**
- * Copyright © 2016-2020 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 "~compass-sass-mixins/lib/animate";
-
-.tb-uppercase {
- text-transform: uppercase;
-}
-
-.tb-card-item {
- transition: all .2s ease-in-out;
-
- md-card-content {
- max-height: 53px;
- padding-top: 0;
- }
-
- md-card-title {
- width: 100%;
-
- md-card-title-text {
- min-width: 50%;
- max-height: 32px;
-
- .md-headline {
- overflow: hidden;
- text-overflow: ellipsis;
- white-space: nowrap;
- }
- }
- }
-}
-
-.tb-current-item {
- opacity: .5;
-
- transform: scale(1.05);
-}
-
-#tb-vertical-container {
- position: absolute;
- top: 0;
- right: 0;
- bottom: 0;
- left: 0;
-}
diff --git a/ui/src/app/components/grid.tpl.html b/ui/src/app/components/grid.tpl.html
deleted file mode 100644
index 900f5b86b5..0000000000
--- a/ui/src/app/components/grid.tpl.html
+++ /dev/null
@@ -1,122 +0,0 @@
-
-{{vm.noItemsText()}}
-
-
-
-
-
-
-
-
-
-
-
- {{vm.getItemTitleFunc(rowItem[n])}}
-
-
-
-
-
-
-
-
-
- {{ action.details( rowItem[n] ) }}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/ui/src/app/components/js-func.directive.js b/ui/src/app/components/js-func.directive.js
deleted file mode 100644
index 2d8dcd83bf..0000000000
--- a/ui/src/app/components/js-func.directive.js
+++ /dev/null
@@ -1,253 +0,0 @@
-/*
- * Copyright © 2016-2020 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 './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';
-import thingsboardExpandFullscreen from './expand-fullscreen.directive';
-
-import fixAceEditor from './ace-editor-fix';
-
-/* eslint-disable import/no-unresolved, import/default */
-
-import jsFuncTemplate from './js-func.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-import beautify from 'js-beautify';
-
-const js_beautify = beautify.js;
-
-/* eslint-disable angular/angularelement */
-
-export default angular.module('thingsboard.directives.jsFunc', [thingsboardToast, thingsboardUtils, thingsboardExpandFullscreen])
- .directive('tbJsFunc', JsFunc)
- .name;
-
-/*@ngInject*/
-function JsFunc($compile, $templateCache, toast, utils, $translate) {
-
- var linker = function (scope, element, attrs, ngModelCtrl) {
- var template = $templateCache.get(jsFuncTemplate);
- element.html(template);
-
- scope.functionName = attrs.functionName;
- scope.functionArgs = scope.$eval(attrs.functionArgs);
- scope.validationArgs = scope.$eval(attrs.validationArgs);
- scope.resultType = attrs.resultType;
- if (!scope.resultType || scope.resultType.length === 0) {
- scope.resultType = "nocheck";
- }
-
- scope.validationTriggerArg = attrs.validationTriggerArg;
-
- scope.functionValid = true;
-
- var Range = ace.acequire("ace/range").Range;
- scope.js_editor;
- scope.errorMarkers = [];
-
-
- scope.functionArgsString = '';
- for (var i = 0; i < scope.functionArgs.length; i++) {
- if (scope.functionArgsString.length > 0) {
- scope.functionArgsString += ', ';
- }
- scope.functionArgsString += scope.functionArgs[i];
- }
-
- scope.onFullscreenChanged = function () {
- updateEditorSize();
- };
-
- scope.beautifyJs = function () {
- var res = js_beautify(scope.functionBody, {indent_size: 4, wrap_line_length: 60});
- scope.functionBody = res;
- };
-
- function updateEditorSize() {
- if (scope.js_editor) {
- scope.js_editor.resize();
- scope.js_editor.renderer.updateFull();
- }
- }
-
- scope.jsEditorOptions = {
- useWrapMode: true,
- mode: 'javascript',
- advanced: {
- enableSnippets: true,
- enableBasicAutocompletion: true,
- enableLiveAutocompletion: true
- },
- onLoad: function (_ace) {
- scope.js_editor = _ace;
- scope.js_editor.session.on("change", function () {
- scope.cleanupJsErrors();
- });
- fixAceEditor(_ace);
- }
- };
-
- scope.cleanupJsErrors = function () {
- toast.hide();
- for (var i = 0; i < scope.errorMarkers.length; i++) {
- scope.js_editor.session.removeMarker(scope.errorMarkers[i]);
- }
- scope.errorMarkers = [];
- if (scope.errorAnnotationId && scope.errorAnnotationId > -1) {
- var annotations = scope.js_editor.session.getAnnotations();
- annotations.splice(scope.errorAnnotationId, 1);
- scope.js_editor.session.setAnnotations(annotations);
- scope.errorAnnotationId = -1;
- }
- }
-
- scope.updateValidity = function () {
- ngModelCtrl.$setValidity('functionBody', scope.functionValid);
- };
-
- scope.$watch('functionBody', function (newFunctionBody, oldFunctionBody) {
- ngModelCtrl.$setViewValue(scope.functionBody);
- if (!angular.equals(newFunctionBody, oldFunctionBody)) {
- scope.functionValid = true;
- }
- scope.updateValidity();
- });
-
- ngModelCtrl.$render = function () {
- scope.functionBody = ngModelCtrl.$viewValue;
- };
-
- scope.showError = function (error) {
- var toastParent = $('#tb-javascript-panel', element);
- var dialogContent = toastParent.closest('md-dialog-content');
- if (dialogContent.length > 0) {
- toastParent = dialogContent;
- }
- toast.showError(error, toastParent, 'bottom left');
- }
-
- scope.validate = function () {
- try {
- var toValidate = new Function(scope.functionArgsString, scope.functionBody);
- if (scope.noValidate) {
- return true;
- }
- var res;
- var validationError;
- for (var i=0;iLine ' + details.lineNumber;
- if (details.columnNumber) {
- errorInfo += ' column ' + details.columnNumber;
- }
- errorInfo += ' of script.';
- }
- scope.showError(errorInfo);
- if (scope.js_editor && details.lineNumber) {
- var line = details.lineNumber - 1;
- var column = 0;
- if (details.columnNumber) {
- column = details.columnNumber;
- }
-
- var errorMarkerId = scope.js_editor.session.addMarker(new Range(line, 0, line, Infinity), "ace_active-line", "screenLine");
- scope.errorMarkers.push(errorMarkerId);
- var annotations = scope.js_editor.session.getAnnotations();
- var errorAnnotation = {
- row: line,
- column: column,
- text: details.message,
- type: "error"
- };
- scope.errorAnnotationId = annotations.push(errorAnnotation) - 1;
- scope.js_editor.session.setAnnotations(annotations);
- }
- return false;
- }
- };
-
- scope.$on('form-submit', function (event, args) {
- if (!args || scope.validationTriggerArg && scope.validationTriggerArg == args) {
- scope.validationArgs = scope.$eval(attrs.validationArgs);
- scope.cleanupJsErrors();
- scope.functionValid = true;
- scope.updateValidity();
- scope.functionValid = scope.validate();
- scope.updateValidity();
- }
- });
-
- scope.$on('update-ace-editor-size', function () {
- updateEditorSize();
- });
-
- $compile(element.contents())(scope);
- }
-
- return {
- restrict: "E",
- require: "^ngModel",
- scope: {
- disabled:'=ngDisabled',
- noValidate: '=?',
- fillHeight:'=?'
- },
- link: linker
- };
-}
-
-/* eslint-enable angular/angularelement */
diff --git a/ui/src/app/components/js-func.scss b/ui/src/app/components/js-func.scss
deleted file mode 100644
index b2e71b2635..0000000000
--- a/ui/src/app/components/js-func.scss
+++ /dev/null
@@ -1,55 +0,0 @@
-/**
- * Copyright © 2016-2020 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-js-func {
- position: relative;
-
- .tb-disabled {
- color: rgba(0, 0, 0, .38);
- }
-
- .fill-height {
- height: 100%;
- }
-}
-
-.tb-js-func-toolbar {
- .md-button.tidy {
- min-width: 32px;
- min-height: 15px;
- padding: 4px;
- margin: 0 5px 0 0;
- font-size: .8rem;
- line-height: 15px;
- color: #7b7b7b;
- background: rgba(220, 220, 220, .35);
- }
-}
-
-.tb-js-func-panel {
- height: calc(100% - 80px);
- margin-left: 15px;
- border: 1px solid #c0c0c0;
-
- #tb-javascript-input {
- width: 100%;
- min-width: 200px;
- height: 100%;
-
- &:not(.fill-height) {
- min-height: 200px;
- }
- }
-}
diff --git a/ui/src/app/components/js-func.tpl.html b/ui/src/app/components/js-func.tpl.html
deleted file mode 100644
index 31ae446234..0000000000
--- a/ui/src/app/components/js-func.tpl.html
+++ /dev/null
@@ -1,37 +0,0 @@
-
-
diff --git a/ui/src/app/components/json-content.directive.js b/ui/src/app/components/json-content.directive.js
deleted file mode 100644
index c4281b15c2..0000000000
--- a/ui/src/app/components/json-content.directive.js
+++ /dev/null
@@ -1,191 +0,0 @@
-/*
- * Copyright © 2016-2020 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 './json-content.scss';
-
-import 'brace/ext/language_tools';
-import 'brace/ext/searchbox';
-import 'brace/mode/json';
-import 'brace/mode/text';
-import 'brace/snippets/json';
-import 'brace/snippets/text';
-
-import fixAceEditor from './ace-editor-fix';
-
-/* eslint-disable import/no-unresolved, import/default */
-
-import jsonContentTemplate from './json-content.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-import beautify from 'js-beautify';
-
-const js_beautify = beautify.js;
-
-export default angular.module('thingsboard.directives.jsonContent', [])
- .directive('tbJsonContent', JsonContent)
- .name;
-
-/*@ngInject*/
-function JsonContent($compile, $templateCache, toast, types, utils) {
-
- var linker = function (scope, element, attrs, ngModelCtrl) {
- var template = $templateCache.get(jsonContentTemplate);
- element.html(template);
-
- scope.label = attrs.label;
-
- scope.validationTriggerArg = attrs.validationTriggerArg;
-
- scope.contentValid = true;
-
- scope.json_editor;
-
- scope.onFullscreenChanged = function () {
- updateEditorSize();
- };
-
- scope.beautifyJSON = function () {
- scope.contentBody = js_beautify(scope.contentBody, {indent_size: 4, wrap_line_length: 60});
- };
-
- scope.minifyJSON = function () {
- scope.contentBody = angular.toJson(angular.fromJson(scope.contentBody));
- };
-
- function updateEditorSize() {
- if (scope.json_editor) {
- scope.json_editor.resize();
- scope.json_editor.renderer.updateFull();
- }
- }
-
- var mode;
- if (scope.contentType) {
- mode = types.contentType[scope.contentType].code;
- } else {
- mode = 'text';
- }
-
- scope.jsonEditorOptions = {
- useWrapMode: true,
- mode: mode,
- advanced: {
- enableSnippets: true,
- enableBasicAutocompletion: true,
- enableLiveAutocompletion: true
- },
- onLoad: function (_ace) {
- scope.json_editor = _ace;
- scope.json_editor.session.on("change", function () {
- scope.cleanupJsonErrors();
- });
- fixAceEditor(_ace);
- }
- };
-
- scope.$watch('contentType', () => {
- var mode;
- if (scope.contentType) {
- mode = types.contentType[scope.contentType].code;
- } else {
- mode = 'text';
- }
- if (scope.json_editor) {
- scope.json_editor.session.setMode('ace/mode/' + mode);
- }
- });
-
- scope.cleanupJsonErrors = function () {
- toast.hide();
- };
-
- scope.updateValidity = function () {
- ngModelCtrl.$setValidity('contentBody', scope.contentValid);
- };
-
- scope.$watch('contentBody', function (newContent, oldContent) {
- ngModelCtrl.$setViewValue(scope.contentBody);
- if (!angular.equals(newContent, oldContent)) {
- scope.contentValid = scope.validate();
- }
- scope.updateValidity();
- });
-
- ngModelCtrl.$render = function () {
- scope.contentBody = ngModelCtrl.$viewValue;
- };
-
- scope.showError = function (error) {
- var toastParent = angular.element('#tb-json-panel', element);
- toast.showError(error, toastParent, 'bottom left');
- };
-
- scope.validate = function () {
- try {
- if (scope.validateContent) {
- if (scope.contentType == types.contentType.JSON.value) {
- angular.fromJson(scope.contentBody);
- }
- }
- return true;
- } catch (e) {
- if (!scope.hideErrorToast) {
- var details = utils.parseException(e);
- var errorInfo = 'Error:';
- if (details.name) {
- errorInfo += ' ' + details.name + ':';
- }
- if (details.message) {
- errorInfo += ' ' + details.message;
- }
- scope.showError(errorInfo);
- }
- return false;
- }
- };
-
- scope.$on('form-submit', function (event, args) {
- if (!scope.readonly) {
- if (!args || scope.validationTriggerArg && scope.validationTriggerArg == args) {
- scope.cleanupJsonErrors();
- scope.contentValid = true;
- scope.updateValidity();
- scope.contentValid = scope.validate();
- scope.updateValidity();
- }
- }
- });
-
- scope.$on('update-ace-editor-size', function () {
- updateEditorSize();
- });
-
- $compile(element.contents())(scope);
- };
-
- return {
- restrict: "E",
- require: "^ngModel",
- scope: {
- contentType: '=',
- validateContent: '=?',
- hideErrorToast: '=?',
- readonly:'=ngReadonly',
- fillHeight:'=?'
- },
- link: linker
- };
-}
diff --git a/ui/src/app/components/json-content.scss b/ui/src/app/components/json-content.scss
deleted file mode 100644
index d444f8051f..0000000000
--- a/ui/src/app/components/json-content.scss
+++ /dev/null
@@ -1,51 +0,0 @@
-/**
- * Copyright © 2016-2020 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-json-content {
- position: relative;
-
- .fill-height {
- height: 100%;
- }
-}
-
-.tb-json-content-toolbar {
- .md-button.tidy {
- min-width: 32px;
- min-height: 15px;
- padding: 4px;
- margin: 0 5px 0 0;
- font-size: 12px;
- line-height: 15px;
- color: #7b7b7b;
- background: rgba(220, 220, 220, .35);
- }
-}
-
-.tb-json-content-panel {
- height: 100%;
- margin-left: 15px;
- border: 1px solid #c0c0c0;
-
- #tb-json-input {
- width: 100%;
- min-width: 200px;
- height: 100%;
-
- &:not(.fill-height) {
- min-height: 200px;
- }
- }
-}
diff --git a/ui/src/app/components/json-content.tpl.html b/ui/src/app/components/json-content.tpl.html
deleted file mode 100644
index 2b7670942d..0000000000
--- a/ui/src/app/components/json-content.tpl.html
+++ /dev/null
@@ -1,38 +0,0 @@
-
-
-
-
-
- {{
- 'js-func.tidy' | translate }}
-
- {{
- 'js-func.mini' | translate }}
-
-
-
-
-
diff --git a/ui/src/app/components/json-form.directive.js b/ui/src/app/components/json-form.directive.js
deleted file mode 100644
index 9b3d05d850..0000000000
--- a/ui/src/app/components/json-form.directive.js
+++ /dev/null
@@ -1,286 +0,0 @@
-/*
- * Copyright © 2016-2020 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 './json-form.scss';
-
-import tinycolor from 'tinycolor2';
-import ObjectPath from 'objectpath';
-import inspector from 'schema-inspector';
-import ReactSchemaForm from './react/json-form-react.jsx';
-import jsonFormTemplate from './json-form.tpl.html';
-import { utils } from 'react-schema-form';
-
-import MaterialIconsDialogController from './material-icons-dialog.controller';
-import materialIconsDialogTemplate from './material-icons-dialog.tpl.html';
-
-export default angular.module('thingsboard.directives.jsonForm', [])
- .directive('tbJsonForm', JsonForm)
- .controller('MaterialIconsDialogController', MaterialIconsDialogController)
- .value('ReactSchemaForm', ReactSchemaForm)
- .name;
-
-/*@ngInject*/
-function JsonForm($compile, $templateCache, $mdColorPicker, $mdDialog, $document) {
-
- var linker = function (scope, element) {
-
- var template = $templateCache.get(jsonFormTemplate);
-
- element.html(template);
-
- var childScope;
-
- var destroyModelChangeWatches = function() {
- if (scope.modelWatchHandle) {
- scope.modelWatchHandle();
- }
- if (scope.modelRefWatchHandle) {
- scope.modelRefWatchHandle();
- }
- }
-
- var initModelChangeWatches = function() {
- scope.modelWatchHandle = scope.$watch('model',function(newValue, prevValue) {
- if (newValue && prevValue && !angular.equals(newValue,prevValue)) {
- scope.validate();
- if (scope.formControl) {
- scope.formControl.$setDirty();
- }
- }
- }, true);
- scope.modelRefWatchHandle = scope.$watch('model',function(newValue, prevValue) {
- if (newValue && newValue != prevValue) {
- scope.updateValues();
- }
- });
- };
-
- var recompile = function() {
- if (childScope) {
- childScope.$destroy();
- }
- childScope = scope.$new();
- $compile(element.contents())(childScope);
- }
-
- scope.isFullscreen = false;
-
- scope.formProps = {
- isFullscreen: false,
- option: {
- formDefaults: {
- startEmpty: true
- }
- },
- onModelChange: function(key, val) {
- if (angular.isString(val) && val === '') {
- val = undefined;
- }
- selectOrSet(key, scope.model, val);
- scope.formProps.model = scope.model;
- },
- onColorClick: function(event, key, val) {
- scope.showColorPicker(event, val);
- },
- onIconClick: function(event) {
- scope.openIconDialog(event);
- },
- onToggleFullscreen: function() {
- scope.isFullscreen = !scope.isFullscreen;
- scope.formProps.isFullscreen = scope.isFullscreen;
- }
- };
-
- scope.showColorPicker = function (event, color) {
- $mdColorPicker.show({
- value: tinycolor(color).toRgbString(),
- defaultValue: '#fff',
- random: tinycolor.random(),
- clickOutsideToClose: false,
- hasBackdrop: false,
- multiple: true,
- preserveScope: false,
-
- mdColorAlphaChannel: true,
- mdColorSpectrum: true,
- mdColorSliders: true,
- mdColorGenericPalette: false,
- mdColorMaterialPalette: true,
- mdColorHistory: false,
- mdColorDefaultTab: 2,
-
- $event: event
-
- }).then(function (color) {
- if (event.data && event.data.onValueChanged) {
- event.data.onValueChanged(tinycolor(color).toRgb());
- }
- });
- }
-
- scope.openIconDialog = function(event) {
- $mdDialog.show({
- controller: 'MaterialIconsDialogController',
- controllerAs: 'vm',
- templateUrl: materialIconsDialogTemplate,
- parent: angular.element($document[0].body),
- locals: {icon: scope.icon},
- multiple: true,
- fullscreen: true,
- targetEvent: event
- }).then(function (icon) {
- if (event.data && event.data.onValueChanged) {
- event.data.onValueChanged(icon);
- }
- });
- }
-
- scope.onFullscreenChanged = function() {}
-
- scope.validate = function(){
- if (scope.schema && scope.model) {
- var result = utils.validateBySchema(scope.schema, scope.model);
- if (scope.formControl) {
- scope.formControl.$setValidity('jsonForm', result.valid);
- }
- }
- }
-
- scope.updateValues = function(skipRerender) {
- destroyModelChangeWatches();
- if (!skipRerender) {
- element.html(template);
- }
- var readonly = (scope.readonly && scope.readonly === true) ? true : false;
- var schema = scope.schema ? angular.copy(scope.schema) : {
- type: 'object'
- };
- schema.strict = true;
- var form = scope.form ? angular.copy(scope.form) : [ "*" ];
- var groupInfoes = scope.groupInfoes ? angular.copy(scope.groupInfoes) : [];
- var model = scope.model || {};
- scope.model = inspector.sanitize(schema, model).data;
- scope.formProps.option.formDefaults.readonly = readonly;
- scope.formProps.schema = schema;
- scope.formProps.form = form;
- scope.formProps.groupInfoes = groupInfoes;
- scope.formProps.model = angular.copy(scope.model);
- if (!skipRerender) {
- recompile();
- }
- initModelChangeWatches();
- }
-
- scope.updateValues(true);
-
- scope.$watch('readonly',function() {
- scope.updateValues();
- });
-
- scope.$watch('schema',function(newValue, prevValue) {
- if (newValue && newValue != prevValue) {
- scope.updateValues();
- scope.validate();
- }
- });
-
- scope.$watch('form',function(newValue, prevValue) {
- if (newValue && newValue != prevValue) {
- scope.updateValues();
- }
- });
-
- scope.$watch('groupInfoes',function(newValue, prevValue) {
- if (newValue && newValue != prevValue) {
- scope.updateValues();
- }
- });
-
- scope.validate();
-
- recompile();
-
- }
-
- return {
- restrict: "E",
- scope: {
- schema: '=',
- form: '=',
- model: '=',
- formControl: '=',
- groupInfoes: '=',
- readonly: '='
- },
- link: linker
- };
-
-}
-
-function setValue(obj, key, val) {
- var changed = false;
- if (obj) {
- if (angular.isUndefined(val)) {
- if (angular.isDefined(obj[key])) {
- delete obj[key];
- changed = true;
- }
- } else {
- changed = !angular.equals(obj[key], val);
- obj[key] = val;
- }
- }
- return changed;
-}
-
-function selectOrSet(projection, obj, valueToSet) {
- var numRe = /^\d+$/;
-
- if (!obj) {
- obj = this;
- }
-
- if (!obj) {
- return false;
- }
-
- var parts = angular.isString(projection) ? ObjectPath.parse(projection) : projection;
-
- if (parts.length === 1) {
- return setValue(obj, parts[0], valueToSet);
- }
-
- if (angular.isUndefined(obj[parts[0]])) {
- obj[parts[0]] = parts.length > 2 && numRe.test(parts[1]) ? [] : {};
- }
-
- var value = obj[parts[0]];
- for (var i = 1; i < parts.length; i++) {
- if (parts[i] === '') {
- return false;
- }
- if (i === parts.length - 1) {
- return setValue(value, parts[i], valueToSet);
- } else {
- var tmp = value[parts[i]];
- if (angular.isUndefined(tmp) || tmp === null) {
- tmp = numRe.test(parts[i + 1]) ? [] : {};
- value[parts[i]] = tmp;
- }
- value = tmp;
- }
- }
- return value;
-}
diff --git a/ui/src/app/components/json-form.scss b/ui/src/app/components/json-form.scss
deleted file mode 100644
index 27e31bcfef..0000000000
--- a/ui/src/app/components/json-form.scss
+++ /dev/null
@@ -1,19 +0,0 @@
-/**
- * Copyright © 2016-2020 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-json-form {
- padding-bottom: 14px !important;
- overflow: auto;
-}
diff --git a/ui/src/app/components/json-form.tpl.html b/ui/src/app/components/json-form.tpl.html
deleted file mode 100644
index 7586c00974..0000000000
--- a/ui/src/app/components/json-form.tpl.html
+++ /dev/null
@@ -1,20 +0,0 @@
-
-
-
-
diff --git a/ui/src/app/components/json-object-edit.directive.js b/ui/src/app/components/json-object-edit.directive.js
deleted file mode 100644
index 538b1cfc41..0000000000
--- a/ui/src/app/components/json-object-edit.directive.js
+++ /dev/null
@@ -1,192 +0,0 @@
-/*
- * Copyright © 2016-2020 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 './json-object-edit.scss';
-
-import 'brace/ext/language_tools';
-import 'brace/ext/searchbox';
-import 'brace/mode/json';
-import 'brace/snippets/json';
-
-import fixAceEditor from './ace-editor-fix';
-
-/* eslint-disable import/no-unresolved, import/default */
-
-import jsonObjectEditTemplate from './json-object-edit.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-export default angular.module('thingsboard.directives.jsonObjectEdit', [])
- .directive('tbJsonObjectEdit', JsonObjectEdit)
- .name;
-
-/*@ngInject*/
-function JsonObjectEdit($compile, $templateCache, $document, toast, utils) {
-
- var linker = function (scope, element, attrs, ngModelCtrl) {
- var template = $templateCache.get(jsonObjectEditTemplate);
- element.html(template);
-
- scope.label = attrs.label;
-
- scope.objectValid = true;
- scope.validationError = '';
-
- scope.json_editor;
-
- scope.onFullscreenChanged = function () {
- updateEditorSize();
- };
-
- scope.beautifyJSON = function () {
- scope.contentBody = angular.toJson(scope.object, 4);
- };
-
- scope.minifyJSON = function () {
- scope.contentBody = angular.toJson(scope.object);
- };
-
- function updateEditorSize() {
- if (scope.json_editor) {
- scope.json_editor.resize();
- scope.json_editor.renderer.updateFull();
- }
- }
-
- scope.jsonEditorOptions = {
- useWrapMode: true,
- mode: 'json',
- advanced: {
- enableSnippets: true,
- enableBasicAutocompletion: true,
- enableLiveAutocompletion: true
- },
- onLoad: function (_ace) {
- scope.json_editor = _ace;
- scope.json_editor.session.on("change", function () {
- scope.cleanupJsonErrors();
- });
- fixAceEditor(_ace);
- }
- };
-
- scope.cleanupJsonErrors = function () {
- toast.hide();
- };
-
- scope.updateValidity = function () {
- ngModelCtrl.$setValidity('objectValid', scope.objectValid);
- };
-
- scope.$watch('contentBody', function (newVal, prevVal) {
- if (!angular.equals(newVal, prevVal)) {
- var object = scope.validate();
- if (scope.objectValid) {
- if (object == null) {
- scope.object = null;
- } else {
- if (scope.object == null) {
- scope.object = {};
- }
- Object.keys(scope.object).forEach(function (key) {
- delete scope.object[key];
- });
- Object.keys(object).forEach(function (key) {
- scope.object[key] = object[key];
- });
- }
- ngModelCtrl.$setViewValue(scope.object);
- }
- scope.updateValidity();
- }
- });
-
- ngModelCtrl.$render = function () {
- scope.object = ngModelCtrl.$viewValue;
- var content = '';
- try {
- if (scope.object) {
- content = angular.toJson(scope.object, true);
- }
- } catch (e) {
- //
- }
- scope.contentBody = content;
- };
-
- scope.showError = function (error) {
- var toastParent = angular.element('#tb-json-panel', element);
- toast.showError(error, toastParent, 'bottom left');
- };
-
- scope.validate = function () {
- if (!scope.contentBody || !scope.contentBody.length) {
- if (scope.required) {
- scope.validationError = 'Json object is required.';
- scope.objectValid = false;
- } else {
- scope.validationError = '';
- scope.objectValid = true;
- }
- return null;
- } else {
- try {
- var object = angular.fromJson(scope.contentBody);
- scope.validationError = '';
- scope.objectValid = true;
- return object;
- } catch (e) {
- var details = utils.parseException(e);
- var errorInfo = 'Error:';
- if (details.name) {
- errorInfo += ' ' + details.name + ':';
- }
- if (details.message) {
- errorInfo += ' ' + details.message;
- }
- scope.validationError = errorInfo;
- scope.objectValid = false;
- return null;
- }
- }
- };
-
- scope.$on('form-submit', function () {
- if (!scope.readonly) {
- scope.cleanupJsonErrors();
- if (!scope.objectValid) {
- scope.showError(scope.validationError);
- }
- }
- });
-
- scope.$on('update-ace-editor-size', function () {
- updateEditorSize();
- });
-
- $compile(element.contents())(scope);
- };
-
- return {
- restrict: "E",
- require: "^ngModel",
- scope: {
- required:'=ngRequired',
- readonly:'=ngReadonly',
- fillHeight:'=?'
- },
- link: linker
- };
-}
diff --git a/ui/src/app/components/json-object-edit.scss b/ui/src/app/components/json-object-edit.scss
deleted file mode 100644
index 9c9cdc7e44..0000000000
--- a/ui/src/app/components/json-object-edit.scss
+++ /dev/null
@@ -1,51 +0,0 @@
-/**
- * Copyright © 2016-2020 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-json-object-edit {
- position: relative;
-
- .fill-height {
- height: 100%;
- }
-}
-
-.tb-json-object-edit-toolbar {
- .md-button.tidy {
- min-width: 32px;
- min-height: 15px;
- padding: 4px;
- margin: 0 5px 0 0;
- font-size: 12px;
- line-height: 15px;
- color: #7b7b7b;
- background: rgba(220, 220, 220, .35);
- }
-}
-
-.tb-json-object-panel {
- height: 100%;
- margin-left: 15px;
- border: 1px solid #c0c0c0;
-
- #tb-json-input {
- width: 100%;
- min-width: 200px;
- height: 100%;
-
- &:not(.fill-height) {
- min-height: 200px;
- }
- }
-}
diff --git a/ui/src/app/components/json-object-edit.tpl.html b/ui/src/app/components/json-object-edit.tpl.html
deleted file mode 100644
index 86f2a55650..0000000000
--- a/ui/src/app/components/json-object-edit.tpl.html
+++ /dev/null
@@ -1,40 +0,0 @@
-
-
-
-
-
-
- {{'js-func.tidy' | translate }}
-
-
- {{'js-func.mini' | translate }}
-
-
-
-
-
diff --git a/ui/src/app/components/keyboard-shortcut.filter.js b/ui/src/app/components/keyboard-shortcut.filter.js
deleted file mode 100644
index 27fb27e3a5..0000000000
--- a/ui/src/app/components/keyboard-shortcut.filter.js
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-export default angular.module('thingsboard.filters.keyboardShortcut', [])
- .filter('keyboardShortcut', KeyboardShortcut)
- .name;
-
-/*@ngInject*/
-function KeyboardShortcut($window) {
- return function(str) {
- if (!str) return;
- var keys = str.split('-');
- var isOSX = /Mac OS X/.test($window.navigator.userAgent);
-
- var seperator = (!isOSX || keys.length > 2) ? '+' : '';
-
- var abbreviations = {
- M: isOSX ? '⌘' : 'Ctrl',
- A: isOSX ? 'Option' : 'Alt',
- S: 'Shift'
- };
-
- return keys.map(function(key, index) {
- var last = index == keys.length - 1;
- return last ? key : abbreviations[key];
- }).join(seperator);
- };
-}
diff --git a/ui/src/app/components/kv-map.directive.js b/ui/src/app/components/kv-map.directive.js
deleted file mode 100644
index fb93375e23..0000000000
--- a/ui/src/app/components/kv-map.directive.js
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
- * Copyright © 2016-2020 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 './kv-map.scss';
-
-/* eslint-disable import/no-unresolved, import/default */
-
-import kvMapTemplate from './kv-map.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-export default angular.module('thingsboard.directives.keyValMap', [])
- .directive('tbKeyValMap', KeyValMap)
- .name;
-
-/*@ngInject*/
-function KeyValMap() {
- return {
- restrict: "E",
- scope: true,
- bindToController: {
- disabled:'=ngDisabled',
- titleText: '@?',
- keyPlaceholderText: '@?',
- valuePlaceholderText: '@?',
- noDataText: '@?',
- keyValMap: '='
- },
- controller: KeyValMapController,
- controllerAs: 'vm',
- templateUrl: kvMapTemplate
- };
-}
-
-/*@ngInject*/
-function KeyValMapController($scope, $mdUtil) {
-
- let vm = this;
-
- vm.kvList = [];
-
- vm.removeKeyVal = removeKeyVal;
- vm.addKeyVal = addKeyVal;
-
- $scope.$watch('vm.keyValMap', () => {
- stopWatchKvList();
- vm.kvList.length = 0;
- if (vm.keyValMap) {
- for (var property in vm.keyValMap) {
- if (Object.prototype.hasOwnProperty.call(vm.keyValMap, property)) {
- vm.kvList.push(
- {
- key: property + '',
- value: vm.keyValMap[property]
- }
- );
- }
- }
- }
- $mdUtil.nextTick(() => {
- watchKvList();
- });
- });
-
- function watchKvList() {
- $scope.kvListWatcher = $scope.$watch('vm.kvList', () => {
- if (!vm.keyValMap) {
- return;
- }
- for (var property in vm.keyValMap) {
- if (Object.prototype.hasOwnProperty.call(vm.keyValMap, property)) {
- delete vm.keyValMap[property];
- }
- }
- for (var i=0;i -1) {
- vm.kvList.splice(index, 1);
- }
- }
-
- function addKeyVal() {
- if (!vm.kvList) {
- vm.kvList = [];
- }
- vm.kvList.push(
- {
- key: '',
- value: ''
- }
- );
- }
-}
diff --git a/ui/src/app/components/kv-map.scss b/ui/src/app/components/kv-map.scss
deleted file mode 100644
index 3e7aa2cde0..0000000000
--- a/ui/src/app/components/kv-map.scss
+++ /dev/null
@@ -1,27 +0,0 @@
-/**
- * Copyright © 2016-2020 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-kv-map {
- span.no-data-found {
- position: relative;
- display: flex;
- height: 40px;
- text-transform: uppercase;
-
- &.disabled {
- color: rgba(0, 0, 0, .38);
- }
- }
-}
diff --git a/ui/src/app/components/kv-map.tpl.html b/ui/src/app/components/kv-map.tpl.html
deleted file mode 100644
index 063f0746a8..0000000000
--- a/ui/src/app/components/kv-map.tpl.html
+++ /dev/null
@@ -1,58 +0,0 @@
-
-
diff --git a/ui/src/app/components/led-light.directive.js b/ui/src/app/components/led-light.directive.js
deleted file mode 100644
index 175a5054d8..0000000000
--- a/ui/src/app/components/led-light.directive.js
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- * Copyright © 2016-2020 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 Raphael from 'raphael';
-import tinycolor from 'tinycolor2';
-import $ from 'jquery';
-
-/* eslint-disable angular/angularelement */
-
-export default angular.module('thingsboard.directives.ledLight', [])
- .directive('tbLedLight', LedLight).name;
-
-/*@ngInject*/
-function LedLight($compile) {
-
- var linker = function (scope, element) {
- scope.offOpacity = scope.offOpacity || "0.4";
- scope.glowColor = tinycolor(scope.colorOn).lighten().toHexString();
-
- scope.$watch('tbEnabled',function() {
- scope.draw();
- });
-
- scope.$watch('size',function() {
- scope.update();
- });
-
- scope.draw = function () {
- if (scope.tbEnabled) {
- scope.circleElement.attr("fill", scope.colorOn);
- scope.circleElement.attr("stroke", scope.colorOn);
- scope.circleElement.attr("opacity", "1");
-
- if (scope.circleElement.theGlow) {
- scope.circleElement.theGlow.remove();
- }
-
- scope.circleElement.theGlow = scope.circleElement.glow(
- {
- color: scope.glowColor,
- width: scope.radius + scope.glowSize,
- opacity: 0.8,
- fill: true
- });
- } else {
- if (scope.circleElement.theGlow) {
- scope.circleElement.theGlow.remove();
- }
-
- /*scope.circleElement.theGlow = scope.circleElement.glow(
- {
- color: scope.glowColor,
- width: scope.radius + scope.glowSize,
- opacity: 0.4,
- fill: true
- });*/
-
- scope.circleElement.attr("fill", scope.colorOff);
- scope.circleElement.attr("stroke", scope.colorOff);
- scope.circleElement.attr("opacity", scope.offOpacity);
- }
- }
-
- scope.update = function() {
- scope.size = scope.size || 50;
- scope.canvasSize = scope.size;
- scope.radius = scope.canvasSize / 4;
- scope.glowSize = scope.radius / 5;
-
- var template = '';
- element.html(template);
- $compile(element.contents())(scope);
- scope.paper = new Raphael($('#canvas_container', element)[0], scope.canvasSize, scope.canvasSize);
- var center = scope.canvasSize / 2;
- scope.circleElement = scope.paper.circle(center, center, scope.radius);
- scope.draw();
- }
-
- scope.update();
- }
-
-
- return {
- restrict: "E",
- link: linker,
- scope: {
- size: '=?',
- colorOn: '=',
- colorOff: '=',
- offOpacity: '=?',
- //glowColor: '=',
- tbEnabled: '='
- }
- };
-
-}
-
-/* eslint-enable angular/angularelement */
diff --git a/ui/src/app/components/legend-config-button.tpl.html b/ui/src/app/components/legend-config-button.tpl.html
deleted file mode 100644
index a1c4fc725b..0000000000
--- a/ui/src/app/components/legend-config-button.tpl.html
+++ /dev/null
@@ -1,21 +0,0 @@
-
-
-
- legend.settings
-
diff --git a/ui/src/app/components/legend-config-panel.controller.js b/ui/src/app/components/legend-config-panel.controller.js
deleted file mode 100644
index 359aab1764..0000000000
--- a/ui/src/app/components/legend-config-panel.controller.js
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-/*@ngInject*/
-export default function LegendConfigPanelController(mdPanelRef, $scope, types, legendConfig, onLegendConfigUpdate) {
-
- var vm = this;
- vm._mdPanelRef = mdPanelRef;
- vm.legendConfig = legendConfig;
- vm.onLegendConfigUpdate = onLegendConfigUpdate;
- vm.positions = types.position;
- vm.directions = types.direction;
- vm.isRowDirection = vm.legendConfig.direction === types.direction.row.value;
-
- vm._mdPanelRef.config.onOpenComplete = function () {
- $scope.theForm.$setPristine();
- };
-
- $scope.$watch('vm.legendConfig', function () {
- if (onLegendConfigUpdate) {
- onLegendConfigUpdate(vm.legendConfig);
- }
- }, true);
-}
diff --git a/ui/src/app/components/legend-config-panel.tpl.html b/ui/src/app/components/legend-config-panel.tpl.html
deleted file mode 100644
index 399423d53a..0000000000
--- a/ui/src/app/components/legend-config-panel.tpl.html
+++ /dev/null
@@ -1,56 +0,0 @@
-
-
\ No newline at end of file
diff --git a/ui/src/app/components/legend-config.directive.js b/ui/src/app/components/legend-config.directive.js
deleted file mode 100644
index eaeb8c6cab..0000000000
--- a/ui/src/app/components/legend-config.directive.js
+++ /dev/null
@@ -1,153 +0,0 @@
-/*
- * Copyright © 2016-2020 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 './legend-config.scss';
-
-import $ from 'jquery';
-
-/* eslint-disable import/no-unresolved, import/default */
-
-import legendConfigButtonTemplate from './legend-config-button.tpl.html';
-import legendConfigPanelTemplate from './legend-config-panel.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-import LegendConfigPanelController from './legend-config-panel.controller';
-
-
-export default angular.module('thingsboard.directives.legendConfig', [])
- .controller('LegendConfigPanelController', LegendConfigPanelController)
- .directive('tbLegendConfig', LegendConfig)
- .name;
-
-/* eslint-disable angular/angularelement */
-/*@ngInject*/
-function LegendConfig($compile, $templateCache, types, $mdPanel, $document) {
-
- var linker = function (scope, element, attrs, ngModelCtrl) {
-
- /* tbLegendConfig (ng-model)
- * {
- * position: types.position.bottom.value,
- * showMin: false,
- * showMax: false,
- * showAvg: true,
- * showTotal: false
- * }
- */
-
- var template = $templateCache.get(legendConfigButtonTemplate);
- element.html(template);
-
- scope.openEditMode = function (event) {
- if (scope.disabled) {
- return;
- }
- var position;
- var panelHeight = 220;
- var panelWidth = 220;
- var offset = element[0].getBoundingClientRect();
- var bottomY = offset.bottom - $(window).scrollTop(); //eslint-disable-line
- var leftX = offset.left - $(window).scrollLeft(); //eslint-disable-line
- var yPosition;
- var xPosition;
- if (bottomY + panelHeight > $( window ).height()) { //eslint-disable-line
- yPosition = $mdPanel.yPosition.ABOVE;
- } else {
- yPosition = $mdPanel.yPosition.BELOW;
- }
- if (leftX + panelWidth > $( window ).width()) { //eslint-disable-line
- xPosition = $mdPanel.xPosition.ALIGN_END;
- } else {
- xPosition = $mdPanel.xPosition.ALIGN_START;
- }
- position = $mdPanel.newPanelPosition()
- .relativeTo(element)
- .addPanelPosition(xPosition, yPosition);
- var config = {
- attachTo: angular.element($document[0].body),
- controller: 'LegendConfigPanelController',
- controllerAs: 'vm',
- templateUrl: legendConfigPanelTemplate,
- panelClass: 'tb-legend-config-panel',
- position: position,
- fullscreen: false,
- locals: {
- 'legendConfig': angular.copy(scope.model),
- 'onLegendConfigUpdate': function (legendConfig) {
- scope.model = legendConfig;
- scope.updateView();
- }
- },
- openFrom: event,
- clickOutsideToClose: true,
- escapeToClose: true,
- focusOnOpen: false
- };
- $mdPanel.open(config);
- }
-
- scope.updateView = function () {
- var value = {};
- var model = scope.model;
- value.direction = model.direction;
- value.position = model.position;
- value.showMin = model.showMin;
- value.showMax = model.showMax;
- value.showAvg = model.showAvg;
- value.showTotal = model.showTotal;
- ngModelCtrl.$setViewValue(value);
- }
-
- ngModelCtrl.$render = function () {
- if (ngModelCtrl.$viewValue) {
- var value = ngModelCtrl.$viewValue;
- if (!scope.model) {
- scope.model = {};
- }
- var model = scope.model;
- model.direction = value.direction || types.direction.column.value;
- model.position = value.position || types.position.bottom.value;
- model.showMin = angular.isDefined(value.showMin) ? value.showMin : false;
- model.showMax = angular.isDefined(value.showMax) ? value.showMax : false;
- model.showAvg = angular.isDefined(value.showAvg) ? value.showAvg : true;
- model.showTotal = angular.isDefined(value.showTotal) ? value.showTotal : false;
- } else {
- scope.model = {
- direction: types.direction.column.value,
- position: types.position.bottom.value,
- showMin: false,
- showMax: false,
- showAvg: true,
- showTotal: false
- }
- }
- }
-
- $compile(element.contents())(scope);
- }
-
- return {
- restrict: "E",
- require: "^ngModel",
- scope: {
- disabled:'=ngDisabled'
- },
- link: linker
- };
-
-}
-
-/* eslint-enable angular/angularelement */
\ No newline at end of file
diff --git a/ui/src/app/components/legend-config.scss b/ui/src/app/components/legend-config.scss
deleted file mode 100644
index 654d197544..0000000000
--- a/ui/src/app/components/legend-config.scss
+++ /dev/null
@@ -1,53 +0,0 @@
-/**
- * Copyright © 2016-2020 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.
- */
-.md-panel {
- &.tb-legend-config-panel {
- position: absolute;
- }
-}
-
-.tb-legend-config-panel {
- min-width: 220px;
- max-height: 300px;
- overflow: hidden;
- background: #fff;
- border-radius: 4px;
- box-shadow:
- 0 7px 8px -4px rgba(0, 0, 0, .2),
- 0 13px 19px 2px rgba(0, 0, 0, .14),
- 0 5px 24px 4px rgba(0, 0, 0, .12);
-
- form,
- fieldset {
- height: 100%;
- }
-
- md-content {
- overflow: hidden;
- background-color: #fff;
- }
-
- .md-padding {
- padding: 12px 16px 0;
- }
-}
-
-tb-legend-config {
- span {
- pointer-events: all;
- cursor: pointer;
- }
-}
diff --git a/ui/src/app/components/legend.directive.js b/ui/src/app/components/legend.directive.js
deleted file mode 100644
index 060a2f0277..0000000000
--- a/ui/src/app/components/legend.directive.js
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Copyright © 2016-2020 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 './legend.scss';
-
-/* eslint-disable import/no-unresolved, import/default */
-
-import legendTemplate from './legend.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-
-export default angular.module('thingsboard.directives.legend', [])
- .directive('tbLegend', Legend)
- .name;
-
-/*@ngInject*/
-function Legend($compile, $templateCache, types) {
-
- var linker = function (scope, element) {
- var template = $templateCache.get(legendTemplate);
- element.html(template);
-
- scope.displayHeader = function() {
- return scope.legendConfig.showMin === true ||
- scope.legendConfig.showMax === true ||
- scope.legendConfig.showAvg === true ||
- scope.legendConfig.showTotal === true;
- }
-
- scope.isHorizontal = scope.legendConfig.position === types.position.bottom.value ||
- scope.legendConfig.position === types.position.top.value;
-
- scope.isRowDirection = scope.legendConfig.direction === types.direction.row.value;
-
- scope.toggleHideData = function(index) {
- if (!scope.legendData.keys[index].dataKey.settings.disableDataHiding) {
- scope.legendData.keys[index].dataKey.hidden = !scope.legendData.keys[index].dataKey.hidden;
- }
- }
-
- $compile(element.contents())(scope);
-
- }
-
- /* scope.legendData = {
- keys: [],
- data: []
-
- key: {
- dataKey: dataKey,
- dataIndex: 0
- }
- data: {
- min: null,
- max: null,
- avg: null,
- total: null
- }
- };*/
-
- return {
- restrict: "E",
- link: linker,
- scope: {
- legendConfig: '=',
- legendData: '='
- }
- };
-}
diff --git a/ui/src/app/components/legend.scss b/ui/src/app/components/legend.scss
deleted file mode 100644
index 5a13c773e2..0000000000
--- a/ui/src/app/components/legend.scss
+++ /dev/null
@@ -1,84 +0,0 @@
-/**
- * Copyright © 2016-2020 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.
- */
-table.tb-legend {
- font-size: 12px;
-
- .tb-legend-header,
- .tb-legend-value {
- text-align: right;
- }
-
- .tb-legend-header {
- th {
- padding: 0 10px 1px 0;
- color: rgb(255, 110, 64);
- white-space: nowrap;
- }
- }
-
- .tb-legend-keys {
- td.tb-legend-label,
- td.tb-legend-value {
- padding: 2px 10px;
- white-space: nowrap;
- }
-
- .tb-legend-type {
- min-width: 50px;
- padding: 0 10px 1px 0;
- font-weight: 700;
- color: rgb(255, 110, 64);
- text-align: right;
- white-space: nowrap;
- }
-
- .tb-legend-line {
- display: inline-block;
- width: 15px;
- height: 3px;
- vertical-align: middle;
- }
-
- .tb-legend-label {
- padding: 2px 10px;
- text-align: left;
- white-space: nowrap;
- outline: none;
-
- &.tb-horizontal {
- width: 95%;
- }
-
- &.tb-hidden-label {
- text-decoration: line-through;
- opacity: .6;
- }
- }
-
- &.tb-row-direction {
- display: inline-block;
- }
- }
-}
-
-table.tb-legend-column {
- width: 100%;
-}
-
-table.tb-legend-row {
- width: auto;
- margin-left: auto;
-}
diff --git a/ui/src/app/components/legend.tpl.html b/ui/src/app/components/legend.tpl.html
deleted file mode 100644
index 3f9bc80d32..0000000000
--- a/ui/src/app/components/legend.tpl.html
+++ /dev/null
@@ -1,83 +0,0 @@
-
-
-
-
-
-
-
- |
-
- {{ legendKey.dataKey.label }}
- |
- {{ legendData.data[legendKey.dataIndex].min }} |
- {{ legendData.data[legendKey.dataIndex].max }} |
- {{ legendData.data[legendKey.dataIndex].avg }} |
- {{ legendData.data[legendKey.dataIndex].total }} |
-
-
- |
-
-
-
- {{ legendKey.dataKey.label }}
-
- |
-
-
- | {{ 'legend.min' | translate }} |
-
- {{ legendData.data[legendKey.dataIndex].min }}
- |
-
-
- | {{ 'legend.max' | translate }} |
-
- {{ legendData.data[legendKey.dataIndex].max }}
- |
-
-
- | {{ 'legend.avg' | translate }} |
-
- {{ legendData.data[legendKey.dataIndex].avg }}
- |
-
-
- | {{ 'legend.total' | translate }} |
-
- {{ legendData.data[legendKey.dataIndex].total }}
- |
-
-
-
diff --git a/ui/src/app/components/material-icon-select.directive.js b/ui/src/app/components/material-icon-select.directive.js
deleted file mode 100644
index d2cb787e32..0000000000
--- a/ui/src/app/components/material-icon-select.directive.js
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Copyright © 2016-2020 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 './material-icon-select.scss';
-
-import MaterialIconsDialogController from './material-icons-dialog.controller';
-
-/* eslint-disable import/no-unresolved, import/default */
-
-import materialIconSelectTemplate from './material-icon-select.tpl.html';
-import materialIconsDialogTemplate from './material-icons-dialog.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-
-export default angular.module('thingsboard.directives.materialIconSelect', [])
- .controller('MaterialIconsDialogController', MaterialIconsDialogController)
- .directive('tbMaterialIconSelect', MaterialIconSelect)
- .name;
-
-/*@ngInject*/
-function MaterialIconSelect($compile, $templateCache, $document, $mdDialog) {
-
- var linker = function (scope, element, attrs, ngModelCtrl) {
- var template = $templateCache.get(materialIconSelectTemplate);
- element.html(template);
-
- scope.tbRequired = angular.isDefined(scope.tbRequired) ? scope.tbRequired : false;
- scope.icon = null;
-
- scope.updateView = function () {
- ngModelCtrl.$setViewValue(scope.icon);
- }
-
- ngModelCtrl.$render = function () {
- if (ngModelCtrl.$viewValue) {
- scope.icon = ngModelCtrl.$viewValue;
- }
- if (!scope.icon || !scope.icon.length) {
- scope.icon = 'more_horiz';
- }
- }
-
- scope.$watch('icon', function () {
- scope.updateView();
- });
-
- scope.openIconDialog = function($event) {
- if ($event) {
- $event.stopPropagation();
- }
- $mdDialog.show({
- controller: 'MaterialIconsDialogController',
- controllerAs: 'vm',
- templateUrl: materialIconsDialogTemplate,
- parent: angular.element($document[0].body),
- locals: {icon: scope.icon},
- multiple: true,
- fullscreen: true,
- targetEvent: $event
- }).then(function (icon) {
- scope.icon = icon;
- });
- }
-
- $compile(element.contents())(scope);
- }
-
- return {
- restrict: "E",
- require: "^ngModel",
- link: linker,
- scope: {
- tbRequired: '=?',
- }
- };
-}
diff --git a/ui/src/app/components/material-icon-select.scss b/ui/src/app/components/material-icon-select.scss
deleted file mode 100644
index 102b7b5dc6..0000000000
--- a/ui/src/app/components/material-icon-select.scss
+++ /dev/null
@@ -1,27 +0,0 @@
-/**
- * Copyright © 2016-2020 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-material-icon-select {
- md-icon {
- padding: 4px;
- margin: 8px 4px 4px;
- cursor: pointer;
- border: solid 1px rgba(0, 0, 0, .27);
- }
-
- md-input-container {
- margin-bottom: 0;
- }
-}
diff --git a/ui/src/app/components/material-icon-select.tpl.html b/ui/src/app/components/material-icon-select.tpl.html
deleted file mode 100644
index ae3b111ccc..0000000000
--- a/ui/src/app/components/material-icon-select.tpl.html
+++ /dev/null
@@ -1,24 +0,0 @@
-
-
- {{icon}}
-
-
-
-
-
\ No newline at end of file
diff --git a/ui/src/app/components/material-icons-dialog.controller.js b/ui/src/app/components/material-icons-dialog.controller.js
deleted file mode 100644
index 211f23d08c..0000000000
--- a/ui/src/app/components/material-icons-dialog.controller.js
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Copyright © 2016-2020 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 './material-icons-dialog.scss';
-
-/*@ngInject*/
-export default function MaterialIconsDialogController($scope, $mdDialog, $timeout, utils, icon) {
-
- var vm = this;
-
- vm.selectedIcon = icon;
-
- vm.showAll = false;
- vm.loadingIcons = false;
-
- $scope.$watch('vm.showAll', function(showAll) {
- if (showAll) {
- vm.loadingIcons = true;
- $timeout(function() {
- utils.getMaterialIcons().then(
- function success(icons) {
- vm.icons = icons;
- }
- );
- });
- } else {
- vm.icons = utils.getCommonMaterialIcons();
- }
- });
-
- $scope.$on('iconsLoadFinished', function() {
- vm.loadingIcons = false;
- });
-
- vm.cancel = cancel;
- vm.selectIcon = selectIcon;
-
- function cancel() {
- $mdDialog.cancel();
- }
-
- function selectIcon($event, icon) {
- vm.selectedIcon = icon;
- $mdDialog.hide(vm.selectedIcon);
- }
-}
diff --git a/ui/src/app/components/material-icons-dialog.scss b/ui/src/app/components/material-icons-dialog.scss
deleted file mode 100644
index 2d94711ce6..0000000000
--- a/ui/src/app/components/material-icons-dialog.scss
+++ /dev/null
@@ -1,31 +0,0 @@
-/**
- * Copyright © 2016-2020 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-material-icons-dialog {
- button.md-icon-button.tb-select-icon-button {
- width: 56px;
- height: 56px;
- padding: 16px;
- margin: 10px;
- border: solid 1px #ffa500;
- border-radius: 0%;
- }
-
- .tb-icons-load {
- top: 64px;
- z-index: 3;
- background: rgba(255, 255, 255, .75);
- }
-}
diff --git a/ui/src/app/components/material-icons-dialog.tpl.html b/ui/src/app/components/material-icons-dialog.tpl.html
deleted file mode 100644
index e6a6050c42..0000000000
--- a/ui/src/app/components/material-icons-dialog.tpl.html
+++ /dev/null
@@ -1,62 +0,0 @@
-
-
-
-
diff --git a/ui/src/app/components/md-chip-draggable.directive.js b/ui/src/app/components/md-chip-draggable.directive.js
deleted file mode 100644
index ca98bc0871..0000000000
--- a/ui/src/app/components/md-chip-draggable.directive.js
+++ /dev/null
@@ -1,207 +0,0 @@
-/*
- * Copyright © 2016-2020 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 './md-chip-draggable.scss';
-
-var globalDraggingChipsWrapId = null;
-
-export default angular.module('thingsboard.directives.mdChipDraggable', [])
- .directive('tbChipDraggable', function () {
- return {
- restrict: 'A',
- scope: {},
- bindToController: true,
- controllerAs: 'vm',
- controller: ['$document', '$scope', '$element', '$timeout',
- function ($document, $scope, $element, $timeout) {
- var handle = $element[0];
- var draggingClassName = 'dragging';
- var droppingClassName = 'dropping';
- var droppingBeforeClassName = 'dropping-before';
- var droppingAfterClassName = 'dropping-after';
- var dragging = false;
- var preventDrag = false;
- var dropPosition;
- var dropTimeout;
- var counter = 0;
-
- var move = function (from, to) {
- this.splice(to, 0, this.splice(from, 1)[0]);
- };
-
- $element = angular.element($element[0].closest('md-chip'));
-
- $element.attr('draggable', true);
-
- $element.on('mousedown', function (event) {
- if (event.target !== handle) {
- preventDrag = true;
- }
- });
-
- $document.on('mouseup', function () {
- preventDrag = false;
- });
-
- $element.on('dragstart', function (event) {
- if (preventDrag) {
- event.preventDefault();
-
- } else {
- dragging = true;
-
- globalDraggingChipsWrapId = angular.element($element[0].closest('md-chips-wrap')).attr('id');
-
- $element.addClass(draggingClassName);
-
- var dataTransfer = event.dataTransfer || event.originalEvent.dataTransfer;
-
- dataTransfer.effectAllowed = 'copyMove';
- dataTransfer.dropEffect = 'move';
-
- dataTransfer.setData('text/plain', $scope.$parent.$mdChipsCtrl.items.indexOf($scope.$parent.$chip));
- }
- });
-
- $element.on('dragend', function () {
- dragging = false;
- globalDraggingChipsWrapId = null;
-
- $element.removeClass(draggingClassName);
- });
-
- var dragOverHandler = function (event) {
- if (dragging) {
- return;
- }
-
- var targetChipsWrapId = angular.element($element[0].closest('md-chips-wrap')).attr('id');
-
- event.preventDefault();
-
- if (globalDraggingChipsWrapId !== targetChipsWrapId) {
- return;
- }
-
- var bounds = $element[0].getBoundingClientRect();
-
- var props = {
- width: bounds.right - bounds.left,
- height: bounds.bottom - bounds.top,
- x: (event.originalEvent || event).clientX - bounds.left,
- y: (event.originalEvent || event).clientY - bounds.top,
- };
-
- var horizontalOffset = props.x;
- var horizontalMidPoint = props.width / 2;
-
- var verticalOffset = props.y;
- var verticalMidPoint = props.height / 2;
-
- $element.addClass(droppingClassName);
-
- $element.removeClass(droppingAfterClassName);
- $element.removeClass(droppingBeforeClassName);
-
- if (horizontalOffset >= horizontalMidPoint || verticalOffset >= verticalMidPoint) {
- dropPosition = 'after';
- $element.addClass(droppingAfterClassName);
- } else {
- dropPosition = 'before';
- $element.addClass(droppingBeforeClassName);
- }
-
- };
-
- var dropHandler = function (event) {
- counter = 0;
- event.preventDefault();
-
- var targetChipsWrapId = angular.element($element[0].closest('md-chips-wrap')).attr('id');
- if (globalDraggingChipsWrapId !== targetChipsWrapId) {
- return;
- }
-
- var droppedItemIndex = parseInt((event.dataTransfer || event.originalEvent.dataTransfer).getData('text/plain'), 10);
- var currentIndex = $scope.$parent.$mdChipsCtrl.items.indexOf($scope.$parent.$chip);
- var newIndex = null;
-
- if (dropPosition === 'before') {
- if (droppedItemIndex < currentIndex) {
- newIndex = currentIndex - 1;
- } else {
- newIndex = currentIndex;
- }
- } else {
- if (droppedItemIndex < currentIndex) {
- newIndex = currentIndex;
- } else {
- newIndex = currentIndex + 1;
- }
- }
-
- // prevent event firing multiple times in firefox
- $timeout.cancel(dropTimeout);
- dropTimeout = $timeout(function () {
- dropPosition = null;
-
- move.apply($scope.$parent.$mdChipsCtrl.items, [droppedItemIndex, newIndex]);
-
- $scope.$apply(function () {
- $scope.$emit('mdChipDraggable:change', {
- collection: $scope.$parent.$mdChipsCtrl.items,
- item: $scope.$parent.$mdChipsCtrl.items[droppedItemIndex],
- from: droppedItemIndex,
- to: newIndex,
- });
- });
-
- $element.removeClass(droppingClassName);
- $element.removeClass(droppingAfterClassName);
- $element.removeClass(droppingBeforeClassName);
-
- $element.off('drop', dropHandler);
- }, 1000 / 16);
- };
-
- $element.on('dragenter', function () {
- counter++;
- if (dragging) {
- return;
- }
-
- $element.off('dragover', dragOverHandler);
- $element.off('drop', dropHandler);
-
- $element.on('dragover', dragOverHandler);
- $element.on('drop', dropHandler);
- });
-
- $element.on('dragleave', function () {
- counter--;
- if (counter <=0) {
- counter = 0;
- $element.removeClass(droppingClassName);
- $element.removeClass(droppingAfterClassName);
- $element.removeClass(droppingBeforeClassName);
- }
- });
-
- }],
- };
- })
- .name;
-
-/* eslint-enable angular/angularelement */
diff --git a/ui/src/app/components/md-chip-draggable.scss b/ui/src/app/components/md-chip-draggable.scss
deleted file mode 100644
index 29989592bd..0000000000
--- a/ui/src/app/components/md-chip-draggable.scss
+++ /dev/null
@@ -1,55 +0,0 @@
-/**
- * Copyright © 2016-2020 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.
- */
-md-chip {
- &.dropping {
- //border: dashed 2px;
- //opacity: .5;
-
- //.md-chip-content {
- // margin: -2px;
- //}
- }
-
- &.dropping-before {
- &::after {
- position: absolute;
- top: 0;
- right: 50%;
- bottom: 0;
- left: 0;
- content: "";
- background-color: #fff;
- border: dashed 2px;
- border-radius: 16px;
- opacity: .7;
- }
- }
-
- &.dropping-after {
- &::after {
- position: absolute;
- top: 0;
- right: 0;
- bottom: 0;
- left: 50%;
- content: "";
- background-color: #fff;
- border: dashed 2px;
- border-radius: 16px;
- opacity: .7;
- }
- }
-}
diff --git a/ui/src/app/components/menu-link.directive.js b/ui/src/app/components/menu-link.directive.js
deleted file mode 100644
index 1dec872b14..0000000000
--- a/ui/src/app/components/menu-link.directive.js
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Copyright © 2016-2020 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 './menu-link.scss';
-
-import thingsboardMenu from '../services/menu.service';
-
-/* eslint-disable import/no-unresolved, import/default */
-
-import menulinkTemplate from './menu-link.tpl.html';
-import menutoggleTemplate from './menu-toggle.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-export default angular.module('thingsboard.directives.menuLink', [thingsboardMenu])
- .directive('tbMenuLink', MenuLink)
- .filter('nospace', NoSpace)
- .name;
-
-/*@ngInject*/
-function MenuLink($compile, $templateCache, menu) {
-
- var linker = function (scope, element) {
- var template;
-
- if (scope.section.type === 'link') {
- template = $templateCache.get(menulinkTemplate);
- } else {
- template = $templateCache.get(menutoggleTemplate);
-
- var parentNode = element[0].parentNode.parentNode.parentNode;
- if (parentNode.classList.contains('parent-list-item')) {
- var heading = parentNode.querySelector('h2');
- element[0].firstChild.setAttribute('aria-describedby', heading.id);
- }
-
- scope.sectionActive = function () {
- return menu.sectionActive(scope.section);
- };
-
- scope.sectionHeight = function () {
- return menu.sectionHeight(scope.section);
- };
- }
-
- element.html(template);
-
- $compile(element.contents())(scope);
- }
-
- return {
- restrict: "E",
- link: linker,
- scope: {
- section: '='
- }
- };
-}
-
-function NoSpace() {
- return function (value) {
- return (!value) ? '' : value.replace(/ /g, '');
- }
-}
diff --git a/ui/src/app/components/menu-link.scss b/ui/src/app/components/menu-link.scss
deleted file mode 100644
index 948aef1cb5..0000000000
--- a/ui/src/app/components/menu-link.scss
+++ /dev/null
@@ -1,34 +0,0 @@
-/**
- * Copyright © 2016-2020 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 "~compass-sass-mixins/lib/compass";
-
-.md-button-toggle .md-toggle-icon.tb-toggled {
- transform: rotateZ(180deg);
-}
-
-.tb-menu-toggle-list.ng-hide {
- max-height: 0;
-}
-
-.tb-menu-toggle-list {
- position: relative;
- z-index: 1;
- overflow: hidden;
-
- transition: .75s cubic-bezier(.35, 0, .25, 1);
-
- transition-property: height;
-}
diff --git a/ui/src/app/components/menu-link.tpl.html b/ui/src/app/components/menu-link.tpl.html
deleted file mode 100644
index 8108b59452..0000000000
--- a/ui/src/app/components/menu-link.tpl.html
+++ /dev/null
@@ -1,22 +0,0 @@
-
-
- {{section.icon}}
- {{section.name | translate}}
-
\ No newline at end of file
diff --git a/ui/src/app/components/menu-toggle.tpl.html b/ui/src/app/components/menu-toggle.tpl.html
deleted file mode 100644
index a38ab8f1cd..0000000000
--- a/ui/src/app/components/menu-toggle.tpl.html
+++ /dev/null
@@ -1,33 +0,0 @@
-
-
- {{section.icon}}
- {{section.name | translate}}
-
-
-
diff --git a/ui/src/app/components/mousepoint-menu.directive.js b/ui/src/app/components/mousepoint-menu.directive.js
deleted file mode 100644
index 302f473c80..0000000000
--- a/ui/src/app/components/mousepoint-menu.directive.js
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-export default angular.module('thingsboard.directives.mousepointMenu', [])
- .directive('tbMousepointMenu', MousepointMenu)
- .name;
-
-/*@ngInject*/
-function MousepointMenu() {
-
- var linker = function ($scope, $element, $attrs, RightClickContextMenu) {
-
- $scope.$mdOpenMousepointMenu = function($event){
- RightClickContextMenu.offsets = function(){
- var offset = $element.offset();
- var x = $event.pageX - offset.left;
- var y = $event.pageY - offset.top;
- if ($attrs.tbOffsetX) {
- x += Number($attrs.tbOffsetX);
- }
- if ($attrs.tbOffsetY) {
- y += Number($attrs.tbOffsetY);
- }
- var offsets = {
- left: x,
- top: y
- }
- return offsets;
- }
- RightClickContextMenu.open($event);
- };
-
- $scope.$mdCloseMousepointMenu = function() {
- RightClickContextMenu.close();
- }
- }
-
- return {
- restrict: "A",
- link: linker,
- require: 'mdMenu'
- };
-}
diff --git a/ui/src/app/components/nav-tree.directive.js b/ui/src/app/components/nav-tree.directive.js
deleted file mode 100644
index e91ab04b58..0000000000
--- a/ui/src/app/components/nav-tree.directive.js
+++ /dev/null
@@ -1,206 +0,0 @@
-/*
- * Copyright © 2016-2020 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
deleted file mode 100644
index df903e747b..0000000000
--- a/ui/src/app/components/nav-tree.scss
+++ /dev/null
@@ -1,346 +0,0 @@
-/**
- * Copyright © 2016-2020 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
deleted file mode 100644
index d098ac27a6..0000000000
--- a/ui/src/app/components/nav-tree.tpl.html
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
diff --git a/ui/src/app/components/no-animate.directive.js b/ui/src/app/components/no-animate.directive.js
deleted file mode 100644
index ed3dda6d51..0000000000
--- a/ui/src/app/components/no-animate.directive.js
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Copyright © 2016-2020 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 ngAnimate from 'angular-animate';
-
-export default angular.module('thingsboard.directives.noAnimate', [ngAnimate])
- .directive('tbNoAnimate', NoAnimate)
- .name;
-
-/*@ngInject*/
-function NoAnimate($animate) {
- return {
- restrict: 'A',
- link: function (scope, element) {
- $animate.enabled(element, false);
- scope.$watch(function () {
- $animate.enabled(element, false)
- });
- }
- };
-}
diff --git a/ui/src/app/components/queue/index.js b/ui/src/app/components/queue/index.js
deleted file mode 100644
index 5236603270..0000000000
--- a/ui/src/app/components/queue/index.js
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright © 2016-2020 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 thingsboardApiQueue from '../../api/queue.service';
-import queueTypeList from "./queue-type-list.directive";
-
-export default angular.module('thingsboard.queue', [
- thingsboardApiQueue
-])
- .directive('tbQueueTypeList', queueTypeList)
- .name;
diff --git a/ui/src/app/components/queue/queue-type-list.directive.js b/ui/src/app/components/queue/queue-type-list.directive.js
deleted file mode 100644
index 6a2f99d280..0000000000
--- a/ui/src/app/components/queue/queue-type-list.directive.js
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- * Copyright © 2016-2020 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 './queue-type-list.scss';
-
-/* eslint-disable import/no-unresolved, import/default */
-
-import queueTypeListTemplate from './queue-type-list.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-/*@ngInject*/
-export default function QueueTypeList($compile, $templateCache, $q, $filter, queueService) {
-
- var linker = function (scope, element, attrs, ngModelCtrl) {
- var template = $templateCache.get(queueTypeListTemplate);
- element.html(template);
-
- scope.queues = null;
- scope.queue = null;
- scope.tbRequired = angular.isDefined(scope.tbRequired) ? scope.tbRequired : false;
- scope.queueSearchText = '';
-
- scope.fetchQueues = function(searchText) {
- var deferred = $q.defer();
- loadQueues().then(
- function success(queueArr) {
- let result = $filter('filter')(queueArr, {'$': searchText});
- if (result && result.length) {
- if (searchText && searchText.length && result.indexOf(searchText) === -1) {
- result.push(searchText);
- }
- result.sort();
- deferred.resolve(result);
- } else {
- deferred.resolve([searchText]);
- }
- },
- function fail() {
- deferred.reject();
- }
- );
-
- return deferred.promise;
- };
-
- scope.updateView = function () {
- if (!scope.disabled) {
- ngModelCtrl.$setViewValue(scope.queue);
- }
- };
-
- function loadQueues() {
- var deferred = $q.defer();
- if (!scope.queues) {
- queueService.getTenantQueuesByServiceType(scope.queueType).then(
- function success(queueArr) {
- scope.queues = queueArr.data;
- deferred.resolve(scope.queues);
- },
- function fail() {
- deferred.reject();
- }
- );
- } else {
- deferred.resolve(scope.queues);
- }
- return deferred.promise;
- }
-
- ngModelCtrl.$render = function () {
- scope.queue = ngModelCtrl.$viewValue;
- };
-
- scope.$watch('queue', function (newValue, prevValue) {
- if (!angular.equals(newValue, prevValue)) {
- scope.updateView();
- }
- });
-
- scope.$watch('disabled', function () {
- scope.updateView();
- });
-
- $compile(element.contents())(scope);
- };
-
- return {
- restrict: "E",
- require: "^ngModel",
- link: linker,
- scope: {
- theForm: '=?',
- tbRequired: '=?',
- disabled:'=ngDisabled',
- queueType: '=?'
- }
- };
-}
\ No newline at end of file
diff --git a/ui/src/app/components/queue/queue-type-list.scss b/ui/src/app/components/queue/queue-type-list.scss
deleted file mode 100644
index b8f6f58fb2..0000000000
--- a/ui/src/app/components/queue/queue-type-list.scss
+++ /dev/null
@@ -1,15 +0,0 @@
-/**
- * Copyright © 2016-2020 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.
- */
diff --git a/ui/src/app/components/queue/queue-type-list.tpl.html b/ui/src/app/components/queue/queue-type-list.tpl.html
deleted file mode 100644
index 5fc700026e..0000000000
--- a/ui/src/app/components/queue/queue-type-list.tpl.html
+++ /dev/null
@@ -1,43 +0,0 @@
-
-
-
-
- {{item}}
-
-
-
-
{{'queue.name_required' | translate}}
-
-
\ No newline at end of file
diff --git a/ui/src/app/components/react/json-form-ace-editor.jsx b/ui/src/app/components/react/json-form-ace-editor.jsx
deleted file mode 100644
index 2329bbddf7..0000000000
--- a/ui/src/app/components/react/json-form-ace-editor.jsx
+++ /dev/null
@@ -1,169 +0,0 @@
-/*
- * Copyright © 2016-2020 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 './json-form-ace-editor.scss';
-
-import React from 'react';
-import ThingsboardBaseComponent from './json-form-base-component.jsx';
-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';
-
-class ThingsboardAceEditor extends React.Component {
-
- constructor(props) {
- super(props);
- this.onValueChanged = this.onValueChanged.bind(this);
- this.onBlur = this.onBlur.bind(this);
- 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
- };
- }
-
- onValueChanged(value) {
- this.setState({
- value: value
- });
- this.props.onChangeValidate({
- target: {
- value: value
- }
- });
- }
-
- onBlur() {
- this.setState({ focused: false })
- }
-
- onFocus() {
- this.setState({ focused: true })
- }
-
- onTidy() {
- if (!this.props.form.readonly) {
- var value = this.state.value;
- value = this.props.onTidy(value);
- this.setState({
- value: value
- })
- this.props.onChangeValidate({
- target: {
- value: value
- }
- });
- }
- }
-
- 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({
- 'default': {
- tidyButtonStyle: {
- color: '#7B7B7B',
- minWidth: '32px',
- minHeight: '15px',
- lineHeight: '15px',
- fontSize: '0.800rem',
- margin: '0',
- padding: '4px',
- height: '23px',
- borderRadius: '5px',
- marginLeft: '5px'
- }
- }
- });
-
- var labelClass = "tb-label";
- if (this.props.form.required) {
- labelClass += " tb-required";
- }
- if (this.props.form.readonly) {
- labelClass += " tb-readonly";
- }
- 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 (
-
-
-
-
-
-
-
-
-
-
-
{this.props.error}
-
- );
- }
-}
-
-export default ThingsboardBaseComponent(ThingsboardAceEditor);
diff --git a/ui/src/app/components/react/json-form-ace-editor.scss b/ui/src/app/components/react/json-form-ace-editor.scss
deleted file mode 100644
index 17c7ab87b6..0000000000
--- a/ui/src/app/components/react/json-form-ace-editor.scss
+++ /dev/null
@@ -1,52 +0,0 @@
-/**
- * Copyright © 2016-2020 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.
- */
-.fullscreen-form-field {
- .json-form-ace-editor {
- height: calc(100% - 60px);
- }
-}
-
-.json-form-ace-editor {
- position: relative;
- height: 100%;
- border: 1px solid #c0c0c0;
-
- .title-panel {
- position: absolute;
- top: 10px;
- right: 20px;
- z-index: 5;
- font-size: .8rem;
- font-weight: 500;
-
- label {
- padding: 4px;
- color: #00acc1;
- text-transform: uppercase;
- background: rgba(220, 220, 220, .35);
- border-radius: 5px;
- }
-
- button.tidy-button {
- background: rgba(220, 220, 220, .35) !important;
-
- span {
- padding: 0 !important;
- font-size: 12px !important;
- }
- }
- }
-}
diff --git a/ui/src/app/components/react/json-form-array.jsx b/ui/src/app/components/react/json-form-array.jsx
deleted file mode 100644
index eb414d8619..0000000000
--- a/ui/src/app/components/react/json-form-array.jsx
+++ /dev/null
@@ -1,165 +0,0 @@
-/*
- * Copyright © 2016-2020 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 React from 'react';
-import { utils } from 'react-schema-form';
-import ThingsboardBaseComponent from './json-form-base-component.jsx';
-import RaisedButton from 'material-ui/RaisedButton';
-import FontIcon from 'material-ui/FontIcon';
-import _ from 'lodash';
-import IconButton from 'material-ui/IconButton';
-
-class ThingsboardArray extends React.Component {
-
- constructor(props) {
- super(props);
- this.onAppend = this.onAppend.bind(this);
- this.onDelete = this.onDelete.bind(this);
- var model = utils.selectOrSet(this.props.form.key, this.props.model) || [];
- var keys = [];
- for (var i=0;i 0) {
- key = newKeys[newKeys.length-1]+1;
- }
- newKeys.push(key);
- this.setState({
- model: newModel,
- keys: newKeys
- }
- );
- this.props.onChangeValidate(this.state.model);
- }
-
- onDelete(index) {
- var newModel = this.state.model;
- newModel.splice(index, 1);
- var newKeys = this.state.keys;
- newKeys.splice(index, 1);
- this.setState(
- {
- model: newModel,
- keys: newKeys
- }
- );
- this.props.onChangeValidate(this.state.model);
- }
-
- setIndex(index) {
- return function(form) {
- if (form.key) {
- form.key[form.key.indexOf('')] = index;
- }
- };
- };
-
- copyWithIndex(form, index) {
- var copy = _.cloneDeep(form);
- copy.arrayIndex = index;
- utils.traverseForm(copy, this.setIndex(index));
- return copy;
- };
-
- render() {
- var arrays = [];
- var fields = [];
- var model = this.state.model;
- var keys = this.state.keys;
- var items = this.props.form.items;
- for(var i = 0; i < model.length; i++ ) {
- let removeButton = '';
- if (!this.props.form.readonly) {
- let boundOnDelete = this.onDelete.bind(this, i)
- removeButton = clear
- }
- 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.onIconClick, this.props.onToggleFullscreen, this.props.mapper, this.props.builder);
- }.bind(this));
- arrays.push(
-
- {removeButton}
- {forms}
-
- );
- }
- let addButton = '';
- if (!this.props.form.readonly) {
- addButton = add}
- onTouchTap={this.onAppend}>;
- }
-
- return (
-
-
-
{this.props.form.title}
-
- {arrays}
-
-
- {addButton}
-
- );
- }
-}
-
-export default ThingsboardBaseComponent(ThingsboardArray);
diff --git a/ui/src/app/components/react/json-form-base-component.jsx b/ui/src/app/components/react/json-form-base-component.jsx
deleted file mode 100644
index 768e7504b6..0000000000
--- a/ui/src/app/components/react/json-form-base-component.jsx
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- * Copyright © 2016-2020 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 React from 'react';
-import { utils } from 'react-schema-form';
-
-export default ThingsboardBaseComponent => class extends React.Component {
-
- constructor(props) {
- super(props);
- this.onChangeValidate = this.onChangeValidate.bind(this);
- let value = this.defaultValue();
- let validationResult = utils.validate(this.props.form, value);
- this.state = {
- value: value,
- valid: !!(validationResult.valid || !value),
- error: !validationResult.valid && value ? validationResult.error.message : null
- };
- }
-
- componentDidMount() {
- if (typeof this.state.value !== 'undefined') {
- this.props.onChange(this.props.form.key, this.state.value);
- }
- }
-
- onChangeValidate(e) {
- let value = null;
- if (this.props.form.schema.type === 'integer' || this.props.form.schema.type === 'number') {
- if (e.target.value === null || e.target.value === '') {
- value = undefined;
- } else if (e.target.value.indexOf('.') == -1) {
- value = parseInt(e.target.value);
- } else {
- value = parseFloat(e.target.value);
- }
- } else if(this.props.form.schema.type === 'boolean') {
- value = e.target.checked;
- } else if(this.props.form.schema.type === 'date' || this.props.form.schema.type === 'array') {
- value = e;
- } else { // string
- value = e.target.value;
- }
- let validationResult = utils.validate(this.props.form, value);
- this.setState({
- value: value,
- valid: validationResult.valid,
- error: validationResult.valid ? null : validationResult.error.message
- });
- this.props.onChange(this.props.form.key, value);
- }
-
- defaultValue() {
- let value = utils.selectOrSet(this.props.form.key, this.props.model);
- if (this.props.form.schema.type === 'boolean') {
- if (typeof value !== 'boolean' && this.props.form['default']) {
- value = this.props.form['default'];
- }
- if (typeof value !== 'boolean' && this.props.form.schema && this.props.form.schema['default']) {
- value = this.props.form.schema['default'];
- }
- if (typeof value !== 'boolean' &&
- this.props.form.schema &&
- this.props.form.required) {
- value = false;
- }
- } else if (this.props.form.schema.type === 'integer' || this.props.form.schema.type === 'number') {
- if (typeof value !== 'number' && this.props.form['default']) {
- value = this.props.form['default'];
- }
- if (typeof value !== 'number' && this.props.form.schema && this.props.form.schema['default']) {
- value = this.props.form.schema['default'];
- }
- if (typeof value !== 'number' && this.props.form.titleMap && this.props.form.titleMap[0].value) {
- value = this.props.form.titleMap[0].value;
- }
- if (value && typeof value === 'string') {
- if (value.indexOf('.') == -1) {
- value = parseInt(value);
- } else {
- value = parseFloat(value);
- }
- }
- } else {
- if(!value && this.props.form['default']) {
- value = this.props.form['default'];
- }
- if(!value && this.props.form.schema && this.props.form.schema['default']) {
- value = this.props.form.schema['default'];
- }
- if(!value && this.props.form.titleMap && this.props.form.titleMap[0].value) {
- value = this.props.form.titleMap[0].value;
- }
- }
- return value;
- }
-
- render() {
- if (this.props.form && this.props.form.schema) {
- return ;
- } else {
- return ;
- }
- }
-};
diff --git a/ui/src/app/components/react/json-form-checkbox.jsx b/ui/src/app/components/react/json-form-checkbox.jsx
deleted file mode 100644
index 3a445da319..0000000000
--- a/ui/src/app/components/react/json-form-checkbox.jsx
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Copyright © 2016-2020 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 React from 'react';
-import ThingsboardBaseComponent from './json-form-base-component.jsx';
-import Checkbox from 'material-ui/Checkbox';
-
-class ThingsboardCheckbox extends React.Component {
- render() {
- return (
- {this.props.onChangeValidate(e)}}
- style={{paddingTop: '14px'}}
- />
- );
- }
-}
-
-export default ThingsboardBaseComponent(ThingsboardCheckbox);
\ No newline at end of file
diff --git a/ui/src/app/components/react/json-form-color.jsx b/ui/src/app/components/react/json-form-color.jsx
deleted file mode 100644
index 518428099c..0000000000
--- a/ui/src/app/components/react/json-form-color.jsx
+++ /dev/null
@@ -1,161 +0,0 @@
-/*
- * Copyright © 2016-2020 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 './json-form-color.scss';
-
-import $ from 'jquery';
-import React from 'react';
-import ReactDOM from 'react-dom';
-import ThingsboardBaseComponent from './json-form-base-component.jsx';
-import reactCSS from 'reactcss';
-import tinycolor from 'tinycolor2';
-import TextField from 'material-ui/TextField';
-import IconButton from 'material-ui/IconButton';
-
-class ThingsboardColor extends React.Component {
-
- constructor(props) {
- super(props);
- this.onValueChanged = this.onValueChanged.bind(this);
- this.onSwatchClick = this.onSwatchClick.bind(this);
- this.onClear = this.onClear.bind(this);
- var value = props.value ? props.value + '' : null;
- var color = value != null ? tinycolor(value).toRgb() : null;
- this.state = {
- color: color
- };
- }
-
- componentDidMount() {
- var node = ReactDOM.findDOMNode(this);
- var colContainer = $(node).children('#color-container');
- colContainer.click(this, function(event) {
- if (!event.data.props.form.readonly) {
- event.data.onSwatchClick(event);
- }
- });
- }
-
- componentWillUnmount () {
- var node = ReactDOM.findDOMNode(this);
- var colContainer = $(node).children('#color-container');
- colContainer.off( "click" );
- }
-
- onValueChanged(value) {
- var color = null;
- if (value != null) {
- color = tinycolor(value);
- }
- this.setState({
- color: value
- })
- var colorValue = '';
- if (color != null && color.getAlpha() != 1) {
- colorValue = color.toRgbString();
- } else if (color != null) {
- colorValue = color.toHexString();
- }
- this.props.onChangeValidate({
- target: {
- value: colorValue
- }
- });
- }
-
- onSwatchClick(event) {
- this.props.onColorClick(event, this.props.form.key, this.state.color);
- }
-
- onClear(event) {
- if (event) {
- event.stopPropagation();
- }
- this.onValueChanged(null);
- }
-
- render() {
-
- var background = 'rgba(0,0,0,0)';
- if (this.state.color != null) {
- background = `rgba(${ this.state.color.r }, ${ this.state.color.g }, ${ this.state.color.b }, ${ this.state.color.a })`;
- }
-
- const styles = reactCSS({
- 'default': {
- color: {
- background: `${ background }`
- },
- swatch: {
- display: 'inline-block',
- marginRight: '10px',
- marginTop: 'auto',
- marginBottom: 'auto',
- cursor: 'pointer',
- opacity: `${ this.props.form.readonly ? '0.6' : '1' }`
- },
- swatchText: {
- display: 'inline-block',
- width: '100%'
- },
- container: {
- display: 'flex'
- },
- colorContainer: {
- display: 'flex',
- width: '100%'
- }
- },
- });
-
- var fieldClass = "tb-field";
- if (this.props.form.required) {
- fieldClass += " tb-required";
- }
- if (this.props.form.readonly) {
- fieldClass += " tb-readonly";
- }
- if (this.state.focused) {
- fieldClass += " tb-focused";
- }
-
- var stringColor = '';
- if (this.state.color != null) {
- var color = tinycolor(this.state.color);
- stringColor = color.toRgbString();
- }
-
- return (
-
- );
- }
-}
-
-export default ThingsboardBaseComponent(ThingsboardColor);
diff --git a/ui/src/app/components/react/json-form-color.scss b/ui/src/app/components/react/json-form-color.scss
deleted file mode 100644
index 21ef91f886..0000000000
--- a/ui/src/app/components/react/json-form-color.scss
+++ /dev/null
@@ -1,41 +0,0 @@
-/**
- * Copyright © 2016-2020 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.
- */
-@mixin tb-checkered-bg() {
- background-color: #fff;
- background-image:
- linear-gradient(45deg, #ddd 25%, transparent 25%, transparent 75%, #ddd 75%, #ddd),
- linear-gradient(45deg, #ddd 25%, transparent 25%, transparent 75%, #ddd 75%, #ddd);
- background-position: 0 0, 4px 4px;
- background-size: 8px 8px;
-}
-
-.tb-color-preview {
- position: relative;
- width: 24px;
- height: 24px;
- overflow: hidden;
- content: "";
- border: 2px solid #fff;
- border-radius: 50%;
- box-shadow: 0 3px 1px -2px rgba(0, 0, 0, .14), 0 2px 2px 0 rgba(0, 0, 0, .098), 0 1px 5px 0 rgba(0, 0, 0, .084);
-
- @include tb-checkered-bg();
-
- .tb-color-result {
- width: 100%;
- height: 100%;
- }
-}
diff --git a/ui/src/app/components/react/json-form-css.jsx b/ui/src/app/components/react/json-form-css.jsx
deleted file mode 100644
index 8955c394a9..0000000000
--- a/ui/src/app/components/react/json-form-css.jsx
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright © 2016-2020 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 React from 'react';
-import ThingsboardAceEditor from './json-form-ace-editor.jsx';
-import 'brace/mode/css';
-import beautify from 'js-beautify';
-
-const css_beautify = beautify.css;
-
-class ThingsboardCss extends React.Component {
-
- constructor(props) {
- super(props);
- this.onTidyCss = this.onTidyCss.bind(this);
- }
-
- onTidyCss(css) {
- return css_beautify(css, {indent_size: 4});
- }
-
- render() {
- return (
-
- );
- }
-}
-
-export default ThingsboardCss;
diff --git a/ui/src/app/components/react/json-form-date.jsx b/ui/src/app/components/react/json-form-date.jsx
deleted file mode 100644
index ae4a9015ea..0000000000
--- a/ui/src/app/components/react/json-form-date.jsx
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Copyright © 2016-2020 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 React from 'react';
-import ThingsboardBaseComponent from './json-form-base-component.jsx';
-import DatePicker from 'material-ui/DatePicker/DatePicker';
-
-class ThingsboardDate extends React.Component {
-
- constructor(props) {
- super(props);
- this.onDatePicked = this.onDatePicked.bind(this);
- }
-
-
- onDatePicked(empty, date) {
- this.props.onChangeValidate(date);
- }
-
- render() {
-
- var fieldClass = "tb-date-field";
- if (this.props.form.required) {
- fieldClass += " tb-required";
- }
- if (this.props.form.readonly) {
- fieldClass += " tb-readonly";
- }
-
- return (
-
-
-
-
- );
- }
-}
-
-export default ThingsboardBaseComponent(ThingsboardDate);
\ No newline at end of file
diff --git a/ui/src/app/components/react/json-form-fieldset.jsx b/ui/src/app/components/react/json-form-fieldset.jsx
deleted file mode 100644
index f668ba774c..0000000000
--- a/ui/src/app/components/react/json-form-fieldset.jsx
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Copyright © 2016-2020 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 React from 'react';
-
-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.onIconClick, this.props.onToggleFullscreen, this.props.mapper, this.props.builder);
- }.bind(this));
-
- return (
-
-
- {this.props.form.title}
-
-
- {forms}
-
-
- );
- }
-}
-
-export default ThingsboardFieldSet;
diff --git a/ui/src/app/components/react/json-form-html.jsx b/ui/src/app/components/react/json-form-html.jsx
deleted file mode 100644
index 5500228a7a..0000000000
--- a/ui/src/app/components/react/json-form-html.jsx
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright © 2016-2020 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 React from 'react';
-import ThingsboardAceEditor from './json-form-ace-editor.jsx';
-import 'brace/mode/html';
-import beautify from 'js-beautify';
-
-const html_beautify = beautify.html;
-
-class ThingsboardHtml extends React.Component {
-
- constructor(props) {
- super(props);
- this.onTidyHtml = this.onTidyHtml.bind(this);
- }
-
- onTidyHtml(html) {
- return html_beautify(html, {indent_size: 4});
- }
-
- render() {
- return (
-
- );
- }
-}
-
-export default ThingsboardHtml;
diff --git a/ui/src/app/components/react/json-form-icon.jsx b/ui/src/app/components/react/json-form-icon.jsx
deleted file mode 100644
index 58aacf17ad..0000000000
--- a/ui/src/app/components/react/json-form-icon.jsx
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- * Copyright © 2016-2020 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 $ from 'jquery';
-import React from 'react';
-import ReactDOM from 'react-dom';
-import ThingsboardBaseComponent from './json-form-base-component.jsx';
-import reactCSS from 'reactcss';
-import TextField from 'material-ui/TextField';
-import IconButton from 'material-ui/IconButton';
-
-class ThingsboardIcon extends React.Component {
-
- constructor(props) {
- super(props);
- this.onValueChanged = this.onValueChanged.bind(this);
- this.onIconClick = this.onIconClick.bind(this);
- this.onClear = this.onClear.bind(this);
- var icon = props.value ? props.value : '';
- this.state = {
- icon: icon
- };
- }
-
- componentDidMount() {
- var node = ReactDOM.findDOMNode(this);
- var iconContainer = $(node).children('#icon-container');
- iconContainer.click(this, function(event) {
- event.data.onIconClick(event);
- });
- }
-
- componentWillUnmount () {
- var node = ReactDOM.findDOMNode(this);
- var iconContainer = $(node).children('#icon-container');
- iconContainer.off( "click" );
- }
-
- onValueChanged(value) {
- var icon = value;
-
- this.setState({
- icon: value
- })
- this.props.onChange(this.props.form.key, value);
- }
-
- onIconClick(event) {
- this.props.onIconClick(event);
- }
-
- onClear(event) {
- if (event) {
- event.stopPropagation();
- }
- this.onValueChanged('');
- }
-
- render() {
-
- const styles = reactCSS({
- 'default': {
- clear: {
- marginTop: '15px'
- },
- container: {
- display: 'flex'
- },
- icon: {
- display: 'inline-block',
- marginRight: '10px',
- marginTop: '16px',
- marginBottom: 'auto',
- cursor: 'pointer',
- border: 'solid 1px rgba(0, 0, 0, .27)'
- },
- iconContainer: {
- display: 'flex',
- width: '100%'
- },
- iconText: {
- display: 'inline-block',
- width: '100%'
- },
- },
- });
-
- var fieldClass = "tb-field";
- if (this.props.form.required) {
- fieldClass += " tb-required";
- }
- if (this.state.focused) {
- fieldClass += " tb-focused";
- }
-
- var pickedIcon = 'more_horiz';
- if (this.state.icon != '') {
- pickedIcon = this.state.icon;
- }
-
- return (
-
-
-
- {pickedIcon}
-
-
-
-
clear
-
- );
- }
-}
-
-export default ThingsboardBaseComponent(ThingsboardIcon);
diff --git a/ui/src/app/components/react/json-form-image.jsx b/ui/src/app/components/react/json-form-image.jsx
deleted file mode 100644
index c25b8cbc7c..0000000000
--- a/ui/src/app/components/react/json-form-image.jsx
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- * Copyright © 2016-2020 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 './json-form-image.scss';
-
-import React from 'react';
-import ThingsboardBaseComponent from './json-form-base-component.jsx';
-import Dropzone from 'react-dropzone';
-import IconButton from 'material-ui/IconButton';
-
-class ThingsboardImage extends React.Component {
-
- constructor(props) {
- super(props);
- this.onValueChanged = this.onValueChanged.bind(this);
- this.onDrop = this.onDrop.bind(this);
- this.onClear = this.onClear.bind(this);
- var value = props.value ? props.value + '' : null;
- this.state = {
- imageUrl: value
- };
- }
-
- onValueChanged(value) {
- this.setState({
- imageUrl: value
- });
- this.props.onChangeValidate({
- target: {
- value: value
- }
- });
- }
-
- onDrop(files) {
- var reader = new FileReader();
- reader.onload = (function(tImg) {
- return function(event) {
- tImg.onValueChanged(event.target.result);
- };
- })(this);
- reader.readAsDataURL(files[0]);
- }
-
- onClear(event) {
- if (event) {
- event.stopPropagation();
- }
- this.onValueChanged("");
- }
-
- render() {
-
- var labelClass = "tb-label";
- if (this.props.form.required) {
- labelClass += " tb-required";
- }
- if (this.props.form.readonly) {
- labelClass += " tb-readonly";
- }
- if (this.state.focused) {
- labelClass += " tb-focused";
- }
-
- var previewComponent;
- if (this.state.imageUrl) {
- previewComponent =
;
- } else {
- previewComponent = No image selected
;
- }
-
- return (
-
-
-
-
{previewComponent}
-
- clear
-
-
- Drop an image or click to select a file to upload.
-
-
-
- );
- }
-}
-
-export default ThingsboardBaseComponent(ThingsboardImage);
\ No newline at end of file
diff --git a/ui/src/app/components/react/json-form-image.scss b/ui/src/app/components/react/json-form-image.scss
deleted file mode 100644
index d578badfda..0000000000
--- a/ui/src/app/components/react/json-form-image.scss
+++ /dev/null
@@ -1,81 +0,0 @@
-/**
- * Copyright © 2016-2020 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.
- */
-$previewSize: 100px !default;
-
-.tb-image-select-container {
- position: relative;
- width: 100%;
- height: $previewSize;
-}
-
-.tb-image-preview {
- width: 100%;
- max-width: $previewSize;
- height: 100%;
- max-height: $previewSize;
-}
-
-.tb-image-preview-container {
- position: relative;
- float: left;
- width: $previewSize;
- height: $previewSize;
- margin-right: 12px;
- vertical-align: top;
- border: solid 1px;
-
- div {
- position: absolute;
- top: 50%;
- left: 50%;
- width: 100%;
- font-size: 18px;
- text-align: center;
- transform: translate(-50%, -50%);
- }
-}
-
-.tb-dropzone {
- position: relative;
- height: $previewSize;
- padding: 0 8px;
- overflow: hidden;
- vertical-align: top;
- border: dashed 2px;
-
- div {
- position: absolute;
- top: 50%;
- left: 50%;
- width: 100%;
- font-size: 24px;
- text-align: center;
- transform: translate(-50%, -50%);
- }
-}
-
-.tb-image-clear-container {
- position: relative;
- float: right;
- width: 48px;
- height: $previewSize;
-}
-
-.tb-image-clear-btn {
- position: absolute !important;
- top: 50%;
- transform: translate(0%, -50%) !important;
-}
diff --git a/ui/src/app/components/react/json-form-javascript.jsx b/ui/src/app/components/react/json-form-javascript.jsx
deleted file mode 100644
index 73ba1706da..0000000000
--- a/ui/src/app/components/react/json-form-javascript.jsx
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright © 2016-2020 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 React from 'react';
-import ThingsboardAceEditor from './json-form-ace-editor.jsx';
-import 'brace/mode/javascript';
-import beautify from 'js-beautify';
-
-const js_beautify = beautify.js;
-
-class ThingsboardJavaScript extends React.Component {
-
- constructor(props) {
- super(props);
- this.onTidyJavascript = this.onTidyJavascript.bind(this);
- }
-
- onTidyJavascript(javascript) {
- return js_beautify(javascript, {indent_size: 4, wrap_line_length: 60});
- }
-
- render() {
- return (
-
- );
- }
-}
-
-export default ThingsboardJavaScript;
diff --git a/ui/src/app/components/react/json-form-json.jsx b/ui/src/app/components/react/json-form-json.jsx
deleted file mode 100644
index 264d87345f..0000000000
--- a/ui/src/app/components/react/json-form-json.jsx
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright © 2016-2020 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 React from 'react';
-import ThingsboardAceEditor from './json-form-ace-editor.jsx';
-import 'brace/mode/json';
-import beautify from 'js-beautify';
-
-const js_beautify = beautify.js;
-
-class ThingsboardJson extends React.Component {
-
- constructor(props) {
- super(props);
- this.onTidyJson = this.onTidyJson.bind(this);
- }
-
- onTidyJson(json) {
- return js_beautify(json, {indent_size: 4});
- }
-
- render() {
- return (
-
- );
- }
-}
-
-export default ThingsboardJson;
diff --git a/ui/src/app/components/react/json-form-number.jsx b/ui/src/app/components/react/json-form-number.jsx
deleted file mode 100644
index 6203eb209d..0000000000
--- a/ui/src/app/components/react/json-form-number.jsx
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Copyright © 2016-2020 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 React from 'react';
-import ThingsboardBaseComponent from './json-form-base-component.jsx';
-import NumberInput from 'material-ui-number-input';
-
-class ThingsboardNumber extends React.Component {
-
- constructor(props) {
- super(props);
- this.preValidationCheck = this.preValidationCheck.bind(this);
- this.onBlur = this.onBlur.bind(this);
- this.onFocus = this.onFocus.bind(this);
- this.state = {
- lastSuccessfulValue : this.props.value,
- focused: false
- }
- }
-
- isNumeric(n) {
- return n === null || n === '' || !isNaN(n) && isFinite(n);
- }
-
- onBlur() {
- this.setState({ focused: false })
- }
-
- onFocus() {
- this.setState({ focused: true })
- }
-
- preValidationCheck(e) {
- if (this.isNumeric(e.target.value)) {
- this.setState({
- lastSuccessfulValue: e.target.value
- });
- this.props.onChangeValidate(e);
- }
- }
-
- render() {
-
- var fieldClass = "tb-field";
- if (this.props.form.required) {
- fieldClass += " tb-required";
- }
- if (this.props.form.readonly) {
- fieldClass += " tb-readonly";
- }
- if (this.state.focused) {
- fieldClass += " tb-focused";
- }
- var value = this.state.lastSuccessfulValue;
- if (typeof value !== 'undefined') {
- value = Number(value);
- } else {
- value = null;
- }
- return (
-
- );
- }
-}
-
-export default ThingsboardBaseComponent(ThingsboardNumber);
\ No newline at end of file
diff --git a/ui/src/app/components/react/json-form-rc-select.jsx b/ui/src/app/components/react/json-form-rc-select.jsx
deleted file mode 100644
index 04de29cb79..0000000000
--- a/ui/src/app/components/react/json-form-rc-select.jsx
+++ /dev/null
@@ -1,175 +0,0 @@
-/*
- * Copyright © 2016-2020 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 'rc-select/assets/index.css';
-
-import React from 'react';
-import ThingsboardBaseComponent from './json-form-base-component.jsx';
-import Select, {Option} from 'rc-select';
-
-class ThingsboardRcSelect extends React.Component {
-
- constructor(props) {
- super(props);
- this.onSelect = this.onSelect.bind(this);
- this.onDeselect = this.onDeselect.bind(this);
- this.onBlur = this.onBlur.bind(this);
- this.onFocus = this.onFocus.bind(this);
- this.state = {
- currentValue: this.keyToCurrentValue(this.props.value, this.props.form.schema.type === 'array'),
- items: this.props.form.items,
- focused: false
- };
- }
-
- keyToCurrentValue(key, isArray) {
- var currentValue = isArray ? [] : null;
- if (isArray) {
- var keys = key;
- if (keys) {
- for (var i = 0; i < keys.length; i++) {
- currentValue.push({key: keys[i], label: this.labelFromKey(keys[i])});
- }
- }
- } else {
- currentValue = {key: key, label: this.labelFromKey(key)};
- }
- return currentValue;
- }
-
- labelFromKey(key) {
- let label = key || '';
- if (key) {
- for (var i=0;i -1) {
- v.splice(index, 1);
- }
- this.setState({
- currentValue: v
- });
- this.props.onChangeValidate(this.arrayValues(v));
- }
- }
-
- onBlur() {
- this.setState({ focused: false })
- }
-
- onFocus() {
- this.setState({ focused: true })
- }
-
- render() {
- let options = [];
- if(this.state.items && this.state.items.length > 0) {
- options = this.state.items.map((item, idx) => (
-
- ));
- }
-
- var labelClass = "tb-label";
- if (this.props.form.required) {
- labelClass += " tb-required";
- }
- if (this.props.form.readonly) {
- labelClass += " tb-readonly";
- }
- if (this.state.focused) {
- labelClass += " tb-focused";
- }
-
- return (
-
-
-
-
{this.props.error}
-
- );
- }
-}
-
-export default ThingsboardBaseComponent(ThingsboardRcSelect);
diff --git a/ui/src/app/components/react/json-form-react.jsx b/ui/src/app/components/react/json-form-react.jsx
deleted file mode 100644
index b7a42a101b..0000000000
--- a/ui/src/app/components/react/json-form-react.jsx
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Copyright © 2016-2020 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 './json-form.scss';
-
-import React from 'react';
-import getMuiTheme from 'material-ui/styles/getMuiTheme';
-import thingsboardTheme from './styles/thingsboardTheme';
-import ThingsboardSchemaForm from './json-form-schema-form.jsx';
-
-class ReactSchemaForm extends React.Component {
-
- getChildContext() {
- return {
- muiTheme: this.state.muiTheme
- };
- }
-
- constructor(props) {
- super(props);
- this.state = {
- muiTheme: getMuiTheme(thingsboardTheme)
- };
- }
-
- render () {
- if (this.props.form.length > 0) {
- return ;
- } else {
- return ;
- }
- }
-}
-
-ReactSchemaForm.propTypes = {
- schema: React.PropTypes.object,
- form: React.PropTypes.array,
- groupInfoes: React.PropTypes.array,
- model: React.PropTypes.object,
- option: React.PropTypes.object,
- onModelChange: React.PropTypes.func,
- onColorClick: React.PropTypes.func,
- onIconClick: React.PropTypes.func,
- onToggleFullscreen: React.PropTypes.func
-}
-
-ReactSchemaForm.defaultProps = {
- schema: {},
- form: [ "*" ],
- groupInfoes:[]
-}
-
-ReactSchemaForm.childContextTypes = {
- muiTheme: React.PropTypes.object
-}
-
-export default ReactSchemaForm;
diff --git a/ui/src/app/components/react/json-form-schema-form.jsx b/ui/src/app/components/react/json-form-schema-form.jsx
deleted file mode 100644
index 04970f601b..0000000000
--- a/ui/src/app/components/react/json-form-schema-form.jsx
+++ /dev/null
@@ -1,167 +0,0 @@
-/*
- * Copyright © 2016-2020 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 React from 'react';
-import { utils } from 'react-schema-form';
-
-import ThingsboardArray from './json-form-array.jsx';
-import ThingsboardJavaScript from './json-form-javascript.jsx';
-import ThingsboardJson from './json-form-json.jsx';
-import ThingsboardHtml from './json-form-html.jsx';
-import ThingsboardCss from './json-form-css.jsx';
-import ThingsboardColor from './json-form-color.jsx'
-import ThingsboardRcSelect from './json-form-rc-select.jsx';
-import ThingsboardNumber from './json-form-number.jsx';
-import ThingsboardText from './json-form-text.jsx';
-import Select from 'react-schema-form/lib/Select';
-import Radios from 'react-schema-form/lib/Radios';
-import ThingsboardDate from './json-form-date.jsx';
-import ThingsboardImage from './json-form-image.jsx';
-import ThingsboardCheckbox from './json-form-checkbox.jsx';
-import Help from 'react-schema-form/lib/Help';
-import ThingsboardFieldSet from './json-form-fieldset.jsx';
-import ThingsboardIcon from './json-form-icon.jsx';
-
-import _ from 'lodash';
-
-class ThingsboardSchemaForm extends React.Component {
-
- constructor(props) {
- super(props);
-
- this.mapper = {
- 'number': ThingsboardNumber,
- 'text': ThingsboardText,
- 'password': ThingsboardText,
- 'textarea': ThingsboardText,
- 'select': Select,
- 'radios': Radios,
- 'date': ThingsboardDate,
- 'image': ThingsboardImage,
- 'checkbox': ThingsboardCheckbox,
- 'help': Help,
- 'array': ThingsboardArray,
- 'javascript': ThingsboardJavaScript,
- 'json': ThingsboardJson,
- 'html': ThingsboardHtml,
- 'css': ThingsboardCss,
- 'color': ThingsboardColor,
- 'rc-select': ThingsboardRcSelect,
- 'fieldset': ThingsboardFieldSet,
- 'icon': ThingsboardIcon
- };
-
- this.onChange = this.onChange.bind(this);
- this.onColorClick = this.onColorClick.bind(this);
- this.onIconClick = this.onIconClick.bind(this);
- this.onToggleFullscreen = this.onToggleFullscreen.bind(this);
- this.hasConditions = false;
- }
-
- onChange(key, val) {
- this.props.onModelChange(key, val);
- if (this.hasConditions) {
- this.forceUpdate();
- }
- }
-
- onColorClick(event, key, val) {
- this.props.onColorClick(event, key, val);
- }
-
- onIconClick(event) {
- this.props.onIconClick(event);
- }
-
- onToggleFullscreen() {
- this.props.onToggleFullscreen();
- }
-
-
- builder(form, model, index, onChange, onColorClick, onIconClick, onToggleFullscreen, mapper) {
- var type = form.type;
- let Field = this.mapper[type];
- if(!Field) {
- console.log('Invalid field: \"' + form.key[0] + '\"!');
- return null;
- }
- if(form.condition) {
- this.hasConditions = true;
- if (eval(form.condition) === false) {
- return null;
- }
- }
- return
- }
-
- createSchema(theForm) {
- let merged = utils.merge(this.props.schema, theForm, this.props.ignore, this.props.option);
- let mapper = this.mapper;
- if(this.props.mapper) {
- 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, this.onIconClick, this.onToggleFullscreen, mapper);
- }.bind(this));
-
- let formClass = 'SchemaForm';
- if (this.props.isFullscreen) {
- formClass += ' SchemaFormFullscreen';
- }
-
- return (
- {forms}
- );
- }
-
- render() {
- if(this.props.groupInfoes&&this.props.groupInfoes.length>0){
- let content=[];
- for(let info of this.props.groupInfoes){
- let forms = this.createSchema(this.props.form[info.formIndex]);
- let item = ;
- content.push(item);
- }
- return ({content}
);
- }
- else
- return this.createSchema(this.props.form);
- }
-}
-export default ThingsboardSchemaForm;
-
-
-class ThingsboardSchemaGroup extends React.Component{
- constructor(props) {
- super(props);
- this.state={
- showGroup:true
- }
- }
-
- toogleGroup(index) {
- this.setState({
- showGroup:!this.state.showGroup
- });
- }
-
- render() {
- let theCla = "pull-right fa fa-chevron-down md-toggle-icon"+(this.state.showGroup?"":" tb-toggled")
- return (
- {this.props.info.GroupTitle}
- {this.props.forms}
- );
- }
-}
diff --git a/ui/src/app/components/react/json-form-text.jsx b/ui/src/app/components/react/json-form-text.jsx
deleted file mode 100644
index 3fead4f8f8..0000000000
--- a/ui/src/app/components/react/json-form-text.jsx
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Copyright © 2016-2020 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 React from 'react';
-import ThingsboardBaseComponent from './json-form-base-component.jsx';
-import TextField from 'material-ui/TextField';
-
-class ThingsboardText extends React.Component {
-
- constructor(props) {
- super(props);
- this.onBlur = this.onBlur.bind(this);
- this.onFocus = this.onFocus.bind(this);
- this.state = {
- focused: false
- };
- }
-
- onBlur() {
- this.setState({ focused: false })
- }
-
- onFocus() {
- this.setState({ focused: true })
- }
-
- render() {
-
- var fieldClass = "tb-field";
- if (this.props.form.required) {
- fieldClass += " tb-required";
- }
- if (this.props.form.readonly) {
- fieldClass += " tb-readonly";
- }
- if (this.state.focused) {
- fieldClass += " tb-focused";
- }
-
- var multiline = this.props.form.type === 'textarea';
- var rows = multiline ? this.props.form.rows : 1;
- var rowsMax = multiline ? this.props.form.rowsMax : 1;
-
- return (
-
-
-
- );
- }
-}
-
-export default ThingsboardBaseComponent(ThingsboardText);
\ No newline at end of file
diff --git a/ui/src/app/components/react/json-form.scss b/ui/src/app/components/react/json-form.scss
deleted file mode 100644
index 85825abf42..0000000000
--- a/ui/src/app/components/react/json-form.scss
+++ /dev/null
@@ -1,154 +0,0 @@
-/**
- * Copyright © 2016-2020 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 "~compass-sass-mixins/lib/compass";
-
-$swift-ease-out-duration: .4s !default;
-$swift-ease-out-timing-function: cubic-bezier(.25, .8, .25, 1) !default;
-
-$input-label-float-offset: 6px !default;
-$input-label-float-scale: .75 !default;
-
-.tb-fullscreen {
- [name="ReactSchemaForm"] {
- .SchemaForm {
- &.SchemaFormFullscreen {
- position: absolute;
- top: 0;
- right: 0;
- bottom: 0;
- left: 0;
-
- > div:not(.fullscreen-form-field) {
- display: none !important;
- }
-
- > div.fullscreen-form-field {
- position: relative;
- width: 100%;
- height: 100%;
- }
- }
- }
-
- > div {
- > section {
- margin: 0 !important;
- box-shadow: none !important;
-
- .SchemaGroupname {
- display: none !important;
- }
-
- > div {
- padding: 0 !important;
- }
- }
- }
- }
-}
-
-
-.json-form-error {
- position: relative;
- bottom: -5px;
- font-size: 12px;
- line-height: 12px;
- color: rgb(244, 67, 54);
-
- transition: all 450ms cubic-bezier(.23, 1, .32, 1) 0ms;
-}
-
-.tb-container {
- position: relative;
- padding: 10px 0;
- margin-top: 32px;
-}
-
-.tb-field {
- &.tb-required {
- label::after {
- font-size: 13px;
- color: rgba(0, 0, 0, .54);
- vertical-align: top;
- content: " *";
- }
- }
-
- &.tb-focused:not(.tb-readonly) {
- label::after {
- color: rgb(221, 44, 0);
- }
- }
-}
-
-.tb-date-field {
- &.tb-required {
- div > div:first-child::after {
- font-size: 13px;
- color: rgba(0, 0, 0, .54);
- vertical-align: top;
- content: " *";
- }
- }
-
- &.tb-focused:not(.tb-readonly) {
- div > div:first-child::after {
- color: rgb(221, 44, 0);
- }
- }
-}
-
-label.tb-label {
- position: absolute;
- right: auto;
- bottom: 100%;
- left: 0;
- color: rgba(0, 0, 0, .54);
-
- transition: transform $swift-ease-out-timing-function $swift-ease-out-duration, width $swift-ease-out-timing-function $swift-ease-out-duration;
-
- transform: translate3d(0, $input-label-float-offset, 0) scale($input-label-float-scale);
- transform-origin: left top;
- -webkit-font-smoothing: antialiased;
-
- &.tb-focused {
- color: rgb(96, 125, 139);
- }
-
- &.tb-required::after {
- font-size: 13px;
- color: rgba(0, 0, 0, .54);
- vertical-align: top;
- content: " *";
- }
-
- &.tb-focused:not(.tb-readonly)::after {
- color: rgb(221, 44, 0);
- }
-}
-
-.tb-head-label {
- color: rgba(0, 0, 0, .54);
-}
-
-.SchemaGroupname{
- padding: 10px 20px;
- background-color: #f1f1f1;
-}
-
-.invisible{
- display: none;
-}
diff --git a/ui/src/app/components/react/styles/thingsboardTheme.js b/ui/src/app/components/react/styles/thingsboardTheme.js
deleted file mode 100644
index ed3a84d32e..0000000000
--- a/ui/src/app/components/react/styles/thingsboardTheme.js
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Copyright © 2016-2020 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 { /*blueGrey500, blueGrey700, blueGrey100, orange500,*/
- grey100, grey500, grey900, grey600, white, grey400, darkBlack, cyan500, fullBlack/*, indigo500*/, indigo700, indigo100, deepOrange500 } from 'material-ui/styles/colors';
-import {fade} from 'material-ui/utils/colorManipulator';
-import spacing from 'material-ui/styles/spacing';
-
-const PRIMARY_BACKGROUND_COLOR = "#305680";//"#3f51b5";
-
-/*var blueGrayPalette = {
- primary1Color: blueGrey500,
- primary2Color: blueGrey700,
- primary3Color: blueGrey100,
- accent1Color: orange500,
- accent2Color: grey100,
- accent3Color: grey500,
- textColor: grey900,
- secondaryTextColor: grey600,
- alternateTextColor: white,
- canvasColor: white,
- borderColor: grey400,
- disabledColor: fade(darkBlack, 0.3),
- pickerHeaderColor: cyan500,
- clockCircleColor: fade(darkBlack, 0.07),
- shadowColor: fullBlack,
-};*/
-
-var indigoPalette = {
- primary1Color: PRIMARY_BACKGROUND_COLOR,
- primary2Color: indigo700,
- primary3Color: indigo100,
- accent1Color: deepOrange500,
- accent2Color: grey100,
- accent3Color: grey500,
- textColor: grey900,
- secondaryTextColor: grey600,
- alternateTextColor: white,
- canvasColor: white,
- borderColor: grey400,
- disabledColor: fade(darkBlack, 0.3),
- pickerHeaderColor: cyan500,
- clockCircleColor: fade(darkBlack, 0.07),
- shadowColor: fullBlack,
-};
-
-export default {
- spacing: spacing,
- fontFamily: 'Roboto, \'Helvetica Neue\', sans-serif',
- palette: indigoPalette,
-};
\ No newline at end of file
diff --git a/ui/src/app/components/related-entity-autocomplete.directive.js b/ui/src/app/components/related-entity-autocomplete.directive.js
deleted file mode 100644
index 4fc131866d..0000000000
--- a/ui/src/app/components/related-entity-autocomplete.directive.js
+++ /dev/null
@@ -1,126 +0,0 @@
-/*
- * Copyright © 2016-2020 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 './related-entity-autocomplete.scss';
-
-/* eslint-disable import/no-unresolved, import/default */
-
-import relatedEntityAutocompleteTemplate from './related-entity-autocomplete.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-
-export default angular.module('thingsboard.directives.relatedEntityAutocomplete', [])
- .directive('tbRelatedEntityAutocomplete', RelatedEntityAutocomplete)
- .name;
-
-/*@ngInject*/
-function RelatedEntityAutocomplete($compile, $templateCache, $q, $filter, entityService) {
-
- var linker = function (scope, element, attrs, ngModelCtrl) {
- var template = $templateCache.get(relatedEntityAutocompleteTemplate);
- element.html(template);
-
- scope.tbRequired = angular.isDefined(scope.tbRequired) ? scope.tbRequired : false;
- scope.entity = null;
- scope.entitySearchText = '';
-
- scope.allEntities = null;
-
- scope.fetchEntities = function(searchText) {
- var deferred = $q.defer();
- if (!scope.allEntities) {
- entityService.getRelatedEntities(scope.rootEntityId, scope.entityType, scope.entitySubtypes, -1, []).then(
- function success(entities) {
- if (scope.excludeEntityIds && scope.excludeEntityIds.length) {
- var filteredEntities = [];
- entities.forEach(function(entity) {
- if (scope.excludeEntityIds.indexOf(entity.id.id) == -1) {
- filteredEntities.push(entity);
- }
- });
- entities = filteredEntities;
- }
- scope.allEntities = entities;
- filterEntities(searchText, deferred);
- },
- function fail() {
- deferred.reject();
- }
- );
- } else {
- filterEntities(searchText, deferred);
- }
- return deferred.promise;
- }
-
- function filterEntities(searchText, deferred) {
- var result = $filter('filter')(scope.allEntities, {name: searchText});
- deferred.resolve(result);
- }
-
- scope.entitySearchTextChanged = function() {
- }
-
- scope.updateView = function () {
- if (!scope.disabled) {
- ngModelCtrl.$setViewValue(scope.entity ? scope.entity.id : null);
- }
- }
-
- ngModelCtrl.$render = function () {
- if (ngModelCtrl.$viewValue) {
- entityService.getRelatedEntity(ngModelCtrl.$viewValue).then(
- function success(entity) {
- scope.entity = entity;
- },
- function fail() {
- scope.entity = null;
- }
- );
- } else {
- scope.entity = null;
- }
- }
-
- scope.$watch('entity', function () {
- scope.updateView();
- });
-
- scope.$watch('disabled', function () {
- scope.updateView();
- });
-
- $compile(element.contents())(scope);
- }
-
- return {
- restrict: "E",
- require: "^ngModel",
- link: linker,
- scope: {
- rootEntityId: '=',
- entityType: '=',
- entitySubtypes: '=',
- excludeEntityIds: '=?',
- theForm: '=?',
- tbRequired: '=?',
- disabled:'=ngDisabled',
- placeholderText: '@',
- notFoundText: '@',
- requiredText: '@'
- }
- };
-}
diff --git a/ui/src/app/components/related-entity-autocomplete.scss b/ui/src/app/components/related-entity-autocomplete.scss
deleted file mode 100644
index f4e3dea190..0000000000
--- a/ui/src/app/components/related-entity-autocomplete.scss
+++ /dev/null
@@ -1,32 +0,0 @@
-/**
- * Copyright © 2016-2020 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-related-entity-autocomplete {
- .tb-not-found {
- display: block;
- height: 48px;
- line-height: 1.5;
- }
-
- .tb-entity-item {
- display: block;
- height: 48px;
- }
-
- li {
- height: auto !important;
- white-space: normal !important;
- }
-}
diff --git a/ui/src/app/components/related-entity-autocomplete.tpl.html b/ui/src/app/components/related-entity-autocomplete.tpl.html
deleted file mode 100644
index 9bb8c492bb..0000000000
--- a/ui/src/app/components/related-entity-autocomplete.tpl.html
+++ /dev/null
@@ -1,43 +0,0 @@
-
-
-
-
- {{item.name}}
-
-
-
-
- {{ notFoundText | translate:{entity: entitySearchText} }}
-
-
-
-
{{ requiredText | translate }}
-
-
diff --git a/ui/src/app/components/scope-element.directive.js b/ui/src/app/components/scope-element.directive.js
deleted file mode 100644
index e354828da6..0000000000
--- a/ui/src/app/components/scope-element.directive.js
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-export default angular.module('thingsboard.directives.scopeElement', [])
- .directive('tbScopeElement', ScopeElement)
- .name;
-
-/*@ngInject*/
-function ScopeElement() {
- var directiveDefinitionObject = {
- restrict: "A",
- compile: function compile() {
- return {
- pre: function preLink(scope, iElement, iAttrs) {
- scope[iAttrs.tbScopeElement] = iElement;
- }
- };
- }
- };
- return directiveDefinitionObject;
-}
diff --git a/ui/src/app/components/side-menu.directive.js b/ui/src/app/components/side-menu.directive.js
deleted file mode 100644
index 31d7158970..0000000000
--- a/ui/src/app/components/side-menu.directive.js
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Copyright © 2016-2020 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 './side-menu.scss';
-
-import thingsboardMenu from '../services/menu.service';
-import thingsboardMenuLink from './menu-link.directive';
-
-/* eslint-disable import/no-unresolved, import/default */
-
-import sidemenuTemplate from './side-menu.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-export default angular.module('thingsboard.directives.sideMenu', [thingsboardMenu, thingsboardMenuLink])
- .directive('tbSideMenu', SideMenu)
- .name;
-
-/*@ngInject*/
-function SideMenu($compile, $templateCache, menu) {
-
- var linker = function (scope, element) {
-
- scope.sections = menu.getSections();
-
- var template = $templateCache.get(sidemenuTemplate);
-
- element.html(template);
-
- $compile(element.contents())(scope);
- }
-
- return {
- restrict: "E",
- link: linker,
- scope: {}
- };
-}
diff --git a/ui/src/app/components/side-menu.scss b/ui/src/app/components/side-menu.scss
deleted file mode 100644
index cac5752a8f..0000000000
--- a/ui/src/app/components/side-menu.scss
+++ /dev/null
@@ -1,95 +0,0 @@
-/**
- * Copyright © 2016-2020 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 "~compass-sass-mixins/lib/compass";
-
-.tb-side-menu .md-button.tb-active {
- font-weight: 500;
- background-color: rgba(255, 255, 255, .15);
-}
-
-.tb-side-menu,
-.tb-side-menu ul {
- padding: 0;
- margin-top: 0;
- list-style: none;
-}
-
-.tb-side-menu .tb-menu-toggle-list a.md-button {
- padding: 0 16px 0 32px;
- font-weight: 500;
- text-transform: none;
- text-rendering: optimizeLegibility;
-}
-
-.tb-side-menu .tb-menu-toggle-list .md-button {
- padding: 0 16px 0 32px;
- text-transform: none;
-}
-
-.tb-side-menu .tb-menu-toggle-list .tb-menu-toggle-list a.md-button {
- padding: 0 16px 0 48px;
-}
-
-.tb-side-menu > li {
- border-bottom: 1px solid rgba(0, 0, 0, .12);
-}
-
-.tb-side-menu .md-button-toggle .md-toggle-icon {
- display: inline-block;
- width: 15px;
- margin: auto 0 auto auto;
- background-size: 100% auto;
-
- transition: transform .3s, ease-in-out;
-}
-
-.tb-side-menu .md-button {
- display: flex;
- 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;
- white-space: nowrap;
- cursor: pointer;
- border-radius: 0;
-
- span {
- overflow: hidden;
- text-overflow: ellipsis;
- white-space: nowrap;
- }
-}
-
-.tb-side-menu tb-menu-link span.md-toggle-icon {
- padding-top: 12px;
- padding-bottom: 12px;
-}
-
-.tb-side-menu ng-md-icon {
- margin-right: 8px;
- margin-left: 0;
-}
-
-.tb-side-menu md-icon {
- margin-right: 8px;
- margin-left: 0;
-}
diff --git a/ui/src/app/components/side-menu.tpl.html b/ui/src/app/components/side-menu.tpl.html
deleted file mode 100644
index 70b3e4487e..0000000000
--- a/ui/src/app/components/side-menu.tpl.html
+++ /dev/null
@@ -1,23 +0,0 @@
-
-
\ No newline at end of file
diff --git a/ui/src/app/components/socialshare-panel.directive.js b/ui/src/app/components/socialshare-panel.directive.js
deleted file mode 100644
index ea5474daf8..0000000000
--- a/ui/src/app/components/socialshare-panel.directive.js
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-/* eslint-disable import/no-unresolved, import/default */
-
-import socialsharePanelTemplate from './socialshare-panel.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-
-export default angular.module('thingsboard.directives.socialsharePanel', [])
- .directive('tbSocialSharePanel', SocialsharePanel)
- .name;
-
-/*@ngInject*/
-function SocialsharePanel() {
- return {
- restrict: "E",
- scope: true,
- bindToController: {
- shareTitle: '@',
- shareText: '@',
- shareLink: '@',
- shareHashTags: '@'
- },
- controller: SocialsharePanelController,
- controllerAs: 'vm',
- templateUrl: socialsharePanelTemplate
- };
-}
-
-/*@ngInject*/
-function SocialsharePanelController(utils) {
-
- let vm = this;
-
- vm.isShareLinkLocal = function() {
- if (vm.shareLink && vm.shareLink.length > 0) {
- return utils.isLocalUrl(vm.shareLink);
- } else {
- return true;
- }
- }
-
-}
\ No newline at end of file
diff --git a/ui/src/app/components/socialshare-panel.tpl.html b/ui/src/app/components/socialshare-panel.tpl.html
deleted file mode 100644
index bf47502160..0000000000
--- a/ui/src/app/components/socialshare-panel.tpl.html
+++ /dev/null
@@ -1,61 +0,0 @@
-
-
-
-
-
- {{ 'action.share-via' | translate:{provider:'Facebook'} }}
-
-
-
-
-
- {{ 'action.share-via' | translate:{provider:'Twitter'} }}
-
-
-
-
-
- {{ 'action.share-via' | translate:{provider:'Linkedin'} }}
-
-
-
-
-
- {{ 'action.share-via' | translate:{provider:'Reddit'} }}
-
-
-
\ No newline at end of file
diff --git a/ui/src/app/components/tb-event-directives.js b/ui/src/app/components/tb-event-directives.js
deleted file mode 100644
index 11819410f2..0000000000
--- a/ui/src/app/components/tb-event-directives.js
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-const SPECIAL_CHARS_REGEXP = /([:\-_]+(.))/g;
-const MOZ_HACK_REGEXP = /^moz([A-Z])/;
-const PREFIX_REGEXP = /^((?:x|data)[:\-_])/i;
-
-var tbEventDirectives = {};
-
-angular.forEach(
- 'click dblclick mousedown mouseup mouseover mouseout mousemove mouseenter mouseleave contextmenu keydown keyup keypress submit focus blur copy cut paste'.split(' '),
- function(eventName) {
- var directiveName = directiveNormalize('tb-' + eventName);
- tbEventDirectives[directiveName] = ['$parse', '$rootScope', function($parse) {
- return {
- restrict: 'A',
- compile: function($element, attr) {
- var fn = $parse(attr[directiveName], /* interceptorFn */ null, /* expensiveChecks */ true);
- return function ngEventHandler(scope, element) {
- element.on(eventName, function(event) {
- var callback = function() {
- fn(scope, {$event:event});
- };
- callback();
- });
- };
- }
- };
- }];
- }
-);
-
-export default angular.module('thingsboard.directives.event', [])
- .directive(tbEventDirectives)
- .name;
-
-function camelCase(name) {
- return name.
- replace(SPECIAL_CHARS_REGEXP, function(_, separator, letter, offset) {
- return offset ? letter.toUpperCase() : letter;
- }).
- replace(MOZ_HACK_REGEXP, 'Moz$1');
-}
-
-function directiveNormalize(name) {
- return camelCase(name.replace(PREFIX_REGEXP, ''));
-}
\ No newline at end of file
diff --git a/ui/src/app/components/tb-json-to-string.directive.js b/ui/src/app/components/tb-json-to-string.directive.js
deleted file mode 100644
index 79bfadb540..0000000000
--- a/ui/src/app/components/tb-json-to-string.directive.js
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-export default angular.module('tbJsonToString', [])
- .directive('tbJsonToString', InputJson)
- .name;
-
-function InputJson() {
- return {
- restrict: 'A',
- require: 'ngModel',
- link: function(scope, element, attr, ngModelCtrl) {
- function into(input) {
- try {
- ngModelCtrl.$setValidity('invalidJSON', true);
- return angular.fromJson(input);
- } catch (e) {
- ngModelCtrl.$setValidity('invalidJSON', false);
- }
- }
- function out(data) {
- try {
- ngModelCtrl.$setValidity('invalidJSON', true);
- return angular.toJson(data);
- } catch (e) {
- ngModelCtrl.$setValidity('invalidJSON', false);
- }
- }
- ngModelCtrl.$parsers.push(into);
- ngModelCtrl.$formatters.push(out);
- }
- };
-}
diff --git a/ui/src/app/components/timeinterval.directive.js b/ui/src/app/components/timeinterval.directive.js
deleted file mode 100644
index 1f5d918ed3..0000000000
--- a/ui/src/app/components/timeinterval.directive.js
+++ /dev/null
@@ -1,240 +0,0 @@
-/*
- * Copyright © 2016-2020 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 './timeinterval.scss';
-
-/* eslint-disable import/no-unresolved, import/default */
-
-import timeintervalTemplate from './timeinterval.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-export default angular.module('thingsboard.directives.timeinterval', [])
- .directive('tbTimeinterval', Timeinterval)
- .name;
-
-/*@ngInject*/
-function Timeinterval($compile, $templateCache, timeService) {
-
- var linker = function (scope, element, attrs, ngModelCtrl) {
-
- var template = $templateCache.get(timeintervalTemplate);
- element.html(template);
-
- scope.rendered = false;
- scope.days = 0;
- scope.hours = 0;
- scope.mins = 1;
- scope.secs = 0;
-
- scope.advanced = false;
-
- scope.boundInterval = function() {
- var min = timeService.boundMinInterval(scope.min);
- var max = timeService.boundMaxInterval(scope.max);
- scope.intervals = timeService.getIntervals(scope.min, scope.max);
- if (scope.rendered) {
- var newIntervalMs = ngModelCtrl.$viewValue;
- if (newIntervalMs < min) {
- newIntervalMs = min;
- } else if (newIntervalMs > max) {
- newIntervalMs = max;
- }
- if (!scope.advanced) {
- newIntervalMs = timeService.boundToPredefinedInterval(min, max, newIntervalMs);
- }
- if (newIntervalMs !== ngModelCtrl.$viewValue) {
- scope.setIntervalMs(newIntervalMs);
- scope.updateView();
- }
- }
- }
-
- scope.setIntervalMs = function (intervalMs) {
- if (!scope.advanced) {
- scope.intervalMs = intervalMs;
- }
- var intervalSeconds = Math.floor(intervalMs / 1000);
- scope.days = Math.floor(intervalSeconds / 86400);
- scope.hours = Math.floor((intervalSeconds % 86400) / 3600);
- scope.mins = Math.floor(((intervalSeconds % 86400) % 3600) / 60);
- scope.secs = intervalSeconds % 60;
- }
-
- ngModelCtrl.$render = function () {
- if (ngModelCtrl.$viewValue) {
- var intervalMs = ngModelCtrl.$viewValue;
- if (!scope.rendered) {
- scope.advanced = !timeService.matchesExistingInterval(scope.min, scope.max, intervalMs);
- }
- scope.setIntervalMs(intervalMs);
- }
- scope.rendered = true;
- }
-
- function calculateIntervalMs() {
- return (scope.days * 86400 +
- scope.hours * 3600 +
- scope.mins * 60 +
- scope.secs) * 1000;
- }
-
- scope.updateView = function () {
- if (!scope.rendered) {
- return;
- }
- var value = null;
- var intervalMs;
- if (!scope.advanced) {
- intervalMs = scope.intervalMs;
- if (!intervalMs || isNaN(intervalMs)) {
- intervalMs = calculateIntervalMs();
- }
- } else {
- intervalMs = calculateIntervalMs();
- }
- if (!isNaN(intervalMs) && intervalMs > 0) {
- value = intervalMs;
- ngModelCtrl.$setValidity('tb-timeinterval', true);
- } else {
- ngModelCtrl.$setValidity('tb-timeinterval', !scope.required);
- }
- ngModelCtrl.$setViewValue(value);
- scope.boundInterval();
- }
-
- scope.$watch('required', function (newRequired, prevRequired) {
- if (angular.isDefined(newRequired) && newRequired !== prevRequired) {
- scope.updateView();
- }
- });
-
- scope.$watch('min', function (newMin, prevMin) {
- if (angular.isDefined(newMin) && newMin !== prevMin) {
- scope.updateView();
- }
- });
-
- scope.$watch('max', function (newMax, prevMax) {
- if (angular.isDefined(newMax) && newMax !== prevMax) {
- scope.updateView();
- }
- });
-
- scope.$watch('intervalMs', function (newIntervalMs, prevIntervalMs) {
- if (angular.isDefined(newIntervalMs) && newIntervalMs !== prevIntervalMs) {
- scope.updateView();
- }
- });
-
- scope.$watch('advanced', function (newAdvanced, prevAdvanced) {
- if (angular.isDefined(newAdvanced) && newAdvanced !== prevAdvanced) {
- if (!scope.advanced) {
- scope.intervalMs = calculateIntervalMs();
- } else {
- var intervalMs = scope.intervalMs;
- if (!intervalMs || isNaN(intervalMs)) {
- intervalMs = calculateIntervalMs();
- }
- scope.setIntervalMs(intervalMs);
- }
- scope.updateView();
- }
- });
-
- scope.$watch('secs', function (newSecs) {
- if (angular.isUndefined(newSecs)) {
- return;
- }
- if (newSecs < 0) {
- if ((scope.days + scope.hours + scope.mins) > 0) {
- scope.secs = newSecs + 60;
- scope.mins--;
- } else {
- scope.secs = 0;
- }
- } else if (newSecs >= 60) {
- scope.secs = newSecs - 60;
- scope.mins++;
- }
- scope.updateView();
- });
-
- scope.$watch('mins', function (newMins) {
- if (angular.isUndefined(newMins)) {
- return;
- }
- if (newMins < 0) {
- if ((scope.days + scope.hours) > 0) {
- scope.mins = newMins + 60;
- scope.hours--;
- } else {
- scope.mins = 0;
- }
- } else if (newMins >= 60) {
- scope.mins = newMins - 60;
- scope.hours++;
- }
- scope.updateView();
- });
-
- scope.$watch('hours', function (newHours) {
- if (angular.isUndefined(newHours)) {
- return;
- }
- if (newHours < 0) {
- if (scope.days > 0) {
- scope.hours = newHours + 24;
- scope.days--;
- } else {
- scope.hours = 0;
- }
- } else if (newHours >= 24) {
- scope.hours = newHours - 24;
- scope.days++;
- }
- scope.updateView();
- });
-
- scope.$watch('days', function (newDays) {
- if (angular.isUndefined(newDays)) {
- return;
- }
- if (newDays < 0) {
- scope.days = 0;
- }
- scope.updateView();
- });
-
- scope.boundInterval();
-
- $compile(element.contents())(scope);
-
- }
-
- return {
- restrict: "E",
- require: "^ngModel",
- scope: {
- required: '=ngRequired',
- min: '=?',
- max: '=?',
- predefinedName: '=?',
- hideFlag: '=?',
- isEdit: '=?'
- },
- link: linker
- };
-}
diff --git a/ui/src/app/components/timeinterval.scss b/ui/src/app/components/timeinterval.scss
deleted file mode 100644
index 36a8033b75..0000000000
--- a/ui/src/app/components/timeinterval.scss
+++ /dev/null
@@ -1,44 +0,0 @@
-/**
- * Copyright © 2016-2020 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-timeinterval {
- min-width: 355px;
-
- md-input-container {
- margin-bottom: 0;
-
- .md-errors-spacer {
- min-height: 0;
- }
- }
-
- mdp-date-picker {
- .md-input {
- width: 150px;
- }
- }
-
- .md-input {
- width: 70px !important;
- }
-
- .advanced-switch {
- margin-top: 0;
- }
-
- .advanced-label {
- margin: 5px 0;
- }
-}
diff --git a/ui/src/app/components/timeinterval.tpl.html b/ui/src/app/components/timeinterval.tpl.html
deleted file mode 100644
index d58100fdbc..0000000000
--- a/ui/src/app/components/timeinterval.tpl.html
+++ /dev/null
@@ -1,60 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
- {{interval.name}}
-
-
-
-
-
-
-
-
-
-
diff --git a/ui/src/app/components/timewindow-button.tpl.html b/ui/src/app/components/timewindow-button.tpl.html
deleted file mode 100644
index a424fd00e5..0000000000
--- a/ui/src/app/components/timewindow-button.tpl.html
+++ /dev/null
@@ -1,21 +0,0 @@
-
-
-
- {{model.displayValue}}
-
\ No newline at end of file
diff --git a/ui/src/app/components/timewindow-panel.controller.js b/ui/src/app/components/timewindow-panel.controller.js
deleted file mode 100644
index eb854d9fbc..0000000000
--- a/ui/src/app/components/timewindow-panel.controller.js
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-/*@ngInject*/
-export default function TimewindowPanelController(mdPanelRef, $scope, timeService, types, timewindow, historyOnly, aggregation, isEdit, onTimewindowUpdate) {
-
- var vm = this;
-
- vm._mdPanelRef = mdPanelRef;
- vm.timewindow = timewindow;
- vm.historyOnly = historyOnly;
- vm.aggregation = aggregation;
- vm.onTimewindowUpdate = onTimewindowUpdate;
- vm.aggregationTypes = types.aggregation;
- vm.showLimit = showLimit;
- vm.showRealtimeAggInterval = showRealtimeAggInterval;
- vm.showHistoryAggInterval = showHistoryAggInterval;
- vm.minRealtimeAggInterval = minRealtimeAggInterval;
- vm.maxRealtimeAggInterval = maxRealtimeAggInterval;
- vm.minHistoryAggInterval = minHistoryAggInterval;
- vm.maxHistoryAggInterval = maxHistoryAggInterval;
- vm.minDatapointsLimit = minDatapointsLimit;
- vm.maxDatapointsLimit = maxDatapointsLimit;
- vm.isEdit = isEdit;
-
- if (vm.historyOnly) {
- vm.timewindow.selectedTab = 1;
- }
-
- vm._mdPanelRef.config.onOpenComplete = function () {
- $scope.theForm.$setPristine();
- }
-
- $scope.$watch('vm.timewindow.selectedTab', function (newSelection, prevSelection) {
- if (newSelection !== prevSelection) {
- $scope.theForm.$setDirty();
- }
- });
-
- vm.cancel = function () {
- vm._mdPanelRef && vm._mdPanelRef.close();
- };
-
- vm.update = function () {
- vm._mdPanelRef && vm._mdPanelRef.close().then(function () {
- vm.onTimewindowUpdate && vm.onTimewindowUpdate(vm.timewindow);
- });
- };
-
- function showLimit() {
- return vm.timewindow.aggregation.type === vm.aggregationTypes.none.value;
- }
-
- function showRealtimeAggInterval() {
- return vm.timewindow.aggregation.type !== vm.aggregationTypes.none.value &&
- vm.timewindow.selectedTab === 0;
- }
-
- function showHistoryAggInterval() {
- return vm.timewindow.aggregation.type !== vm.aggregationTypes.none.value &&
- vm.timewindow.selectedTab === 1;
- }
-
- function minRealtimeAggInterval () {
- return timeService.minIntervalLimit(vm.timewindow.realtime.timewindowMs);
- }
-
- function maxRealtimeAggInterval () {
- return timeService.maxIntervalLimit(vm.timewindow.realtime.timewindowMs);
- }
-
- function minHistoryAggInterval () {
- return timeService.minIntervalLimit(currentHistoryTimewindow());
- }
-
- function maxHistoryAggInterval () {
- return timeService.maxIntervalLimit(currentHistoryTimewindow());
- }
-
- function minDatapointsLimit () {
- return timeService.getMinDatapointsLimit();
- }
-
- function maxDatapointsLimit () {
- return timeService.getMaxDatapointsLimit();
- }
-
- function currentHistoryTimewindow() {
- if (vm.timewindow.history.historyType === 0) {
- return vm.timewindow.history.timewindowMs;
- } else {
- return vm.timewindow.history.fixedTimewindow.endTimeMs -
- vm.timewindow.history.fixedTimewindow.startTimeMs;
- }
- }
-
-}
-
diff --git a/ui/src/app/components/timewindow-panel.tpl.html b/ui/src/app/components/timewindow-panel.tpl.html
deleted file mode 100644
index 46a1f002c1..0000000000
--- a/ui/src/app/components/timewindow-panel.tpl.html
+++ /dev/null
@@ -1,126 +0,0 @@
-
-
diff --git a/ui/src/app/components/timewindow.directive.js b/ui/src/app/components/timewindow.directive.js
deleted file mode 100644
index a8c0f3af0c..0000000000
--- a/ui/src/app/components/timewindow.directive.js
+++ /dev/null
@@ -1,307 +0,0 @@
-/*
- * Copyright © 2016-2020 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 './timewindow.scss';
-
-import $ from 'jquery';
-import thingsboardTimeinterval from './timeinterval.directive';
-import thingsboardDatetimePeriod from './datetime-period.directive';
-
-/* eslint-disable import/no-unresolved, import/default */
-
-import timewindowButtonTemplate from './timewindow-button.tpl.html';
-import timewindowTemplate from './timewindow.tpl.html';
-import timewindowPanelTemplate from './timewindow-panel.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-import TimewindowPanelController from './timewindow-panel.controller';
-
-export default angular.module('thingsboard.directives.timewindow', [thingsboardTimeinterval, thingsboardDatetimePeriod])
- .controller('TimewindowPanelController', TimewindowPanelController)
- .directive('tbTimewindow', Timewindow)
- .filter('milliSecondsToTimeString', MillisecondsToTimeString)
- .name;
-
-/* eslint-disable angular/angularelement */
-/*@ngInject*/
-function Timewindow($compile, $templateCache, $filter, $mdPanel, $document, $mdMedia, $translate, timeService) {
-
- var linker = function (scope, element, attrs, ngModelCtrl) {
-
- /* tbTimewindow (ng-model)
- * {
- * hideInterval: false,
- * hideAggregation: false,
- * hideAggInterval: false,
- * realtime: {
- * interval: 0,
- * timewindowMs: 0
- * },
- * history: {
- * interval: 0,
- * timewindowMs: 0,
- * fixedTimewindow: {
- * startTimeMs: 0,
- * endTimeMs: 0
- * }
- * },
- * aggregation: {
- * type: types.aggregation.avg.value,
- * limit: 200
- * }
- * }
- */
-
- scope.historyOnly = angular.isDefined(attrs.historyOnly);
-
- scope.isEdit = attrs.isEdit === 'true';
-
- scope.aggregation = scope.$eval(attrs.aggregation);
-
- scope.isToolbar = angular.isDefined(attrs.isToolbar);
-
- scope.hideLabel = function() {
- return scope.isToolbar && !$mdMedia('gt-md');
- }
-
- var translationPending = false;
-
- $translate.onReady(function() {
- if (translationPending) {
- scope.updateDisplayValue();
- translationPending = false;
- }
- });
-
- var template;
- if (scope.asButton) {
- template = $templateCache.get(timewindowButtonTemplate);
- } else {
- scope.direction = angular.isDefined(attrs.direction) ? attrs.direction : 'left';
- scope.tooltipDirection = angular.isDefined(attrs.tooltipDirection) ? attrs.tooltipDirection : 'top';
- template = $templateCache.get(timewindowTemplate);
- }
- element.html(template);
-
- scope.openEditMode = function (event) {
- if (scope.timewindowDisabled) {
- return;
- }
- var position;
- var isGtSm = $mdMedia('gt-sm');
- if (isGtSm) {
- var panelHeight = 375;
- var panelWidth = 417;
- var offset = element[0].getBoundingClientRect();
- var bottomY = offset.bottom - $(window).scrollTop(); //eslint-disable-line
- var leftX = offset.left - $(window).scrollLeft(); //eslint-disable-line
- var yPosition;
- var xPosition;
- if (bottomY + panelHeight > $( window ).height()) { //eslint-disable-line
- yPosition = $mdPanel.yPosition.ABOVE;
- } else {
- yPosition = $mdPanel.yPosition.BELOW;
- }
- if (leftX + panelWidth > $( window ).width()) { //eslint-disable-line
- xPosition = $mdPanel.xPosition.ALIGN_END;
- } else {
- xPosition = $mdPanel.xPosition.ALIGN_START;
- }
- position = $mdPanel.newPanelPosition()
- .relativeTo(element)
- .addPanelPosition(xPosition, yPosition);
- } else {
- position = $mdPanel.newPanelPosition()
- .absolute()
- .top('0%')
- .left('0%');
- }
- var config = {
- attachTo: angular.element($document[0].body),
- controller: 'TimewindowPanelController',
- controllerAs: 'vm',
- templateUrl: timewindowPanelTemplate,
- panelClass: 'tb-timewindow-panel',
- position: position,
- fullscreen: !isGtSm,
- locals: {
- 'timewindow': angular.copy(scope.model),
- 'historyOnly': scope.historyOnly,
- 'aggregation': scope.aggregation,
- 'isEdit': scope.isEdit,
- 'onTimewindowUpdate': function (timewindow) {
- scope.model = timewindow;
- scope.updateView();
- }
- },
- openFrom: event,
- clickOutsideToClose: true,
- escapeToClose: true,
- focusOnOpen: false
- };
- $mdPanel.open(config);
- }
-
- scope.updateView = function () {
- var value = {};
- var model = scope.model;
- if (model.selectedTab === 0) {
- value.realtime = {
- interval: model.realtime.interval,
- timewindowMs: model.realtime.timewindowMs
- };
- } else {
- if (model.history.historyType === 0) {
- value.history = {
- interval: model.history.interval,
- timewindowMs: model.history.timewindowMs
- };
- } else {
- value.history = {
- interval: model.history.interval,
- fixedTimewindow: {
- startTimeMs: model.history.fixedTimewindow.startTimeMs,
- endTimeMs: model.history.fixedTimewindow.endTimeMs
- }
- };
- }
- }
- value.aggregation = {
- type: model.aggregation.type,
- limit: model.aggregation.limit
- };
- value.hideInterval = model.hideInterval;
- value.hideAggregation = model.hideAggregation;
- value.hideAggInterval = model.hideAggInterval;
- ngModelCtrl.$setViewValue(value);
- scope.updateDisplayValue();
- }
-
- scope.updateDisplayValue = function () {
- if ($translate.isReady()) {
- if (scope.model.selectedTab === 0 && !scope.historyOnly) {
- scope.model.displayValue = $translate.instant('timewindow.realtime') + ' - ' +
- $translate.instant('timewindow.last-prefix') + ' ' +
- $filter('milliSecondsToTimeString')(scope.model.realtime.timewindowMs);
- } else {
- scope.model.displayValue = !scope.historyOnly ? ($translate.instant('timewindow.history') + ' - ') : '';
- if (scope.model.history.historyType === 0) {
- scope.model.displayValue += $translate.instant('timewindow.last-prefix') + ' ' +
- $filter('milliSecondsToTimeString')(scope.model.history.timewindowMs);
- } else {
- var startString = $filter('date')(scope.model.history.fixedTimewindow.startTimeMs, 'yyyy-MM-dd HH:mm:ss');
- var endString = $filter('date')(scope.model.history.fixedTimewindow.endTimeMs, 'yyyy-MM-dd HH:mm:ss');
- scope.model.displayValue += $translate.instant('timewindow.period', {startTime: startString, endTime: endString});
- }
- }
- } else {
- translationPending = true;
- }
- }
-
- function isTimewindowDisabled () {
- return scope.disabled || (!scope.isEdit && scope.model.hideInterval && scope.model.hideAggregation && scope.model.hideAggInterval);
- }
-
- ngModelCtrl.$render = function () {
- scope.model = timeService.defaultTimewindow();
- if (ngModelCtrl.$viewValue) {
- var value = ngModelCtrl.$viewValue;
- var model = scope.model;
- if (angular.isDefined(value.realtime)) {
- model.selectedTab = 0;
- model.realtime.interval = value.realtime.interval;
- model.realtime.timewindowMs = value.realtime.timewindowMs;
- } else {
- model.selectedTab = 1;
- model.history.interval = value.history.interval;
- if (angular.isDefined(value.history.timewindowMs)) {
- model.history.historyType = 0;
- model.history.timewindowMs = value.history.timewindowMs;
- } else {
- model.history.historyType = 1;
- model.history.fixedTimewindow.startTimeMs = value.history.fixedTimewindow.startTimeMs;
- model.history.fixedTimewindow.endTimeMs = value.history.fixedTimewindow.endTimeMs;
- }
- }
- if (angular.isDefined(value.aggregation)) {
- if (angular.isDefined(value.aggregation.type) && value.aggregation.type.length > 0) {
- model.aggregation.type = value.aggregation.type;
- }
- model.aggregation.limit = value.aggregation.limit || Math.floor(timeService.getMaxDatapointsLimit() / 2);
- }
- model.hideInterval = value.hideInterval;
- model.hideAggregation = value.hideAggregation;
- model.hideAggInterval = value.hideAggInterval;
- }
- scope.timewindowDisabled = isTimewindowDisabled();
- scope.updateDisplayValue();
- };
-
- scope.$watchGroup(['disabled', 'isEdit'], function(newValue, oldValue) {
- if (!angular.equals(newValue, oldValue)) {
- scope.timewindowDisabled = isTimewindowDisabled();
- }
- });
-
- $compile(element.contents())(scope);
- }
-
- return {
- restrict: "E",
- require: "^ngModel",
- scope: {
- asButton: '=asButton',
- disabled:'=ngDisabled',
- isEdit: '&?'
-
- },
- link: linker
- };
-}
-
-/*@ngInject*/
-function MillisecondsToTimeString($translate) {
- return function (millseconds) {
- var seconds = Math.floor(millseconds / 1000);
- var days = Math.floor(seconds / 86400);
- var hours = Math.floor((seconds % 86400) / 3600);
- var minutes = Math.floor(((seconds % 86400) % 3600) / 60);
- seconds = seconds % 60;
- var timeString = '';
- if (days > 0) timeString += $translate.instant('timewindow.days', {days: days}, 'messageformat');
- if (hours > 0) {
- if (timeString.length === 0 && hours === 1) {
- hours = 0;
- }
- timeString += $translate.instant('timewindow.hours', {hours: hours}, 'messageformat');
- }
- if (minutes > 0) {
- if (timeString.length === 0 && minutes === 1) {
- minutes = 0;
- }
- timeString += $translate.instant('timewindow.minutes', {minutes: minutes}, 'messageformat');
- }
- if (seconds > 0) {
- if (timeString.length === 0 && seconds === 1) {
- seconds = 0;
- }
- timeString += $translate.instant('timewindow.seconds', {seconds: seconds}, 'messageformat');
- }
- return timeString;
- }
-}
-/* eslint-enable angular/angularelement */
diff --git a/ui/src/app/components/timewindow.scss b/ui/src/app/components/timewindow.scss
deleted file mode 100644
index 611ad25d47..0000000000
--- a/ui/src/app/components/timewindow.scss
+++ /dev/null
@@ -1,85 +0,0 @@
-/**
- * Copyright © 2016-2020 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.
- */
-.md-panel {
- &.tb-timewindow-panel {
- position: absolute;
- }
-}
-
-.tb-timewindow-panel {
- min-width: 417px;
- max-height: 440px;
- overflow: hidden;
- background: #fff;
- border-radius: 4px;
- box-shadow:
- 0 7px 8px -4px rgba(0, 0, 0, .2),
- 0 13px 19px 2px rgba(0, 0, 0, .14),
- 0 5px 24px 4px rgba(0, 0, 0, .12);
-
- form,
- fieldset {
- height: 100%;
- }
-
- md-content {
- overflow: hidden;
- background-color: #fff;
- }
-
- .md-padding {
- padding: 0 16px;
- }
-
- .md-radio-interactive {
- md-select,
- md-switch {
- pointer-events: all;
- }
- }
-
- md-radio-button {
- .md-label {
- width: 100%;
- }
-
- tb-timeinterval {
- width: 355px;
-
- .advanced-switch {
- max-width: 44px;
- min-height: 30px;
- }
- }
- }
-}
-
-tb-timewindow {
- min-width: 52px;
-
- section.tb-timewindow {
- min-height: 32px;
- padding: 0 6px;
-
- span {
- overflow: hidden;
- text-overflow: ellipsis;
- white-space: nowrap;
- pointer-events: all;
- cursor: pointer;
- }
- }
-}
diff --git a/ui/src/app/components/timewindow.tpl.html b/ui/src/app/components/timewindow.tpl.html
deleted file mode 100644
index acc9a42c99..0000000000
--- a/ui/src/app/components/timewindow.tpl.html
+++ /dev/null
@@ -1,37 +0,0 @@
-
-
-
-
- {{ 'timewindow.edit' | translate }}
-
-
-
-
-
- {{ 'timewindow.edit' | translate }}
-
- {{model.displayValue}}
-
-
-
- {{ 'timewindow.edit' | translate }}
-
-
-
-
diff --git a/ui/src/app/components/truncate.filter.js b/ui/src/app/components/truncate.filter.js
deleted file mode 100644
index de32bbcd2a..0000000000
--- a/ui/src/app/components/truncate.filter.js
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-export default angular.module('thingsboard.filters.truncate', [])
- .filter('truncate', Truncate)
- .name;
-
-/*@ngInject*/
-function Truncate () {
- return function (value, wordwise, max, tail) {
- if (!value) return '';
-
- max = parseInt(max, 10);
- if (!max) return value;
- if (value.length <= max) return value;
-
- value = value.substr(0, max);
- if (wordwise) {
- var lastspace = value.lastIndexOf(' ');
- if (lastspace != -1) {
- //Also remove . and , so its gives a cleaner result.
- if (value.charAt(lastspace - 1) == '.' || value.charAt(lastspace - 1) == ',') {
- lastspace = lastspace - 1;
- }
- value = value.substr(0, lastspace);
- }
- }
-
- return value + (tail || ' …');
- };
-}
diff --git a/ui/src/app/components/widget/action/custom-action-pretty-editor.directive.js b/ui/src/app/components/widget/action/custom-action-pretty-editor.directive.js
deleted file mode 100644
index 65150d44ce..0000000000
--- a/ui/src/app/components/widget/action/custom-action-pretty-editor.directive.js
+++ /dev/null
@@ -1,1006 +0,0 @@
-/*
- * Copyright © 2016-2020 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 './custom-action-pretty-editor.scss';
-import customActionPrettyEditorTemplate from './custom-action-pretty-editor.tpl.html';
-
-import 'brace/ext/language_tools';
-import 'brace/ext/searchbox';
-import 'brace/mode/html';
-import 'brace/mode/css';
-import 'brace/snippets/text';
-import 'brace/snippets/html';
-import 'brace/snippets/css';
-
-import beautify from 'js-beautify';
-import Split from "split.js";
-
-const html_beautify = beautify.html;
-const css_beautify = beautify.css;
-
-export default angular.module('thingsboard.directives.customActionPrettyEditor', [])
- .directive('tbCustomActionPrettyEditor', CustomActionPrettyEditor)
- .name;
-
-/*@ngInject*/
-function CustomActionPrettyEditor($compile, $templateCache, $window, $timeout) {
-
- var linker = function (scope, element, attrs, ngModelCtrl) {
- var template = $templateCache.get(customActionPrettyEditorTemplate);
- element.html(template);
- var ace_editors = [];
- scope.fullscreen = false;
- scope.htmlEditorOptions = {
- useWrapMode: true,
- mode: 'html',
- advanced: {
- enableSnippets: true,
- enableBasicAutocompletion: true,
- enableLiveAutocompletion: true
- },
- onLoad: function (_ace) {
- ace_editors.push(_ace);
- }
- };
- scope.cssEditorOptions = {
- useWrapMode: true,
- mode: 'css',
- advanced: {
- enableSnippets: true,
- enableBasicAutocompletion: true,
- enableLiveAutocompletion: true
- },
- onLoad: function (_ace) {
- ace_editors.push(_ace);
- }
- };
-
- scope.addResource = addResource;
- scope.beautifyCss = beautifyCss;
- scope.beautifyHtml = beautifyHtml;
- scope.removeResource = removeResource;
- scope.toggleFullscreen = toggleFullscreen;
-
- var sampleJsFunction = "/*=======================================================================*/\n" +
- "/*===== There are three examples: for delete, edit and add entity =====*/\n" +
- "/*=======================================================================*/\n" +
- "/*======================= Delete entity example =======================*/\n" +
- "/*=======================================================================*/\n" +
- "//\n" +
- "//var $injector = widgetContext.$scope.$injector;\n" +
- "//var $mdDialog = $injector.get('$mdDialog'),\n" +
- "// $document = $injector.get('$document'),\n" +
- "// types = $injector.get('types'),\n" +
- "// assetService = $injector.get('assetService'),\n" +
- "// deviceService = $injector.get('deviceService')\n" +
- "// $rootScope = $injector.get('$rootScope'),\n" +
- "// $q = $injector.get('$q');\n" +
- "//\n" +
- "//openDeleteEntityDialog();\n" +
- "//\n" +
- "//function openDeleteEntityDialog() {\n" +
- "// var title = 'Delete ' + entityId.entityType\n" +
- "// .toLowerCase() + ' ' +\n" +
- "// entityName;\n" +
- "// var content = 'Are you sure you want to delete the ' +\n" +
- "// entityId.entityType.toLowerCase() + ' ' +\n" +
- "// entityName + '?';\n" +
- "// var confirm = $mdDialog.confirm()\n" +
- "// .targetEvent($event)\n" +
- "// .title(title)\n" +
- "// .htmlContent(content)\n" +
- "// .ariaLabel(title)\n" +
- "// .cancel('Cancel')\n" +
- "// .ok('Delete');\n" +
- "// $mdDialog.show(confirm).then(function() {\n" +
- "// deleteEntity();\n" +
- "// })\n" +
- "//}\n" +
- "//\n" +
- "//function deleteEntity() {\n" +
- "// deleteEntityPromise(entityId).then(\n" +
- "// function success() {\n" +
- "// updateAliasData();\n" +
- "// },\n" +
- "// function fail() {\n" +
- "// showErrorDialog();\n" +
- "// }\n" +
- "// );\n" +
- "//}\n" +
- "//\n" +
- "//function deleteEntityPromise(entityId) {\n" +
- "// if (entityId.entityType == types.entityType.asset) {\n" +
- "// return assetService.deleteAsset(entityId.id);\n" +
- "// } else if (entityId.entityType == types.entityType.device) {\n" +
- "// return deviceService.deleteDevice(entityId.id);\n" +
- "// }\n" +
- "//}\n" +
- "//\n" +
- "//function updateAliasData() {\n" +
- "// var aliasIds = [];\n" +
- "// for (var id in widgetContext.aliasController.resolvedAliases) {\n" +
- "// aliasIds.push(id);\n" +
- "// }\n" +
- "// var tasks = [];\n" +
- "// aliasIds.forEach(function(aliasId) {\n" +
- "// widgetContext.aliasController.setAliasUnresolved(aliasId);\n" +
- "// tasks.push(widgetContext.aliasController.getAliasInfo(aliasId));\n" +
- "// });\n" +
- "// $q.all(tasks).then(function() {\n" +
- "// $rootScope.$broadcast('entityAliasesChanged', aliasIds);\n" +
- "// });\n" +
- "//}\n" +
- "//\n" +
- "//function showErrorDialog() {\n" +
- "// var title = 'Error';\n" +
- "// var content = 'An error occurred while deleting the entity. Please try again.';\n" +
- "// var alert = $mdDialog.alert()\n" +
- "// .title(title)\n" +
- "// .htmlContent(content)\n" +
- "// .ariaLabel(title)\n" +
- "// .parent(angular.element($document[0].body))\n" +
- "// .targetEvent($event)\n" +
- "// .multiple(true)\n" +
- "// .clickOutsideToClose(true)\n" +
- "// .ok('CLOSE');\n" +
- "// $mdDialog.show(alert);\n" +
- "//}\n" +
- "//\n" +
- "/*=======================================================================*/\n" +
- "/*======================== Edit entity example ========================*/\n" +
- "/*=======================================================================*/\n" +
- "//\n" +
- "//var $injector = widgetContext.$scope.$injector;\n" +
- "//var $mdDialog = $injector.get('$mdDialog'),\n" +
- "// $document = $injector.get('$document'),\n" +
- "// $q = $injector.get('$q'),\n" +
- "// types = $injector.get('types'),\n" +
- "// $rootScope = $injector.get('$rootScope'),\n" +
- "// entityService = $injector.get('entityService'),\n" +
- "// attributeService = $injector.get('attributeService'),\n" +
- "// entityRelationService = $injector.get('entityRelationService');\n" +
- "//\n" +
- "//openEditEntityDialog();\n" +
- "//\n" +
- "//function openEditEntityDialog() {\n" +
- "// $mdDialog.show({\n" +
- "// controller: ['$scope','$mdDialog', EditEntityDialogController],\n" +
- "// controllerAs: 'vm',\n" +
- "// template: htmlTemplate,\n" +
- "// locals: {\n" +
- "// entityId: entityId\n" +
- "// },\n" +
- "// parent: angular.element($document[0].body),\n" +
- "// targetEvent: $event,\n" +
- "// multiple: true,\n" +
- "// clickOutsideToClose: false\n" +
- "// });\n" +
- "//}\n" +
- "//\n" +
- "//function EditEntityDialogController($scope,$mdDialog) {\n" +
- "// var vm = this;\n" +
- "// vm.entityId = entityId;\n" +
- "// vm.entityName = entityName;\n" +
- "// vm.entityType = entityId.entityType;\n" +
- "// vm.allowedEntityTypes = [types.entityType.asset, types.entityType.device];\n" +
- "// vm.allowedRelatedEntityTypes = [];\n" +
- "// vm.entitySearchDirection = types.entitySearchDirection;\n" +
- "// vm.attributes = {};\n" +
- "// vm.serverAttributes = {};\n" +
- "// vm.relations = [];\n" +
- "// vm.newRelations = [];\n" +
- "// vm.relationsToDelete = [];\n" +
- "// getEntityInfo();\n" +
- "// \n" +
- "// vm.addRelation = function() {\n" +
- "// var relation = {\n" +
- "// direction: null,\n" +
- "// relationType: null,\n" +
- "// relatedEntity: null\n" +
- "// };\n" +
- "// vm.newRelations.push(relation);\n" +
- "// $scope.editEntityForm.$setDirty();\n" +
- "// };\n" +
- "// vm.removeRelation = function(index) {\n" +
- "// if (index > -1) {\n" +
- "// vm.newRelations.splice(index, 1);\n" +
- "// $scope.editEntityForm.$setDirty();\n" +
- "// }\n" +
- "// };\n" +
- "// vm.removeOldRelation = function(index, relation) {\n" +
- "// if (index > -1) {\n" +
- "// vm.relations.splice(index, 1);\n" +
- "// vm.relationsToDelete.push(relation);\n" +
- "// $scope.editEntityForm.$setDirty();\n" +
- "// }\n" +
- "// };\n" +
- "// vm.save = function() {\n" +
- "// saveAttributes();\n" +
- "// saveRelations();\n" +
- "// $scope.editEntityForm.$setPristine();\n" +
- "// };\n" +
- "// vm.cancel = function() {\n" +
- "// $mdDialog.hide();\n" +
- "// };\n" +
- "// \n" +
- "// function getEntityAttributes(attributes) {\n" +
- "// for (var i = 0; i < attributes.length; i++) {\n" +
- "// vm.attributes[attributes[i].key] = attributes[i].value; \n" +
- "// }\n" +
- "// vm.serverAttributes = angular.copy(vm.attributes);\n" +
- "// }\n" +
- "// \n" +
- "// function getEntityRelations(relations) {\n" +
- "// var relationsFrom = relations[0];\n" +
- "// var relationsTo = relations[1];\n" +
- "// for (var i=0; i < relationsFrom.length; i++) {\n" +
- "// var relation = {\n" +
- "// direction: types.entitySearchDirection.from,\n" +
- "// relationType: relationsFrom[i].type,\n" +
- "// relatedEntity: relationsFrom[i].to\n" +
- "// };\n" +
- "// vm.relations.push(relation);\n" +
- "// }\n" +
- "// for (var i=0; i < relationsTo.length; i++) {\n" +
- "// var relation = {\n" +
- "// direction: types.entitySearchDirection.to,\n" +
- "// relationType: relationsTo[i].type,\n" +
- "// relatedEntity: relationsTo[i].from\n" +
- "// };\n" +
- "// vm.relations.push(relation);\n" +
- "// }\n" +
- "// }\n" +
- "// \n" +
- "// function getEntityInfo() {\n" +
- "// entityService.getEntity(entityId.entityType, entityId.id).then(\n" +
- "// function(entity) {\n" +
- "// vm.entity = entity;\n" +
- "// vm.type = vm.entity.type;\n" +
- "// });\n" +
- "// attributeService.getEntityAttributesValues(entityId.entityType, entityId.id, 'SERVER_SCOPE').then(\n" +
- "// function(data){\n" +
- "// if (data.length) {\n" +
- "// getEntityAttributes(data);\n" +
- "// }\n" +
- "// });\n" +
- "// $q.all([entityRelationService.findInfoByFrom(entityId.id, entityId.entityType), entityRelationService.findInfoByTo(entityId.id, entityId.entityType)]).then(\n" +
- "// function(relations){\n" +
- "// getEntityRelations(relations);\n" +
- "// });\n" +
- "// }\n" +
- "// \n" +
- "// function saveAttributes() {\n" +
- "// var attributesArray = [];\n" +
- "// for (var key in vm.attributes) {\n" +
- "// if (vm.attributes[key] !== vm.serverAttributes[key]) {\n" +
- "// attributesArray.push({key: key, value: vm.attributes[key]});\n" +
- "// }\n" +
- "// }\n" +
- "// if (attributesArray.length > 0) {\n" +
- "// attributeService.saveEntityAttributes(entityId.entityType, entityId.id, \"SERVER_SCOPE\", attributesArray);\n" +
- "// } \n" +
- "// }\n" +
- "// \n" +
- "// function saveRelations() {\n" +
- "// var tasks = [];\n" +
- "// for (var i=0; i < vm.newRelations.length; i++) {\n" +
- "// var relation = {\n" +
- "// type: vm.newRelations[i].relationType\n" +
- "// };\n" +
- "// if (vm.newRelations[i].direction == types.entitySearchDirection.from) {\n" +
- "// relation.to = vm.newRelations[i].relatedEntity;\n" +
- "// relation.from = entityId;\n" +
- "// } else {\n" +
- "// relation.to = entityId;\n" +
- "// relation.from = vm.newRelations[i].relatedEntity;\n" +
- "// }\n" +
- "// tasks.push(entityRelationService.saveRelation(relation));\n" +
- "// }\n" +
- "// for (var i=0; i < vm.relationsToDelete.length; i++) {\n" +
- "// var relation = {\n" +
- "// type: vm.relationsToDelete[i].relationType\n" +
- "// };\n" +
- "// if (vm.relationsToDelete[i].direction == types.entitySearchDirection.from) {\n" +
- "// relation.to = vm.relationsToDelete[i].relatedEntity;\n" +
- "// relation.from = entityId;\n" +
- "// } else {\n" +
- "// relation.to = entityId;\n" +
- "// relation.from = vm.relationsToDelete[i].relatedEntity;\n" +
- "// }\n" +
- "// tasks.push(entityRelationService.deleteRelation(relation.from.id, relation.from.entityType, relation.type, relation.to.id, relation.to.entityType));\n" +
- "// }\n" +
- "// $q.all(tasks).then(function(){\n" +
- "// vm.relations = vm.relations.concat(vm.newRelations);\n" +
- "// vm.newRelations = [];\n" +
- "// vm.relationsToDelete = [];\n" +
- "// updateAliasData();\n" +
- "// });\n" +
- "// }\n" +
- "// \n" +
- "// function updateAliasData() {\n" +
- "// var aliasIds = [];\n" +
- "// for (var id in widgetContext.aliasController.resolvedAliases) {\n" +
- "// aliasIds.push(id);\n" +
- "// }\n" +
- "// var tasks = [];\n" +
- "// aliasIds.forEach(function(aliasId) {\n" +
- "// widgetContext.aliasController.setAliasUnresolved(aliasId);\n" +
- "// tasks.push(widgetContext.aliasController.getAliasInfo(aliasId));\n" +
- "// });\n" +
- "// $q.all(tasks).then(function() {\n" +
- "// $rootScope.$broadcast('entityAliasesChanged', aliasIds);\n" +
- "// });\n" +
- "// }\n" +
- "//}\n" +
- "//\n" +
- "/*========================================================================*/\n" +
- "/*========================= Add entity example =========================*/\n" +
- "/*========================================================================*/\n" +
- "//\n" +
- "//var $injector = widgetContext.$scope.$injector;\n" +
- "//var $mdDialog = $injector.get('$mdDialog'),\n" +
- "// $document = $injector.get('$document'),\n" +
- "// $q = $injector.get('$q'),\n" +
- "// $rootScope = $injector.get('$rootScope'),\n" +
- "// types = $injector.get('types'),\n" +
- "// assetService = $injector.get('assetService'),\n" +
- "// deviceService = $injector.get('deviceService'),\n" +
- "// attributeService = $injector.get('attributeService'),\n" +
- "// entityRelationService = $injector.get('entityRelationService');\n" +
- "//\n" +
- "//openAddEntityDialog();\n" +
- "//\n" +
- "//function openAddEntityDialog() {\n" +
- "// $mdDialog.show({\n" +
- "// controller: ['$scope','$mdDialog', AddEntityDialogController],\n" +
- "// controllerAs: 'vm',\n" +
- "// template: htmlTemplate,\n" +
- "// locals: {\n" +
- "// entityId: entityId\n" +
- "// },\n" +
- "// parent: angular.element($document[0].body),\n" +
- "// targetEvent: $event,\n" +
- "// multiple: true,\n" +
- "// clickOutsideToClose: false\n" +
- "// });\n" +
- "//}\n" +
- "//\n" +
- "//function AddEntityDialogController($scope, $mdDialog) {\n" +
- "// var vm = this;\n" +
- "// vm.allowedEntityTypes = [types.entityType.asset, types.entityType.device];\n" +
- "// vm.allowedRelatedEntityTypes = [];\n" +
- "// vm.entitySearchDirection = types.entitySearchDirection;\n" +
- "// vm.attributes = {};\n" +
- "// vm.relations = [];\n" +
- "// \n" +
- "// vm.addRelation = function() {\n" +
- "// var relation = {\n" +
- "// direction: null,\n" +
- "// relationType: null,\n" +
- "// relatedEntity: null\n" +
- "// };\n" +
- "// vm.relations.push(relation);\n" +
- "// };\n" +
- "// vm.removeRelation = function(index) {\n" +
- "// if (index > -1) {\n" +
- "// vm.relations.splice(index, 1);\n" +
- "// }\n" +
- "// };\n" +
- "// vm.save = function() {\n" +
- "// $scope.addEntityForm.$setPristine();\n" +
- "// saveEntityPromise().then(\n" +
- "// function (entity) {\n" +
- "// saveAttributes(entity.id);\n" +
- "// saveRelations(entity.id);\n" +
- "// $mdDialog.hide();\n" +
- "// }\n" +
- "// );\n" +
- "// };\n" +
- "// vm.cancel = function() {\n" +
- "// $mdDialog.hide();\n" +
- "// };\n" +
- "// \n" +
- "// \n" +
- "// function saveEntityPromise() {\n" +
- "// var entity = {\n" +
- "// name: vm.entityName,\n" +
- "// type: vm.type\n" +
- "// };\n" +
- "// if (vm.entityType == types.entityType.asset) {\n" +
- "// return assetService.saveAsset(entity);\n" +
- "// } else if (vm.entityType == types.entityType.device) {\n" +
- "// return deviceService.saveDevice(entity);\n" +
- "// }\n" +
- "// }\n" +
- "// \n" +
- "// function saveAttributes(entityId) {\n" +
- "// var attributesArray = [];\n" +
- "// for (var key in vm.attributes) {\n" +
- "// attributesArray.push({key: key, value: vm.attributes[key]});\n" +
- "// }\n" +
- "// if (attributesArray.length > 0) {\n" +
- "// attributeService.saveEntityAttributes(entityId.entityType, entityId.id, \"SERVER_SCOPE\", attributesArray);\n" +
- "// } \n" +
- "// }\n" +
- "// \n" +
- "// function saveRelations(entityId) {\n" +
- "// var tasks = [];\n" +
- "// for (var i=0; i < vm.relations.length; i++) {\n" +
- "// var relation = {\n" +
- "// type: vm.relations[i].relationType\n" +
- "// };\n" +
- "// if (vm.relations[i].direction == types.entitySearchDirection.from) {\n" +
- "// relation.to = vm.relations[i].relatedEntity;\n" +
- "// relation.from = entityId;\n" +
- "// } else {\n" +
- "// relation.to = entityId;\n" +
- "// relation.from = vm.relations[i].relatedEntity;\n" +
- "// }\n" +
- "// tasks.push(entityRelationService.saveRelation(relation));\n" +
- "// }\n" +
- "// $q.all(tasks).then(function(){\n" +
- "// updateAliasData();\n" +
- "// });\n" +
- "// }\n" +
- "// \n" +
- "// function updateAliasData() {\n" +
- "// var aliasIds = [];\n" +
- "// for (var id in widgetContext.aliasController.resolvedAliases) {\n" +
- "// aliasIds.push(id);\n" +
- "// }\n" +
- "// var tasks = [];\n" +
- "// aliasIds.forEach(function(aliasId) {\n" +
- "// widgetContext.aliasController.setAliasUnresolved(aliasId);\n" +
- "// tasks.push(widgetContext.aliasController.getAliasInfo(aliasId));\n" +
- "// });\n" +
- "// $q.all(tasks).then(function() {\n" +
- "// $rootScope.$broadcast('widgetForceReInit');\n" +
- "// });\n" +
- "// }\n" +
- "//}\n";
-
- var sampleHtmlTemplate = '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n' +
- '\n';
-
- var sampleCss = '/*=======================================================================*/\n' +
- '/*========== There are two examples: for edit and add entity ==========*/\n' +
- '/*=======================================================================*/\n' +
- '/*======================== Edit entity example ========================*/\n' +
- '/*=======================================================================*/\n' +
- '/*\n' +
- '.edit-entity-form md-input-container {\n' +
- ' padding-right: 10px;\n' +
- '}\n' +
- '\n' +
- '.edit-entity-form .boolean-value-input {\n' +
- ' padding-left: 5px;\n' +
- '}\n' +
- '\n' +
- '.edit-entity-form .boolean-value-input .checkbox-label {\n' +
- ' margin-bottom: 8px;\n' +
- ' color: rgba(0,0,0,0.54);\n' +
- ' font-size: 12px;\n' +
- '}\n' +
- '\n' +
- '.relations-list .header {\n' +
- ' padding-right: 5px;\n' +
- ' padding-bottom: 5px;\n' +
- ' padding-left: 5px;\n' +
- '}\n' +
- '\n' +
- '.relations-list .header .cell {\n' +
- ' padding-right: 5px;\n' +
- ' padding-left: 5px;\n' +
- ' font-size: 12px;\n' +
- ' font-weight: 700;\n' +
- ' color: rgba(0, 0, 0, .54);\n' +
- ' white-space: nowrap;\n' +
- '}\n' +
- '\n' +
- '.relations-list .body {\n' +
- ' padding-right: 5px;\n' +
- ' padding-bottom: 15px;\n' +
- ' padding-left: 5px;\n' +
- '}\n' +
- '\n' +
- '.relations-list .body .row {\n' +
- ' padding-top: 5px;\n' +
- '}\n' +
- '\n' +
- '.relations-list .body .cell {\n' +
- ' padding-right: 5px;\n' +
- ' padding-left: 5px;\n' +
- '}\n' +
- '\n' +
- '.relations-list .body md-autocomplete-wrap md-input-container {\n' +
- ' height: 30px;\n' +
- '}\n' +
- '\n' +
- '.relations-list .body .md-button {\n' +
- ' margin: 0;\n' +
- '}\n' +
- '\n' +
- '.relations-list.old-relations tb-entity-select tb-entity-autocomplete button {\n' +
- ' display: none;\n' +
- '} \n' +
- '*/\n' +
- '/*========================================================================*/\n' +
- '/*========================= Add entity example =========================*/\n' +
- '/*========================================================================*/\n' +
- '/*\n' +
- '.add-entity-form md-input-container {\n' +
- ' padding-right: 10px;\n' +
- '}\n' +
- '\n' +
- '.add-entity-form .boolean-value-input {\n' +
- ' padding-left: 5px;\n' +
- '}\n' +
- '\n' +
- '.add-entity-form .boolean-value-input .checkbox-label {\n' +
- ' margin-bottom: 8px;\n' +
- ' color: rgba(0,0,0,0.54);\n' +
- ' font-size: 12px;\n' +
- '}\n' +
- '\n' +
- '.relations-list .header {\n' +
- ' padding-right: 5px;\n' +
- ' padding-bottom: 5px;\n' +
- ' padding-left: 5px;\n' +
- '}\n' +
- '\n' +
- '.relations-list .header .cell {\n' +
- ' padding-right: 5px;\n' +
- ' padding-left: 5px;\n' +
- ' font-size: 12px;\n' +
- ' font-weight: 700;\n' +
- ' color: rgba(0, 0, 0, .54);\n' +
- ' white-space: nowrap;\n' +
- '}\n' +
- '\n' +
- '.relations-list .body {\n' +
- ' padding-right: 5px;\n' +
- ' padding-bottom: 15px;\n' +
- ' padding-left: 5px;\n' +
- '}\n' +
- '\n' +
- '.relations-list .body .row {\n' +
- ' padding-top: 5px;\n' +
- '}\n' +
- '\n' +
- '.relations-list .body .cell {\n' +
- ' padding-right: 5px;\n' +
- ' padding-left: 5px;\n' +
- '}\n' +
- '\n' +
- '.relations-list .body md-autocomplete-wrap md-input-container {\n' +
- ' height: 30px;\n' +
- '}\n' +
- '\n' +
- '.relations-list .body .md-button {\n' +
- ' margin: 0;\n' +
- '}\n' +
- '*/\n';
-
- scope.$watch('action', function () {
- ngModelCtrl.$setViewValue(scope.action);
- });
-
- ngModelCtrl.$render = function () {
- scope.action = ngModelCtrl.$viewValue;
- if (angular.isUndefined(scope.action.customHtml) && angular.isUndefined(scope.action.customCss) && angular.isUndefined(scope.action.customFunction)) {
- scope.action.customFunction = sampleJsFunction;
- scope.action.customHtml = sampleHtmlTemplate;
- scope.action.customCss = sampleCss;
- }
- };
-
- function removeResource(index) {
- if (index > -1) {
- scope.action.customResources.splice(index, 1);
- scope.theForm.$setDirty();
- }
- }
-
- function addResource() {
- if (!scope.action.customResources) {
- scope.action.customResources = [];
- }
- scope.action.customResources.push({url: ''});
- scope.theForm.$setDirty();
- }
-
- function beautifyHtml() {
- var res = html_beautify(scope.action.customHtml, {indent_size: 4, wrap_line_length: 60});
- scope.action.customHtml = res;
- }
-
- function beautifyCss() {
- var res = css_beautify(scope.action.customCss, {indent_size: 4});
- scope.action.customCss = res;
- }
-
- function toggleFullscreen() {
- scope.fullscreen = !scope.fullscreen;
- if (scope.fullscreen) {
- scope.customActionEditorElement = angular.element('.tb-custom-action-editor');
- angular.element(scope.customActionEditorElement[0]).ready(function () {
- var w = scope.customActionEditorElement.width();
- if (w > 0) {
- initSplitLayout();
- } else {
- scope.$watch(
- function () {
- return scope.customActionEditorElement[0].offsetWidth || parseInt(scope.customActionEditorElement.css('width'), 10);
- },
- function (newSize) {
- if (newSize > 0) {
- initSplitLayout();
- }
- }
- );
- }
- });
- } else {
- scope.layoutInited = false;
- }
- }
-
- function onDividerDrag() {
- scope.$broadcast('update-ace-editor-size');
- for (var i = 0; i < ace_editors.length; i++) {
- var ace = ace_editors[i];
- ace.resize();
- ace.renderer.updateFull();
- }
- }
-
- function initSplitLayout() {
- if (!scope.layoutInited) {
- Split([angular.element('#left-panel', scope.customActionEditorElement)[0], angular.element('#right-panel', scope.customActionEditorElement)[0]], {
- sizes: [50, 50],
- gutterSize: 8,
- cursor: 'col-resize',
- onDrag: function () {
- onDividerDrag()
- }
- });
-
- onDividerDrag();
-
- scope.$applyAsync(function () {
- scope.layoutInited = true;
- var w = angular.element($window);
- $timeout(function () {
- w.triggerHandler('resize')
- });
- });
-
- }
- }
-
- $compile(element.contents())(scope);
- };
-
- return {
- restrict: "E",
- require: "^ngModel",
- scope: {
- theForm: '=?',
- },
- link: linker
- };
-}
diff --git a/ui/src/app/components/widget/action/custom-action-pretty-editor.scss b/ui/src/app/components/widget/action/custom-action-pretty-editor.scss
deleted file mode 100644
index fa6319b44a..0000000000
--- a/ui/src/app/components/widget/action/custom-action-pretty-editor.scss
+++ /dev/null
@@ -1,98 +0,0 @@
-/**
- * Copyright © 2016-2020 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-custom-action-pretty {
- box-sizing: border-box;
- padding: 8px;
- background-color: #fff;
-
- .tb-fullscreen-panel {
- .tb-custom-action-editor-container {
- height: calc(100% - 40px);
- }
-
- #right-panel {
- padding-top: 8px;
- padding-left: 3px;
- }
-
- tb-js-func .tb-js-func-panel {
- box-sizing: border-box;
- }
-
- md-tabs-content-wrapper,
- md-tab-content {
- height: 100%;
- }
- }
-
- .tb-split {
- box-sizing: border-box;
- overflow-x: hidden;
- overflow-y: auto;
- }
-
- .tb-content {
- border: 1px solid #c0c0c0;
- }
-
- .gutter {
- background-color: #eee;
- background-repeat: no-repeat;
- background-position: 50%;
- }
-
- .gutter.gutter-horizontal {
- cursor: col-resize;
- background-image: url("../../../../../node_modules/split.js/grips/vertical.png");
- }
-
- .tb-split.tb-split-horizontal,
- .gutter.gutter-horizontal {
- float: left;
- height: 100%;
- }
-
- .tb-action-expand-button {
- position: absolute;
- right: 14px;
- z-index: 1;
-
- &.tb-fullscreen-editor {
- position: relative;
- right: 0;
- }
-
- .md-button {
- min-width: auto;
- }
- }
-
- .tb-custom-action-editor {
- &.tb-fullscreen-editor {
- height: 100%;
- }
- }
-}
-
-.tb-custom-action-editor-container {
- .html-panel,
- .css-panel {
- width: 100%;
- min-width: 200px;
- height: 100%;
- min-height: 200px;
- }
-}
diff --git a/ui/src/app/components/widget/action/custom-action-pretty-editor.tpl.html b/ui/src/app/components/widget/action/custom-action-pretty-editor.tpl.html
deleted file mode 100644
index 79b0dd625c..0000000000
--- a/ui/src/app/components/widget/action/custom-action-pretty-editor.tpl.html
+++ /dev/null
@@ -1,186 +0,0 @@
-
-
-
-
-
- {{ 'widget.toggle-fullscreen' | translate }}
-
-
- fullscreen
-
-
- fullscreen_exit
-
- widget.toggle-fullscreen
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {{ 'widget.remove-resource' | translate }}
-
-
- close
-
-
-
-
-
-
- {{ 'widget.add-resource' | translate }}
-
- action.add
-
-
-
-
-
-
-
-
- {{ 'widget.tidy' | translate }}
-
-
-
-
-
-
-
-
-
- {{ 'widget.tidy' | translate }}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {{ 'widget.remove-resource' | translate }}
-
-
- close
-
-
-
-
-
-
- {{ 'widget.add-resource' | translate }}
-
- action.add
-
-
-
-
-
-
-
-
- {{ 'widget.tidy' | translate }}
-
-
-
-
-
-
-
-
-
- {{ 'widget.tidy' | translate }}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/ui/src/app/components/widget/action/manage-widget-actions.directive.js b/ui/src/app/components/widget/action/manage-widget-actions.directive.js
deleted file mode 100644
index 1d45f2ef82..0000000000
--- a/ui/src/app/components/widget/action/manage-widget-actions.directive.js
+++ /dev/null
@@ -1,298 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-/**
- * Created by igor on 6/20/17.
- */
-/*
- * Copyright © 2016-2017 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 './manage-widget-actions.scss';
-
-import thingsboardMaterialIconSelect from '../../material-icon-select.directive';
-
-import WidgetActionDialogController from './widget-action-dialog.controller';
-import CustomActionPrettyEditor from './custom-action-pretty-editor.directive';
-
-/* eslint-disable import/no-unresolved, import/default */
-
-import manageWidgetActionsTemplate from './manage-widget-actions.tpl.html';
-import widgetActionDialogTemplate from './widget-action-dialog.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-export default angular.module('thingsboard.directives.widgetActions', [thingsboardMaterialIconSelect, CustomActionPrettyEditor])
- .controller('WidgetActionDialogController', WidgetActionDialogController)
- .directive('tbManageWidgetActions', ManageWidgetActions)
- .name;
-
-/*@ngInject*/
-function ManageWidgetActions() {
- return {
- restrict: "E",
- scope: true,
- bindToController: {
- actionSources: '=',
- widgetActions: '=',
- fetchDashboardStates: '&',
- },
- controller: ManageWidgetActionsController,
- controllerAs: 'vm',
- templateUrl: manageWidgetActionsTemplate
- };
-}
-
-/* eslint-disable angular/angularelement */
-
-
-/*@ngInject*/
-function ManageWidgetActionsController($rootScope, $scope, $document, $mdDialog, $q, $filter,
- $translate, $timeout, utils, types) {
-
- let vm = this;
-
- vm.allActions = [];
-
- vm.actions = [];
- vm.actionsCount = 0;
-
- vm.query = {
- order: 'actionSourceName',
- limit: 10,
- page: 1,
- search: null
- };
-
- vm.enterFilterMode = enterFilterMode;
- vm.exitFilterMode = exitFilterMode;
- vm.onReorder = onReorder;
- vm.onPaginate = onPaginate;
- vm.addAction = addAction;
- vm.editAction = editAction;
- vm.deleteAction = deleteAction;
-
- $timeout(function(){
- $scope.manageWidgetActionsForm.querySearchInput.$pristine = false;
- });
-
- $scope.$watch('vm.widgetActions', function() {
- if (vm.widgetActions) {
- reloadActions();
- }
- });
-
- $scope.$watch("vm.query.search", function(newVal, prevVal) {
- if (!angular.equals(newVal, prevVal) && vm.query.search != null) {
- updateActions();
- }
- });
-
- function enterFilterMode (event) {
- let $button = angular.element(event.currentTarget);
- let $toolbarsContainer = $button.closest('.toolbarsContainer');
-
- vm.query.search = '';
-
- $timeout(()=>{
- $toolbarsContainer.find('.searchInput').focus();
- })
- }
-
- function exitFilterMode () {
- vm.query.search = null;
- updateActions();
- }
-
- function onReorder () {
- updateActions();
- }
-
- function onPaginate () {
- updateActions();
- }
-
- function addAction($event) {
- if ($event) {
- $event.stopPropagation();
- }
- openWidgetActionDialog($event, null, true);
- }
-
- function editAction ($event, action) {
- if ($event) {
- $event.stopPropagation();
- }
- openWidgetActionDialog($event, action, false);
- }
-
- function deleteAction($event, action) {
- if ($event) {
- $event.stopPropagation();
- }
- if (action) {
- var title = $translate.instant('widget-config.delete-action-title');
- var content = $translate.instant('widget-config.delete-action-text', {actionName: action.name});
- var confirm = $mdDialog.confirm()
- .targetEvent($event)
- .title(title)
- .htmlContent(content)
- .ariaLabel(title)
- .cancel($translate.instant('action.no'))
- .ok($translate.instant('action.yes'));
-
- confirm._options.multiple = true;
- confirm._options.fullscreen = true;
-
- $mdDialog.show(confirm).then(function () {
- var index = getActionIndex(action.id, vm.allActions);
- if (index > -1) {
- vm.allActions.splice(index, 1);
- }
- var targetActions = vm.widgetActions[action.actionSourceId];
- index = getActionIndex(action.id, targetActions);
- if (index > -1) {
- targetActions.splice(index, 1);
- }
- $scope.manageWidgetActionsForm.$setDirty();
- updateActions();
- });
- }
- }
-
- function openWidgetActionDialog($event, action, isAdd) {
- var prevActionId = null;
- if (!isAdd) {
- prevActionId = action.id;
- }
- var availableActionSources = {};
- for (var id in vm.actionSources) {
- var actionSource = vm.actionSources[id];
- if (actionSource.multiple) {
- availableActionSources[id] = actionSource;
- } else {
- if (!isAdd && action.actionSourceId == id) {
- availableActionSources[id] = actionSource;
- } else {
- var result = $filter('filter')(vm.allActions, {actionSourceId: id});
- if (!result || !result.length) {
- availableActionSources[id] = actionSource;
- }
- }
- }
- }
- $mdDialog.show({
- controller: 'WidgetActionDialogController',
- controllerAs: 'vm',
- templateUrl: widgetActionDialogTemplate,
- parent: angular.element($document[0].body),
- locals: {isAdd: isAdd, fetchDashboardStates: vm.fetchDashboardStates,
- actionSources: availableActionSources, widgetActions: vm.widgetActions,
- action: angular.copy(action)},
- multiple: true,
- fullscreen: true,
- targetEvent: $event
- }).then(function (action) {
- saveAction(action, prevActionId);
- updateActions();
- });
- }
-
- function getActionIndex(id, actions) {
- var result = $filter('filter')(actions, {id: id}, true);
- if (result && result.length) {
- return actions.indexOf(result[0]);
- }
- return -1;
- }
-
- function saveAction(action, prevActionId) {
- var actionSourceName = vm.actionSources[action.actionSourceId].name;
- action.actionSourceName = utils.customTranslation(actionSourceName, actionSourceName);
- action.typeName = $translate.instant(types.widgetActionTypes[action.type].name);
- var actionSourceId = action.actionSourceId;
- var widgetAction = angular.copy(action);
- delete widgetAction.actionSourceId;
- delete widgetAction.actionSourceName;
- delete widgetAction.typeName;
- var targetActions = vm.widgetActions[actionSourceId];
- if (!targetActions) {
- targetActions = [];
- vm.widgetActions[actionSourceId] = targetActions;
- }
- if (prevActionId) {
- const indexInTarget = getActionIndex(prevActionId, targetActions);
- const indexInAllActions = getActionIndex(prevActionId, vm.allActions);
- if (indexInTarget > -1) {
- targetActions[indexInTarget] = widgetAction;
- } else if (indexInAllActions > -1) {
- const prevActionSourceId = vm.allActions[indexInAllActions].actionSourceId;
- const index = getActionIndex(prevActionId,vm.widgetActions[prevActionSourceId]);
- vm.widgetActions[prevActionSourceId].splice(index,1);
- targetActions.push(widgetAction);
- }
- if (indexInAllActions > -1) {
- vm.allActions[indexInAllActions] = action;
- }
- } else {
- vm.allActions.push(action);
- targetActions.push(widgetAction);
- }
- $scope.manageWidgetActionsForm.$setDirty();
- }
-
- function reloadActions() {
- vm.allActions = [];
- vm.actions = [];
- vm.actionsCount = 0;
-
- for (var actionSourceId in vm.widgetActions) {
- var actionSource = vm.actionSources[actionSourceId];
- var actionSourceActions = vm.widgetActions[actionSourceId];
- for (var i=0;i
-
diff --git a/ui/src/app/components/widget/action/widget-action-dialog.controller.js b/ui/src/app/components/widget/action/widget-action-dialog.controller.js
deleted file mode 100644
index 0e0e4beaed..0000000000
--- a/ui/src/app/components/widget/action/widget-action-dialog.controller.js
+++ /dev/null
@@ -1,176 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-/*@ngInject*/
-export default function WidgetActionDialogController($scope, $mdDialog, $filter, $q, dashboardService, dashboardUtils, types, toast, utils,
- isAdd, fetchDashboardStates, actionSources, widgetActions, action) {
-
- var vm = this;
-
- vm.types = types;
-
- vm.isAdd = isAdd;
- vm.fetchDashboardStates = fetchDashboardStates;
- vm.actionSources = actionSources;
- vm.widgetActions = widgetActions;
-
- vm.targetDashboardStateSearchText = '';
-
- vm.selectedDashboardStateIds = [];
-
- if (vm.isAdd) {
- vm.action = {
- id: utils.guid()
- };
- } else {
- vm.action = action;
- }
-
- vm.actionSourceName = actionSourceName;
-
- vm.targetDashboardStateSearchTextChanged = function() {
- };
-
- vm.dashboardStateSearch = dashboardStateSearch;
- vm.cancel = cancel;
- vm.save = save;
-
- $scope.$watch("vm.action.name", function(newVal, prevVal) {
- if (!angular.equals(newVal, prevVal) && vm.action.name != null) {
- checkActionName();
- }
- });
-
- $scope.$watch("vm.action.actionSourceId", function(newVal, prevVal) {
- if (!angular.equals(newVal, prevVal) && vm.action.actionSourceId != null) {
- checkActionName();
- }
- });
-
- $scope.$watch("vm.action.targetDashboardId", function() {
- vm.selectedDashboardStateIds = [];
- if (vm.action.targetDashboardId) {
- dashboardService.getDashboard(vm.action.targetDashboardId).then(
- function success(dashboard) {
- dashboard = dashboardUtils.validateAndUpdateDashboard(dashboard);
- var states = dashboard.configuration.states;
- vm.selectedDashboardStateIds = Object.keys(states);
- }
- );
- }
- });
-
- $scope.$watch('vm.action.type', function(newType) {
- if (newType) {
- switch (newType) {
- case vm.types.widgetActionTypes.openDashboardState.value:
- case vm.types.widgetActionTypes.updateDashboardState.value:
- case vm.types.widgetActionTypes.openDashboard.value:
- if (angular.isUndefined(vm.action.setEntityId)) {
- vm.action.setEntityId = true;
- }
- break;
- }
- }
- });
-
- function checkActionName() {
- var actionNameIsUnique = true;
- if (vm.action.actionSourceId && vm.action.name) {
- var sourceActions = vm.widgetActions[vm.action.actionSourceId];
- if (sourceActions) {
- var result = $filter('filter')(sourceActions, {name: vm.action.name}, true);
- if (result && result.length && result[0].id !== vm.action.id) {
- actionNameIsUnique = false;
- }
- }
- }
- $scope.theForm.name.$setValidity('actionNameNotUnique', actionNameIsUnique);
- }
-
- function actionSourceName (actionSource) {
- if (actionSource) {
- return utils.customTranslation(actionSource.name, actionSource.name);
- } else {
- return '';
- }
- }
-
- function dashboardStateSearch (query) {
- if (vm.action.type == vm.types.widgetActionTypes.openDashboard.value) {
- var deferred = $q.defer();
- var result = query ? vm.selectedDashboardStateIds.filter(
- createFilterForDashboardState(query)) : vm.selectedDashboardStateIds;
- if (result && result.length) {
- deferred.resolve(result);
- } else {
- deferred.resolve([query]);
- }
- return deferred.promise;
- } else {
- return vm.fetchDashboardStates({query: query});
- }
- }
-
- function createFilterForDashboardState (query) {
- var lowercaseQuery = angular.lowercase(query);
- return function filterFn(stateId) {
- return (angular.lowercase(stateId).indexOf(lowercaseQuery) === 0);
- };
- }
-
- function cleanupAction(action) {
- var result = {};
- result.id = action.id;
- result.actionSourceId = action.actionSourceId;
- result.name = action.name;
- result.icon = action.icon;
- result.type = action.type;
- switch (action.type) {
- case vm.types.widgetActionTypes.openDashboardState.value:
- case vm.types.widgetActionTypes.updateDashboardState.value:
- result.targetDashboardStateId = action.targetDashboardStateId;
- result.openRightLayout = action.openRightLayout;
- result.setEntityId = action.setEntityId;
- result.stateEntityParamName = action.stateEntityParamName;
- break;
- case vm.types.widgetActionTypes.openDashboard.value:
- result.targetDashboardId = action.targetDashboardId;
- result.targetDashboardStateId = action.targetDashboardStateId;
- result.setEntityId = action.setEntityId;
- result.stateEntityParamName = action.stateEntityParamName;
- break;
- case vm.types.widgetActionTypes.custom.value:
- result.customFunction = action.customFunction;
- break;
- case vm.types.widgetActionTypes.customPretty.value:
- result.customResources = action.customResources;
- result.customHtml = action.customHtml;
- result.customCss = action.customCss;
- result.customFunction = action.customFunction;
- break;
- }
- return result;
- }
-
- function cancel() {
- $mdDialog.cancel();
- }
-
- function save() {
- $scope.theForm.$setPristine();
- $mdDialog.hide(cleanupAction(vm.action));
- }
-}
diff --git a/ui/src/app/components/widget/action/widget-action-dialog.tpl.html b/ui/src/app/components/widget/action/widget-action-dialog.tpl.html
deleted file mode 100644
index 831e423ea1..0000000000
--- a/ui/src/app/components/widget/action/widget-action-dialog.tpl.html
+++ /dev/null
@@ -1,142 +0,0 @@
-
-
-
-
diff --git a/ui/src/app/components/widget/widget-config.directive.js b/ui/src/app/components/widget/widget-config.directive.js
deleted file mode 100644
index a06fa5d9ba..0000000000
--- a/ui/src/app/components/widget/widget-config.directive.js
+++ /dev/null
@@ -1,524 +0,0 @@
-/*
- * Copyright © 2016-2020 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 thingsboardTypes from '../../common/types.constant';
-import thingsboardUtils from '../../common/utils.service';
-import thingsboardEntityAliasSelect from '../entity-alias-select.directive';
-import thingsboardDatasource from '../datasource.directive';
-import thingsboardTimewindow from '../timewindow.directive';
-import thingsboardLegendConfig from '../legend-config.directive';
-import thingsboardJsonForm from '../json-form.directive';
-import thingsboardManageWidgetActions from './action/manage-widget-actions.directive';
-import 'angular-ui-ace';
-
-import fixAceEditor from './../ace-editor-fix';
-
-import './widget-config.scss';
-
-/* eslint-disable import/no-unresolved, import/default */
-
-import widgetConfigTemplate from './widget-config.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-/* eslint-disable angular/angularelement */
-
-export default angular.module('thingsboard.directives.widgetConfig', [thingsboardTypes,
- thingsboardUtils,
- thingsboardJsonForm,
- thingsboardEntityAliasSelect,
- thingsboardDatasource,
- thingsboardTimewindow,
- thingsboardLegendConfig,
- thingsboardManageWidgetActions,
- 'ui.ace'])
- .directive('tbWidgetConfig', WidgetConfig)
- .name;
-
-/*@ngInject*/
-function WidgetConfig($compile, $templateCache, $rootScope, $translate, $timeout, types, utils) {
-
- var linker = function (scope, element, attrs, ngModelCtrl) {
-
- var template = $templateCache.get(widgetConfigTemplate);
-
- element.html(template);
-
- scope.types = types;
- scope.widgetEditMode = $rootScope.widgetEditMode;
-
- scope.emptySettingsSchema = {
- type: "object",
- properties: {}
- };
-
- scope.emptySettingsGroupInfoes=[];
- scope.defaultSettingsForm = [
- '*'
- ];
-
- scope.styleEditorOptions = {
- useWrapMode: true,
- mode: 'json',
- advanced: {
- enableSnippets: true,
- enableBasicAutocompletion: true,
- enableLiveAutocompletion: true
- },
- onLoad: function (_ace) {
- fixAceEditor(_ace);
- }
- };
-
- if (angular.isUndefined(scope.forceExpandDatasources)) {
- scope.forceExpandDatasources = false;
- }
-
- if (angular.isUndefined(scope.isDataEnabled)) {
- scope.isDataEnabled = true;
- }
-
- scope.currentSettingsSchema = {};
- scope.currentSettings = angular.copy(scope.emptySettingsSchema);
- scope.currentSettingsGroupInfoes = angular.copy(scope.emptySettingsGroupInfoes);
-
- scope.targetDeviceAlias = {
- value: null
- }
-
- scope.alarmSource = {
- value: null
- }
-
- ngModelCtrl.$render = function () {
- if (ngModelCtrl.$viewValue) {
- var config = ngModelCtrl.$viewValue.config;
- var layout = ngModelCtrl.$viewValue.layout;
- if (config) {
- scope.selectedTab = 0;
- scope.title = config.title;
- scope.showTitleIcon = angular.isDefined(config.showTitleIcon) ? config.showTitleIcon : false;
- scope.titleIcon = angular.isDefined(config.titleIcon) ? config.titleIcon : '';
- scope.iconColor = angular.isDefined(config.iconColor) ? config.iconColor : 'rgba(0, 0, 0, 0.87)';
- scope.iconSize = angular.isDefined(config.iconSize) ? config.iconSize : '24px';
- scope.titleTooltip = angular.isDefined(config.titleTooltip) ? config.titleTooltip : '';
- scope.showTitle = config.showTitle;
- scope.dropShadow = angular.isDefined(config.dropShadow) ? config.dropShadow : true;
- scope.enableFullscreen = angular.isDefined(config.enableFullscreen) ? config.enableFullscreen : true;
- scope.backgroundColor = config.backgroundColor;
- scope.color = config.color;
- scope.padding = config.padding;
- scope.margin = config.margin;
- scope.widgetStyle =
- angular.toJson(angular.isDefined(config.widgetStyle) ? config.widgetStyle : {}, true);
- scope.titleStyle =
- angular.toJson(angular.isDefined(config.titleStyle) ? config.titleStyle : {
- fontSize: '16px',
- fontWeight: 400
- }, true);
- scope.units = config.units;
- scope.decimals = config.decimals;
- scope.useDashboardTimewindow = angular.isDefined(config.useDashboardTimewindow) ?
- config.useDashboardTimewindow : true;
- scope.displayTimewindow = angular.isDefined(config.displayTimewindow) ?
- config.displayTimewindow : true;
- scope.timewindow = config.timewindow;
- scope.showLegend = angular.isDefined(config.showLegend) ?
- config.showLegend : scope.widgetType === types.widgetType.timeseries.value;
- scope.legendConfig = config.legendConfig;
- scope.actions = config.actions;
- if (!scope.actions) {
- scope.actions = {};
- }
- if (scope.widgetType !== types.widgetType.rpc.value &&
- scope.widgetType !== types.widgetType.alarm.value &&
- scope.widgetType !== types.widgetType.static.value
- && scope.isDataEnabled) {
- if (scope.datasources) {
- scope.datasources.splice(0, scope.datasources.length);
- } else {
- scope.datasources = [];
- }
- if (config.datasources) {
- for (var i = 0; i < config.datasources.length; i++) {
- scope.datasources.push({value: config.datasources[i]});
- }
- }
- } else if (scope.widgetType === types.widgetType.rpc.value && scope.isDataEnabled) {
- if (config.targetDeviceAliasIds && config.targetDeviceAliasIds.length > 0) {
- var aliasId = config.targetDeviceAliasIds[0];
- var entityAliases = scope.aliasController.getEntityAliases();
- if (entityAliases[aliasId]) {
- scope.targetDeviceAlias.value = entityAliases[aliasId];
- } else {
- scope.targetDeviceAlias.value = null;
- }
- } else {
- scope.targetDeviceAlias.value = null;
- }
- } else if (scope.widgetType === types.widgetType.alarm.value && scope.isDataEnabled) {
- scope.alarmSearchStatus = angular.isDefined(config.alarmSearchStatus) ?
- config.alarmSearchStatus : types.alarmSearchStatus.any;
- scope.alarmsPollingInterval = angular.isDefined(config.alarmsPollingInterval) ?
- config.alarmsPollingInterval : 5;
- scope.alarmsMaxCountLoad = angular.isDefined(config.alarmsMaxCountLoad) ?
- config.alarmsMaxCountLoad : 0;
- scope.alarmsFetchSize = angular.isDefined(config.alarmsFetchSize) ?
- config.alarmsFetchSize : 100;
- if (config.alarmSource) {
- scope.alarmSource.value = config.alarmSource;
- } else {
- scope.alarmSource.value = null;
- }
- }
-
- scope.settings = config.settings;
-
- scope.updateSchemaForm();
- }
- if (layout) {
- scope.mobileOrder = layout.mobileOrder;
- scope.mobileHeight = layout.mobileHeight;
- }
- }
- };
-
- scope.displayAdvanced = function() {
- return scope.widgetSettingsSchema && scope.widgetSettingsSchema.schema;
- }
-
- scope.updateSchemaForm = function() {
- if (scope.widgetSettingsSchema && scope.widgetSettingsSchema.schema) {
- scope.currentSettingsSchema = scope.widgetSettingsSchema.schema;
- scope.currentSettingsForm = scope.widgetSettingsSchema.form || angular.copy(scope.defaultSettingsForm);
- scope.currentSettingsGroupInfoes = scope.widgetSettingsSchema.groupInfoes;
- scope.currentSettings = scope.settings;
- } else {
- scope.currentSettingsForm = angular.copy(scope.defaultSettingsForm);
- scope.currentSettingsSchema = angular.copy(scope.emptySettingsSchema);
- scope.currentSettingsGroupInfoes = angular.copy(scope.emptySettingsGroupInfoes);
- scope.currentSettings = {};
- }
- }
-
- scope.updateValidity = function () {
- if (ngModelCtrl.$viewValue) {
- var value = ngModelCtrl.$viewValue;
- var config = value.config;
- if (config) {
- var valid;
- if (scope.widgetType === types.widgetType.rpc.value && scope.isDataEnabled) {
- valid = config && config.targetDeviceAliasIds && config.targetDeviceAliasIds.length > 0;
- ngModelCtrl.$setValidity('targetDeviceAliasIds', valid);
- } else if (scope.widgetType === types.widgetType.alarm.value && scope.isDataEnabled) {
- valid = config && config.alarmSource;
- ngModelCtrl.$setValidity('alarmSource', valid);
- } else if (scope.widgetType !== types.widgetType.static.value && scope.isDataEnabled) {
- valid = config && config.datasources && config.datasources.length > 0;
- ngModelCtrl.$setValidity('datasources', valid);
- }
- try {
- angular.fromJson(scope.widgetStyle);
- ngModelCtrl.$setValidity('widgetStyle', true);
- } catch (e) {
- ngModelCtrl.$setValidity('widgetStyle', false);
- }
- try {
- angular.fromJson(scope.titleStyle);
- ngModelCtrl.$setValidity('titleStyle', true);
- } catch (e) {
- ngModelCtrl.$setValidity('titleStyle', false);
- }
- }
- }
- };
-
- scope.$watch('title + showTitleIcon + titleIcon + iconColor + iconSize + titleTooltip + showTitle + dropShadow + enableFullscreen + backgroundColor + ' +
- 'color + padding + margin + widgetStyle + titleStyle + mobileOrder + mobileHeight + units + decimals + useDashboardTimewindow + ' +
- 'displayTimewindow + alarmSearchStatus + alarmsPollingInterval + alarmsMaxCountLoad + alarmsFetchSize + showLegend', function () {
- if (ngModelCtrl.$viewValue) {
- var value = ngModelCtrl.$viewValue;
- if (value.config) {
- var config = value.config;
- config.title = scope.title;
- config.showTitleIcon = scope.showTitleIcon;
- config.titleIcon = scope.titleIcon;
- config.iconColor = scope.iconColor;
- config.iconSize = scope.iconSize;
- config.titleTooltip = scope.titleTooltip;
- config.showTitle = scope.showTitle;
- config.dropShadow = scope.dropShadow;
- config.enableFullscreen = scope.enableFullscreen;
- config.backgroundColor = scope.backgroundColor;
- config.color = scope.color;
- config.padding = scope.padding;
- config.margin = scope.margin;
- try {
- config.widgetStyle = angular.fromJson(scope.widgetStyle);
- } catch (e) {
- config.widgetStyle = {};
- }
- try {
- config.titleStyle = angular.fromJson(scope.titleStyle);
- } catch (e) {
- config.titleStyle = {};
- }
- config.units = scope.units;
- config.decimals = scope.decimals;
- config.useDashboardTimewindow = scope.useDashboardTimewindow;
- config.displayTimewindow = scope.displayTimewindow;
- config.alarmSearchStatus = scope.alarmSearchStatus;
- config.alarmsPollingInterval = scope.alarmsPollingInterval;
- config.alarmsMaxCountLoad = scope.alarmsMaxCountLoad;
- config.alarmsFetchSize = scope.alarmsFetchSize;
- config.showLegend = scope.showLegend;
- }
- if (value.layout) {
- var layout = value.layout;
- layout.mobileOrder = angular.isNumber(scope.mobileOrder) ? scope.mobileOrder : undefined;
- layout.mobileHeight = scope.mobileHeight;
- }
- ngModelCtrl.$setViewValue(value);
- scope.updateValidity();
- }
- });
-
- scope.$watch('currentSettings', function () {
- if (ngModelCtrl.$viewValue) {
- var value = ngModelCtrl.$viewValue;
- if (value.config) {
- value.config.settings = scope.currentSettings;
- ngModelCtrl.$setViewValue(value);
- }
- }
- }, true);
-
- scope.$watch('timewindow', function () {
- if (ngModelCtrl.$viewValue) {
- var value = ngModelCtrl.$viewValue;
- if (value.config) {
- value.config.timewindow = scope.timewindow;
- ngModelCtrl.$setViewValue(value);
- }
- }
- }, true);
-
- scope.$watch('legendConfig', function () {
- if (ngModelCtrl.$viewValue) {
- var value = ngModelCtrl.$viewValue;
- if (value.config) {
- value.config.legendConfig = scope.legendConfig;
- ngModelCtrl.$setViewValue(value);
- }
- }
- }, true);
-
- scope.$watch('datasources', function () {
- if (ngModelCtrl.$viewValue && ngModelCtrl.$viewValue.config
- && scope.widgetType !== types.widgetType.rpc.value
- && scope.widgetType !== types.widgetType.alarm.value
- && scope.widgetType !== types.widgetType.static.value && scope.isDataEnabled) {
- var value = ngModelCtrl.$viewValue;
- var config = value.config;
- if (config.datasources) {
- config.datasources.splice(0, config.datasources.length);
- } else {
- config.datasources = [];
- }
- if (scope.datasources) {
- for (var i = 0; i < scope.datasources.length; i++) {
- config.datasources.push(scope.datasources[i].value);
- }
- }
- ngModelCtrl.$setViewValue(value);
- scope.updateValidity();
- }
- }, true);
-
- scope.$watch('targetDeviceAlias.value', function () {
- if (ngModelCtrl.$viewValue && ngModelCtrl.$viewValue.config && scope.widgetType === types.widgetType.rpc.value && scope.isDataEnabled) {
- var value = ngModelCtrl.$viewValue;
- var config = value.config;
- if (scope.targetDeviceAlias.value) {
- config.targetDeviceAliasIds = [scope.targetDeviceAlias.value.id];
- } else {
- config.targetDeviceAliasIds = [];
- }
- ngModelCtrl.$setViewValue(value);
- scope.updateValidity();
- }
- });
-
- scope.$watch('alarmSource.value', function () {
- if (ngModelCtrl.$viewValue && ngModelCtrl.$viewValue.config && scope.widgetType === types.widgetType.alarm.value && scope.isDataEnabled) {
- var value = ngModelCtrl.$viewValue;
- var config = value.config;
- if (scope.alarmSource.value) {
- config.alarmSource = scope.alarmSource.value;
- } else {
- config.alarmSource = null;
- }
- ngModelCtrl.$setViewValue(value);
- scope.updateValidity();
- }
- });
-
- scope.$watch('actions', function () {
- if (ngModelCtrl.$viewValue && ngModelCtrl.$viewValue.config) {
- var value = ngModelCtrl.$viewValue;
- var config = value.config;
- config.actions = scope.actions;
- ngModelCtrl.$setViewValue(value);
- scope.updateValidity();
- /*if (scope.theForm) {
- scope.theForm.$setDirty();
- }*/
- }
- }, true);
-
- scope.addDatasource = function () {
- var newDatasource;
- if (scope.functionsOnly) {
- newDatasource = angular.copy(utils.getDefaultDatasource(scope.datakeySettingsSchema.schema));
- newDatasource.dataKeys = [scope.generateDataKey('Sin', types.dataKeyType.function)];
- } else {
- newDatasource = { type: types.datasourceType.entity,
- dataKeys: []
- };
- }
- var datasource = {value: newDatasource};
- scope.datasources.push(datasource);
- if (scope.theForm) {
- scope.theForm.$setDirty();
- }
- }
-
- scope.removeDatasource = function ($event, datasource) {
- var index = scope.datasources.indexOf(datasource);
- if (index > -1) {
- scope.datasources.splice(index, 1);
- if (scope.theForm) {
- scope.theForm.$setDirty();
- }
- }
- };
-
- scope.generateDataKey = function (chip, type) {
-
- if (angular.isObject(chip)) {
- chip._hash = Math.random();
- return chip;
- }
-
- var label = chip;
- if (type === types.dataKeyType.alarm || type === types.dataKeyType.entityField) {
- var keyField = type === types.dataKeyType.alarm ? types.alarmFields[chip] : types.entityField[chip];
- if (keyField) {
- label = $translate.instant(keyField.name)+'';
- }
- }
- label = scope.genNextLabel(label);
-
- var result = {
- name: chip,
- type: type,
- label: label,
- color: scope.genNextColor(),
- settings: {},
- _hash: Math.random()
- };
-
- if (type === types.dataKeyType.function) {
- result.name = 'f(x)';
- result.funcBody = utils.getPredefinedFunctionBody(chip);
- if (!result.funcBody) {
- result.funcBody = "return prevValue + 1;";
- }
- }
-
- if (angular.isDefined(scope.datakeySettingsSchema.schema)) {
- result.settings = utils.generateObjectFromJsonSchema(scope.datakeySettingsSchema.schema);
- }
-
- return result;
- };
-
- scope.genNextLabel = function (name) {
- var label = name;
- var value = ngModelCtrl.$viewValue;
- var i = 1;
- var matches = false;
- do {
- matches = false;
- var datasources = scope.widgetType == types.widgetType.alarm.value ? [value.config.alarmSource] : value.config.datasources;
- if (datasources) {
- for (var d=0;d div {
- height: 100%;
- }
-
- .tb-advanced-widget-config {
- height: 100%;
- }
-}
diff --git a/ui/src/app/components/widget/widget-config.tpl.html b/ui/src/app/components/widget/widget-config.tpl.html
deleted file mode 100644
index 1cce70138f..0000000000
--- a/ui/src/app/components/widget/widget-config.tpl.html
+++ /dev/null
@@ -1,363 +0,0 @@
-
-
-
-
-
-
- {{ 'widget-config.use-dashboard-timewindow' | translate }}
-
- {{ 'widget-config.display-timewindow' | translate }}
-
-
-
- widget-config.timewindow
-
-
-
-
-
-
-
-
-
- {{ ('alarm.search-status.' + searchStatus) | translate }}
-
-
-
-
-
-
-
-
alarm.polling-interval-required
-
alarm.min-polling-interval-message
-
-
-
-
-
-
-
-
-
alarm.max-count-load-required
-
alarm.max-count-load-error-min
-
-
-
-
-
-
-
alarm.fetch-size-required
-
alarm.fetch-size-error-min
-
-
-
-
-
-
-
-
-
{{ 'widget-config.datasources' | translate }}
-
-
-
-
-
- datasource.add-datasource-prompt
-
-
-
-
-
- widget-config.datasource-type
- widget-config.datasource-parameters
-
-
-
-
-
-
{{$index + 1}}.
-
-
-
-
- {{ 'widget-config.remove-datasource' | translate }}
-
-
- close
-
-
-
-
-
-
-
-
-
- {{ 'widget-config.add-datasource' | translate }}
-
- add
- action.add
-
-
-
-
-
-
-
-
- {{ 'widget-config.target-device' | translate }}
-
-
-
-
-
-
-
-
-
-
- {{ 'widget-config.alarm-source' | translate }}
-
-
-
-
-
-
-
-
-
-
-
- widget-config.general-settings
-
-
-
-
-
-
-
-
-
-
-
-
-
- {{ 'widget-config.display-icon' | translate }}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {{ 'widget-config.display-title' | translate }}
-
-
-
- {{ 'widget-config.drop-shadow' | translate }}
-
-
-
- {{ 'widget-config.enable-fullscreen' | translate }}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {{ 'widget-config.display-legend' | translate }}
-
-
-
- widget-config.mobile-mode-settings
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/ui/src/app/components/widget/widget.controller.js b/ui/src/app/components/widget/widget.controller.js
deleted file mode 100644
index 83225edcc2..0000000000
--- a/ui/src/app/components/widget/widget.controller.js
+++ /dev/null
@@ -1,1074 +0,0 @@
-/*
- * Copyright © 2016-2020 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 $ from 'jquery';
-import 'javascript-detect-element-resize/detect-element-resize';
-import Subscription from '../../api/subscription';
-
-import 'oclazyload';
-import cssjs from '../../../vendor/css.js/css';
-
-/* eslint-disable angular/angularelement */
-
-/*@ngInject*/
-export default function WidgetController($scope, $state, $timeout, $window, $ocLazyLoad, $element, $q, $log, $injector, $filter, $compile, tbRaf, types, utils, timeService,
- datasourceService, alarmService, entityService, dashboardService, deviceService, visibleRect, isEdit, isMobile, dashboardTimewindow,
- dashboardTimewindowApi, dashboard, widget, aliasController, stateController, widgetInfo, widgetType, toast) {
-
- var vm = this;
-
- $scope.$timeout = $timeout;
- $scope.$q = $q;
- $scope.$injector = $injector;
- $scope.tbRaf = tbRaf;
-
- $scope.rpcRejection = null;
- $scope.rpcErrorText = null;
- $scope.rpcEnabled = false;
- $scope.executingRpcRequest = false;
-
- vm.dashboardTimewindow = dashboardTimewindow;
-
- $window.lazyLoad = $ocLazyLoad;
- $window.cssjs = cssjs;
-
- var cssParser = new cssjs();
- cssParser.testMode = false;
-
- var gridsterItemInited = false;
- var subscriptionInited = false;
- var widgetSizeDetected = false;
-
- var cafs = {};
-
- var actionDescriptorsBySourceId = {};
- if (widget.config.actions) {
- for (var actionSourceId in widget.config.actions) {
- var descriptors = widget.config.actions[actionSourceId];
- var actionDescriptors = [];
- descriptors.forEach(function(descriptor) {
- var actionDescriptor = angular.copy(descriptor);
- actionDescriptor.displayName = utils.customTranslation(descriptor.name, descriptor.name);
- actionDescriptors.push(actionDescriptor);
- });
- actionDescriptorsBySourceId[actionSourceId] = actionDescriptors;
- }
- }
-
- var widgetContext = {
- inited: false,
- $container: null,
- $containerParent: null,
- width: 0,
- height: 0,
- hideTitlePanel: false,
- isEdit: isEdit,
- isMobile: isMobile,
- dashboard: dashboard,
- widgetConfig: widget.config,
- settings: widget.config.settings,
- units: widget.config.units || '',
- decimals: angular.isDefined(widget.config.decimals) ? widget.config.decimals : 2,
- subscriptions: {},
- defaultSubscription: null,
- dashboardTimewindow: dashboardTimewindow,
- timewindowFunctions: {
- onUpdateTimewindow: function(startTimeMs, endTimeMs, interval) {
- if (widgetContext.defaultSubscription) {
- widgetContext.defaultSubscription.onUpdateTimewindow(startTimeMs, endTimeMs, interval);
- }
- },
- onResetTimewindow: function() {
- if (widgetContext.defaultSubscription) {
- widgetContext.defaultSubscription.onResetTimewindow();
- }
- }
- },
- subscriptionApi: {
- createSubscription: function(options, subscribe) {
- return createSubscription(options, subscribe);
- },
- createSubscriptionFromInfo: function (type, subscriptionsInfo, options, useDefaultComponents, subscribe) {
- return createSubscriptionFromInfo(type, subscriptionsInfo, options, useDefaultComponents, subscribe);
- },
- removeSubscription: function(id) {
- var subscription = widgetContext.subscriptions[id];
- if (subscription) {
- subscription.destroy();
- delete widgetContext.subscriptions[id];
- }
- }
- },
- controlApi: {
- sendOneWayCommand: function(method, params, timeout) {
- if (widgetContext.defaultSubscription) {
- return widgetContext.defaultSubscription.sendOneWayCommand(method, params, timeout);
- }
- return null;
- },
- sendTwoWayCommand: function(method, params, timeout) {
- if (widgetContext.defaultSubscription) {
- return widgetContext.defaultSubscription.sendTwoWayCommand(method, params, timeout);
- }
- return null;
- }
- },
- utils: {
- formatValue: formatValue
- },
- actionsApi: {
- actionDescriptorsBySourceId: actionDescriptorsBySourceId,
- getActionDescriptors: getActionDescriptors,
- handleWidgetAction: handleWidgetAction,
- elementClick: elementClick,
- getActiveEntityInfo: getActiveEntityInfo
- },
- stateController: stateController,
- aliasController: aliasController
- };
-
- widgetContext.customHeaderActions = [];
- var headerActionsDescriptors = getActionDescriptors(types.widgetActionSources.headerButton.value);
- for (var i=0;i 0) {
- try {
- if (!additionalParams) {
- additionalParams = {};
- }
- var customActionFunction = new Function('$event', 'widgetContext', 'entityId', 'entityName', 'additionalParams', customFunction);
- customActionFunction($event, widgetContext, entityId, entityName, additionalParams);
- } catch (e) {
- //
- }
- }
- break;
- case types.widgetActionTypes.customPretty.value:
- var customPrettyFunction = descriptor.customFunction;
- var customHtml = descriptor.customHtml;
- var customCss = descriptor.customCss;
- var customResources = descriptor.customResources;
- var actionNamespace = 'custom-action-pretty-'+descriptor.name.toLowerCase();
- var htmlTemplate = '';
- if (angular.isDefined(customHtml) && customHtml.length > 0) {
- htmlTemplate = customHtml;
- }
- loadCustomActionResources(actionNamespace, customCss, customResources).then(
- function success() {
- if (angular.isDefined(customPrettyFunction) && customPrettyFunction.length > 0) {
- try {
- if (!additionalParams) {
- additionalParams = {};
- }
- var customActionPrettyFunction = new Function('$event', 'widgetContext', 'entityId', 'entityName', 'htmlTemplate', 'additionalParams', customPrettyFunction);
- customActionPrettyFunction($event, widgetContext, entityId, entityName, htmlTemplate, additionalParams);
- } catch (e) {
- //
- }
- }
- },
- function fail(errorMessages) {
- processResourcesLoadErrors(errorMessages);
- }
- );
- break;
- }
- }
-
- function loadCustomActionResources(actionNamespace, customCss, customResources) {
- var deferred = $q.defer();
-
- if (angular.isDefined(customCss) && customCss.length > 0) {
- cssParser.cssPreviewNamespace = actionNamespace;
- cssParser.createStyleElement(actionNamespace, customCss, 'nonamespace');
- }
-
- function loadNextOrComplete(i) {
- i++;
- if (i < customResources.length) {
- loadNext(i);
- } else {
- if (errors.length > 0) {
- deferred.reject(errors);
- } else {
- deferred.resolve();
- }
- }
- }
-
- function loadNext(i) {
- var resourceUrl = customResources[i].url;
- if (resourceUrl && resourceUrl.length > 0) {
- $ocLazyLoad.load(resourceUrl).then(
- function success () {
- loadNextOrComplete(i);
- },
- function fail() {
- errors.push('Failed to load custom action resource: \'' + resourceUrl + '\'');
- loadNextOrComplete(i);
- }
- );
- } else {
- loadNextOrComplete(i);
- }
- }
-
- if (angular.isDefined(customResources) && customResources.length > 0) {
- var errors = [];
- loadNext(0);
- } else {
- deferred.resolve();
- }
-
- return deferred.promise;
- }
-
- function processResourcesLoadErrors(errorMessages) {
- var messageToShow = '';
- for (var e in errorMessages) {
- var error = errorMessages[e];
- messageToShow += '' + error + '
';
- }
- toast.showError(messageToShow);
- }
-
- function getActiveEntityInfo() {
- var entityInfo = widgetContext.activeEntityInfo;
- if (!entityInfo) {
- for (var id in widgetContext.subscriptions) {
- var subscription = widgetContext.subscriptions[id];
- entityInfo = subscription.getFirstEntityInfo();
- if (entityInfo) {
- break;
- }
- }
- }
- return entityInfo;
- }
-
- function configureWidgetElement() {
-
- $scope.displayLegend = angular.isDefined(widget.config.showLegend) ?
- widget.config.showLegend : widget.type === types.widgetType.timeseries.value;
-
- if ($scope.displayLegend) {
- $scope.legendConfig = widget.config.legendConfig ||
- {
- position: types.position.bottom.value,
- showMin: false,
- showMax: false,
- showAvg: widget.type === types.widgetType.timeseries.value,
- showTotal: false
- };
- $scope.legendData = {
- keys: [],
- data: []
- };
- }
-
- var html = '' +
- 'Widget Error: {{ widgetErrorData.name + ": " + widgetErrorData.message}}' +
- '
' +
- '' +
- '' +
- '
';
-
- var containerHtml = '' + widgetInfo.templateHtml + '
';
- if ($scope.displayLegend) {
- var layoutType;
- if ($scope.legendConfig.position === types.position.top.value ||
- $scope.legendConfig.position === types.position.bottom.value) {
- layoutType = 'column';
- } else {
- layoutType = 'row';
- }
-
- var legendStyle;
- switch($scope.legendConfig.position) {
- case types.position.top.value:
- legendStyle = 'padding-bottom: 8px; max-height: 50%; overflow-y: auto;';
- break;
- case types.position.bottom.value:
- legendStyle = 'padding-top: 8px; max-height: 50%; overflow-y: auto;';
- break;
- case types.position.left.value:
- legendStyle = 'padding-right: 0px; max-width: 50%; overflow-y: auto;';
- break;
- case types.position.right.value:
- legendStyle = 'padding-left: 0px; max-width: 50%; overflow-y: auto;';
- break;
- }
-
- var legendHtml = '';
- containerHtml = '' + containerHtml + '
';
- html += '';
- if ($scope.legendConfig.position === types.position.top.value ||
- $scope.legendConfig.position === types.position.left.value) {
- html += legendHtml;
- html += containerHtml;
- } else {
- html += containerHtml;
- html += legendHtml;
- }
- html += '
';
- } else {
- html += containerHtml;
- }
-
- //TODO:
- /*if (progressElement) {
- progressScope.$destroy();
- progressScope = null;
-
- progressElement.remove();
- progressElement = null;
- }*/
-
- $element.html(html);
-
- var containerElement = $scope.displayLegend ? angular.element($element[0].querySelector('#widget-container')) : $element;
- widgetContext.$container = $('#container', containerElement);
- widgetContext.$containerParent = $(containerElement);
-
- if (widgetSizeDetected) {
- widgetContext.$container.css('height', widgetContext.height + 'px');
- widgetContext.$container.css('width', widgetContext.width + 'px');
- }
-
- widgetContext.$scope = $scope.$new();
-
- $compile($element.contents())(widgetContext.$scope);
-
- addResizeListener(widgetContext.$containerParent[0], onResize); // eslint-disable-line no-undef
- }
-
- function destroyWidgetElement() {
- removeResizeListener(widgetContext.$containerParent[0], onResize); // eslint-disable-line no-undef
- $element.html('');
- if (widgetContext.$scope) {
- widgetContext.$scope.$destroy();
- }
- widgetContext.$container = null;
- widgetContext.$containerParent = null;
- }
-
- function initialize() {
-
- $scope.$on('toggleDashboardEditMode', function (event, isEdit) {
- onEditModeChanged(isEdit);
- });
-
- $scope.$watch(function () {
- return widget.row + ',' + widget.col + ',' + widget.config.mobileOrder;
- }, function () {
- //updateBounds();
- $scope.$emit("widgetPositionChanged", widget);
- });
-
- $scope.$on('gridster-item-resized', function (event, item) {
- if (!widgetContext.isMobile) {
- widget.sizeX = item.sizeX;
- widget.sizeY = item.sizeY;
- }
- });
-
- $scope.$on('mobileModeChanged', function (event, newIsMobile) {
- onMobileModeChanged(newIsMobile);
- });
-
- $scope.$on('entityAliasesChanged', function (event, aliasIds) {
- var subscriptionChanged = false;
- for (var id in widgetContext.subscriptions) {
- var subscription = widgetContext.subscriptions[id];
- subscriptionChanged = subscriptionChanged || subscription.onAliasesChanged(aliasIds);
- }
- if (subscriptionChanged && !vm.typeParameters.useCustomDatasources) {
- reInit();
- }
- });
-
- $scope.$on('dashboardTimewindowChanged', function (event, newDashboardTimewindow) {
- vm.dashboardTimewindow = newDashboardTimewindow;
- widgetContext.dashboardTimewindow = newDashboardTimewindow;
- });
-
- $scope.$on('widgetForceReInit', function () {
- reInit();
- });
-
- $scope.$on("$destroy", function () {
- onDestroy();
- });
-
- configureWidgetElement();
- var deferred = $q.defer();
- if (!vm.typeParameters.useCustomDatasources) {
- createDefaultSubscription().then(
- function success() {
- subscriptionInited = true;
- deferred.resolve();
- },
- function fail() {
- subscriptionInited = true;
- deferred.reject();
- }
- );
- } else {
- $scope.loadingData = false;
- subscriptionInited = true;
- deferred.resolve();
- }
- return deferred.promise;
- }
-
- function reInit() {
- onDestroy();
- configureWidgetElement();
- if (!vm.typeParameters.useCustomDatasources) {
- createDefaultSubscription().then(
- function success() {
- subscriptionInited = true;
- onInit();
- },
- function fail() {
- subscriptionInited = true;
- onInit();
- }
- );
- } else {
- subscriptionInited = true;
- onInit();
- }
- }
-
- function handleWidgetException(e) {
- $log.error(e);
- $scope.widgetErrorData = utils.processWidgetException(e);
- }
-
- function isReady() {
- return subscriptionInited && gridsterItemInited && widgetSizeDetected;
- }
-
- function onInit(skipSizeCheck) {
- if (!widgetContext.$containerParent) {
- return;
- }
- if (!skipSizeCheck) {
- checkSize();
- }
- if (!widgetContext.inited && isReady()) {
- widgetContext.inited = true;
- try {
- if (displayWidgetInstance()) {
- widgetTypeInstance.onInit();
- } else {
- $scope.loadingData = false;
- }
- } catch (e) {
- handleWidgetException(e);
- }
- if (!vm.typeParameters.useCustomDatasources && widgetContext.defaultSubscription) {
- widgetContext.defaultSubscription.subscribe();
- }
- }
- }
-
- function checkSize() {
- var width = widgetContext.$containerParent.width();
- var height = widgetContext.$containerParent.height();
- var sizeChanged = false;
-
- if (!widgetContext.width || widgetContext.width != width || !widgetContext.height || widgetContext.height != height) {
- if (width > 0 && height > 0) {
- widgetContext.$container.css('height', height + 'px');
- widgetContext.$container.css('width', width + 'px');
- widgetContext.width = width;
- widgetContext.height = height;
- sizeChanged = true;
- widgetSizeDetected = true;
- }
- }
- return sizeChanged;
- }
-
- function onResize() {
- if (checkSize()) {
- if (widgetContext.inited) {
- if (cafs['resize']) {
- cafs['resize']();
- cafs['resize'] = null;
- }
- cafs['resize'] = tbRaf(function() {
- try {
- if (displayWidgetInstance()) {
- widgetTypeInstance.onResize();
- }
- } catch (e) {
- handleWidgetException(e);
- }
- });
- } else {
- onInit(true);
- }
- }
- }
-
- function gridsterItemInitialized(item) {
- if (item && item.gridster) {
- gridsterItemInited = true;
- onInit();
- // gridsterItemElement = $(item.$element);
- //updateVisibility();
- }
- }
-
- function onEditModeChanged(isEdit) {
- if (widgetContext.isEdit != isEdit) {
- widgetContext.isEdit = isEdit;
- if (widgetContext.inited) {
- if (cafs['editMode']) {
- cafs['editMode']();
- cafs['editMode'] = null;
- }
- cafs['editMode'] = tbRaf(function() {
- try {
- if (displayWidgetInstance()) {
- widgetTypeInstance.onEditModeChanged();
- }
- } catch (e) {
- handleWidgetException(e);
- }
- });
- }
- }
- }
-
- function onMobileModeChanged(isMobile) {
- if (widgetContext.isMobile != isMobile) {
- widgetContext.isMobile = isMobile;
- if (widgetContext.inited) {
- if (cafs['mobileMode']) {
- cafs['mobileMode']();
- cafs['mobileMode'] = null;
- }
- cafs['mobileMode'] = tbRaf(function() {
- try {
- if (displayWidgetInstance()) {
- widgetTypeInstance.onMobileModeChanged();
- }
- } catch (e) {
- handleWidgetException(e);
- }
- });
- }
- }
- }
-
- function isNumeric(val) {
- return (val - parseFloat( val ) + 1) >= 0;
- }
-
- function formatValue(value, dec, units, showZeroDecimals) {
- if (angular.isDefined(value) &&
- value !== null && isNumeric(value)) {
- var formatted = Number(value);
- if (angular.isDefined(dec)) {
- formatted = formatted.toFixed(dec);
- }
- if (!showZeroDecimals) {
- formatted = (formatted * 1);
- }
- formatted = formatted.toString();
- if (angular.isDefined(units) && units.length > 0) {
- formatted += ' ' + units;
- }
- return formatted;
- } else {
- return value;
- }
- }
-
- function displayWidgetInstance() {
- if (widget.type !== types.widgetType.static.value) {
- for (var id in widgetContext.subscriptions) {
- if (widgetContext.subscriptions[id].isDataResolved()) {
- return true;
- }
- }
- return false;
- } else {
- return true;
- }
- }
-
- function onDestroy() {
- var shouldDestroyWidgetInstance = displayWidgetInstance();
- for (var id in widgetContext.subscriptions) {
- var subscription = widgetContext.subscriptions[id];
- subscription.destroy();
- }
- subscriptionInited = false;
- widgetContext.subscriptions = {};
- if (widgetContext.inited) {
- widgetContext.inited = false;
- for (var cafId in cafs) {
- if (cafs[cafId]) {
- cafs[cafId]();
- cafs[cafId] = null;
- }
- }
- try {
- if (shouldDestroyWidgetInstance) {
- widgetTypeInstance.onDestroy();
- }
- } catch (e) {
- handleWidgetException(e);
- }
- }
- destroyWidgetElement();
- }
-
- //TODO: widgets visibility
- /*function updateVisibility(forceRedraw) {
- if (visibleRect) {
- forceRedraw = forceRedraw || visibleRect.containerResized;
- var newVisible = false;
- if (visibleRect.isMobile && gridsterItemElement) {
- var topPx = gridsterItemElement.position().top;
- var bottomPx = topPx + widget.sizeY * visibleRect.curRowHeight;
- newVisible = !(topPx > visibleRect.bottomPx ||
- bottomPx < visibleRect.topPx);
- } else {
- newVisible = !(bounds.left > visibleRect.right ||
- bounds.right < visibleRect.left ||
- bounds.top > visibleRect.bottom ||
- bounds.bottom < visibleRect.top);
- }
- if (visible != newVisible) {
- visible = newVisible;
- if (visible) {
- onRedraw(50);
- }
- } else if (forceRedraw && visible) {
- onRedraw(50);
- }
- }
- }*/
-
-/* function updateBounds() {
- bounds = {
- top: widget.row,
- left: widget.col,
- bottom: widget.row + widget.sizeY,
- right: widget.col + widget.sizeX
- };
- updateVisibility(true);
- onRedraw();
- }*/
-
-}
-
-/* eslint-enable angular/angularelement */
diff --git a/ui/src/app/components/widget/widget.directive.js b/ui/src/app/components/widget/widget.directive.js
deleted file mode 100644
index c4caf61971..0000000000
--- a/ui/src/app/components/widget/widget.directive.js
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * Copyright © 2016-2020 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 './widget.scss';
-
-import thingsboardLegend from '../legend.directive';
-import thingsboardTypes from '../../common/types.constant';
-import thingsboardApiDatasource from '../../api/datasource.service';
-
-import WidgetController from './widget.controller';
-
-export default angular.module('thingsboard.directives.widget', [thingsboardLegend, thingsboardTypes, thingsboardApiDatasource])
- .controller('WidgetController', WidgetController)
- .directive('tbWidget', Widget)
- .name;
-
-/*@ngInject*/
-function Widget($controller, widgetService) {
- return {
- scope: true,
- link: function (scope, elem, attrs) {
-
- var locals = scope.$eval(attrs.locals);
- var widget = locals.widget;
-
- var widgetController;
- var gridsterItem;
-
- //TODO: widgets visibility
- /*scope.$on('visibleRectChanged', function (event, newVisibleRect) {
- locals.visibleRect = newVisibleRect;
- if (widgetController) {
- widgetController.visibleRectChanged(newVisibleRect);
- }
- });*/
-
- scope.$on('gridster-item-initialized', function (event, item) {
- gridsterItem = item;
- if (widgetController) {
- widgetController.gridsterItemInitialized(gridsterItem);
- }
- });
-
- //TODO:
- //elem.html('' +
- // ' ' +
- // '
');
-
- //var progressElement = angular.element(elem[0].querySelector('#progress-cover'));
- //var progressScope = scope.$new();
- //$compile(elem.contents())(progressScope);
-
- widgetService.getWidgetInfo(widget.bundleAlias, widget.typeAlias, widget.isSystemType).then(
- function(widgetInfo) {
- loadFromWidgetInfo(widgetInfo);
- }
- );
-
- function loadFromWidgetInfo(widgetInfo) {
-
- scope.loadingData = true;
-
- elem.addClass("tb-widget");
-
- var widgetNamespace = "widget-type-" + (widget.isSystemType ? 'sys-' : '')
- + widget.bundleAlias + '-'
- + widget.typeAlias;
-
- elem.addClass(widgetNamespace);
-
- var widgetType = widgetService.getWidgetTypeFunction(widget.bundleAlias, widget.typeAlias, widget.isSystemType);
-
- angular.extend(locals, {$scope: scope, $element: elem, widgetInfo: widgetInfo, widgetType: widgetType});
-
- widgetController = $controller('WidgetController', locals);
-
- if (gridsterItem) {
- widgetController.gridsterItemInitialized(gridsterItem);
- }
- }
- }
- };
-}
diff --git a/ui/src/app/components/widget/widget.scss b/ui/src/app/components/widget/widget.scss
deleted file mode 100644
index 71a44b2c82..0000000000
--- a/ui/src/app/components/widget/widget.scss
+++ /dev/null
@@ -1,32 +0,0 @@
-/**
- * Copyright © 2016-2020 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-widget {
- .tb-widget-error {
- display: flex;
- align-items: center;
- justify-content: center;
- background: rgba(255, 255, 255, .5);
-
- span {
- color: #f00;
- }
- }
-
- .tb-widget-loading {
- z-index: 3;
- background: rgba(255, 255, 255, .15);
- }
-}
diff --git a/ui/src/app/components/widgets-bundle-select.directive.js b/ui/src/app/components/widgets-bundle-select.directive.js
deleted file mode 100644
index 67c01a1000..0000000000
--- a/ui/src/app/components/widgets-bundle-select.directive.js
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- * Copyright © 2016-2020 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 './widgets-bundle-select.scss';
-
-import thingsboardApiWidget from '../api/widget.service';
-
-/* eslint-disable import/no-unresolved, import/default */
-
-import widgetsBundleSelectTemplate from './widgets-bundle-select.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-
-export default angular.module('thingsboard.directives.widgetsBundleSelect', [thingsboardApiWidget])
- .directive('tbWidgetsBundleSelect', WidgetsBundleSelect)
- .name;
-
-/*@ngInject*/
-function WidgetsBundleSelect($compile, $templateCache, widgetService, types) {
-
- var linker = function (scope, element, attrs, ngModelCtrl) {
- var template = $templateCache.get(widgetsBundleSelectTemplate);
- element.html(template);
-
- scope.tbRequired = angular.isDefined(scope.tbRequired) ? scope.tbRequired : false;
- scope.widgetsBundle = null;
- scope.widgetsBundles = [];
-
- var widgetsBundleFetchFunction = widgetService.getAllWidgetsBundles;
- if (angular.isDefined(scope.bundlesScope)) {
- if (scope.bundlesScope === 'system') {
- widgetsBundleFetchFunction = widgetService.getSystemWidgetsBundles;
- } else if (scope.bundlesScope === 'tenant') {
- widgetsBundleFetchFunction = widgetService.getTenantWidgetsBundles;
- }
- }
-
- widgetsBundleFetchFunction({ignoreLoading: true}).then(
- function success(widgetsBundles) {
- scope.widgetsBundles = widgetsBundles;
- if (scope.selectFirstBundle) {
- if (widgetsBundles.length > 0) {
- scope.widgetsBundle = widgetsBundles[0];
- }
- } else if (angular.isDefined(scope.selectBundleAlias)) {
- selectWidgetsBundleByAlias(scope.selectBundleAlias);
- }
- },
- function fail() {
- }
- );
-
- function selectWidgetsBundleByAlias(alias) {
- if (scope.widgetsBundles && alias) {
- for (var w in scope.widgetsBundles) {
- var widgetsBundle = scope.widgetsBundles[w];
- if (widgetsBundle.alias === alias) {
- scope.widgetsBundle = widgetsBundle;
- break;
- }
- }
- }
- }
-
- scope.isSystem = function(item) {
- return item && item.tenantId.id === types.id.nullUid;
- }
-
- scope.updateView = function () {
- ngModelCtrl.$setViewValue(scope.widgetsBundle);
- }
-
- ngModelCtrl.$render = function () {
- if (ngModelCtrl.$viewValue) {
- scope.widgetsBundle = ngModelCtrl.$viewValue;
- }
- }
-
- scope.$watch('widgetsBundle', function () {
- scope.updateView();
- });
-
- scope.$watch('selectBundleAlias', function (newVal, prevVal) {
- if (newVal !== prevVal) {
- selectWidgetsBundleByAlias(scope.selectBundleAlias);
- }
- });
-
- $compile(element.contents())(scope);
- }
-
- return {
- restrict: "E",
- require: "^ngModel",
- link: linker,
- scope: {
- bundlesScope: '@',
- theForm: '=?',
- tbRequired: '=?',
- selectFirstBundle: '=',
- selectBundleAlias: '=?'
- }
- };
-}
\ No newline at end of file
diff --git a/ui/src/app/components/widgets-bundle-select.scss b/ui/src/app/components/widgets-bundle-select.scss
deleted file mode 100644
index 1d4b202ab6..0000000000
--- a/ui/src/app/components/widgets-bundle-select.scss
+++ /dev/null
@@ -1,92 +0,0 @@
-/**
- * Copyright © 2016-2020 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/mixins";
-
-tb-widgets-bundle-select {
- md-select {
- padding: 5px 20px;
- margin: 0;
- }
-
- .tb-bundle-item {
- height: 24px;
- line-height: 24px;
- }
-}
-
-.tb-widgets-bundle-select {
- .tb-bundle-item {
- height: 48px;
- line-height: 48px;
- }
-}
-
-tb-widgets-bundle-select,
-.tb-widgets-bundle-select {
- .md-text {
- display: block;
- width: 100%;
- }
-
- .tb-bundle-item {
- display: inline-block;
- width: 100%;
-
- span {
- display: inline-block;
- vertical-align: middle;
- }
-
- .tb-bundle-system {
- float: right;
- font-size: .8rem;
- opacity: .8;
- }
- }
-
- md-option {
- height: auto !important;
- white-space: normal !important;
- }
-}
-
-md-toolbar {
- tb-widgets-bundle-select {
- md-select {
- background: rgba(255, 255, 255, .2);
-
- .md-select-value {
- font-size: 1.2rem;
- color: #fff;
-
- span:first-child::after {
- color: #fff;
- }
- }
-
- .md-select-value.md-select-placeholder {
- color: #fff;
- opacity: .8;
- }
- }
-
- md-select.ng-invalid.ng-touched {
- .md-select-value {
- color: #fff !important;
- }
- }
- }
-}
diff --git a/ui/src/app/components/widgets-bundle-select.tpl.html b/ui/src/app/components/widgets-bundle-select.tpl.html
deleted file mode 100644
index fce4fcd5b1..0000000000
--- a/ui/src/app/components/widgets-bundle-select.tpl.html
+++ /dev/null
@@ -1,29 +0,0 @@
-
-
-
-
- {{item.title}}
- widgets-bundle.system
-
-
-
diff --git a/ui/src/app/customer/add-customer.tpl.html b/ui/src/app/customer/add-customer.tpl.html
deleted file mode 100644
index 54acc373dc..0000000000
--- a/ui/src/app/customer/add-customer.tpl.html
+++ /dev/null
@@ -1,46 +0,0 @@
-
-
-
-
-
diff --git a/ui/src/app/customer/customer-card.tpl.html b/ui/src/app/customer/customer-card.tpl.html
deleted file mode 100644
index ec233d758c..0000000000
--- a/ui/src/app/customer/customer-card.tpl.html
+++ /dev/null
@@ -1,18 +0,0 @@
-
-{{ item | contactShort }}
\ No newline at end of file
diff --git a/ui/src/app/customer/customer-fieldset.tpl.html b/ui/src/app/customer/customer-fieldset.tpl.html
deleted file mode 100644
index 11b2d58fb8..0000000000
--- a/ui/src/app/customer/customer-fieldset.tpl.html
+++ /dev/null
@@ -1,49 +0,0 @@
-
-{{ 'customer.manage-users' | translate }}
-{{ 'customer.manage-assets' | translate }}
-{{ 'customer.manage-devices' | translate }}
-{{ 'customer.manage-dashboards' | translate }}
-{{ 'customer.delete' | translate }}
-
-
-
-
- customer.copyId
-
-
-
-
-
-
diff --git a/ui/src/app/customer/customer.controller.js b/ui/src/app/customer/customer.controller.js
deleted file mode 100644
index f9399afedb..0000000000
--- a/ui/src/app/customer/customer.controller.js
+++ /dev/null
@@ -1,218 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-/* eslint-disable import/no-unresolved, import/default */
-
-import addCustomerTemplate from './add-customer.tpl.html';
-import customerCard from './customer-card.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-/*@ngInject*/
-export default function CustomerController(customerService, $state, $stateParams, $translate, types) {
-
- var customerActionsList = [
- {
- onAction: function ($event, item) {
- openCustomerUsers($event, item);
- },
- name: function() { return $translate.instant('user.users') },
- details: function() { return $translate.instant('customer.manage-customer-users') },
- icon: "account_circle",
- isEnabled: function(customer) {
- return customer && (!customer.additionalInfo || !customer.additionalInfo.isPublic);
- }
- },
- {
- onAction: function ($event, item) {
- openCustomerAssets($event, item);
- },
- name: function() { return $translate.instant('asset.assets') },
- details: function(customer) {
- if (customer && customer.additionalInfo && customer.additionalInfo.isPublic) {
- return $translate.instant('customer.manage-public-assets')
- } else {
- return $translate.instant('customer.manage-customer-assets')
- }
- },
- icon: "domain"
- },
- {
- onAction: function ($event, item) {
- openCustomerDevices($event, item);
- },
- name: function() { return $translate.instant('device.devices') },
- details: function(customer) {
- if (customer && customer.additionalInfo && customer.additionalInfo.isPublic) {
- return $translate.instant('customer.manage-public-devices')
- } else {
- return $translate.instant('customer.manage-customer-devices')
- }
- },
- icon: "devices_other"
- },
- {
- onAction: function ($event, item) {
- openCustomerDashboards($event, item);
- },
- name: function() { return $translate.instant('dashboard.dashboards') },
- details: function(customer) {
- if (customer && customer.additionalInfo && customer.additionalInfo.isPublic) {
- return $translate.instant('customer.manage-public-dashboards')
- } else {
- return $translate.instant('customer.manage-customer-dashboards')
- }
- },
- icon: "dashboard"
- },
- {
- onAction: function ($event, item) {
- vm.grid.deleteItem($event, item);
- },
- name: function() { return $translate.instant('action.delete') },
- details: function() { return $translate.instant('customer.delete') },
- icon: "delete",
- isEnabled: function(customer) {
- return customer && (!customer.additionalInfo || !customer.additionalInfo.isPublic);
- }
- }
- ];
-
- var vm = this;
-
- vm.types = types;
-
- vm.customerGridConfig = {
-
- refreshParamsFunc: null,
-
- deleteItemTitleFunc: deleteCustomerTitle,
- deleteItemContentFunc: deleteCustomerText,
- deleteItemsTitleFunc: deleteCustomersTitle,
- deleteItemsActionTitleFunc: deleteCustomersActionTitle,
- deleteItemsContentFunc: deleteCustomersText,
-
- fetchItemsFunc: fetchCustomers,
- saveItemFunc: saveCustomer,
- deleteItemFunc: deleteCustomer,
-
- getItemTitleFunc: getCustomerTitle,
-
- itemCardTemplateUrl: customerCard,
-
- actionsList: customerActionsList,
-
- onGridInited: gridInited,
-
- addItemTemplateUrl: addCustomerTemplate,
-
- addItemText: function() { return $translate.instant('customer.add-customer-text') },
- noItemsText: function() { return $translate.instant('customer.no-customers-text') },
- itemDetailsText: function(customer) {
- if (customer && (!customer.additionalInfo || !customer.additionalInfo.isPublic)) {
- return $translate.instant('customer.customer-details')
- } else {
- return '';
- }
- },
- isSelectionEnabled: function (customer) {
- return customer && (!customer.additionalInfo || !customer.additionalInfo.isPublic);
- },
- isDetailsReadOnly: function (customer) {
- return customer && customer.additionalInfo && customer.additionalInfo.isPublic;
- }
- };
-
- if (angular.isDefined($stateParams.items) && $stateParams.items !== null) {
- vm.customerGridConfig.items = $stateParams.items;
- }
-
- if (angular.isDefined($stateParams.topIndex) && $stateParams.topIndex > 0) {
- vm.customerGridConfig.topIndex = $stateParams.topIndex;
- }
-
- vm.openCustomerUsers = openCustomerUsers;
- vm.openCustomerAssets = openCustomerAssets;
- vm.openCustomerDevices = openCustomerDevices;
- vm.openCustomerDashboards = openCustomerDashboards;
-
- function deleteCustomerTitle(customer) {
- return $translate.instant('customer.delete-customer-title', {customerTitle: customer.title});
- }
-
- function deleteCustomerText() {
- return $translate.instant('customer.delete-customer-text');
- }
-
- function deleteCustomersTitle(selectedCount) {
- return $translate.instant('customer.delete-customers-title', {count: selectedCount}, 'messageformat');
- }
-
- function deleteCustomersActionTitle(selectedCount) {
- return $translate.instant('customer.delete-customers-action-title', {count: selectedCount}, 'messageformat');
- }
-
- function deleteCustomersText() {
- return $translate.instant('customer.delete-customers-text');
- }
-
- function gridInited(grid) {
- vm.grid = grid;
- }
-
- function fetchCustomers(pageLink) {
- return customerService.getCustomers(pageLink);
- }
-
- function saveCustomer(customer) {
- return customerService.saveCustomer(customer);
- }
-
- function deleteCustomer(customerId) {
- return customerService.deleteCustomer(customerId);
- }
-
- function getCustomerTitle(customer) {
- return customer ? customer.title : '';
- }
-
- function openCustomerUsers($event, customer) {
- if ($event) {
- $event.stopPropagation();
- }
- $state.go('home.customers.users', {customerId: customer.id.id});
- }
-
- function openCustomerAssets($event, customer) {
- if ($event) {
- $event.stopPropagation();
- }
- $state.go('home.customers.assets', {customerId: customer.id.id});
- }
-
- function openCustomerDevices($event, customer) {
- if ($event) {
- $event.stopPropagation();
- }
- $state.go('home.customers.devices', {customerId: customer.id.id});
- }
-
- function openCustomerDashboards($event, customer) {
- if ($event) {
- $event.stopPropagation();
- }
- $state.go('home.customers.dashboards', {customerId: customer.id.id});
- }
-}
diff --git a/ui/src/app/customer/customer.directive.js b/ui/src/app/customer/customer.directive.js
deleted file mode 100644
index ff1befaf9e..0000000000
--- a/ui/src/app/customer/customer.directive.js
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-/* eslint-disable import/no-unresolved, import/default */
-
-import customerFieldsetTemplate from './customer-fieldset.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-/*@ngInject*/
-export default function CustomerDirective($compile, $templateCache, $translate, toast) {
- var linker = function (scope, element) {
- var template = $templateCache.get(customerFieldsetTemplate);
- element.html(template);
-
- scope.isPublic = false;
-
- scope.onCustomerIdCopied = function() {
- toast.showSuccess($translate.instant('customer.idCopiedMessage'), 750, angular.element(element).parent().parent(), 'bottom left');
- };
-
- scope.$watch('customer', function(newVal) {
- if (newVal) {
- if (scope.customer.additionalInfo) {
- scope.isPublic = scope.customer.additionalInfo.isPublic;
- } else {
- scope.isPublic = false;
- }
- }
- });
-
- $compile(element.contents())(scope);
-
- }
- return {
- restrict: "E",
- link: linker,
- scope: {
- customer: '=',
- isEdit: '=',
- theForm: '=',
- onManageUsers: '&',
- onManageAssets: '&',
- onManageDevices: '&',
- onManageDashboards: '&',
- onDeleteCustomer: '&'
- }
- };
-}
diff --git a/ui/src/app/customer/customer.routes.js b/ui/src/app/customer/customer.routes.js
deleted file mode 100644
index fbaa9edc74..0000000000
--- a/ui/src/app/customer/customer.routes.js
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-/* eslint-disable import/no-unresolved, import/default */
-
-import customersTemplate from './customers.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-/*@ngInject*/
-export default function CustomerRoutes($stateProvider) {
-
- $stateProvider
- .state('home.customers', {
- url: '/customers',
- params: {'topIndex': 0},
- module: 'private',
- auth: ['TENANT_ADMIN'],
- views: {
- "content@home": {
- templateUrl: customersTemplate,
- controllerAs: 'vm',
- controller: 'CustomerController'
- }
- },
- data: {
- searchEnabled: true,
- pageTitle: 'customer.customers'
- },
- ncyBreadcrumb: {
- label: '{"icon": "supervisor_account", "label": "customer.customers"}'
- }
- });
-
-}
diff --git a/ui/src/app/customer/customers.tpl.html b/ui/src/app/customer/customers.tpl.html
deleted file mode 100644
index 396fc6734b..0000000000
--- a/ui/src/app/customer/customers.tpl.html
+++ /dev/null
@@ -1,75 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/ui/src/app/customer/index.js b/ui/src/app/customer/index.js
deleted file mode 100644
index bd2757afa2..0000000000
--- a/ui/src/app/customer/index.js
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Copyright © 2016-2020 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 uiRouter from 'angular-ui-router';
-import thingsboardApiCustomer from '../api/customer.service';
-import thingsboardGrid from '../components/grid.directive';
-import thingsboardContact from '../components/contact.directive';
-import thingsboardContactShort from '../components/contact-short.filter';
-
-import CustomerRoutes from './customer.routes';
-import CustomerController from './customer.controller';
-import CustomerDirective from './customer.directive';
-
-export default angular.module('thingsboard.customer', [
- uiRouter,
- thingsboardApiCustomer,
- thingsboardGrid,
- thingsboardContact,
- thingsboardContactShort
-])
- .config(CustomerRoutes)
- .controller('CustomerController', CustomerController)
- .directive('tbCustomer', CustomerDirective)
- .name;
diff --git a/ui/src/app/dashboard/add-dashboard.tpl.html b/ui/src/app/dashboard/add-dashboard.tpl.html
deleted file mode 100644
index 64dddcecfa..0000000000
--- a/ui/src/app/dashboard/add-dashboard.tpl.html
+++ /dev/null
@@ -1,45 +0,0 @@
-
-
-
-
\ No newline at end of file
diff --git a/ui/src/app/dashboard/add-dashboards-to-customer.controller.js b/ui/src/app/dashboard/add-dashboards-to-customer.controller.js
deleted file mode 100644
index 3e7df307af..0000000000
--- a/ui/src/app/dashboard/add-dashboards-to-customer.controller.js
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-/*@ngInject*/
-export default function AddDashboardsToCustomerController(dashboardService, $mdDialog, $q, customerId, dashboards) {
-
- var vm = this;
-
- vm.dashboards = dashboards;
- vm.searchText = '';
-
- vm.assign = assign;
- vm.cancel = cancel;
- vm.hasData = hasData;
- vm.noData = noData;
- vm.searchDashboardTextUpdated = searchDashboardTextUpdated;
- vm.toggleDashboardSelection = toggleDashboardSelection;
-
- vm.theDashboards = {
- getItemAtIndex: function (index) {
- if (index > vm.dashboards.data.length) {
- vm.theDashboards.fetchMoreItems_(index);
- return null;
- }
- var item = vm.dashboards.data[index];
- if (item) {
- item.indexNumber = index + 1;
- }
- return item;
- },
-
- getLength: function () {
- if (vm.dashboards.hasNext) {
- return vm.dashboards.data.length + vm.dashboards.nextPageLink.limit;
- } else {
- return vm.dashboards.data.length;
- }
- },
-
- fetchMoreItems_: function () {
- if (vm.dashboards.hasNext && !vm.dashboards.pending) {
- vm.dashboards.pending = true;
- dashboardService.getTenantDashboards(vm.dashboards.nextPageLink).then(
- function success(dashboards) {
- vm.dashboards.data = vm.dashboards.data.concat(dashboards.data);
- vm.dashboards.nextPageLink = dashboards.nextPageLink;
- vm.dashboards.hasNext = dashboards.hasNext;
- if (vm.dashboards.hasNext) {
- vm.dashboards.nextPageLink.limit = vm.dashboards.pageSize;
- }
- vm.dashboards.pending = false;
- },
- function fail() {
- vm.dashboards.hasNext = false;
- vm.dashboards.pending = false;
- });
- }
- }
- }
-
- function cancel () {
- $mdDialog.cancel();
- }
-
- function assign () {
- var tasks = [];
- for (var dashboardId in vm.dashboards.selections) {
- tasks.push(dashboardService.assignDashboardToCustomer(customerId, dashboardId));
- }
- $q.all(tasks).then(function () {
- $mdDialog.hide();
- });
- }
-
- function noData () {
- return vm.dashboards.data.length == 0 && !vm.dashboards.hasNext;
- }
-
- function hasData () {
- return vm.dashboards.data.length > 0;
- }
-
- function toggleDashboardSelection ($event, dashboard) {
- $event.stopPropagation();
- var selected = angular.isDefined(dashboard.selected) && dashboard.selected;
- dashboard.selected = !selected;
- if (dashboard.selected) {
- vm.dashboards.selections[dashboard.id.id] = true;
- vm.dashboards.selectedCount++;
- } else {
- delete vm.dashboards.selections[dashboard.id.id];
- vm.dashboards.selectedCount--;
- }
- }
-
- function searchDashboardTextUpdated () {
- vm.dashboards = {
- pageSize: vm.dashboards.pageSize,
- data: [],
- nextPageLink: {
- limit: vm.dashboards.pageSize,
- textSearch: vm.searchText
- },
- selections: {},
- selectedCount: 0,
- hasNext: true,
- pending: false
- };
- }
-}
\ No newline at end of file
diff --git a/ui/src/app/dashboard/add-dashboards-to-customer.tpl.html b/ui/src/app/dashboard/add-dashboards-to-customer.tpl.html
deleted file mode 100644
index 2f4b1dd6c2..0000000000
--- a/ui/src/app/dashboard/add-dashboards-to-customer.tpl.html
+++ /dev/null
@@ -1,77 +0,0 @@
-
-
-
-
\ No newline at end of file
diff --git a/ui/src/app/dashboard/add-widget.controller.js b/ui/src/app/dashboard/add-widget.controller.js
deleted file mode 100644
index e664c075ee..0000000000
--- a/ui/src/app/dashboard/add-widget.controller.js
+++ /dev/null
@@ -1,181 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-/* eslint-disable import/no-unresolved, import/default */
-
-import entityAliasDialogTemplate from '../entity/alias/entity-alias-dialog.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-/*@ngInject*/
-export default function AddWidgetController($scope, widgetService, entityService, $mdDialog, $q, $document, types, dashboard,
- aliasController, widget, widgetInfo) {
-
- var vm = this;
-
- vm.dashboard = dashboard;
- vm.aliasController = aliasController;
- vm.widget = widget;
- vm.widgetInfo = widgetInfo;
-
- vm.functionsOnly = false;
-
- vm.helpLinkIdForWidgetType = helpLinkIdForWidgetType;
- vm.add = add;
- vm.cancel = cancel;
- vm.fetchEntityKeys = fetchEntityKeys;
- vm.fetchDashboardStates = fetchDashboardStates;
- vm.createEntityAlias = createEntityAlias;
-
- vm.widgetConfig = {
- config: vm.widget.config,
- layout: {}
- };
-
- vm.widgetConfig.layout.mobileOrder = vm.widget.config.mobileOrder;
- vm.widgetConfig.layout.mobileHeight = vm.widget.config.mobileHeight;
-
- var settingsSchema = vm.widgetInfo.typeSettingsSchema || widgetInfo.settingsSchema;
- var dataKeySettingsSchema = vm.widgetInfo.typeDataKeySettingsSchema || widgetInfo.dataKeySettingsSchema;
-
- if (!settingsSchema || settingsSchema === '') {
- vm.settingsSchema = {};
- } else {
- vm.settingsSchema = angular.fromJson(settingsSchema);
- }
- if (!dataKeySettingsSchema || dataKeySettingsSchema === '') {
- vm.dataKeySettingsSchema = {};
- } else {
- vm.dataKeySettingsSchema = angular.fromJson(dataKeySettingsSchema);
- }
-
- function helpLinkIdForWidgetType() {
- var link = 'widgetsConfig';
- if (vm.widget && vm.widget.type) {
- switch (vm.widget.type) {
- case types.widgetType.timeseries.value: {
- link = 'widgetsConfigTimeseries';
- break;
- }
- case types.widgetType.latest.value: {
- link = 'widgetsConfigLatest';
- break;
- }
- case types.widgetType.rpc.value: {
- link = 'widgetsConfigRpc';
- break;
- }
- case types.widgetType.alarm.value: {
- link = 'widgetsConfigAlarm';
- break;
- }
- case types.widgetType.static.value: {
- link = 'widgetsConfigStatic';
- break;
- }
- }
- }
- return link;
- }
-
- function cancel () {
- $mdDialog.cancel();
- }
-
- function add () {
- if ($scope.theForm.$valid) {
- $scope.theForm.$setPristine();
- vm.widget.config = vm.widgetConfig.config;
- vm.widget.config.mobileOrder = vm.widgetConfig.layout.mobileOrder;
- vm.widget.config.mobileHeight = vm.widgetConfig.layout.mobileHeight;
- $mdDialog.hide({widget: vm.widget});
- }
- }
-
- function fetchEntityKeys (entityAliasId, query, type) {
- var deferred = $q.defer();
- vm.aliasController.getAliasInfo(entityAliasId).then(
- function success(aliasInfo) {
- var entity = aliasInfo.currentEntity;
- if (entity) {
- entityService.getEntityKeys(entity.entityType, entity.id, query, type, {ignoreLoading: true}).then(
- function success(keys) {
- deferred.resolve(keys);
- },
- function fail() {
- deferred.resolve([]);
- }
- );
- } else {
- deferred.resolve([]);
- }
- },
- function fail() {
- deferred.resolve([]);
- }
- );
- return deferred.promise;
- }
-
- function fetchDashboardStates (query) {
- var deferred = $q.defer();
- var stateIds = Object.keys(vm.dashboard.configuration.states);
- var result = query ? stateIds.filter(
- createFilterForDashboardState(query)) : stateIds;
- if (result && result.length) {
- deferred.resolve(result);
- } else {
- deferred.resolve([query]);
- }
- return deferred.promise;
- }
-
- function createFilterForDashboardState (query) {
- var lowercaseQuery = angular.lowercase(query);
- return function filterFn(stateId) {
- return (angular.lowercase(stateId).indexOf(lowercaseQuery) === 0);
- };
- }
-
- function createEntityAlias (event, alias, allowedEntityTypes) {
-
- var deferred = $q.defer();
- var singleEntityAlias = {id: null, alias: alias, filter: {}};
-
- $mdDialog.show({
- controller: 'EntityAliasDialogController',
- controllerAs: 'vm',
- templateUrl: entityAliasDialogTemplate,
- locals: {
- isAdd: true,
- allowedEntityTypes: allowedEntityTypes,
- entityAliases: vm.dashboard.configuration.entityAliases,
- alias: singleEntityAlias
- },
- parent: angular.element($document[0].body),
- fullscreen: true,
- multiple: true,
- targetEvent: event
- }).then(function (singleEntityAlias) {
- vm.dashboard.configuration.entityAliases[singleEntityAlias.id] = singleEntityAlias;
- vm.aliasController.updateEntityAliases(vm.dashboard.configuration.entityAliases);
- deferred.resolve(singleEntityAlias);
- }, function () {
- deferred.reject();
- });
-
- return deferred.promise;
- }
-}
diff --git a/ui/src/app/dashboard/add-widget.tpl.html b/ui/src/app/dashboard/add-widget.tpl.html
deleted file mode 100644
index 6c865cab18..0000000000
--- a/ui/src/app/dashboard/add-widget.tpl.html
+++ /dev/null
@@ -1,62 +0,0 @@
-
-
-
-
diff --git a/ui/src/app/dashboard/dashboard-card.scss b/ui/src/app/dashboard/dashboard-card.scss
deleted file mode 100644
index 7b3a5ace0e..0000000000
--- a/ui/src/app/dashboard/dashboard-card.scss
+++ /dev/null
@@ -1,26 +0,0 @@
-/**
- * Copyright © 2016-2020 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-dashboard-assigned-customers {
- display: block;
- display: -webkit-box; /* stylelint-disable-line value-no-vendor-prefix */
- height: 34px;
- margin-bottom: 4px;
- overflow: hidden;
- text-overflow: ellipsis;
- -webkit-line-clamp: 2;
- -webkit-box-orient: vertical; /* stylelint-disable-line property-no-vendor-prefix */
-}
-
diff --git a/ui/src/app/dashboard/dashboard-card.tpl.html b/ui/src/app/dashboard/dashboard-card.tpl.html
deleted file mode 100644
index 65f51f1d12..0000000000
--- a/ui/src/app/dashboard/dashboard-card.tpl.html
+++ /dev/null
@@ -1,20 +0,0 @@
-
-{{'dashboard.assignedToCustomers' | translate}}: '{{vm.item.assignedCustomersText}}'
-{{'dashboard.public' | translate}}
-
diff --git a/ui/src/app/dashboard/dashboard-fieldset.tpl.html b/ui/src/app/dashboard/dashboard-fieldset.tpl.html
deleted file mode 100644
index bf3283b857..0000000000
--- a/ui/src/app/dashboard/dashboard-fieldset.tpl.html
+++ /dev/null
@@ -1,80 +0,0 @@
-
-{{ 'dashboard.export' | translate }}
-{{ 'dashboard.make-public' | translate }}
-{{ 'dashboard.make-private' | translate }}
-{{ 'dashboard.manage-assigned-customers' | translate }}
-{{ 'dashboard.unassign-from-customer' | translate }}
-{{ 'dashboard.delete' | translate }}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {{ 'dashboard.copy-public-link' | translate }}
-
-
-
-
-
-
diff --git a/ui/src/app/dashboard/dashboard-settings.controller.js b/ui/src/app/dashboard/dashboard-settings.controller.js
deleted file mode 100644
index 15c85b0eb1..0000000000
--- a/ui/src/app/dashboard/dashboard-settings.controller.js
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- * Copyright © 2016-2020 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 './dashboard-settings.scss';
-
-/*@ngInject*/
-export default function DashboardSettingsController($scope, $mdDialog, statesControllerService, settings, gridSettings) {
-
- var vm = this;
-
- vm.cancel = cancel;
- vm.save = save;
- vm.imageAdded = imageAdded;
- vm.clearImage = clearImage;
-
- vm.stateControllerIdChanged = stateControllerIdChanged;
-
- vm.settings = settings;
- vm.gridSettings = gridSettings;
- vm.stateControllers = statesControllerService.getStateControllers();
-
- if (vm.settings) {
- if (angular.isUndefined(vm.settings.stateControllerId)) {
- vm.settings.stateControllerId = 'entity';
- }
-
- if (angular.isUndefined(vm.settings.showTitle)) {
- vm.settings.showTitle = false;
- }
-
- if (angular.isUndefined(vm.settings.titleColor)) {
- vm.settings.titleColor = 'rgba(0,0,0,0.870588)';
- }
-
- if (angular.isUndefined(vm.settings.showDashboardsSelect)) {
- vm.settings.showDashboardsSelect = true;
- }
-
- if (angular.isUndefined(vm.settings.showEntitiesSelect)) {
- vm.settings.showEntitiesSelect = true;
- }
-
- if (angular.isUndefined(vm.settings.showDashboardTimewindow)) {
- vm.settings.showDashboardTimewindow = true;
- }
-
- if (angular.isUndefined(vm.settings.showDashboardExport)) {
- vm.settings.showDashboardExport = true;
- }
-
- if (angular.isUndefined(vm.settings.toolbarAlwaysOpen)) {
- vm.settings.toolbarAlwaysOpen = true;
- }
- }
-
- if (vm.gridSettings) {
- vm.gridSettings.backgroundColor = vm.gridSettings.backgroundColor || 'rgba(0,0,0,0)';
- vm.gridSettings.color = vm.gridSettings.color || 'rgba(0,0,0,0.870588)';
- vm.gridSettings.columns = vm.gridSettings.columns || 24;
- vm.gridSettings.margins = vm.gridSettings.margins || [10, 10];
- vm.gridSettings.autoFillHeight = angular.isDefined(vm.gridSettings.autoFillHeight) ? vm.gridSettings.autoFillHeight : false;
- vm.gridSettings.mobileAutoFillHeight = angular.isDefined(vm.gridSettings.mobileAutoFillHeight) ? vm.gridSettings.mobileAutoFillHeight : false;
- vm.gridSettings.mobileRowHeight = angular.isDefined(vm.gridSettings.mobileRowHeight) ? vm.gridSettings.mobileRowHeight : 70;
- vm.hMargin = vm.gridSettings.margins[0];
- vm.vMargin = vm.gridSettings.margins[1];
- vm.gridSettings.backgroundSizeMode = vm.gridSettings.backgroundSizeMode || '100%';
- }
-
- function cancel() {
- $mdDialog.cancel();
- }
-
- function imageAdded($file) {
- var reader = new FileReader();
- reader.onload = function(event) {
- $scope.$apply(function() {
- if (event.target.result && event.target.result.startsWith('data:image/')) {
- $scope.theForm.$setDirty();
- vm.gridSettings.backgroundImageUrl = event.target.result;
- }
- });
- };
- reader.readAsDataURL($file.file);
- }
-
- function clearImage() {
- $scope.theForm.$setDirty();
- vm.gridSettings.backgroundImageUrl = null;
- }
-
- function stateControllerIdChanged() {
- if (vm.settings.stateControllerId != 'default') {
- vm.settings.toolbarAlwaysOpen = true;
- }
- }
-
- function save() {
- $scope.theForm.$setPristine();
- if (vm.gridSettings) {
- vm.gridSettings.margins = [vm.hMargin, vm.vMargin];
- }
- $mdDialog.hide(
- {
- settings: vm.settings,
- gridSettings: vm.gridSettings
- }
- );
- }
-}
diff --git a/ui/src/app/dashboard/dashboard-settings.scss b/ui/src/app/dashboard/dashboard-settings.scss
deleted file mode 100644
index 54692295c1..0000000000
--- a/ui/src/app/dashboard/dashboard-settings.scss
+++ /dev/null
@@ -1,66 +0,0 @@
-/**
- * Copyright © 2016-2020 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.
- */
-$previewSize: 100px !default;
-
-.tb-image-select-container {
- position: relative;
- width: 100%;
- height: $previewSize;
-}
-
-.tb-image-preview {
- width: auto;
- max-width: $previewSize;
- height: auto;
- max-height: $previewSize;
-}
-
-.tb-image-preview-container {
- position: relative;
- float: left;
- width: $previewSize;
- height: $previewSize;
- margin-right: 12px;
- vertical-align: top;
- border: solid 1px;
-
- div {
- width: 100%;
- font-size: 18px;
- text-align: center;
- }
-
- div,
- .tb-image-preview {
- position: absolute;
- top: 50%;
- left: 50%;
- transform: translate(-50%, -50%);
- }
-}
-
-.tb-image-clear-container {
- position: relative;
- float: right;
- width: 48px;
- height: $previewSize;
-}
-
-.tb-image-clear-btn {
- position: absolute !important;
- top: 50%;
- transform: translate(0%, -50%) !important;
-}
diff --git a/ui/src/app/dashboard/dashboard-settings.tpl.html b/ui/src/app/dashboard/dashboard-settings.tpl.html
deleted file mode 100644
index 86f2427da2..0000000000
--- a/ui/src/app/dashboard/dashboard-settings.tpl.html
+++ /dev/null
@@ -1,203 +0,0 @@
-
-
-
-
diff --git a/ui/src/app/dashboard/dashboard-toolbar.directive.js b/ui/src/app/dashboard/dashboard-toolbar.directive.js
deleted file mode 100644
index fe8de8c636..0000000000
--- a/ui/src/app/dashboard/dashboard-toolbar.directive.js
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * Copyright © 2016-2020 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 './dashboard-toolbar.scss';
-
-import 'javascript-detect-element-resize/detect-element-resize';
-
-/* eslint-disable import/no-unresolved, import/default */
-
-import dashboardToolbarTemplate from './dashboard-toolbar.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-/*@ngInject*/
-export default function DashboardToolbar() {
- return {
- restrict: "E",
- scope: true,
- transclude: true,
- bindToController: {
- toolbarOpened: '=',
- forceFullscreen: '=',
- onTriggerClick: '&'
- },
- controller: DashboardToolbarController,
- controllerAs: 'vm',
- templateUrl: dashboardToolbarTemplate
- };
-}
-
-/* eslint-disable angular/angularelement */
-
-
-/*@ngInject*/
-function DashboardToolbarController($scope, $element, $timeout, mdFabToolbarAnimation) {
-
- let vm = this;
-
- vm.mdFabToolbarElement = angular.element($element[0].querySelector('md-fab-toolbar'));
-
- function initElements() {
- $timeout(function() {
- vm.mdFabBackgroundElement = angular.element(vm.mdFabToolbarElement[0].querySelector('.md-fab-toolbar-background'));
- vm.mdFabTriggerElement = angular.element(vm.mdFabToolbarElement[0].querySelector('md-fab-trigger button'));
- if (!vm.mdFabBackgroundElement || !vm.mdFabBackgroundElement[0]) {
- initElements();
- } else {
- triggerFabResize();
- }
- });
- }
-
- addResizeListener(vm.mdFabToolbarElement[0], triggerFabResize); // eslint-disable-line no-undef
-
- $scope.$on("$destroy", function () {
- removeResizeListener(vm.mdFabToolbarElement[0], triggerFabResize); // eslint-disable-line no-undef
- });
-
- initElements();
-
- function triggerFabResize() {
- if (!vm.mdFabBackgroundElement || !vm.mdFabBackgroundElement[0]) {
- return;
- }
- var ctrl = vm.mdFabToolbarElement.controller('mdFabToolbar');
- if (ctrl.isOpen) {
- if (!vm.mdFabBackgroundElement[0].offsetWidth) {
- mdFabToolbarAnimation.addClass(vm.mdFabToolbarElement, 'md-is-open', function () {
- });
- } else {
- var color = window.getComputedStyle(vm.mdFabTriggerElement[0]).getPropertyValue('background-color'); //eslint-disable-line
-
- var width = vm.mdFabToolbarElement[0].offsetWidth;
- var scale = 2 * (width / vm.mdFabTriggerElement[0].offsetWidth);
- vm.mdFabBackgroundElement[0].style.backgroundColor = color;
- vm.mdFabBackgroundElement[0].style.borderRadius = width + 'px';
-
- var transform = vm.mdFabBackgroundElement[0].style.transform;
- var targetTransform = 'scale(' + scale + ')';
- if (!transform || !angular.equals(transform, targetTransform)) {
- vm.mdFabBackgroundElement[0].style.transform = targetTransform;
- }
- }
- }
- }
-}
-
diff --git a/ui/src/app/dashboard/dashboard-toolbar.scss b/ui/src/app/dashboard/dashboard-toolbar.scss
deleted file mode 100644
index 96369c8ed2..0000000000
--- a/ui/src/app/dashboard/dashboard-toolbar.scss
+++ /dev/null
@@ -1,199 +0,0 @@
-/**
- * Copyright © 2016-2020 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 "~compass-sass-mixins/lib/compass";
-
-@import "../../scss/constants";
-
-$toolbar-height: 50px !default;
-$fullscreen-toolbar-height: 64px !default;
-$mobile-toolbar-height: 80px !default;
-$half-mobile-toolbar-height: 40px !default;
-$mobile-toolbar-height-total: 84px !default;
-
-tb-dashboard-toolbar {
- md-fab-toolbar {
- &.md-is-open {
- md-fab-trigger {
- .md-button {
- &.md-fab {
- opacity: 1;
-
- transition: opacity .3s cubic-bezier(.55, 0, .55, .2);
-
- .md-fab-toolbar-background {
- background-color: $primary-default !important;
- }
- }
- }
- }
- }
-
- md-fab-trigger {
- .md-button {
- &.md-fab {
- width: 36px;
- height: 36px;
- margin: 4px 0 0 4px;
- line-height: 36px;
- opacity: .5;
-
- transition: opacity .3s cubic-bezier(.55, 0, .55, .2) .2s;
-
- md-icon {
- position: absolute;
- top: 25%;
- width: 18px;
- min-width: 18px;
- height: 18px;
- min-height: 18px;
- margin: 0;
- line-height: 18px;
- }
- }
- }
- }
-
- &.is-fullscreen {
- &.md-is-open {
- md-fab-trigger {
- .md-button {
- &.md-fab {
- .md-fab-toolbar-background {
- transition-delay: 0ms !important;
- transition-duration: 0ms !important;
- }
- }
- }
- }
- }
-
- .md-fab-toolbar-wrapper {
- height: $mobile-toolbar-height-total;
-
- @media (min-width: $layout-breakpoint-sm) {
- height: $fullscreen-toolbar-height;
- }
-
- md-toolbar {
- height: $mobile-toolbar-height;
- min-height: $mobile-toolbar-height;
-
- @media (min-width: $layout-breakpoint-sm) {
- height: $fullscreen-toolbar-height;
- min-height: $fullscreen-toolbar-height;
- }
- }
- }
- }
-
- .md-fab-toolbar-wrapper {
- height: $mobile-toolbar-height-total;
-
- @media (min-width: $layout-breakpoint-sm) {
- height: $toolbar-height;
- }
-
- md-toolbar {
- height: $mobile-toolbar-height;
- min-height: $mobile-toolbar-height;
-
- @media (min-width: $layout-breakpoint-sm) {
- height: $toolbar-height;
- min-height: $toolbar-height;
- }
-
- md-fab-actions {
- margin-top: 0;
- font-size: 16px;
-
- @media (max-width: $layout-breakpoint-sm) {
- height: $mobile-toolbar-height;
- max-height: $mobile-toolbar-height;
- }
-
- .close-action {
- margin-right: -18px;
- }
-
- .md-fab-action-item {
- width: 100%;
- height: $mobile-toolbar-height;
-
- @media (min-width: $layout-breakpoint-sm) {
- height: 46px;
- }
-
- .tb-dashboard-action-panels {
- flex-direction: column-reverse;
- height: $mobile-toolbar-height;
-
- @media (min-width: $layout-breakpoint-sm) {
- height: 46px;
- }
-
- @media (min-width: $layout-breakpoint-sm) {
- flex-direction: row-reverse;
- }
-
- .tb-dashboard-action-panel {
- flex-direction: row-reverse;
- min-width: 0;
- height: $half-mobile-toolbar-height;
-
- @media (max-width: $layout-breakpoint-sm) {
- md-menu{
- margin: 0;
- }
- }
-
- @media (min-width: $layout-breakpoint-sm) {
- height: 46px;
- }
-
- div {
- height: $half-mobile-toolbar-height;
-
- @media (min-width: $layout-breakpoint-sm) {
- height: 46px;
- }
- }
-
- md-select {
- margin: 0;
- pointer-events: all;
- }
-
- tb-states-component {
- pointer-events: all;
- }
-
- button.md-icon-button {
- min-width: 40px;
-
- @media (max-width: $layout-breakpoint-sm) {
- min-width: 28px;
- padding: 2px;
- margin: 0;
- }
- }
- }
- }
- }
- }
- }
- }
- }
-}
diff --git a/ui/src/app/dashboard/dashboard-toolbar.tpl.html b/ui/src/app/dashboard/dashboard-toolbar.tpl.html
deleted file mode 100644
index 53d1cdeef9..0000000000
--- a/ui/src/app/dashboard/dashboard-toolbar.tpl.html
+++ /dev/null
@@ -1,34 +0,0 @@
-
-
-
-
-
- {{ 'dashboard.open-toolbar' | translate }}
-
- more_horiz
-
-
-
-
-
-
-
-
diff --git a/ui/src/app/dashboard/dashboard.controller.js b/ui/src/app/dashboard/dashboard.controller.js
deleted file mode 100644
index dc2a4a2f85..0000000000
--- a/ui/src/app/dashboard/dashboard.controller.js
+++ /dev/null
@@ -1,1076 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-/* eslint-disable import/no-unresolved, import/default */
-
-import entityAliasesTemplate from '../entity/alias/entity-aliases.tpl.html';
-import dashboardSettingsTemplate from './dashboard-settings.tpl.html';
-import manageDashboardLayoutsTemplate from './layouts/manage-dashboard-layouts.tpl.html';
-import manageDashboardStatesTemplate from './states/manage-dashboard-states.tpl.html';
-import addWidgetTemplate from './add-widget.tpl.html';
-import selectTargetLayoutTemplate from './layouts/select-target-layout.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-import AliasController from '../api/alias-controller';
-
-/*@ngInject*/
-export default function DashboardController(types, utils, dashboardUtils, widgetService, userService,
- dashboardService, timeService, entityService, itembuffer, importExport, hotkeys, $window, $rootScope,
- $scope, $element, $state, $stateParams, $mdDialog, $mdMedia, $timeout, $document, $q, $translate, $filter) {
-
- var vm = this;
-
- vm.user = userService.getCurrentUser();
- vm.dashboard = null;
- vm.editingWidget = null;
- vm.editingWidgetLayout = null;
- vm.editingWidgetOriginal = null;
- vm.editingWidgetLayoutOriginal = null;
- vm.editingWidgetSubtitle = null;
- vm.forceDashboardMobileMode = false;
- vm.isAddingWidget = false;
- vm.isEdit = false;
- vm.isEditingWidget = false;
- vm.latestWidgetTypes = [];
- vm.timeseriesWidgetTypes = [];
- vm.rpcWidgetTypes = [];
- vm.alarmWidgetTypes = [];
- vm.staticWidgetTypes = [];
- vm.widgetEditMode = $state.$current.data.widgetEditMode;
- vm.iframeMode = $rootScope.iframeMode;
-
- vm.isToolbarOpened = false;
-
- vm.thingsboardVersion = THINGSBOARD_VERSION; //eslint-disable-line
-
- vm.currentDashboardId = $stateParams.dashboardId;
- if ($stateParams.customerId) {
- vm.currentCustomerId = $stateParams.customerId;
- vm.currentDashboardScope = 'customer';
- } else {
- vm.currentDashboardScope = vm.user.authority === 'TENANT_ADMIN' ? 'tenant' : 'customer';
- vm.currentCustomerId = vm.user.customerId;
- }
-
- Object.defineProperty(vm, 'toolbarOpened', {
- get: function() {
- return !vm.widgetEditMode &&
- (toolbarAlwaysOpen() || vm.isToolbarOpened || vm.isEdit || vm.showRightLayoutSwitch()); },
- set: function() { }
- });
-
- Object.defineProperty(vm, 'rightLayoutOpened', {
- get: function() {
- return !vm.isMobile || vm.isRightLayoutOpened; },
- set: function() { }
- });
-
- vm.layouts = {
- main: {
- show: false,
- layoutCtx: {
- id: 'main',
- widgets: [],
- widgetLayouts: {},
- gridSettings: {},
- ignoreLoading: false
- }
- },
- right: {
- show: false,
- layoutCtx: {
- id: 'right',
- widgets: [],
- widgetLayouts: {},
- gridSettings: {},
- ignoreLoading: false
- }
- }
- };
-
- vm.openToolbar = function() {
- $timeout(function() {
- vm.isToolbarOpened = true;
- });
- }
-
- vm.closeToolbar = function() {
- $timeout(function() {
- vm.isToolbarOpened = false;
- });
- }
-
- vm.showCloseToolbar = function() {
- return !vm.toolbarAlwaysOpen() && !vm.isEdit && !vm.showRightLayoutSwitch();
- }
-
- vm.toolbarAlwaysOpen = toolbarAlwaysOpen;
-
- vm.showRightLayoutSwitch = function() {
- return vm.isMobile && vm.layouts.right.show;
- }
-
- vm.toggleLayouts = function() {
- vm.isRightLayoutOpened = !vm.isRightLayoutOpened;
- }
-
- vm.openRightLayout = function() {
- vm.isRightLayoutOpened = true;
- }
-
- vm.isRightLayoutOpened = false;
- vm.isMobile = !$mdMedia('gt-sm');
-
- $scope.$watch(function() { return $mdMedia('gt-sm'); }, function(isGtSm) {
- vm.isMobile = !isGtSm;
- });
-
- vm.mainLayoutWidth = function() {
- if (vm.isEditingWidget && vm.editingLayoutCtx.id === 'main') {
- return '100%';
- } else {
- return vm.layouts.right.show && !vm.isMobile ? '50%' : '100%';
- }
- }
-
- vm.mainLayoutHeight = function() {
- if (!vm.isEditingWidget || vm.editingLayoutCtx.id === 'main') {
- return '100%';
- } else {
- return '0px';
- }
- }
-
- vm.rightLayoutWidth = function() {
- if (vm.isEditingWidget && vm.editingLayoutCtx.id === 'right') {
- return '100%';
- } else {
- return vm.isMobile ? '100%' : '50%';
- }
- }
-
- vm.rightLayoutHeight = function() {
- if (!vm.isEditingWidget || vm.editingLayoutCtx.id === 'right') {
- return '100%';
- } else {
- return '0px';
- }
- }
-
- vm.addWidget = addWidget;
- vm.addWidgetFromType = addWidgetFromType;
- vm.exportDashboard = exportDashboard;
- vm.importWidget = importWidget;
- vm.isPublicUser = isPublicUser;
- vm.isTenantAdmin = isTenantAdmin;
- vm.isSystemAdmin = isSystemAdmin;
- vm.dashboardConfigurationError = dashboardConfigurationError;
- vm.showDashboardToolbar = showDashboardToolbar;
- vm.onAddWidgetClosed = onAddWidgetClosed;
- vm.onEditWidgetClosed = onEditWidgetClosed;
- vm.openDashboardState = openDashboardState;
- vm.openEntityAliases = openEntityAliases;
- vm.openDashboardSettings = openDashboardSettings;
- vm.manageDashboardLayouts = manageDashboardLayouts;
- vm.manageDashboardStates = manageDashboardStates;
- vm.saveDashboard = saveDashboard;
- vm.saveWidget = saveWidget;
- vm.toggleDashboardEditMode = toggleDashboardEditMode;
- vm.onRevertWidgetEdit = onRevertWidgetEdit;
- vm.helpLinkIdForWidgetType = helpLinkIdForWidgetType;
- vm.displayTitle = displayTitle;
- vm.displayExport = displayExport;
- vm.displayDashboardTimewindow = displayDashboardTimewindow;
- vm.displayDashboardsSelect = displayDashboardsSelect;
- vm.displayEntitiesSelect = displayEntitiesSelect;
- vm.hideFullscreenButton = hideFullscreenButton;
-
- vm.widgetsBundle;
-
- vm.dashboardCtx = {
- state: null,
- stateController: {
- openRightLayout: function() {
- vm.openRightLayout();
- }
- },
- onAddWidget: function(event, layoutCtx) {
- addWidget(event, layoutCtx);
- },
- onEditWidget: function(event, layoutCtx, widget) {
- editWidget(event, layoutCtx, widget);
- },
- onExportWidget: function(event, layoutCtx, widget) {
- exportWidget(event, layoutCtx, widget);
- },
- onWidgetMouseDown: function(event, layoutCtx, widget) {
- widgetMouseDown(event, layoutCtx, widget);
- },
- onWidgetClicked: function(event, layoutCtx, widget) {
- widgetClicked(event, layoutCtx, widget);
- },
- prepareDashboardContextMenu: function(layoutCtx) {
- return prepareDashboardContextMenu(layoutCtx);
- },
- prepareWidgetContextMenu: function(layoutCtx, widget) {
- return prepareWidgetContextMenu(layoutCtx, widget);
- },
- onRemoveWidget: function(event, layoutCtx, widget) {
- removeWidget(event, layoutCtx, widget);
- },
- copyWidget: function($event, layoutCtx, widget) {
- copyWidget($event, layoutCtx, widget);
- },
- copyWidgetReference: function($event, layoutCtx, widget) {
- copyWidgetReference($event, layoutCtx, widget);
- },
- pasteWidget: function($event, layoutCtx, pos) {
- pasteWidget($event, layoutCtx, pos);
- },
- pasteWidgetReference: function($event, layoutCtx, pos) {
- pasteWidgetReference($event, layoutCtx, pos);
- }
- };
-
- $scope.$watch('vm.widgetsBundle', function (newVal, prevVal) {
- if (newVal !== prevVal && !vm.widgetEditMode) {
- loadWidgetLibrary();
- }
- });
-
- $scope.$watch('vm.currentDashboardId', function (newVal, prevVal) {
- if (newVal !== prevVal && !vm.widgetEditMode) {
- if (vm.currentDashboardScope === 'customer' && vm.user.authority === 'TENANT_ADMIN') {
- $state.go('home.customers.dashboards.dashboard', {
- customerId: vm.currentCustomerId,
- dashboardId: vm.currentDashboardId
- });
- } else {
- if ($state.current.name === 'dashboard') {
- $state.go('dashboard', {dashboardId: vm.currentDashboardId});
- } else {
- $state.go('home.dashboards.dashboard', {dashboardId: vm.currentDashboardId});
- }
- }
- }
- });
-
- $scope.$on("$destroy", function () {
- vm.dashboardCtx.stateController.cleanupPreservedStates();
- });
-
- loadDashboard();
-
- function loadWidgetLibrary() {
- vm.latestWidgetTypes = [];
- vm.timeseriesWidgetTypes = [];
- vm.rpcWidgetTypes = [];
- vm.alarmWidgetTypes = [];
- vm.staticWidgetTypes = [];
- if (vm.widgetsBundle) {
- var bundleAlias = vm.widgetsBundle.alias;
- var isSystem = vm.widgetsBundle.tenantId.id === types.id.nullUid;
-
- widgetService.getBundleWidgetTypes(bundleAlias, isSystem).then(
- function (widgetTypes) {
-
- widgetTypes = $filter('orderBy')(widgetTypes, ['-createdTime']);
-
- var top = 0;
-
- if (widgetTypes.length > 0) {
- loadNext(0);
- }
-
- function loadNextOrComplete(i) {
- i++;
- if (i < widgetTypes.length) {
- loadNext(i);
- }
- }
-
- function loadNext(i) {
- var widgetType = widgetTypes[i];
- var widgetTypeInfo = widgetService.toWidgetInfo(widgetType);
- var widget = {
- isSystemType: isSystem,
- bundleAlias: bundleAlias,
- typeAlias: widgetTypeInfo.alias,
- type: widgetTypeInfo.type,
- title: widgetTypeInfo.widgetName,
- sizeX: widgetTypeInfo.sizeX,
- sizeY: widgetTypeInfo.sizeY,
- row: top,
- col: 0,
- config: angular.fromJson(widgetTypeInfo.defaultConfig)
- };
- widget.config.title = widgetTypeInfo.widgetName;
- if (widgetTypeInfo.type === types.widgetType.timeseries.value) {
- vm.timeseriesWidgetTypes.push(widget);
- } else if (widgetTypeInfo.type === types.widgetType.latest.value) {
- vm.latestWidgetTypes.push(widget);
- } else if (widgetTypeInfo.type === types.widgetType.rpc.value) {
- vm.rpcWidgetTypes.push(widget);
- } else if (widgetTypeInfo.type === types.widgetType.alarm.value) {
- vm.alarmWidgetTypes.push(widget);
- } else if (widgetTypeInfo.type === types.widgetType.static.value) {
- vm.staticWidgetTypes.push(widget);
- }
- top += widget.sizeY;
- loadNextOrComplete(i);
-
- }
- }
- );
- }
- }
-
- function loadDashboard() {
- if (vm.widgetEditMode) {
- var widget = {
- isSystemType: true,
- bundleAlias: 'customWidgetBundle',
- typeAlias: 'customWidget',
- type: $rootScope.editWidgetInfo.type,
- title: 'My widget',
- sizeX: $rootScope.editWidgetInfo.sizeX * 2,
- sizeY: $rootScope.editWidgetInfo.sizeY * 2,
- row: 2,
- col: 4,
- config: angular.fromJson($rootScope.editWidgetInfo.defaultConfig)
- };
- widget.config.title = widget.config.title || $rootScope.editWidgetInfo.widgetName;
-
- vm.dashboard = dashboardUtils.createSingleWidgetDashboard(widget);
- vm.dashboardConfiguration = vm.dashboard.configuration;
- vm.dashboardCtx.dashboard = vm.dashboard;
- vm.dashboardCtx.dashboardTimewindow = vm.dashboardConfiguration.timewindow;
- vm.dashboardCtx.aliasController = new AliasController($scope, $q, $filter, utils,
- types, entityService, vm.dashboardCtx.stateController, vm.dashboardConfiguration.entityAliases);
- var parentScope = $window.parent.angular.element($window.frameElement).scope();
- parentScope.$root.$broadcast('widgetEditModeInited');
- parentScope.$root.$apply();
- } else {
- dashboardService.getDashboard($stateParams.dashboardId)
- .then(function success(dashboard) {
- vm.dashboard = dashboardUtils.validateAndUpdateDashboard(dashboard);
- vm.dashboardConfiguration = vm.dashboard.configuration;
- vm.dashboardCtx.dashboard = vm.dashboard;
- vm.dashboardCtx.dashboardTimewindow = vm.dashboardConfiguration.timewindow;
- vm.dashboardCtx.aliasController = new AliasController($scope, $q, $filter, utils,
- types, entityService, vm.dashboardCtx.stateController, vm.dashboardConfiguration.entityAliases);
- }, function fail() {
- vm.configurationError = true;
- });
- }
- }
-
- function openDashboardState(state, openRightLayout) {
- var layoutsData = dashboardUtils.getStateLayoutsData(vm.dashboard, state);
- if (layoutsData) {
- vm.dashboardCtx.state = state;
- vm.dashboardCtx.aliasController.dashboardStateChanged();
- var layoutVisibilityChanged = false;
- for (var l in vm.layouts) {
- var layout = vm.layouts[l];
- var showLayout;
- if (layoutsData[l]) {
- showLayout = true;
- } else {
- showLayout = false;
- }
- if (layout.show != showLayout) {
- layout.show = showLayout;
- layoutVisibilityChanged = !vm.isMobile;
- }
- }
- vm.isRightLayoutOpened = openRightLayout ? true : false;
- updateLayouts(layoutVisibilityChanged);
- }
-
- function updateLayouts(layoutVisibilityChanged) {
- for (l in vm.layouts) {
- layout = vm.layouts[l];
- if (layoutsData[l]) {
- var layoutInfo = layoutsData[l];
- if (layout.layoutCtx.id === 'main') {
- layout.layoutCtx.ctrl.setResizing(layoutVisibilityChanged);
- }
- updateLayout(layout, layoutInfo.widgets, layoutInfo.widgetLayouts, layoutInfo.gridSettings);
- } else {
- updateLayout(layout, [], {}, null);
- }
- }
- }
- }
-
- function updateLayout(layout, widgets, widgetLayouts, gridSettings) {
- if (gridSettings) {
- layout.layoutCtx.gridSettings = gridSettings;
- }
- layout.layoutCtx.widgets = widgets;
- layout.layoutCtx.widgetLayouts = widgetLayouts;
- if (layout.show && layout.layoutCtx.ctrl) {
- layout.layoutCtx.ctrl.reload();
- }
- layout.layoutCtx.ignoreLoading = true;
- }
-
- function isPublicUser() {
- return vm.user.isPublic === true;
- }
-
- function isTenantAdmin() {
- return vm.user.authority === 'TENANT_ADMIN';
- }
-
- function isSystemAdmin() {
- return vm.user.authority === 'SYS_ADMIN';
- }
-
- function dashboardConfigurationError() {
- return vm.configurationError;
- }
-
- function showDashboardToolbar() {
- return true;
- }
-
- function openEntityAliases($event) {
- $mdDialog.show({
- controller: 'EntityAliasesController',
- controllerAs: 'vm',
- templateUrl: entityAliasesTemplate,
- locals: {
- config: {
- entityAliases: angular.copy(vm.dashboard.configuration.entityAliases),
- widgets: dashboardUtils.getWidgetsArray(vm.dashboard),
- isSingleEntityAlias: false,
- singleEntityAlias: null
- }
- },
- parent: angular.element($document[0].body),
- multiple: true,
- fullscreen: true,
- targetEvent: $event
- }).then(function (entityAliases) {
- vm.dashboard.configuration.entityAliases = entityAliases;
- entityAliasesUpdated();
- }, function () {
- });
- }
-
- function openDashboardSettings($event) {
- var gridSettings = null;
- var layoutKeys = dashboardUtils.isSingleLayoutDashboard(vm.dashboard);
- if (layoutKeys) {
- gridSettings = angular.copy(vm.dashboard.configuration.states[layoutKeys.state].layouts[layoutKeys.layout].gridSettings)
- }
- $mdDialog.show({
- controller: 'DashboardSettingsController',
- controllerAs: 'vm',
- templateUrl: dashboardSettingsTemplate,
- locals: {
- settings: angular.copy(vm.dashboard.configuration.settings),
- gridSettings: gridSettings
- },
- parent: angular.element($document[0].body),
- multiple: true,
- fullscreen: true,
- targetEvent: $event
- }).then(function (data) {
- vm.dashboard.configuration.settings = data.settings;
- var gridSettings = data.gridSettings;
- if (gridSettings) {
- updateLayoutGrid(layoutKeys, gridSettings);
- }
- }, function () {
- });
- }
-
- function manageDashboardLayouts($event) {
- $mdDialog.show({
- controller: 'ManageDashboardLayoutsController',
- controllerAs: 'vm',
- templateUrl: manageDashboardLayoutsTemplate,
- locals: {
- layouts: angular.copy(vm.dashboard.configuration.states[vm.dashboardCtx.state].layouts)
- },
- parent: angular.element($document[0].body),
- multiple: true,
- fullscreen: true,
- targetEvent: $event
- }).then(function (layouts) {
- updateLayouts(layouts);
- }, function () {
- });
- }
-
- function manageDashboardStates($event) {
- var dashboardConfiguration = vm.dashboard.configuration;
- var states = angular.copy(dashboardConfiguration.states);
-
- $mdDialog.show({
- controller: 'ManageDashboardStatesController',
- controllerAs: 'vm',
- templateUrl: manageDashboardStatesTemplate,
- locals: {
- states: states
- },
- parent: angular.element($document[0].body),
- multiple: true,
- fullscreen: true,
- targetEvent: $event
- }).then(function (states) {
- updateStates(states);
- }, function () {
- });
- }
-
- function updateLayoutGrid(layoutKeys, gridSettings) {
- var layout = vm.dashboard.configuration.states[layoutKeys.state].layouts[layoutKeys.layout];
- var layoutCtx = vm.layouts[layoutKeys.layout];
- layoutCtx.widgets = [];
- dashboardUtils.updateLayoutSettings(layout, gridSettings);
- var layoutsData = dashboardUtils.getStateLayoutsData(vm.dashboard, layoutKeys.state);
- layoutCtx.widgets = layoutsData[layoutKeys.layout].widgets;
- }
-
- function updateLayouts(layouts) {
- dashboardUtils.setLayouts(vm.dashboard, vm.dashboardCtx.state, layouts);
- openDashboardState(vm.dashboardCtx.state);
- }
-
- function updateStates(states) {
- vm.dashboard.configuration.states = states;
- dashboardUtils.removeUnusedWidgets(vm.dashboard);
- var targetState = vm.dashboardCtx.state;
- if (!vm.dashboard.configuration.states[targetState]) {
- targetState = dashboardUtils.getRootStateId(vm.dashboardConfiguration.states);
- }
- openDashboardState(targetState);
- }
-
- function editWidget($event, layoutCtx, widget) {
- $event.stopPropagation();
- if (vm.editingWidgetOriginal === widget) {
- $timeout(onEditWidgetClosed());
- } else {
- var transition = !vm.forceDashboardMobileMode;
- vm.editingWidgetOriginal = widget;
- vm.editingWidgetLayoutOriginal = layoutCtx.widgetLayouts[widget.id];
- vm.editingWidget = angular.copy(vm.editingWidgetOriginal);
- vm.editingWidgetLayout = angular.copy(vm.editingWidgetLayoutOriginal);
- vm.editingLayoutCtx = layoutCtx;
- vm.editingWidgetSubtitle = widgetService.getInstantWidgetInfo(vm.editingWidget).widgetName;
- vm.forceDashboardMobileMode = true;
- vm.isEditingWidget = true;
- if (layoutCtx) {
- var delayOffset = transition ? 350 : 0;
- var delay = transition ? 400 : 300;
- $timeout(function () {
- layoutCtx.ctrl.highlightWidget(vm.editingWidgetOriginal, delay);
- }, delayOffset, false);
- }
- }
- }
- function exportDashboard($event) {
- $event.stopPropagation();
- importExport.exportDashboard(vm.currentDashboardId);
- }
-
- function exportWidget($event, layoutCtx, widget) {
- $event.stopPropagation();
- importExport.exportWidget(vm.dashboard, vm.dashboardCtx.state, layoutCtx.id, widget);
- }
-
- function importWidget($event) {
- $event.stopPropagation();
- importExport.importWidget($event, vm.dashboard, vm.dashboardCtx.state,
- selectTargetLayout, entityAliasesUpdated).then(
- function success(importData) {
- var widget = importData.widget;
- var layoutId = importData.layoutId;
- vm.layouts[layoutId].layoutCtx.widgets.push(widget);
- }
- );
- }
-
- function widgetMouseDown($event, layoutCtx, widget) {
- if (vm.isEdit && !vm.isEditingWidget) {
- layoutCtx.ctrl.selectWidget(widget, 0);
- }
- }
-
- function widgetClicked($event, layoutCtx, widget) {
- if (vm.isEditingWidget) {
- editWidget($event, layoutCtx, widget);
- }
- }
-
- function prepareDashboardContextMenu(layoutCtx) {
- var dashboardContextActions = [];
- if (vm.isEdit && !vm.isEditingWidget && !vm.widgetEditMode) {
- dashboardContextActions.push(
- {
- action: openDashboardSettings,
- enabled: true,
- value: "dashboard.settings",
- icon: "settings"
- }
- );
- dashboardContextActions.push(
- {
- action: openEntityAliases,
- enabled: true,
- value: "entity.aliases",
- icon: "devices_other"
- }
- );
- dashboardContextActions.push(
- {
- action: function ($event) {
- layoutCtx.ctrl.pasteWidget($event);
- },
- enabled: itembuffer.hasWidget(),
- value: "action.paste",
- icon: "content_paste",
- shortcut: "M-V"
- }
- );
- dashboardContextActions.push(
- {
- action: function ($event) {
- layoutCtx.ctrl.pasteWidgetReference($event);
- },
- enabled: itembuffer.canPasteWidgetReference(vm.dashboard, vm.dashboardCtx.state, layoutCtx.id),
- value: "action.paste-reference",
- icon: "content_paste",
- shortcut: "M-I"
- }
- );
-
- }
- return dashboardContextActions;
- }
-
- function prepareWidgetContextMenu(layoutCtx) {
- var widgetContextActions = [];
- if (vm.isEdit && !vm.isEditingWidget) {
- widgetContextActions.push(
- {
- action: function (event, widget) {
- editWidget(event, layoutCtx, widget);
- },
- enabled: true,
- value: "action.edit",
- icon: "edit"
- }
- );
- if (!vm.widgetEditMode) {
- widgetContextActions.push(
- {
- action: function (event, widget) {
- copyWidget(event, layoutCtx, widget);
- },
- enabled: true,
- value: "action.copy",
- icon: "content_copy",
- shortcut: "M-C"
- }
- );
- widgetContextActions.push(
- {
- action: function (event, widget) {
- copyWidgetReference(event, layoutCtx, widget);
- },
- enabled: true,
- value: "action.copy-reference",
- icon: "content_copy",
- shortcut: "M-R"
- }
- );
- widgetContextActions.push(
- {
- action: function (event, widget) {
- removeWidget(event, layoutCtx, widget);
- },
- enabled: true,
- value: "action.delete",
- icon: "clear",
- shortcut: "M-X"
- }
- );
- }
- }
- return widgetContextActions;
- }
-
- function copyWidget($event, layoutCtx, widget) {
- itembuffer.copyWidget(vm.dashboard, vm.dashboardCtx.state, layoutCtx.id, widget);
- }
-
- function copyWidgetReference($event, layoutCtx, widget) {
- itembuffer.copyWidgetReference(vm.dashboard, vm.dashboardCtx.state, layoutCtx.id, widget);
- }
-
- function helpLinkIdForWidgetType() {
- var link = 'widgetsConfig';
- if (vm.editingWidget && vm.editingWidget.type) {
- switch (vm.editingWidget.type) {
- case types.widgetType.timeseries.value: {
- link = 'widgetsConfigTimeseries';
- break;
- }
- case types.widgetType.latest.value: {
- link = 'widgetsConfigLatest';
- break;
- }
- case types.widgetType.rpc.value: {
- link = 'widgetsConfigRpc';
- break;
- }
- case types.widgetType.alarm.value: {
- link = 'widgetsConfigAlarm';
- break;
- }
- case types.widgetType.static.value: {
- link = 'widgetsConfigStatic';
- break;
- }
- }
- }
- return link;
- }
-
- function toolbarAlwaysOpen() {
- if (vm.dashboard && vm.dashboard.configuration.settings &&
- angular.isDefined(vm.dashboard.configuration.settings.toolbarAlwaysOpen)) {
- return vm.dashboard.configuration.settings.toolbarAlwaysOpen;
- } else {
- return true;
- }
- }
-
- function displayTitle() {
- if (vm.dashboard && vm.dashboard.configuration.settings &&
- angular.isDefined(vm.dashboard.configuration.settings.showTitle)) {
- return vm.dashboard.configuration.settings.showTitle;
- } else {
- return false;
- }
- }
-
- function displayExport() {
- if (vm.dashboard && vm.dashboard.configuration.settings &&
- angular.isDefined(vm.dashboard.configuration.settings.showDashboardExport)) {
- return vm.dashboard.configuration.settings.showDashboardExport;
- } else {
- return true;
- }
- }
-
- function displayDashboardTimewindow() {
- if (vm.dashboard && vm.dashboard.configuration.settings &&
- angular.isDefined(vm.dashboard.configuration.settings.showDashboardTimewindow)) {
- return vm.dashboard.configuration.settings.showDashboardTimewindow;
- } else {
- return true;
- }
- }
-
- function displayDashboardsSelect() {
- if (vm.dashboard && vm.dashboard.configuration.settings &&
- angular.isDefined(vm.dashboard.configuration.settings.showDashboardsSelect)) {
- return vm.dashboard.configuration.settings.showDashboardsSelect;
- } else {
- return true;
- }
- }
-
- function displayEntitiesSelect() {
- if (vm.dashboard && vm.dashboard.configuration.settings &&
- angular.isDefined(vm.dashboard.configuration.settings.showEntitiesSelect)) {
- return vm.dashboard.configuration.settings.showEntitiesSelect;
- } else {
- return true;
- }
- }
-
- function hideFullscreenButton() {
- return vm.widgetEditMode || vm.iframeMode || $rootScope.forceFullscreen || $state.current.name === 'dashboard';
- }
-
- function onRevertWidgetEdit(widgetForm) {
- if (widgetForm.$dirty) {
- widgetForm.$setPristine();
- vm.editingWidget = angular.copy(vm.editingWidgetOriginal);
- vm.editingWidgetLayout = angular.copy(vm.editingWidgetLayoutOriginal);
- }
- }
-
- function saveWidget(widgetForm) {
- widgetForm.$setPristine();
- var widget = angular.copy(vm.editingWidget);
- var widgetLayout = angular.copy(vm.editingWidgetLayout);
- var id = vm.editingWidgetOriginal.id;
- var index = vm.editingLayoutCtx.widgets.indexOf(vm.editingWidgetOriginal);
- vm.dashboardConfiguration.widgets[id] = widget;
- vm.editingWidgetOriginal = widget;
- vm.editingWidgetLayoutOriginal = widgetLayout;
- vm.editingLayoutCtx.widgets[index] = widget;
- vm.editingLayoutCtx.widgetLayouts[widget.id] = widgetLayout;
- vm.editingLayoutCtx.ctrl.highlightWidget(vm.editingWidgetOriginal, 0);
- }
-
- function onEditWidgetClosed() {
- vm.editingWidgetOriginal = null;
- vm.editingWidget = null;
- vm.editingWidgetLayoutOriginal = null;
- vm.editingWidgetLayout = null;
- vm.editingLayoutCtx = null;
- vm.editingWidgetSubtitle = null;
- vm.isEditingWidget = false;
- resetHighlight();
- vm.forceDashboardMobileMode = false;
- }
-
- function addWidget(event, layoutCtx) {
- loadWidgetLibrary();
- vm.isAddingWidget = true;
- vm.addingLayoutCtx = layoutCtx;
- }
-
- function onAddWidgetClosed() {
- vm.timeseriesWidgetTypes = [];
- vm.latestWidgetTypes = [];
- vm.rpcWidgetTypes = [];
- vm.alarmWidgetTypes = [];
- vm.staticWidgetTypes = [];
- }
-
- function selectTargetLayout($event) {
- var deferred = $q.defer();
- var layouts = vm.dashboardConfiguration.states[vm.dashboardCtx.state].layouts;
- var layoutIds = Object.keys(layouts);
- if (layoutIds.length > 1) {
- $mdDialog.show({
- controller: 'SelectTargetLayoutController',
- controllerAs: 'vm',
- templateUrl: selectTargetLayoutTemplate,
- parent: angular.element($document[0].body),
- fullscreen: true,
- multiple: true,
- targetEvent: $event
- }).then(
- function success(layoutId) {
- deferred.resolve(layoutId);
- },
- function fail() {
- deferred.reject();
- }
- );
- } else {
- deferred.resolve(layoutIds[0]);
- }
- return deferred.promise;
- }
-
- function addWidgetFromType(event, widget) {
- vm.onAddWidgetClosed();
- vm.isAddingWidget = false;
- widgetService.getWidgetInfo(widget.bundleAlias, widget.typeAlias, widget.isSystemType).then(
- function (widgetTypeInfo) {
- var config = angular.fromJson(widgetTypeInfo.defaultConfig);
- config.title = 'New ' + widgetTypeInfo.widgetName;
- config.datasources = [];
- var newWidget = {
- isSystemType: widget.isSystemType,
- bundleAlias: widget.bundleAlias,
- typeAlias: widgetTypeInfo.alias,
- type: widgetTypeInfo.type,
- title: 'New widget',
- sizeX: widgetTypeInfo.sizeX,
- sizeY: widgetTypeInfo.sizeY,
- config: config
- };
-
- function addWidgetToLayout(widget, layoutId) {
- dashboardUtils.addWidgetToLayout(vm.dashboard, vm.dashboardCtx.state, layoutId, widget);
- vm.layouts[layoutId].layoutCtx.widgets.push(widget);
- }
-
- function addWidget(widget) {
- if (vm.addingLayoutCtx) {
- addWidgetToLayout(widget, vm.addingLayoutCtx.id);
- vm.addingLayoutCtx = null;
- } else {
- selectTargetLayout(event).then(
- function success(layoutId) {
- addWidgetToLayout(widget, layoutId);
- }
- );
- }
- }
-
- if (widgetTypeInfo.typeParameters.useCustomDatasources) {
- addWidget(newWidget);
- } else {
- $mdDialog.show({
- controller: 'AddWidgetController',
- controllerAs: 'vm',
- templateUrl: addWidgetTemplate,
- locals: {
- dashboard: vm.dashboard,
- aliasController: vm.dashboardCtx.aliasController,
- widget: newWidget,
- widgetInfo: widgetTypeInfo
- },
- parent: angular.element($document[0].body),
- fullscreen: true,
- multiple: true,
- targetEvent: event,
- onComplete: function () {
- var w = angular.element($window);
- w.triggerHandler('resize');
- }
- }).then(function (result) {
- var widget = result.widget;
- addWidget(widget);
- }, function () {
- });
- }
- }
- );
- }
-
- function removeWidget(event, layoutCtx, widget) {
- var title = widget.config.title;
- if (!title || title.length === 0) {
- title = widgetService.getInstantWidgetInfo(widget).widgetName;
- }
- var confirm = $mdDialog.confirm()
- .targetEvent(event)
- .title($translate.instant('widget.remove-widget-title', {widgetTitle: title}))
- .htmlContent($translate.instant('widget.remove-widget-text'))
- .ariaLabel($translate.instant('widget.remove'))
- .cancel($translate.instant('action.no'))
- .ok($translate.instant('action.yes'));
- $mdDialog.show(confirm).then(function () {
- var index = layoutCtx.widgets.indexOf(widget);
- if (index > -1) {
- layoutCtx.widgets.splice(index, 1);
- dashboardUtils.removeWidgetFromLayout(vm.dashboard, vm.dashboardCtx.state, layoutCtx.id, widget.id);
- }
- });
- }
-
- function pasteWidget(event, layoutCtx, pos) {
- itembuffer.pasteWidget(vm.dashboard, vm.dashboardCtx.state, layoutCtx.id, pos, entityAliasesUpdated).then(
- function (widget) {
- if (widget) {
- layoutCtx.widgets.push(widget);
- }
- }
- );
- }
-
- function pasteWidgetReference(event, layoutCtx, pos) {
- itembuffer.pasteWidgetReference(vm.dashboard, vm.dashboardCtx.state, layoutCtx.id, pos).then(
- function (widget) {
- if (widget) {
- layoutCtx.widgets.push(widget);
- }
- }
- );
- }
-
- function setEditMode(isEdit, revert) {
- vm.isEdit = isEdit;
- if (vm.isEdit) {
- vm.dashboardCtx.stateController.preserveState();
- vm.prevDashboard = angular.copy(vm.dashboard);
- } else {
- if (vm.widgetEditMode) {
- if (revert) {
- vm.dashboard = vm.prevDashboard;
- }
- } else {
- resetHighlight();
- if (revert) {
- vm.dashboard = vm.prevDashboard;
- vm.dashboardConfiguration = vm.dashboard.configuration;
- vm.dashboardCtx.dashboardTimewindow = vm.dashboardConfiguration.timewindow;
- entityAliasesUpdated();
- } else {
- vm.dashboard.configuration.timewindow = vm.dashboardCtx.dashboardTimewindow;
- }
- }
- }
- }
-
- function resetHighlight() {
- for (var l in vm.layouts) {
- if (vm.layouts[l].layoutCtx) {
- if (vm.layouts[l].layoutCtx.ctrl) {
- vm.layouts[l].layoutCtx.ctrl.resetHighlight();
- }
- }
- }
- }
-
- function toggleDashboardEditMode() {
- setEditMode(!vm.isEdit, true);
- }
-
- function saveDashboard() {
- setEditMode(false, false);
- notifyDashboardUpdated();
- }
-
-/* function showAliasesResolutionError(error) {
- var alert = $mdDialog.alert()
- .parent(angular.element($document[0].body))
- .clickOutsideToClose(true)
- .title($translate.instant('dashboard.alias-resolution-error-title'))
- .htmlContent($translate.instant(error))
- .ariaLabel($translate.instant('dashboard.alias-resolution-error-title'))
- .ok($translate.instant('action.close'))
- alert._options.skipHide = true;
- alert._options.fullscreen = true;
-
- $mdDialog.show(alert);
- }*/
-
- function entityAliasesUpdated() {
- vm.dashboardCtx.aliasController.updateEntityAliases(vm.dashboard.configuration.entityAliases);
- }
-
- function notifyDashboardUpdated() {
- if (vm.widgetEditMode) {
- var parentScope = $window.parent.angular.element($window.frameElement).scope();
- var widget = vm.layouts.main.layoutCtx.widgets[0];
- var layout = vm.layouts.main.layoutCtx.widgetLayouts[widget.id];
- widget.sizeX = layout.sizeX;
- widget.sizeY = layout.sizeY;
- parentScope.$root.$broadcast('widgetEditUpdated', widget);
- parentScope.$root.$apply();
- } else {
- dashboardService.saveDashboard(vm.dashboard);
- }
- }
-
-}
diff --git a/ui/src/app/dashboard/dashboard.directive.js b/ui/src/app/dashboard/dashboard.directive.js
deleted file mode 100644
index 37e3485d31..0000000000
--- a/ui/src/app/dashboard/dashboard.directive.js
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-/* eslint-disable import/no-unresolved, import/default */
-
-import dashboardFieldsetTemplate from './dashboard-fieldset.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-/*@ngInject*/
-export default function DashboardDirective($compile, $templateCache, $translate, types, toast, dashboardService) {
- var linker = function (scope, element) {
- var template = $templateCache.get(dashboardFieldsetTemplate);
- element.html(template);
- scope.publicLink = null;
- scope.$watch('dashboard', function(newVal) {
- if (newVal) {
- if (scope.dashboard.publicCustomerId) {
- scope.publicLink = dashboardService.getPublicDashboardLink(scope.dashboard);
- } else {
- scope.publicLink = null;
- }
- }
- });
-
- scope.onPublicLinkCopied = function() {
- toast.showSuccess($translate.instant('dashboard.public-link-copied-message'), 750, angular.element(element).parent().parent(), 'bottom left');
- };
-
- $compile(element.contents())(scope);
- }
- return {
- restrict: "E",
- link: linker,
- scope: {
- dashboard: '=',
- isEdit: '=',
- customerId: '=',
- dashboardScope: '=',
- theForm: '=',
- onMakePublic: '&',
- onMakePrivate: '&',
- onManageAssignedCustomers: '&',
- onUnassignFromCustomer: '&',
- onExportDashboard: '&',
- onDeleteDashboard: '&'
- }
- };
-}
diff --git a/ui/src/app/dashboard/dashboard.routes.js b/ui/src/app/dashboard/dashboard.routes.js
deleted file mode 100644
index 43ec230c6d..0000000000
--- a/ui/src/app/dashboard/dashboard.routes.js
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-/* eslint-disable import/no-unresolved, import/default */
-
-import dashboardsTemplate from './dashboards.tpl.html';
-import dashboardTemplate from './dashboard.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-/*@ngInject*/
-export default function DashboardRoutes($stateProvider) {
- $stateProvider
- .state('home.dashboards', {
- url: '/dashboards',
- params: {'topIndex': 0},
- module: 'private',
- auth: ['TENANT_ADMIN', 'CUSTOMER_USER'],
- views: {
- "content@home": {
- templateUrl: dashboardsTemplate,
- controller: 'DashboardsController',
- controllerAs: 'vm'
- }
- },
- data: {
- dashboardsType: 'tenant',
- searchEnabled: true,
- pageTitle: 'dashboard.dashboards'
- },
- ncyBreadcrumb: {
- label: '{"icon": "dashboard", "label": "dashboard.dashboards"}'
- }
- })
- .state('home.customers.dashboards', {
- url: '/:customerId/dashboards',
- params: {'topIndex': 0},
- module: 'private',
- auth: ['TENANT_ADMIN'],
- views: {
- "content@home": {
- templateUrl: dashboardsTemplate,
- controllerAs: 'vm',
- controller: 'DashboardsController'
- }
- },
- data: {
- dashboardsType: 'customer',
- searchEnabled: true,
- pageTitle: 'customer.dashboards'
- },
- ncyBreadcrumb: {
- label: '{"icon": "dashboard", "label": "{{ vm.customerDashboardsTitle }}", "translate": "false"}'
- }
- })
- .state('home.dashboards.dashboard', {
- url: '/:dashboardId?state',
- reloadOnSearch: false,
- module: 'private',
- auth: ['TENANT_ADMIN', 'CUSTOMER_USER'],
- views: {
- "content@home": {
- templateUrl: dashboardTemplate,
- controller: 'DashboardController',
- controllerAs: 'vm'
- }
- },
- data: {
- widgetEditMode: false,
- searchEnabled: false,
- pageTitle: 'dashboard.dashboard'
- },
- ncyBreadcrumb: {
- label: '{"icon": "dashboard", "label": "{{ vm.dashboard.title }}", "translate": "false"}'
- }
- })
- .state('dashboard', {
- url: '/dashboard/:dashboardId?state',
- reloadOnSearch: false,
- module: 'private',
- auth: ['TENANT_ADMIN', 'CUSTOMER_USER'],
- views: {
- "@": {
- templateUrl: dashboardTemplate,
- controller: 'DashboardController',
- controllerAs: 'vm'
- }
- },
- data: {
- widgetEditMode: false,
- searchEnabled: false,
- pageTitle: 'dashboard.dashboard'
- }
- })
- .state('home.customers.dashboards.dashboard', {
- url: '/:dashboardId?state',
- reloadOnSearch: false,
- module: 'private',
- auth: ['TENANT_ADMIN', 'CUSTOMER_USER'],
- views: {
- "content@home": {
- templateUrl: dashboardTemplate,
- controller: 'DashboardController',
- controllerAs: 'vm'
- }
- },
- data: {
- searchEnabled: false,
- pageTitle: 'customer.dashboard'
- },
- ncyBreadcrumb: {
- label: '{"icon": "dashboard", "label": "customer.dashboard"}'
- }
- })
-}
diff --git a/ui/src/app/dashboard/dashboard.scss b/ui/src/app/dashboard/dashboard.scss
deleted file mode 100644
index a93aca40f3..0000000000
--- a/ui/src/app/dashboard/dashboard.scss
+++ /dev/null
@@ -1,149 +0,0 @@
-/**
- * Copyright © 2016-2020 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 "~compass-sass-mixins/lib/compass";
-
-@import "../../scss/constants";
-
-$toolbar-height: 50px !default;
-$fullscreen-toolbar-height: 64px !default;
-$mobile-toolbar-height: 84px !default;
-
-section.tb-dashboard-title {
- position: absolute;
- top: 0;
- left: 20px;
-}
-
-input.tb-dashboard-title {
- height: 38px;
- font-size: 2rem;
- font-weight: 500;
- letter-spacing: .005em;
-}
-
-div.tb-padded {
- top: 60px;
-}
-
-section.tb-padded {
- top: 60px;
-}
-
-div.tb-shrinked {
- width: 40%;
-}
-
-tb-details-sidenav.tb-widget-details-sidenav {
- md-sidenav.tb-sidenav-details {
- @media (min-width: $layout-breakpoint-sm) {
- width: 85% !important;
- }
-
- @media (min-width: $layout-breakpoint-md) {
- width: 75% !important;
- }
-
- @media (min-width: $layout-breakpoint-lg) {
- width: 60% !important;
- }
- }
-}
-
-/***********************
- * dashboard toolbar
- ***********************/
-
-section.tb-dashboard-toolbar {
- position: absolute;
- top: 0;
- left: 0;
- z-index: 13;
- pointer-events: none;
-
- &.tb-dashboard-toolbar-opened {
- right: 0;
- // transition: right .3s cubic-bezier(.55, 0, .55, .2);
- }
-
- &.tb-dashboard-toolbar-closed {
- right: 18px;
-
- transition: right .3s cubic-bezier(.55, 0, .55, .2) .2s;
- }
-}
-
-.tb-dashboard-container {
- &.tb-dashboard-toolbar-opened {
- &.is-fullscreen {
- margin-top: $mobile-toolbar-height;
-
- @media (min-width: $layout-breakpoint-sm) {
- margin-top: $fullscreen-toolbar-height;
- }
- }
-
- &:not(.is-fullscreen) {
- margin-top: $mobile-toolbar-height;
-
- @media (min-width: $layout-breakpoint-sm) {
- margin-top: $toolbar-height;
- }
-
- transition: margin-top .3s cubic-bezier(.55, 0, .55, .2);
- }
- }
-
- &.tb-dashboard-toolbar-closed {
- margin-top: 0;
-
- transition: margin-top .3s cubic-bezier(.55, 0, .55, .2) .2s;
- }
-
- .tb-dashboard-layouts {
- md-backdrop {
- z-index: 1;
- }
-
- #tb-right-layout {
- md-sidenav {
- z-index: 1;
- }
- }
- }
-}
-
-/*****************************
- * dashboard powered by footer
- ****************************/
-
-section.tb-powered-by-footer {
- position: absolute;
- right: 25px;
- bottom: 5px;
- z-index: 30;
- pointer-events: none;
-
- span {
- font-size: 12px;
-
- a {
- font-weight: 700;
- text-decoration: none;
- pointer-events: all;
- border: none;
- }
- }
-}
diff --git a/ui/src/app/dashboard/dashboard.tpl.html b/ui/src/app/dashboard/dashboard.tpl.html
deleted file mode 100644
index 1ce68abbd2..0000000000
--- a/ui/src/app/dashboard/dashboard.tpl.html
+++ /dev/null
@@ -1,336 +0,0 @@
-
-
-
-
-
-
- dashboard.configuration-error
-
-
-
-
-
-
-
-
-
-
-
-
-
- {{ 'widgets-bundle.current' | translate }}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- widgets-bundle.empty
- widget.select-widgets-bundle
-
-
-
-
-
-
diff --git a/ui/src/app/dashboard/dashboards.controller.js b/ui/src/app/dashboard/dashboards.controller.js
deleted file mode 100644
index 3136e5afe4..0000000000
--- a/ui/src/app/dashboard/dashboards.controller.js
+++ /dev/null
@@ -1,614 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-/* eslint-disable import/no-unresolved, import/default */
-
-import addDashboardTemplate from './add-dashboard.tpl.html';
-import dashboardCard from './dashboard-card.tpl.html';
-import addDashboardsToCustomerTemplate from './add-dashboards-to-customer.tpl.html';
-import makeDashboardPublicDialogTemplate from './make-dashboard-public-dialog.tpl.html';
-import manageAssignedCustomersTemplate from './manage-assigned-customers.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-import './dashboard-card.scss';
-
-/*@ngInject*/
-export function MakeDashboardPublicDialogController($mdDialog, $translate, toast, dashboardService, dashboard) {
-
- var vm = this;
-
- vm.dashboard = dashboard;
- vm.publicLink = dashboardService.getPublicDashboardLink(dashboard);
-
- vm.onPublicLinkCopied = onPublicLinkCopied;
- vm.close = close;
-
- function onPublicLinkCopied(){
- toast.showSuccess($translate.instant('dashboard.public-link-copied-message'), 750, angular.element('#make-dialog-public-content'), 'bottom left');
- }
-
- function close() {
- $mdDialog.hide();
- }
-
-}
-
-/*@ngInject*/
-export function DashboardCardController(types) {
-
- var vm = this;
- vm.types = types;
-
-}
-
-/*@ngInject*/
-export function DashboardsController(userService, dashboardService, customerService, importExport, types,
- $state, $stateParams, $mdDialog, $document, $q, $translate) {
-
- var customerId = $stateParams.customerId;
-
- var dashboardActionsList = [
- {
- onAction: function ($event, item) {
- vm.grid.openItem($event, item);
- },
- name: function() { return $translate.instant('dashboard.details') },
- details: function() { return $translate.instant('dashboard.dashboard-details') },
- icon: "edit"
- }
- ];
-
- var dashboardGroupActionsList = [];
-
- var vm = this;
- vm.types = types;
-
- vm.dashboardGridConfig = {
- deleteItemTitleFunc: deleteDashboardTitle,
- deleteItemContentFunc: deleteDashboardText,
- deleteItemsTitleFunc: deleteDashboardsTitle,
- deleteItemsActionTitleFunc: deleteDashboardsActionTitle,
- deleteItemsContentFunc: deleteDashboardsText,
-
- loadItemDetailsFunc: loadDashboard,
-
- saveItemFunc: saveDashboard,
-
- clickItemFunc: openDashboard,
-
- getItemTitleFunc: getDashboardTitle,
- itemCardController: 'DashboardCardController',
- itemCardTemplateUrl: dashboardCard,
- parentCtl: vm,
-
- actionsList: dashboardActionsList,
- groupActionsList: dashboardGroupActionsList,
-
- onGridInited: gridInited,
-
- addItemTemplateUrl: addDashboardTemplate,
-
- addItemText: function() { return $translate.instant('dashboard.add-dashboard-text') },
- noItemsText: function() { return $translate.instant('dashboard.no-dashboards-text') },
- itemDetailsText: function() { return $translate.instant('dashboard.dashboard-details') },
- isDetailsReadOnly: function () {
- return vm.dashboardsScope === 'customer_user';
- },
- isSelectionEnabled: function () {
- return !(vm.dashboardsScope === 'customer_user');
- }
- };
-
- if (angular.isDefined($stateParams.items) && $stateParams.items !== null) {
- vm.dashboardGridConfig.items = $stateParams.items;
- }
-
- if (angular.isDefined($stateParams.topIndex) && $stateParams.topIndex > 0) {
- vm.dashboardGridConfig.topIndex = $stateParams.topIndex;
- }
-
- vm.dashboardsScope = $state.$current.data.dashboardsType;
-
- vm.makePublic = makePublic;
- vm.makePrivate = makePrivate;
- vm.manageAssignedCustomers = manageAssignedCustomers;
- vm.unassignFromCustomer = unassignFromCustomer;
- vm.exportDashboard = exportDashboard;
-
- initController();
-
- function initController() {
- var fetchDashboardsFunction = null;
- var deleteDashboardFunction = null;
- var refreshDashboardsParamsFunction = null;
-
- var user = userService.getCurrentUser();
-
- if (user.authority === 'CUSTOMER_USER') {
- vm.dashboardsScope = 'customer_user';
- customerId = user.customerId;
- }
-
- if (customerId) {
- vm.customerId = customerId;
- vm.customerDashboardsTitle = $translate.instant('customer.dashboards');
- customerService.getShortCustomerInfo(customerId).then(
- function success(info) {
- if (info.isPublic) {
- vm.customerDashboardsTitle = $translate.instant('customer.public-dashboards');
- }
- }
- );
- }
-
- if (vm.dashboardsScope === 'tenant') {
- fetchDashboardsFunction = function (pageLink) {
- return dashboardService.getTenantDashboards(pageLink);
- };
- deleteDashboardFunction = function (dashboardId) {
- return dashboardService.deleteDashboard(dashboardId);
- };
- refreshDashboardsParamsFunction = function () {
- return {"topIndex": vm.topIndex};
- };
-
- dashboardActionsList.push(
- {
- onAction: function ($event, item) {
- exportDashboard($event, item);
- },
- name: function() { $translate.instant('action.export') },
- details: function() { return $translate.instant('dashboard.export') },
- icon: "file_download"
- });
-
- dashboardActionsList.push({
- onAction: function ($event, item) {
- makePublic($event, item);
- },
- name: function() { return $translate.instant('action.share') },
- details: function() { return $translate.instant('dashboard.make-public') },
- icon: "share",
- isEnabled: function(dashboard) {
- return dashboard && !dashboard.publicCustomerId;
- }
- });
- dashboardActionsList.push({
- onAction: function ($event, item) {
- makePrivate($event, item);
- },
- name: function() { return $translate.instant('action.make-private') },
- details: function() { return $translate.instant('dashboard.make-private') },
- icon: "reply",
- isEnabled: function(dashboard) {
- return dashboard && dashboard.publicCustomerId;
- }
- });
- dashboardActionsList.push({
- onAction: function ($event, item) {
- manageAssignedCustomers($event, item);
- },
- name: function() { return $translate.instant('action.assign') },
- details: function() { return $translate.instant('dashboard.manage-assigned-customers') },
- icon: "assignment_ind",
- isEnabled: function(dashboard) {
- return dashboard;
- }
- });
-
- /*dashboardActionsList.push({
- onAction: function ($event, item) {
- assignToCustomer($event, [ item.id.id ]);
- },
- name: function() { return $translate.instant('action.assign') },
- details: function() { return $translate.instant('dashboard.assign-to-customer') },
- icon: "assignment_ind",
- isEnabled: function(dashboard) {
- return dashboard && (!dashboard.customerId || dashboard.customerId.id === types.id.nullUid);
- }
- });*/
- /*dashboardActionsList.push({
- onAction: function ($event, item) {
- unassignFromCustomer($event, item, false);
- },
- name: function() { return $translate.instant('action.unassign') },
- details: function() { return $translate.instant('dashboard.unassign-from-customer') },
- icon: "assignment_return",
- isEnabled: function(dashboard) {
- return dashboard && dashboard.customerId && dashboard.customerId.id !== types.id.nullUid && !dashboard.assignedCustomer.isPublic;
- }
- });*/
-
- dashboardActionsList.push(
- {
- onAction: function ($event, item) {
- vm.grid.deleteItem($event, item);
- },
- name: function() { return $translate.instant('action.delete') },
- details: function() { return $translate.instant('dashboard.delete') },
- icon: "delete"
- }
- );
-
- dashboardGroupActionsList.push(
- {
- onAction: function ($event, items) {
- assignDashboardsToCustomers($event, items);
- },
- name: function() { return $translate.instant('dashboard.assign-dashboards') },
- details: function(selectedCount) {
- return $translate.instant('dashboard.assign-dashboards-text', {count: selectedCount}, "messageformat");
- },
- icon: "assignment_ind"
- }
- );
- dashboardGroupActionsList.push(
- {
- onAction: function ($event, items) {
- unassignDashboardsFromCustomers($event, items);
- },
- name: function() { return $translate.instant('dashboard.unassign-dashboards') },
- details: function(selectedCount) {
- return $translate.instant('dashboard.unassign-dashboards-action-text', {count: selectedCount}, "messageformat");
- },
- icon: "assignment_return" }
- );
-
- dashboardGroupActionsList.push(
- {
- onAction: function ($event) {
- vm.grid.deleteItems($event);
- },
- name: function() { return $translate.instant('dashboard.delete-dashboards') },
- details: deleteDashboardsActionTitle,
- icon: "delete"
- }
- );
-
- vm.dashboardGridConfig.addItemActions = [];
- vm.dashboardGridConfig.addItemActions.push({
- onAction: function ($event) {
- vm.grid.addItem($event);
- },
- name: function() { return $translate.instant('action.create') },
- details: function() { return $translate.instant('dashboard.create-new-dashboard') },
- icon: "insert_drive_file"
- });
- vm.dashboardGridConfig.addItemActions.push({
- onAction: function ($event) {
- importExport.importDashboard($event).then(
- function() {
- vm.grid.refreshList();
- }
- );
- },
- name: function() { return $translate.instant('action.import') },
- details: function() { return $translate.instant('dashboard.import') },
- icon: "file_upload"
- });
- } else if (vm.dashboardsScope === 'customer' || vm.dashboardsScope === 'customer_user') {
- fetchDashboardsFunction = function (pageLink) {
- return dashboardService.getCustomerDashboards(customerId, pageLink);
- };
- deleteDashboardFunction = function (dashboardId) {
- return dashboardService.unassignDashboardFromCustomer(customerId, dashboardId);
- };
- refreshDashboardsParamsFunction = function () {
- return {"customerId": customerId, "topIndex": vm.topIndex};
- };
-
- if (vm.dashboardsScope === 'customer') {
- dashboardActionsList.push(
- {
- onAction: function ($event, item) {
- exportDashboard($event, item);
- },
- name: function() { $translate.instant('action.export') },
- details: function() { return $translate.instant('dashboard.export') },
- icon: "file_download"
- }
- );
-
- dashboardActionsList.push(
- {
- onAction: function ($event, item) {
- makePrivate($event, item);
- },
- name: function() { return $translate.instant('action.make-private') },
- details: function() { return $translate.instant('dashboard.make-private') },
- icon: "reply",
- isEnabled: function(dashboard) {
- return dashboard && customerId == dashboard.publicCustomerId;
- }
- }
- );
-
- dashboardActionsList.push(
- {
- onAction: function ($event, item) {
- unassignFromCustomer($event, item, customerId);
- },
- name: function() { return $translate.instant('action.unassign') },
- details: function() { return $translate.instant('dashboard.unassign-from-customer') },
- icon: "assignment_return",
- isEnabled: function(dashboard) {
- return dashboard && customerId != dashboard.publicCustomerId;
- }
- }
- );
-
- dashboardGroupActionsList.push(
- {
- onAction: function ($event, items) {
- unassignDashboardsFromCustomer($event, items, customerId);
- },
- name: function() { return $translate.instant('dashboard.unassign-dashboards') },
- details: function(selectedCount) {
- return $translate.instant('dashboard.unassign-dashboards-action-title', {count: selectedCount}, "messageformat");
- },
- icon: "assignment_return"
- }
- );
-
- vm.dashboardGridConfig.addItemAction = {
- onAction: function ($event) {
- addDashboardsToCustomer($event);
- },
- name: function() { return $translate.instant('dashboard.assign-dashboards') },
- details: function() { return $translate.instant('dashboard.assign-new-dashboard') },
- icon: "add"
- };
- } else if (vm.dashboardsScope === 'customer_user') {
- vm.dashboardGridConfig.addItemAction = {};
- }
- }
-
- vm.dashboardGridConfig.refreshParamsFunc = refreshDashboardsParamsFunction;
- vm.dashboardGridConfig.fetchItemsFunc = fetchDashboardsFunction;
- vm.dashboardGridConfig.deleteItemFunc = deleteDashboardFunction;
-
- }
-
- function deleteDashboardTitle (dashboard) {
- return $translate.instant('dashboard.delete-dashboard-title', {dashboardTitle: dashboard.title});
- }
-
- function deleteDashboardText () {
- return $translate.instant('dashboard.delete-dashboard-text');
- }
-
- function deleteDashboardsTitle (selectedCount) {
- return $translate.instant('dashboard.delete-dashboards-title', {count: selectedCount}, 'messageformat');
- }
-
- function deleteDashboardsActionTitle(selectedCount) {
- return $translate.instant('dashboard.delete-dashboards-action-title', {count: selectedCount}, 'messageformat');
- }
-
- function deleteDashboardsText () {
- return $translate.instant('dashboard.delete-dashboards-text');
- }
-
- function gridInited(grid) {
- vm.grid = grid;
- }
-
- function getDashboardTitle(dashboard) {
- return dashboard ? dashboard.title : '';
- }
-
- function loadDashboard(dashboard) {
- return dashboardService.getDashboard(dashboard.id.id);
- }
-
- function saveDashboard(dashboard) {
- var deferred = $q.defer();
- dashboardService.saveDashboard(dashboard).then(
- function success(savedDashboard) {
- var dashboards = [ savedDashboard ];
- customerService.applyAssignedCustomersInfo(dashboards).then(
- function success(items) {
- if (items && items.length == 1) {
- deferred.resolve(items[0]);
- } else {
- deferred.reject();
- }
- },
- function fail() {
- deferred.reject();
- }
- );
- },
- function fail() {
- deferred.reject();
- }
- );
- return deferred.promise;
- }
-
- function manageAssignedCustomers($event, dashboard) {
- showManageAssignedCustomersDialog($event, [dashboard.id.id], 'manage', dashboard.assignedCustomersIds);
- }
-
- function assignDashboardsToCustomers($event, items) {
- var dashboardIds = [];
- for (var id in items.selections) {
- dashboardIds.push(id);
- }
- showManageAssignedCustomersDialog($event, dashboardIds, 'assign');
- }
-
- function unassignDashboardsFromCustomers($event, items) {
- var dashboardIds = [];
- for (var id in items.selections) {
- dashboardIds.push(id);
- }
- showManageAssignedCustomersDialog($event, dashboardIds, 'unassign');
- }
-
- function showManageAssignedCustomersDialog($event, dashboardIds, actionType, assignedCustomers) {
- if ($event) {
- $event.stopPropagation();
- }
- $mdDialog.show({
- controller: 'ManageAssignedCustomersController',
- controllerAs: 'vm',
- templateUrl: manageAssignedCustomersTemplate,
- locals: {actionType: actionType, dashboardIds: dashboardIds, assignedCustomers: assignedCustomers},
- parent: angular.element($document[0].body),
- fullscreen: true,
- targetEvent: $event
- }).then(function () {
- vm.grid.refreshList();
- }, function () {
- });
- }
-
- function addDashboardsToCustomer($event) {
- if ($event) {
- $event.stopPropagation();
- }
- var pageSize = 10;
- dashboardService.getTenantDashboards({limit: pageSize, textSearch: ''}).then(
- function success(_dashboards) {
- var dashboards = {
- pageSize: pageSize,
- data: _dashboards.data,
- nextPageLink: _dashboards.nextPageLink,
- selections: {},
- selectedCount: 0,
- hasNext: _dashboards.hasNext,
- pending: false
- };
- if (dashboards.hasNext) {
- dashboards.nextPageLink.limit = pageSize;
- }
- $mdDialog.show({
- controller: 'AddDashboardsToCustomerController',
- controllerAs: 'vm',
- templateUrl: addDashboardsToCustomerTemplate,
- locals: {customerId: customerId, dashboards: dashboards},
- parent: angular.element($document[0].body),
- fullscreen: true,
- targetEvent: $event
- }).then(function () {
- vm.grid.refreshList();
- }, function () {
- });
- },
- function fail() {
- });
- }
-
- function unassignFromCustomer($event, dashboard, customerId) {
- if ($event) {
- $event.stopPropagation();
- }
- var title = $translate.instant('dashboard.unassign-dashboard-title', {dashboardTitle: dashboard.title});
- var content = $translate.instant('dashboard.unassign-dashboard-text');
- var label = $translate.instant('dashboard.unassign-dashboard');
- var confirm = $mdDialog.confirm()
- .targetEvent($event)
- .title(title)
- .htmlContent(content)
- .ariaLabel(label)
- .cancel($translate.instant('action.no'))
- .ok($translate.instant('action.yes'));
- $mdDialog.show(confirm).then(function () {
- dashboardService.unassignDashboardFromCustomer(customerId, dashboard.id.id).then(function success() {
- vm.grid.refreshList();
- });
- });
- }
-
- function makePublic($event, dashboard) {
- if ($event) {
- $event.stopPropagation();
- }
- dashboardService.makeDashboardPublic(dashboard.id.id).then(function success(dashboard) {
- $mdDialog.show({
- controller: 'MakeDashboardPublicDialogController',
- controllerAs: 'vm',
- templateUrl: makeDashboardPublicDialogTemplate,
- locals: {dashboard: dashboard},
- parent: angular.element($document[0].body),
- fullscreen: true,
- targetEvent: $event
- }).then(function () {
- vm.grid.refreshList();
- });
- });
- }
-
- function makePrivate($event, dashboard) {
- if ($event) {
- $event.stopPropagation();
- }
- var title = $translate.instant('dashboard.make-private-dashboard-title', {dashboardTitle: dashboard.title});
- var content = $translate.instant('dashboard.make-private-dashboard-text');
- var label = $translate.instant('dashboard.make-private-dashboard');
- var confirm = $mdDialog.confirm()
- .targetEvent($event)
- .title(title)
- .htmlContent(content)
- .ariaLabel(label)
- .cancel($translate.instant('action.no'))
- .ok($translate.instant('action.yes'));
- $mdDialog.show(confirm).then(function () {
- dashboardService.makeDashboardPrivate(dashboard.id.id).then(function success() {
- vm.grid.refreshList();
- });
- });
- }
-
- function exportDashboard($event, dashboard) {
- $event.stopPropagation();
- importExport.exportDashboard(dashboard.id.id);
- }
-
- function unassignDashboardsFromCustomer($event, items, customerId) {
- var confirm = $mdDialog.confirm()
- .targetEvent($event)
- .title($translate.instant('dashboard.unassign-dashboards-title', {count: items.selectedCount}, 'messageformat'))
- .htmlContent($translate.instant('dashboard.unassign-dashboards-text'))
- .ariaLabel($translate.instant('dashboard.unassign-dashboards'))
- .cancel($translate.instant('action.no'))
- .ok($translate.instant('action.yes'));
- $mdDialog.show(confirm).then(function () {
- var tasks = [];
- for (var id in items.selections) {
- tasks.push(dashboardService.unassignDashboardFromCustomer(customerId, id));
- }
- $q.all(tasks).then(function () {
- vm.grid.refreshList();
- });
- });
- }
-
- function openDashboard($event, dashboard) {
- if ($event) {
- $event.stopPropagation();
- }
- if (vm.dashboardsScope === 'customer') {
- $state.go('home.customers.dashboards.dashboard', {
- customerId: customerId,
- dashboardId: dashboard.id.id
- });
- } else {
- $state.go('home.dashboards.dashboard', {dashboardId: dashboard.id.id});
- }
- }
-}
diff --git a/ui/src/app/dashboard/dashboards.tpl.html b/ui/src/app/dashboard/dashboards.tpl.html
deleted file mode 100644
index 2fb4e35e72..0000000000
--- a/ui/src/app/dashboard/dashboards.tpl.html
+++ /dev/null
@@ -1,44 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/ui/src/app/dashboard/edit-widget.directive.js b/ui/src/app/dashboard/edit-widget.directive.js
deleted file mode 100644
index dffb704683..0000000000
--- a/ui/src/app/dashboard/edit-widget.directive.js
+++ /dev/null
@@ -1,162 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-/* eslint-disable import/no-unresolved, import/default */
-
-import entityAliasDialogTemplate from '../entity/alias/entity-alias-dialog.tpl.html';
-import editWidgetTemplate from './edit-widget.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-/*@ngInject*/
-export default function EditWidgetDirective($compile, $templateCache, types, widgetService, entityService, $q, $document, $mdDialog) {
-
- var linker = function (scope, element) {
- var template = $templateCache.get(editWidgetTemplate);
- element.html(template);
-
- scope.$watch('widget', function () {
- if (scope.widget) {
- widgetService.getWidgetInfo(scope.widget.bundleAlias,
- scope.widget.typeAlias,
- scope.widget.isSystemType).then(
- function(widgetInfo) {
- scope.$applyAsync(function(scope) {
- scope.widgetConfig = {
- config: scope.widget.config,
- layout: scope.widgetLayout
- };
- var settingsSchema = widgetInfo.typeSettingsSchema || widgetInfo.settingsSchema;
- var dataKeySettingsSchema = widgetInfo.typeDataKeySettingsSchema || widgetInfo.dataKeySettingsSchema;
- scope.typeParameters = widgetInfo.typeParameters;
- scope.actionSources = widgetInfo.actionSources;
- scope.isDataEnabled = !widgetInfo.typeParameters.useCustomDatasources;
- if (!settingsSchema || settingsSchema === '') {
- scope.settingsSchema = {};
- } else {
- scope.settingsSchema = angular.fromJson(settingsSchema);
- }
- if (!dataKeySettingsSchema || dataKeySettingsSchema === '') {
- scope.dataKeySettingsSchema = {};
- } else {
- scope.dataKeySettingsSchema = angular.fromJson(dataKeySettingsSchema);
- }
-
- scope.functionsOnly = scope.dashboard ? false : true;
-
- scope.theForm.$setPristine();
- });
- }
- );
- }
- });
-
- scope.$watch('widgetLayout', function () {
- if (scope.widgetLayout && scope.widgetConfig) {
- scope.widgetConfig.layout = scope.widgetLayout;
- }
- });
-
- scope.fetchEntityKeys = function (entityAliasId, query, type) {
- var deferred = $q.defer();
- scope.aliasController.getAliasInfo(entityAliasId).then(
- function success(aliasInfo) {
- var entity = aliasInfo.currentEntity;
- if (entity) {
- entityService.getEntityKeys(entity.entityType, entity.id, query, type, {ignoreLoading: true}).then(
- function success(keys) {
- deferred.resolve(keys);
- },
- function fail() {
- deferred.resolve([]);
- }
- );
- } else {
- deferred.resolve([]);
- }
- },
- function fail() {
- deferred.resolve([]);
- }
- );
- return deferred.promise;
- };
-
- scope.fetchDashboardStates = function(query) {
- var deferred = $q.defer();
- var stateIds = Object.keys(scope.dashboard.configuration.states);
- var result = query ? stateIds.filter(
- createFilterForDashboardState(query)) : stateIds;
- if (result && result.length) {
- deferred.resolve(result);
- } else {
- deferred.resolve([query]);
- }
- return deferred.promise;
- }
-
- function createFilterForDashboardState (query) {
- var lowercaseQuery = angular.lowercase(query);
- return function filterFn(stateId) {
- return (angular.lowercase(stateId).indexOf(lowercaseQuery) === 0);
- };
- }
-
- scope.createEntityAlias = function (event, alias, allowedEntityTypes) {
-
- var deferred = $q.defer();
- var singleEntityAlias = {id: null, alias: alias, filter: {}};
-
- $mdDialog.show({
- controller: 'EntityAliasDialogController',
- controllerAs: 'vm',
- templateUrl: entityAliasDialogTemplate,
- locals: {
- isAdd: true,
- allowedEntityTypes: allowedEntityTypes,
- entityAliases: scope.dashboard.configuration.entityAliases,
- alias: singleEntityAlias
- },
- parent: angular.element($document[0].body),
- fullscreen: true,
- multiple: true,
- targetEvent: event
- }).then(function (singleEntityAlias) {
- scope.dashboard.configuration.entityAliases[singleEntityAlias.id] = singleEntityAlias;
- scope.aliasController.updateEntityAliases(scope.dashboard.configuration.entityAliases);
- deferred.resolve(singleEntityAlias);
- }, function () {
- deferred.reject();
- });
-
- return deferred.promise;
- };
-
- $compile(element.contents())(scope);
- }
-
- return {
- restrict: "E",
- link: linker,
- scope: {
- dashboard: '=',
- aliasController: '=',
- widgetEditMode: '=',
- widget: '=',
- widgetLayout: '=',
- theForm: '='
- }
- };
-}
diff --git a/ui/src/app/dashboard/edit-widget.tpl.html b/ui/src/app/dashboard/edit-widget.tpl.html
deleted file mode 100644
index c8b6e9e8a9..0000000000
--- a/ui/src/app/dashboard/edit-widget.tpl.html
+++ /dev/null
@@ -1,32 +0,0 @@
-
-
diff --git a/ui/src/app/dashboard/index.js b/ui/src/app/dashboard/index.js
deleted file mode 100644
index 06cfb2af73..0000000000
--- a/ui/src/app/dashboard/index.js
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Copyright © 2016-2020 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 './dashboard.scss';
-
-import uiRouter from 'angular-ui-router';
-
-import thingsboardGrid from '../components/grid.directive';
-import thingsboardApiWidget from '../api/widget.service';
-import thingsboardApiUser from '../api/user.service';
-import thingsboardApiDashboard from '../api/dashboard.service';
-import thingsboardApiCustomer from '../api/customer.service';
-import thingsboardDetailsSidenav from '../components/details-sidenav.directive';
-import thingsboardWidgetConfig from '../components/widget/widget-config.directive';
-import thingsboardDashboardSelect from '../components/dashboard-select.directive';
-import thingsboardRelatedEntityAutocomplete from '../components/related-entity-autocomplete.directive';
-import thingsboardDashboard from '../components/dashboard.directive';
-import thingsboardExpandFullscreen from '../components/expand-fullscreen.directive';
-import thingsboardWidgetsBundleSelect from '../components/widgets-bundle-select.directive';
-import thingsboardSocialsharePanel from '../components/socialshare-panel.directive';
-import thingsboardTypes from '../common/types.constant';
-import thingsboardItemBuffer from '../services/item-buffer.service';
-import thingsboardImportExport from '../import-export';
-import dashboardLayouts from './layouts';
-import dashboardStates from './states';
-
-import DashboardRoutes from './dashboard.routes';
-import {DashboardsController, DashboardCardController, MakeDashboardPublicDialogController} from './dashboards.controller';
-import DashboardController from './dashboard.controller';
-import DashboardSettingsController from './dashboard-settings.controller';
-import AddDashboardsToCustomerController from './add-dashboards-to-customer.controller';
-import ManageAssignedCustomersController from './manage-assigned-customers.controller';
-import AddWidgetController from './add-widget.controller';
-import DashboardDirective from './dashboard.directive';
-import EditWidgetDirective from './edit-widget.directive';
-import DashboardToolbar from './dashboard-toolbar.directive';
-
-export default angular.module('thingsboard.dashboard', [
- uiRouter,
- thingsboardTypes,
- thingsboardItemBuffer,
- thingsboardImportExport,
- thingsboardGrid,
- thingsboardApiWidget,
- thingsboardApiUser,
- thingsboardApiDashboard,
- thingsboardApiCustomer,
- thingsboardDetailsSidenav,
- thingsboardWidgetConfig,
- thingsboardDashboardSelect,
- thingsboardRelatedEntityAutocomplete,
- thingsboardDashboard,
- thingsboardExpandFullscreen,
- thingsboardWidgetsBundleSelect,
- thingsboardSocialsharePanel,
- dashboardLayouts,
- dashboardStates
-])
- .config(DashboardRoutes)
- .controller('DashboardsController', DashboardsController)
- .controller('DashboardCardController', DashboardCardController)
- .controller('MakeDashboardPublicDialogController', MakeDashboardPublicDialogController)
- .controller('DashboardController', DashboardController)
- .controller('DashboardSettingsController', DashboardSettingsController)
- .controller('AddDashboardsToCustomerController', AddDashboardsToCustomerController)
- .controller('ManageAssignedCustomersController', ManageAssignedCustomersController)
- .controller('AddWidgetController', AddWidgetController)
- .directive('tbDashboardDetails', DashboardDirective)
- .directive('tbEditWidget', EditWidgetDirective)
- .directive('tbDashboardToolbar', DashboardToolbar)
- .name;
diff --git a/ui/src/app/dashboard/layouts/dashboard-layout.directive.js b/ui/src/app/dashboard/layouts/dashboard-layout.directive.js
deleted file mode 100644
index 3f05c17241..0000000000
--- a/ui/src/app/dashboard/layouts/dashboard-layout.directive.js
+++ /dev/null
@@ -1,276 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-/* eslint-disable import/no-unresolved, import/default */
-
-import dashboardLayoutTemplate from './dashboard-layout.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-/*@ngInject*/
-export default function DashboardLayout() {
- return {
- restrict: "E",
- scope: true,
- bindToController: {
- layoutCtx: '=',
- dashboardCtx: '=',
- isEdit: '=',
- isMobile: '=',
- widgetEditMode: '='
- },
- controller: DashboardLayoutController,
- controllerAs: 'vm',
- templateUrl: dashboardLayoutTemplate
- };
-}
-
-/*@ngInject*/
-function DashboardLayoutController($scope, $rootScope, $translate, $window, hotkeys, itembuffer) {
-
- var vm = this;
-
- vm.noData = noData;
- vm.addWidget = addWidget;
- vm.editWidget = editWidget;
- vm.exportWidget = exportWidget;
- vm.widgetMouseDown = widgetMouseDown;
- vm.widgetClicked = widgetClicked;
- vm.prepareDashboardContextMenu = prepareDashboardContextMenu;
- vm.prepareWidgetContextMenu = prepareWidgetContextMenu;
- vm.removeWidget = removeWidget;
- vm.pasteWidget = pasteWidget;
- vm.pasteWidgetReference = pasteWidgetReference;
- vm.dashboardInited = dashboardInited;
- vm.dashboardInitFailed = dashboardInitFailed;
-
- vm.reload = function() {
- if (vm.dashboardContainer) {
- vm.dashboardContainer.reload();
- }
- };
-
- vm.setResizing = function(resizing) {
- if (vm.dashboardContainer) {
- vm.dashboardContainer.isResizing = resizing;
- }
- }
-
- vm.resetHighlight = function() {
- if (vm.dashboardContainer) {
- vm.dashboardContainer.resetHighlight();
- }
- };
-
- vm.highlightWidget = function(widget, delay) {
- if (vm.dashboardContainer) {
- vm.dashboardContainer.highlightWidget(widget, delay);
- }
- };
-
- vm.selectWidget = function(widget, delay) {
- if (vm.dashboardContainer) {
- vm.dashboardContainer.selectWidget(widget, delay);
- }
- };
-
- vm.dashboardInitComplete = false;
-
- initHotKeys();
-
- $scope.$on('$destroy', function() {
- vm.dashboardContainer = null;
- });
-
- $scope.$watch('vm.layoutCtx', function () {
- if (vm.layoutCtx) {
- vm.layoutCtx.ctrl = vm;
- }
- });
-
- function noData() {
- return vm.dashboardInitComplete && vm.layoutCtx &&
- vm.layoutCtx.widgets && vm.layoutCtx.widgets.length == 0;
- }
-
- function addWidget($event) {
- if (vm.dashboardCtx.onAddWidget) {
- vm.dashboardCtx.onAddWidget($event, vm.layoutCtx);
- }
- }
-
- function editWidget($event, widget) {
- if (vm.dashboardCtx.onEditWidget) {
- vm.dashboardCtx.onEditWidget($event, vm.layoutCtx, widget);
- }
- }
-
- function exportWidget($event, widget) {
- if (vm.dashboardCtx.onExportWidget) {
- vm.dashboardCtx.onExportWidget($event, vm.layoutCtx, widget);
- }
- }
-
- function widgetMouseDown($event, widget) {
- if (vm.dashboardCtx.onWidgetMouseDown) {
- vm.dashboardCtx.onWidgetMouseDown($event, vm.layoutCtx, widget);
- }
- }
-
- function widgetClicked($event, widget) {
- if (vm.dashboardCtx.onWidgetClicked) {
- vm.dashboardCtx.onWidgetClicked($event, vm.layoutCtx, widget);
- }
- }
-
- function prepareDashboardContextMenu() {
- if (vm.dashboardCtx.prepareDashboardContextMenu) {
- return vm.dashboardCtx.prepareDashboardContextMenu(vm.layoutCtx);
- }
- }
-
- function prepareWidgetContextMenu(widget) {
- if (vm.dashboardCtx.prepareWidgetContextMenu) {
- return vm.dashboardCtx.prepareWidgetContextMenu(vm.layoutCtx, widget);
- }
- }
-
- function removeWidget($event, widget) {
- if (vm.dashboardCtx.onRemoveWidget) {
- vm.dashboardCtx.onRemoveWidget($event, vm.layoutCtx, widget);
- }
- }
-
- function dashboardInitFailed() {
- var parentScope = $window.parent.angular.element($window.frameElement).scope();
- parentScope.$emit('widgetEditModeInited');
- parentScope.$apply();
- vm.dashboardInitComplete = true;
- }
-
- function dashboardInited(dashboardContainer) {
- vm.dashboardContainer = dashboardContainer;
- vm.dashboardInitComplete = true;
- }
-
- function isHotKeyAllowed(event) {
- var target = event.target || event.srcElement;
- var scope = angular.element(target).scope();
- return scope && scope.$parent !== $rootScope;
- }
-
- function initHotKeys() {
- $translate(['action.copy', 'action.paste', 'action.delete']).then(function (translations) {
- hotkeys.bindTo($scope)
- .add({
- combo: 'ctrl+c',
- description: translations['action.copy'],
- callback: function (event) {
- if (isHotKeyAllowed(event) &&
- vm.isEdit && !vm.isEditingWidget && !vm.widgetEditMode) {
- var widget = vm.dashboardContainer.getSelectedWidget();
- if (widget) {
- event.preventDefault();
- copyWidget(event, widget);
- }
- }
- }
- })
- .add({
- combo: 'ctrl+r',
- description: translations['action.copy-reference'],
- callback: function (event) {
- if (isHotKeyAllowed(event) &&
- vm.isEdit && !vm.isEditingWidget && !vm.widgetEditMode) {
- var widget = vm.dashboardContainer.getSelectedWidget();
- if (widget) {
- event.preventDefault();
- copyWidgetReference(event, widget);
- }
- }
- }
- })
- .add({
- combo: 'ctrl+v',
- description: translations['action.paste'],
- callback: function (event) {
- if (isHotKeyAllowed(event) &&
- vm.isEdit && !vm.isEditingWidget && !vm.widgetEditMode) {
- if (itembuffer.hasWidget()) {
- event.preventDefault();
- pasteWidget(event);
- }
- }
- }
- })
- .add({
- combo: 'ctrl+i',
- description: translations['action.paste-reference'],
- callback: function (event) {
- if (isHotKeyAllowed(event) &&
- vm.isEdit && !vm.isEditingWidget && !vm.widgetEditMode) {
- if (itembuffer.canPasteWidgetReference(vm.dashboardCtx.dashboard,
- vm.dashboardCtx.state, vm.layoutCtx.id)) {
- event.preventDefault();
- pasteWidgetReference(event);
- }
- }
- }
- })
-
- .add({
- combo: 'ctrl+x',
- description: translations['action.delete'],
- callback: function (event) {
- if (isHotKeyAllowed(event) &&
- vm.isEdit && !vm.isEditingWidget && !vm.widgetEditMode) {
- var widget = vm.dashboardContainer.getSelectedWidget();
- if (widget) {
- event.preventDefault();
- vm.dashboardCtx.onRemoveWidget(event, vm.layoutCtx, widget);
- }
- }
- }
- });
- });
- }
-
- function copyWidget($event, widget) {
- if (vm.dashboardCtx.copyWidget) {
- vm.dashboardCtx.copyWidget($event, vm.layoutCtx, widget);
- }
- }
-
- function copyWidgetReference($event, widget) {
- if (vm.dashboardCtx.copyWidgetReference) {
- vm.dashboardCtx.copyWidgetReference($event, vm.layoutCtx, widget);
- }
- }
-
- function pasteWidget($event) {
- var pos = vm.dashboardContainer.getEventGridPosition($event);
- if (vm.dashboardCtx.pasteWidget) {
- vm.dashboardCtx.pasteWidget($event, vm.layoutCtx, pos);
- }
- }
-
- function pasteWidgetReference($event) {
- var pos = vm.dashboardContainer.getEventGridPosition($event);
- if (vm.dashboardCtx.pasteWidgetReference) {
- vm.dashboardCtx.pasteWidgetReference($event, vm.layoutCtx, pos);
- }
- }
-
-}
diff --git a/ui/src/app/dashboard/layouts/dashboard-layout.tpl.html b/ui/src/app/dashboard/layouts/dashboard-layout.tpl.html
deleted file mode 100644
index 4007add4e7..0000000000
--- a/ui/src/app/dashboard/layouts/dashboard-layout.tpl.html
+++ /dev/null
@@ -1,71 +0,0 @@
-
-
-
-
- dashboard.no-widgets
-
-
- add
- {{ 'dashboard.add-widget' | translate }}
-
-
-
-
-
diff --git a/ui/src/app/dashboard/layouts/index.js b/ui/src/app/dashboard/layouts/index.js
deleted file mode 100644
index 1fdfb11f00..0000000000
--- a/ui/src/app/dashboard/layouts/index.js
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright © 2016-2020 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 ManageDashboardLayoutsController from './manage-dashboard-layouts.controller';
-import SelectTargetLayoutController from './select-target-layout.controller';
-import DashboardLayoutDirective from './dashboard-layout.directive';
-
-export default angular.module('thingsboard.dashboard.layouts', [])
- .controller('ManageDashboardLayoutsController', ManageDashboardLayoutsController)
- .controller('SelectTargetLayoutController', SelectTargetLayoutController)
- .directive('tbDashboardLayout', DashboardLayoutDirective)
- .name;
diff --git a/ui/src/app/dashboard/layouts/manage-dashboard-layouts.controller.js b/ui/src/app/dashboard/layouts/manage-dashboard-layouts.controller.js
deleted file mode 100644
index 2fa1a5a304..0000000000
--- a/ui/src/app/dashboard/layouts/manage-dashboard-layouts.controller.js
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-/* eslint-disable import/no-unresolved, import/default */
-
-import dashboardSettingsTemplate from '../dashboard-settings.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-/*@ngInject*/
-export default function ManageDashboardLayoutsController($scope, $mdDialog, $document, dashboardUtils, layouts) {
-
- var vm = this;
-
- vm.openLayoutSettings = openLayoutSettings;
- vm.cancel = cancel;
- vm.save = save;
-
- vm.layouts = layouts;
- vm.displayLayouts = {
- main: angular.isDefined(vm.layouts.main),
- right: angular.isDefined(vm.layouts.right)
- }
-
- for (var l in vm.displayLayouts) {
- if (!vm.layouts[l]) {
- vm.layouts[l] = dashboardUtils.createDefaultLayoutData();
- }
- }
-
- function openLayoutSettings($event, layoutId) {
- var gridSettings = angular.copy(vm.layouts[layoutId].gridSettings);
- $mdDialog.show({
- controller: 'DashboardSettingsController',
- controllerAs: 'vm',
- templateUrl: dashboardSettingsTemplate,
- locals: {
- settings: null,
- gridSettings: gridSettings
- },
- parent: angular.element($document[0].body),
- multiple: true,
- fullscreen: true,
- targetEvent: $event
- }).then(function (data) {
- var gridSettings = data.gridSettings;
- if (gridSettings) {
- dashboardUtils.updateLayoutSettings(vm.layouts[layoutId], gridSettings);
- }
- $scope.theForm.$setDirty();
- }, function () {
- });
- }
-
- function cancel() {
- $mdDialog.cancel();
- }
-
- function save() {
- $scope.theForm.$setPristine();
- for (var l in vm.displayLayouts) {
- if (!vm.displayLayouts[l]) {
- if (vm.layouts[l]) {
- delete vm.layouts[l];
- }
- }
- }
- $mdDialog.hide(vm.layouts);
- }
-}
diff --git a/ui/src/app/dashboard/layouts/manage-dashboard-layouts.tpl.html b/ui/src/app/dashboard/layouts/manage-dashboard-layouts.tpl.html
deleted file mode 100644
index ece9aa7987..0000000000
--- a/ui/src/app/dashboard/layouts/manage-dashboard-layouts.tpl.html
+++ /dev/null
@@ -1,65 +0,0 @@
-
-
-
-
diff --git a/ui/src/app/dashboard/layouts/select-target-layout.controller.js b/ui/src/app/dashboard/layouts/select-target-layout.controller.js
deleted file mode 100644
index f8043e4b60..0000000000
--- a/ui/src/app/dashboard/layouts/select-target-layout.controller.js
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-/*@ngInject*/
-export default function SelectTargetLayoutController($scope, $mdDialog) {
-
- var vm = this;
-
- vm.cancel = cancel;
- vm.selectLayout = selectLayout;
-
- function cancel() {
- $mdDialog.cancel();
- }
-
- function selectLayout($event, layoutId) {
- $scope.theForm.$setPristine();
- $mdDialog.hide(layoutId);
- }
-}
diff --git a/ui/src/app/dashboard/layouts/select-target-layout.tpl.html b/ui/src/app/dashboard/layouts/select-target-layout.tpl.html
deleted file mode 100644
index e51ac94a5c..0000000000
--- a/ui/src/app/dashboard/layouts/select-target-layout.tpl.html
+++ /dev/null
@@ -1,48 +0,0 @@
-
-
-
-
diff --git a/ui/src/app/dashboard/make-dashboard-public-dialog.tpl.html b/ui/src/app/dashboard/make-dashboard-public-dialog.tpl.html
deleted file mode 100644
index 5e0ff9d21e..0000000000
--- a/ui/src/app/dashboard/make-dashboard-public-dialog.tpl.html
+++ /dev/null
@@ -1,62 +0,0 @@
-
-
-
-
diff --git a/ui/src/app/dashboard/manage-assigned-customers.controller.js b/ui/src/app/dashboard/manage-assigned-customers.controller.js
deleted file mode 100644
index 8ca931e6e4..0000000000
--- a/ui/src/app/dashboard/manage-assigned-customers.controller.js
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-/*@ngInject*/
-export default function ManageAssignedCustomersController($mdDialog, $q, types, dashboardService, actionType, dashboardIds, assignedCustomers) {
-
- var vm = this;
-
- vm.types = types;
- vm.actionType = actionType;
- vm.dashboardIds = dashboardIds;
- vm.assignedCustomers = assignedCustomers;
- if (actionType != 'manage') {
- vm.assignedCustomers = [];
- }
-
- if (actionType == 'manage') {
- vm.titleText = 'dashboard.manage-assigned-customers';
- vm.labelText = 'dashboard.assigned-customers';
- vm.actionName = 'action.update';
- } else if (actionType == 'assign') {
- vm.titleText = 'dashboard.assign-to-customers';
- vm.labelText = 'dashboard.assign-to-customers-text';
- vm.actionName = 'action.assign';
- } else if (actionType == 'unassign') {
- vm.titleText = 'dashboard.unassign-from-customers';
- vm.labelText = 'dashboard.unassign-from-customers-text';
- vm.actionName = 'action.unassign';
- }
-
- vm.submit = submit;
- vm.cancel = cancel;
-
- function cancel () {
- $mdDialog.cancel();
- }
-
- function submit () {
- var tasks = [];
- for (var i=0;i
-
-
-
\ No newline at end of file
diff --git a/ui/src/app/dashboard/states/dashboard-state-dialog.controller.js b/ui/src/app/dashboard/states/dashboard-state-dialog.controller.js
deleted file mode 100644
index 0e6d5d5b38..0000000000
--- a/ui/src/app/dashboard/states/dashboard-state-dialog.controller.js
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-/*@ngInject*/
-export default function DashboardStateDialogController($scope, $mdDialog, $filter, dashboardUtils, isAdd, allStates, state) {
-
- var vm = this;
-
- vm.isAdd = isAdd;
- vm.allStates = allStates;
- vm.state = state;
-
- vm.stateIdTouched = false;
-
- if (vm.isAdd) {
- vm.state = dashboardUtils.createDefaultState('', false);
- vm.state.id = '';
- vm.prevStateId = '';
- } else {
- vm.state = state;
- vm.prevStateId = vm.state.id;
- }
-
- vm.cancel = cancel;
- vm.save = save;
-
- $scope.$watch("vm.state.name", function(newVal, prevVal) {
- if (!angular.equals(newVal, prevVal) && vm.state.name != null) {
- checkStateName();
- }
- });
-
- $scope.$watch("vm.state.id", function(newVal, prevVal) {
- if (!angular.equals(newVal, prevVal) && vm.state.id != null) {
- checkStateId();
- }
- });
-
- function checkStateName() {
- if (!vm.stateIdTouched && vm.isAdd) {
- vm.state.id = vm.state.name.toLowerCase().replace(/\W/g,"_");
- }
- }
-
- function checkStateId() {
- var result = $filter('filter')(vm.allStates, {id: vm.state.id}, true);
- if (result && result.length && result[0].id !== vm.prevStateId) {
- $scope.theForm.stateId.$setValidity('stateExists', false);
- } else {
- $scope.theForm.stateId.$setValidity('stateExists', true);
- }
- }
-
- function cancel() {
- $mdDialog.cancel();
- }
-
- function save() {
- $scope.theForm.$setPristine();
- vm.state.id = vm.state.id.trim();
- $mdDialog.hide(vm.state);
- }
-}
diff --git a/ui/src/app/dashboard/states/dashboard-state-dialog.tpl.html b/ui/src/app/dashboard/states/dashboard-state-dialog.tpl.html
deleted file mode 100644
index e3bbd3c424..0000000000
--- a/ui/src/app/dashboard/states/dashboard-state-dialog.tpl.html
+++ /dev/null
@@ -1,69 +0,0 @@
-
-
-
-
diff --git a/ui/src/app/dashboard/states/default-state-controller.js b/ui/src/app/dashboard/states/default-state-controller.js
deleted file mode 100644
index 89c71e3ad8..0000000000
--- a/ui/src/app/dashboard/states/default-state-controller.js
+++ /dev/null
@@ -1,255 +0,0 @@
-/*
- * Copyright © 2016-2020 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 './default-state-controller.scss';
-
-/*@ngInject*/
-export default function DefaultStateController($scope, $timeout, $location, $state,
- $stateParams, utils, types, dashboardUtils, preservedState) {
-
- var vm = this;
-
- vm.inited = false;
-
- vm.skipStateChange = false;
-
- vm.openState = openState;
- vm.updateState = updateState;
- vm.resetState = resetState;
- vm.getStateObject = getStateObject;
- vm.navigatePrevState = navigatePrevState;
- vm.getStateId = getStateId;
- vm.getStateIndex = getStateIndex;
- vm.getStateIdAtIndex = getStateIdAtIndex;
- vm.getStateParams = getStateParams;
- vm.getStateParamsByStateId = getStateParamsByStateId;
- vm.getEntityId = getEntityId;
-
- vm.getStateName = getStateName;
-
- vm.displayStateSelection = displayStateSelection;
-
- function openState(id, params, openRightLayout) {
- if (vm.states && vm.states[id]) {
- if (!params) {
- params = {};
- }
- var newState = {
- id: id,
- params: params
- }
- //append new state
- vm.stateObject[0] = newState;
- gotoState(vm.stateObject[0].id, true, openRightLayout);
- vm.skipStateChange = true;
- }
- }
-
- function updateState(id, params, openRightLayout) {
- if (!id) {
- id = getStateId();
- }
- if (vm.states && vm.states[id]) {
- if (!params) {
- params = {};
- }
- var newState = {
- id: id,
- params: params
- }
- //replace with new state
- vm.stateObject[0] = newState;
- gotoState(vm.stateObject[0].id, true, openRightLayout);
- vm.skipStateChange = true;
- }
- }
-
- function resetState() {
- var rootStateId = dashboardUtils.getRootStateId(vm.states);
- vm.stateObject = [ { id: rootStateId, params: {} } ];
- gotoState(rootStateId, true);
- }
-
- function getStateObject() {
- return vm.stateObject;
- }
-
- function navigatePrevState(index) {
- if (index < vm.stateObject.length-1) {
- vm.stateObject.splice(index+1, vm.stateObject.length-index-1);
- gotoState(vm.stateObject[vm.stateObject.length-1].id, true);
- vm.skipStateChange = true;
- }
- }
-
- function getStateId() {
- if (vm.stateObject && vm.stateObject.length) {
- return vm.stateObject[vm.stateObject.length-1].id;
- } else {
- return '';
- }
- }
-
- function getStateIndex() {
- if (vm.stateObject && vm.stateObject.length) {
- return vm.stateObject.length-1;
- } else {
- return -1;
- }
- }
-
- function getStateIdAtIndex(index) {
- if (vm.stateObject && vm.stateObject[index]) {
- return vm.stateObject[index].id;
- } else {
- return '';
- }
- }
-
- function getStateParams() {
- if (vm.stateObject && vm.stateObject.length) {
- return vm.stateObject[vm.stateObject.length - 1].params;
- } else {
- return {};
- }
- }
-
- function getStateParamsByStateId(stateId) {
- var stateObj = getStateObjById(stateId);
- if (stateObj) {
- return stateObj.params;
- } else {
- return null;
- }
- }
-
- function getEntityId() {
- return null;
- }
-
- function getStateObjById(id) {
- for (var i=0; i < vm.stateObject.length; i++) {
- if (vm.stateObject[i].id === id) {
- return vm.stateObject[i];
- }
- }
- return null;
- }
-
- function getStateName(id, state) {
- return utils.customTranslation(state.name, id);
- }
-
- function parseState(stateBase64) {
- var result;
- if (stateBase64) {
- try {
- result = utils.base64toObj(stateBase64);
- } catch (e) {
- result = [ { id: null, params: {} } ];
- }
- }
- if (!result) {
- result = [];
- }
- if (!result.length) {
- result[0] = { id: null, params: {} }
- } else if (result.length > 1) {
- var newResult = [];
- newResult.push(result[result.length-1]);
- result = newResult;
- }
-
- var rootStateId = dashboardUtils.getRootStateId(vm.states);
- if (!result[0].id) {
- result[0].id = rootStateId;
- }
- if (!vm.states[result[0].id]) {
- result[0].id = rootStateId;
- }
- var i = result.length;
- while (i--) {
- if (!result[i].id || !vm.states[result[i].id]) {
- result.splice(i, 1);
- }
- }
- return result;
- }
-
- $scope.$watch('vm.states', function() {
- if (vm.states) {
- if (!vm.inited) {
- vm.inited = true;
- init();
- }
- }
- });
-
- function displayStateSelection() {
- return vm.states && Object.keys(vm.states).length > 1;
- }
-
- function init() {
- if (preservedState) {
- vm.stateObject = preservedState;
- gotoState(vm.stateObject[0].id, true);
- } else {
- var initialState = $stateParams.state;
- vm.stateObject = parseState(initialState);
- gotoState(vm.stateObject[0].id, false);
- }
-
- $timeout(() => {
- $scope.$watchCollection(function () {
- return $state.params;
- }, function () {
- var currentState = $state.params.state;
- vm.stateObject = parseState(currentState);
- });
-
- $scope.$watch('vm.dashboardCtrl.dashboardCtx.state', function () {
- if (vm.stateObject[0].id !== vm.dashboardCtrl.dashboardCtx.state) {
- vm.stateObject[0].id = vm.dashboardCtrl.dashboardCtx.state;
- updateLocation();
- vm.skipStateChange = true;
- }
- });
- $scope.$watch('vm.stateObject', function(newVal, prevVal) {
- if (!angular.equals(newVal, prevVal) && newVal) {
- if (vm.skipStateChange) {
- vm.skipStateChange = false;
- } else {
- gotoState(vm.stateObject[0].id, true);
- }
- }
- }, true);
- });
- }
-
- function gotoState(stateId, update, openRightLayout) {
- if (vm.dashboardCtrl.dashboardCtx.state != stateId) {
- vm.dashboardCtrl.openDashboardState(stateId, openRightLayout);
- if (update) {
- updateLocation();
- }
- }
- }
-
- function updateLocation() {
- if (vm.stateObject[0].id) {
- $location.search('state', utils.objToBase64(vm.stateObject));
- }
- }
-}
diff --git a/ui/src/app/dashboard/states/default-state-controller.scss b/ui/src/app/dashboard/states/default-state-controller.scss
deleted file mode 100644
index fb66480c9b..0000000000
--- a/ui/src/app/dashboard/states/default-state-controller.scss
+++ /dev/null
@@ -1,18 +0,0 @@
-/**
- * Copyright © 2016-2020 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.
- */
-md-select.default-state-controller {
- margin: 0;
-}
diff --git a/ui/src/app/dashboard/states/default-state-controller.tpl.html b/ui/src/app/dashboard/states/default-state-controller.tpl.html
deleted file mode 100644
index 3f320ec98b..0000000000
--- a/ui/src/app/dashboard/states/default-state-controller.tpl.html
+++ /dev/null
@@ -1,22 +0,0 @@
-
-
-
- {{vm.getStateName(stateId, state)}}
-
-
diff --git a/ui/src/app/dashboard/states/entity-state-controller.js b/ui/src/app/dashboard/states/entity-state-controller.js
deleted file mode 100644
index 8d9371574d..0000000000
--- a/ui/src/app/dashboard/states/entity-state-controller.js
+++ /dev/null
@@ -1,367 +0,0 @@
-/*
- * Copyright © 2016-2020 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 './entity-state-controller.scss';
-
-/*@ngInject*/
-export default function EntityStateController($scope, $timeout, $location, $state, $stateParams,
- $q, $translate, utils, types, dashboardUtils, entityService, preservedState) {
-
- var vm = this;
-
- vm.inited = false;
-
- vm.skipStateChange = false;
-
- vm.openState = openState;
- vm.updateState = updateState;
- vm.resetState = resetState;
- vm.getStateObject = getStateObject;
- vm.navigatePrevState = navigatePrevState;
- vm.getStateId = getStateId;
- vm.getStateIndex = getStateIndex;
- vm.getStateIdAtIndex = getStateIdAtIndex;
- vm.getStateParams = getStateParams;
- vm.getStateParamsByStateId = getStateParamsByStateId;
- vm.getEntityId = getEntityId;
-
- vm.getStateName = getStateName;
-
- vm.selectedStateIndex = -1;
-
- function openState(id, params, openRightLayout) {
- if (vm.states && vm.states[id]) {
- resolveEntity(params).then(
- function success() {
- var newState = {
- id: id,
- params: params
- }
- //append new state
- vm.stateObject.push(newState);
- vm.selectedStateIndex = vm.stateObject.length-1;
- gotoState(vm.stateObject[vm.stateObject.length-1].id, true, openRightLayout);
- vm.skipStateChange = true;
- }
- );
- }
- }
-
- function updateState(id, params, openRightLayout) {
- if (!id) {
- id = getStateId();
- }
- if (vm.states && vm.states[id]) {
- resolveEntity(params).then(
- function success() {
- var newState = {
- id: id,
- params: params
- }
- //replace with new state
- vm.stateObject[vm.stateObject.length - 1] = newState;
- gotoState(vm.stateObject[vm.stateObject.length - 1].id, true, openRightLayout);
- vm.skipStateChange = true;
- }
- );
- }
- }
-
- function resetState() {
- var rootStateId = dashboardUtils.getRootStateId(vm.states);
- vm.stateObject = [ { id: rootStateId, params: {} } ];
- gotoState(rootStateId, true);
- }
-
- function getStateObject() {
- return vm.stateObject;
- }
-
- function navigatePrevState(index) {
- if (index < vm.stateObject.length-1) {
- vm.stateObject.splice(index+1, vm.stateObject.length-index-1);
- vm.selectedStateIndex = vm.stateObject.length-1;
- gotoState(vm.stateObject[vm.stateObject.length-1].id, true);
- vm.skipStateChange = true;
- }
- }
-
- function getStateId() {
- if (vm.stateObject && vm.stateObject.length) {
- return vm.stateObject[vm.stateObject.length-1].id;
- } else {
- return '';
- }
- }
-
- function getStateIndex() {
- if (vm.stateObject && vm.stateObject.length) {
- return vm.stateObject.length-1;
- } else {
- return -1;
- }
- }
-
- function getStateIdAtIndex(index) {
- if (vm.stateObject && vm.stateObject[index]) {
- return vm.stateObject[index].id;
- } else {
- return '';
- }
- }
-
- function getStateParams() {
- if (vm.stateObject && vm.stateObject.length) {
- return vm.stateObject[vm.stateObject.length - 1].params;
- } else {
- return {};
- }
- }
-
- function getStateParamsByStateId(stateId) {
- var stateObj = getStateObjById(stateId);
- if (stateObj) {
- return stateObj.params;
- } else {
- return null;
- }
- }
-
- function getEntityId(entityParamName) {
- var stateParams = getStateParams();
- if (!entityParamName || !entityParamName.length) {
- return stateParams.entityId;
- } else if (stateParams[entityParamName]) {
- return stateParams[entityParamName].entityId;
- }
- return null;
- }
-
- function getStateObjById(id) {
- for (var i=0; i < vm.stateObject.length; i++) {
- if (vm.stateObject[i].id === id) {
- return vm.stateObject[i];
- }
- }
- return null;
- }
-
- function getStateName(index) {
- let result = '';
- if (vm.stateObject[index]) {
- let stateName = vm.states[vm.stateObject[index].id].name;
- stateName = utils.customTranslation(stateName, stateName);
- var params = vm.stateObject[index].params;
-
- let entityName = params && params.entityName ? params.entityName : '';
- let entityLabel = params && params.entityLabel ? params.entityLabel : entityName;
-
- result = utils.insertVariable(stateName, 'entityName', entityName);
- result = utils.insertVariable(result, 'entityLabel', entityLabel);
- for (let prop in params) {
- if (params[prop] && params[prop].entityName) {
- result = utils.insertVariable(result, prop + ':entityName', params[prop].entityName);
- }
- if (params[prop] && params[prop].entityLabel) {
- result = utils.insertVariable(result, prop + ':entityLabel', params[prop].entityLabel);
- }
- }
- }
- return result;
- }
-
- function resolveEntity(params) {
- var deferred = $q.defer();
- if (params && params.targetEntityParamName) {
- params = params[params.targetEntityParamName];
- }
- if (params && params.entityId && params.entityId.id && params.entityId.entityType) {
- if (isEntityResolved(params)) {
- deferred.resolve();
- } else {
- entityService.getEntity(params.entityId.entityType, params.entityId.id, {
- ignoreLoading: true,
- ignoreErrors: true
- }).then(
- function success(entity) {
- params.entityName = entity.name;
- params.entityLabel = entity.label;
- deferred.resolve();
- },
- function fail() {
- deferred.reject();
- }
- );
- }
- } else {
- deferred.resolve();
- }
- return deferred.promise;
- }
-
- function isEntityResolved(params) {
- if (!params.entityName || !params.entityName.length) {
- return false;
- }
- return true;
- }
-
- function parseState(stateBase64) {
- var result;
- if (stateBase64) {
- try {
- result = utils.base64toObj(stateBase64);
- } catch (e) {
- result = [ { id: null, params: {} } ];
- }
- }
- if (!result) {
- result = [];
- }
- if (!result.length) {
- result[0] = { id: null, params: {} }
- }
- var rootStateId = dashboardUtils.getRootStateId(vm.states);
- if (!result[0].id) {
- result[0].id = rootStateId;
- }
- if (!vm.states[result[0].id]) {
- result[0].id = rootStateId;
- }
- var i = result.length;
- while (i--) {
- if (!result[i].id || !vm.states[result[i].id]) {
- result.splice(i, 1);
- }
- }
- return result;
- }
-
- $scope.$watch('vm.states', function() {
- if (vm.states) {
- if (!vm.inited) {
- vm.inited = true;
- init();
- }
- }
- });
-
- function init() {
- if (preservedState) {
- vm.stateObject = preservedState;
- vm.selectedStateIndex = vm.stateObject.length-1;
- gotoState(vm.stateObject[vm.stateObject.length-1].id, true);
- } else {
- var initialState = $stateParams.state;
- vm.stateObject = parseState(initialState);
- vm.selectedStateIndex = vm.stateObject.length-1;
- gotoState(vm.stateObject[vm.stateObject.length-1].id, false);
- }
-
- $timeout(() => {
- $scope.$watchCollection(function () {
- return $state.params;
- }, function () {
- var currentState = $state.params.state;
- vm.stateObject = parseState(currentState);
- });
-
- $scope.$watch('vm.dashboardCtrl.dashboardCtx.state', function () {
- if (vm.stateObject[vm.stateObject.length - 1].id !== vm.dashboardCtrl.dashboardCtx.state) {
- vm.stateObject[vm.stateObject.length - 1].id = vm.dashboardCtrl.dashboardCtx.state;
- updateLocation();
- vm.skipStateChange = true;
- }
- });
-
- $scope.$watch('vm.stateObject', function(newVal, prevVal) {
- if (!angular.equals(newVal, prevVal) && newVal) {
- if (vm.skipStateChange) {
- vm.skipStateChange = false;
- } else {
- vm.selectedStateIndex = vm.stateObject.length - 1;
- gotoState(vm.stateObject[vm.stateObject.length - 1].id, true);
- }
- }
- }, true);
-
- if (vm.dashboardCtrl.isMobile) {
- watchSelectedStateIndex();
- }
-
- $scope.$watch('vm.dashboardCtrl.isMobile', function (newVal, prevVal) {
- if (!angular.equals(newVal, prevVal)) {
- if (vm.dashboardCtrl.isMobile) {
- watchSelectedStateIndex();
- } else {
- stopWatchSelectedStateIndex();
- }
- }
- });
- });
-
- }
-
- function stopWatchSelectedStateIndex() {
- if (vm.selectedStateIndexWatcher) {
- vm.selectedStateIndexWatcher();
- vm.selectedStateIndexWatcher = null;
- }
- }
-
- function watchSelectedStateIndex() {
- vm.selectedStateIndexWatcher = $scope.$watch('vm.selectedStateIndex', function(newVal, prevVal) {
- if (!angular.equals(newVal, prevVal)) {
- navigatePrevState(vm.selectedStateIndex);
- }
- });
- }
-
- function gotoState(stateId, update, openRightLayout) {
- vm.dashboardCtrl.openDashboardState(stateId, openRightLayout);
- if (update) {
- updateLocation();
- }
- }
-
- function updateLocation() {
- if (vm.stateObject[vm.stateObject.length-1].id) {
- if (isDefaultState()) {
- $location.search('state', null);
- } else {
- $location.search('state', utils.objToBase64(vm.stateObject));
- }
- }
- }
-
- function isDefaultState() {
- if (vm.stateObject.length == 1) {
- var state = vm.stateObject[0];
- var rootStateId = dashboardUtils.getRootStateId(vm.states);
- if (state.id == rootStateId && (!state.params || isEmpty(state.params))) {
- return true;
- }
- }
- return false;
- }
-
- function isEmpty(map) {
- for(var key in map) {
- return !Object.prototype.hasOwnProperty.call(map, key);
- }
- return true;
- }
-
-}
diff --git a/ui/src/app/dashboard/states/entity-state-controller.scss b/ui/src/app/dashboard/states/entity-state-controller.scss
deleted file mode 100644
index 895c108063..0000000000
--- a/ui/src/app/dashboard/states/entity-state-controller.scss
+++ /dev/null
@@ -1,49 +0,0 @@
-/**
- * Copyright © 2016-2020 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";
-
-tb-states-component {
- min-width: 0;
-}
-
-.entity-state-controller {
- .state-divider {
- padding-right: 15px;
- padding-left: 15px;
- overflow: hidden;
- font-size: 18px;
- text-overflow: ellipsis;
- white-space: nowrap;
- pointer-events: none;
- }
-
- .state-entry {
- overflow: hidden;
- font-size: 18px;
- text-overflow: ellipsis;
- white-space: nowrap;
- outline: none;
- }
-
- md-select {
- margin: 0;
-
- .md-text {
- font-size: 18px;
- font-weight: 700;
- }
- }
-}
diff --git a/ui/src/app/dashboard/states/entity-state-controller.tpl.html b/ui/src/app/dashboard/states/entity-state-controller.tpl.html
deleted file mode 100644
index 57688964e8..0000000000
--- a/ui/src/app/dashboard/states/entity-state-controller.tpl.html
+++ /dev/null
@@ -1,31 +0,0 @@
-
-
-
-
- {{vm.getStateName($index)}}
- >
-
-
-
-
- {{vm.getStateName($index)}}
-
-
-
\ No newline at end of file
diff --git a/ui/src/app/dashboard/states/index.js b/ui/src/app/dashboard/states/index.js
deleted file mode 100644
index 7c52a37bff..0000000000
--- a/ui/src/app/dashboard/states/index.js
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Copyright © 2016-2020 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 ManageDashboardStatesController from './manage-dashboard-states.controller';
-import DashboardStateDialogController from './dashboard-state-dialog.controller';
-import SelectTargetStateController from './select-target-state.controller';
-import StatesComponentDirective from './states-component.directive';
-import StatesControllerService from './states-controller.service';
-
-export default angular.module('thingsboard.dashboard.states', [])
- .controller('ManageDashboardStatesController', ManageDashboardStatesController)
- .controller('DashboardStateDialogController', DashboardStateDialogController)
- .controller('SelectTargetStateController', SelectTargetStateController)
- .directive('tbStatesComponent', StatesComponentDirective)
- .factory('statesControllerService', StatesControllerService)
- .name;
diff --git a/ui/src/app/dashboard/states/manage-dashboard-states.controller.js b/ui/src/app/dashboard/states/manage-dashboard-states.controller.js
deleted file mode 100644
index ea828fe649..0000000000
--- a/ui/src/app/dashboard/states/manage-dashboard-states.controller.js
+++ /dev/null
@@ -1,195 +0,0 @@
-/*
- * Copyright © 2016-2020 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 './manage-dashboard-states.scss';
-
-/* eslint-disable import/no-unresolved, import/default */
-
-import dashboardStateDialogTemplate from './dashboard-state-dialog.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-/*@ngInject*/
-export default function ManageDashboardStatesController($scope, $mdDialog, $filter, $document, $translate, states) {
-
- var vm = this;
-
- vm.allStates = [];
- for (var id in states) {
- var state = states[id];
- state.id = id;
- vm.allStates.push(state);
- }
-
- vm.states = [];
- vm.statesCount = 0;
-
- vm.query = {
- order: 'name',
- limit: 5,
- page: 1,
- search: null
- };
-
- vm.enterFilterMode = enterFilterMode;
- vm.exitFilterMode = exitFilterMode;
- vm.onReorder = onReorder;
- vm.onPaginate = onPaginate;
- vm.addState = addState;
- vm.editState = editState;
- vm.deleteState = deleteState;
-
- vm.cancel = cancel;
- vm.save = save;
-
- $scope.$watch("vm.query.search", function(newVal, prevVal) {
- if (!angular.equals(newVal, prevVal) && vm.query.search != null) {
- updateStates();
- }
- });
-
- updateStates ();
-
- function updateStates () {
- var result = $filter('orderBy')(vm.allStates, vm.query.order);
- if (vm.query.search != null) {
- result = $filter('filter')(result, {$: vm.query.search});
- }
- vm.statesCount = result.length;
- var startIndex = vm.query.limit * (vm.query.page - 1);
- vm.states = result.slice(startIndex, startIndex + vm.query.limit);
- }
-
- function enterFilterMode () {
- vm.query.search = '';
- }
-
- function exitFilterMode () {
- vm.query.search = null;
- updateStates();
- }
-
- function onReorder () {
- updateStates();
- }
-
- function onPaginate () {
- updateStates();
- }
-
- function addState ($event) {
- openStateDialog($event, null, true);
- }
-
- function editState ($event, alertRule) {
- if ($event) {
- $event.stopPropagation();
- }
- openStateDialog($event, alertRule, false);
- }
-
- function openStateDialog($event, state, isAdd) {
- var prevStateId = null;
- if (!isAdd) {
- prevStateId = state.id;
- }
- $mdDialog.show({
- controller: 'DashboardStateDialogController',
- controllerAs: 'vm',
- templateUrl: dashboardStateDialogTemplate,
- parent: angular.element($document[0].body),
- locals: {isAdd: isAdd, allStates: vm.allStates, state: angular.copy(state)},
- multiple: true,
- fullscreen: true,
- targetEvent: $event
- }).then(function (state) {
- saveState(state, prevStateId);
- updateStates();
- });
- }
-
- function getStateIndex(id) {
- var result = $filter('filter')(vm.allStates, {id: id}, true);
- if (result && result.length) {
- return vm.allStates.indexOf(result[0]);
- }
- return -1;
- }
-
- function saveState(state, prevStateId) {
- if (prevStateId) {
- var index = getStateIndex(prevStateId);
- if (index > -1) {
- vm.allStates[index] = state;
- }
- } else {
- vm.allStates.push(state);
- }
- if (state.root) {
- for (var i=0; i < vm.allStates.length; i++) {
- var otherState = vm.allStates[i];
- if (otherState.id !== state.id) {
- otherState.root = false;
- }
- }
- }
- $scope.theForm.$setDirty();
- }
-
- function deleteState ($event, state) {
- if ($event) {
- $event.stopPropagation();
- }
- if (state) {
- var title = $translate.instant('dashboard.delete-state-title');
- var content = $translate.instant('dashboard.delete-state-text', {stateName: state.name});
- var confirm = $mdDialog.confirm()
- .targetEvent($event)
- .title(title)
- .htmlContent(content)
- .ariaLabel(title)
- .cancel($translate.instant('action.no'))
- .ok($translate.instant('action.yes'));
-
- confirm._options.multiple = true;
- confirm._options.fullscreen = true;
-
- $mdDialog.show(confirm).then(function () {
- var index = getStateIndex(state.id);
- if (index > -1) {
- vm.allStates.splice(index, 1);
- }
- $scope.theForm.$setDirty();
- updateStates();
- });
- }
- }
-
- function cancel() {
- $mdDialog.cancel();
- }
-
- function save() {
- $scope.theForm.$setPristine();
- var savedStates = {};
- for (var i=0;i
-
-
-
diff --git a/ui/src/app/dashboard/states/select-target-state.controller.js b/ui/src/app/dashboard/states/select-target-state.controller.js
deleted file mode 100644
index 182b27560d..0000000000
--- a/ui/src/app/dashboard/states/select-target-state.controller.js
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-/*@ngInject*/
-export default function SelectTargetStateController($scope, $mdDialog, dashboardUtils, states) {
-
- var vm = this;
- vm.states = states;
- vm.stateId = dashboardUtils.getRootStateId(vm.states);
-
- vm.cancel = cancel;
- vm.save = save;
-
- function cancel() {
- $mdDialog.cancel();
- }
-
- function save() {
- $scope.theForm.$setPristine();
- $mdDialog.hide(vm.stateId);
- }
-}
diff --git a/ui/src/app/dashboard/states/select-target-state.tpl.html b/ui/src/app/dashboard/states/select-target-state.tpl.html
deleted file mode 100644
index 9e3daa4828..0000000000
--- a/ui/src/app/dashboard/states/select-target-state.tpl.html
+++ /dev/null
@@ -1,50 +0,0 @@
-
-
-
-
diff --git a/ui/src/app/dashboard/states/states-component.directive.js b/ui/src/app/dashboard/states/states-component.directive.js
deleted file mode 100644
index cb722d0ea6..0000000000
--- a/ui/src/app/dashboard/states/states-component.directive.js
+++ /dev/null
@@ -1,171 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-/*@ngInject*/
-export default function StatesComponent($compile, $templateCache, $controller, statesControllerService) {
-
- var linker = function (scope, element) {
-
- function destroyStateController() {
- if (scope.statesController && angular.isFunction(scope.statesController.$onDestroy)) {
- scope.statesController.$onDestroy();
- }
- }
-
- function init() {
-
- var stateController = scope.dashboardCtrl.dashboardCtx.stateController;
-
- stateController.openState = function(id, params, openRightLayout) {
- if (scope.statesController) {
- scope.statesController.openState(id, params, openRightLayout);
- }
- }
-
- stateController.updateState = function(id, params, openRightLayout) {
- if (scope.statesController) {
- scope.statesController.updateState(id, params, openRightLayout);
- }
- }
-
- stateController.resetState = function() {
- if (scope.statesController) {
- scope.statesController.resetState();
- }
- }
-
- stateController.preserveState = function() {
- if (scope.statesController) {
- var state = scope.statesController.getStateObject();
- statesControllerService.preserveStateControllerState(scope.statesControllerId, state);
- }
- }
-
- stateController.cleanupPreservedStates = function() {
- statesControllerService.cleanupPreservedStates();
- }
-
- stateController.navigatePrevState = function(index) {
- if (scope.statesController) {
- scope.statesController.navigatePrevState(index);
- }
- }
-
- stateController.getStateId = function() {
- if (scope.statesController) {
- return scope.statesController.getStateId();
- } else {
- return '';
- }
- }
-
- stateController.getStateIndex = function() {
- if (scope.statesController) {
- return scope.statesController.getStateIndex();
- } else {
- return -1;
- }
- }
-
- stateController.getStateIdAtIndex = function(index) {
- if (scope.statesController) {
- return scope.statesController.getStateIdAtIndex(index);
- } else {
- return '';
- }
- }
-
- stateController.getStateParams = function() {
- if (scope.statesController) {
- return scope.statesController.getStateParams();
- } else {
- return {};
- }
- }
-
- stateController.getStateParamsByStateId = function(id) {
- if (scope.statesController) {
- return scope.statesController.getStateParamsByStateId(id);
- } else {
- return null;
- }
- }
-
- stateController.getEntityId = function(entityParamName) {
- if (scope.statesController) {
- return scope.statesController.getEntityId(entityParamName);
- } else {
- return null;
- }
- }
-
- }
-
- scope.$on('$destroy', function callOnDestroyHook() {
- destroyStateController();
- });
-
- scope.$watch('scope.dashboardCtrl', function() {
- if (scope.dashboardCtrl.dashboardCtx) {
- init();
- }
- })
-
- scope.$watch('statesControllerId', function(newValue) {
- if (newValue) {
- if (scope.statesController) {
- destroyStateController();
- }
- var statesControllerInfo = statesControllerService.getStateController(scope.statesControllerId);
- if (!statesControllerInfo) {
- //fallback to default
- statesControllerInfo = statesControllerService.getStateController('default');
- }
- var template = $templateCache.get(statesControllerInfo.templateUrl);
- element.html(template);
-
- var preservedState = statesControllerService.withdrawStateControllerState(scope.statesControllerId);
-
- var locals = {
- preservedState: preservedState
- };
- angular.extend(locals, {$scope: scope, $element: element});
- var controller = $controller(statesControllerInfo.controller, locals, true, 'vm');
- controller.instance = controller();
- scope.statesController = controller.instance;
- scope.statesController.dashboardCtrl = scope.dashboardCtrl;
- scope.statesController.states = scope.states;
- $compile(element.contents())(scope);
- }
- });
-
- scope.$watch('states', function() {
- if (scope.statesController) {
- scope.statesController.states = scope.states;
- }
- });
-
- }
-
- return {
- restrict: "E",
- link: linker,
- scope: {
- statesControllerId: '=',
- dashboardCtrl: '=',
- states: '='
- }
- };
-}
diff --git a/ui/src/app/dashboard/states/states-controller.service.js b/ui/src/app/dashboard/states/states-controller.service.js
deleted file mode 100644
index 160c82a4cd..0000000000
--- a/ui/src/app/dashboard/states/states-controller.service.js
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-/* eslint-disable import/no-unresolved, import/default */
-
-import defaultStateControllerTemplate from './default-state-controller.tpl.html';
-import entityStateControllerTemplate from './entity-state-controller.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-import DefaultStateController from './default-state-controller';
-import EntityStateController from './entity-state-controller';
-
-/*@ngInject*/
-export default function StatesControllerService() {
-
- var statesControllers = {};
- statesControllers['default'] = {
- controller: DefaultStateController,
- templateUrl: defaultStateControllerTemplate
- };
- statesControllers['entity'] = {
- controller: EntityStateController,
- templateUrl: entityStateControllerTemplate
- };
-
- var service = {
- registerStatesController: registerStatesController,
- getStateControllers: getStateControllers,
- getStateController: getStateController,
- preserveStateControllerState: preserveStateControllerState,
- withdrawStateControllerState: withdrawStateControllerState,
- cleanupPreservedStates: cleanupPreservedStates
- };
-
- return service;
-
- function registerStatesController(id, stateControllerInfo) {
- statesControllers[id] = stateControllerInfo;
- }
-
- function getStateControllers() {
- return statesControllers;
- }
-
- function getStateController(id) {
- return statesControllers[id];
- }
-
- function preserveStateControllerState(id, state) {
- statesControllers[id].state = angular.copy(state);
- }
-
- function withdrawStateControllerState(id) {
- var state = statesControllers[id].state;
- statesControllers[id].state = null;
- return state;
- }
-
- function cleanupPreservedStates() {
- for (var id in statesControllers) {
- statesControllers[id].state = null;
- }
- }
-
-}
diff --git a/ui/src/app/device/add-device.tpl.html b/ui/src/app/device/add-device.tpl.html
deleted file mode 100644
index f3b8104d1c..0000000000
--- a/ui/src/app/device/add-device.tpl.html
+++ /dev/null
@@ -1,45 +0,0 @@
-
-
-
-
\ No newline at end of file
diff --git a/ui/src/app/device/add-devices-to-customer.controller.js b/ui/src/app/device/add-devices-to-customer.controller.js
deleted file mode 100644
index 8212b6cae3..0000000000
--- a/ui/src/app/device/add-devices-to-customer.controller.js
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-/*@ngInject*/
-export default function AddDevicesToCustomerController(deviceService, $mdDialog, $q, customerId, devices) {
-
- var vm = this;
-
- vm.devices = devices;
- vm.searchText = '';
-
- vm.assign = assign;
- vm.cancel = cancel;
- vm.hasData = hasData;
- vm.noData = noData;
- vm.searchDeviceTextUpdated = searchDeviceTextUpdated;
- vm.toggleDeviceSelection = toggleDeviceSelection;
-
- vm.theDevices = {
- getItemAtIndex: function (index) {
- if (index > vm.devices.data.length) {
- vm.theDevices.fetchMoreItems_(index);
- return null;
- }
- var item = vm.devices.data[index];
- if (item) {
- item.indexNumber = index + 1;
- }
- return item;
- },
-
- getLength: function () {
- if (vm.devices.hasNext) {
- return vm.devices.data.length + vm.devices.nextPageLink.limit;
- } else {
- return vm.devices.data.length;
- }
- },
-
- fetchMoreItems_: function () {
- if (vm.devices.hasNext && !vm.devices.pending) {
- vm.devices.pending = true;
- deviceService.getTenantDevices(vm.devices.nextPageLink, false).then(
- function success(devices) {
- vm.devices.data = vm.devices.data.concat(devices.data);
- vm.devices.nextPageLink = devices.nextPageLink;
- vm.devices.hasNext = devices.hasNext;
- if (vm.devices.hasNext) {
- vm.devices.nextPageLink.limit = vm.devices.pageSize;
- }
- vm.devices.pending = false;
- },
- function fail() {
- vm.devices.hasNext = false;
- vm.devices.pending = false;
- });
- }
- }
- };
-
- function cancel () {
- $mdDialog.cancel();
- }
-
- function assign() {
- var tasks = [];
- for (var deviceId in vm.devices.selections) {
- tasks.push(deviceService.assignDeviceToCustomer(customerId, deviceId));
- }
- $q.all(tasks).then(function () {
- $mdDialog.hide();
- });
- }
-
- function noData() {
- return vm.devices.data.length == 0 && !vm.devices.hasNext;
- }
-
- function hasData() {
- return vm.devices.data.length > 0;
- }
-
- function toggleDeviceSelection($event, device) {
- $event.stopPropagation();
- var selected = angular.isDefined(device.selected) && device.selected;
- device.selected = !selected;
- if (device.selected) {
- vm.devices.selections[device.id.id] = true;
- vm.devices.selectedCount++;
- } else {
- delete vm.devices.selections[device.id.id];
- vm.devices.selectedCount--;
- }
- }
-
- function searchDeviceTextUpdated() {
- vm.devices = {
- pageSize: vm.devices.pageSize,
- data: [],
- nextPageLink: {
- limit: vm.devices.pageSize,
- textSearch: vm.searchText
- },
- selections: {},
- selectedCount: 0,
- hasNext: true,
- pending: false
- };
- }
-
-}
diff --git a/ui/src/app/device/add-devices-to-customer.tpl.html b/ui/src/app/device/add-devices-to-customer.tpl.html
deleted file mode 100644
index 61c4dc2c3a..0000000000
--- a/ui/src/app/device/add-devices-to-customer.tpl.html
+++ /dev/null
@@ -1,77 +0,0 @@
-
-
-
-
\ No newline at end of file
diff --git a/ui/src/app/device/assign-to-customer.controller.js b/ui/src/app/device/assign-to-customer.controller.js
deleted file mode 100644
index 2fca96d29c..0000000000
--- a/ui/src/app/device/assign-to-customer.controller.js
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-/*@ngInject*/
-export default function AssignDeviceToCustomerController(customerService, deviceService, $mdDialog, $q, deviceIds, customers) {
-
- var vm = this;
-
- vm.customers = customers;
- vm.searchText = '';
-
- vm.assign = assign;
- vm.cancel = cancel;
- vm.isCustomerSelected = isCustomerSelected;
- vm.hasData = hasData;
- vm.noData = noData;
- vm.searchCustomerTextUpdated = searchCustomerTextUpdated;
- vm.toggleCustomerSelection = toggleCustomerSelection;
-
- vm.theCustomers = {
- getItemAtIndex: function (index) {
- if (index > vm.customers.data.length) {
- vm.theCustomers.fetchMoreItems_(index);
- return null;
- }
- var item = vm.customers.data[index];
- if (item) {
- item.indexNumber = index + 1;
- }
- return item;
- },
-
- getLength: function () {
- if (vm.customers.hasNext) {
- return vm.customers.data.length + vm.customers.nextPageLink.limit;
- } else {
- return vm.customers.data.length;
- }
- },
-
- fetchMoreItems_: function () {
- if (vm.customers.hasNext && !vm.customers.pending) {
- vm.customers.pending = true;
- customerService.getCustomers(vm.customers.nextPageLink).then(
- function success(customers) {
- vm.customers.data = vm.customers.data.concat(customers.data);
- vm.customers.nextPageLink = customers.nextPageLink;
- vm.customers.hasNext = customers.hasNext;
- if (vm.customers.hasNext) {
- vm.customers.nextPageLink.limit = vm.customers.pageSize;
- }
- vm.customers.pending = false;
- },
- function fail() {
- vm.customers.hasNext = false;
- vm.customers.pending = false;
- });
- }
- }
- };
-
- function cancel() {
- $mdDialog.cancel();
- }
-
- function assign() {
- var tasks = [];
- for (var i=0;i 0;
- }
-
- function toggleCustomerSelection($event, customer) {
- $event.stopPropagation();
- if (vm.isCustomerSelected(customer)) {
- vm.customers.selection = null;
- } else {
- vm.customers.selection = customer;
- }
- }
-
- function isCustomerSelected(customer) {
- return vm.customers.selection != null && customer &&
- customer.id.id === vm.customers.selection.id.id;
- }
-
- function searchCustomerTextUpdated() {
- vm.customers = {
- pageSize: vm.customers.pageSize,
- data: [],
- nextPageLink: {
- limit: vm.customers.pageSize,
- textSearch: vm.searchText
- },
- selection: null,
- hasNext: true,
- pending: false
- };
- }
-}
diff --git a/ui/src/app/device/assign-to-customer.tpl.html b/ui/src/app/device/assign-to-customer.tpl.html
deleted file mode 100644
index 079c1fb276..0000000000
--- a/ui/src/app/device/assign-to-customer.tpl.html
+++ /dev/null
@@ -1,76 +0,0 @@
-
-
-
-
\ No newline at end of file
diff --git a/ui/src/app/device/device-card.tpl.html b/ui/src/app/device/device-card.tpl.html
deleted file mode 100644
index d6ec4d93a8..0000000000
--- a/ui/src/app/device/device-card.tpl.html
+++ /dev/null
@@ -1,23 +0,0 @@
-
-
-
{{vm.item.type}}
-
{{vm.item.additionalInfo.description}}
-
{{'device.assignedToCustomer' | translate}} '{{vm.item.assignedCustomer.title}}'
-
{{'device.public' | translate}}
-
diff --git a/ui/src/app/device/device-credentials.controller.js b/ui/src/app/device/device-credentials.controller.js
deleted file mode 100644
index 6a33b026f2..0000000000
--- a/ui/src/app/device/device-credentials.controller.js
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-/*@ngInject*/
-export default function ManageDeviceCredentialsController(deviceService, $scope, $mdDialog, deviceId, isReadOnly) {
-
- var vm = this;
-
- vm.credentialsTypes = [
- {
- name: 'Access token',
- value: 'ACCESS_TOKEN'
- },
- {
- name: 'X.509 Certificate',
- value: 'X509_CERTIFICATE'
- }
- ];
-
- vm.deviceCredentials = {};
- vm.isReadOnly = isReadOnly;
-
- vm.valid = valid;
- vm.cancel = cancel;
- vm.save = save;
- vm.clear = clear;
-
- loadDeviceCredentials();
-
- function loadDeviceCredentials() {
- deviceService.getDeviceCredentials(deviceId).then(function success(deviceCredentials) {
- vm.deviceCredentials = deviceCredentials;
- });
- }
-
- function cancel() {
- $mdDialog.cancel();
- }
-
- function valid() {
- return vm.deviceCredentials &&
- (vm.deviceCredentials.credentialsType === 'ACCESS_TOKEN'
- && vm.deviceCredentials.credentialsId
- && vm.deviceCredentials.credentialsId.length > 0
- || vm.deviceCredentials.credentialsType === 'X509_CERTIFICATE'
- && vm.deviceCredentials.credentialsValue
- && vm.deviceCredentials.credentialsValue.length > 0);
- }
-
- function clear() {
- vm.deviceCredentials.credentialsId = null;
- vm.deviceCredentials.credentialsValue = null;
- }
-
- function save() {
- deviceService.saveDeviceCredentials(vm.deviceCredentials).then(function success(deviceCredentials) {
- vm.deviceCredentials = deviceCredentials;
- $scope.theForm.$setPristine();
- $mdDialog.hide();
- });
- }
-}
diff --git a/ui/src/app/device/device-credentials.tpl.html b/ui/src/app/device/device-credentials.tpl.html
deleted file mode 100644
index ddea7b044a..0000000000
--- a/ui/src/app/device/device-credentials.tpl.html
+++ /dev/null
@@ -1,71 +0,0 @@
-
-
-
-
\ No newline at end of file
diff --git a/ui/src/app/device/device-fieldset.tpl.html b/ui/src/app/device/device-fieldset.tpl.html
deleted file mode 100644
index 76b85a60e4..0000000000
--- a/ui/src/app/device/device-fieldset.tpl.html
+++ /dev/null
@@ -1,88 +0,0 @@
-
-{{ 'device.make-public' | translate }}
-{{ 'device.assign-to-customer' | translate }}
-{{ isPublic ? 'device.make-private' : 'device.unassign-from-customer' | translate }}
-{{ (deviceScope === 'customer_user' ? 'device.view-credentials' : 'device.manage-credentials') | translate }}
-{{ 'device.delete' | translate }}
-
-
-
-
- device.copyId
-
-
-
- device.copyAccessToken
-
-
-
-
-
-
-
-
-
- {{ 'device.device-public' | translate }}
-
-
-
diff --git a/ui/src/app/device/device.controller.js b/ui/src/app/device/device.controller.js
deleted file mode 100644
index bf0a61336b..0000000000
--- a/ui/src/app/device/device.controller.js
+++ /dev/null
@@ -1,584 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-/* eslint-disable import/no-unresolved, import/default */
-
-import addDeviceTemplate from './add-device.tpl.html';
-import deviceCard from './device-card.tpl.html';
-import assignToCustomerTemplate from './assign-to-customer.tpl.html';
-import addDevicesToCustomerTemplate from './add-devices-to-customer.tpl.html';
-import deviceCredentialsTemplate from './device-credentials.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-/*@ngInject*/
-export function DeviceCardController(types) {
-
- var vm = this;
-
- vm.types = types;
-
- vm.isAssignedToCustomer = function() {
- if (vm.item && vm.item.customerId && vm.parentCtl.devicesScope === 'tenant' &&
- vm.item.customerId.id != vm.types.id.nullUid && !vm.item.assignedCustomer.isPublic) {
- return true;
- }
- return false;
- }
-
- vm.isPublic = function() {
- if (vm.item && vm.item.assignedCustomer && vm.parentCtl.devicesScope === 'tenant' && vm.item.assignedCustomer.isPublic) {
- return true;
- }
- return false;
- }
-}
-
-
-/*@ngInject*/
-export function DeviceController($rootScope, userService, deviceService, customerService, $state, $stateParams,
- $document, $mdDialog, $q, $translate, types, importExport) {
-
- var customerId = $stateParams.customerId;
-
- var deviceActionsList = [];
-
- var deviceGroupActionsList = [];
-
- var deviceAddItemActionsList = [
- {
- onAction: function ($event) {
- vm.grid.addItem($event);
- },
- name: function() { return $translate.instant('action.add') },
- details: function() { return $translate.instant('device.add-device-text') },
- icon: "insert_drive_file"
- },
- {
- onAction: function ($event) {
- importExport.importEntities($event, types.entityType.device).then(
- function() {
- vm.grid.refreshList();
- }
- );
- },
- name: function() { return $translate.instant('action.import') },
- details: function() { return $translate.instant('device.import') },
- icon: "file_upload"
- }
- ];
-
- var vm = this;
-
- vm.types = types;
-
- vm.deviceGridConfig = {
- deleteItemTitleFunc: deleteDeviceTitle,
- deleteItemContentFunc: deleteDeviceText,
- deleteItemsTitleFunc: deleteDevicesTitle,
- deleteItemsActionTitleFunc: deleteDevicesActionTitle,
- deleteItemsContentFunc: deleteDevicesText,
-
- saveItemFunc: saveDevice,
-
- getItemTitleFunc: getDeviceTitle,
-
- itemCardController: 'DeviceCardController',
- itemCardTemplateUrl: deviceCard,
- parentCtl: vm,
-
- actionsList: deviceActionsList,
- groupActionsList: deviceGroupActionsList,
- addItemActions: deviceAddItemActionsList,
-
- onGridInited: gridInited,
-
- addItemTemplateUrl: addDeviceTemplate,
-
- noItemsText: function() { return $translate.instant('device.no-devices-text') },
- itemDetailsText: function() { return $translate.instant('device.device-details') },
- isDetailsReadOnly: isCustomerUser,
- isSelectionEnabled: function () {
- return !isCustomerUser();
- }
- };
-
- if (angular.isDefined($stateParams.items) && $stateParams.items !== null) {
- vm.deviceGridConfig.items = $stateParams.items;
- }
-
- if (angular.isDefined($stateParams.topIndex) && $stateParams.topIndex > 0) {
- vm.deviceGridConfig.topIndex = $stateParams.topIndex;
- }
-
- vm.devicesScope = $state.$current.data.devicesType;
-
- vm.assignToCustomer = assignToCustomer;
- vm.makePublic = makePublic;
- vm.unassignFromCustomer = unassignFromCustomer;
- vm.manageCredentials = manageCredentials;
-
- initController();
-
- function initController() {
- var fetchDevicesFunction = null;
- var deleteDeviceFunction = null;
- var refreshDevicesParamsFunction = null;
-
- var user = userService.getCurrentUser();
-
- if (user.authority === 'CUSTOMER_USER') {
- vm.devicesScope = 'customer_user';
- customerId = user.customerId;
- }
- if (customerId) {
- vm.customerDevicesTitle = $translate.instant('customer.devices');
- customerService.getShortCustomerInfo(customerId).then(
- function success(info) {
- if (info.isPublic) {
- vm.customerDevicesTitle = $translate.instant('customer.public-devices');
- }
- }
- );
- }
-
- if (vm.devicesScope === 'tenant') {
- fetchDevicesFunction = function (pageLink, deviceType) {
- return deviceService.getTenantDevices(pageLink, true, null, deviceType);
- };
- deleteDeviceFunction = function (deviceId) {
- return deviceService.deleteDevice(deviceId);
- };
- refreshDevicesParamsFunction = function() {
- return {"topIndex": vm.topIndex};
- };
-
- deviceActionsList.push({
- onAction: function ($event, item) {
- makePublic($event, item);
- },
- name: function() { return $translate.instant('action.share') },
- details: function() { return $translate.instant('device.make-public') },
- icon: "share",
- isEnabled: function(device) {
- return device && (!device.customerId || device.customerId.id === types.id.nullUid);
- }
- });
-
- deviceActionsList.push(
- {
- onAction: function ($event, item) {
- assignToCustomer($event, [ item.id.id ]);
- },
- name: function() { return $translate.instant('action.assign') },
- details: function() { return $translate.instant('device.assign-to-customer') },
- icon: "assignment_ind",
- isEnabled: function(device) {
- return device && (!device.customerId || device.customerId.id === types.id.nullUid);
- }
- }
- );
-
- deviceActionsList.push(
- {
- onAction: function ($event, item) {
- unassignFromCustomer($event, item, false);
- },
- name: function() { return $translate.instant('action.unassign') },
- details: function() { return $translate.instant('device.unassign-from-customer') },
- icon: "assignment_return",
- isEnabled: function(device) {
- return device && device.customerId && device.customerId.id !== types.id.nullUid && !device.assignedCustomer.isPublic;
- }
- }
- );
-
- deviceActionsList.push({
- onAction: function ($event, item) {
- unassignFromCustomer($event, item, true);
- },
- name: function() { return $translate.instant('action.make-private') },
- details: function() { return $translate.instant('device.make-private') },
- icon: "reply",
- isEnabled: function(device) {
- return device && device.customerId && device.customerId.id !== types.id.nullUid && device.assignedCustomer.isPublic;
- }
- });
-
- deviceActionsList.push(
- {
- onAction: function ($event, item) {
- manageCredentials($event, item);
- },
- name: function() { return $translate.instant('device.credentials') },
- details: function() { return $translate.instant('device.manage-credentials') },
- icon: "security"
- }
- );
-
- deviceActionsList.push(
- {
- onAction: function ($event, item) {
- vm.grid.deleteItem($event, item);
- },
- name: function() { return $translate.instant('action.delete') },
- details: function() { return $translate.instant('device.delete') },
- icon: "delete"
- }
- );
-
- deviceGroupActionsList.push(
- {
- onAction: function ($event, items) {
- assignDevicesToCustomer($event, items);
- },
- name: function() { return $translate.instant('device.assign-devices') },
- details: function(selectedCount) {
- return $translate.instant('device.assign-devices-text', {count: selectedCount}, "messageformat");
- },
- icon: "assignment_ind"
- }
- );
-
- deviceGroupActionsList.push(
- {
- onAction: function ($event) {
- vm.grid.deleteItems($event);
- },
- name: function() { return $translate.instant('device.delete-devices') },
- details: deleteDevicesActionTitle,
- icon: "delete"
- }
- );
-
-
-
- } else if (vm.devicesScope === 'customer' || vm.devicesScope === 'customer_user') {
- fetchDevicesFunction = function (pageLink, deviceType) {
- return deviceService.getCustomerDevices(customerId, pageLink, true, null, deviceType);
- };
- deleteDeviceFunction = function (deviceId) {
- return deviceService.unassignDeviceFromCustomer(deviceId);
- };
- refreshDevicesParamsFunction = function () {
- return {"customerId": customerId, "topIndex": vm.topIndex};
- };
-
- if (vm.devicesScope === 'customer') {
- deviceActionsList.push(
- {
- onAction: function ($event, item) {
- unassignFromCustomer($event, item, false);
- },
- name: function() { return $translate.instant('action.unassign') },
- details: function() { return $translate.instant('device.unassign-from-customer') },
- icon: "assignment_return",
- isEnabled: function(device) {
- return device && !device.assignedCustomer.isPublic;
- }
- }
- );
- deviceActionsList.push(
- {
- onAction: function ($event, item) {
- unassignFromCustomer($event, item, true);
- },
- name: function() { return $translate.instant('action.make-private') },
- details: function() { return $translate.instant('device.make-private') },
- icon: "reply",
- isEnabled: function(device) {
- return device && device.assignedCustomer.isPublic;
- }
- }
- );
-
- deviceActionsList.push(
- {
- onAction: function ($event, item) {
- manageCredentials($event, item);
- },
- name: function() { return $translate.instant('device.credentials') },
- details: function() { return $translate.instant('device.manage-credentials') },
- icon: "security"
- }
- );
-
- deviceGroupActionsList.push(
- {
- onAction: function ($event, items) {
- unassignDevicesFromCustomer($event, items);
- },
- name: function() { return $translate.instant('device.unassign-devices') },
- details: function(selectedCount) {
- return $translate.instant('device.unassign-devices-action-title', {count: selectedCount}, "messageformat");
- },
- icon: "assignment_return"
- }
- );
-
- vm.deviceGridConfig.addItemAction = {
- onAction: function ($event) {
- addDevicesToCustomer($event);
- },
- name: function() { return $translate.instant('device.assign-devices') },
- details: function() { return $translate.instant('device.assign-new-device') },
- icon: "add"
- };
-
- } else if (vm.devicesScope === 'customer_user') {
- deviceActionsList.push(
- {
- onAction: function ($event, item) {
- manageCredentials($event, item);
- },
- name: function() { return $translate.instant('device.credentials') },
- details: function() { return $translate.instant('device.view-credentials') },
- icon: "security"
- }
- );
-
- vm.deviceGridConfig.addItemAction = {};
- }
- vm.deviceGridConfig.addItemActions = [];
-
- }
-
- vm.deviceGridConfig.refreshParamsFunc = refreshDevicesParamsFunction;
- vm.deviceGridConfig.fetchItemsFunc = fetchDevicesFunction;
- vm.deviceGridConfig.deleteItemFunc = deleteDeviceFunction;
-
- }
-
- function deleteDeviceTitle(device) {
- return $translate.instant('device.delete-device-title', {deviceName: device.name});
- }
-
- function deleteDeviceText() {
- return $translate.instant('device.delete-device-text');
- }
-
- function deleteDevicesTitle(selectedCount) {
- return $translate.instant('device.delete-devices-title', {count: selectedCount}, 'messageformat');
- }
-
- function deleteDevicesActionTitle(selectedCount) {
- return $translate.instant('device.delete-devices-action-title', {count: selectedCount}, 'messageformat');
- }
-
- function deleteDevicesText () {
- return $translate.instant('device.delete-devices-text');
- }
-
- function gridInited(grid) {
- vm.grid = grid;
- }
-
- function getDeviceTitle(device) {
- return device ? device.name : '';
- }
-
- function saveDevice(device) {
- var deferred = $q.defer();
- deviceService.saveDevice(device).then(
- function success(savedDevice) {
- $rootScope.$broadcast('deviceSaved');
- var devices = [ savedDevice ];
- customerService.applyAssignedCustomersInfo(devices).then(
- function success(items) {
- if (items && items.length == 1) {
- deferred.resolve(items[0]);
- } else {
- deferred.reject();
- }
- },
- function fail() {
- deferred.reject();
- }
- );
- },
- function fail() {
- deferred.reject();
- }
- );
- return deferred.promise;
- }
-
- function isCustomerUser() {
- return vm.devicesScope === 'customer_user';
- }
-
- function assignToCustomer($event, deviceIds) {
- if ($event) {
- $event.stopPropagation();
- }
- var pageSize = 10;
- customerService.getCustomers({limit: pageSize, textSearch: ''}).then(
- function success(_customers) {
- var customers = {
- pageSize: pageSize,
- data: _customers.data,
- nextPageLink: _customers.nextPageLink,
- selection: null,
- hasNext: _customers.hasNext,
- pending: false
- };
- if (customers.hasNext) {
- customers.nextPageLink.limit = pageSize;
- }
- $mdDialog.show({
- controller: 'AssignDeviceToCustomerController',
- controllerAs: 'vm',
- templateUrl: assignToCustomerTemplate,
- locals: {deviceIds: deviceIds, customers: customers},
- parent: angular.element($document[0].body),
- fullscreen: true,
- targetEvent: $event
- }).then(function () {
- vm.grid.refreshList();
- }, function () {
- });
- },
- function fail() {
- });
- }
-
- function addDevicesToCustomer($event) {
- if ($event) {
- $event.stopPropagation();
- }
- var pageSize = 10;
- deviceService.getTenantDevices({limit: pageSize, textSearch: ''}, false).then(
- function success(_devices) {
- var devices = {
- pageSize: pageSize,
- data: _devices.data,
- nextPageLink: _devices.nextPageLink,
- selections: {},
- selectedCount: 0,
- hasNext: _devices.hasNext,
- pending: false
- };
- if (devices.hasNext) {
- devices.nextPageLink.limit = pageSize;
- }
- $mdDialog.show({
- controller: 'AddDevicesToCustomerController',
- controllerAs: 'vm',
- templateUrl: addDevicesToCustomerTemplate,
- locals: {customerId: customerId, devices: devices},
- parent: angular.element($document[0].body),
- fullscreen: true,
- targetEvent: $event
- }).then(function () {
- vm.grid.refreshList();
- }, function () {
- });
- },
- function fail() {
- });
- }
-
- function assignDevicesToCustomer($event, items) {
- var deviceIds = [];
- for (var id in items.selections) {
- deviceIds.push(id);
- }
- assignToCustomer($event, deviceIds);
- }
-
- function unassignFromCustomer($event, device, isPublic) {
- if ($event) {
- $event.stopPropagation();
- }
- var title;
- var content;
- var label;
- if (isPublic) {
- title = $translate.instant('device.make-private-device-title', {deviceName: device.name});
- content = $translate.instant('device.make-private-device-text');
- label = $translate.instant('device.make-private');
- } else {
- title = $translate.instant('device.unassign-device-title', {deviceName: device.name});
- content = $translate.instant('device.unassign-device-text');
- label = $translate.instant('device.unassign-device');
- }
- var confirm = $mdDialog.confirm()
- .targetEvent($event)
- .title(title)
- .htmlContent(content)
- .ariaLabel(label)
- .cancel($translate.instant('action.no'))
- .ok($translate.instant('action.yes'));
- $mdDialog.show(confirm).then(function () {
- deviceService.unassignDeviceFromCustomer(device.id.id).then(function success() {
- vm.grid.refreshList();
- });
- });
- }
-
- function unassignDevicesFromCustomer($event, items) {
- var confirm = $mdDialog.confirm()
- .targetEvent($event)
- .title($translate.instant('device.unassign-devices-title', {count: items.selectedCount}, 'messageformat'))
- .htmlContent($translate.instant('device.unassign-devices-text'))
- .ariaLabel($translate.instant('device.unassign-device'))
- .cancel($translate.instant('action.no'))
- .ok($translate.instant('action.yes'));
- $mdDialog.show(confirm).then(function () {
- var tasks = [];
- for (var id in items.selections) {
- tasks.push(deviceService.unassignDeviceFromCustomer(id));
- }
- $q.all(tasks).then(function () {
- vm.grid.refreshList();
- });
- });
- }
-
- function makePublic($event, device) {
- if ($event) {
- $event.stopPropagation();
- }
- var confirm = $mdDialog.confirm()
- .targetEvent($event)
- .title($translate.instant('device.make-public-device-title', {deviceName: device.name}))
- .htmlContent($translate.instant('device.make-public-device-text'))
- .ariaLabel($translate.instant('device.make-public'))
- .cancel($translate.instant('action.no'))
- .ok($translate.instant('action.yes'));
- $mdDialog.show(confirm).then(function () {
- deviceService.makeDevicePublic(device.id.id).then(function success() {
- vm.grid.refreshList();
- });
- });
- }
-
- function manageCredentials($event, device) {
- if ($event) {
- $event.stopPropagation();
- }
- $mdDialog.show({
- controller: 'ManageDeviceCredentialsController',
- controllerAs: 'vm',
- templateUrl: deviceCredentialsTemplate,
- locals: {deviceId: device.id.id, isReadOnly: isCustomerUser()},
- parent: angular.element($document[0].body),
- fullscreen: true,
- targetEvent: $event
- }).then(function () {
- }, function () {
- });
- }
-}
diff --git a/ui/src/app/device/device.directive.js b/ui/src/app/device/device.directive.js
deleted file mode 100644
index 03874e5ca5..0000000000
--- a/ui/src/app/device/device.directive.js
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-/* eslint-disable import/no-unresolved, import/default */
-
-import deviceFieldsetTemplate from './device-fieldset.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-/*@ngInject*/
-export default function DeviceDirective($compile, $templateCache, toast, $translate, types, clipboardService, deviceService, customerService) {
- var linker = function (scope, element) {
- var template = $templateCache.get(deviceFieldsetTemplate);
- element.html(template);
-
- scope.types = types;
- scope.isAssignedToCustomer = false;
- scope.isPublic = false;
- scope.assignedCustomer = null;
-
- scope.$watch('device', function(newVal) {
- if (newVal) {
- if (scope.device.customerId && scope.device.customerId.id !== types.id.nullUid) {
- scope.isAssignedToCustomer = true;
- customerService.getShortCustomerInfo(scope.device.customerId.id).then(
- function success(customer) {
- scope.assignedCustomer = customer;
- scope.isPublic = customer.isPublic;
- }
- );
- } else {
- scope.isAssignedToCustomer = false;
- scope.isPublic = false;
- scope.assignedCustomer = null;
- }
- }
- });
-
- scope.onDeviceIdCopied = function() {
- toast.showSuccess($translate.instant('device.idCopiedMessage'), 750, angular.element(element).parent().parent(), 'bottom left');
- };
-
- scope.copyAccessToken = function(e) {
- const trigger = e.delegateTarget || e.currentTarget;
- if (scope.device.id) {
- deviceService.getDeviceCredentials(scope.device.id.id, true).then(
- function success(credentials) {
- var credentialsId = credentials.credentialsId;
- clipboardService.copyToClipboard(trigger, credentialsId).then(
- () => {
- toast.showSuccess($translate.instant('device.accessTokenCopiedMessage'), 750, angular.element(element).parent().parent(), 'bottom left');
- }
- );
- }
- );
- }
- };
-
- $compile(element.contents())(scope);
- }
- return {
- restrict: "E",
- link: linker,
- scope: {
- device: '=',
- isEdit: '=',
- deviceScope: '=',
- theForm: '=',
- onAssignToCustomer: '&',
- onMakePublic: '&',
- onUnassignFromCustomer: '&',
- onManageCredentials: '&',
- onDeleteDevice: '&'
- }
- };
-}
diff --git a/ui/src/app/device/device.routes.js b/ui/src/app/device/device.routes.js
deleted file mode 100644
index da7dbb89dc..0000000000
--- a/ui/src/app/device/device.routes.js
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-/* eslint-disable import/no-unresolved, import/default */
-
-import devicesTemplate from './devices.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-/*@ngInject*/
-export default function DeviceRoutes($stateProvider, types) {
- $stateProvider
- .state('home.devices', {
- url: '/devices',
- params: {'topIndex': 0},
- module: 'private',
- auth: ['TENANT_ADMIN', 'CUSTOMER_USER'],
- views: {
- "content@home": {
- templateUrl: devicesTemplate,
- controller: 'DeviceController',
- controllerAs: 'vm'
- }
- },
- data: {
- devicesType: 'tenant',
- searchEnabled: true,
- searchByEntitySubtype: true,
- searchEntityType: types.entityType.device,
- pageTitle: 'device.devices'
- },
- ncyBreadcrumb: {
- label: '{"icon": "devices_other", "label": "device.devices"}'
- }
- })
- .state('home.customers.devices', {
- url: '/:customerId/devices',
- params: {'topIndex': 0},
- module: 'private',
- auth: ['TENANT_ADMIN'],
- views: {
- "content@home": {
- templateUrl: devicesTemplate,
- controllerAs: 'vm',
- controller: 'DeviceController'
- }
- },
- data: {
- devicesType: 'customer',
- searchEnabled: true,
- searchByEntitySubtype: true,
- searchEntityType: types.entityType.device,
- pageTitle: 'customer.devices'
- },
- ncyBreadcrumb: {
- label: '{"icon": "devices_other", "label": "{{ vm.customerDevicesTitle }}", "translate": "false"}'
- }
- });
-
-}
diff --git a/ui/src/app/device/devices.tpl.html b/ui/src/app/device/devices.tpl.html
deleted file mode 100644
index 14b4f90df3..0000000000
--- a/ui/src/app/device/devices.tpl.html
+++ /dev/null
@@ -1,83 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/ui/src/app/device/index.js b/ui/src/app/device/index.js
deleted file mode 100644
index 35b721c9f5..0000000000
--- a/ui/src/app/device/index.js
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Copyright © 2016-2020 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 uiRouter from 'angular-ui-router';
-import thingsboardGrid from '../components/grid.directive';
-import thingsboardApiUser from '../api/user.service';
-import thingsboardApiDevice from '../api/device.service';
-import thingsboardApiCustomer from '../api/customer.service';
-
-import DeviceRoutes from './device.routes';
-import {DeviceController, DeviceCardController} from './device.controller';
-import AssignDeviceToCustomerController from './assign-to-customer.controller';
-import AddDevicesToCustomerController from './add-devices-to-customer.controller';
-import ManageDeviceCredentialsController from './device-credentials.controller';
-import DeviceDirective from './device.directive';
-
-export default angular.module('thingsboard.device', [
- uiRouter,
- thingsboardGrid,
- thingsboardApiUser,
- thingsboardApiDevice,
- thingsboardApiCustomer
-])
- .config(DeviceRoutes)
- .controller('DeviceController', DeviceController)
- .controller('DeviceCardController', DeviceCardController)
- .controller('AssignDeviceToCustomerController', AssignDeviceToCustomerController)
- .controller('AddDevicesToCustomerController', AddDevicesToCustomerController)
- .controller('ManageDeviceCredentialsController', ManageDeviceCredentialsController)
- .directive('tbDevice', DeviceDirective)
- .name;
diff --git a/ui/src/app/entity-view/add-entity-view.tpl.html b/ui/src/app/entity-view/add-entity-view.tpl.html
deleted file mode 100644
index 9372f506bb..0000000000
--- a/ui/src/app/entity-view/add-entity-view.tpl.html
+++ /dev/null
@@ -1,45 +0,0 @@
-
-
-
-
\ No newline at end of file
diff --git a/ui/src/app/entity-view/add-entity-views-to-customer.controller.js b/ui/src/app/entity-view/add-entity-views-to-customer.controller.js
deleted file mode 100644
index 540e82c8f4..0000000000
--- a/ui/src/app/entity-view/add-entity-views-to-customer.controller.js
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-/*@ngInject*/
-export default function AddEntityViewsToCustomerController(entityViewService, $mdDialog, $q, customerId, entityViews) {
-
- var vm = this;
-
- vm.entityViews = entityViews;
- vm.searchText = '';
-
- vm.assign = assign;
- vm.cancel = cancel;
- vm.hasData = hasData;
- vm.noData = noData;
- vm.searchEntityViewTextUpdated = searchEntityViewTextUpdated;
- vm.toggleEntityViewSelection = toggleEntityViewSelection;
-
- vm.theEntityViews = {
- getItemAtIndex: function (index) {
- if (index > vm.entityViews.data.length) {
- vm.theEntityViews.fetchMoreItems_(index);
- return null;
- }
- var item = vm.entityViews.data[index];
- if (item) {
- item.indexNumber = index + 1;
- }
- return item;
- },
-
- getLength: function () {
- if (vm.entityViews.hasNext) {
- return vm.entityViews.data.length + vm.entityViews.nextPageLink.limit;
- } else {
- return vm.entityViews.data.length;
- }
- },
-
- fetchMoreItems_: function () {
- if (vm.entityViews.hasNext && !vm.entityViews.pending) {
- vm.entityViews.pending = true;
- entityViewService.getTenantEntityViews(vm.entityViews.nextPageLink, false).then(
- function success(entityViews) {
- vm.entityViews.data = vm.entityViews.data.concat(entityViews.data);
- vm.entityViews.nextPageLink = entityViews.nextPageLink;
- vm.entityViews.hasNext = entityViews.hasNext;
- if (vm.entityViews.hasNext) {
- vm.entityViews.nextPageLink.limit = vm.entityViews.pageSize;
- }
- vm.entityViews.pending = false;
- },
- function fail() {
- vm.entityViews.hasNext = false;
- vm.entityViews.pending = false;
- });
- }
- }
- };
-
- function cancel () {
- $mdDialog.cancel();
- }
-
- function assign() {
- var tasks = [];
- for (var entityViewId in vm.entityViews.selections) {
- tasks.push(entityViewService.assignEntityViewToCustomer(customerId, entityViewId));
- }
- $q.all(tasks).then(function () {
- $mdDialog.hide();
- });
- }
-
- function noData() {
- return vm.entityViews.data.length == 0 && !vm.entityViews.hasNext;
- }
-
- function hasData() {
- return vm.entityViews.data.length > 0;
- }
-
- function toggleEntityViewSelection($event, entityView) {
- $event.stopPropagation();
- var selected = angular.isDefined(entityView.selected) && entityView.selected;
- entityView.selected = !selected;
- if (entityView.selected) {
- vm.entityViews.selections[entityView.id.id] = true;
- vm.entityViews.selectedCount++;
- } else {
- delete vm.entityViews.selections[entityView.id.id];
- vm.entityViews.selectedCount--;
- }
- }
-
- function searchEntityViewTextUpdated() {
- vm.entityViews = {
- pageSize: vm.entityViews.pageSize,
- data: [],
- nextPageLink: {
- limit: vm.entityViews.pageSize,
- textSearch: vm.searchText
- },
- selections: {},
- selectedCount: 0,
- hasNext: true,
- pending: false
- };
- }
-
-}
diff --git a/ui/src/app/entity-view/add-entity-views-to-customer.tpl.html b/ui/src/app/entity-view/add-entity-views-to-customer.tpl.html
deleted file mode 100644
index ad3712d0f0..0000000000
--- a/ui/src/app/entity-view/add-entity-views-to-customer.tpl.html
+++ /dev/null
@@ -1,77 +0,0 @@
-
-
-
-
\ No newline at end of file
diff --git a/ui/src/app/entity-view/assign-to-customer.controller.js b/ui/src/app/entity-view/assign-to-customer.controller.js
deleted file mode 100644
index 51399d8e5e..0000000000
--- a/ui/src/app/entity-view/assign-to-customer.controller.js
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-/*@ngInject*/
-export default function AssignEntityViewToCustomerController(customerService, entityViewService, $mdDialog, $q, entityViewIds, customers) {
-
- var vm = this;
-
- vm.customers = customers;
- vm.searchText = '';
-
- vm.assign = assign;
- vm.cancel = cancel;
- vm.isCustomerSelected = isCustomerSelected;
- vm.hasData = hasData;
- vm.noData = noData;
- vm.searchCustomerTextUpdated = searchCustomerTextUpdated;
- vm.toggleCustomerSelection = toggleCustomerSelection;
-
- vm.theCustomers = {
- getItemAtIndex: function (index) {
- if (index > vm.customers.data.length) {
- vm.theCustomers.fetchMoreItems_(index);
- return null;
- }
- var item = vm.customers.data[index];
- if (item) {
- item.indexNumber = index + 1;
- }
- return item;
- },
-
- getLength: function () {
- if (vm.customers.hasNext) {
- return vm.customers.data.length + vm.customers.nextPageLink.limit;
- } else {
- return vm.customers.data.length;
- }
- },
-
- fetchMoreItems_: function () {
- if (vm.customers.hasNext && !vm.customers.pending) {
- vm.customers.pending = true;
- customerService.getCustomers(vm.customers.nextPageLink).then(
- function success(customers) {
- vm.customers.data = vm.customers.data.concat(customers.data);
- vm.customers.nextPageLink = customers.nextPageLink;
- vm.customers.hasNext = customers.hasNext;
- if (vm.customers.hasNext) {
- vm.customers.nextPageLink.limit = vm.customers.pageSize;
- }
- vm.customers.pending = false;
- },
- function fail() {
- vm.customers.hasNext = false;
- vm.customers.pending = false;
- });
- }
- }
- };
-
- function cancel() {
- $mdDialog.cancel();
- }
-
- function assign() {
- var tasks = [];
- for (var i=0; i < entityViewIds.length;i++) {
- tasks.push(entityViewService.assignEntityViewToCustomer(vm.customers.selection.id.id, entityViewIds[i]));
- }
- $q.all(tasks).then(function () {
- $mdDialog.hide();
- });
- }
-
- function noData() {
- return vm.customers.data.length == 0 && !vm.customers.hasNext;
- }
-
- function hasData() {
- return vm.customers.data.length > 0;
- }
-
- function toggleCustomerSelection($event, customer) {
- $event.stopPropagation();
- if (vm.isCustomerSelected(customer)) {
- vm.customers.selection = null;
- } else {
- vm.customers.selection = customer;
- }
- }
-
- function isCustomerSelected(customer) {
- return vm.customers.selection != null && customer &&
- customer.id.id === vm.customers.selection.id.id;
- }
-
- function searchCustomerTextUpdated() {
- vm.customers = {
- pageSize: vm.customers.pageSize,
- data: [],
- nextPageLink: {
- limit: vm.customers.pageSize,
- textSearch: vm.searchText
- },
- selection: null,
- hasNext: true,
- pending: false
- };
- }
-}
diff --git a/ui/src/app/entity-view/assign-to-customer.tpl.html b/ui/src/app/entity-view/assign-to-customer.tpl.html
deleted file mode 100644
index ac8e2b05af..0000000000
--- a/ui/src/app/entity-view/assign-to-customer.tpl.html
+++ /dev/null
@@ -1,76 +0,0 @@
-
-
-
-
\ No newline at end of file
diff --git a/ui/src/app/entity-view/entity-view-card.tpl.html b/ui/src/app/entity-view/entity-view-card.tpl.html
deleted file mode 100644
index b941a06c8e..0000000000
--- a/ui/src/app/entity-view/entity-view-card.tpl.html
+++ /dev/null
@@ -1,22 +0,0 @@
-
-
-
{{vm.item.type}}
-
{{vm.item.additionalInfo.description}}
-
{{'entity-view.assignedToCustomer' | translate}} '{{vm.item.assignedCustomer.title}}'
-
diff --git a/ui/src/app/entity-view/entity-view-fieldset.tpl.html b/ui/src/app/entity-view/entity-view-fieldset.tpl.html
deleted file mode 100644
index 6e6f5dc2cb..0000000000
--- a/ui/src/app/entity-view/entity-view-fieldset.tpl.html
+++ /dev/null
@@ -1,212 +0,0 @@
-
-{{ 'entity-view.make-public' | translate }}
-{{ 'entity-view.assign-to-customer' | translate }}
-{{'entity-view.unassign-from-customer' | translate }}
-{{ 'entity-view.delete' | translate }}
-
-
-
-
- entity-view.copyId
-
-
-
-
-
-
-
-
-
-
diff --git a/ui/src/app/entity-view/entity-view.controller.js b/ui/src/app/entity-view/entity-view.controller.js
deleted file mode 100644
index 58ccf8ff14..0000000000
--- a/ui/src/app/entity-view/entity-view.controller.js
+++ /dev/null
@@ -1,495 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-/* eslint-disable import/no-unresolved, import/default */
-
-import addEntityViewTemplate from './add-entity-view.tpl.html';
-import entityViewCard from './entity-view-card.tpl.html';
-import assignToCustomerTemplate from './assign-to-customer.tpl.html';
-import addEntityViewsToCustomerTemplate from './add-entity-views-to-customer.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-/*@ngInject*/
-export function EntityViewCardController(types) {
-
- var vm = this;
-
- vm.types = types;
-
- vm.isAssignedToCustomer = function() {
- if (vm.item && vm.item.customerId && vm.parentCtl.entityViewsScope === 'tenant' &&
- vm.item.customerId.id != vm.types.id.nullUid && !vm.item.assignedCustomer.isPublic) {
- return true;
- }
- return false;
- }
-
- vm.isPublic = function() {
- if (vm.item && vm.item.assignedCustomer && vm.parentCtl.entityViewsScope === 'tenant' && vm.item.assignedCustomer.isPublic) {
- return true;
- }
- return false;
- }
-}
-
-
-/*@ngInject*/
-export function EntityViewController($rootScope, userService, entityViewService, customerService, $state, $stateParams,
- $document, $mdDialog, $q, $translate, types) {
-
- var customerId = $stateParams.customerId;
-
- var entityViewActionsList = [];
-
- var entityViewGroupActionsList = [];
-
- var vm = this;
-
- vm.types = types;
-
- vm.entityViewGridConfig = {
- deleteItemTitleFunc: deleteEntityViewTitle,
- deleteItemContentFunc: deleteEntityViewText,
- deleteItemsTitleFunc: deleteEntityViewsTitle,
- deleteItemsActionTitleFunc: deleteEntityViewsActionTitle,
- deleteItemsContentFunc: deleteEntityViewsText,
-
- saveItemFunc: saveEntityView,
-
- getItemTitleFunc: getEntityViewTitle,
-
- itemCardController: 'EntityViewCardController',
- itemCardTemplateUrl: entityViewCard,
- parentCtl: vm,
-
- actionsList: entityViewActionsList,
- groupActionsList: entityViewGroupActionsList,
-
- onGridInited: gridInited,
-
- addItemTemplateUrl: addEntityViewTemplate,
-
- addItemText: function() { return $translate.instant('entity-view.add-entity-view-text') },
- noItemsText: function() { return $translate.instant('entity-view.no-entity-views-text') },
- itemDetailsText: function() { return $translate.instant('entity-view.entity-view-details') },
- isDetailsReadOnly: isCustomerUser,
- isSelectionEnabled: function () {
- return !isCustomerUser();
- }
- };
-
- if (angular.isDefined($stateParams.items) && $stateParams.items !== null) {
- vm.entityViewGridConfig.items = $stateParams.items;
- }
-
- if (angular.isDefined($stateParams.topIndex) && $stateParams.topIndex > 0) {
- vm.entityViewGridConfig.topIndex = $stateParams.topIndex;
- }
-
- vm.entityViewsScope = $state.$current.data.entityViewsType;
-
- vm.assignToCustomer = assignToCustomer;
- vm.makePublic = makePublic;
- vm.unassignFromCustomer = unassignFromCustomer;
-
- initController();
-
- function initController() {
- var fetchEntityViewsFunction = null;
- var deleteEntityViewFunction = null;
- var refreshEntityViewsParamsFunction = null;
-
- var user = userService.getCurrentUser();
-
- if (user.authority === 'CUSTOMER_USER') {
- vm.entityViewsScope = 'customer_user';
- customerId = user.customerId;
- }
- if (customerId) {
- vm.customerEntityViewsTitle = $translate.instant('customer.entity-views');
- customerService.getShortCustomerInfo(customerId).then(
- function success(info) {
- if (info.isPublic) {
- vm.customerEntityViewsTitle = $translate.instant('customer.public-entity-views');
- }
- }
- );
- }
-
- if (vm.entityViewsScope === 'tenant') {
- fetchEntityViewsFunction = function (pageLink, entityViewType) {
- return entityViewService.getTenantEntityViews(pageLink, true, null, entityViewType);
- };
- deleteEntityViewFunction = function (entityViewId) {
- return entityViewService.deleteEntityView(entityViewId);
- };
- refreshEntityViewsParamsFunction = function() {
- return {"topIndex": vm.topIndex};
- };
-
- entityViewActionsList.push({
- onAction: function ($event, item) {
- makePublic($event, item);
- },
- name: function() { return $translate.instant('action.share') },
- details: function() { return $translate.instant('entity-view.make-public') },
- icon: "share",
- isEnabled: function(entityView) {
- return entityView && (!entityView.customerId || entityView.customerId.id === types.id.nullUid);
- }
- });
-
- entityViewActionsList.push(
- {
- onAction: function ($event, item) {
- assignToCustomer($event, [ item.id.id ]);
- },
- name: function() { return $translate.instant('action.assign') },
- details: function() { return $translate.instant('entity-view.assign-to-customer') },
- icon: "assignment_ind",
- isEnabled: function(entityView) {
- return entityView && (!entityView.customerId || entityView.customerId.id === types.id.nullUid);
- }
- }
- );
-
- entityViewActionsList.push(
- {
- onAction: function ($event, item) {
- unassignFromCustomer($event, item, false);
- },
- name: function() { return $translate.instant('action.unassign') },
- details: function() { return $translate.instant('entity-view.unassign-from-customer') },
- icon: "assignment_return",
- isEnabled: function(entityView) {
- return entityView && entityView.customerId && entityView.customerId.id !== types.id.nullUid && !entityView.assignedCustomer.isPublic;
- }
- }
- );
-
- entityViewActionsList.push({
- onAction: function ($event, item) {
- unassignFromCustomer($event, item, true);
- },
- name: function() { return $translate.instant('action.make-private') },
- details: function() { return $translate.instant('entity-view.make-private') },
- icon: "reply",
- isEnabled: function(entityView) {
- return entityView && entityView.customerId && entityView.customerId.id !== types.id.nullUid && entityView.assignedCustomer.isPublic;
- }
- });
-
- entityViewActionsList.push(
- {
- onAction: function ($event, item) {
- vm.grid.deleteItem($event, item);
- },
- name: function() { return $translate.instant('action.delete') },
- details: function() { return $translate.instant('entity-view.delete') },
- icon: "delete"
- }
- );
-
- entityViewGroupActionsList.push(
- {
- onAction: function ($event, items) {
- assignEntityViewsToCustomer($event, items);
- },
- name: function() { return $translate.instant('entity-view.assign-entity-views') },
- details: function(selectedCount) {
- return $translate.instant('entity-view.assign-entity-views-text', {count: selectedCount}, "messageformat");
- },
- icon: "assignment_ind"
- }
- );
-
- entityViewGroupActionsList.push(
- {
- onAction: function ($event) {
- vm.grid.deleteItems($event);
- },
- name: function() { return $translate.instant('entity-view.delete-entity-views') },
- details: deleteEntityViewsActionTitle,
- icon: "delete"
- }
- );
-
-
-
- } else if (vm.entityViewsScope === 'customer' || vm.entityViewsScope === 'customer_user') {
- fetchEntityViewsFunction = function (pageLink, entityViewType) {
- return entityViewService.getCustomerEntityViews(customerId, pageLink, true, null, entityViewType);
- };
- deleteEntityViewFunction = function (entityViewId) {
- return entityViewService.unassignEntityViewFromCustomer(entityViewId);
- };
- refreshEntityViewsParamsFunction = function () {
- return {"customerId": customerId, "topIndex": vm.topIndex};
- };
-
- if (vm.entityViewsScope === 'customer') {
- entityViewActionsList.push(
- {
- onAction: function ($event, item) {
- unassignFromCustomer($event, item, false);
- },
- name: function() { return $translate.instant('action.unassign') },
- details: function() { return $translate.instant('entity-view.unassign-from-customer') },
- icon: "assignment_return",
- isEnabled: function(entityView) {
- return entityView && !entityView.assignedCustomer.isPublic;
- }
- }
- );
-
- entityViewGroupActionsList.push(
- {
- onAction: function ($event, items) {
- unassignEntityViewsFromCustomer($event, items);
- },
- name: function() { return $translate.instant('entity-view.unassign-entity-views') },
- details: function(selectedCount) {
- return $translate.instant('entity-view.unassign-entity-views-action-title', {count: selectedCount}, "messageformat");
- },
- icon: "assignment_return"
- }
- );
-
- vm.entityViewGridConfig.addItemAction = {
- onAction: function ($event) {
- addEntityViewsToCustomer($event);
- },
- name: function() { return $translate.instant('entity-view.assign-entity-views') },
- details: function() { return $translate.instant('entity-view.assign-new-entity-view') },
- icon: "add"
- };
-
-
- } else if (vm.entityViewsScope === 'customer_user') {
- vm.entityViewGridConfig.addItemAction = {};
- }
- }
-
- vm.entityViewGridConfig.refreshParamsFunc = refreshEntityViewsParamsFunction;
- vm.entityViewGridConfig.fetchItemsFunc = fetchEntityViewsFunction;
- vm.entityViewGridConfig.deleteItemFunc = deleteEntityViewFunction;
-
- }
-
- function deleteEntityViewTitle(entityView) {
- return $translate.instant('entity-view.delete-entity-view-title', {entityViewName: entityView.name});
- }
-
- function deleteEntityViewText() {
- return $translate.instant('entity-view.delete-entity-view-text');
- }
-
- function deleteEntityViewsTitle(selectedCount) {
- return $translate.instant('entity-view.delete-entity-views-title', {count: selectedCount}, 'messageformat');
- }
-
- function deleteEntityViewsActionTitle(selectedCount) {
- return $translate.instant('entity-view.delete-entity-views-action-title', {count: selectedCount}, 'messageformat');
- }
-
- function deleteEntityViewsText () {
- return $translate.instant('entity-view.delete-entity-views-text');
- }
-
- function gridInited(grid) {
- vm.grid = grid;
- }
-
- function getEntityViewTitle(entityView) {
- return entityView ? entityView.name : '';
- }
-
- function saveEntityView(entityView) {
- var deferred = $q.defer();
- entityViewService.saveEntityView(entityView).then(
- function success(savedEntityView) {
- $rootScope.$broadcast('entityViewSaved');
- var entityViews = [ savedEntityView ];
- customerService.applyAssignedCustomersInfo(entityViews).then(
- function success(items) {
- if (items && items.length == 1) {
- deferred.resolve(items[0]);
- } else {
- deferred.reject();
- }
- },
- function fail() {
- deferred.reject();
- }
- );
- },
- function fail() {
- deferred.reject();
- }
- );
- return deferred.promise;
- }
-
- function isCustomerUser() {
- return vm.entityViewsScope === 'customer_user';
- }
-
- function assignToCustomer($event, entityViewIds) {
- if ($event) {
- $event.stopPropagation();
- }
- var pageSize = 10;
- customerService.getCustomers({limit: pageSize, textSearch: ''}).then(
- function success(_customers) {
- var customers = {
- pageSize: pageSize,
- data: _customers.data,
- nextPageLink: _customers.nextPageLink,
- selection: null,
- hasNext: _customers.hasNext,
- pending: false
- };
- if (customers.hasNext) {
- customers.nextPageLink.limit = pageSize;
- }
- $mdDialog.show({
- controller: 'AssignEntityViewToCustomerController',
- controllerAs: 'vm',
- templateUrl: assignToCustomerTemplate,
- locals: {entityViewIds: entityViewIds, customers: customers},
- parent: angular.element($document[0].body),
- fullscreen: true,
- targetEvent: $event
- }).then(function () {
- vm.grid.refreshList();
- }, function () {
- });
- },
- function fail() {
- });
- }
-
- function addEntityViewsToCustomer($event) {
- if ($event) {
- $event.stopPropagation();
- }
- var pageSize = 10;
- entityViewService.getTenantEntityViews({limit: pageSize, textSearch: ''}, false).then(
- function success(_entityViews) {
- var entityViews = {
- pageSize: pageSize,
- data: _entityViews.data,
- nextPageLink: _entityViews.nextPageLink,
- selections: {},
- selectedCount: 0,
- hasNext: _entityViews.hasNext,
- pending: false
- };
- if (entityViews.hasNext) {
- entityViews.nextPageLink.limit = pageSize;
- }
- $mdDialog.show({
- controller: 'AddEntityViewsToCustomerController',
- controllerAs: 'vm',
- templateUrl: addEntityViewsToCustomerTemplate,
- locals: {customerId: customerId, entityViews: entityViews},
- parent: angular.element($document[0].body),
- fullscreen: true,
- targetEvent: $event
- }).then(function () {
- vm.grid.refreshList();
- }, function () {
- });
- },
- function fail() {
- });
- }
-
- function assignEntityViewsToCustomer($event, items) {
- var entityViewIds = [];
- for (var id in items.selections) {
- entityViewIds.push(id);
- }
- assignToCustomer($event, entityViewIds);
- }
-
- function unassignFromCustomer($event, entityView, isPublic) {
- if ($event) {
- $event.stopPropagation();
- }
- var title;
- var content;
- var label;
- if (isPublic) {
- title = $translate.instant('entity-view.make-private-entity-view-title', {entityViewName: entityView.name});
- content = $translate.instant('entity-view.make-private-entity-view-text');
- label = $translate.instant('entity-view.make-private');
- } else {
- title = $translate.instant('entity-view.unassign-entity-view-title', {entityViewName: entityView.name});
- content = $translate.instant('entity-view.unassign-entity-view-text');
- label = $translate.instant('entity-view.unassign-entity-view');
- }
- var confirm = $mdDialog.confirm()
- .targetEvent($event)
- .title(title)
- .htmlContent(content)
- .ariaLabel(label)
- .cancel($translate.instant('action.no'))
- .ok($translate.instant('action.yes'));
- $mdDialog.show(confirm).then(function () {
- entityViewService.unassignEntityViewFromCustomer(entityView.id.id).then(function success() {
- vm.grid.refreshList();
- });
- });
- }
-
- function unassignEntityViewsFromCustomer($event, items) {
- var confirm = $mdDialog.confirm()
- .targetEvent($event)
- .title($translate.instant('entity-view.unassign-entity-views-title', {count: items.selectedCount}, 'messageformat'))
- .htmlContent($translate.instant('entity-view.unassign-entity-views-text'))
- .ariaLabel($translate.instant('entity-view.unassign-entity-view'))
- .cancel($translate.instant('action.no'))
- .ok($translate.instant('action.yes'));
- $mdDialog.show(confirm).then(function () {
- var tasks = [];
- for (var id in items.selections) {
- tasks.push(entityViewService.unassignEntityViewFromCustomer(id));
- }
- $q.all(tasks).then(function () {
- vm.grid.refreshList();
- });
- });
- }
-
- function makePublic($event, entityView) {
- if ($event) {
- $event.stopPropagation();
- }
- var confirm = $mdDialog.confirm()
- .targetEvent($event)
- .title($translate.instant('entity-view.make-public-entity-view-title', {entityViewName: entityView.name}))
- .htmlContent($translate.instant('entity-view.make-public-entity-view-text'))
- .ariaLabel($translate.instant('entity-view.make-public'))
- .cancel($translate.instant('action.no'))
- .ok($translate.instant('action.yes'));
- $mdDialog.show(confirm).then(function () {
- entityViewService.makeEntityViewPublic(entityView.id.id).then(function success() {
- vm.grid.refreshList();
- });
- });
- }
-}
diff --git a/ui/src/app/entity-view/entity-view.directive.js b/ui/src/app/entity-view/entity-view.directive.js
deleted file mode 100644
index cf77489674..0000000000
--- a/ui/src/app/entity-view/entity-view.directive.js
+++ /dev/null
@@ -1,150 +0,0 @@
-/*
- * Copyright © 2016-2020 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 './entity-view.scss';
-
-/* eslint-disable import/no-unresolved, import/default */
-
-import entityViewFieldsetTemplate from './entity-view-fieldset.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-/*@ngInject*/
-export default function EntityViewDirective($q, $compile, $templateCache, $filter, toast, $translate, $mdConstant, $mdExpansionPanel,
- types, clipboardService, entityViewService, customerService, entityService) {
- var linker = function (scope, element) {
- var template = $templateCache.get(entityViewFieldsetTemplate);
- element.html(template);
-
- scope.attributesPanelId = (Math.random()*1000).toFixed(0);
- scope.timeseriesPanelId = (Math.random()*1000).toFixed(0);
- scope.$mdExpansionPanel = $mdExpansionPanel;
-
- scope.types = types;
- scope.isAssignedToCustomer = false;
- scope.isPublic = false;
- scope.assignedCustomer = null;
-
- scope.allowedEntityTypes = [types.entityType.device, types.entityType.asset];
-
- var semicolon = 186;
- scope.separatorKeys = [$mdConstant.KEY_CODE.ENTER, $mdConstant.KEY_CODE.COMMA, semicolon];
-
- scope.$watch('entityView', function(newVal) {
- if (newVal) {
- if (scope.entityView.customerId && scope.entityView.customerId.id !== types.id.nullUid) {
- scope.isAssignedToCustomer = true;
- customerService.getShortCustomerInfo(scope.entityView.customerId.id).then(
- function success(customer) {
- scope.assignedCustomer = customer;
- scope.isPublic = customer.isPublic;
- }
- );
- } else {
- scope.isAssignedToCustomer = false;
- scope.isPublic = false;
- scope.assignedCustomer = null;
- }
- if (scope.entityView.startTimeMs > 0) {
- scope.startTimeMs = new Date(scope.entityView.startTimeMs);
- } else {
- scope.startTimeMs = null;
- }
- if (scope.entityView.endTimeMs > 0) {
- scope.endTimeMs = new Date(scope.entityView.endTimeMs);
- } else {
- scope.endTimeMs = null;
- }
- if (!scope.entityView.keys) {
- scope.entityView.keys = {};
- scope.entityView.keys.timeseries = [];
- scope.entityView.keys.attributes = {};
- scope.entityView.keys.attributes.ss = [];
- scope.entityView.keys.attributes.cs = [];
- scope.entityView.keys.attributes.sh = [];
- }
- }
- });
-
- scope.dataKeysSearch = function (searchText, type) {
- var deferred = $q.defer();
- entityService.getEntityKeys(scope.entityView.entityId.entityType, scope.entityView.entityId.id, searchText, type, {ignoreLoading: true}).then(
- function success(keys) {
- deferred.resolve(keys);
- },
- function fail() {
- deferred.resolve([]);
- }
- );
- return deferred.promise;
-
- };
-
- scope.$watch('startTimeMs', function (newDate) {
- if (newDate) {
- if (newDate.getTime() > scope.maxStartTimeMs) {
- scope.startTimeMs = angular.copy(scope.maxStartTimeMs);
- }
- }
- updateMinMaxDates();
- });
-
- scope.$watch('endTimeMs', function (newDate) {
- if (newDate) {
- if (newDate.getTime() < scope.minEndTimeMs) {
- scope.endTimeMs = angular.copy(scope.minEndTimeMs);
- }
- }
- updateMinMaxDates();
- });
-
- function updateMinMaxDates() {
- if (scope.entityView) {
- if (scope.endTimeMs) {
- scope.maxStartTimeMs = angular.copy(new Date(scope.endTimeMs.getTime()));
- scope.entityView.endTimeMs = scope.endTimeMs.getTime();
- } else {
- scope.entityView.endTimeMs = 0;
- }
- if (scope.startTimeMs) {
- scope.minEndTimeMs = angular.copy(new Date(scope.startTimeMs.getTime()));
- scope.entityView.startTimeMs = scope.startTimeMs.getTime();
- } else {
- scope.entityView.startTimeMs = 0;
- }
- }
- }
-
- scope.onEntityViewIdCopied = function() {
- toast.showSuccess($translate.instant('entity-view.idCopiedMessage'), 750, angular.element(element).parent().parent(), 'bottom left');
- };
-
- $compile(element.contents())(scope);
- }
- return {
- restrict: "E",
- link: linker,
- scope: {
- entityView: '=',
- isEdit: '=',
- entityViewScope: '=',
- theForm: '=',
- onAssignToCustomer: '&',
- onMakePublic: '&',
- onUnassignFromCustomer: '&',
- onDeleteEntityView: '&'
- }
- };
-}
diff --git a/ui/src/app/entity-view/entity-view.routes.js b/ui/src/app/entity-view/entity-view.routes.js
deleted file mode 100644
index c55add94fa..0000000000
--- a/ui/src/app/entity-view/entity-view.routes.js
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-/* eslint-disable import/no-unresolved, import/default */
-
-import entityViewsTemplate from './entity-views.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-/*@ngInject*/
-export default function EntityViewRoutes($stateProvider, types) {
- $stateProvider
- .state('home.entityViews', {
- url: '/entityViews',
- params: {'topIndex': 0},
- module: 'private',
- auth: ['TENANT_ADMIN', 'CUSTOMER_USER'],
- views: {
- "content@home": {
- templateUrl: entityViewsTemplate,
- controller: 'EntityViewController',
- controllerAs: 'vm'
- }
- },
- data: {
- entityViewsType: 'tenant',
- searchEnabled: true,
- searchByEntitySubtype: true,
- searchEntityType: types.entityType.entityView,
- pageTitle: 'entity-view.entity-views'
- },
- ncyBreadcrumb: {
- label: '{"icon": "view_quilt", "label": "entity-view.entity-views"}'
- }
- })
- .state('home.customers.entityViews', {
- url: '/:customerId/entityViews',
- params: {'topIndex': 0},
- module: 'private',
- auth: ['TENANT_ADMIN'],
- views: {
- "content@home": {
- templateUrl: entityViewsTemplate,
- controllerAs: 'vm',
- controller: 'EntityViewController'
- }
- },
- data: {
- entityViewsType: 'customer',
- searchEnabled: true,
- searchByEntitySubtype: true,
- searchEntityType: types.entityType.entityView,
- pageTitle: 'customer.entity-views'
- },
- ncyBreadcrumb: {
- label: '{"icon": "view_quilt", "label": "{{ vm.customerEntityViewsTitle }}", "translate": "false"}'
- }
- });
-
-}
diff --git a/ui/src/app/entity-view/entity-view.scss b/ui/src/app/entity-view/entity-view.scss
deleted file mode 100644
index c74a5df5c3..0000000000
--- a/ui/src/app/entity-view/entity-view.scss
+++ /dev/null
@@ -1,46 +0,0 @@
-/**
- * Copyright © 2016-2020 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";
-
-.tb-entity-view-panel-group {
- .tb-panel-title {
- min-width: 90px;
- user-select: none;
-
- @media (min-width: $layout-breakpoint-sm) {
- min-width: 180px;
- }
- }
-
- .tb-panel-prompt {
- overflow: hidden;
- font-size: 14px;
- color: rgba(0, 0, 0, .87);
- text-overflow: ellipsis;
- white-space: nowrap;
- }
-
- &.disabled {
- .tb-panel-title,
- .tb-panel-prompt {
- color: rgba(0, 0, 0, .38);
- }
- }
-
- md-icon.md-expansion-panel-icon {
- margin-right: 0;
- }
-}
diff --git a/ui/src/app/entity-view/entity-views.tpl.html b/ui/src/app/entity-view/entity-views.tpl.html
deleted file mode 100644
index 8aecf26de8..0000000000
--- a/ui/src/app/entity-view/entity-views.tpl.html
+++ /dev/null
@@ -1,75 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/ui/src/app/entity-view/index.js b/ui/src/app/entity-view/index.js
deleted file mode 100644
index ee99a05eef..0000000000
--- a/ui/src/app/entity-view/index.js
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright © 2016-2020 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 uiRouter from 'angular-ui-router';
-import thingsboardGrid from '../components/grid.directive';
-import thingsboardApiUser from '../api/user.service';
-import thingsboardApiEntityView from '../api/entity-view.service';
-import thingsboardApiCustomer from '../api/customer.service';
-
-import EntityViewRoutes from './entity-view.routes';
-import {EntityViewController, EntityViewCardController} from './entity-view.controller';
-import AssignEntityViewToCustomerController from './assign-to-customer.controller';
-import AddEntityViewsToCustomerController from './add-entity-views-to-customer.controller';
-import EntityViewDirective from './entity-view.directive';
-
-export default angular.module('thingsboard.entityView', [
- uiRouter,
- thingsboardGrid,
- thingsboardApiUser,
- thingsboardApiEntityView,
- thingsboardApiCustomer
-])
- .config(EntityViewRoutes)
- .controller('EntityViewController', EntityViewController)
- .controller('EntityViewCardController', EntityViewCardController)
- .controller('AssignEntityViewToCustomerController', AssignEntityViewToCustomerController)
- .controller('AddEntityViewsToCustomerController', AddEntityViewsToCustomerController)
- .directive('tbEntityView', EntityViewDirective)
- .name;
diff --git a/ui/src/app/entity/alias/aliases-entity-select-button.tpl.html b/ui/src/app/entity/alias/aliases-entity-select-button.tpl.html
deleted file mode 100644
index 5a0ce41cd5..0000000000
--- a/ui/src/app/entity/alias/aliases-entity-select-button.tpl.html
+++ /dev/null
@@ -1,31 +0,0 @@
-
-
-
-
- {{ 'entity.select-entities' | translate }}
-
- devices_other
-
-
-
- {{ 'entity.select-entities' | translate }}
-
- {{displayValue}}
-
-
diff --git a/ui/src/app/entity/alias/aliases-entity-select-panel.controller.js b/ui/src/app/entity/alias/aliases-entity-select-panel.controller.js
deleted file mode 100644
index ae50195b67..0000000000
--- a/ui/src/app/entity/alias/aliases-entity-select-panel.controller.js
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-/*@ngInject*/
-export default function AliasesEntitySelectPanelController(mdPanelRef, $scope, $filter, types, aliasController, onEntityAliasesUpdate) {
-
- var vm = this;
- vm._mdPanelRef = mdPanelRef;
- vm.aliasController = aliasController;
- vm.onEntityAliasesUpdate = onEntityAliasesUpdate;
- vm.entityAliases = {};
- vm.entityAliasesInfo = {};
-
- vm.currentAliasEntityChanged = currentAliasEntityChanged;
-
- var allEntityAliases = vm.aliasController.getEntityAliases();
- for (var aliasId in allEntityAliases) {
- var aliasInfo = vm.aliasController.getInstantAliasInfo(aliasId);
- if (aliasInfo && !aliasInfo.resolveMultiple && aliasInfo.currentEntity
- && aliasInfo.resolvedEntities.length > 1) {
- vm.entityAliasesInfo[aliasId] = angular.copy(aliasInfo);
- vm.entityAliasesInfo[aliasId].selectedId = aliasInfo.currentEntity.id;
- }
- }
-
- function currentAliasEntityChanged(aliasId, selectedId) {
- var resolvedEntities = vm.entityAliasesInfo[aliasId].resolvedEntities;
- var selected = $filter('filter')(resolvedEntities, {id: selectedId});
- if (selected && selected.length) {
- vm.aliasController.updateCurrentAliasEntity(aliasId, selected[0]);
- if (onEntityAliasesUpdate) {
- onEntityAliasesUpdate();
- }
- }
- }
-
-}
diff --git a/ui/src/app/entity/alias/aliases-entity-select-panel.tpl.html b/ui/src/app/entity/alias/aliases-entity-select-panel.tpl.html
deleted file mode 100644
index a0d24bf70f..0000000000
--- a/ui/src/app/entity/alias/aliases-entity-select-panel.tpl.html
+++ /dev/null
@@ -1,33 +0,0 @@
-
-
-
-
-
-
-
-
-
- {{resolvedEntity.name}}
-
-
-
-
-
-
-
diff --git a/ui/src/app/entity/alias/aliases-entity-select.directive.js b/ui/src/app/entity/alias/aliases-entity-select.directive.js
deleted file mode 100644
index 94e35b0f2d..0000000000
--- a/ui/src/app/entity/alias/aliases-entity-select.directive.js
+++ /dev/null
@@ -1,149 +0,0 @@
-/*
- * Copyright © 2016-2020 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 './aliases-entity-select.scss';
-
-import $ from 'jquery';
-
-/* eslint-disable import/no-unresolved, import/default */
-
-import aliasesEntitySelectButtonTemplate from './aliases-entity-select-button.tpl.html';
-import aliasesEntitySelectPanelTemplate from './aliases-entity-select-panel.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-/* eslint-disable angular/angularelement */
-/*@ngInject*/
-export default function AliasesEntitySelectDirective($compile, $templateCache, $mdMedia, types, $mdPanel, $document, $translate) {
-
- var linker = function (scope, element, attrs) {
-
- /* tbAliasesEntitySelect (ng-model)
- * {
- * "aliasId": {
- * alias: alias,
- * entityType: entityType,
- * entityId: entityId
- * }
- * }
- */
-
- var template = $templateCache.get(aliasesEntitySelectButtonTemplate);
-
- scope.tooltipDirection = angular.isDefined(attrs.tooltipDirection) ? attrs.tooltipDirection : 'top';
-
- element.html(template);
-
- scope.openEditMode = function (event) {
- if (scope.disabled) {
- return;
- }
- var position;
- var panelHeight = $mdMedia('min-height: 350px') ? 250 : 150;
- var panelWidth = 300;
- var offset = element[0].getBoundingClientRect();
- var bottomY = offset.bottom - $(window).scrollTop(); //eslint-disable-line
- var leftX = offset.left - $(window).scrollLeft(); //eslint-disable-line
- var yPosition;
- var xPosition;
- if (bottomY + panelHeight > $( window ).height()) { //eslint-disable-line
- yPosition = $mdPanel.yPosition.ABOVE;
- } else {
- yPosition = $mdPanel.yPosition.BELOW;
- }
- if (leftX + panelWidth > $( window ).width()) { //eslint-disable-line
- xPosition = $mdPanel.xPosition.CENTER;
- } else {
- xPosition = $mdPanel.xPosition.ALIGN_START;
- }
- position = $mdPanel.newPanelPosition()
- .relativeTo(element)
- .addPanelPosition(xPosition, yPosition);
- var config = {
- attachTo: angular.element($document[0].body),
- controller: 'AliasesEntitySelectPanelController',
- controllerAs: 'vm',
- templateUrl: aliasesEntitySelectPanelTemplate,
- panelClass: 'tb-aliases-entity-select-panel',
- position: position,
- fullscreen: false,
- locals: {
- 'aliasController': scope.aliasController,
- 'onEntityAliasesUpdate': function () {
- scope.updateView();
- }
- },
- openFrom: event,
- clickOutsideToClose: true,
- escapeToClose: true,
- focusOnOpen: false
- };
- $mdPanel.open(config);
- }
-
- scope.$on('entityAliasesChanged', function() {
- scope.updateView();
- });
-
- scope.$on('entityAliasResolved', function() {
- scope.updateView();
- });
-
- scope.updateView = function () {
- updateDisplayValue();
- }
-
- function updateDisplayValue() {
- var displayValue;
- var singleValue = true;
- var currentAliasId;
- var entityAliases = scope.aliasController.getEntityAliases();
- for (var aliasId in entityAliases) {
- var entityAlias = entityAliases[aliasId];
- if (!entityAlias.filter.resolveMultiple) {
- var resolvedAlias = scope.aliasController.getInstantAliasInfo(aliasId);
- if (resolvedAlias && resolvedAlias.currentEntity) {
- if (!currentAliasId) {
- currentAliasId = aliasId;
- } else {
- singleValue = false;
- break;
- }
- }
- }
- }
- if (singleValue && currentAliasId) {
- var aliasInfo = scope.aliasController.getInstantAliasInfo(currentAliasId);
- displayValue = aliasInfo.currentEntity.name;
- } else {
- displayValue = $translate.instant('entity.entities');
- }
- scope.displayValue = displayValue;
- }
-
- $compile(element.contents())(scope);
- }
-
- return {
- restrict: "E",
- scope: {
- aliasController:'='
- },
- link: linker
- };
-
-}
-
-/* eslint-enable angular/angularelement */
\ No newline at end of file
diff --git a/ui/src/app/entity/alias/aliases-entity-select.scss b/ui/src/app/entity/alias/aliases-entity-select.scss
deleted file mode 100644
index 16e1c49028..0000000000
--- a/ui/src/app/entity/alias/aliases-entity-select.scss
+++ /dev/null
@@ -1,65 +0,0 @@
-/**
- * Copyright © 2016-2020 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";
-
-tb-aliases-entity-select {
- min-width: 52px;
-}
-
-.md-panel {
- &.tb-aliases-entity-select-panel {
- position: absolute;
- }
-}
-
-.tb-aliases-entity-select-panel {
- min-width: 300px;
- max-height: 150px;
- overflow-x: hidden;
- overflow-y: auto;
- background: #fff;
- border-radius: 4px;
- box-shadow:
- 0 7px 8px -4px rgba(0, 0, 0, .2),
- 0 13px 19px 2px rgba(0, 0, 0, .14),
- 0 5px 24px 4px rgba(0, 0, 0, .12);
-
- @media (min-height: 350px) {
- max-height: 250px;
- }
-
- md-content {
- background-color: #fff;
- }
-}
-
-section.tb-aliases-entity-select {
- min-height: 32px;
- padding: 0 6px;
-
- @media (max-width: $layout-breakpoint-sm) {
- padding: 0;
- }
-
- span {
- max-width: 200px;
- overflow: hidden;
- text-overflow: ellipsis;
- white-space: nowrap;
- pointer-events: all;
- cursor: pointer;
- }
-}
diff --git a/ui/src/app/entity/alias/entity-alias-dialog.controller.js b/ui/src/app/entity/alias/entity-alias-dialog.controller.js
deleted file mode 100644
index a753785a74..0000000000
--- a/ui/src/app/entity/alias/entity-alias-dialog.controller.js
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * Copyright © 2016-2020 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 './entity-alias-dialog.scss';
-
-/*@ngInject*/
-export default function EntityAliasDialogController($scope, $mdDialog, $q, $filter, utils, entityService, types, isAdd, allowedEntityTypes, entityAliases, alias) {
-
- var vm = this;
-
- vm.types = types;
- vm.isAdd = isAdd;
- vm.allowedEntityTypes = allowedEntityTypes;
- if (angular.isArray(entityAliases)) {
- vm.entityAliases = entityAliases;
- } else {
- vm.entityAliases = [];
- for (var aliasId in entityAliases) {
- vm.entityAliases.push(entityAliases[aliasId]);
- }
- }
- if (vm.isAdd && !alias) {
- vm.alias = {
- alias: '',
- filter: {
- resolveMultiple: false
- }
- };
- } else {
- vm.alias = alias;
- }
-
- vm.cancel = cancel;
- vm.save = save;
-
- $scope.$watch('vm.alias.alias', function (newAlias) {
- if (newAlias) {
- var valid = true;
- var result = $filter('filter')(vm.entityAliases, {alias: newAlias}, true);
- if (result && result.length) {
- if (vm.isAdd || vm.alias.id != result[0].id) {
- valid = false;
- }
- }
- $scope.theForm.aliasName.$setValidity('duplicateAliasName', valid);
- }
- });
-
- $scope.$watch('theForm.$pristine', function() {
- if ($scope.theForm && !$scope.theForm.$pristine) {
- $scope.theForm.$setValidity('entityFilter', true);
- }
- });
-
- function validate() {
- var deferred = $q.defer();
- var validationResult = {
- entity: null,
- stateEntity: false
- }
- entityService.resolveAliasFilter(vm.alias.filter, null, 1, true).then(
- function success(result) {
- validationResult.stateEntity = result.stateEntity;
- var entities = result.entities;
- if (entities.length) {
- validationResult.entity = entities[0];
- }
- deferred.resolve(validationResult);
- },
- function fail() {
- deferred.reject();
- }
- );
- return deferred.promise;
- }
-
- function cancel() {
- $mdDialog.cancel();
- }
-
- function save() {
- $scope.theForm.$setPristine();
- validate().then(
- function success() {
- if (vm.isAdd) {
- vm.alias.id = utils.guid();
- }
- $mdDialog.hide(vm.alias);
- },
- function fail() {
- $scope.theForm.$setValidity('entityFilter', false);
- }
- )
- }
-
-}
diff --git a/ui/src/app/entity/alias/entity-alias-dialog.scss b/ui/src/app/entity/alias/entity-alias-dialog.scss
deleted file mode 100644
index 35e71a7060..0000000000
--- a/ui/src/app/entity/alias/entity-alias-dialog.scss
+++ /dev/null
@@ -1,28 +0,0 @@
-/**
- * Copyright © 2016-2020 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-entity-alias-dialog {
- .tb-resolve-multiple-switch {
- padding-left: 10px;
-
- .resolve-multiple-switch {
- margin: 0;
- }
-
- .resolve-multiple-label {
- margin: 5px 0;
- }
- }
-}
diff --git a/ui/src/app/entity/alias/entity-alias-dialog.tpl.html b/ui/src/app/entity/alias/entity-alias-dialog.tpl.html
deleted file mode 100644
index 83493c6621..0000000000
--- a/ui/src/app/entity/alias/entity-alias-dialog.tpl.html
+++ /dev/null
@@ -1,73 +0,0 @@
-
-
-
-
diff --git a/ui/src/app/entity/alias/entity-aliases.controller.js b/ui/src/app/entity/alias/entity-aliases.controller.js
deleted file mode 100644
index c514e79ad7..0000000000
--- a/ui/src/app/entity/alias/entity-aliases.controller.js
+++ /dev/null
@@ -1,211 +0,0 @@
-/*
- * Copyright © 2016-2020 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 './entity-aliases.scss';
-
-/* eslint-disable import/no-unresolved, import/default */
-
-import entityAliasDialogTemplate from './entity-alias-dialog.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-/*@ngInject*/
-export default function EntityAliasesController(utils, entityService, toast, $scope, $mdDialog, $document, $q, $translate,
- types, config) {
-
- var vm = this;
-
- vm.types = types;
- vm.entityAliases = [];
- vm.title = config.customTitle ? config.customTitle : 'entity.aliases';
- vm.disableAdd = config.disableAdd;
- vm.aliasToWidgetsMap = {};
- vm.allowedEntityTypes = config.allowedEntityTypes;
-
- vm.addAlias = addAlias;
- vm.editAlias = editAlias;
- vm.removeAlias = removeAlias;
-
- vm.cancel = cancel;
- vm.save = save;
-
- initController();
-
- function initController() {
- var aliasId;
- if (config.widgets) {
- var widgetsTitleList, widget;
- if (config.isSingleWidget && config.widgets.length == 1) {
- widget = config.widgets[0];
- widgetsTitleList = [widget.config.title];
- for (aliasId in config.entityAliases) {
- vm.aliasToWidgetsMap[aliasId] = widgetsTitleList;
- }
- } else {
- for (var w in config.widgets) {
- widget = config.widgets[w];
- if (widget.type === types.widgetType.rpc.value) {
- if (widget.config.targetDeviceAliasIds && widget.config.targetDeviceAliasIds.length > 0) {
- var targetDeviceAliasId = widget.config.targetDeviceAliasIds[0];
- widgetsTitleList = vm.aliasToWidgetsMap[targetDeviceAliasId];
- if (!widgetsTitleList) {
- widgetsTitleList = [];
- vm.aliasToWidgetsMap[targetDeviceAliasId] = widgetsTitleList;
- }
- widgetsTitleList.push(widget.config.title);
- }
- } else {
- var datasources = utils.validateDatasources(widget.config.datasources);
- for (var i=0;i -1) {
- var widgetsTitleList = vm.aliasToWidgetsMap[entityAlias.id];
- if (widgetsTitleList) {
- var widgetsListHtml = '';
- for (var t in widgetsTitleList) {
- widgetsListHtml += '
\'' + widgetsTitleList[t] + '\'';
- }
- var alert = $mdDialog.alert()
- .parent(angular.element($document[0].body))
- .clickOutsideToClose(true)
- .title($translate.instant('entity.unable-delete-entity-alias-title'))
- .htmlContent($translate.instant('entity.unable-delete-entity-alias-text', {entityAlias: entityAlias.alias, widgetsList: widgetsListHtml}))
- .ariaLabel($translate.instant('entity.unable-delete-entity-alias-title'))
- .ok($translate.instant('action.close'))
- .targetEvent($event);
- alert._options.multiple = true;
- alert._options.fullscreen = true;
-
- $mdDialog.show(alert);
- } else {
- vm.entityAliases.splice(index, 1);
- if ($scope.theForm) {
- $scope.theForm.$setDirty();
- }
- }
- }
- }
-
- function cancel() {
- $mdDialog.cancel();
- }
-
- function save() {
-
- var entityAliases = {};
- var uniqueAliasList = {};
-
- var valid = true;
- var message, aliasId, alias, filter;
-
- for (var i = 0; i < vm.entityAliases.length; i++) {
- aliasId = vm.entityAliases[i].id;
- alias = vm.entityAliases[i].alias;
- filter = vm.entityAliases[i].filter;
- if (uniqueAliasList[alias]) {
- valid = false;
- message = $translate.instant('entity.duplicate-alias-error', {alias: alias});
- break;
- } else if (!filter || !filter.type) {
- valid = false;
- message = $translate.instant('entity.missing-entity-filter-error', {alias: alias});
- break;
- } else {
- uniqueAliasList[alias] = alias;
- entityAliases[aliasId] = {id: aliasId, alias: alias, filter: filter};
- }
- }
- if (valid) {
- $scope.theForm.$setPristine();
- $mdDialog.hide(entityAliases);
- } else {
- toast.showError(message);
- }
- }
-
-}
diff --git a/ui/src/app/entity/alias/entity-aliases.scss b/ui/src/app/entity/alias/entity-aliases.scss
deleted file mode 100644
index 140ac1b720..0000000000
--- a/ui/src/app/entity/alias/entity-aliases.scss
+++ /dev/null
@@ -1,55 +0,0 @@
-/**
- * Copyright © 2016-2020 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-aliases-dialog {
- .md-dialog-content {
- padding-top: 0;
- padding-bottom: 0;
- }
-
- .tb-aliases-header {
- min-height: 40px;
- padding: 0 34px 0 34px;
- margin: 5px;
-
- .tb-header-label {
- font-size: 14px;
- color: rgba(0, 0, 0, .570588);
- }
- }
-
- .tb-alias {
- padding: 0 0 0 10px;
- margin: 5px;
-
- md-input-container {
- margin: 0;
- }
-
- .tb-resolve-multiple-switch {
- padding-left: 10px;
-
- .resolve-multiple-switch {
- margin: 0;
- }
- }
-
- .md-button {
- &.md-icon-button {
- margin: 0;
- }
- }
- }
-}
diff --git a/ui/src/app/entity/alias/entity-aliases.tpl.html b/ui/src/app/entity/alias/entity-aliases.tpl.html
deleted file mode 100644
index 44b2ef1a1f..0000000000
--- a/ui/src/app/entity/alias/entity-aliases.tpl.html
+++ /dev/null
@@ -1,105 +0,0 @@
-
-
-
-
\ No newline at end of file
diff --git a/ui/src/app/entity/attribute/add-attribute-dialog.controller.js b/ui/src/app/entity/attribute/add-attribute-dialog.controller.js
deleted file mode 100644
index e1c711ba66..0000000000
--- a/ui/src/app/entity/attribute/add-attribute-dialog.controller.js
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-/* eslint-disable import/no-unresolved, import/default */
-
-import attributeDialogEditJsonTemplate from './attribute-dialog-edit-json.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-import AttributeDialogEditJsonController from './attribute-dialog-edit-json.controller';
-
-/*@ngInject*/
-export default function AddAttributeDialogController($scope, $mdDialog, types, attributeService, entityType, entityId, attributeScope) {
-
- let vm = this;
-
- vm.attribute = {};
-
- vm.valueTypes = types.valueType;
-
- vm.valueType = types.valueType.string;
-
- vm.add = add;
- vm.cancel = cancel;
-
- function cancel() {
- $mdDialog.cancel();
- }
-
- function add() {
- $scope.theForm.$setPristine();
- attributeService.saveEntityAttributes(entityType, entityId, attributeScope, [vm.attribute]).then(
- function success() {
- $mdDialog.hide();
- }
- );
- }
-
- $scope.$watch('vm.valueType', function () {
- if (vm.valueType === types.valueType.boolean) {
- vm.attribute.value = false;
- } else if (vm.valueType === types.valueType.json) {
- vm.attribute.value = {};
- } else {
- vm.attribute.value = null;
- }
- });
-
- vm.addJSON = ($event) => {
- showJsonDialog($event, vm.attribute.value, false).then((response) => {
- vm.attribute.value = response;
- })
- };
-
- function showJsonDialog($event, jsonValue, readOnly) {
- if ($event) {
- $event.stopPropagation();
- }
- return $mdDialog.show({
- controller: AttributeDialogEditJsonController,
- controllerAs: 'vm',
- templateUrl: attributeDialogEditJsonTemplate,
- locals: {
- jsonValue: jsonValue,
- readOnly: readOnly
- },
- targetEvent: $event,
- fullscreen: true,
- multiple: true,
- });
- }
-}
diff --git a/ui/src/app/entity/attribute/add-attribute-dialog.tpl.html b/ui/src/app/entity/attribute/add-attribute-dialog.tpl.html
deleted file mode 100644
index 6520d7a541..0000000000
--- a/ui/src/app/entity/attribute/add-attribute-dialog.tpl.html
+++ /dev/null
@@ -1,117 +0,0 @@
-
-
-
-
diff --git a/ui/src/app/entity/attribute/add-widget-to-dashboard-dialog.controller.js b/ui/src/app/entity/attribute/add-widget-to-dashboard-dialog.controller.js
deleted file mode 100644
index 076bee89d5..0000000000
--- a/ui/src/app/entity/attribute/add-widget-to-dashboard-dialog.controller.js
+++ /dev/null
@@ -1,154 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-/* eslint-disable import/no-unresolved, import/default */
-
-import selectTargetStateTemplate from '../../dashboard/states/select-target-state.tpl.html';
-import selectTargetLayoutTemplate from '../../dashboard/layouts/select-target-layout.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-/*@ngInject*/
-export default function AddWidgetToDashboardDialogController($scope, $mdDialog, $state, $q, $document, dashboardUtils,
- utils, types, itembuffer, dashboardService, entityId, entityType, entityName, widget) {
-
- var vm = this;
-
- vm.widget = widget;
- vm.dashboardId = null;
- vm.addToDashboardType = 0;
- vm.newDashboard = {};
- vm.openDashboard = false;
-
- vm.add = add;
- vm.cancel = cancel;
-
- function cancel() {
- $mdDialog.cancel();
- }
-
- function selectTargetState($event, dashboard) {
- var deferred = $q.defer();
- var states = dashboard.configuration.states;
- var stateIds = Object.keys(states);
- if (stateIds.length > 1) {
- $mdDialog.show({
- controller: 'SelectTargetStateController',
- controllerAs: 'vm',
- templateUrl: selectTargetStateTemplate,
- parent: angular.element($document[0].body),
- locals: {
- states: states
- },
- fullscreen: true,
- multiple: true,
- targetEvent: $event
- }).then(
- function success(stateId) {
- deferred.resolve(stateId);
- },
- function fail() {
- deferred.reject();
- }
- );
-
- } else {
- deferred.resolve(stateIds[0]);
- }
- return deferred.promise;
- }
-
- function selectTargetLayout($event, dashboard, targetState) {
- var deferred = $q.defer();
- var layouts = dashboard.configuration.states[targetState].layouts;
- var layoutIds = Object.keys(layouts);
- if (layoutIds.length > 1) {
- $mdDialog.show({
- controller: 'SelectTargetLayoutController',
- controllerAs: 'vm',
- templateUrl: selectTargetLayoutTemplate,
- parent: angular.element($document[0].body),
- fullscreen: true,
- multiple: true,
- targetEvent: $event
- }).then(
- function success(layoutId) {
- deferred.resolve(layoutId);
- },
- function fail() {
- deferred.reject();
- }
- );
- } else {
- deferred.resolve(layoutIds[0]);
- }
- return deferred.promise;
- }
-
- function add($event) {
- if (vm.addToDashboardType === 0) {
- dashboardService.getDashboard(vm.dashboardId).then(
- function success(dashboard) {
- dashboard = dashboardUtils.validateAndUpdateDashboard(dashboard);
- selectTargetState($event, dashboard).then(
- function(targetState) {
- selectTargetLayout($event, dashboard, targetState).then(
- function(targetLayout) {
- addWidgetToDashboard(dashboard, targetState, targetLayout);
- }
- );
- }
- );
- },
- function fail() {}
- );
- } else {
- addWidgetToDashboard(vm.newDashboard, 'default', 'main');
- }
-
- }
-
- function addWidgetToDashboard(theDashboard, targetState, targetLayout) {
- var aliasesInfo = {
- datasourceAliases: {},
- targetDeviceAliases: {}
- };
- aliasesInfo.datasourceAliases[0] = {
- alias: entityName,
- filter: dashboardUtils.createSingleEntityFilter(entityType, entityId)
- };
- itembuffer.addWidgetToDashboard(theDashboard, targetState, targetLayout, vm.widget, aliasesInfo, null, 48, null, -1, -1).then(
- function(theDashboard) {
- dashboardService.saveDashboard(theDashboard).then(
- function success(dashboard) {
- $scope.theForm.$setPristine();
- $mdDialog.hide();
- if (vm.openDashboard) {
- var stateParams = {
- dashboardId: dashboard.id.id
- }
- var stateIds = Object.keys(dashboard.configuration.states);
- var stateIndex = stateIds.indexOf(targetState);
- if (stateIndex > 0) {
- stateParams.state = utils.objToBase64([ {id: targetState, params: {}} ]);
- }
- $state.go('home.dashboards.dashboard', stateParams);
- }
- }
- );
- }
- );
- }
-}
diff --git a/ui/src/app/entity/attribute/add-widget-to-dashboard-dialog.tpl.html b/ui/src/app/entity/attribute/add-widget-to-dashboard-dialog.tpl.html
deleted file mode 100644
index b6c1746b41..0000000000
--- a/ui/src/app/entity/attribute/add-widget-to-dashboard-dialog.tpl.html
+++ /dev/null
@@ -1,83 +0,0 @@
-
-
-
-
diff --git a/ui/src/app/entity/attribute/attribute-dialog-edit-json.controller.js b/ui/src/app/entity/attribute/attribute-dialog-edit-json.controller.js
deleted file mode 100644
index e53d168a68..0000000000
--- a/ui/src/app/entity/attribute/attribute-dialog-edit-json.controller.js
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-/* eslint-enable import/no-unresolved, import/default */
-
-import './attribute-dialog-edit-json.scss';
-
-/*@ngInject*/
-export default function AttributeDialogEditJsonController($mdDialog, types, jsonValue, readOnly) {
-
- let vm = this;
- vm.json = angular.toJson(jsonValue, 4);
- vm.readOnly = readOnly;
- vm.contentType = types.contentType.JSON.value;
-
- vm.save = () => {
- $mdDialog.hide(angular.fromJson(vm.json));
- };
-
- vm.cancel = () => {
- $mdDialog.cancel();
- };
-}
diff --git a/ui/src/app/entity/attribute/attribute-dialog-edit-json.scss b/ui/src/app/entity/attribute/attribute-dialog-edit-json.scss
deleted file mode 100644
index 84219ac11a..0000000000
--- a/ui/src/app/entity/attribute/attribute-dialog-edit-json.scss
+++ /dev/null
@@ -1,24 +0,0 @@
-/**
- * Copyright © 2016-2020 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.
- */
-.attribute-edit-json-dialog{
- min-width: 400px;
-}
-
-@media (max-width: 425px){
- .attribute-edit-json-dialog {
- min-width: 200px;
- }
-}
diff --git a/ui/src/app/entity/attribute/attribute-dialog-edit-json.tpl.html b/ui/src/app/entity/attribute/attribute-dialog-edit-json.tpl.html
deleted file mode 100644
index 1c801edc10..0000000000
--- a/ui/src/app/entity/attribute/attribute-dialog-edit-json.tpl.html
+++ /dev/null
@@ -1,54 +0,0 @@
-
-
-
-
diff --git a/ui/src/app/entity/attribute/attribute-table.directive.js b/ui/src/app/entity/attribute/attribute-table.directive.js
deleted file mode 100644
index 59ea4fe91d..0000000000
--- a/ui/src/app/entity/attribute/attribute-table.directive.js
+++ /dev/null
@@ -1,462 +0,0 @@
-/*
- * Copyright © 2016-2020 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 'angular-material-data-table/dist/md-data-table.min.css';
-import './attribute-table.scss';
-
-/* eslint-disable import/no-unresolved, import/default */
-
-import attributeTableTemplate from './attribute-table.tpl.html';
-import addAttributeDialogTemplate from './add-attribute-dialog.tpl.html';
-import addWidgetToDashboardDialogTemplate from './add-widget-to-dashboard-dialog.tpl.html';
-import editAttributeValueTemplate from './edit-attribute-value.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-import EditAttributeValueController from './edit-attribute-value.controller';
-import AliasController from '../../api/alias-controller';
-
-/*@ngInject*/
-export default function AttributeTableDirective($compile, $templateCache, $rootScope, $q, $mdEditDialog, $mdDialog,
- $mdUtil, $document, $translate, $filter, $timeout, utils, types, dashboardUtils,
- entityService, attributeService, widgetService) {
-
- var linker = function (scope, element, attrs) {
-
- var template = $templateCache.get(attributeTableTemplate);
-
- element.html(template);
-
- var getAttributeScopeByValue = function (attributeScopeValue) {
- if (scope.types.latestTelemetry.value === attributeScopeValue) {
- return scope.types.latestTelemetry;
- }
- for (var attrScope in scope.attributeScopes) {
- if (scope.attributeScopes[attrScope].value === attributeScopeValue) {
- return scope.attributeScopes[attrScope];
- }
- }
- };
-
- scope.types = types;
-
- scope.entityType = attrs.entityType;
-
- if (scope.entityType === types.entityType.device || scope.entityType === types.entityType.entityView) {
- scope.attributeScopes = types.attributesScope;
- scope.attributeScopeSelectionReadonly = false;
- } else {
- scope.attributeScopes = {};
- scope.attributeScopes.server = types.attributesScope.server;
- scope.attributeScopeSelectionReadonly = true;
- }
-
- scope.attributeScope = getAttributeScopeByValue(attrs.defaultAttributeScope);
-
- if (scope.entityType != types.entityType.device) {
- if (scope.attributeScope != types.latestTelemetry) {
- scope.attributeScope = scope.attributeScopes.server;
- }
- }
-
- scope.attributes = {
- count: 0,
- data: []
- };
-
- scope.selectedAttributes = [];
- scope.mode = 'default'; // 'widget'
- scope.subscriptionId = null;
-
- scope.query = {
- order: 'key',
- limit: 5,
- page: 1,
- search: null
- };
-
- scope.$watch("entityId", function (newVal) {
- if (newVal) {
- scope.resetFilter();
- scope.getEntityAttributes(false, true);
- }
- });
-
- scope.$watch("attributeScope", function (newVal, prevVal) {
- if (newVal && !angular.equals(newVal, prevVal)) {
- scope.mode = 'default';
- scope.query.search = null;
- scope.selectedAttributes = [];
- scope.getEntityAttributes(false, true);
- }
- });
-
- scope.resetFilter = function () {
- scope.mode = 'default';
- scope.query.search = null;
- scope.selectedAttributes = [];
- scope.attributeScope = getAttributeScopeByValue(attrs.defaultAttributeScope);
- };
-
- scope.enterFilterMode = function (event) {
- let $button = angular.element(event.currentTarget);
- let $toolbarsContainer = $button.closest('.toolbarsContainer');
-
- scope.query.search = '';
-
- $timeout(() => {
- $toolbarsContainer.find('.searchInput').focus();
- })
- };
-
- scope.exitFilterMode = function () {
- scope.query.search = null;
- scope.getEntityAttributes();
- };
-
- scope.$watch("query.search", function (newVal, prevVal) {
- if (!angular.equals(newVal, prevVal) && scope.query.search != null) {
- scope.getEntityAttributes();
- }
- });
-
- function success(attributes, update, apply) {
- scope.attributes = attributes;
- if (!update) {
- scope.selectedAttributes = [];
- }
- if (apply) {
- scope.$digest();
- }
- }
-
- scope.onReorder = function () {
- scope.getEntityAttributes(false, false);
- };
-
- scope.onPaginate = function () {
- scope.getEntityAttributes(false, false);
- };
-
- scope.getEntityAttributes = function (forceUpdate, reset) {
- if (scope.attributesDeferred) {
- scope.attributesDeferred.resolve();
- }
- if (scope.entityId && scope.entityType && scope.attributeScope) {
- if (reset) {
- scope.attributes = {
- count: 0,
- data: []
- };
- }
- scope.checkSubscription();
- scope.attributesDeferred = attributeService.getEntityAttributes(scope.entityType, scope.entityId, scope.attributeScope.value,
- scope.query, function (attributes, update, apply) {
- success(attributes, update || forceUpdate, apply);
- }
- );
- } else {
- var deferred = $q.defer();
- scope.attributesDeferred = deferred;
- success({
- count: 0,
- data: []
- });
- deferred.resolve();
- }
- };
-
- scope.checkSubscription = function () {
- var newSubscriptionId = null;
- if (scope.entityId && scope.entityType && scope.attributeScope.clientSide && scope.mode != 'widget') {
- newSubscriptionId = attributeService.subscribeForEntityAttributes(scope.entityType, scope.entityId, scope.attributeScope.value);
- }
- if (scope.subscriptionId && scope.subscriptionId != newSubscriptionId) {
- attributeService.unsubscribeForEntityAttributes(scope.subscriptionId);
- }
- scope.subscriptionId = newSubscriptionId;
- };
-
- scope.$on('$destroy', function () {
- if (scope.subscriptionId) {
- attributeService.unsubscribeForEntityAttributes(scope.subscriptionId);
- }
- });
-
- scope.editAttribute = function ($event, attribute) {
- if (!scope.attributeScope.clientSide) {
- $event.stopPropagation();
- $mdEditDialog.show({
- controller: EditAttributeValueController,
- templateUrl: editAttributeValueTemplate,
- locals: {
- attributeValue: attribute.value,
- save: function (model) {
- var updatedAttribute = angular.copy(attribute);
- updatedAttribute.value = model.value;
- attributeService.saveEntityAttributes(scope.entityType, scope.entityId, scope.attributeScope.value, [updatedAttribute]).then(
- function success() {
- scope.getEntityAttributes();
- }
- );
- }
- },
- targetEvent: $event
- });
- }
- };
-
- scope.addAttribute = function ($event) {
- if (!scope.attributeScope.clientSide) {
- $event.stopPropagation();
- $mdDialog.show({
- controller: 'AddAttributeDialogController',
- controllerAs: 'vm',
- templateUrl: addAttributeDialogTemplate,
- parent: angular.element($document[0].body),
- locals: {
- entityType: scope.entityType,
- entityId: scope.entityId,
- attributeScope: scope.attributeScope.value
- },
- fullscreen: true,
- targetEvent: $event
- }).then(function () {
- scope.getEntityAttributes();
- });
- }
- };
-
- scope.deleteAttributes = function ($event) {
- if (!scope.attributeScope.clientSide) {
- $event.stopPropagation();
- var confirm = $mdDialog.confirm()
- .targetEvent($event)
- .title($translate.instant('attribute.delete-attributes-title', {count: scope.selectedAttributes.length}, 'messageformat'))
- .htmlContent($translate.instant('attribute.delete-attributes-text'))
- .ariaLabel($translate.instant('attribute.delete-attributes'))
- .cancel($translate.instant('action.no'))
- .ok($translate.instant('action.yes'));
- $mdDialog.show(confirm).then(function () {
- attributeService.deleteEntityAttributes(scope.entityType, scope.entityId, scope.attributeScope.value, scope.selectedAttributes).then(
- function success() {
- scope.selectedAttributes = [];
- scope.getEntityAttributes();
- }
- )
- });
- }
- };
-
- scope.nextWidget = function () {
- $mdUtil.nextTick(function () {
- if (scope.widgetsCarousel.index < scope.widgetsList.length - 1) {
- scope.widgetsCarousel.index++;
- }
- });
- };
-
- scope.prevWidget = function () {
- $mdUtil.nextTick(function () {
- if (scope.widgetsCarousel.index > 0) {
- scope.widgetsCarousel.index--;
- }
- });
- };
-
- scope.enterWidgetMode = function () {
-
- if (scope.widgetsIndexWatch) {
- scope.widgetsIndexWatch();
- scope.widgetsIndexWatch = null;
- }
-
- if (scope.widgetsBundleWatch) {
- scope.widgetsBundleWatch();
- scope.widgetsBundleWatch = null;
- }
-
- scope.mode = 'widget';
- scope.checkSubscription();
- scope.widgetsList = [];
- scope.widgetsListCache = [];
- scope.widgetsLoaded = false;
- scope.widgetsCarousel = {
- index: 0
- }
- scope.widgetsBundle = null;
- scope.firstBundle = true;
- scope.selectedWidgetsBundleAlias = types.systemBundleAlias.cards;
-
- var entityAlias = {
- id: utils.guid(),
- alias: scope.entityName,
- filter: dashboardUtils.createSingleEntityFilter(scope.entityType, scope.entityId)
- };
- var entitiAliases = {};
- entitiAliases[entityAlias.id] = entityAlias;
-
- var stateController = {
- getStateParams: function () {
- return {};
- }
- };
- scope.aliasController = new AliasController(scope, $q, $filter, utils,
- types, entityService, stateController, entitiAliases);
-
- var dataKeyType = scope.attributeScope === types.latestTelemetry ?
- types.dataKeyType.timeseries : types.dataKeyType.attribute;
-
- var datasource = {
- type: types.datasourceType.entity,
- entityAliasId: entityAlias.id,
- dataKeys: []
- };
- var i = 0;
- for (var attr = 0; attr < scope.selectedAttributes.length; attr++) {
- var attribute = scope.selectedAttributes[attr];
- var dataKey = {
- name: attribute.key,
- label: attribute.key,
- type: dataKeyType,
- color: utils.getMaterialColor(i),
- settings: {},
- _hash: Math.random()
- };
- datasource.dataKeys.push(dataKey);
- i++;
- }
-
- scope.widgetsIndexWatch = scope.$watch('widgetsCarousel.index', function (newVal, prevVal) {
- if (scope.mode === 'widget' && (newVal != prevVal)) {
- var index = scope.widgetsCarousel.index;
- for (var i = 0; i < scope.widgetsList.length; i++) {
- scope.widgetsList[i].splice(0, scope.widgetsList[i].length);
- if (i === index) {
- scope.widgetsList[i].push(scope.widgetsListCache[i][0]);
- }
- }
- }
- });
-
- scope.widgetsBundleWatch = scope.$watch('widgetsBundle', function (newVal, prevVal) {
- if (scope.mode === 'widget' && (scope.firstBundle === true || newVal != prevVal)) {
- scope.widgetsList = [];
- scope.widgetsListCache = [];
- scope.widgetsCarousel.index = 0;
- scope.firstBundle = false;
- if (scope.widgetsBundle) {
- scope.widgetsLoaded = false;
- var bundleAlias = scope.widgetsBundle.alias;
- var isSystem = scope.widgetsBundle.tenantId.id === types.id.nullUid;
- widgetService.getBundleWidgetTypes(scope.widgetsBundle.alias, isSystem).then(
- function success(widgetTypes) {
-
- widgetTypes = $filter('orderBy')(widgetTypes, ['-descriptor.type', '-createdTime']);
-
- for (var i = 0; i < widgetTypes.length; i++) {
- var widgetType = widgetTypes[i];
- var widgetInfo = widgetService.toWidgetInfo(widgetType);
- if (widgetInfo.type !== types.widgetType.static.value) {
- var sizeX = widgetInfo.sizeX * 2;
- var sizeY = widgetInfo.sizeY * 2;
- var col = Math.floor(Math.max(0, (20 - sizeX) / 2));
- var widget = {
- isSystemType: isSystem,
- bundleAlias: bundleAlias,
- typeAlias: widgetInfo.alias,
- type: widgetInfo.type,
- title: widgetInfo.widgetName,
- sizeX: sizeX,
- sizeY: sizeY,
- row: 0,
- col: col,
- config: angular.fromJson(widgetInfo.defaultConfig)
- };
-
- widget.config.title = widgetInfo.widgetName;
- widget.config.datasources = [datasource];
- var length;
- if (scope.attributeScope === types.latestTelemetry && widgetInfo.type !== types.widgetType.rpc.value) {
- length = scope.widgetsListCache.push([widget]);
- scope.widgetsList.push(length === 1 ? [widget] : []);
- } else if (widgetInfo.type === types.widgetType.latest.value) {
- length = scope.widgetsListCache.push([widget]);
- scope.widgetsList.push(length === 1 ? [widget] : []);
- }
- }
- }
- scope.widgetsLoaded = true;
- }
- );
- }
- }
- });
- };
-
- scope.exitWidgetMode = function () {
- if (scope.widgetsBundleWatch) {
- scope.widgetsBundleWatch();
- scope.widgetsBundleWatch = null;
- }
- if (scope.widgetsIndexWatch) {
- scope.widgetsIndexWatch();
- scope.widgetsIndexWatch = null;
- }
- scope.selectedWidgetsBundleAlias = null;
- scope.mode = 'default';
- scope.getEntityAttributes(true);
- };
-
- scope.addWidgetToDashboard = function ($event) {
- if (scope.mode === 'widget' && scope.widgetsListCache.length > 0) {
- var widget = scope.widgetsListCache[scope.widgetsCarousel.index][0];
- $event.stopPropagation();
- $mdDialog.show({
- controller: 'AddWidgetToDashboardDialogController',
- controllerAs: 'vm',
- templateUrl: addWidgetToDashboardDialogTemplate,
- parent: angular.element($document[0].body),
- locals: {
- entityId: scope.entityId,
- entityType: scope.entityType,
- entityName: scope.entityName,
- widget: angular.copy(widget)
- },
- fullscreen: true,
- targetEvent: $event
- }).then(function () {
-
- });
- }
- };
-
- scope.loading = function () {
- return $rootScope.loading;
- };
-
- $compile(element.contents())(scope);
- };
-
- return {
- restrict: "E",
- link: linker,
- scope: {
- entityId: '=',
- entityName: '=',
- disableAttributeScopeSelection: '@?'
- }
- };
-}
diff --git a/ui/src/app/entity/attribute/attribute-table.scss b/ui/src/app/entity/attribute/attribute-table.scss
deleted file mode 100644
index 5a0bde0c68..0000000000
--- a/ui/src/app/entity/attribute/attribute-table.scss
+++ /dev/null
@@ -1,68 +0,0 @@
-/**
- * Copyright © 2016-2020 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-light: rgba(255, 255, 255, 100%) !default;
-$md-edit-icon-fill: #757575 !default;
-
-md-toolbar.md-table-toolbar.alternate {
- .md-toolbar-tools {
- md-icon {
- color: $md-light;
- }
- }
-}
-
-.md-table {
- &.tb-attribute-table {
- table-layout: fixed;
-
- td.md-cell {
- &.tb-value-cell {
- overflow: auto;
- }
- }
- }
-
- .md-cell {
- ng-md-icon {
- float: right;
- height: 24px;
- fill: $md-edit-icon-fill;
- }
- }
-}
-
-.widgets-carousel {
- position: relative;
- height: calc(100% - 100px);
- min-height: 150px !important;
- margin: 0;
-
- tb-dashboard {
- #gridster-parent {
- padding: 0 7px;
- }
- }
-}
-
-md-edit-dialog.tb-edit-dialog{
- z-index: 78;
-}
-
-md-backdrop.md-edit-dialog-backdrop{
- z-index: 77;
-}
diff --git a/ui/src/app/entity/attribute/attribute-table.tpl.html b/ui/src/app/entity/attribute/attribute-table.tpl.html
deleted file mode 100644
index 8844891e62..0000000000
--- a/ui/src/app/entity/attribute/attribute-table.tpl.html
+++ /dev/null
@@ -1,207 +0,0 @@
-
-
-
-
-
-
-
- {{scope.name | translate}}
-
-
-
-
-
-
diff --git a/ui/src/app/entity/attribute/edit-attribute-value.controller.js b/ui/src/app/entity/attribute/edit-attribute-value.controller.js
deleted file mode 100644
index 7cb550d4c1..0000000000
--- a/ui/src/app/entity/attribute/edit-attribute-value.controller.js
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-/* eslint-enable import/no-unresolved, import/default */
-
-import AttributeDialogEditJsonController from "./attribute-dialog-edit-json.controller";
-import attributeDialogEditJsonTemplate from "./attribute-dialog-edit-json.tpl.html";
-
-/*@ngInject*/
-export default function EditAttributeValueController($scope, $mdDialog, $q, $element, $document, types, attributeValue, save) {
-
- $scope.valueTypes = types.valueType;
-
- $scope.model = {
- value: attributeValue
- };
-
- if ($scope.model.value === true || $scope.model.value === false) {
- $scope.valueType = types.valueType.boolean;
- } else if (angular.isNumber($scope.model.value)) {
- if ($scope.model.value.toString().indexOf('.') == -1) {
- $scope.valueType = types.valueType.integer;
- } else {
- $scope.valueType = types.valueType.double;
- }
- } else if (angular.isObject($scope.model.value)) {
- $scope.valueType = types.valueType.json;
- } else {
- $scope.valueType = types.valueType.string;
- }
-
- $scope.submit = submit;
- $scope.dismiss = dismiss;
- $scope.editJSON = editJSON;
-
- function dismiss() {
- $element.remove();
- }
-
- function update() {
- if ($scope.editDialog.$invalid) {
- return $q.reject();
- }
- if (angular.isFunction(save)) {
- return $q.when(save($scope.model));
- }
- return $q.resolve();
- }
-
- function submit() {
- update().then(function () {
- $scope.dismiss();
- });
- }
-
-
- $scope.$watch('valueType', function (newVal, prevVal) {
- if (newVal !== prevVal) {
- if ($scope.valueType === types.valueType.boolean) {
- $scope.model.value = false;
- } else if ($scope.valueType === types.valueType.json) {
- $scope.model.value = {};
- } else {
- $scope.model.value = null;
- }
- }
- });
-
- function editJSON($event) {
- $scope.hideDialog = true;
- showJsonDialog($event, $scope.model.value, false).then((response) => {
- $scope.hideDialog = false;
- if (!angular.equals(response, $scope.model.value)) {
- $scope.editDialog.$setDirty();
- }
- $scope.model.value = response;
- })
- }
-
- function showJsonDialog($event, jsonValue, readOnly) {
- if ($event) {
- $event.stopPropagation();
- }
- return $mdDialog.show({
- controller: AttributeDialogEditJsonController,
- controllerAs: 'vm',
- templateUrl: attributeDialogEditJsonTemplate,
- locals: {
- jsonValue: jsonValue,
- readOnly: readOnly
- },
- targetEvent: $event,
- fullscreen: true,
- multiple: true
- });
- }
-}
diff --git a/ui/src/app/entity/attribute/edit-attribute-value.tpl.html b/ui/src/app/entity/attribute/edit-attribute-value.tpl.html
deleted file mode 100644
index 35abe746aa..0000000000
--- a/ui/src/app/entity/attribute/edit-attribute-value.tpl.html
+++ /dev/null
@@ -1,88 +0,0 @@
-
-
-
-
diff --git a/ui/src/app/entity/entity-autocomplete.directive.js b/ui/src/app/entity/entity-autocomplete.directive.js
deleted file mode 100644
index f726b50d94..0000000000
--- a/ui/src/app/entity/entity-autocomplete.directive.js
+++ /dev/null
@@ -1,205 +0,0 @@
-/*
- * Copyright © 2016-2020 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 './entity-autocomplete.scss';
-
-/* eslint-disable import/no-unresolved, import/default */
-
-import entityAutocompleteTemplate from './entity-autocomplete.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-/*@ngInject*/
-export default function EntityAutocomplete($compile, $templateCache, $q, $filter, entityService, types) {
-
- var linker = function (scope, element, attrs, ngModelCtrl) {
- var template = $templateCache.get(entityAutocompleteTemplate);
- element.html(template);
-
- scope.tbRequired = angular.isDefined(scope.tbRequired) ? scope.tbRequired : false;
- scope.entity = null;
- scope.entitySearchText = '';
-
- scope.fetchEntities = function(searchText) {
- var deferred = $q.defer();
- var limit = 50;
- if (scope.excludeEntityIds && scope.excludeEntityIds.length) {
- limit += scope.excludeEntityIds.length;
- }
- var targetType = scope.entityType;
- if (targetType == types.aliasEntityType.current_customer) {
- targetType = types.entityType.customer;
- }
-
- entityService.getEntitiesByNameFilter(targetType, searchText, limit, {ignoreLoading: true}, scope.entitySubtype).then(function success(result) {
- if (result) {
- if (scope.excludeEntityIds && scope.excludeEntityIds.length) {
- var entities = [];
- result.forEach(function(entity) {
- if (scope.excludeEntityIds.indexOf(entity.id.id) == -1) {
- entities.push(entity);
- }
- });
- deferred.resolve(entities);
- } else {
- deferred.resolve(result);
- }
- } else {
- deferred.resolve([]);
- }
- }, function fail() {
- deferred.reject();
- });
- return deferred.promise;
- }
-
- scope.entitySearchTextChanged = function() {
- }
-
- scope.updateView = function () {
- if (!scope.disabled) {
- ngModelCtrl.$setViewValue(scope.entity ? scope.entity.id.id : null);
- }
- }
-
- ngModelCtrl.$render = function () {
- if (ngModelCtrl.$viewValue) {
- var targetType = scope.entityType;
- if (targetType == types.aliasEntityType.current_customer) {
- targetType = types.entityType.customer;
- }
- entityService.getEntity(targetType, ngModelCtrl.$viewValue).then(
- function success(entity) {
- scope.entity = entity;
- },
- function fail() {
- scope.entity = null;
- }
- );
- } else {
- scope.entity = null;
- }
- }
-
- scope.$watch('entityType', function () {
- load();
- });
-
- scope.$watch('entitySubtype', function () {
- if (scope.entity && scope.entity.type != scope.entitySubtype) {
- scope.entity = null;
- scope.updateView();
- }
- });
-
- scope.$watch('entity', function (newVal, prevVal) {
- if (!angular.equals(newVal, prevVal)) {
- scope.updateView();
- }
- });
-
- scope.$watch('disabled', function (newVal, prevVal) {
- if (!angular.equals(newVal, prevVal)) {
- scope.updateView();
- }
- });
-
-
- function load() {
- switch (scope.entityType) {
- case types.entityType.asset:
- scope.selectEntityText = 'asset.select-asset';
- scope.entityText = 'asset.asset';
- scope.noEntitiesMatchingText = 'asset.no-assets-matching';
- scope.entityRequiredText = 'asset.asset-required';
- break;
- case types.entityType.device:
- scope.selectEntityText = 'device.select-device';
- scope.entityText = 'device.device';
- scope.noEntitiesMatchingText = 'device.no-devices-matching';
- scope.entityRequiredText = 'device.device-required';
- break;
- case types.entityType.entityView:
- scope.selectEntityText = 'entity-view.select-entity-view';
- scope.entityText = 'entity-view.entity-view';
- scope.noEntitiesMatchingText = 'entity-view.no-entity-views-matching';
- scope.entityRequiredText = 'entity-view.entity-view-required';
- break;
- case types.entityType.rulechain:
- scope.selectEntityText = 'rulechain.select-rulechain';
- scope.entityText = 'rulechain.rulechain';
- scope.noEntitiesMatchingText = 'rulechain.no-rulechains-matching';
- scope.entityRequiredText = 'rulechain.rulechain-required';
- break;
- case types.entityType.tenant:
- scope.selectEntityText = 'tenant.select-tenant';
- scope.entityText = 'tenant.tenant';
- scope.noEntitiesMatchingText = 'tenant.no-tenants-matching';
- scope.entityRequiredText = 'tenant.tenant-required';
- break;
- case types.entityType.customer:
- scope.selectEntityText = 'customer.select-customer';
- scope.entityText = 'customer.customer';
- scope.noEntitiesMatchingText = 'customer.no-customers-matching';
- scope.entityRequiredText = 'customer.customer-required';
- break;
- case types.entityType.user:
- scope.selectEntityText = 'user.select-user';
- scope.entityText = 'user.user';
- scope.noEntitiesMatchingText = 'user.no-users-matching';
- scope.entityRequiredText = 'user.user-required';
- break;
- case types.entityType.dashboard:
- scope.selectEntityText = 'dashboard.select-dashboard';
- scope.entityText = 'dashboard.dashboard';
- scope.noEntitiesMatchingText = 'dashboard.no-dashboards-matching';
- scope.entityRequiredText = 'dashboard.dashboard-required';
- break;
- case types.entityType.alarm:
- scope.selectEntityText = 'alarm.select-alarm';
- scope.entityText = 'alarm.alarm';
- scope.noEntitiesMatchingText = 'alarm.no-alarms-matching';
- scope.entityRequiredText = 'alarm.alarm-required';
- break;
- case types.aliasEntityType.current_customer:
- scope.selectEntityText = 'customer.select-default-customer';
- scope.entityText = 'customer.default-customer';
- scope.noEntitiesMatchingText = 'customer.no-customers-matching';
- scope.entityRequiredText = 'customer.default-customer-required';
- break;
- }
- if (scope.entity && scope.entity.id.entityType != scope.entityType) {
- scope.entity = null;
- scope.updateView();
- }
- }
-
- $compile(element.contents())(scope);
- }
-
- return {
- restrict: "E",
- require: "^ngModel",
- link: linker,
- scope: {
- theForm: '=?',
- tbRequired: '=?',
- disabled:'=ngDisabled',
- entityType: '=',
- entitySubtype: '=?',
- excludeEntityIds: '=?'
- }
- };
-}
diff --git a/ui/src/app/entity/entity-autocomplete.scss b/ui/src/app/entity/entity-autocomplete.scss
deleted file mode 100644
index c3053f3c48..0000000000
--- a/ui/src/app/entity/entity-autocomplete.scss
+++ /dev/null
@@ -1,26 +0,0 @@
-/**
- * Copyright © 2016-2020 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-entity-autocomplete {
- .tb-entity-item {
- display: block;
- height: 48px;
- }
-
- li {
- height: auto !important;
- white-space: normal !important;
- }
-}
diff --git a/ui/src/app/entity/entity-autocomplete.tpl.html b/ui/src/app/entity/entity-autocomplete.tpl.html
deleted file mode 100644
index e9011ff36a..0000000000
--- a/ui/src/app/entity/entity-autocomplete.tpl.html
+++ /dev/null
@@ -1,45 +0,0 @@
-
-
-
-
- {{item.name}}
-
-
-
-
- {{ noEntitiesMatchingText }}
-
-
-
-
{{ entityRequiredText }}
-
-
diff --git a/ui/src/app/entity/entity-filter-view.directive.js b/ui/src/app/entity/entity-filter-view.directive.js
deleted file mode 100644
index 837313df28..0000000000
--- a/ui/src/app/entity/entity-filter-view.directive.js
+++ /dev/null
@@ -1,228 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-/* eslint-disable import/no-unresolved, import/default */
-
-import entityFilterViewTemplate from './entity-filter-view.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-import './entity-filter-view.scss';
-
-/*@ngInject*/
-export default function EntityFilterViewDirective($compile, $templateCache, $q, $document, $mdDialog, $translate, types/*, entityService*/) {
-
- var linker = function (scope, element, attrs, ngModelCtrl) {
-
- var template = $templateCache.get(entityFilterViewTemplate);
- element.html(template);
-
- scope.ngModelCtrl = ngModelCtrl;
- scope.types = types;
- scope.filterDisplayValue = '';
-
- scope.$watch('filter', function () {
- scope.updateDisplayValue();
- });
-
- scope.updateDisplayValue = function() {
- if (scope.filter && scope.filter.type) {
- var entityType;
- var prefix;
- switch (scope.filter.type) {
- case types.aliasFilterType.singleEntity.value:
- entityType = scope.filter.singleEntity.entityType;
- scope.filterDisplayValue = $translate.instant(types.entityTypeTranslations[entityType].list, {count: 1}, 'messageformat');
- break;
- case types.aliasFilterType.entityList.value:
- entityType = scope.filter.entityType;
- var count = scope.filter.entityList.length;
- scope.filterDisplayValue = $translate.instant(types.entityTypeTranslations[entityType].list, {count: count}, 'messageformat');
- break;
- case types.aliasFilterType.entityName.value:
- entityType = scope.filter.entityType;
- prefix = scope.filter.entityNameFilter;
- scope.filterDisplayValue = $translate.instant(types.entityTypeTranslations[entityType].nameStartsWith, {prefix: prefix});
- break;
- case types.aliasFilterType.stateEntity.value:
- scope.filterDisplayValue = $translate.instant('alias.filter-type-state-entity-description');
- break;
- case types.aliasFilterType.assetType.value:
- var assetType = scope.filter.assetType;
- prefix = scope.filter.assetNameFilter;
- if (prefix && prefix.length) {
- scope.filterDisplayValue = $translate.instant('alias.filter-type-asset-type-and-name-description', {assetType: assetType, prefix: prefix});
- } else {
- scope.filterDisplayValue = $translate.instant('alias.filter-type-asset-type-description', {assetType: assetType});
- }
- break;
- case types.aliasFilterType.deviceType.value:
- var deviceType = scope.filter.deviceType;
- prefix = scope.filter.deviceNameFilter;
- if (prefix && prefix.length) {
- scope.filterDisplayValue = $translate.instant('alias.filter-type-device-type-and-name-description', {deviceType: deviceType, prefix: prefix});
- } else {
- scope.filterDisplayValue = $translate.instant('alias.filter-type-device-type-description', {deviceType: deviceType});
- }
- break;
- case types.aliasFilterType.entityViewType.value:
- var entityViewType = scope.filter.entityViewType;
- prefix = scope.filter.entityViewNameFilter;
- if (prefix && prefix.length) {
- scope.filterDisplayValue = $translate.instant('alias.filter-type-entity-view-type-and-name-description', {entityViewType: entityViewType, prefix: prefix});
- } else {
- scope.filterDisplayValue = $translate.instant('alias.filter-type-entity-view-type-description', {entityViewType: entityViewType});
- }
- break;
- case types.aliasFilterType.relationsQuery.value:
- var rootEntityText;
- var directionText;
- var allEntitiesText = $translate.instant('alias.all-entities');
- var anyRelationText = $translate.instant('alias.any-relation');
- if (scope.filter.rootStateEntity) {
- rootEntityText = $translate.instant('alias.state-entity');
- } else {
- rootEntityText = $translate.instant(types.entityTypeTranslations[scope.filter.rootEntity.entityType].type);
- }
- directionText = $translate.instant('relation.direction-type.' + scope.filter.direction);
- var relationFilters = scope.filter.filters;
- if (relationFilters && relationFilters.length) {
- var relationFiltersDisplayValues = [];
- relationFilters.forEach(function(relationFilter) {
- var entitiesText;
- if (relationFilter.entityTypes && relationFilter.entityTypes.length) {
- var entitiesNamesList = [];
- relationFilter.entityTypes.forEach(function(entityType) {
- entitiesNamesList.push(
- $translate.instant(types.entityTypeTranslations[entityType].typePlural)
- );
- });
- entitiesText = entitiesNamesList.join(', ');
- } else {
- entitiesText = allEntitiesText;
- }
- var relationTypeText;
- if (relationFilter.relationType && relationFilter.relationType.length) {
- relationTypeText = "'" + relationFilter.relationType + "'";
- } else {
- relationTypeText = anyRelationText;
- }
- var relationFilterDisplayValue = $translate.instant('alias.filter-type-relations-query-description',
- {
- entities: entitiesText,
- relationType: relationTypeText,
- direction: directionText,
- rootEntity: rootEntityText
- }
- );
- relationFiltersDisplayValues.push(relationFilterDisplayValue);
- });
- scope.filterDisplayValue = relationFiltersDisplayValues.join(', ');
- } else {
- scope.filterDisplayValue = $translate.instant('alias.filter-type-relations-query-description',
- {
- entities: allEntitiesText,
- relationType: anyRelationText,
- direction: directionText,
- rootEntity: rootEntityText
- }
- );
- }
- break;
- case types.aliasFilterType.assetSearchQuery.value:
- case types.aliasFilterType.deviceSearchQuery.value:
- case types.aliasFilterType.entityViewSearchQuery.value:
- allEntitiesText = $translate.instant('alias.all-entities');
- anyRelationText = $translate.instant('alias.any-relation');
- if (scope.filter.rootStateEntity) {
- rootEntityText = $translate.instant('alias.state-entity');
- } else {
- rootEntityText = $translate.instant(types.entityTypeTranslations[scope.filter.rootEntity.entityType].type);
- }
- directionText = $translate.instant('relation.direction-type.' + scope.filter.direction);
- var relationTypeText;
- if (scope.filter.relationType && scope.filter.relationType.length) {
- relationTypeText = "'" + scope.filter.relationType + "'";
- } else {
- relationTypeText = anyRelationText;
- }
-
- var translationValues = {
- relationType: relationTypeText,
- direction: directionText,
- rootEntity: rootEntityText
- }
-
- if (scope.filter.type == types.aliasFilterType.assetSearchQuery.value) {
- var assetTypesQuoted = [];
- scope.filter.assetTypes.forEach(function(assetType) {
- assetTypesQuoted.push("'"+assetType+"'");
- });
- var assetTypesText = assetTypesQuoted.join(', ');
- translationValues.assetTypes = assetTypesText;
- scope.filterDisplayValue = $translate.instant('alias.filter-type-asset-search-query-description',
- translationValues
- );
- } else if (scope.filter.type == types.aliasFilterType.deviceSearchQuery.value) {
- var deviceTypesQuoted = [];
- scope.filter.deviceTypes.forEach(function(deviceType) {
- deviceTypesQuoted.push("'"+deviceType+"'");
- });
- var deviceTypesText = deviceTypesQuoted.join(', ');
- translationValues.deviceTypes = deviceTypesText;
- scope.filterDisplayValue = $translate.instant('alias.filter-type-device-search-query-description',
- translationValues
- );
- } else if (scope.filter.type == types.aliasFilterType.entityViewSearchQuery.value) {
- var entityViewTypesQuoted = [];
- scope.filter.entityViewTypes.forEach(function(entityViewType) {
- entityViewTypesQuoted.push("'"+entityViewType+"'");
- });
- var entityViewTypesText = entityViewTypesQuoted.join(', ');
- translationValues.entityViewTypes = entityViewTypesText;
- scope.filterDisplayValue = $translate.instant('alias.filter-type-entity-view-search-query-description',
- translationValues
- );
- }
- break;
- default:
- scope.filterDisplayValue = scope.filter.type;
- break;
- }
- } else {
- scope.filterDisplayValue = '';
- }
- }
-
- ngModelCtrl.$render = function () {
- if (ngModelCtrl.$viewValue) {
- scope.filter = ngModelCtrl.$viewValue;
- } else {
- scope.filter = null;
- }
- }
-
- $compile(element.contents())(scope);
-
- }
-
- return {
- restrict: "E",
- require: "^ngModel",
- link: linker,
- scope: true
- };
-
-}
diff --git a/ui/src/app/entity/entity-filter-view.scss b/ui/src/app/entity/entity-filter-view.scss
deleted file mode 100644
index 538004a52e..0000000000
--- a/ui/src/app/entity/entity-filter-view.scss
+++ /dev/null
@@ -1,34 +0,0 @@
-/**
- * Copyright © 2016-2020 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-entity-filter-view {
- .entity-filter-empty {
- font-size: 14px;
- line-height: 16px;
- color: rgba(221, 44, 0, .87);
- }
-
- .entity-filter-type {
- font-size: 14px;
- line-height: 16px;
- color: rgba(0, 0, 0, .570588);
- }
-
- .entity-filter-value {
- font-size: 14px;
- line-height: 16px;
- color: rgba(0, 0, 0, .570588);
- }
-}
diff --git a/ui/src/app/entity/entity-filter-view.tpl.html b/ui/src/app/entity/entity-filter-view.tpl.html
deleted file mode 100644
index cbc8f2af0a..0000000000
--- a/ui/src/app/entity/entity-filter-view.tpl.html
+++ /dev/null
@@ -1,23 +0,0 @@
-
-
-
alias.no-entity-filter-specified
-
-
{{ filterDisplayValue }}
-
-
diff --git a/ui/src/app/entity/entity-filter.directive.js b/ui/src/app/entity/entity-filter.directive.js
deleted file mode 100644
index 39e3892ff9..0000000000
--- a/ui/src/app/entity/entity-filter.directive.js
+++ /dev/null
@@ -1,137 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-/* eslint-disable import/no-unresolved, import/default */
-
-import entityFilterTemplate from './entity-filter.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-import './entity-filter.scss';
-
-/*@ngInject*/
-export default function EntityFilterDirective($compile, $templateCache, $q, $document, $mdDialog, types, entityService) {
-
- var linker = function (scope, element, attrs, ngModelCtrl) {
-
- var template = $templateCache.get(entityFilterTemplate);
- element.html(template);
-
- scope.ngModelCtrl = ngModelCtrl;
- scope.types = types;
- scope.aliasFilterTypes = entityService.getAliasFilterTypesByEntityTypes(scope.allowedEntityTypes);
-
- scope.$watch('filter.type', function (newType, prevType) {
- if (newType && newType != prevType) {
- updateFilter();
- }
- });
-
- function updateFilter() {
- var filter = {};
- filter.type = scope.filter.type;
- filter.resolveMultiple = true;
- switch (filter.type) {
- case types.aliasFilterType.singleEntity.value:
- filter.singleEntity = null;
- filter.resolveMultiple = false;
- break;
- case types.aliasFilterType.entityList.value:
- filter.entityType = null;
- filter.entityList = [];
- break;
- case types.aliasFilterType.entityName.value:
- filter.entityType = null;
- filter.entityNameFilter = '';
- break;
- case types.aliasFilterType.stateEntity.value:
- filter.stateEntityParamName = null;
- filter.defaultStateEntity = null;
- filter.resolveMultiple = false;
- break;
- case types.aliasFilterType.assetType.value:
- filter.assetType = null;
- filter.assetNameFilter = '';
- break;
- case types.aliasFilterType.deviceType.value:
- filter.deviceType = null;
- filter.deviceNameFilter = '';
- break;
- case types.aliasFilterType.entityViewType.value:
- filter.entityViewType = null;
- filter.entityViewNameFilter = '';
- break;
- case types.aliasFilterType.relationsQuery.value:
- case types.aliasFilterType.assetSearchQuery.value:
- case types.aliasFilterType.deviceSearchQuery.value:
- case types.aliasFilterType.entityViewSearchQuery.value:
- filter.rootStateEntity = false;
- filter.stateEntityParamName = null;
- filter.defaultStateEntity = null;
- filter.rootEntity = null;
- filter.direction = types.entitySearchDirection.from;
- filter.maxLevel = 1;
- filter.fetchLastLevelOnly = false;
- if (filter.type === types.aliasFilterType.relationsQuery.value) {
- filter.filters = [];
- } else if (filter.type === types.aliasFilterType.assetSearchQuery.value) {
- filter.relationType = null;
- filter.assetTypes = [];
- } else if (filter.type === types.aliasFilterType.deviceSearchQuery.value) {
- filter.relationType = null;
- filter.deviceTypes = [];
- } else if (filter.type === types.aliasFilterType.entityViewSearchQuery.value) {
- filter.relationType = null;
- filter.entityViewTypes = [];
- }
- break;
- }
- scope.filter = filter;
- }
-
- scope.$watch('filter', function () {
- scope.updateView();
- });
-
- scope.updateView = function() {
- ngModelCtrl.$setViewValue(scope.filter);
- }
-
- ngModelCtrl.$render = function () {
- if (ngModelCtrl.$viewValue) {
- scope.filter = ngModelCtrl.$viewValue;
- } else {
- scope.filter = {
- type: null,
- resolveMultiple: false
- }
- }
- }
-
- $compile(element.contents())(scope);
-
- }
-
- return {
- restrict: "E",
- require: "^ngModel",
- link: linker,
- scope: {
- theForm: '=',
- allowedEntityTypes: '=?'
- }
- };
-
-}
diff --git a/ui/src/app/entity/entity-filter.scss b/ui/src/app/entity/entity-filter.scss
deleted file mode 100644
index b672555ada..0000000000
--- a/ui/src/app/entity/entity-filter.scss
+++ /dev/null
@@ -1,36 +0,0 @@
-/**
- * Copyright © 2016-2020 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-entity-filter {
- #relationsQueryFilter {
- padding-top: 20px;
-
- tb-entity-select {
- min-height: 92px;
- }
- }
-
- .tb-root-state-entity-switch {
- padding-left: 10px;
-
- .root-state-entity-switch {
- margin: 0;
- }
-
- .root-state-entity-label {
- margin: 5px 0;
- }
- }
-}
diff --git a/ui/src/app/entity/entity-filter.tpl.html b/ui/src/app/entity/entity-filter.tpl.html
deleted file mode 100644
index bfc63a7d24..0000000000
--- a/ui/src/app/entity/entity-filter.tpl.html
+++ /dev/null
@@ -1,429 +0,0 @@
-
-
-
-
-
-
- {{type.name | translate}}
-
-
-
-
alias.filter-type-required
-
-
-
-
-
-
-
-
-
-
-
-
entity.entity-name-filter-required
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {{ ('relation.search-direction.' + direction) | translate}}
-
-
-
-
-
-
-
-
- relation.relation-filters
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {{ ('relation.search-direction.' + direction) | translate}}
-
-
-
-
-
-
-
-
- relation.relation-type
-
-
- asset.asset-types
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {{ ('relation.search-direction.' + direction) | translate}}
-
-
-
-
-
-
-
-
- relation.relation-type
-
-
- device.device-types
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {{ ('relation.search-direction.' + direction) | translate}}
-
-
-
-
-
-
-
-
- relation.relation-type
-
-
- entity-view.entity-view-types
-
-
-
-
diff --git a/ui/src/app/entity/entity-list.directive.js b/ui/src/app/entity/entity-list.directive.js
deleted file mode 100644
index 3fccecc348..0000000000
--- a/ui/src/app/entity/entity-list.directive.js
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-/* eslint-disable import/no-unresolved, import/default */
-
-import entityListTemplate from './entity-list.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-import './entity-list.scss';
-
-/*@ngInject*/
-export default function EntityListDirective($compile, $templateCache, $q, $mdUtil, entityService) {
-
- var linker = function (scope, element, attrs, ngModelCtrl) {
-
- var template = $templateCache.get(entityListTemplate);
- element.html(template);
-
- scope.ngModelCtrl = ngModelCtrl;
-
- scope.$watch('tbRequired', function () {
- scope.updateValidity();
- });
-
- scope.fetchEntities = function(searchText, limit) {
- var deferred = $q.defer();
- entityService.getEntitiesByNameFilter(scope.entityType, searchText, limit, {ignoreLoading: true}).then(
- function success(result) {
- if (result) {
- deferred.resolve(result);
- } else {
- deferred.resolve([]);
- }
- },
- function fail() {
- deferred.reject();
- }
- );
- return deferred.promise;
- }
-
- scope.updateValidity = function() {
- var value = ngModelCtrl.$viewValue;
- var valid = !scope.tbRequired || value && value.length > 0;
- ngModelCtrl.$setValidity('entityList', valid);
- }
-
- ngModelCtrl.$render = function () {
- destroyWatchers();
- var value = ngModelCtrl.$viewValue;
- scope.entityList = [];
- if (value && value.length > 0) {
- entityService.getEntities(scope.entityType, value).then(function (entities) {
- scope.entityList = entities;
- initWatchers();
- });
- } else {
- initWatchers();
- }
- }
-
- function initWatchers() {
- scope.entityTypeDeregistration = scope.$watch('entityType', function (newEntityType, prevEntityType) {
- if (!angular.equals(newEntityType, prevEntityType)) {
- scope.entityList = [];
- }
- });
- scope.entityListDeregistration = scope.$watch('entityList', function () {
- var ids = [];
- if (scope.entityList && scope.entityList.length > 0) {
- for (var i=0;i
-
-
-
-
- {{item.name}}
-
-
- entity.no-entities-matching
-
-
-
-
- {{$chip.name}}
-
-
-
-
-
entity.entity-list-empty
-
-
\ No newline at end of file
diff --git a/ui/src/app/entity/entity-select.directive.js b/ui/src/app/entity/entity-select.directive.js
deleted file mode 100644
index e93a769eec..0000000000
--- a/ui/src/app/entity/entity-select.directive.js
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
- * Copyright © 2016-2020 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 './entity-select.scss';
-
-/* eslint-disable import/no-unresolved, import/default */
-
-import entitySelectTemplate from './entity-select.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-/*@ngInject*/
-export default function EntitySelect($compile, $templateCache, entityService, types) {
-
- var linker = function (scope, element, attrs, ngModelCtrl) {
- var template = $templateCache.get(entitySelectTemplate);
- element.html(template);
-
- scope.tbRequired = angular.isDefined(scope.tbRequired) ? scope.tbRequired : false;
- scope.entityTypeCurrentTenant = types.aliasEntityType.current_tenant;
-
- var entityTypes = entityService.prepareAllowedEntityTypesList(scope.allowedEntityTypes, scope.useAliasEntityTypes);
-
- var entityTypeKeys = Object.keys(entityTypes);
-
- if (entityTypeKeys.length === 1) {
- scope.displayEntityTypeSelect = false;
- scope.defaultEntityType = entityTypes[entityTypeKeys[0]];
- } else {
- scope.displayEntityTypeSelect = true;
- }
-
- scope.model = {
- entityType: scope.defaultEntityType
- };
-
- scope.updateView = function () {
- if (!scope.disabled) {
- var value = ngModelCtrl.$viewValue;
- if (scope.model && scope.model.entityType &&
- (scope.model.entityId || scope.model.entityType === scope.entityTypeCurrentTenant)) {
- if (!value) {
- value = {};
- }
- value.entityType = scope.model.entityType;
- value.id = scope.model.entityId;
- ngModelCtrl.$setViewValue(value);
- } else {
- ngModelCtrl.$setViewValue(null);
- }
- }
- }
-
- ngModelCtrl.$render = function () {
- destroyWatchers();
- if (ngModelCtrl.$viewValue) {
- var value = ngModelCtrl.$viewValue;
- scope.model.entityType = value.entityType;
- scope.model.entityId = value.id;
- } else {
- scope.model.entityType = scope.defaultEntityType;
- scope.model.entityId = null;
- }
- initWatchers();
- }
-
- function initWatchers() {
- scope.entityTypeDeregistration = scope.$watch('model.entityType', function (newVal, prevVal) {
- if (!angular.equals(newVal, prevVal)) {
- scope.updateView();
- }
- });
-
- scope.entityIdDeregistration = scope.$watch('model.entityId', function (newVal, prevVal) {
- if (!angular.equals(newVal, prevVal)) {
- scope.updateView();
- }
- });
-
- scope.disabledDeregistration = scope.$watch('disabled', function (newVal, prevVal) {
- if (!angular.equals(newVal, prevVal)) {
- scope.updateView();
- }
- });
- }
-
- function destroyWatchers() {
- if (scope.entityTypeDeregistration) {
- scope.entityTypeDeregistration();
- scope.entityTypeDeregistration = null;
- }
- if (scope.entityIdDeregistration) {
- scope.entityIdDeregistration();
- scope.entityIdDeregistration = null;
- }
- if (scope.disabledDeregistration) {
- scope.disabledDeregistration();
- scope.disabledDeregistration = null;
- }
- }
-
- $compile(element.contents())(scope);
- }
-
- return {
- restrict: "E",
- require: "^ngModel",
- link: linker,
- scope: {
- theForm: '=?',
- tbRequired: '=?',
- disabled:'=ngDisabled',
- allowedEntityTypes: "=?",
- useAliasEntityTypes: "=?"
- }
- };
-}
diff --git a/ui/src/app/entity/entity-select.scss b/ui/src/app/entity/entity-select.scss
deleted file mode 100644
index a622807890..0000000000
--- a/ui/src/app/entity/entity-select.scss
+++ /dev/null
@@ -1,20 +0,0 @@
-/**
- * Copyright © 2016-2020 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-entity-select {
-}
-*/
diff --git a/ui/src/app/entity/entity-select.tpl.html b/ui/src/app/entity/entity-select.tpl.html
deleted file mode 100644
index 8800f9760f..0000000000
--- a/ui/src/app/entity/entity-select.tpl.html
+++ /dev/null
@@ -1,35 +0,0 @@
-
-
-
-
-
-
-
diff --git a/ui/src/app/entity/entity-subtype-autocomplete.directive.js b/ui/src/app/entity/entity-subtype-autocomplete.directive.js
deleted file mode 100644
index af590d181d..0000000000
--- a/ui/src/app/entity/entity-subtype-autocomplete.directive.js
+++ /dev/null
@@ -1,168 +0,0 @@
-/*
- * Copyright © 2016-2020 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 './entity-subtype-autocomplete.scss';
-
-/* eslint-disable import/no-unresolved, import/default */
-
-import entitySubtypeAutocompleteTemplate from './entity-subtype-autocomplete.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-/*@ngInject*/
-export default function EntitySubtypeAutocomplete($compile, $templateCache, $q, $filter, assetService, deviceService, entityViewService, types) {
-
- var linker = function (scope, element, attrs, ngModelCtrl) {
- var template = $templateCache.get(entitySubtypeAutocompleteTemplate);
- element.html(template);
-
- scope.tbRequired = angular.isDefined(scope.tbRequired) ? scope.tbRequired : false;
- scope.subType = null;
- scope.subTypeSearchText = '';
- scope.entitySubtypes = null;
-
- var comparator = function(actual, expected) {
- if (angular.isUndefined(actual)) {
- return false;
- }
- if ((actual === null) || (expected === null)) {
- return actual === expected;
- }
- return actual.startsWith(expected);
- };
-
- scope.fetchSubTypes = function(searchText) {
- var deferred = $q.defer();
- loadSubTypes().then(
- function success(subTypes) {
- var result = $filter('filter')(subTypes, {'$': searchText}, comparator);
- if (result && result.length) {
- if (searchText && searchText.length && result.indexOf(searchText) === -1) {
- result.push(searchText);
- }
- result.sort();
- deferred.resolve(result);
- } else {
- deferred.resolve([searchText]);
- }
- },
- function fail() {
- deferred.reject();
- }
- );
- return deferred.promise;
- }
-
- scope.subTypeSearchTextChanged = function() {
- //scope.subType = scope.subTypeSearchText;
- }
-
- scope.updateView = function () {
- if (!scope.disabled) {
- ngModelCtrl.$setViewValue(scope.subType);
- }
- }
-
- ngModelCtrl.$render = function () {
- scope.subType = ngModelCtrl.$viewValue;
- }
-
- scope.$watch('entityType', function () {
- load();
- });
-
- scope.$watch('subType', function (newValue, prevValue) {
- if (!angular.equals(newValue, prevValue)) {
- scope.updateView();
- }
- });
-
- scope.$watch('disabled', function () {
- scope.updateView();
- });
-
- function loadSubTypes() {
- var deferred = $q.defer();
- if (!scope.entitySubtypes) {
- var entitySubtypesPromise;
- if (scope.entityType == types.entityType.asset) {
- entitySubtypesPromise = assetService.getAssetTypes({ignoreLoading: true});
- } else if (scope.entityType == types.entityType.device) {
- entitySubtypesPromise = deviceService.getDeviceTypes({ignoreLoading: true});
- } else if (scope.entityType == types.entityType.entityView) {
- entitySubtypesPromise = entityViewService.getEntityViewTypes({ignoreLoading: true});
- }
- if (entitySubtypesPromise) {
- entitySubtypesPromise.then(
- function success(types) {
- scope.entitySubtypes = [];
- types.forEach(function (type) {
- scope.entitySubtypes.push(type.type);
- });
- deferred.resolve(scope.entitySubtypes);
- },
- function fail() {
- deferred.reject();
- }
- );
- } else {
- deferred.reject();
- }
- } else {
- deferred.resolve(scope.entitySubtypes);
- }
- return deferred.promise;
- }
-
- function load() {
- if (scope.entityType == types.entityType.asset) {
- scope.selectEntitySubtypeText = 'asset.select-asset-type';
- scope.entitySubtypeText = 'asset.asset-type';
- scope.entitySubtypeRequiredText = 'asset.asset-type-required';
- scope.$on('assetSaved', function() {
- scope.entitySubtypes = null;
- });
- } else if (scope.entityType == types.entityType.device) {
- scope.selectEntitySubtypeText = 'device.select-device-type';
- scope.entitySubtypeText = 'device.device-type';
- scope.entitySubtypeRequiredText = 'device.device-type-required';
- scope.$on('deviceSaved', function() {
- scope.entitySubtypes = null;
- });
- } else if (scope.entityType == types.entityType.entityView) {
- scope.selectEntitySubtypeText = 'entity-view.select-entity-view-type';
- scope.entitySubtypeText = 'entity-view.entity-view-type';
- scope.entitySubtypeRequiredText = 'entity-view.entity-view-type-required';
- scope.$on('entityViewSaved', function() {
- scope.entitySubtypes = null;
- });
- }
- }
-
- $compile(element.contents())(scope);
- }
-
- return {
- restrict: "E",
- require: "^ngModel",
- link: linker,
- scope: {
- theForm: '=?',
- tbRequired: '=?',
- disabled:'=ngDisabled',
- entityType: "="
- }
- };
-}
diff --git a/ui/src/app/entity/entity-subtype-autocomplete.scss b/ui/src/app/entity/entity-subtype-autocomplete.scss
deleted file mode 100644
index 26c1525e73..0000000000
--- a/ui/src/app/entity/entity-subtype-autocomplete.scss
+++ /dev/null
@@ -1,26 +0,0 @@
-/**
- * Copyright © 2016-2020 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-entity-subtype-autocomplete {
- .tb-entity-subtype-item {
- display: block;
- height: 48px;
- }
-
- li {
- height: auto !important;
- white-space: normal !important;
- }
-}
diff --git a/ui/src/app/entity/entity-subtype-autocomplete.tpl.html b/ui/src/app/entity/entity-subtype-autocomplete.tpl.html
deleted file mode 100644
index 33d5c47299..0000000000
--- a/ui/src/app/entity/entity-subtype-autocomplete.tpl.html
+++ /dev/null
@@ -1,43 +0,0 @@
-
-
-
-
- {{item}}
-
-
-
-
{{ entitySubtypeRequiredText }}
-
-
diff --git a/ui/src/app/entity/entity-subtype-list.directive.js b/ui/src/app/entity/entity-subtype-list.directive.js
deleted file mode 100644
index 83e585eff2..0000000000
--- a/ui/src/app/entity/entity-subtype-list.directive.js
+++ /dev/null
@@ -1,153 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-/* eslint-disable import/no-unresolved, import/default */
-
-import entitySubtypeListTemplate from './entity-subtype-list.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-import './entity-subtype-list.scss';
-
-/*@ngInject*/
-export default function EntitySubtypeListDirective($compile, $templateCache, $q, $mdUtil, $translate, $filter, types, assetService, deviceService, entityViewService) {
-
- var linker = function (scope, element, attrs, ngModelCtrl) {
-
- var template = $templateCache.get(entitySubtypeListTemplate);
- element.html(template);
-
- scope.ngModelCtrl = ngModelCtrl;
-
-
- scope.entitySubtypesList = [];
- scope.entitySubtypes = null;
-
- if (scope.entityType == types.entityType.asset) {
- scope.placeholder = scope.tbRequired ? $translate.instant('asset.enter-asset-type')
- : $translate.instant('asset.any-asset');
- scope.secondaryPlaceholder = '+' + $translate.instant('asset.asset-type');
- scope.noSubtypesMathingText = 'asset.no-asset-types-matching';
- scope.subtypeListEmptyText = 'asset.asset-type-list-empty';
- } else if (scope.entityType == types.entityType.device) {
- scope.placeholder = scope.tbRequired ? $translate.instant('device.enter-device-type')
- : $translate.instant('device.any-device');
- scope.secondaryPlaceholder = '+' + $translate.instant('device.device-type');
- scope.noSubtypesMathingText = 'device.no-device-types-matching';
- scope.subtypeListEmptyText = 'device.device-type-list-empty';
- } else if (scope.entityType == types.entityType.entityView) {
- scope.placeholder = scope.tbRequired ? $translate.instant('entity-view.enter-entity-view-type')
- : $translate.instant('entity-view.any-entity-view');
- scope.secondaryPlaceholder = '+' + $translate.instant('entity-view.entity-view-type');
- scope.noSubtypesMathingText = 'entity-view.no-entity-view-types-matching';
- scope.subtypeListEmptyText = 'entity-view.entity-view-type-list-empty';
- }
-
- scope.$watch('tbRequired', function () {
- scope.updateValidity();
- });
-
- scope.fetchEntitySubtypes = function(searchText) {
- var deferred = $q.defer();
- loadSubTypes().then(
- function success(subTypes) {
- var result = $filter('filter')(subTypes, {'$': searchText});
- if (result && result.length) {
- deferred.resolve(result);
- } else {
- deferred.resolve([searchText]);
- }
- },
- function fail() {
- deferred.reject();
- }
- );
- return deferred.promise;
- }
-
- scope.updateValidity = function() {
- var value = ngModelCtrl.$viewValue;
- var valid = !scope.tbRequired || value && value.length > 0;
- ngModelCtrl.$setValidity('entitySubtypesList', valid);
- }
-
- ngModelCtrl.$render = function () {
- scope.entitySubtypesList = ngModelCtrl.$viewValue;
- if (!scope.entitySubtypesList) {
- scope.entitySubtypesList = [];
- }
- }
-
- scope.$watch('entitySubtypesList', function () {
- ngModelCtrl.$setViewValue(scope.entitySubtypesList);
- scope.updateValidity();
- }, true);
-
- function loadSubTypes() {
- var deferred = $q.defer();
- if (!scope.entitySubtypes) {
- var entitySubtypesPromise;
- if (scope.entityType == types.entityType.asset) {
- entitySubtypesPromise = assetService.getAssetTypes({ignoreLoading: true});
- } else if (scope.entityType == types.entityType.device) {
- entitySubtypesPromise = deviceService.getDeviceTypes({ignoreLoading: true});
- } else if (scope.entityType == types.entityType.entityView) {
- entitySubtypesPromise = entityViewService.getEntityViewTypes({ignoreLoading: true});
- }
- if (entitySubtypesPromise) {
- entitySubtypesPromise.then(
- function success(types) {
- scope.entitySubtypes = [];
- types.forEach(function (type) {
- scope.entitySubtypes.push(type.type);
- });
- deferred.resolve(scope.entitySubtypes);
- },
- function fail() {
- deferred.reject();
- }
- );
- } else {
- deferred.reject();
- }
- } else {
- deferred.resolve(scope.entitySubtypes);
- }
- return deferred.promise;
- }
-
- $compile(element.contents())(scope);
-
- $mdUtil.nextTick(function(){
- var inputElement = angular.element('input', element);
- inputElement.on('blur', function() {
- scope.inputTouched = true;
- } );
- });
-
- }
-
- return {
- restrict: "E",
- require: "^ngModel",
- link: linker,
- scope: {
- disabled:'=ngDisabled',
- tbRequired: '=?',
- entityType: "="
- }
- };
-
-}
diff --git a/ui/src/app/entity/entity-subtype-list.scss b/ui/src/app/entity/entity-subtype-list.scss
deleted file mode 100644
index 59f14a4f54..0000000000
--- a/ui/src/app/entity/entity-subtype-list.scss
+++ /dev/null
@@ -1,32 +0,0 @@
-/**
- * Copyright © 2016-2020 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-entity-subtype-list {
- #entity_subtype_list_chips {
- .md-chips {
- padding-bottom: 1px;
- }
- }
- .tb-error-messages {
- margin-top: -11px;
- height: 35px;
- .tb-error-message {
- padding-left: 1px;
- }
- }
-}
-*/
diff --git a/ui/src/app/entity/entity-subtype-list.tpl.html b/ui/src/app/entity/entity-subtype-list.tpl.html
deleted file mode 100644
index 42f9e4151e..0000000000
--- a/ui/src/app/entity/entity-subtype-list.tpl.html
+++ /dev/null
@@ -1,53 +0,0 @@
-
-
-
-
-
- {{item}}
-
-
- {{noSubtypesMathingText}}
-
-
-
-
- {{$chip}}
-
-
-
-
-
{{subtypeListEmptyText}}
-
-
diff --git a/ui/src/app/entity/entity-subtype-select.directive.js b/ui/src/app/entity/entity-subtype-select.directive.js
deleted file mode 100644
index f587fb9d66..0000000000
--- a/ui/src/app/entity/entity-subtype-select.directive.js
+++ /dev/null
@@ -1,146 +0,0 @@
-/*
- * Copyright © 2016-2020 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 './entity-subtype-select.scss';
-
-/* eslint-disable import/no-unresolved, import/default */
-
-import entitySubtypeSelectTemplate from './entity-subtype-select.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-/*@ngInject*/
-export default function EntitySubtypeSelect($compile, $templateCache, $translate, assetService, deviceService, entityViewService, types) {
-
- var linker = function (scope, element, attrs, ngModelCtrl) {
- var template = $templateCache.get(entitySubtypeSelectTemplate);
- element.html(template);
-
- if (angular.isDefined(attrs.hideLabel)) {
- scope.showLabel = false;
- } else {
- scope.showLabel = true;
- }
-
- scope.ngModelCtrl = ngModelCtrl;
-
- scope.entitySubtypes = [];
-
- scope.subTypeName = function(subType) {
- if (subType && subType.length) {
- if (scope.typeTranslatePrefix) {
- return $translate.instant(scope.typeTranslatePrefix + '.' + subType);
- } else {
- return subType;
- }
- } else {
- return $translate.instant('entity.all-subtypes');
- }
- }
-
- scope.$watch('entityType', function () {
- load();
- });
-
- scope.$watch('entitySubtype', function (newValue, prevValue) {
- if (!angular.equals(newValue, prevValue)) {
- scope.updateView();
- }
- });
-
- scope.updateView = function () {
- ngModelCtrl.$setViewValue(scope.entitySubtype);
- };
-
- ngModelCtrl.$render = function () {
- scope.entitySubtype = ngModelCtrl.$viewValue;
- };
-
- function loadSubTypes() {
- scope.entitySubtypes = [];
- var entitySubtypesPromise;
- if (scope.entityType == types.entityType.asset) {
- entitySubtypesPromise = assetService.getAssetTypes({ignoreLoading: true});
- } else if (scope.entityType == types.entityType.device) {
- entitySubtypesPromise = deviceService.getDeviceTypes({ignoreLoading: true});
- } else if (scope.entityType == types.entityType.entityView) {
- entitySubtypesPromise = entityViewService.getEntityViewTypes({ignoreLoading: true});
- }
- if (entitySubtypesPromise) {
- entitySubtypesPromise.then(
- function success(types) {
- scope.entitySubtypes.push('');
- types.forEach(function(type) {
- scope.entitySubtypes.push(type.type);
- });
- if (scope.entitySubtypes.indexOf(scope.entitySubtype) == -1) {
- scope.entitySubtype = '';
- }
- },
- function fail() {}
- );
- }
-
- }
-
- function load() {
- if (scope.entityType == types.entityType.asset) {
- scope.entitySubtypeTitle = 'asset.asset-type';
- scope.entitySubtypeRequiredText = 'asset.asset-type-required';
- } else if (scope.entityType == types.entityType.device) {
- scope.entitySubtypeTitle = 'device.device-type';
- scope.entitySubtypeRequiredText = 'device.device-type-required';
- } else if (scope.entityType == types.entityType.entityView) {
- scope.entitySubtypeTitle = 'entity-view.entity-view-type';
- scope.entitySubtypeRequiredText = 'entity-view.entity-view-type-required';
- }
- scope.entitySubtypes.length = 0;
- if (scope.entitySubtypesList && scope.entitySubtypesList.length) {
- scope.entitySubtypesList.forEach(function(subType) {
- scope.entitySubtypes.push(subType);
- });
- } else {
- loadSubTypes();
- if (scope.entityType == types.entityType.asset) {
- scope.$on('assetSaved', function() {
- loadSubTypes();
- });
- } else if (scope.entityType == types.entityType.device) {
- scope.$on('deviceSaved', function() {
- loadSubTypes();
- });
- } else if (scope.entityType == types.entityType.entityView) {
- scope.$on('entityViewSaved', function() {
- loadSubTypes();
- });
- }
- }
- }
-
- $compile(element.contents())(scope);
- }
-
- return {
- restrict: "E",
- require: "^ngModel",
- link: linker,
- scope: {
- theForm: '=?',
- entityType: "=",
- entitySubtypesList: "=?",
- typeTranslatePrefix: "@?"
- }
- };
-}
diff --git a/ui/src/app/entity/entity-subtype-select.scss b/ui/src/app/entity/entity-subtype-select.scss
deleted file mode 100644
index 2f5f4c1bd2..0000000000
--- a/ui/src/app/entity/entity-subtype-select.scss
+++ /dev/null
@@ -1,18 +0,0 @@
-/**
- * Copyright © 2016-2020 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.
- */
-md-select.tb-entity-subtype-select {
- min-width: 200px;
-}
diff --git a/ui/src/app/entity/entity-subtype-select.tpl.html b/ui/src/app/entity/entity-subtype-select.tpl.html
deleted file mode 100644
index 94f6284733..0000000000
--- a/ui/src/app/entity/entity-subtype-select.tpl.html
+++ /dev/null
@@ -1,28 +0,0 @@
-
-
-
-
-
- {{ subTypeName(subType) }}
-
-
-
-
{{ entitySubtypeRequiredText }}
-
-
diff --git a/ui/src/app/entity/entity-type-list.directive.js b/ui/src/app/entity/entity-type-list.directive.js
deleted file mode 100644
index d1fdcaea2f..0000000000
--- a/ui/src/app/entity/entity-type-list.directive.js
+++ /dev/null
@@ -1,149 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-/* eslint-disable import/no-unresolved, import/default */
-
-import entityTypeListTemplate from './entity-type-list.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-import './entity-type-list.scss';
-
-/*@ngInject*/
-export default function EntityTypeListDirective($compile, $templateCache, $q, $mdUtil, $translate, $filter, types, entityService) {
-
- var linker = function (scope, element, attrs, ngModelCtrl) {
-
- var template = $templateCache.get(entityTypeListTemplate);
- element.html(template);
-
- scope.ngModelCtrl = ngModelCtrl;
-
- scope.placeholder = scope.tbRequired ? $translate.instant('entity.enter-entity-type')
- : $translate.instant('entity.any-entity');
- scope.secondaryPlaceholder = '+' + $translate.instant('entity.entity-type');
-
- var entityTypes;
-
- if (scope.ignoreAuthorityFilter && scope.allowedEntityTypes
- && scope.allowedEntityTypes.length) {
- entityTypes = {};
- scope.allowedEntityTypes.forEach((entityTypeValue) => {
- var entityType = entityTypeFromValue(entityTypeValue);
- if (entityType) {
- entityTypes[entityType] = entityTypeValue;
- }
- });
- } else {
- entityTypes = entityService.prepareAllowedEntityTypesList(scope.allowedEntityTypes);
- }
-
- function entityTypeFromValue(entityTypeValue) {
- for (var entityType in types.entityType) {
- if (types.entityType[entityType] === entityTypeValue) {
- return entityType;
- }
- }
- return null;
- }
-
- scope.entityTypesList = [];
- for (var type in entityTypes) {
- var entityTypeInfo = {};
- entityTypeInfo.value = entityTypes[type];
- entityTypeInfo.name = $translate.instant(types.entityTypeTranslations[entityTypeInfo.value].type) + '';
- scope.entityTypesList.push(entityTypeInfo);
- }
-
- scope.$watch('tbRequired', function () {
- scope.updateValidity();
- });
-
- scope.fetchEntityTypes = function(searchText) {
- var deferred = $q.defer();
- var entityTypes = $filter('filter')(scope.entityTypesList, {name: searchText});
- deferred.resolve(entityTypes);
- return deferred.promise;
- }
-
- scope.updateValidity = function() {
- var value = ngModelCtrl.$viewValue;
- var valid = !scope.tbRequired || value && value.length > 0;
- ngModelCtrl.$setValidity('entityTypeList', valid);
- }
-
- ngModelCtrl.$render = function () {
- if (scope.entityTypeListWatch) {
- scope.entityTypeListWatch();
- scope.entityTypeListWatch = null;
- }
- var entityTypeList = [];
- var value = ngModelCtrl.$viewValue;
- if (value && value.length) {
- value.forEach(function(type) {
- var entityTypeInfo = {};
- entityTypeInfo.value = type;
- entityTypeInfo.name = $translate.instant(types.entityTypeTranslations[entityTypeInfo.value].type) + '';
- entityTypeList.push(entityTypeInfo);
- });
- }
- scope.entityTypeList = entityTypeList;
- scope.entityTypeListWatch = scope.$watch('entityTypeList', function (newVal, prevVal) {
- if (!angular.equals(newVal, prevVal)) {
- updateEntityTypeList();
- }
- }, true);
- }
-
- function updateEntityTypeList() {
- var values = ngModelCtrl.$viewValue;
- if (!values) {
- values = [];
- ngModelCtrl.$setViewValue(values);
- } else {
- values.length = 0;
- }
- if (scope.entityTypeList && scope.entityTypeList.length) {
- scope.entityTypeList.forEach(function (entityType) {
- values.push(entityType.value);
- });
- }
- scope.updateValidity();
- }
-
- $compile(element.contents())(scope);
-
- $mdUtil.nextTick(function(){
- var inputElement = angular.element('input', element);
- inputElement.on('blur', function() {
- scope.inputTouched = true;
- } );
- });
-
- }
-
- return {
- restrict: "E",
- require: "^ngModel",
- link: linker,
- scope: {
- disabled:'=ngDisabled',
- tbRequired: '=?',
- allowedEntityTypes: '=?',
- ignoreAuthorityFilter: '=?'
- }
- };
-
-}
diff --git a/ui/src/app/entity/entity-type-list.scss b/ui/src/app/entity/entity-type-list.scss
deleted file mode 100644
index 069bb985f8..0000000000
--- a/ui/src/app/entity/entity-type-list.scss
+++ /dev/null
@@ -1,32 +0,0 @@
-/**
- * Copyright © 2016-2020 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-entity-type-list {
- #entity_type_list_chips {
- .md-chips {
- padding-bottom: 1px;
- }
- }
- .tb-error-messages {
- margin-top: -11px;
- height: 35px;
- .tb-error-message {
- padding-left: 1px;
- }
- }
-}
-*/
diff --git a/ui/src/app/entity/entity-type-list.tpl.html b/ui/src/app/entity/entity-type-list.tpl.html
deleted file mode 100644
index f9c31665dd..0000000000
--- a/ui/src/app/entity/entity-type-list.tpl.html
+++ /dev/null
@@ -1,52 +0,0 @@
-
-
-
-
-
- {{item.name}}
-
-
- entity.no-entity-types-matching
-
-
-
-
- {{$chip.name}}
-
-
-
-
-
entity.entity-type-list-empty
-
-
diff --git a/ui/src/app/entity/entity-type-select.directive.js b/ui/src/app/entity/entity-type-select.directive.js
deleted file mode 100644
index 0b232a0c71..0000000000
--- a/ui/src/app/entity/entity-type-select.directive.js
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * Copyright © 2016-2020 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 './entity-type-select.scss';
-
-/* eslint-disable import/no-unresolved, import/default */
-
-import entityTypeSelectTemplate from './entity-type-select.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-/*@ngInject*/
-export default function EntityTypeSelect($compile, $templateCache, utils, entityService, userService, types) {
-
- var linker = function (scope, element, attrs, ngModelCtrl) {
- var template = $templateCache.get(entityTypeSelectTemplate);
- element.html(template);
-
- scope.tbRequired = angular.isDefined(scope.tbRequired) ? scope.tbRequired : false;
-
- if (angular.isDefined(attrs.hideLabel)) {
- scope.showLabel = false;
- } else {
- scope.showLabel = true;
- }
-
- scope.ngModelCtrl = ngModelCtrl;
-
- scope.entityTypes = entityService.prepareAllowedEntityTypesList(scope.allowedEntityTypes, scope.useAliasEntityTypes);
-
- scope.typeName = function(type) {
- return type ? types.entityTypeTranslations[type].type : '';
- }
-
- scope.updateValidity = function () {
- var value = ngModelCtrl.$viewValue;
- var valid = angular.isDefined(value) && value != null;
- ngModelCtrl.$setValidity('entityType', valid);
- };
-
- scope.$watch('entityType', function (newValue, prevValue) {
- if (!angular.equals(newValue, prevValue)) {
- scope.updateView();
- }
- });
-
- scope.updateView = function () {
- ngModelCtrl.$setViewValue(scope.entityType);
- scope.updateValidity();
- };
-
- ngModelCtrl.$render = function () {
- if (ngModelCtrl.$viewValue) {
- scope.entityType = ngModelCtrl.$viewValue;
- }
- };
-
- $compile(element.contents())(scope);
- }
-
- return {
- restrict: "E",
- require: "^ngModel",
- link: linker,
- scope: {
- theForm: '=?',
- tbRequired: '=?',
- disabled:'=ngDisabled',
- allowedEntityTypes: "=?",
- useAliasEntityTypes: "=?"
- }
- };
-}
diff --git a/ui/src/app/entity/entity-type-select.scss b/ui/src/app/entity/entity-type-select.scss
deleted file mode 100644
index c94827702d..0000000000
--- a/ui/src/app/entity/entity-type-select.scss
+++ /dev/null
@@ -1,20 +0,0 @@
-/**
- * Copyright © 2016-2020 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.
- */
-
-/*
-md-select.tb-entity-type-select {
-}
-*/
diff --git a/ui/src/app/entity/entity-type-select.tpl.html b/ui/src/app/entity/entity-type-select.tpl.html
deleted file mode 100644
index e4be909d43..0000000000
--- a/ui/src/app/entity/entity-type-select.tpl.html
+++ /dev/null
@@ -1,29 +0,0 @@
-
-
-
-
-
- {{typeName(type) | translate}}
-
-
-
-
diff --git a/ui/src/app/entity/index.js b/ui/src/app/entity/index.js
deleted file mode 100644
index ba6fc6b276..0000000000
--- a/ui/src/app/entity/index.js
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Copyright © 2016-2020 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 EntityAliasesController from './alias/entity-aliases.controller';
-import EntityAliasDialogController from './alias/entity-alias-dialog.controller';
-import EntityTypeSelectDirective from './entity-type-select.directive';
-import EntityTypeListDirective from './entity-type-list.directive';
-import EntitySubtypeListDirective from './entity-subtype-list.directive';
-import EntitySubtypeSelectDirective from './entity-subtype-select.directive';
-import EntitySubtypeAutocompleteDirective from './entity-subtype-autocomplete.directive';
-import EntityAutocompleteDirective from './entity-autocomplete.directive';
-import EntityListDirective from './entity-list.directive';
-import EntitySelectDirective from './entity-select.directive';
-import EntityFilterDirective from './entity-filter.directive';
-import EntityFilterViewDirective from './entity-filter-view.directive';
-import AliasesEntitySelectPanelController from './alias/aliases-entity-select-panel.controller';
-import AliasesEntitySelectDirective from './alias/aliases-entity-select.directive';
-import AddAttributeDialogController from './attribute/add-attribute-dialog.controller';
-import AddWidgetToDashboardDialogController from './attribute/add-widget-to-dashboard-dialog.controller';
-import AttributeTableDirective from './attribute/attribute-table.directive';
-import RelationFiltersDirective from './relation/relation-filters.directive';
-import RelationTableDirective from './relation/relation-table.directive';
-import RelationTypeAutocompleteDirective from './relation/relation-type-autocomplete.directive';
-
-export default angular.module('thingsboard.entity', [])
- .controller('EntityAliasesController', EntityAliasesController)
- .controller('EntityAliasDialogController', EntityAliasDialogController)
- .controller('AliasesEntitySelectPanelController', AliasesEntitySelectPanelController)
- .controller('AddAttributeDialogController', AddAttributeDialogController)
- .controller('AddWidgetToDashboardDialogController', AddWidgetToDashboardDialogController)
- .directive('tbEntityTypeSelect', EntityTypeSelectDirective)
- .directive('tbEntityTypeList', EntityTypeListDirective)
- .directive('tbEntitySubtypeList', EntitySubtypeListDirective)
- .directive('tbEntitySubtypeSelect', EntitySubtypeSelectDirective)
- .directive('tbEntitySubtypeAutocomplete', EntitySubtypeAutocompleteDirective)
- .directive('tbEntityAutocomplete', EntityAutocompleteDirective)
- .directive('tbEntityList', EntityListDirective)
- .directive('tbEntitySelect', EntitySelectDirective)
- .directive('tbEntityFilter', EntityFilterDirective)
- .directive('tbEntityFilterView', EntityFilterViewDirective)
- .directive('tbAliasesEntitySelect', AliasesEntitySelectDirective)
- .directive('tbAttributeTable', AttributeTableDirective)
- .directive('tbRelationFilters', RelationFiltersDirective)
- .directive('tbRelationTable', RelationTableDirective)
- .directive('tbRelationTypeAutocomplete', RelationTypeAutocompleteDirective)
- .name;
diff --git a/ui/src/app/entity/relation/relation-dialog.controller.js b/ui/src/app/entity/relation/relation-dialog.controller.js
deleted file mode 100644
index d427b1d2c5..0000000000
--- a/ui/src/app/entity/relation/relation-dialog.controller.js
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- * Copyright © 2016-2020 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 'brace/ext/language_tools';
-import 'brace/ext/searchbox';
-import 'brace/mode/json';
-import 'brace/theme/github';
-import beautify from 'js-beautify';
-
-import './relation-dialog.scss';
-
-const js_beautify = beautify.js;
-
-/*@ngInject*/
-export default function RelationDialogController($scope, $mdDialog, types, entityRelationService, isAdd, direction, relation, showingCallback) {
-
- var vm = this;
-
- vm.types = types;
- vm.isAdd = isAdd;
- vm.direction = direction;
-
- showingCallback.onShowing = function(scope, element) {
- updateEditorSize(element);
- }
-
- vm.relationAdditionalInfoOptions = {
- useWrapMode: false,
- mode: 'json',
- showGutter: false,
- showPrintMargin: false,
- theme: 'github',
- advanced: {
- enableSnippets: false,
- enableBasicAutocompletion: false,
- enableLiveAutocompletion: false
- },
- onLoad: function (_ace) {
- vm.editor = _ace;
- }
- };
-
- vm.relation = relation;
- if (vm.isAdd) {
- vm.relation.type = types.entityRelationType.contains;
- vm.targetEntityId = {};
- } else {
- if (vm.direction == vm.types.entitySearchDirection.from) {
- vm.targetEntityId = vm.relation.to;
- } else {
- vm.targetEntityId = vm.relation.from;
- }
- }
-
- vm.save = save;
- vm.cancel = cancel;
-
- vm.additionalInfo = '';
-
- if (vm.relation.additionalInfo) {
- vm.additionalInfo = angular.toJson(vm.relation.additionalInfo);
- vm.additionalInfo = js_beautify(vm.additionalInfo, {indent_size: 4});
- }
-
- $scope.$watch('vm.additionalInfo', () => {
- $scope.theForm.$setValidity("additionalInfo", true);
- });
-
- function updateEditorSize(element) {
- var newHeight = 200;
- angular.element('#tb-relation-additional-info', element).height(newHeight.toString() + "px");
- vm.editor.resize();
- }
-
- function cancel() {
- $mdDialog.cancel();
- }
-
- function save() {
- if (vm.isAdd) {
- if (vm.direction == vm.types.entitySearchDirection.from) {
- vm.relation.to = vm.targetEntityId;
- } else {
- vm.relation.from = vm.targetEntityId;
- }
- }
- $scope.theForm.$setPristine();
-
- var valid = true;
- if (vm.additionalInfo && vm.additionalInfo.length) {
- try {
- vm.relation.additionalInfo = angular.fromJson(vm.additionalInfo);
- } catch(e) {
- valid = false;
- }
- } else {
- vm.relation.additionalInfo = null;
- }
-
- $scope.theForm.$setValidity("additionalInfo", valid);
-
- if (valid) {
- entityRelationService.saveRelation(vm.relation).then(
- function success() {
- $mdDialog.hide();
- }
- );
- }
- }
-
-}
diff --git a/ui/src/app/entity/relation/relation-dialog.scss b/ui/src/app/entity/relation/relation-dialog.scss
deleted file mode 100644
index 8062063b9e..0000000000
--- a/ui/src/app/entity/relation/relation-dialog.scss
+++ /dev/null
@@ -1,27 +0,0 @@
-/**
- * Copyright © 2016-2020 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-relation-additional-info-panel {
- height: 100%;
- margin-left: 15px;
- border: 1px solid #c0c0c0;
-
- #tb-relation-additional-info {
- width: 100%;
- min-width: 200px;
- height: 100%;
- min-height: 200px;
- }
-}
diff --git a/ui/src/app/entity/relation/relation-dialog.tpl.html b/ui/src/app/entity/relation/relation-dialog.tpl.html
deleted file mode 100644
index 2d1d878fb1..0000000000
--- a/ui/src/app/entity/relation/relation-dialog.tpl.html
+++ /dev/null
@@ -1,73 +0,0 @@
-
-
-
-
diff --git a/ui/src/app/entity/relation/relation-filters.directive.js b/ui/src/app/entity/relation/relation-filters.directive.js
deleted file mode 100644
index 17400c5ce3..0000000000
--- a/ui/src/app/entity/relation/relation-filters.directive.js
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * Copyright © 2016-2020 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 './relation-filters.scss';
-
-/* eslint-disable import/no-unresolved, import/default */
-
-import relationFiltersTemplate from './relation-filters.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-/*@ngInject*/
-export default function RelationFilters($compile, $templateCache) {
-
- return {
- restrict: "E",
- require: "^ngModel",
- scope: {
- allowedEntityTypes: '=?'
- },
- link: linker
- };
-
- function linker( scope, element, attrs, ngModelCtrl ) {
-
- var template = $templateCache.get(relationFiltersTemplate);
- element.html(template);
-
- scope.relationFilters = [];
-
- scope.addFilter = addFilter;
- scope.removeFilter = removeFilter;
-
- ngModelCtrl.$render = function () {
- if (scope.relationFiltersWatch) {
- scope.relationFiltersWatch();
- scope.relationFiltersWatch = null;
- }
- if (ngModelCtrl.$viewValue) {
- var value = ngModelCtrl.$viewValue;
- scope.relationFilters.length = 0;
- value.forEach(function (filter) {
- scope.relationFilters.push(filter);
- });
- }
- scope.relationFiltersWatch = scope.$watch('relationFilters', function (newVal, prevVal) {
- if (!angular.equals(newVal, prevVal)) {
- updateValue();
- }
- }, true);
- }
-
- function addFilter() {
- var filter = {
- relationType: null,
- entityTypes: []
- };
- scope.relationFilters.push(filter);
- }
-
- function removeFilter($event, filter) {
- var index = scope.relationFilters.indexOf(filter);
- if (index > -1) {
- scope.relationFilters.splice(index, 1);
- }
- }
-
- function updateValue() {
- var value = ngModelCtrl.$viewValue;
- if (!value) {
- value = [];
- ngModelCtrl.$setViewValue(value);
- } else {
- value.length = 0;
- }
- scope.relationFilters.forEach(function (filter) {
- value.push(filter);
- });
- }
- $compile(element.contents())(scope);
- }
-}
diff --git a/ui/src/app/entity/relation/relation-filters.scss b/ui/src/app/entity/relation/relation-filters.scss
deleted file mode 100644
index 29ff854cdf..0000000000
--- a/ui/src/app/entity/relation/relation-filters.scss
+++ /dev/null
@@ -1,79 +0,0 @@
-/**
- * Copyright © 2016-2020 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-relation-filters {
- .header {
- padding-right: 5px;
- padding-bottom: 5px;
- padding-left: 5px;
-
- .cell {
- padding-right: 5px;
- padding-left: 5px;
- font-size: 12px;
- font-weight: 700;
- color: rgba(0, 0, 0, .54);
- white-space: nowrap;
- }
- }
-
- .body {
- max-height: 300px;
- padding-right: 5px;
- padding-bottom: 20px;
- padding-left: 5px;
- overflow: auto;
-
- .row {
- padding-top: 5px;
- }
-
- .cell {
- padding-right: 5px;
- padding-left: 5px;
-
- md-select {
- margin: 0 0 24px;
- }
-
- md-input-container {
- margin: 0;
- }
-
- md-chips-wrap {
- padding: 0;
- margin: 0 0 24px;
-
- md-autocomplete {
- height: 30px;
-
- md-autocomplete-wrap {
- height: 30px;
- }
- }
- }
-
- .md-chips .md-chip-input-container input {
- height: 26px;
- padding: 2px 2px 2px;
- line-height: 26px;
- }
- }
-
- .md-button {
- margin: 0;
- }
- }
-}
diff --git a/ui/src/app/entity/relation/relation-filters.tpl.html b/ui/src/app/entity/relation/relation-filters.tpl.html
deleted file mode 100644
index d5c1b9ac63..0000000000
--- a/ui/src/app/entity/relation/relation-filters.tpl.html
+++ /dev/null
@@ -1,67 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
- {{ 'relation.remove-relation-filter' | translate }}
-
-
- close
-
-
-
-
-
-
- relation.any-relation
-
-
-
-
- {{ 'relation.add-relation-filter' | translate }}
-
-
- add
-
- {{ 'action.add' | translate }}
-
-
-
\ No newline at end of file
diff --git a/ui/src/app/entity/relation/relation-table.directive.js b/ui/src/app/entity/relation/relation-table.directive.js
deleted file mode 100644
index 95dc4990bb..0000000000
--- a/ui/src/app/entity/relation/relation-table.directive.js
+++ /dev/null
@@ -1,293 +0,0 @@
-/*
- * Copyright © 2016-2020 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 'angular-material-data-table/dist/md-data-table.min.css';
-import './relation-table.scss';
-
-/* eslint-disable import/no-unresolved, import/default */
-
-import relationTableTemplate from './relation-table.tpl.html';
-import relationTemplate from './relation-dialog.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-import RelationController from './relation-dialog.controller';
-
-/*@ngInject*/
-export default function RelationTable() {
- return {
- restrict: "E",
- scope: true,
- bindToController: {
- entityId: '=',
- entityType: '@'
- },
- controller: RelationTableController,
- controllerAs: 'vm',
- templateUrl: relationTableTemplate
- };
-}
-
-/*@ngInject*/
-function RelationTableController($scope, $q, $mdDialog, $document, $translate, $filter, $timeout, utils, types, entityRelationService) {
-
- let vm = this;
-
- vm.types = types;
-
- vm.direction = vm.types.entitySearchDirection.from;
-
- vm.relations = [];
- vm.relationsCount = 0;
- vm.allRelations = [];
- vm.selectedRelations = [];
-
- vm.query = {
- order: 'type',
- limit: 5,
- page: 1,
- search: null
- };
-
- vm.enterFilterMode = enterFilterMode;
- vm.exitFilterMode = exitFilterMode;
- vm.onReorder = onReorder;
- vm.onPaginate = onPaginate;
- vm.addRelation = addRelation;
- vm.editRelation = editRelation;
- vm.deleteRelation = deleteRelation;
- vm.deleteRelations = deleteRelations;
- vm.reloadRelations = reloadRelations;
- vm.updateRelations = updateRelations;
-
- $scope.$watch("vm.entityId", function(newVal, prevVal) {
- if (newVal && !angular.equals(newVal, prevVal)) {
- reloadRelations();
- }
- });
-
- $scope.$watch("vm.direction", function(newVal, prevVal) {
- if (newVal && !angular.equals(newVal, prevVal)) {
- reloadRelations();
- }
- });
-
- $scope.$watch("vm.query.search", function(newVal, prevVal) {
- if (!angular.equals(newVal, prevVal) && vm.query.search != null) {
- updateRelations();
- }
- });
-
- function enterFilterMode (event) {
- let $button = angular.element(event.currentTarget);
- let $toolbarsContainer = $button.closest('.toolbarsContainer');
-
- vm.query.search = '';
-
- $timeout(()=>{
- $toolbarsContainer.find('.searchInput').focus();
- })
- }
-
- function exitFilterMode () {
- vm.query.search = null;
- updateRelations();
- }
-
- function onReorder () {
- updateRelations();
- }
-
- function onPaginate () {
- updateRelations();
- }
-
- function addRelation($event) {
- if ($event) {
- $event.stopPropagation();
- }
- openRelationDialog($event);
- }
-
- function editRelation($event, relation) {
- if ($event) {
- $event.stopPropagation();
- }
- openRelationDialog($event, relation);
- }
-
- function openRelationDialog($event, relation) {
- if ($event) {
- $event.stopPropagation();
- }
- var isAdd = false;
- if (!relation) {
- isAdd = true;
- var entityId = {
- id: vm.entityId,
- entityType: vm.entityType
- };
- relation = {};
- if (vm.direction == vm.types.entitySearchDirection.from) {
- relation.from = entityId;
- } else {
- relation.to = entityId;
- }
- }
- var onShowingCallback = {
- onShowing: function(){}
- }
- $mdDialog.show({
- controller: RelationController,
- controllerAs: 'vm',
- templateUrl: relationTemplate,
- parent: angular.element($document[0].body),
- locals: { isAdd: isAdd,
- direction: vm.direction,
- relation: relation,
- showingCallback: onShowingCallback},
- targetEvent: $event,
- fullscreen: true,
- multiple: true,
- onShowing: function(scope, element) {
- onShowingCallback.onShowing(scope, element);
- }
- }).then(function () {
- reloadRelations();
- }, function () {
- });
- }
-
- function deleteRelation($event, relation) {
- if ($event) {
- $event.stopPropagation();
- }
- if (relation) {
- var title;
- var content;
- if (vm.direction == vm.types.entitySearchDirection.from) {
- title = $translate.instant('relation.delete-to-relation-title', {entityName: relation.toName});
- content = $translate.instant('relation.delete-to-relation-text', {entityName: relation.toName});
- } else {
- title = $translate.instant('relation.delete-from-relation-title', {entityName: relation.fromName});
- content = $translate.instant('relation.delete-from-relation-text', {entityName: relation.fromName});
- }
-
- var confirm = $mdDialog.confirm()
- .targetEvent($event)
- .title(title)
- .htmlContent(content)
- .ariaLabel(title)
- .cancel($translate.instant('action.no'))
- .ok($translate.instant('action.yes'));
- $mdDialog.show(confirm).then(function () {
- entityRelationService.deleteRelation(
- relation.from.id,
- relation.from.entityType,
- relation.type,
- relation.to.id,
- relation.to.entityType).then(
- function success() {
- reloadRelations();
- }
- );
- });
- }
- }
-
- function deleteRelations($event) {
- if ($event) {
- $event.stopPropagation();
- }
- if (vm.selectedRelations && vm.selectedRelations.length > 0) {
- var title;
- var content;
- if (vm.direction == vm.types.entitySearchDirection.from) {
- title = $translate.instant('relation.delete-to-relations-title', {count: vm.selectedRelations.length}, 'messageformat');
- content = $translate.instant('relation.delete-to-relations-text');
- } else {
- title = $translate.instant('relation.delete-from-relations-title', {count: vm.selectedRelations.length}, 'messageformat');
- content = $translate.instant('relation.delete-from-relations-text');
- }
- var confirm = $mdDialog.confirm()
- .targetEvent($event)
- .title(title)
- .htmlContent(content)
- .ariaLabel(title)
- .cancel($translate.instant('action.no'))
- .ok($translate.instant('action.yes'));
- $mdDialog.show(confirm).then(function () {
- var tasks = [];
- for (var i=0;i
-
-
-
-
-
-
- {{ ('relation.search-direction.' + direction) | translate}}
-
-
-
-
-
-
diff --git a/ui/src/app/entity/relation/relation-type-autocomplete.directive.js b/ui/src/app/entity/relation/relation-type-autocomplete.directive.js
deleted file mode 100644
index 651d1d2e47..0000000000
--- a/ui/src/app/entity/relation/relation-type-autocomplete.directive.js
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * Copyright © 2016-2020 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 './relation-type-autocomplete.scss';
-
-/* eslint-disable import/no-unresolved, import/default */
-
-import relationTypeAutocompleteTemplate from './relation-type-autocomplete.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-/*@ngInject*/
-export default function RelationTypeAutocomplete($compile, $templateCache, $q, $filter, assetService, deviceService, types) {
-
- var linker = function (scope, element, attrs, ngModelCtrl) {
- var template = $templateCache.get(relationTypeAutocompleteTemplate);
- element.html(template);
-
- scope.tbRequired = angular.isDefined(scope.tbRequired) ? scope.tbRequired : false;
- scope.hideLabel = angular.isDefined(attrs.hideLabel) ? true : false;
-
- scope.relationType = null;
- scope.relationTypeSearchText = '';
- scope.relationTypes = [];
- for (var type in types.entityRelationType) {
- scope.relationTypes.push(types.entityRelationType[type]);
- }
-
- scope.fetchRelationTypes = function(searchText) {
- var deferred = $q.defer();
- var result = $filter('filter')(scope.relationTypes, {'$': searchText});
- if (result && result.length) {
- deferred.resolve(result);
- } else {
- deferred.resolve([searchText]);
- }
- return deferred.promise;
- }
-
- scope.relationTypeSearchTextChanged = function() {
- }
-
- scope.updateView = function () {
- if (!scope.disabled) {
- ngModelCtrl.$setViewValue(scope.relationType);
- }
- }
-
- ngModelCtrl.$render = function () {
- scope.relationType = ngModelCtrl.$viewValue;
- }
-
- scope.$watch('relationType', function (newValue, prevValue) {
- if (!angular.equals(newValue, prevValue)) {
- scope.updateView();
- }
- });
-
- scope.$watch('disabled', function () {
- scope.updateView();
- });
-
- $compile(element.contents())(scope);
- }
-
- return {
- restrict: "E",
- require: "^ngModel",
- link: linker,
- scope: {
- theForm: '=?',
- tbRequired: '=?',
- disabled:'=ngDisabled'
- }
- };
-}
diff --git a/ui/src/app/entity/relation/relation-type-autocomplete.scss b/ui/src/app/entity/relation/relation-type-autocomplete.scss
deleted file mode 100644
index 209f58f769..0000000000
--- a/ui/src/app/entity/relation/relation-type-autocomplete.scss
+++ /dev/null
@@ -1,26 +0,0 @@
-/**
- * Copyright © 2016-2020 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-relation-type-autocomplete {
- .tb-relation-type-item {
- display: block;
- height: 48px;
- }
-
- li {
- height: auto !important;
- white-space: normal !important;
- }
-}
diff --git a/ui/src/app/entity/relation/relation-type-autocomplete.tpl.html b/ui/src/app/entity/relation/relation-type-autocomplete.tpl.html
deleted file mode 100644
index 7a9147ecd9..0000000000
--- a/ui/src/app/entity/relation/relation-type-autocomplete.tpl.html
+++ /dev/null
@@ -1,40 +0,0 @@
-
-
-
-
- {{item}}
-
-
-
-
relation.relation-type-required
-
-
diff --git a/ui/src/app/event/event-content-dialog.controller.js b/ui/src/app/event/event-content-dialog.controller.js
deleted file mode 100644
index 271a5f2337..0000000000
--- a/ui/src/app/event/event-content-dialog.controller.js
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * Copyright © 2016-2020 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 $ from 'jquery';
-import 'brace/ext/language_tools';
-import 'brace/ext/searchbox';
-import 'brace/mode/java';
-import 'brace/theme/github';
-import beautify from 'js-beautify';
-
-/* eslint-disable angular/angularelement */
-
-const js_beautify = beautify.js;
-
-/*@ngInject*/
-export default function EventContentDialogController($mdDialog, types, content, contentType, title, showingCallback) {
-
- var vm = this;
-
- showingCallback.onShowing = function(scope, element) {
- updateEditorSize(element);
- }
-
- vm.content = content;
- vm.title = title;
-
- var mode;
- if (contentType) {
- mode = types.contentType[contentType].code;
- if (contentType == types.contentType.JSON.value && vm.content) {
- vm.content = js_beautify(vm.content, {indent_size: 4});
- }
- } else {
- mode = 'java';
- }
-
- vm.contentOptions = {
- useWrapMode: false,
- mode: mode,
- showGutter: false,
- showPrintMargin: false,
- theme: 'github',
- advanced: {
- enableSnippets: false,
- enableBasicAutocompletion: false,
- enableLiveAutocompletion: false
- },
- onLoad: function (_ace) {
- vm.editor = _ace;
- }
- };
-
- function updateEditorSize(element) {
- var newHeight = 400;
- var newWidth = 600;
- if (vm.content && vm.content.length > 0) {
- var lines = vm.content.split('\n');
- newHeight = 16 * lines.length + 16;
- var maxLineLength = 0;
- for (var i = 0; i < lines.length; i++) {
- var line = lines[i].replace(/\t/g, ' ').replace(/\n/g, '');
- var lineLength = line.length;
- maxLineLength = Math.max(maxLineLength, lineLength);
- }
- newWidth = 8 * maxLineLength + 16;
- }
- $('#tb-event-content', element).height(newHeight.toString() + "px")
- .width(newWidth.toString() + "px");
- vm.editor.resize();
- }
-
- vm.close = close;
-
- function close () {
- $mdDialog.hide();
- }
-
-}
-
-/* eslint-enable angular/angularelement */
diff --git a/ui/src/app/event/event-content-dialog.tpl.html b/ui/src/app/event/event-content-dialog.tpl.html
deleted file mode 100644
index 3959da43f4..0000000000
--- a/ui/src/app/event/event-content-dialog.tpl.html
+++ /dev/null
@@ -1,42 +0,0 @@
-
-
-
-
-
{{ vm.title }}
-
-
-
-
-
-
-
-
-
-
-
- {{ 'action.close' |
- translate }}
-
-
-
diff --git a/ui/src/app/event/event-header-debug-rulenode.tpl.html b/ui/src/app/event/event-header-debug-rulenode.tpl.html
deleted file mode 100644
index 3e2267d961..0000000000
--- a/ui/src/app/event/event-header-debug-rulenode.tpl.html
+++ /dev/null
@@ -1,27 +0,0 @@
-
-event.event-time
-event.server
-event.type
-event.entity
-event.message-id
-event.message-type
-event.relation-type
-event.data
-event.metadata
-event.error
diff --git a/ui/src/app/event/event-header-error.tpl.html b/ui/src/app/event/event-header-error.tpl.html
deleted file mode 100644
index bdad0bf29a..0000000000
--- a/ui/src/app/event/event-header-error.tpl.html
+++ /dev/null
@@ -1,21 +0,0 @@
-
-event.event-time
-event.server
-event.method
-event.error
diff --git a/ui/src/app/event/event-header-lc-event.tpl.html b/ui/src/app/event/event-header-lc-event.tpl.html
deleted file mode 100644
index a96935aafb..0000000000
--- a/ui/src/app/event/event-header-lc-event.tpl.html
+++ /dev/null
@@ -1,22 +0,0 @@
-
-event.event-time
-event.server
-event.event
-event.status
-event.error
diff --git a/ui/src/app/event/event-header-stats.tpl.html b/ui/src/app/event/event-header-stats.tpl.html
deleted file mode 100644
index 634e5cbaa3..0000000000
--- a/ui/src/app/event/event-header-stats.tpl.html
+++ /dev/null
@@ -1,21 +0,0 @@
-
-event.event-time
-event.server
-event.messages-processed
-event.errors-occurred
diff --git a/ui/src/app/event/event-header.directive.js b/ui/src/app/event/event-header.directive.js
deleted file mode 100644
index ce0fe4e81c..0000000000
--- a/ui/src/app/event/event-header.directive.js
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-/* eslint-disable import/no-unresolved, import/default */
-
-import eventHeaderLcEventTemplate from './event-header-lc-event.tpl.html';
-import eventHeaderStatsTemplate from './event-header-stats.tpl.html';
-import eventHeaderErrorTemplate from './event-header-error.tpl.html';
-import eventHeaderDebugRuleNodeTemplate from './event-header-debug-rulenode.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-/*@ngInject*/
-export default function EventHeaderDirective($compile, $templateCache, types) {
-
- var linker = function (scope, element, attrs) {
-
- var getTemplate = function(eventType) {
- var template = '';
- switch(eventType) {
- case types.eventType.lcEvent.value:
- template = eventHeaderLcEventTemplate;
- break;
- case types.eventType.stats.value:
- template = eventHeaderStatsTemplate;
- break;
- case types.eventType.error.value:
- template = eventHeaderErrorTemplate;
- break;
- case types.debugEventType.debugRuleNode.value:
- template = eventHeaderDebugRuleNodeTemplate;
- break;
- case types.debugEventType.debugRuleChain.value:
- template = eventHeaderDebugRuleNodeTemplate;
- break;
- }
- return $templateCache.get(template);
- }
-
- scope.loadTemplate = function() {
- element.html(getTemplate(attrs.eventType));
- $compile(element.contents())(scope);
- }
-
- attrs.$observe('eventType', function() {
- scope.loadTemplate();
- });
-
- }
-
- return {
- restrict: "A",
- replace: false,
- link: linker,
- scope: false
- };
-}
diff --git a/ui/src/app/event/event-row-debug-rulenode.tpl.html b/ui/src/app/event/event-row-debug-rulenode.tpl.html
deleted file mode 100644
index 19c2d9f3e3..0000000000
--- a/ui/src/app/event/event-row-debug-rulenode.tpl.html
+++ /dev/null
@@ -1,63 +0,0 @@
-
-{{event.createdTime | date : 'yyyy-MM-dd HH:mm:ss'}}
-{{event.body.server}}
-{{event.body.type}}
-{{event.body.entityName}}
-{{event.body.msgId}}
-{{event.body.msgType}}
-{{event.body.relationType}}
-
-
-
- {{ 'action.view' | translate }}
-
-
- more_horiz
-
-
-
-
-
-
- {{ 'action.view' | translate }}
-
-
- more_horiz
-
-
-
-
-
-
- {{ 'action.view' | translate }}
-
-
- more_horiz
-
-
-
diff --git a/ui/src/app/event/event-row-error.tpl.html b/ui/src/app/event/event-row-error.tpl.html
deleted file mode 100644
index e81d0077bf..0000000000
--- a/ui/src/app/event/event-row-error.tpl.html
+++ /dev/null
@@ -1,33 +0,0 @@
-
-{{event.createdTime | date : 'yyyy-MM-dd HH:mm:ss'}}
-{{event.body.server}}
-{{event.body.method}}
-
-
-
- {{ 'action.view' | translate }}
-
-
- more_horiz
-
-
-
diff --git a/ui/src/app/event/event-row-lc-event.tpl.html b/ui/src/app/event/event-row-lc-event.tpl.html
deleted file mode 100644
index 1b6715eafa..0000000000
--- a/ui/src/app/event/event-row-lc-event.tpl.html
+++ /dev/null
@@ -1,34 +0,0 @@
-
-{{event.createdTime | date : 'yyyy-MM-dd HH:mm:ss'}}
-{{event.body.server}}
-{{event.body.event}}
-{{event.body.success ? 'event.success' : 'event.failed'}}
-
-
-
- {{ 'action.view' | translate }}
-
-
- more_horiz
-
-
-
diff --git a/ui/src/app/event/event-row-stats.tpl.html b/ui/src/app/event/event-row-stats.tpl.html
deleted file mode 100644
index ce21d33b53..0000000000
--- a/ui/src/app/event/event-row-stats.tpl.html
+++ /dev/null
@@ -1,21 +0,0 @@
-
-{{event.createdTime | date : 'yyyy-MM-dd HH:mm:ss'}}
-{{event.body.server}}
-{{event.body.messagesProcessed}}
-{{event.body.errorsOccurred}}
diff --git a/ui/src/app/event/event-row.directive.js b/ui/src/app/event/event-row.directive.js
deleted file mode 100644
index eec8a1aff6..0000000000
--- a/ui/src/app/event/event-row.directive.js
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-/* eslint-disable import/no-unresolved, import/default */
-
-import eventErrorDialogTemplate from './event-content-dialog.tpl.html';
-
-import eventRowLcEventTemplate from './event-row-lc-event.tpl.html';
-import eventRowStatsTemplate from './event-row-stats.tpl.html';
-import eventRowErrorTemplate from './event-row-error.tpl.html';
-import eventRowDebugRuleNodeTemplate from './event-row-debug-rulenode.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-/*@ngInject*/
-export default function EventRowDirective($compile, $templateCache, $mdDialog, $document, types) {
-
- var linker = function (scope, element, attrs) {
-
- var getTemplate = function(eventType) {
- var template = '';
- switch(eventType) {
- case types.eventType.lcEvent.value:
- template = eventRowLcEventTemplate;
- break;
- case types.eventType.stats.value:
- template = eventRowStatsTemplate;
- break;
- case types.eventType.error.value:
- template = eventRowErrorTemplate;
- break;
- case types.debugEventType.debugRuleNode.value:
- template = eventRowDebugRuleNodeTemplate;
- break;
- case types.debugEventType.debugRuleChain.value:
- template = eventRowDebugRuleNodeTemplate;
- break;
- }
- return $templateCache.get(template);
- }
-
- scope.loadTemplate = function() {
- element.html(getTemplate(attrs.eventType));
- $compile(element.contents())(scope);
- }
-
- attrs.$observe('eventType', function() {
- scope.loadTemplate();
- });
-
- scope.types = types;
-
- scope.event = attrs.event;
-
- scope.showContent = function($event, content, title, contentType) {
- var onShowingCallback = {
- onShowing: function(){}
- }
- if (!contentType) {
- contentType = null;
- }
- $mdDialog.show({
- controller: 'EventContentDialogController',
- controllerAs: 'vm',
- templateUrl: eventErrorDialogTemplate,
- locals: {content: content, title: title, contentType: contentType, showingCallback: onShowingCallback},
- parent: angular.element($document[0].body),
- fullscreen: true,
- targetEvent: $event,
- multiple: true,
- onShowing: function(scope, element) {
- onShowingCallback.onShowing(scope, element);
- }
- });
- }
-
- scope.checkTooltip = function($event) {
- var el = $event.target;
- var $el = angular.element(el);
- if(el.offsetWidth < el.scrollWidth && !$el.attr('title')){
- $el.attr('title', $el.text());
- }
- }
-
- $compile(element.contents())(scope);
- }
-
- return {
- restrict: "A",
- replace: false,
- link: linker,
- scope: false
- };
-}
diff --git a/ui/src/app/event/event-table.directive.js b/ui/src/app/event/event-table.directive.js
deleted file mode 100644
index ff002f069e..0000000000
--- a/ui/src/app/event/event-table.directive.js
+++ /dev/null
@@ -1,224 +0,0 @@
-/*
- * Copyright © 2016-2020 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 './event.scss';
-
-/* eslint-disable import/no-unresolved, import/default */
-
-import eventTableTemplate from './event-table.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-/*@ngInject*/
-export default function EventTableDirective($compile, $templateCache, $rootScope, types, eventService) {
-
- var linker = function (scope, element, attrs) {
-
- var template = $templateCache.get(eventTableTemplate);
-
- element.html(template);
-
- if (attrs.disabledEventTypes) {
- var disabledEventTypes = attrs.disabledEventTypes.split(',');
- scope.eventTypes = {};
- for (var type in types.eventType) {
- var eventType = types.eventType[type];
- var enabled = true;
- for (var i=0;i scope.events.data.length) {
- scope.theEvents.fetchMoreItems_(index);
- return null;
- }
- var item = scope.events.data[index];
- if (item) {
- item.indexNumber = index + 1;
- }
- return item;
- },
-
- getLength: function () {
- if (scope.events.hasNext) {
- return scope.events.data.length + scope.events.nextPageLink.limit;
- } else {
- return scope.events.data.length;
- }
- },
-
- fetchMoreItems_: function () {
- if (scope.events.hasNext && !scope.events.pending) {
- if (scope.entityType && scope.entityId && scope.eventType && scope.tenantId) {
- var promise = eventService.getEvents(scope.entityType, scope.entityId,
- scope.eventType, scope.tenantId, scope.events.nextPageLink);
- if (promise) {
- scope.events.pending = true;
- promise.then(
- function success(events) {
- scope.events.data = scope.events.data.concat(events.data);
- scope.events.nextPageLink = events.nextPageLink;
- scope.events.hasNext = events.hasNext;
- if (scope.events.hasNext) {
- scope.events.nextPageLink.limit = pageSize;
- }
- scope.events.pending = false;
- },
- function fail() {
- scope.events.hasNext = false;
- scope.events.pending = false;
- });
- } else {
- scope.events.hasNext = false;
- }
- } else {
- scope.events.hasNext = false;
- }
- }
- }
- };
-
- scope.$watch("entityId", function(newVal, prevVal) {
- if (newVal && !angular.equals(newVal, prevVal)) {
- scope.resetFilter();
- scope.reload();
- }
- });
-
- scope.$watch("eventType", function(newVal, prevVal) {
- if (newVal && !angular.equals(newVal, prevVal)) {
- scope.reload();
- }
- });
-
- scope.$watch("timewindow", function(newVal, prevVal) {
- if (newVal && !angular.equals(newVal, prevVal)) {
- scope.reload();
- }
- }, true);
-
- scope.resetFilter = function() {
- scope.timewindow = {
- history: {
- timewindowMs: 24 * 60 * 60 * 1000 // 1 day
- }
- };
- scope.eventType = attrs.defaultEventType;
- }
-
- scope.updateTimeWindowRange = function() {
- if (scope.timewindow.history.timewindowMs) {
- var currentTime = (new Date).getTime();
- startTime = currentTime - scope.timewindow.history.timewindowMs;
- endTime = currentTime;
- } else {
- startTime = scope.timewindow.history.fixedTimewindow.startTimeMs;
- endTime = scope.timewindow.history.fixedTimewindow.endTimeMs;
- }
- }
-
- scope.reload = function() {
- scope.topIndex = 0;
- scope.selected = [];
- scope.updateTimeWindowRange();
- scope.events = {
- data: [],
- nextPageLink: {
- limit: pageSize,
- startTime: startTime,
- endTime: endTime
- },
- hasNext: true,
- pending: false
- };
- scope.theEvents.getItemAtIndex(pageSize);
- }
-
- scope.noData = function() {
- return scope.events.data.length == 0 && !scope.events.hasNext;
- }
-
- scope.hasData = function() {
- return scope.events.data.length > 0;
- }
-
- scope.loading = function() {
- return $rootScope.loading;
- }
-
- scope.hasScroll = function() {
- var repeatContainer = scope.repeatContainer[0];
- if (repeatContainer) {
- var scrollElement = repeatContainer.children[0];
- if (scrollElement) {
- return scrollElement.scrollHeight > scrollElement.clientHeight;
- }
- }
- return false;
- }
-
- scope.reload();
-
- $compile(element.contents())(scope);
- }
-
- return {
- restrict: "E",
- link: linker,
- scope: {
- entityType: '=',
- entityId: '=',
- tenantId: '='
- }
- };
-}
diff --git a/ui/src/app/event/event-table.tpl.html b/ui/src/app/event/event-table.tpl.html
deleted file mode 100644
index 64b033cc5c..0000000000
--- a/ui/src/app/event/event-table.tpl.html
+++ /dev/null
@@ -1,54 +0,0 @@
-
-
-
-
-
-
-
- {{type.name | translate}}
-
-
-
-
-
- refresh
-
- {{ 'action.refresh' | translate }}
-
-
-
-
-
-
-
- event.no-events-prompt
-
-
-
-
-
-
-
-
-
diff --git a/ui/src/app/event/event.scss b/ui/src/app/event/event.scss
deleted file mode 100644
index f1b5eb0d46..0000000000
--- a/ui/src/app/event/event.scss
+++ /dev/null
@@ -1,93 +0,0 @@
-/**
- * Copyright © 2016-2020 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.
- */
-md-list.tb-event-table {
- padding: 0;
-
- md-list-item {
- padding: 0;
- }
-
- .tb-row {
- height: 48px;
- padding: 0;
- overflow: hidden;
-
- .tb-cell {
- text-overflow: ellipsis;
-
- &.tb-scroll {
- overflow-x: auto;
- overflow-y: hidden;
- white-space: nowrap;
- }
-
- &.tb-nowrap {
- white-space: nowrap;
- }
- }
- }
-
- .tb-row:hover {
- background-color: #eee;
- }
-
- .tb-header:hover {
- background: none;
- }
-
- .tb-header {
- .tb-cell {
- font-size: 12px;
- font-weight: 700;
- color: rgba(0, 0, 0, .54);
- white-space: nowrap;
- background: none;
- }
- }
-
- .tb-cell {
- &:first-child {
- padding-left: 14px;
- }
-
- &:last-child {
- padding-right: 14px;
- }
- padding: 0 6px;
- margin: auto 0;
- overflow: hidden;
- font-size: 13px;
- color: rgba(0, 0, 0, .87);
- text-align: left;
- vertical-align: middle;
-
- .md-button {
- padding: 0;
- margin: 0;
- }
- }
-
- .tb-cell.tb-number {
- text-align: right;
- }
-}
-
-#tb-event-content {
- width: 100%;
- min-width: 400px;
- height: 100%;
- min-height: 50px;
-}
diff --git a/ui/src/app/event/index.js b/ui/src/app/event/index.js
deleted file mode 100644
index 69227eef8b..0000000000
--- a/ui/src/app/event/index.js
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright © 2016-2020 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 thingsboardApiEvent from '../api/event.service';
-
-import EventContentDialogController from './event-content-dialog.controller';
-import EventHeaderDirective from './event-header.directive';
-import EventRowDirective from './event-row.directive';
-import EventTableDirective from './event-table.directive';
-
-export default angular.module('thingsboard.event', [
- thingsboardApiEvent
-])
- .controller('EventContentDialogController', EventContentDialogController)
- .directive('tbEventHeader', EventHeaderDirective)
- .directive('tbEventRow', EventRowDirective)
- .directive('tbEventTable', EventTableDirective)
- .name;
diff --git a/ui/src/app/extension/extension-dialog.controller.js b/ui/src/app/extension/extension-dialog.controller.js
deleted file mode 100644
index ceb5d198cd..0000000000
--- a/ui/src/app/extension/extension-dialog.controller.js
+++ /dev/null
@@ -1,297 +0,0 @@
-/*
- * Copyright © 2016-2020 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 beautify from 'js-beautify';
-
-const js_beautify = beautify.js;
-
-/*@ngInject*/
-export default function ExtensionDialogController($scope, $mdDialog, $translate, isAdd, allExtensions, entityId, entityType, extension, types, attributeService) {
-
- var vm = this;
-
- vm.types = types;
- vm.isAdd = isAdd;
- vm.entityType = entityType;
- vm.entityId = entityId;
- vm.allExtensions = allExtensions;
-
-
- if (extension) {
- vm.extension = angular.copy(extension);
- editTransformers(vm.extension);
- } else {
- vm.extension = {};
- }
-
-
- vm.extensionTypeChange = function () {
-
- if (vm.extension.type === "HTTP") {
- vm.extension.configuration = {
- "converterConfigurations": []
- };
- }
- if (vm.extension.type === "MQTT") {
- vm.extension.configuration = {
- "brokers": []
- };
- }
- if (vm.extension.type === "OPC UA" || vm.extension.type === "MODBUS") {
- vm.extension.configuration = {
- "servers": []
- };
- }
- };
-
- vm.cancel = cancel;
- function cancel() {
- $mdDialog.cancel();
- }
-
- vm.save = save;
- function save() {
- let $errorElement = angular.element('[name=theForm]').find('.ng-invalid');
-
- if ($errorElement.length) {
-
- let $mdDialogScroll = angular.element('md-dialog-content').scrollTop();
- let $mdDialogTop = angular.element('md-dialog-content').offset().top;
- let $errorElementTop = angular.element('[name=theForm]').find('.ng-invalid').eq(0).offset().top;
-
-
- if ($errorElementTop !== $mdDialogTop) {
- angular.element('md-dialog-content').animate({
- scrollTop: $mdDialogScroll + ($errorElementTop - $mdDialogTop) - 50
- }, 500);
- $errorElement.eq(0).focus();
- }
- } else {
-
- if(vm.isAdd) {
- vm.allExtensions.push(vm.extension);
- } else {
- var index = vm.allExtensions.indexOf(extension);
- if(index > -1) {
- vm.allExtensions[index] = vm.extension;
- }
- }
-
- $mdDialog.hide();
- saveTransformers();
-
- var editedValue = angular.toJson(vm.allExtensions);
-
- attributeService
- .saveEntityAttributes(
- vm.entityType,
- vm.entityId,
- types.attributesScope.shared.value,
- [{key:"configuration", value:editedValue}]
- )
- .then(function success() {
- });
-
- }
- }
-
- vm.validateId = function() {
- var coincidenceArray = vm.allExtensions.filter(function(ext) {
- return ext.id == vm.extension.id;
- });
- if(coincidenceArray.length) {
- if(!vm.isAdd) {
- if(coincidenceArray[0].id == extension.id) {
- $scope.theForm.extensionId.$setValidity('uniqueIdValidation', true);
- } else {
- $scope.theForm.extensionId.$setValidity('uniqueIdValidation', false);
- }
- } else {
- $scope.theForm.extensionId.$setValidity('uniqueIdValidation', false);
- }
- } else {
- $scope.theForm.extensionId.$setValidity('uniqueIdValidation', true);
- }
- };
-
- function saveTransformers() {
- if(vm.extension.type == types.extensionType.http) {
- var config = vm.extension.configuration.converterConfigurations;
- if(config && config.length > 0) {
- for(let i=0;i 0) {
- for(let i=0;i 0) {
- for(let j=0;j 0) {
- for(let j=0;j 0) {
- for(let j=0;j 0) {
- for(let j=0;j 0) {
- for(let j=0;j 0) {
- for(let j=0;j 0) {
- for(let j=0;j 0) {
- for(let j=0;j
-
-
-
\ No newline at end of file
diff --git a/ui/src/app/extension/extension-table.directive.js b/ui/src/app/extension/extension-table.directive.js
deleted file mode 100644
index 853c51d538..0000000000
--- a/ui/src/app/extension/extension-table.directive.js
+++ /dev/null
@@ -1,409 +0,0 @@
-/*
- * Copyright © 2016-2020 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 'angular-material-data-table/dist/md-data-table.min.css';
-import './extension-table.scss';
-
-/* eslint-disable import/no-unresolved, import/default */
-
-import extensionTableTemplate from './extension-table.tpl.html';
-import extensionDialogTemplate from './extension-dialog.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-import ExtensionDialogController from './extension-dialog.controller'
-import $ from 'jquery';
-
-/*@ngInject*/
-export default function ExtensionTableDirective() {
- return {
- restrict: "E",
- scope: true,
- bindToController: {
- entityId: '=',
- entityType: '@',
- inWidget: '@?',
- ctx: '=?',
- entityName: '='
- },
- controller: ExtensionTableController,
- controllerAs: 'vm',
- templateUrl: extensionTableTemplate
- };
-}
-
-/*@ngInject*/
-function ExtensionTableController($scope, $filter, $document, $translate, $timeout, $mdDialog, types, attributeService, telemetryWebsocketService, importExport) {
-
- let vm = this;
-
- vm.extensions = [];
- vm.allExtensions = [];
- vm.selectedExtensions = [];
- vm.extensionsCount = 0;
-
- vm.query = {
- order: 'id',
- limit: 5,
- page: 1,
- search: null
- };
-
- vm.enterFilterMode = enterFilterMode;
- vm.exitFilterMode = exitFilterMode;
- vm.onReorder = onReorder;
- vm.onPaginate = onPaginate;
- vm.addExtension = addExtension;
- vm.editExtension = editExtension;
- vm.deleteExtension = deleteExtension;
- vm.deleteExtensions = deleteExtensions;
- vm.reloadExtensions = reloadExtensions;
- vm.updateExtensions = updateExtensions;
-
- $scope.$watch("vm.entityId", function(newVal) {
- if (newVal) {
- if ($scope.subscriber) {
- telemetryWebsocketService.unsubscribe($scope.subscriber);
- $scope.subscriber = null;
- }
-
- vm.subscribed = false;
- vm.syncLastTime = $translate.instant('extension.sync.not-available');
-
- subscribeForClientAttributes();
-
- reloadExtensions();
- }
- });
-
- $scope.$on('$destroy', function() {
- if ($scope.subscriber) {
- telemetryWebsocketService.unsubscribe($scope.subscriber);
- $scope.subscriber = null;
- }
- });
-
- $scope.$watch("vm.query.search", function(newVal, prevVal) {
- if (!angular.equals(newVal, prevVal) && vm.query.search != null) {
- updateExtensions();
- }
- });
-
- $scope.$watch('vm.selectedExtensions.length', function (newLength) {
- var selectionMode = newLength ? true : false;
- if (vm.ctx) {
- if (selectionMode) {
- vm.ctx.hideTitlePanel = true;
- $scope.$emit("selectedExtensions", true);
- } else if (vm.query.search == null) {
- vm.ctx.hideTitlePanel = false;
- $scope.$emit("selectedExtensions", false);
- }
- }
- });
-
- $scope.$on("showSearch", function($event, source) {
- if(source.entityId == vm.entityId) {
- enterFilterMode();
- $scope.$emit("filterMode", true);
- }
- });
- $scope.$on("refreshExtensions", function($event, source) {
- if(source.entityId == vm.entityId) {
- reloadExtensions();
- }
- });
- $scope.$on("addExtension", function($event, source) {
- if(source.entityId == vm.entityId) {
- addExtension();
- }
- });
- $scope.$on("exportExtensions", function($event, source) {
- if(source.entityId == vm.entityId) {
- vm.exportExtensions(source.entityName);
- }
- });
- $scope.$on("importExtensions", function($event, source) {
- if(source.entityId == vm.entityId) {
- vm.importExtensions();
- }
- });
-
- function enterFilterMode(event) {
- let $button = angular.element(event.currentTarget);
- let $toolbarsContainer = $button.closest('.toolbarsContainer');
-
- vm.query.search = '';
- if(vm.inWidget) {
- vm.ctx.hideTitlePanel = true;
- }
- $timeout(()=>{
- $toolbarsContainer.find('.searchInput').focus();
- })
- }
-
- function exitFilterMode() {
- vm.query.search = null;
- updateExtensions();
- if(vm.inWidget) {
- vm.ctx.hideTitlePanel = false;
- $scope.$emit("filterMode", false);
- }
- }
-
- function onReorder() {
- updateExtensions();
- }
-
- function onPaginate() {
- updateExtensions();
- }
-
- function addExtension($event) {
- if ($event) {
- $event.stopPropagation();
- }
- openExtensionDialog($event);
- }
-
- function editExtension($event, extension) {
- if ($event) {
- $event.stopPropagation();
- }
- openExtensionDialog($event, extension);
- }
-
- function openExtensionDialog($event, extension) {
- if ($event) {
- $event.stopPropagation();
- }
- var isAdd = false;
- if(!extension) {
- isAdd = true;
- }
- $mdDialog.show({
- controller: ExtensionDialogController,
- controllerAs: 'vm',
- templateUrl: extensionDialogTemplate,
- parent: angular.element($document[0].body),
- locals: {
- isAdd: isAdd,
- allExtensions: vm.allExtensions,
- entityId: vm.entityId,
- entityType: vm.entityType,
- extension: extension
- },
- bindToController: true,
- targetEvent: $event,
- fullscreen: true,
- multiple: true
- }).then(function() {
- reloadExtensions();
- }, function () {
- });
- }
-
- function deleteExtension($event, extension) {
- if ($event) {
- $event.stopPropagation();
- }
- if(extension) {
- var title = $translate.instant('extension.delete-extension-title', {extensionId: extension.id});
- var content = $translate.instant('extension.delete-extension-text');
-
- var confirm = $mdDialog.confirm()
- .targetEvent($event)
- .title(title)
- .htmlContent(content)
- .ariaLabel(title)
- .cancel($translate.instant('action.no'))
- .ok($translate.instant('action.yes'));
- $mdDialog.show(confirm).then(function() {
- var editedExtensions = vm.allExtensions.filter(function(ext) {
- return ext.id !== extension.id;
- });
- var editedValue = angular.toJson(editedExtensions);
- attributeService.saveEntityAttributes(vm.entityType, vm.entityId, types.attributesScope.shared.value, [{key:"configuration", value:editedValue}]).then(
- function success() {
- reloadExtensions();
- }
- );
- });
- }
- }
-
- function deleteExtensions($event) {
- if ($event) {
- $event.stopPropagation();
- }
- if (vm.selectedExtensions && vm.selectedExtensions.length > 0) {
- var title = $translate.instant('extension.delete-extensions-title', {count: vm.selectedExtensions.length}, 'messageformat');
- var content = $translate.instant('extension.delete-extensions-text');
-
- var confirm = $mdDialog.confirm()
- .targetEvent($event)
- .title(title)
- .htmlContent(content)
- .ariaLabel(title)
- .cancel($translate.instant('action.no'))
- .ok($translate.instant('action.yes'));
- $mdDialog.show(confirm).then(function () {
- var editedExtensions = angular.copy(vm.allExtensions);
- for (var i = 0; i < vm.selectedExtensions.length; i++) {
- editedExtensions = editedExtensions.filter(function (ext) {
- return ext.id !== vm.selectedExtensions[i].id;
- });
- }
- var editedValue = angular.toJson(editedExtensions);
- attributeService.saveEntityAttributes(vm.entityType, vm.entityId, types.attributesScope.shared.value, [{key:"configuration", value:editedValue}]).then(
- function success() {
- reloadExtensions();
- }
- );
- });
- }
- }
-
- function reloadExtensions() {
- vm.subscribed = false;
- vm.allExtensions.length = 0;
- vm.extensions.length = 0;
- vm.extensionsPromise = attributeService.getEntityAttributesValues(vm.entityType, vm.entityId, types.attributesScope.shared.value, ["configuration"]);
- vm.extensionsPromise.then(
- function success(data) {
- if (data.length) {
- vm.allExtensions = angular.fromJson(data[0].value);
- } else {
- vm.allExtensions = [];
- }
-
- vm.selectedExtensions = [];
- updateExtensions();
- vm.extensionsPromise = null;
- },
- function fail() {
- vm.extensions = [];
- vm.selectedExtensions = [];
- updateExtensions();
- vm.extensionsPromise = null;
- }
- );
- }
-
- function updateExtensions() {
- vm.selectedExtensions = [];
- var result = $filter('orderBy')(vm.allExtensions, vm.query.order);
- if (vm.query.search != null) {
- result = $filter('filter')(result, function(extension) {
- if(!vm.query.search || (extension.id.indexOf(vm.query.search) != -1) || (extension.type.indexOf(vm.query.search) != -1)) {
- return true;
- }
- return false;
- });
- }
- vm.extensionsCount = result.length;
- var startIndex = vm.query.limit * (vm.query.page - 1);
- vm.extensions = result.slice(startIndex, startIndex + vm.query.limit);
-
- vm.extensionsJSON = angular.toJson(vm.extensions);
- checkForSync();
- }
-
- function subscribeForClientAttributes() {
- if (!vm.subscribed) {
- if (vm.entityId && vm.entityType) {
- $scope.subscriber = {
- subscriptionCommands: [{
- entityType: vm.entityType,
- entityId: vm.entityId,
- scope: 'CLIENT_SCOPE'
- }],
- type: 'attribute',
- onData: function (data) {
- if (data.data) {
- onSubscriptionData(data.data);
- }
- vm.subscribed = true;
- }
- };
- telemetryWebsocketService.subscribe($scope.subscriber);
- }
- }
- }
- function onSubscriptionData(data) {
-
- if ($.isEmptyObject(data)) {
- vm.appliedConfiguration = undefined;
- } else {
- if (data.appliedConfiguration && data.appliedConfiguration[0] && data.appliedConfiguration[0][1]) {
- vm.appliedConfiguration = data.appliedConfiguration[0][1];
- }
- }
-
- updateExtensions();
- $scope.$digest();
- }
-
-
- function checkForSync() {
- if (vm.appliedConfiguration && vm.extensionsJSON && vm.appliedConfiguration === vm.extensionsJSON) {
- vm.syncStatus = $translate.instant('extension.sync.sync');
- vm.syncLastTime = formatDate();
- $scope.isSync = true;
- } else {
- vm.syncStatus = $translate.instant('extension.sync.not-sync');
-
- $scope.isSync = false;
- }
- }
-
- function formatDate(date) {
- let d;
- if (date) {
- d = date;
- } else {
- d = new Date();
- }
-
- d = d.getFullYear() +'/'+ addZero(d.getMonth()+1) +'/'+ addZero(d.getDate()) + ' ' + addZero(d.getHours()) + ':' + addZero(d.getMinutes()) +':'+ addZero(d.getSeconds());
- return d;
-
- function addZero(num) {
- if ((angular.isNumber(num) && num < 10) || (angular.isString(num) && num.length === 1)) {
- num = '0' + num;
- }
- return num;
- }
- }
-
- vm.importExtensions = function($event) {
- importExport.importExtension($event, {"entityType":vm.entityType, "entityId":vm.entityId, "successFunc":reloadExtensions});
- };
- vm.exportExtensions = function(widgetSourceEntityName) {
- if(vm.inWidget) {
- importExport.exportToPc(vm.extensionsJSON, widgetSourceEntityName + '_configuration.json');
- } else {
- importExport.exportToPc(vm.extensionsJSON, vm.entityName + '_configuration.json');
- }
- };
-
- /*change function for widget implementing, like vm.exportExtensions*/
- vm.exportExtension = function($event, extension) {
- if ($event) {
- $event.stopPropagation();
- }
- importExport.exportToPc(extension, vm.entityName +'_'+ extension.id +'_configuration.json');
- };
-}
\ No newline at end of file
diff --git a/ui/src/app/extension/extension-table.scss b/ui/src/app/extension/extension-table.scss
deleted file mode 100644
index 259141540e..0000000000
--- a/ui/src/app/extension/extension-table.scss
+++ /dev/null
@@ -1,52 +0,0 @@
-/**
- * Copyright © 2016-2020 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";
-
-
-.extension-table {
- md-input-container .md-errors-spacer {
- min-height: 0;
- }
-
- /*
- &.tb-data-table table.md-table tbody tr td.tb-action-cell,
- &.tb-data-table table.md-table.md-row-select tbody tr td.tb-action-cell {
- width: 114px;
- }
- */
-
- .sync-widget {
- max-height: 90px;
- overflow: hidden;
- }
-
- .toolbar-widget {
- min-height: 39px;
- max-height: 39px;
- }
-}
-
-.extension__syncStatus--black {
- color: #000 !important;
-}
-
-.extension__syncStatus--green {
- color: #228634 !important;
-}
-
-.extension__syncStatus--red {
- color: #862222 !important;
-}
diff --git a/ui/src/app/extension/extension-table.tpl.html b/ui/src/app/extension/extension-table.tpl.html
deleted file mode 100644
index 96178875db..0000000000
--- a/ui/src/app/extension/extension-table.tpl.html
+++ /dev/null
@@ -1,158 +0,0 @@
-
-
-
-
-
\ No newline at end of file
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
deleted file mode 100644
index 5cc2594fea..0000000000
--- a/ui/src/app/extension/extensions-forms/extension-form-http.directive.js
+++ /dev/null
@@ -1,147 +0,0 @@
-/*
- * Copyright © 2016-2020 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 'brace/ext/language_tools';
-import 'brace/ext/searchbox';
-import 'brace/mode/json';
-import 'brace/theme/github';
-
-import './extension-form.scss';
-
-/* eslint-disable angular/log */
-
-import extensionFormHttpTemplate from './extension-form-http.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-/*@ngInject*/
-export default function ExtensionFormHttpDirective($compile, $templateCache, $translate, types) {
-
- var linker = function(scope, element) {
-
- var template = $templateCache.get(extensionFormHttpTemplate);
- element.html(template);
-
- scope.types = types;
- scope.theForm = scope.$parent.theForm;
-
- scope.extensionCustomTransformerOptions = {
- useWrapMode: false,
- mode: 'json',
- showGutter: true,
- showPrintMargin: true,
- theme: 'github',
- advanced: {
- enableSnippets: true,
- enableBasicAutocompletion: true,
- enableLiveAutocompletion: true
- },
- onLoad: function(_ace) {
- _ace.$blockScrolling = 1;
- }
- };
-
-
- scope.addConverterConfig = function() {
- var newConverterConfig = {converterId:"", converters:[]};
- scope.converterConfigs.push(newConverterConfig);
-
- scope.converterConfigs[scope.converterConfigs.length - 1].converters = [];
- scope.addConverter(scope.converterConfigs[scope.converterConfigs.length - 1].converters);
- };
-
- scope.removeConverterConfig = function(config) {
- var index = scope.converterConfigs.indexOf(config);
- if (index > -1) {
- scope.converterConfigs.splice(index, 1);
- }
- };
-
- scope.addConverter = function(converters) {
- var newConverter = {
- deviceNameJsonExpression:"",
- deviceTypeJsonExpression:"",
- attributes:[],
- timeseries:[]
- };
- converters.push(newConverter);
- };
-
- scope.removeConverter = function(converter, converters) {
- var index = converters.indexOf(converter);
- if (index > -1) {
- converters.splice(index, 1);
- }
- };
-
- scope.addAttribute = function(attributes) {
- var newAttribute = {type:"", key:"", value:""};
- attributes.push(newAttribute);
- };
-
- scope.removeAttribute = function(attribute, attributes) {
- var index = attributes.indexOf(attribute);
- if (index > -1) {
- attributes.splice(index, 1);
- }
- };
-
-
- if(scope.isAdd) {
- scope.converterConfigs = scope.config.converterConfigurations;
- scope.addConverterConfig();
- } else {
- scope.converterConfigs = scope.config.converterConfigurations;
- }
-
- scope.transformerTypeChange = function(attribute) {
- attribute.transformer = "";
- };
-
- scope.validateTransformer = function (model, editorName) {
- if(model && model.length) {
- try {
- angular.fromJson(model);
- scope.theForm[editorName].$setValidity('transformerJSON', true);
- } catch(e) {
- scope.theForm[editorName].$setValidity('transformerJSON', false);
- }
- }
- };
-
- scope.collapseValidation = function(index, id) {
- var invalidState = angular.element('#'+id+':has(.ng-invalid)');
- if(invalidState.length) {
- invalidState.addClass('inner-invalid');
- }
- };
-
- scope.expandValidation = function (index, id) {
- var invalidState = angular.element('#'+id);
- invalidState.removeClass('inner-invalid');
- };
-
- $compile(element.contents())(scope);
- };
-
- return {
- restrict: "A",
- link: linker,
- scope: {
- config: "=",
- isAdd: "="
- }
- }
-}
\ No newline at end of file
diff --git a/ui/src/app/extension/extensions-forms/extension-form-http.tpl.html b/ui/src/app/extension/extensions-forms/extension-form-http.tpl.html
deleted file mode 100644
index 4e4f846b88..0000000000
--- a/ui/src/app/extension/extensions-forms/extension-form-http.tpl.html
+++ /dev/null
@@ -1,311 +0,0 @@
-
-
-
-
- extension.configuration
-
-
-
-
-
-
- {{ 'extension.converter-configurations' | translate }}
-
-
-
-
- -
-
-
-
- {{ 'action.remove' | translate }}
-
-
-
-
-
-
-
-
-
-
extension.field-required
-
-
-
-
-
-
-
-
-
- {{ 'extension.converters' | translate }}
-
-
-
-
- -
-
-
-
- {{ 'action.remove' | translate }}
-
-
-
-
-
-
-
-
-
extension.field-required
-
-
-
-
-
-
-
extension.field-required
-
-
-
-
-
-
- {{ 'extension.attributes' | translate }}
-
-
-
-
- -
-
-
-
- {{ 'action.remove' | translate }}
-
-
-
-
-
-
-
-
-
-
extension.field-required
-
-
-
-
-
-
- {{attrTypeValue | translate}}
-
-
-
-
extension.field-required
-
-
-
-
-
-
-
-
-
extension.field-required
-
-
-
-
-
-
-
-
- {{value | translate}}
-
-
-
-
-
-
-
extension.transformer-json
-
-
-
extension.json-required
-
extension.json-parse
-
-
-
-
-
-
-
-
-
-
-
- add
- extension.add-attribute
-
-
-
-
-
-
-
-
-
-
- {{ 'extension.timeseries' | translate }}
-
-
-
-
- -
-
-
-
- {{ 'action.remove' | translate }}
-
-
-
-
-
-
-
-
-
-
extension.field-required
-
-
-
-
-
-
- {{attrTypeValue | translate}}
-
-
-
-
extension.field-required
-
-
-
-
-
-
-
-
-
extension.field-required
-
-
-
-
-
-
-
-
- {{value | translate}}
-
-
-
-
-
-
-
extension.transformer-json
-
-
-
extension.json-required
-
extension.json-parse
-
-
-
-
-
-
-
-
-
-
-
- add
- extension.add-timeseries
-
-
-
-
-
-
-
-
-
-
-
-
- add
- extension.add-converter
-
-
-
-
-
-
-
-
-
-
-
-
-
- add
- extension.add-config
-
-
-
-
-
-
-
-
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
deleted file mode 100644
index 2e01d51591..0000000000
--- a/ui/src/app/extension/extensions-forms/extension-form-modbus.directive.js
+++ /dev/null
@@ -1,166 +0,0 @@
-/*
- * Copyright © 2016-2020 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 'brace/ext/language_tools';
-import 'brace/ext/searchbox';
-import 'brace/mode/json';
-import 'brace/theme/github';
-
-import './extension-form.scss';
-
-/* eslint-disable angular/log */
-
-import extensionFormModbusTemplate from './extension-form-modbus.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-/*@ngInject*/
-export default function ExtensionFormModbusDirective($compile, $templateCache, $translate, types) {
-
-
- var linker = function(scope, element) {
-
- function TcpTransport() {
- this.type = "tcp",
- this.host = "localhost",
- this.port = 502,
- this.timeout = 5000,
- this.reconnect = true,
- this.rtuOverTcp = false
- }
-
- function UdpTransport() {
- this.type = "udp",
- this.host = "localhost",
- this.port = 502,
- this.timeout = 5000
- }
-
- function RtuTransport() {
- this.type = "rtu",
- this.portName = "COM1",
- this.encoding = "ascii",
- this.timeout = 5000,
- this.baudRate = 115200,
- this.dataBits = 7,
- this.stopBits = 1,
- this.parity ="even"
- }
-
- function Server() {
- this.transport = new TcpTransport();
- this.devices = []
- }
-
- function Device() {
- this.unitId = 1;
- this.deviceName = "";
- this.attributesPollPeriod = 1000;
- this.timeseriesPollPeriod = 1000;
- this.attributes = [];
- this.timeseries = [];
- }
-
- function Tag(globalPollPeriod) {
- this.tag = "";
- this.type = "long";
- this.pollPeriod = globalPollPeriod;
- this.functionCode = 3;
- this.address = 0;
- this.registerCount = 1;
- this.bit = 0;
- this.byteOrder = "BIG";
- }
-
-
- var template = $templateCache.get(extensionFormModbusTemplate);
- element.html(template);
-
- scope.types = types;
- scope.theForm = scope.$parent.theForm;
-
-
- if (!scope.configuration.servers.length) {
- scope.configuration.servers.push(new Server());
- }
-
- scope.addServer = function(serversList) {
- serversList.push(new Server());
- scope.theForm.$setDirty();
- };
-
- scope.addDevice = function(deviceList) {
- deviceList.push(new Device());
- scope.theForm.$setDirty();
- };
-
- scope.addNewAttribute = function(device) {
- device.attributes.push(new Tag(device.attributesPollPeriod));
- scope.theForm.$setDirty();
- };
-
- scope.addNewTimeseries = function(device) {
- device.timeseries.push(new Tag(device.timeseriesPollPeriod));
- scope.theForm.$setDirty();
- };
-
- scope.removeItem = (item, itemList) => {
- var index = itemList.indexOf(item);
- if (index > -1) {
- itemList.splice(index, 1);
- }
- scope.theForm.$setDirty();
- };
-
- scope.onTransportChanged = function(server) {
- var type = server.transport.type;
-
- if (type === "tcp") {
- server.transport = new TcpTransport();
- } else if (type === "udp") {
- server.transport = new UdpTransport();
- } else if (type === "rtu") {
- server.transport = new RtuTransport();
- }
-
- scope.theForm.$setDirty();
- };
-
- $compile(element.contents())(scope);
-
-
- scope.collapseValidation = function(index, id) {
- var invalidState = angular.element('#'+id+':has(.ng-invalid)');
- if(invalidState.length) {
- invalidState.addClass('inner-invalid');
- }
- };
-
- scope.expandValidation = function (index, id) {
- var invalidState = angular.element('#'+id);
- invalidState.removeClass('inner-invalid');
- };
-
- };
-
- return {
- restrict: "A",
- link: linker,
- scope: {
- configuration: "=",
- isAdd: "="
- }
- }
-}
\ No newline at end of file
diff --git a/ui/src/app/extension/extensions-forms/extension-form-modbus.tpl.html b/ui/src/app/extension/extensions-forms/extension-form-modbus.tpl.html
deleted file mode 100644
index 25dece44c3..0000000000
--- a/ui/src/app/extension/extensions-forms/extension-form-modbus.tpl.html
+++ /dev/null
@@ -1,794 +0,0 @@
-
-
-
-
- extension.configuration
-
-
-
-
-
-
-
- {{ 'extension.modbus-server' | translate }}
-
-
-
-
- extension.modbus-add-server-prompt
-
-
-
-
- -
-
-
-
- {{ 'action.remove' | translate }}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
extension.field-required
-
-
-
-
-
-
-
-
-
-
-
-
extension.field-required
-
-
-
-
-
-
-
-
extension.field-required
-
extension.port-range
-
extension.port-range
-
-
-
-
-
-
-
-
extension.field-required
-
-
-
-
-
-
- {{ 'extension.modbus-tcp-reconnect' | translate }}
-
-
-
-
- {{ 'extension.modbus-rtu-over-tcp' | translate }}
-
-
-
-
-
-
-
-
-
-
-
-
-
extension.field-required
-
-
-
-
-
-
-
-
extension.field-required
-
-
-
-
-
-
-
-
-
-
-
-
extension.field-required
-
-
-
-
-
-
-
- {{parityValue}}
-
-
-
-
extension.field-required
-
-
-
-
-
-
-
-
-
-
-
extension.field-required
-
-
-
-
-
-
-
-
extension.field-required
-
extension.modbus-databits-range
-
extension.modbus-databits-range
-
-
-
-
-
-
-
-
extension.field-required
-
extension.modbus-stopbits-range
-
extension.modbus-stopbits-range
-
-
-
-
-
-
-
-
- {{ 'extension.mapping' | translate }}
-
-
-
-
- -
-
-
-
- {{ 'action.remove' | translate }}
-
-
-
-
-
-
-
-
-
-
-
extension.field-required
-
-
-
-
-
-
-
-
-
extension.field-required
-
extension.modbus-unit-id-range
-
extension.modbus-unit-id-range
-
-
-
-
-
-
-
-
-
-
-
extension.field-required
-
extension.modbus-poll-period-range
-
-
-
-
-
-
-
-
-
extension.field-required
-
extension.modbus-poll-period-range
-
-
-
-
-
-
-
-
-
- {{ 'extension.attributes' | translate }}
-
-
-
-
- -
-
-
-
- {{ 'action.remove' | translate }}
-
-
-
-
-
-
-
-
-
-
-
extension.field-required
-
-
-
-
-
-
-
- {{attrTypeValue | translate}}
-
-
-
-
extension.field-required
-
-
-
-
-
-
-
-
-
extension.modbus-poll-period-range
-
-
-
-
-
-
-
-
-
- {{functionName}}
-
-
-
-
extension.field-required
-
-
-
-
-
-
-
-
-
extension.field-required
-
extension.modbus-register-address-range
-
extension.modbus-register-address-range
-
-
-
-
-
-
-
-
-
-
-
-
extension.modbus-register-count-range
-
-
-
-
-
-
-
-
-
extension.field-required
-
extension.modbus-register-bit-index-range
-
extension.modbus-register-bit-index-range
-
-
-
-
-
-
-
-
-
-
extension.field-required
-
-
-
-
-
-
-
-
-
-
-
-
-
- add
- extension.add-attribute
-
-
-
-
-
-
-
-
-
- {{ 'extension.timeseries' | translate }}
-
-
-
-
- -
-
-
-
- {{ 'action.remove' | translate }}
-
-
-
-
-
-
-
-
-
-
-
extension.field-required
-
-
-
-
-
-
-
- {{attrTypeValue | translate}}
-
-
-
-
extension.field-required
-
-
-
-
-
-
-
-
-
extension.modbus-poll-period-range
-
-
-
-
-
-
-
-
-
- {{functionName}}
-
-
-
-
extension.field-required
-
-
-
-
-
-
-
-
-
extension.field-required
-
extension.modbus-register-address-range
-
extension.modbus-register-address-range
-
-
-
-
-
-
-
-
-
-
-
extension.modbus-register-count-range
-
-
-
-
-
-
-
-
-
extension.field-required
-
extension.modbus-register-bit-index-range
-
extension.modbus-register-bit-index-range
-
-
-
-
-
-
-
-
-
-
extension.field-required
-
-
-
-
-
-
-
-
-
-
-
- add
- extension.add-timeseries
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- add
- extension.add-device
-
-
-
-
-
-
-
-
-
-
-
-
-
- add
- extension.modbus-add-server
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/ui/src/app/extension/extensions-forms/extension-form-mqtt.directive.js b/ui/src/app/extension/extensions-forms/extension-form-mqtt.directive.js
deleted file mode 100644
index 22c58187ae..0000000000
--- a/ui/src/app/extension/extensions-forms/extension-form-mqtt.directive.js
+++ /dev/null
@@ -1,346 +0,0 @@
-/*
- * Copyright © 2016-2020 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 './extension-form.scss';
-
-/* eslint-disable angular/log */
-
-import extensionFormMqttTemplate from './extension-form-mqtt.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-/*@ngInject*/
-export default function ExtensionFormHttpDirective($compile, $templateCache, $translate, types) {
-
- var linker = function(scope, element) {
-
- var template = $templateCache.get(extensionFormMqttTemplate);
- element.html(template);
-
- scope.types = types;
- scope.theForm = scope.$parent.theForm;
-
- scope.deviceNameExpressions = {
- deviceNameJsonExpression: "extension.converter-json",
- deviceNameTopicExpression: "extension.topic"
- };
- scope.deviceTypeExpressions = {
- deviceTypeJsonExpression: "extension.converter-json",
- deviceTypeTopicExpression: "extension.topic"
- };
- scope.attributeKeyExpressions = {
- attributeKeyJsonExpression: "extension.converter-json",
- attributeKeyTopicExpression: "extension.topic"
- };
- scope.requestIdExpressions = {
- requestIdJsonExpression: "extension.converter-json",
- requestIdTopicExpression: "extension.topic"
- }
-
- scope.extensionCustomConverterOptions = {
- useWrapMode: false,
- mode: 'json',
- showGutter: true,
- showPrintMargin: true,
- theme: 'github',
- advanced: {
- enableSnippets: true,
- enableBasicAutocompletion: true,
- enableLiveAutocompletion: true
- },
- onLoad: function(_ace) {
- _ace.$blockScrolling = 1;
- }
- };
-
- scope.updateValidity = function () {
- if(scope.brokers.length) {
- for(let i=0;i -1) {
- scope.brokers.splice(index, 1);
- }
- };
-
- if(scope.isAdd) {
- scope.brokers = [];
- scope.config.brokers = scope.brokers;
- scope.addBroker();
- } else {
- scope.brokers = scope.config.brokers;
- }
-
- scope.addMap = function(mapping) {
- var newMap = {topicFilter:"sensors", converter:{attributes:[],timeseries:[]}};
-
- mapping.push(newMap);
- };
-
- scope.removeMap = function(map, mapping) {
- var index = mapping.indexOf(map);
- if (index > -1) {
- mapping.splice(index, 1);
- }
- };
-
- scope.addAttribute = function(attributes) {
- var newAttribute = {type:"", key:"", value:""};
- attributes.push(newAttribute);
- };
-
- scope.removeAttribute = function(attribute, attributes) {
- var index = attributes.indexOf(attribute);
- if (index > -1) {
- attributes.splice(index, 1);
- }
- };
-
- scope.addConnectRequest = function(requests, type) {
- var newRequest = {};
- if(type == "connect") {
- newRequest.topicFilter = "sensors/connect";
- } else {
- newRequest.topicFilter = "sensors/disconnect";
- }
- requests.push(newRequest);
- };
-
- scope.addAttributeRequest = function(requests) {
- var newRequest = {
- topicFilter: "sensors/attributes",
- clientScope: false,
- responseTopicExpression: "sensors/${deviceName}/attributes/${responseId}",
- valueExpression: "${attributeValue}"
- };
- requests.push(newRequest);
- };
-
- scope.addAttributeUpdate = function(updates) {
- var newUpdate = {
- deviceNameFilter: ".*",
- attributeFilter: ".*",
- topicExpression: "sensor/${deviceName}/${attributeKey}",
- valueExpression: "{\"${attributeKey}\":\"${attributeValue}\"}"
- }
- updates.push(newUpdate);
- };
-
- scope.addServerSideRpc = function(rpcRequests) {
- var newRpc = {
- deviceNameFilter: ".*",
- methodFilter: "echo",
- requestTopicExpression: "sensor/${deviceName}/request/${methodName}/${requestId}",
- responseTopicExpression: "sensor/${deviceName}/response/${methodName}/${requestId}",
- responseTimeout: 10000,
- valueExpression: "${params}"
- };
- rpcRequests.push(newRpc);
- };
-
- scope.changeCredentials = function(broker) {
- var type = broker.credentials.type;
- broker.credentials = {};
- broker.credentials.type = type;
- };
-
- scope.changeConverterType = function(map) {
- if(map.converterType == "custom"){
- map.converter = "";
- }
- if(map.converterType == "json") {
- map.converter = {attributes:[],timeseries:[]};
- }
- };
-
- scope.changeNameExpression = function(element, type) {
- if(element.nameExp == "deviceNameJsonExpression") {
- if(element.deviceNameTopicExpression) {
- delete element.deviceNameTopicExpression;
- }
- if(type) {
- element.deviceNameJsonExpression = "${$.serialNumber}";
- }
- }
- if(element.nameExp == "deviceNameTopicExpression") {
- if(element.deviceNameJsonExpression) {
- delete element.deviceNameJsonExpression;
- }
- if(type && type == "connect") {
- element.deviceNameTopicExpression = "(?<=sensor\\/)(.*?)(?=\\/connect)";
- }
- if(type && type == "disconnect") {
- element.deviceNameTopicExpression = "(?<=sensor\\/)(.*?)(?=\\/disconnect)";
- }
- if(type && type == "attribute") {
- element.deviceNameTopicExpression = "(?<=sensors\\/)(.*?)(?=\\/attributes)";
- }
- }
- };
-
- scope.changeTypeExpression = function(converter) {
- if(converter.typeExp == "deviceTypeJsonExpression") {
- if(converter.deviceTypeTopicExpression) {
- delete converter.deviceTypeTopicExpression;
- }
- }
- if(converter.typeExp == "deviceTypeTopicExpression") {
- if(converter.deviceTypeJsonExpression) {
- delete converter.deviceTypeJsonExpression;
- }
- }
- };
-
- scope.changeAttrKeyExpression = function(request) {
- if(request.attrKey == "attributeKeyJsonExpression") {
- if(request.attributeKeyTopicExpression) {
- delete request.attributeKeyTopicExpression;
- }
- request.attributeKeyJsonExpression = "${$.key}";
- }
- if(request.attrKey == "attributeKeyTopicExpression") {
- if(request.attributeKeyJsonExpression) {
- delete request.attributeKeyJsonExpression;
- }
- request.attributeKeyTopicExpression = "(?<=attributes\\/)(.*?)(?=\\/request)";
- }
- };
-
- scope.changeRequestIdExpression = function(request) {
- if(request.requestId == "requestIdJsonExpression") {
- if(request.requestIdTopicExpression) {
- delete request.requestIdTopicExpression;
- }
- request.requestIdJsonExpression = "${$.requestId}";
- }
- if(request.requestId == "requestIdTopicExpression") {
- if(request.requestIdJsonExpression) {
- delete request.requestIdJsonExpression;
- }
- request.requestIdTopicExpression = "(?<=request\\/)(.*?)($)";
- }
- };
-
- scope.validateCustomConverter = function(model, editorName) {
- if(model && model.length) {
- try {
- angular.fromJson(model);
- scope.theForm[editorName].$setValidity('converterJSON', true);
- } catch(e) {
- scope.theForm[editorName].$setValidity('converterJSON', false);
- }
- }
- };
-
- scope.fileAdded = function($file, broker, fileType) {
- var reader = new FileReader();
- reader.onload = function(event) {
- scope.$apply(function() {
- if(event.target.result) {
- scope.theForm.$setDirty();
- var addedFile = event.target.result;
- if (addedFile && addedFile.length > 0) {
- if(fileType == "caCert") {
- broker.credentials.caCertFileName = $file.name;
- broker.credentials.caCert = addedFile.replace(/^data.*base64,/, "");
- }
- if(fileType == "privateKey") {
- broker.credentials.privateKeyFileName = $file.name;
- broker.credentials.privateKey = addedFile.replace(/^data.*base64,/, "");
- }
- if(fileType == "Cert") {
- broker.credentials.certFileName = $file.name;
- broker.credentials.cert = addedFile.replace(/^data.*base64,/, "");
- }
- }
- }
- });
- };
- reader.readAsDataURL($file.file);
- };
-
- scope.clearFile = function(broker, fileType) {
- scope.theForm.$setDirty();
- if(fileType == "caCert") {
- broker.credentials.caCertFileName = null;
- broker.credentials.caCert = null;
- }
- if(fileType == "privateKey") {
- broker.credentials.privateKeyFileName = null;
- broker.credentials.privateKey = null;
- }
- if(fileType == "Cert") {
- broker.credentials.certFileName = null;
- broker.credentials.cert = null;
- }
- };
-
- scope.collapseValidation = function(index, id) {
- var invalidState = angular.element('#'+id+':has(.ng-invalid)');
- if(invalidState.length) {
- invalidState.addClass('inner-invalid');
- }
- };
-
- scope.expandValidation = function (index, id) {
- var invalidState = angular.element('#'+id);
- invalidState.removeClass('inner-invalid');
- };
-
- $compile(element.contents())(scope);
- };
-
- return {
- restrict: "A",
- link: linker,
- scope: {
- config: "=",
- isAdd: "="
- }
- }
-}
\ No newline at end of file
diff --git a/ui/src/app/extension/extensions-forms/extension-form-mqtt.tpl.html b/ui/src/app/extension/extensions-forms/extension-form-mqtt.tpl.html
deleted file mode 100644
index b215060298..0000000000
--- a/ui/src/app/extension/extensions-forms/extension-form-mqtt.tpl.html
+++ /dev/null
@@ -1,860 +0,0 @@
-
-
-
-
- extension.configuration
-
-
-
-
-
-
- {{ 'extension.brokers' | translate }}
-
-
-
-
- -
-
-
-
- {{ 'action.remove' | translate }}
-
-
-
-
-
-
-
-
-
-
extension.field-required
-
extension.port-range
-
extension.port-range
-
-
-
-
-
-
-
extension.field-required
-
-
-
-
-
-
-
-
-
extension.field-required
-
-
-
-
-
-
- {{credentialsValue.name | translate}}
-
-
-
-
- {{ 'extension.ssl' | translate }}
-
-
-
-
-
-
-
-
-
extension.field-required
-
-
-
-
-
-
-
extension.field-required
-
-
-
-
-
-
-
-
-
-
- {{ 'action.remove' | translate }}
-
- close
-
-
-
-
-
-
-
-
-
-
extension.no-file
-
{{broker.credentials.caCertFileName}}
-
-
-
-
-
-
-
- {{ 'action.remove' | translate }}
-
- close
-
-
-
-
-
-
-
-
-
-
extension.no-file
-
{{broker.credentials.privateKeyFileName}}
-
-
-
-
-
-
-
- {{ 'action.remove' | translate }}
-
- close
-
-
-
-
-
-
-
-
-
-
extension.no-file
-
{{broker.credentials.certFileName}}
-
-
-
-
-
-
- {{ 'extension.mapping' | translate }}
-
-
-
-
- -
-
-
-
- {{ 'action.remove' | translate }}
-
-
-
-
-
-
-
-
-
- {{value | translate}}
-
-
-
-
extension.field-required
-
-
-
-
-
-
-
extension.field-required
-
-
-
-
-
-
-
-
-
-
- {{value | translate}}
-
-
-
-
extension.field-required
-
-
-
-
-
-
-
extension.field-required
-
-
-
-
-
-
-
extension.field-required
-
-
-
-
-
-
-
-
- {{value | translate}}
-
-
-
-
extension.field-required
-
-
-
-
-
-
-
extension.field-required
-
-
-
-
-
-
-
extension.field-required
-
-
-
-
-
-
-
-
extension.transformer-json
-
-
-
extension.converter-json-required
-
extension.converter-json-parse
-
-
-
-
-
-
- {{ 'extension.attributes' | translate }}
-
-
-
-
- -
-
-
-
- {{ 'action.remove' | translate }}
-
-
-
-
-
-
-
-
-
-
extension.field-required
-
-
-
-
-
-
- {{attrTypeValue | translate}}
-
-
-
-
extension.field-required
-
-
-
-
-
-
-
-
extension.field-required
-
-
-
-
-
-
-
-
-
- add
- extension.add-attribute
-
-
-
-
-
-
-
-
-
- {{ 'extension.timeseries' | translate }}
-
-
-
-
- -
-
-
-
- {{ 'action.remove' | translate }}
-
-
-
-
-
-
-
-
-
-
extension.field-required
-
-
-
-
-
-
- {{attrTypeValue | translate}}
-
-
-
-
extension.field-required
-
-
-
-
-
-
-
-
extension.field-required
-
-
-
-
-
-
-
-
-
- add
- extension.add-timeseries
-
-
-
-
-
-
-
-
-
-
-
-
-
- add
- extension.add-map
-
-
-
-
-
-
-
-
-
- {{ 'extension.connect-requests' | translate }}
-
-
-
-
- -
-
-
-
- {{ 'action.remove' | translate }}
-
-
-
-
-
-
-
-
-
extension.field-required
-
-
-
-
-
-
-
- {{value | translate}}
-
-
-
-
extension.field-required
-
-
-
-
-
-
-
extension.field-required
-
-
-
-
-
-
-
extension.field-required
-
-
-
-
-
-
-
-
-
-
- add
- extension.add-connect-request
-
-
-
-
-
-
-
-
-
- {{ 'extension.disconnect-requests' | translate }}
-
-
-
-
- -
-
-
-
- {{ 'action.remove' | translate }}
-
-
-
-
-
-
-
-
-
extension.field-required
-
-
-
-
-
-
-
- {{value | translate}}
-
-
-
-
extension.field-required
-
-
-
-
-
-
-
extension.field-required
-
-
-
-
-
-
-
extension.field-required
-
-
-
-
-
-
-
-
-
-
- add
- extension.add-disconnect-request
-
-
-
-
-
-
-
-
-
- {{ 'extension.attribute-requests' | translate }}
-
-
-
-
- -
-
-
-
- {{ 'action.remove' | translate }}
-
-
-
-
-
-
-
-
-
-
extension.field-required
-
-
-
- {{ 'extension.client-scope' | translate }}
-
-
-
-
-
-
-
-
- {{value | translate}}
-
-
-
-
extension.field-required
-
-
-
-
-
-
-
extension.field-required
-
-
-
-
-
-
-
extension.field-required
-
-
-
-
-
-
-
-
-
- {{value | translate}}
-
-
-
-
extension.field-required
-
-
-
-
-
-
-
extension.field-required
-
-
-
-
-
-
-
extension.field-required
-
-
-
-
-
-
-
-
-
- {{value | translate}}
-
-
-
-
extension.field-required
-
-
-
-
-
-
-
extension.field-required
-
-
-
-
-
-
-
extension.field-required
-
-
-
-
-
-
-
-
-
extension.field-required
-
-
-
-
-
-
-
extension.field-required
-
-
-
-
-
-
-
-
-
- add
- extension.add-attribute-request
-
-
-
-
-
-
-
-
-
- {{ 'extension.attribute-updates' | translate }}
-
-
-
-
- -
-
-
-
- {{ 'action.remove' | translate }}
-
-
-
-
-
-
-
-
-
-
extension.field-required
-
-
-
-
-
-
-
extension.field-required
-
-
-
-
-
-
-
-
extension.field-required
-
-
-
-
-
-
-
extension.field-required
-
-
-
-
-
-
-
-
-
- add
- extension.add-attribute-update
-
-
-
-
-
-
-
-
-
- {{ 'extension.server-side-rpc' | translate }}
-
-
-
-
-
- add
- extension.add-server-side-rpc-request
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- add
- extension.add-broker
-
-
-
-
-
-
-
-
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
deleted file mode 100644
index ac3ee55ca2..0000000000
--- a/ui/src/app/extension/extensions-forms/extension-form-opc.directive.js
+++ /dev/null
@@ -1,173 +0,0 @@
-/*
- * Copyright © 2016-2020 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 'brace/ext/language_tools';
-import 'brace/ext/searchbox';
-import 'brace/mode/json';
-import 'brace/theme/github';
-
-import './extension-form.scss';
-
-/* eslint-disable angular/log */
-
-import extensionFormOpcTemplate from './extension-form-opc.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-/*@ngInject*/
-export default function ExtensionFormOpcDirective($compile, $templateCache, $translate, types) {
-
-
- var linker = function(scope, element) {
-
-
- function Server() {
- this.applicationName = "Thingsboard OPC-UA client";
- this.applicationUri = "";
- this.host = "localhost";
- this.port = 49320;
- this.scanPeriodInSeconds = 10;
- this.timeoutInMillis = 5000;
- this.security = "Basic128Rsa15";
- this.identity = {
- "type": "anonymous"
- };
- this.keystore = {
- "type": "PKCS12",
- "location": "example.pfx",
- "password": "secret",
- "alias": "gateway",
- "keyPassword": "secret"
- };
- this.mapping = []
- }
-
- function Map() {
- this.deviceNodePattern = "Channel1\\.Device\\d+$";
- this.deviceNamePattern = "Device ${_System._DeviceId}";
- this.attributes = [];
- this.timeseries = [];
- }
-
- function Attribute() {
- this.key = "Tag1";
- this.type = "string";
- this.value = "${Tag1}";
- }
-
- function Timeseries() {
- this.key = "Tag2";
- this.type = "long";
- this.value = "${Tag2}";
- }
-
-
- var template = $templateCache.get(extensionFormOpcTemplate);
- element.html(template);
-
- scope.types = types;
- scope.theForm = scope.$parent.theForm;
-
-
- if (!scope.configuration.servers.length) {
- scope.configuration.servers.push(new Server());
- }
-
- scope.addServer = function(serversList) {
- serversList.push(new Server());
- // scope.addMap(serversList[serversList.length-1].mapping);
-
- scope.theForm.$setDirty();
- };
-
- scope.addMap = function(mappingList) {
- mappingList.push(new Map());
- scope.theForm.$setDirty();
- };
-
- scope.addNewAttribute = function(attributesList) {
- attributesList.push(new Attribute());
- scope.theForm.$setDirty();
- };
-
- scope.addNewTimeseries = function(timeseriesList) {
- timeseriesList.push(new Timeseries());
- scope.theForm.$setDirty();
- };
-
-
- scope.removeItem = (item, itemList) => {
- var index = itemList.indexOf(item);
- if (index > -1) {
- itemList.splice(index, 1);
- }
- scope.theForm.$setDirty();
- };
-
-
- $compile(element.contents())(scope);
-
-
- scope.fileAdded = function($file, model, options) {
- let reader = new FileReader();
- reader.onload = function(event) {
- scope.$apply(function() {
- if(event.target.result) {
- scope.theForm.$setDirty();
- let addedFile = event.target.result;
-
- if (addedFile && addedFile.length > 0) {
- model[options.location] = $file.name;
- model[options.fileContent] = addedFile.replace(/^data.*base64,/, "");
-
- }
- }
- });
- };
- reader.readAsDataURL($file.file);
-
- };
-
- scope.clearFile = function(model, options) {
- scope.theForm.$setDirty();
-
- model[options.location] = null;
- model[options.fileContent] = null;
-
- };
-
- scope.collapseValidation = function(index, id) {
- var invalidState = angular.element('#'+id+':has(.ng-invalid)');
- if(invalidState.length) {
- invalidState.addClass('inner-invalid');
- }
- };
-
- scope.expandValidation = function (index, id) {
- var invalidState = angular.element('#'+id);
- invalidState.removeClass('inner-invalid');
- };
-
- };
-
- return {
- restrict: "A",
- link: linker,
- scope: {
- configuration: "=",
- isAdd: "="
- }
- }
-}
\ No newline at end of file
diff --git a/ui/src/app/extension/extensions-forms/extension-form-opc.tpl.html b/ui/src/app/extension/extensions-forms/extension-form-opc.tpl.html
deleted file mode 100644
index c955d08e82..0000000000
--- a/ui/src/app/extension/extensions-forms/extension-form-opc.tpl.html
+++ /dev/null
@@ -1,554 +0,0 @@
-
-
-
-
- extension.configuration
-
-
-
-
-
-
-
- {{ 'extension.opc-server' | translate }}
-
-
-
-
- extension.opc-add-server-prompt
-
-
-
-
- -
-
-
-
- {{ 'action.remove' | translate }}
-
-
-
-
-
-
-
-
-
-
-
-
extension.field-required
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
extension.field-required
-
-
-
-
-
-
-
-
extension.field-required
-
extension.port-range
-
extension.port-range
-
-
-
-
-
-
-
-
-
-
extension.field-required
-
-
-
-
-
-
-
-
extension.field-required
-
-
-
-
-
-
-
-
-
-
-
-
-
extension.field-required
-
-
-
-
-
-
-
-
-
-
extension.field-required
-
-
-
-
-
-
-
-
-
-
-
-
-
extension.field-required
-
-
-
-
-
-
-
-
extension.field-required
-
-
-
-
-
-
-
- {{ 'extension.opc-keystore' | translate }}
-
-
-
-
-
-
-
-
-
-
extension.field-required
-
-
-
-
-
-
-
-
-
-
-
- {{ 'action.remove' | translate }}
-
- close
-
-
-
-
-
-
-
-
-
-
extension.no-file
-
{{server.keystore[fieldsToFill.location]}}
-
-
-
-
-
-
-
-
-
-
extension.field-required
-
-
-
-
-
-
-
-
extension.field-required
-
-
-
-
-
-
-
-
-
extension.field-required
-
-
-
-
-
-
-
-
-
-
-
- {{ 'extension.mapping' | translate }}
-
-
-
-
- -
-
-
-
- {{ 'action.remove' | translate }}
-
-
-
-
-
-
-
-
-
-
-
extension.field-required
-
-
-
-
-
-
-
-
extension.field-required
-
-
-
-
-
-
-
-
- {{ 'extension.attributes' | translate }}
-
-
-
-
- -
-
-
-
- {{ 'action.remove' | translate }}
-
-
-
-
-
-
-
-
-
-
-
extension.field-required
-
-
-
-
-
-
- {{attrTypeValue | translate}}
-
-
-
-
extension.field-required
-
-
-
-
-
-
-
-
-
-
extension.field-required
-
-
-
-
-
-
-
-
-
-
-
-
-
- add
- extension.add-attribute
-
-
-
-
-
-
-
-
-
- {{ 'extension.timeseries' | translate }}
-
-
-
-
- -
-
-
-
- {{ 'action.remove' | translate }}
-
-
-
-
-
-
-
-
-
-
extension.field-required
-
-
-
-
-
-
- {{attrTypeValue | translate}}
-
-
-
-
extension.field-required
-
-
-
-
-
-
-
-
-
extension.field-required
-
-
-
-
-
-
-
-
-
-
- add
- extension.add-timeseries
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- add
- extension.add-map
-
-
-
-
-
-
-
-
-
-
-
-
-
- add
- extension.opc-add-server
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/ui/src/app/extension/extensions-forms/extension-form.scss b/ui/src/app/extension/extensions-forms/extension-form.scss
deleted file mode 100644
index 1143a603e2..0000000000
--- a/ui/src/app/extension/extensions-forms/extension-form.scss
+++ /dev/null
@@ -1,83 +0,0 @@
-/**
- * Copyright © 2016-2020 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.
- */
-.extension-form {
- li > .md-button {
- margin: 0;
- color: rgba(0, 0, 0, .7);
- }
-
- .vAccordion--default {
- padding-left: 3px;
- margin-top: 0;
- }
-
- .tb-container {
- width: 100%;
- }
-
- .dropdown-messages {
- .tb-error-message {
- padding: 5px 0 0 0;
- }
- }
-
- .dropdown-section {
- margin-bottom: 30px;
- }
-
- v-pane.inner-invalid > v-pane-header {
- border-bottom: 2px solid rgb(221, 44, 0);
- }
-}
-
-.extension-form.extension-mqtt {
- md-checkbox{
- margin-left: 10px;
- }
-}
-
-.tb-extension-custom-transformer-panel {
- height: 100%;
- margin-left: 15px;
- border: 1px solid #c0c0c0;
-
- .tb-extension-custom-transformer {
- width: 100%;
- min-width: 600px;
- height: 100%;
- min-height: 200px;
- }
-
- .ace_text-input {
- position: absolute !important;
- }
-}
-
-.extensionDialog {
- min-width: 1000px;
-}
-
-.tb-container-for-select {
- height: 58px;
-}
-
-.tb-drop-file-input-hide {
- position: absolute;
- bottom: 0;
- display: block;
- width: 100%;
- height: 200%;
-}
diff --git a/ui/src/app/extension/index.js b/ui/src/app/extension/index.js
deleted file mode 100644
index 30b1ff79be..0000000000
--- a/ui/src/app/extension/index.js
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Copyright © 2016-2020 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 ExtensionTableDirective from './extension-table.directive';
-import ExtensionFormHttpDirective from './extensions-forms/extension-form-http.directive';
-import ExtensionFormMqttDirective from './extensions-forms/extension-form-mqtt.directive'
-import ExtensionFormOpcDirective from './extensions-forms/extension-form-opc.directive';
-import ExtensionFormModbusDirective from './extensions-forms/extension-form-modbus.directive';
-
-import {ParseToNull} from './extension-dialog.controller';
-
-export default angular.module('thingsboard.extension', [])
- .directive('tbExtensionTable', ExtensionTableDirective)
- .directive('tbExtensionFormHttp', ExtensionFormHttpDirective)
- .directive('tbExtensionFormMqtt', ExtensionFormMqttDirective)
- .directive('tbExtensionFormOpc', ExtensionFormOpcDirective)
- .directive('tbExtensionFormModbus', ExtensionFormModbusDirective)
- .directive('parseToNull', ParseToNull)
- .name;
\ No newline at end of file
diff --git a/ui/src/app/global-interceptor.service.js b/ui/src/app/global-interceptor.service.js
deleted file mode 100644
index 331a0d4134..0000000000
--- a/ui/src/app/global-interceptor.service.js
+++ /dev/null
@@ -1,214 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-/*@ngInject*/
-export default function GlobalInterceptor($rootScope, $q, $injector) {
-
- var toast;
- var translate;
- var userService;
- var types;
- var http;
- var timeout;
-
- var internalUrlPrefixes = [
- '/api/auth/token',
- '/api/plugins/rpc'
- ];
-
- var service = {
- request: request,
- requestError: requestError,
- response: response,
- responseError: responseError
- }
-
- return service;
-
- function getToast() {
- if (!toast) {
- toast = $injector.get("toast");
- }
- return toast;
- }
-
- function getTranslate() {
- if (!translate) {
- translate = $injector.get("$translate");
- }
- return translate;
- }
-
- function getUserService() {
- if (!userService) {
- userService = $injector.get("userService");
- }
- return userService;
- }
-
- function getTypes() {
- if (!types) {
- types = $injector.get("types");
- }
- return types;
- }
-
- function getHttp() {
- if (!http) {
- http = $injector.get("$http");
- }
- return http;
- }
-
- function getTimeout() {
- if (!timeout) {
- timeout = $injector.get("$timeout");
- }
- return timeout;
- }
-
- function rejectionErrorCode(rejection) {
- if (rejection && rejection.data && rejection.data.errorCode) {
- return rejection.data.errorCode;
- } else {
- return undefined;
- }
- }
-
- function isTokenBasedAuthEntryPoint(url) {
- return url.startsWith('/api/') &&
- !url.startsWith(getTypes().entryPoints.login) &&
- !url.startsWith(getTypes().entryPoints.tokenRefresh) &&
- !url.startsWith(getTypes().entryPoints.nonTokenBased);
- }
-
- function refreshTokenAndRetry(request) {
- return getUserService().refreshJwtToken().then(function success() {
- getUserService().updateAuthorizationHeader(request.config.headers);
- return getHttp()(request.config);
- }, function fail(message) {
- $rootScope.$broadcast('unauthenticated');
- request.status = 401;
- request.data = {};
- request.data.message = message || getTranslate().instant('access.unauthorized');
- return $q.reject(request);
- });
- }
-
- function isInternalUrlPrefix(url) {
- for (var index in internalUrlPrefixes) {
- if (url.startsWith(internalUrlPrefixes[index])) {
- return true;
- }
- }
- return false;
- }
-
- function request(config) {
- var rejected = false;
- if (config.url.startsWith('/api/')) {
- var isLoading = !isInternalUrlPrefix(config.url);
- updateLoadingState(config, isLoading);
- if (isTokenBasedAuthEntryPoint(config.url)) {
- if (!getUserService().updateAuthorizationHeader(config.headers) &&
- !getUserService().refreshTokenPending()) {
- updateLoadingState(config, false);
- rejected = true;
- getUserService().clearJwtToken(false);
- return $q.reject({ data: {message: getTranslate().instant('access.unauthorized')}, status: 401, config: config});
- } else if (!getUserService().isJwtTokenValid()) {
- return $q.reject({ refreshTokenPending: true, config: config });
- }
- }
- }
- if (!rejected) {
- return config;
- }
- }
-
- function requestError(rejection) {
- if (rejection.config.url.startsWith('/api/')) {
- updateLoadingState(rejection.config, false);
- }
- return $q.reject(rejection);
- }
-
- function response(response) {
- if (response.config.url.startsWith('/api/')) {
- updateLoadingState(response.config, false);
- }
- return response;
- }
-
- function retryRequest (httpConfig) {
- var thisTimeout = 1000 + Math.random() * 3000;
- return getTimeout()(function() {
- return getHttp()(httpConfig);
- }, thisTimeout);
- }
-
- function responseError(rejection) {
- if (rejection.config.url.startsWith('/api/')) {
- updateLoadingState(rejection.config, false);
- }
- var unhandled = false;
- var ignoreErrors = rejection.config.ignoreErrors;
- var resendRequest = rejection.config.resendRequest;
- if (rejection.refreshTokenPending || rejection.status === 401) {
- var errorCode = rejectionErrorCode(rejection);
- if (rejection.refreshTokenPending || (errorCode && errorCode === getTypes().serverErrorCode.jwtTokenExpired)) {
- return refreshTokenAndRetry(rejection);
- } else if (errorCode !== getTypes().serverErrorCode.credentialsExpired) {
- unhandled = true;
- }
- } else if (rejection.status === 403) {
- if (!ignoreErrors) {
- $rootScope.$broadcast('forbidden');
- }
- } else if (rejection.status === 429) {
- if (resendRequest) {
- return retryRequest(rejection.config);
- }
- } else if (rejection.status === 0 || rejection.status === -1) {
- getToast().showError(getTranslate().instant('error.unable-to-connect'));
- } else if (!rejection.config.url.startsWith('/api/plugins/rpc')) {
- if (rejection.status === 404) {
- if (!ignoreErrors) {
- getToast().showError(rejection.config.method + ": " + rejection.config.url + "
" +
- rejection.status + ": " + rejection.statusText);
- }
- } else {
- unhandled = true;
- }
- }
-
- if (unhandled && !ignoreErrors) {
- if (rejection.data && !rejection.data.message) {
- getToast().showError(rejection.data);
- } else if (rejection.data && rejection.data.message) {
- getToast().showError(rejection.data.message);
- } else {
- getToast().showError(getTranslate().instant('error.unhandled-error-code', {errorCode: rejection.status}));
- }
- }
- return $q.reject(rejection);
- }
-
- function updateLoadingState(config, isLoading) {
- if (!config || angular.isUndefined(config.ignoreLoading) || !config.ignoreLoading) {
- $rootScope.loading = isLoading;
- }
- }
-}
diff --git a/ui/src/app/help/help-links.constant.js b/ui/src/app/help/help-links.constant.js
deleted file mode 100644
index 8985b15f67..0000000000
--- a/ui/src/app/help/help-links.constant.js
+++ /dev/null
@@ -1,126 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-var ruleNodeClazzHelpLinkMap = {
- 'org.thingsboard.rule.engine.filter.TbCheckRelationNode': 'ruleNodeCheckRelation',
- 'org.thingsboard.rule.engine.filter.TbJsFilterNode': 'ruleNodeJsFilter',
- 'org.thingsboard.rule.engine.filter.TbJsSwitchNode': 'ruleNodeJsSwitch',
- 'org.thingsboard.rule.engine.filter.TbMsgTypeFilterNode': 'ruleNodeMessageTypeFilter',
- 'org.thingsboard.rule.engine.filter.TbMsgTypeSwitchNode': 'ruleNodeMessageTypeSwitch',
- 'org.thingsboard.rule.engine.filter.TbOriginatorTypeFilterNode': 'ruleNodeOriginatorTypeFilter',
- 'org.thingsboard.rule.engine.filter.TbOriginatorTypeSwitchNode': 'ruleNodeOriginatorTypeSwitch',
- 'org.thingsboard.rule.engine.metadata.TbGetAttributesNode': 'ruleNodeOriginatorAttributes',
- 'org.thingsboard.rule.engine.metadata.TbGetOriginatorFieldsNode': 'ruleNodeOriginatorFields',
- 'org.thingsboard.rule.engine.metadata.TbGetCustomerAttributeNode': 'ruleNodeCustomerAttributes',
- 'org.thingsboard.rule.engine.metadata.TbGetDeviceAttrNode': 'ruleNodeDeviceAttributes',
- 'org.thingsboard.rule.engine.metadata.TbGetRelatedAttributeNode': 'ruleNodeRelatedAttributes',
- 'org.thingsboard.rule.engine.metadata.TbGetTenantAttributeNode': 'ruleNodeTenantAttributes',
- 'org.thingsboard.rule.engine.transform.TbChangeOriginatorNode': 'ruleNodeChangeOriginator',
- 'org.thingsboard.rule.engine.transform.TbTransformMsgNode': 'ruleNodeTransformMsg',
- 'org.thingsboard.rule.engine.mail.TbMsgToEmailNode': 'ruleNodeMsgToEmail',
- 'org.thingsboard.rule.engine.action.TbClearAlarmNode': 'ruleNodeClearAlarm',
- 'org.thingsboard.rule.engine.action.TbCreateAlarmNode': 'ruleNodeCreateAlarm',
- 'org.thingsboard.rule.engine.delay.TbMsgDelayNode': 'ruleNodeMsgDelay',
- 'org.thingsboard.rule.engine.debug.TbMsgGeneratorNode': 'ruleNodeMsgGenerator',
- 'org.thingsboard.rule.engine.action.TbLogNode': 'ruleNodeLog',
- 'org.thingsboard.rule.engine.rpc.TbSendRPCReplyNode': 'ruleNodeRpcCallReply',
- 'org.thingsboard.rule.engine.rpc.TbSendRPCRequestNode': 'ruleNodeRpcCallRequest',
- 'org.thingsboard.rule.engine.telemetry.TbMsgAttributesNode': 'ruleNodeSaveAttributes',
- 'org.thingsboard.rule.engine.telemetry.TbMsgTimeseriesNode': 'ruleNodeSaveTimeseries',
- 'tb.internal.RuleChain': 'ruleNodeRuleChain',
- 'org.thingsboard.rule.engine.aws.sns.TbSnsNode': 'ruleNodeAwsSns',
- 'org.thingsboard.rule.engine.aws.sqs.TbSqsNode': 'ruleNodeAwsSqs',
- 'org.thingsboard.rule.engine.kafka.TbKafkaNode': 'ruleNodeKafka',
- 'org.thingsboard.rule.engine.mqtt.TbMqttNode': 'ruleNodeMqtt',
- 'org.thingsboard.rule.engine.rabbitmq.TbRabbitMqNode': 'ruleNodeRabbitMq',
- 'org.thingsboard.rule.engine.rest.TbRestApiCallNode': 'ruleNodeRestApiCall',
- 'org.thingsboard.rule.engine.mail.TbSendEmailNode': 'ruleNodeSendEmail'
-};
-
-var helpBaseUrl = "https://thingsboard.io";
-
-export default angular.module('thingsboard.help', [])
- .constant('helpLinks',
- {
- linksMap: {
- outgoingMailSettings: helpBaseUrl + "/docs/user-guide/ui/mail-settings",
- securitySettings: helpBaseUrl + "/docs/user-guide/ui/security-settings",
- ruleEngine: helpBaseUrl + "/docs/user-guide/rule-engine-2-0/overview/",
- ruleNodeCheckRelation: helpBaseUrl + "/docs/user-guide/rule-engine-2-0/filter-nodes/#check-relation-filter-node",
- ruleNodeJsFilter: helpBaseUrl + "/docs/user-guide/rule-engine-2-0/filter-nodes/#script-filter-node",
- ruleNodeJsSwitch: helpBaseUrl + "/docs/user-guide/rule-engine-2-0/filter-nodes/#switch-node",
- ruleNodeMessageTypeFilter: helpBaseUrl + "/docs/user-guide/rule-engine-2-0/filter-nodes/#message-type-filter-node",
- ruleNodeMessageTypeSwitch: helpBaseUrl + "/docs/user-guide/rule-engine-2-0/filter-nodes/#message-type-switch-node",
- ruleNodeOriginatorTypeFilter: helpBaseUrl + "/docs/user-guide/rule-engine-2-0/filter-nodes/#originator-type-filter-node",
- ruleNodeOriginatorTypeSwitch: helpBaseUrl + "/docs/user-guide/rule-engine-2-0/filter-nodes/#originator-type-switch-node",
- ruleNodeOriginatorAttributes: helpBaseUrl + "/docs/user-guide/rule-engine-2-0/enrichment-nodes/#originator-attributes",
- ruleNodeOriginatorFields: helpBaseUrl + "/docs/user-guide/rule-engine-2-0/enrichment-nodes/#originator-fields",
- ruleNodeCustomerAttributes: helpBaseUrl + "/docs/user-guide/rule-engine-2-0/enrichment-nodes/#customer-attributes",
- ruleNodeDeviceAttributes: helpBaseUrl + "/docs/user-guide/rule-engine-2-0/enrichment-nodes/#device-attributes",
- ruleNodeRelatedAttributes: helpBaseUrl + "/docs/user-guide/rule-engine-2-0/enrichment-nodes/#related-attributes",
- ruleNodeTenantAttributes: helpBaseUrl + "/docs/user-guide/rule-engine-2-0/enrichment-nodes/#tenant-attributes",
- ruleNodeChangeOriginator: helpBaseUrl + "/docs/user-guide/rule-engine-2-0/transformation-nodes/#change-originator",
- ruleNodeTransformMsg: helpBaseUrl + "/docs/user-guide/rule-engine-2-0/transformation-nodes/#script-transformation-node",
- ruleNodeMsgToEmail: helpBaseUrl + "/docs/user-guide/rule-engine-2-0/transformation-nodes/#to-email-node",
- ruleNodeClearAlarm: helpBaseUrl + "/docs/user-guide/rule-engine-2-0/action-nodes/#clear-alarm-node",
- ruleNodeCreateAlarm: helpBaseUrl + "/docs/user-guide/rule-engine-2-0/action-nodes/#create-alarm-node",
- ruleNodeMsgDelay: helpBaseUrl + "/docs/user-guide/rule-engine-2-0/action-nodes/#delay-node",
- ruleNodeMsgGenerator: helpBaseUrl + "/docs/user-guide/rule-engine-2-0/action-nodes/#generator-node",
- ruleNodeLog: helpBaseUrl + "/docs/user-guide/rule-engine-2-0/action-nodes/#log-node",
- ruleNodeRpcCallReply: helpBaseUrl + "/docs/user-guide/rule-engine-2-0/action-nodes/#rpc-call-reply-node",
- ruleNodeRpcCallRequest: helpBaseUrl + "/docs/user-guide/rule-engine-2-0/action-nodes/#rpc-call-request-node",
- ruleNodeSaveAttributes: helpBaseUrl + "/docs/user-guide/rule-engine-2-0/action-nodes/#save-attributes-node",
- ruleNodeSaveTimeseries: helpBaseUrl + "/docs/user-guide/rule-engine-2-0/action-nodes/#save-timeseries-node",
- ruleNodeRuleChain: helpBaseUrl + "/docs/user-guide/ui/rule-chains/",
- ruleNodeAwsSns: helpBaseUrl + "/docs/user-guide/rule-engine-2-0/external-nodes/#aws-sns-node",
- ruleNodeAwsSqs: helpBaseUrl + "/docs/user-guide/rule-engine-2-0/external-nodes/#aws-sqs-node",
- ruleNodeKafka: helpBaseUrl + "/docs/user-guide/rule-engine-2-0/external-nodes/#kafka-node",
- ruleNodeMqtt: helpBaseUrl + "/docs/user-guide/rule-engine-2-0/external-nodes/#mqtt-node",
- ruleNodeRabbitMq: helpBaseUrl + "/docs/user-guide/rule-engine-2-0/external-nodes/#rabbitmq-node",
- ruleNodeRestApiCall: helpBaseUrl + "/docs/user-guide/rule-engine-2-0/external-nodes/#rest-api-call-node",
- ruleNodeSendEmail: helpBaseUrl + "/docs/user-guide/rule-engine-2-0/external-nodes/#send-email-node",
- rulechains: helpBaseUrl + "/docs/user-guide/ui/rule-chains/",
- tenants: helpBaseUrl + "/docs/user-guide/ui/tenants",
- customers: helpBaseUrl + "/docs/user-guide/ui/customers",
- assets: helpBaseUrl + "/docs/user-guide/ui/assets",
- devices: helpBaseUrl + "/docs/user-guide/ui/devices",
- entityViews: helpBaseUrl + "/docs/user-guide/ui/entity-views",
- entitiesImport: helpBaseUrl + "/docs/user-guide/bulk-provisioning",
- dashboards: helpBaseUrl + "/docs/user-guide/ui/dashboards",
- users: helpBaseUrl + "/docs/user-guide/ui/users",
- widgetsBundles: helpBaseUrl + "/docs/user-guide/ui/widget-library#bundles",
- widgetsConfig: helpBaseUrl + "/docs/user-guide/ui/dashboards#widget-configuration",
- widgetsConfigTimeseries: helpBaseUrl + "/docs/user-guide/ui/dashboards#timeseries",
- widgetsConfigLatest: helpBaseUrl + "/docs/user-guide/ui/dashboards#latest",
- widgetsConfigRpc: helpBaseUrl + "/docs/user-guide/ui/dashboards#rpc",
- widgetsConfigAlarm: helpBaseUrl + "/docs/user-guide/ui/dashboards#alarm",
- widgetsConfigStatic: helpBaseUrl + "/docs/user-guide/ui/dashboards#static",
- },
- getRuleNodeLink: function(ruleNode) {
- if (ruleNode && ruleNode.component) {
- if (ruleNode.component.configurationDescriptor &&
- ruleNode.component.configurationDescriptor.nodeDefinition &&
- ruleNode.component.configurationDescriptor.nodeDefinition.docUrl) {
- return ruleNode.component.configurationDescriptor.nodeDefinition.docUrl;
- } else if (ruleNode.component.clazz) {
- if (ruleNodeClazzHelpLinkMap[ruleNode.component.clazz]) {
- return ruleNodeClazzHelpLinkMap[ruleNode.component.clazz];
- }
- }
- }
- return 'ruleEngine';
- }
- }
- ).name;
diff --git a/ui/src/app/help/help.directive.js b/ui/src/app/help/help.directive.js
deleted file mode 100644
index f0a47a5ba7..0000000000
--- a/ui/src/app/help/help.directive.js
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Copyright © 2016-2020 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 './help.scss';
-
-import thingsboardHelpLinks from './help-links.constant';
-
-import $ from 'jquery';
-
-export default angular.module('thingsboard.directives.help', [thingsboardHelpLinks])
- .directive('tbHelp', Help)
- .name;
-
-/* eslint-disable angular/angularelement */
-
-/*@ngInject*/
-function Help($compile, $window, helpLinks) {
-
- var linker = function (scope, element, attrs) {
-
- scope.gotoHelpPage = function ($event) {
- if ($event) {
- $event.stopPropagation();
- }
- var helpUrl = helpLinks.linksMap[scope.helpLinkId];
- if (!helpUrl && scope.helpLinkId &&
- (scope.helpLinkId.startsWith('http://') || scope.helpLinkId.startsWith('https://'))) {
- helpUrl = scope.helpLinkId;
- }
- if (helpUrl) {
- $window.open(helpUrl, '_blank');
- }
- }
-
- var html = '' +
- '{{\'help.goto-help-page\' | translate}}' +
- '' +
- '' +
- 'help' +
- '';
-
- var helpButton = angular.element('' +
- html +
- '');
-
- if (attrs.helpContainerId) {
- var helpContainer = $('#' + attrs.helpContainerId, element)[0];
- helpContainer = angular.element(helpContainer);
- helpContainer.append(helpButton);
- $compile(helpContainer.contents())(scope);
- } else {
- $compile(helpButton)(scope);
- element.append(helpButton);
- }
- }
-
- return {
- restrict: "A",
- link: linker,
- scope: {
- helpLinkId: "=tbHelp"
- }
- };
-}
-
-/* eslint-enable angular/angularelement */
diff --git a/ui/src/app/help/help.scss b/ui/src/app/help/help.scss
deleted file mode 100644
index b7350ddf63..0000000000
--- a/ui/src/app/help/help.scss
+++ /dev/null
@@ -1,26 +0,0 @@
-/**
- * Copyright © 2016-2020 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-button.tb-help-button-style,
-.tb-help-button-style {
-}
-
-.md-button.tb-help-button-pos,
-.tb-help-button-pos {
-}
-*/
diff --git a/ui/src/app/home/home-links.controller.js b/ui/src/app/home/home-links.controller.js
deleted file mode 100644
index c290970478..0000000000
--- a/ui/src/app/home/home-links.controller.js
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Copyright © 2016-2020 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 './home-links.scss';
-
-/*@ngInject*/
-export default function HomeLinksController($scope, $mdMedia, menu) {
-
- var vm = this;
-
- vm.sectionColspan = sectionColspan;
-
- $scope.$watch(function() { return $mdMedia('lg'); }, function() {
- updateColumnCount();
- });
-
- $scope.$watch(function() { return $mdMedia('gt-lg'); }, function() {
- updateColumnCount();
- });
-
- updateColumnCount();
-
- vm.model = menu.getHomeSections();
-
- function updateColumnCount() {
- vm.cols = 2;
- if ($mdMedia('lg')) {
- vm.cols = 3;
- }
- if ($mdMedia('gt-lg')) {
- vm.cols = 4;
- }
- }
-
- function sectionColspan(section) {
- var colspan = vm.cols;
- if (section && section.places && section.places.length <= colspan) {
- colspan = section.places.length;
- }
- return colspan;
- }
-
-}
diff --git a/ui/src/app/home/home-links.routes.js b/ui/src/app/home/home-links.routes.js
deleted file mode 100644
index db83e5b3c4..0000000000
--- a/ui/src/app/home/home-links.routes.js
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-/* eslint-disable import/no-unresolved, import/default */
-
-import homeLinksTemplate from './home-links.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-/*@ngInject*/
-export default function HomeLinksRoutes($stateProvider) {
-
- $stateProvider
- .state('home.links', {
- url: '/home',
- module: 'private',
- auth: ['SYS_ADMIN', 'TENANT_ADMIN', 'CUSTOMER_USER'],
- views: {
- "content@home": {
- templateUrl: homeLinksTemplate,
- controllerAs: 'vm',
- controller: 'HomeLinksController'
- }
- },
- data: {
- pageTitle: 'home.home'
- },
- ncyBreadcrumb: {
- label: '{"icon": "home", "label": "home.home"}',
- icon: 'home'
- }
- });
-}
diff --git a/ui/src/app/home/home-links.scss b/ui/src/app/home/home-links.scss
deleted file mode 100644
index c4ed8c0c3a..0000000000
--- a/ui/src/app/home/home-links.scss
+++ /dev/null
@@ -1,26 +0,0 @@
-/**
- * Copyright © 2016-2020 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";
-
-.tb-home-links {
- .md-headline {
- font-size: 20px;
-
- @media (min-width: $layout-breakpoint-xmd) {
- font-size: 24px;
- }
- }
-}
diff --git a/ui/src/app/home/home-links.tpl.html b/ui/src/app/home/home-links.tpl.html
deleted file mode 100644
index 6888284ca7..0000000000
--- a/ui/src/app/home/home-links.tpl.html
+++ /dev/null
@@ -1,38 +0,0 @@
-
-
-
-
-
-
- {{ section.name }}
-
-
-
-
-
-
- {{place.icon}}
- {{place.name}}
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/ui/src/app/home/index.js b/ui/src/app/home/index.js
deleted file mode 100644
index fd1da0eedc..0000000000
--- a/ui/src/app/home/index.js
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright © 2016-2020 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 uiRouter from 'angular-ui-router';
-
-import HomeLinksRoutes from './home-links.routes';
-import HomeLinksController from './home-links.controller';
-
-export default angular.module('thingsboard.homeLinks', [
- uiRouter
-])
- .config(HomeLinksRoutes)
- .controller('HomeLinksController', HomeLinksController)
- .name;
diff --git a/ui/src/app/ie.support.js b/ui/src/app/ie.support.js
deleted file mode 100644
index 9e9f04f936..0000000000
--- a/ui/src/app/ie.support.js
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-(function () {
- if (!String.prototype.startsWith) {
- String.prototype.startsWith = function(searchString, position) {
- position = position || 0;
- return this.indexOf(searchString, position) === position;
- };
- }
- if (!String.prototype.endsWith) {
- String.prototype.endsWith = function (suffix) {
- return this.indexOf(suffix, this.length - suffix.length) !== -1;
- };
- }
- if (!String.prototype.repeat) {
- String.prototype.repeat = function(count) {
- if (this == null) {
- throw TypeError();
- }
- var string = String(this);
- // `ToInteger`
- var n = count ? Number(count) : 0;
- if (n != n) { // better `isNaN`
- n = 0;
- }
- // Account for out-of-bounds indices
- if (n < 0 || n == Infinity) {
- throw RangeError();
- }
- var result = '';
- while (n) {
- if (n % 2 == 1) {
- result += string;
- }
- if (n > 1) {
- string += string;
- }
- n >>= 1;
- }
- return result;
- };
- }
- if (!String.prototype.includes) {
- String.prototype.includes = function(search, start) {
- if (angular.isNumber(start)) {
- start = 0;
- }
-
- if (start + search.length > this.length) {
- return false;
- } else {
- return this.indexOf(search, start) !== -1;
- }
- };
- }
-
- (function (arr) {
- arr.forEach(function (item) {
- if (Object.prototype.hasOwnProperty.call(item, 'remove')) {
- return;
- }
- Object.defineProperty(item, 'remove', {
- configurable: true,
- enumerable: true,
- writable: true,
- value: function remove() {
- if (this.parentNode !== null)
- this.parentNode.removeChild(this);
- }
- });
- });
- })([Element.prototype, CharacterData.prototype, DocumentType.prototype]); //eslint-disable-line
-
-})();
\ No newline at end of file
diff --git a/ui/src/app/import-export/import-dialog-csv.controller.js b/ui/src/app/import-export/import-dialog-csv.controller.js
deleted file mode 100644
index 4ae2a7a9f0..0000000000
--- a/ui/src/app/import-export/import-dialog-csv.controller.js
+++ /dev/null
@@ -1,251 +0,0 @@
-/*
- * Copyright © 2016-2020 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 './import-dialog.scss';
-
-/*@ngInject*/
-export default function ImportDialogCsvController($scope, $mdDialog, toast, importTitle, importFileLabel, entityType, importExport, types, $mdStepper, $timeout) {
-
- var vm = this;
-
- vm.cancel = cancel;
- vm.fileAdded = fileAdded;
- vm.clearFile = clearFile;
- vm.nextStep = nextStep;
- vm.previousStep = previousStep;
-
- vm.importParameters = {
- delim: ',',
- isUpdate: true,
- isHeader: true
- };
-
- vm.importTitle = importTitle;
- vm.importFileLabel = importFileLabel;
- vm.entityType = entityType;
-
- vm.isVertical = true;
- vm.isLinear = true;
- vm.isAlternative = false;
- vm.isMobileStepText = true;
- vm.isImportData = false;
-
- vm.parseData = [];
-
- vm.delimiters = [{
- key: ',',
- value: ','
- }, {
- key: ';',
- value: ';'
- }, {
- key: '|',
- value: '|'
- }, {
- key: '\t',
- value: 'Tab'
- }];
-
- vm.progressCreate = 0;
-
- var parseData = {};
-
- function fileAdded($file) {
- if ($file.getExtension() === 'csv') {
- var reader = new FileReader();
- reader.onload = function (event) {
- $scope.$apply(function () {
- if (event.target.result) {
- vm.theFormStep1.$setDirty();
- var importCSV = event.target.result;
- if (importCSV && importCSV.length > 0) {
- try {
- vm.importData = importCSV;
- vm.fileName = $file.name;
- } catch (err) {
- vm.fileName = null;
- toast.showError(err.message);
- }
- }
- }
- });
- };
- reader.readAsText($file.file);
- }
- }
-
- function parseCSV(importData) {
- var config = {
- delim: vm.importParameters.delim,
- header: vm.importParameters.isHeader
- };
- return importExport.convertCSVToJson(importData, config);
- }
-
- function createColumnsData(parseData) {
- vm.columnsParam = [];
- var columnParam = {};
- for (var i = 0; i < parseData.headers.length; i++) {
- if (vm.importParameters.isHeader && parseData.headers[i].search(/^(name|type|label)$/im) === 0) {
- columnParam = {
- type: types.importEntityColumnType[parseData.headers[i].toLowerCase()].value,
- key: parseData.headers[i].toLowerCase(),
- sampleData: parseData.rows[0][i]
- };
- } else {
- columnParam = {
- type: types.importEntityColumnType.serverAttribute.value,
- key: vm.importParameters.isHeader ? parseData.headers[i] : "",
- sampleData: parseData.rows[0][i]
- };
- }
- vm.columnsParam.push(columnParam);
- }
- }
-
- function addEntities (importData, parameterColumns) {
- var entitiesData = [];
- var sentDataLength = 0;
- var config = {
- ignoreErrors: true,
- resendRequest: true
- };
-
- for (var i = 0; i < importData.rows.length; i++) {
- var entityData = {
- name: "",
- type: "",
- description: "",
- gateway: null,
- label: "",
- accessToken: "",
- attributes: {
- server: [],
- shared: []
- },
- timeseries: []
- };
- for (var j = 0; j < parameterColumns.length; j++) {
- switch (parameterColumns[j].type) {
- case types.importEntityColumnType.serverAttribute.value:
- entityData.attributes.server.push({
- key: parameterColumns[j].key,
- value: importData.rows[i][j]
- });
- break;
- case types.importEntityColumnType.timeseries.value:
- entityData.timeseries.push({
- key: parameterColumns[j].key,
- value: importData.rows[i][j]
- });
- break;
- case types.importEntityColumnType.sharedAttribute.value:
- entityData.attributes.shared.push({
- key: parameterColumns[j].key,
- value: importData.rows[i][j]
- });
- break;
- case types.importEntityColumnType.accessToken.value:
- entityData.accessToken = importData.rows[i][j];
- break;
- case types.importEntityColumnType.name.value:
- entityData.name = importData.rows[i][j];
- break;
- case types.importEntityColumnType.type.value:
- entityData.type = importData.rows[i][j];
- break;
- case types.importEntityColumnType.label.value:
- entityData.label = importData.rows[i][j];
- break;
- case types.importEntityColumnType.isGateway.value:
- entityData.gateway = importData.rows[i][j];
- break;
- case types.importEntityColumnType.description.value:
- entityData.description = importData.rows[i][j];
- break;
- }
- }
- entitiesData.push(entityData);
- }
- $scope.$on('createImportEntityCompleted', function () {
- sentDataLength++;
- vm.progressCreate = Math.round((sentDataLength / importData.rows.length) * 100);
- });
- importExport.createMultiEntity(entitiesData, vm.entityType, vm.importParameters.isUpdate, config).then(function (response) {
- vm.statistical = response;
- vm.isImportData = false;
- $mdStepper('import-stepper').next();
- });
- }
-
- function clearFile() {
- vm.theFormStep1.$setDirty();
- vm.fileName = null;
- vm.importData = null;
- }
-
- function previousStep(step) {
- let steppers = $mdStepper('import-stepper');
- switch (step) {
- case 1:
- steppers.back();
- $timeout(function () {
- vm.theFormStep1.$setDirty();
- });
- break;
- default:
- steppers.back();
- break;
- }
- }
-
- function nextStep(step) {
- let steppers = $mdStepper('import-stepper');
- switch (step) {
- case 2:
- steppers.next();
- break;
- case 3:
- parseData = parseCSV(vm.importData);
- if (parseData === -1) {
- steppers.back();
- $timeout(function () {
- clearFile();
- });
- } else {
- createColumnsData(parseData);
- steppers.next();
- }
- break;
- case 4:
- steppers.next();
- vm.isImportData = true;
- addEntities(parseData, vm.columnsParam);
- break;
- case 6:
- $mdDialog.hide();
- break;
- }
-
- }
-
- function cancel() {
- if($mdStepper('import-stepper').currentStep > 2){
- $mdDialog.hide();
- } else {
- $mdDialog.cancel();
- }
- }
-}
diff --git a/ui/src/app/import-export/import-dialog-csv.tpl.html b/ui/src/app/import-export/import-dialog-csv.tpl.html
deleted file mode 100644
index 610e3d31c7..0000000000
--- a/ui/src/app/import-export/import-dialog-csv.tpl.html
+++ /dev/null
@@ -1,171 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {{ 'action.cancel' | translate }}
-
-
- {{ 'action.continue' | translate }}
-
-
-
-
-
-
-
-
-
-
-
- {{delimiter.value}}
-
-
-
-
- {{ 'import.csv-first-line-header' | translate }}
-
-
- {{ 'import.csv-update-data' | translate }}
-
-
-
-
-
- Back
-
-
-
- {{ 'action.cancel' | translate }}
-
-
- {{ 'action.continue' | translate }}
-
-
-
-
-
-
-
-
-
-
- Back
-
-
-
- {{ 'action.cancel' | translate }}
-
-
- {{ 'action.continue' | translate }}
-
-
-
-
-
-
-
-
-
-
-
-
-
import.message.create-entities
-
import.message.update-entities
-
import.message.error-entities
-
-
-
-
-
- {{ 'action.ok' | translate }}
-
-
-
-
-
-
-
diff --git a/ui/src/app/import-export/import-dialog.controller.js b/ui/src/app/import-export/import-dialog.controller.js
deleted file mode 100644
index d71f137c78..0000000000
--- a/ui/src/app/import-export/import-dialog.controller.js
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Copyright © 2016-2020 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 './import-dialog.scss';
-
-/*@ngInject*/
-export default function ImportDialogController($scope, $mdDialog, toast, importTitle, importFileLabel) {
-
- var vm = this;
-
- vm.cancel = cancel;
- vm.importFromJson = importFromJson;
- vm.fileAdded = fileAdded;
- vm.clearFile = clearFile;
-
- vm.importTitle = importTitle;
- vm.importFileLabel = importFileLabel;
-
-
- function cancel() {
- $mdDialog.cancel();
- }
-
- function fileAdded($file) {
- if ($file.getExtension() === 'json') {
- var reader = new FileReader();
- reader.onload = function(event) {
- $scope.$apply(function() {
- if (event.target.result) {
- $scope.theForm.$setDirty();
- var importJson = event.target.result;
- if (importJson && importJson.length > 0) {
- try {
- vm.importData = angular.fromJson(importJson);
- vm.fileName = $file.name;
- } catch (err) {
- vm.fileName = null;
- toast.showError(err.message);
- }
- }
- }
- });
- };
- reader.readAsText($file.file);
- }
- }
-
- function clearFile() {
- $scope.theForm.$setDirty();
- vm.fileName = null;
- vm.importData = null;
- }
-
- function importFromJson() {
- $scope.theForm.$setPristine();
- $mdDialog.hide(vm.importData);
- }
-}
diff --git a/ui/src/app/import-export/import-dialog.scss b/ui/src/app/import-export/import-dialog.scss
deleted file mode 100644
index b1f8151212..0000000000
--- a/ui/src/app/import-export/import-dialog.scss
+++ /dev/null
@@ -1,62 +0,0 @@
-/**
- * Copyright © 2016-2020 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.scss";
-
-$previewSize: 100px !default;
-
-.tb-file-select-container {
- position: relative;
- width: 100%;
- height: $previewSize;
-}
-
-.tb-file-preview {
- width: auto;
- max-width: $previewSize;
- height: auto;
- max-height: $previewSize;
-}
-
-.tb-file-clear-container {
- position: relative;
- float: right;
- width: 48px;
- height: $previewSize;
-}
-
-.tb-file-clear-btn {
- position: absolute !important;
- top: 50%;
- transform: translate(0%, -50%) !important;
-}
-
-.tb-table-select{
- md-input-container{
- margin: 0;
-
- .md-errors-spacer{
- min-height: 0;
- }
- }
-}
-
-.md-stepper-indicator-wrapper{
- background-color: transparent;
-}
-
-.tb-import-progress{
- margin: 7px 0;
-}
diff --git a/ui/src/app/import-export/import-dialog.tpl.html b/ui/src/app/import-export/import-dialog.tpl.html
deleted file mode 100644
index 9100a8094b..0000000000
--- a/ui/src/app/import-export/import-dialog.tpl.html
+++ /dev/null
@@ -1,72 +0,0 @@
-
-
-
-
diff --git a/ui/src/app/import-export/import-export.service.js b/ui/src/app/import-export/import-export.service.js
deleted file mode 100644
index b5dbfa6ef3..0000000000
--- a/ui/src/app/import-export/import-export.service.js
+++ /dev/null
@@ -1,1026 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-/* eslint-disable import/no-unresolved, import/default*/
-
-import importDialogTemplate from './import-dialog.tpl.html';
-import importDialogCSVTemplate from './import-dialog-csv.tpl.html';
-import entityAliasesTemplate from '../entity/alias/entity-aliases.tpl.html';
-import * as JSZip from 'jszip';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-
-/* eslint-disable no-undef, angular/window-service, angular/document-service */
-
-/*@ngInject*/
-export default function ImportExport($log, $translate, $q, $mdDialog, $document, $http, itembuffer, utils, types, $rootScope,
- dashboardUtils, entityService, dashboardService, ruleChainService, widgetService, toast, attributeService) {
-
- const ZIP_TYPE = {
- mimeType: 'application/zip',
- extension: 'zip'
- };
-
- var service = {
- exportDashboard: exportDashboard,
- importDashboard: importDashboard,
- exportWidget: exportWidget,
- importWidget: importWidget,
- exportRuleChain: exportRuleChain,
- importRuleChain: importRuleChain,
- exportWidgetType: exportWidgetType,
- importWidgetType: importWidgetType,
- exportWidgetsBundle: exportWidgetsBundle,
- importWidgetsBundle: importWidgetsBundle,
- exportJSZip: exportJSZip,
- exportExtension: exportExtension,
- importExtension: importExtension,
- importEntities: importEntities,
- convertCSVToJson: convertCSVToJson,
- exportToPc: exportToPc,
- createMultiEntity: createMultiEntity
- };
-
- return service;
-
- // Widgets bundle functions
-
- function exportWidgetsBundle(widgetsBundleId) {
- widgetService.getWidgetsBundle(widgetsBundleId).then(
- function success(widgetsBundle) {
- var bundleAlias = widgetsBundle.alias;
- var isSystem = widgetsBundle.tenantId.id === types.id.nullUid;
- widgetService.getBundleWidgetTypes(bundleAlias, isSystem).then(
- function success(widgetTypes) {
- prepareExport(widgetsBundle);
- var widgetsBundleItem = {
- widgetsBundle: prepareExport(widgetsBundle),
- widgetTypes: []
- };
- for (var t in widgetTypes) {
- var widgetType = widgetTypes[t];
- if (angular.isDefined(widgetType.bundleAlias)) {
- delete widgetType.bundleAlias;
- }
- widgetsBundleItem.widgetTypes.push(prepareExport(widgetType));
- }
- var name = widgetsBundle.title;
- name = name.toLowerCase().replace(/\W/g, "_");
- exportToPc(widgetsBundleItem, name + '.json');
- },
- function fail(rejection) {
- var message = rejection;
- if (!message) {
- message = $translate.instant('error.unknown-error');
- }
- toast.showError($translate.instant('widgets-bundle.export-failed-error', {error: message}));
- }
- );
- },
- function fail(rejection) {
- var message = rejection;
- if (!message) {
- message = $translate.instant('error.unknown-error');
- }
- toast.showError($translate.instant('widgets-bundle.export-failed-error', {error: message}));
- }
- );
- }
-
- function importNextWidgetType(widgetTypes, bundleAlias, index, deferred) {
- if (!widgetTypes || widgetTypes.length <= index) {
- deferred.resolve();
- } else {
- var widgetType = widgetTypes[index];
- widgetType.bundleAlias = bundleAlias;
- widgetService.saveImportedWidgetType(widgetType).then(
- function success() {
- index++;
- importNextWidgetType(widgetTypes, bundleAlias, index, deferred);
- },
- function fail() {
- deferred.reject();
- }
- );
-
- }
- }
-
- function importWidgetsBundle($event) {
- var deferred = $q.defer();
- openImportDialog($event, 'widgets-bundle.import', 'widgets-bundle.widgets-bundle-file').then(
- function success(widgetsBundleItem) {
- if (!validateImportedWidgetsBundle(widgetsBundleItem)) {
- toast.showError($translate.instant('widgets-bundle.invalid-widgets-bundle-file-error'));
- deferred.reject();
- } else {
- var widgetsBundle = widgetsBundleItem.widgetsBundle;
- widgetService.saveWidgetsBundle(widgetsBundle).then(
- function success(savedWidgetsBundle) {
- var bundleAlias = savedWidgetsBundle.alias;
- var widgetTypes = widgetsBundleItem.widgetTypes;
- importNextWidgetType(widgetTypes, bundleAlias, 0, deferred);
- },
- function fail() {
- deferred.reject();
- }
- );
- }
- },
- function fail() {
- deferred.reject();
- }
- );
- return deferred.promise;
- }
-
- function validateImportedWidgetsBundle(widgetsBundleItem) {
- if (angular.isUndefined(widgetsBundleItem.widgetsBundle)) {
- return false;
- }
- if (angular.isUndefined(widgetsBundleItem.widgetTypes)) {
- return false;
- }
- var widgetsBundle = widgetsBundleItem.widgetsBundle;
- if (angular.isUndefined(widgetsBundle.title)) {
- return false;
- }
- var widgetTypes = widgetsBundleItem.widgetTypes;
- for (var t in widgetTypes) {
- var widgetType = widgetTypes[t];
- if (!validateImportedWidgetType(widgetType)) {
- return false;
- }
- }
-
- return true;
- }
-
- // Widget type functions
-
- function exportWidgetType(widgetTypeId) {
- widgetService.getWidgetTypeById(widgetTypeId).then(
- function success(widgetType) {
- if (angular.isDefined(widgetType.bundleAlias)) {
- delete widgetType.bundleAlias;
- }
- var name = widgetType.name;
- name = name.toLowerCase().replace(/\W/g, "_");
- exportToPc(prepareExport(widgetType), name + '.json');
- },
- function fail(rejection) {
- var message = rejection;
- if (!message) {
- message = $translate.instant('error.unknown-error');
- }
- toast.showError($translate.instant('widget-type.export-failed-error', {error: message}));
- }
- );
- }
-
- function importWidgetType($event, bundleAlias) {
- var deferred = $q.defer();
- openImportDialog($event, 'widget-type.import', 'widget-type.widget-type-file').then(
- function success(widgetType) {
- if (!validateImportedWidgetType(widgetType)) {
- toast.showError($translate.instant('widget-type.invalid-widget-type-file-error'));
- deferred.reject();
- } else {
- widgetType.bundleAlias = bundleAlias;
- widgetService.saveImportedWidgetType(widgetType).then(
- function success() {
- deferred.resolve();
- },
- function fail() {
- deferred.reject();
- }
- );
- }
- },
- function fail() {
- deferred.reject();
- }
- );
- return deferred.promise;
- }
-
- function validateImportedWidgetType(widgetType) {
- if (angular.isUndefined(widgetType.name)
- || angular.isUndefined(widgetType.descriptor)) {
- return false;
- }
- return true;
- }
-
- // Rule chain functions
-
- function exportRuleChain(ruleChainId) {
- ruleChainService.getRuleChain(ruleChainId).then(
- (ruleChain) => {
- ruleChainService.getRuleChainMetaData(ruleChainId).then(
- (ruleChainMetaData) => {
- var ruleChainExport = {
- ruleChain: prepareRuleChain(ruleChain),
- metadata: prepareRuleChainMetaData(ruleChainMetaData)
- };
- var name = ruleChain.name;
- name = name.toLowerCase().replace(/\W/g, "_");
- exportToPc(ruleChainExport, name + '.json');
- },
- (rejection) => {
- processExportRuleChainRejection(rejection);
- }
- );
- },
- (rejection) => {
- processExportRuleChainRejection(rejection);
- }
- );
- }
-
- function prepareRuleChain(ruleChain) {
- ruleChain = prepareExport(ruleChain);
- if (ruleChain.firstRuleNodeId) {
- ruleChain.firstRuleNodeId = null;
- }
- ruleChain.root = false;
- return ruleChain;
- }
-
- function prepareRuleChainMetaData(ruleChainMetaData) {
- delete ruleChainMetaData.ruleChainId;
- for (var i = 0; i < ruleChainMetaData.nodes.length; i++) {
- var node = ruleChainMetaData.nodes[i];
- delete node.ruleChainId;
- ruleChainMetaData.nodes[i] = prepareExport(node);
- }
- return ruleChainMetaData;
- }
-
- function processExportRuleChainRejection(rejection) {
- var message = rejection;
- if (!message) {
- message = $translate.instant('error.unknown-error');
- }
- toast.showError($translate.instant('rulechain.export-failed-error', {error: message}));
- }
-
- function importRuleChain($event) {
- var deferred = $q.defer();
- openImportDialog($event, 'rulechain.import', 'rulechain.rulechain-file').then(
- function success(ruleChainImport) {
- if (!validateImportedRuleChain(ruleChainImport)) {
- toast.showError($translate.instant('rulechain.invalid-rulechain-file-error'));
- deferred.reject();
- } else {
- deferred.resolve(ruleChainImport);
- }
- },
- function fail() {
- deferred.reject();
- }
- );
- return deferred.promise;
- }
-
- function validateImportedRuleChain(ruleChainImport) {
- if (angular.isUndefined(ruleChainImport.ruleChain)) {
- return false;
- }
- if (angular.isUndefined(ruleChainImport.metadata)) {
- return false;
- }
- if (angular.isUndefined(ruleChainImport.ruleChain.name)) {
- return false;
- }
- return true;
- }
-
- // Widget functions
-
- function exportWidget(dashboard, sourceState, sourceLayout, widget) {
- var widgetItem = itembuffer.prepareWidgetItem(dashboard, sourceState, sourceLayout, widget);
- var name = widgetItem.widget.config.title;
- name = name.toLowerCase().replace(/\W/g, "_");
- exportToPc(prepareExport(widgetItem), name + '.json');
- }
-
- function prepareAliasesInfo(aliasesInfo) {
- var datasourceAliases = aliasesInfo.datasourceAliases;
- var targetDeviceAliases = aliasesInfo.targetDeviceAliases;
- var datasourceIndex;
- if (datasourceAliases || targetDeviceAliases) {
- if (datasourceAliases) {
- for (datasourceIndex in datasourceAliases) {
- datasourceAliases[datasourceIndex] = prepareEntityAlias(datasourceAliases[datasourceIndex]);
- }
- }
- if (targetDeviceAliases) {
- for (datasourceIndex in targetDeviceAliases) {
- targetDeviceAliases[datasourceIndex] = prepareEntityAlias(targetDeviceAliases[datasourceIndex]);
- }
- }
- }
- return aliasesInfo;
- }
-
- function prepareEntityAlias(aliasInfo) {
- var alias;
- var filter;
- if (aliasInfo.deviceId) {
- alias = aliasInfo.aliasName;
- filter = {
- type: types.aliasFilterType.entityList.value,
- entityType: types.entityType.device,
- entityList: [aliasInfo.deviceId],
- resolveMultiple: false
- };
- } else if (aliasInfo.deviceFilter) {
- alias = aliasInfo.aliasName;
- filter = {
- type: aliasInfo.deviceFilter.useFilter ? types.aliasFilterType.entityName.value : types.aliasFilterType.entityList.value,
- entityType: types.entityType.device,
- resolveMultiple: false
- }
- if (filter.type == types.aliasFilterType.entityList.value) {
- filter.entityList = aliasInfo.deviceFilter.deviceList
- } else {
- filter.entityNameFilter = aliasInfo.deviceFilter.deviceNameFilter;
- }
- } else if (aliasInfo.entityFilter) {
- alias = aliasInfo.aliasName;
- filter = {
- type: aliasInfo.entityFilter.useFilter ? types.aliasFilterType.entityName.value : types.aliasFilterType.entityList.value,
- entityType: aliasInfo.entityType,
- resolveMultiple: false
- }
- if (filter.type == types.aliasFilterType.entityList.value) {
- filter.entityList = aliasInfo.entityFilter.entityList;
- } else {
- filter.entityNameFilter = aliasInfo.entityFilter.entityNameFilter;
- }
- } else {
- alias = aliasInfo.alias;
- filter = aliasInfo.filter;
- }
- return {
- alias: alias,
- filter: filter
- };
- }
-
- function importWidget($event, dashboard, targetState, targetLayoutFunction, onAliasesUpdateFunction) {
- var deferred = $q.defer();
- openImportDialog($event, 'dashboard.import-widget', 'dashboard.widget-file').then(
- function success(widgetItem) {
- if (!validateImportedWidget(widgetItem)) {
- toast.showError($translate.instant('dashboard.invalid-widget-file-error'));
- deferred.reject();
- } else {
- var widget = widgetItem.widget;
- widget = dashboardUtils.validateAndUpdateWidget(widget);
- var aliasesInfo = prepareAliasesInfo(widgetItem.aliasesInfo);
- var originalColumns = widgetItem.originalColumns;
- var originalSize = widgetItem.originalSize;
-
- var datasourceAliases = aliasesInfo.datasourceAliases;
- var targetDeviceAliases = aliasesInfo.targetDeviceAliases;
- if (datasourceAliases || targetDeviceAliases) {
- var entityAliases = {};
- var datasourceAliasesMap = {};
- var targetDeviceAliasesMap = {};
- var aliasId;
- var datasourceIndex;
- if (datasourceAliases) {
- for (datasourceIndex in datasourceAliases) {
- aliasId = utils.guid();
- datasourceAliasesMap[aliasId] = datasourceIndex;
- entityAliases[aliasId] = datasourceAliases[datasourceIndex];
- entityAliases[aliasId].id = aliasId;
- }
- }
- if (targetDeviceAliases) {
- for (datasourceIndex in targetDeviceAliases) {
- aliasId = utils.guid();
- targetDeviceAliasesMap[aliasId] = datasourceIndex;
- entityAliases[aliasId] = targetDeviceAliases[datasourceIndex];
- entityAliases[aliasId].id = aliasId;
- }
- }
-
- var aliasIds = Object.keys(entityAliases);
- if (aliasIds.length > 0) {
- processEntityAliases(entityAliases, aliasIds).then(
- function (missingEntityAliases) {
- if (Object.keys(missingEntityAliases).length > 0) {
- editMissingAliases($event, [widget],
- true, 'dashboard.widget-import-missing-aliases-title', missingEntityAliases).then(
- function success(updatedEntityAliases) {
- for (var aliasId in updatedEntityAliases) {
- var entityAlias = updatedEntityAliases[aliasId];
- var datasourceIndex;
- if (datasourceAliasesMap[aliasId]) {
- datasourceIndex = datasourceAliasesMap[aliasId];
- datasourceAliases[datasourceIndex] = entityAlias;
- } else if (targetDeviceAliasesMap[aliasId]) {
- datasourceIndex = targetDeviceAliasesMap[aliasId];
- targetDeviceAliases[datasourceIndex] = entityAlias;
- }
- }
- addImportedWidget(dashboard, targetState, targetLayoutFunction, $event, widget,
- aliasesInfo, onAliasesUpdateFunction, originalColumns, originalSize, deferred);
- },
- function fail() {
- deferred.reject();
- }
- );
- } else {
- addImportedWidget(dashboard, targetState, targetLayoutFunction, $event, widget,
- aliasesInfo, onAliasesUpdateFunction, originalColumns, originalSize, deferred);
- }
- }
- );
- } else {
- addImportedWidget(dashboard, targetState, targetLayoutFunction, $event, widget,
- aliasesInfo, onAliasesUpdateFunction, originalColumns, originalSize, deferred);
- }
- } else {
- addImportedWidget(dashboard, targetState, targetLayoutFunction, $event, widget,
- aliasesInfo, onAliasesUpdateFunction, originalColumns, originalSize, deferred);
- }
- }
- },
- function fail() {
- deferred.reject();
- }
- );
- return deferred.promise;
- }
-
- function validateImportedWidget(widgetItem) {
- if (angular.isUndefined(widgetItem.widget)
- || angular.isUndefined(widgetItem.aliasesInfo)
- || angular.isUndefined(widgetItem.originalColumns)) {
- return false;
- }
- var widget = widgetItem.widget;
- if (angular.isUndefined(widget.isSystemType) ||
- angular.isUndefined(widget.bundleAlias) ||
- angular.isUndefined(widget.typeAlias) ||
- angular.isUndefined(widget.type)) {
- return false;
- }
- return true;
- }
-
- function addImportedWidget(dashboard, targetState, targetLayoutFunction, event, widget,
- aliasesInfo, onAliasesUpdateFunction, originalColumns, originalSize, deferred) {
- targetLayoutFunction(event).then(
- function success(targetLayout) {
- itembuffer.addWidgetToDashboard(dashboard, targetState, targetLayout, widget,
- aliasesInfo, onAliasesUpdateFunction, originalColumns, originalSize, -1, -1).then(
- function () {
- deferred.resolve(
- {
- widget: widget,
- layoutId: targetLayout
- }
- );
- }
- );
- },
- function fail() {
- deferred.reject();
- }
- );
- }
-
- // Dashboard functions
-
- function exportDashboard(dashboardId) {
- dashboardService.getDashboard(dashboardId).then(
- function success(dashboard) {
- var name = dashboard.title;
- name = name.toLowerCase().replace(/\W/g, "_");
- exportToPc(prepareDashboardExport(dashboard), name + '.json');
- },
- function fail(rejection) {
- var message = rejection;
- if (!message) {
- message = $translate.instant('error.unknown-error');
- }
- toast.showError($translate.instant('dashboard.export-failed-error', {error: message}));
- }
- );
- }
-
- function prepareDashboardExport(dashboard) {
- dashboard = prepareExport(dashboard);
- delete dashboard.assignedCustomers;
- delete dashboard.publicCustomerId;
- delete dashboard.assignedCustomersText;
- delete dashboard.assignedCustomersIds;
- return dashboard;
- }
-
- function importDashboard($event) {
- var deferred = $q.defer();
- openImportDialog($event, 'dashboard.import', 'dashboard.dashboard-file').then(
- function success(dashboard) {
- if (!validateImportedDashboard(dashboard)) {
- toast.showError($translate.instant('dashboard.invalid-dashboard-file-error'));
- deferred.reject();
- } else {
- dashboard = dashboardUtils.validateAndUpdateDashboard(dashboard);
- var entityAliases = dashboard.configuration.entityAliases;
- if (entityAliases) {
- var aliasIds = Object.keys(entityAliases);
- if (aliasIds.length > 0) {
- processEntityAliases(entityAliases, aliasIds).then(
- function (missingEntityAliases) {
- if (Object.keys(missingEntityAliases).length > 0) {
- editMissingAliases($event, dashboard.configuration.widgets,
- false, 'dashboard.dashboard-import-missing-aliases-title', missingEntityAliases).then(
- function success(updatedEntityAliases) {
- for (var aliasId in updatedEntityAliases) {
- entityAliases[aliasId] = updatedEntityAliases[aliasId];
- }
- saveImportedDashboard(dashboard, deferred);
- },
- function fail() {
- deferred.reject();
- }
- );
- } else {
- saveImportedDashboard(dashboard, deferred);
- }
- }
- )
- } else {
- saveImportedDashboard(dashboard, deferred);
- }
- } else {
- saveImportedDashboard(dashboard, deferred);
- }
- }
- },
- function fail() {
- deferred.reject();
- }
- );
- return deferred.promise;
- }
-
- function importEntities($event, entityType) {
- var deferred = $q.defer();
-
- switch (entityType) {
- case types.entityType.device:
- openImportDialogCSV($event, entityType, 'device.import', 'device.device-file').then(
- function success() {
- deferred.resolve();
- },
- function fail() {
- deferred.reject();
- }
- );
- return deferred.promise;
- case types.entityType.asset:
- openImportDialogCSV($event, entityType, 'asset.import', 'asset.asset-file').then(
- function success() {
- deferred.resolve();
- },
- function fail() {
- deferred.reject();
- }
- );
- return deferred.promise;
- }
-
- }
-
- function saveImportedDashboard(dashboard, deferred) {
- dashboardService.saveDashboard(dashboard).then(
- function success() {
- deferred.resolve();
- },
- function fail() {
- deferred.reject();
- }
- )
- }
-
- function validateImportedDashboard(dashboard) {
- if (angular.isUndefined(dashboard.title) || angular.isUndefined(dashboard.configuration)) {
- return false;
- }
- return true;
- }
-
-
- function exportExtension(extensionId) {
-
- getExtension(extensionId)
- .then(
- function success(extension) {
- var name = extension.title;
- name = name.toLowerCase().replace(/\W/g, "_");
- exportToPc(prepareExport(extension), name + '.json');
- },
- function fail(rejection) {
- var message = rejection;
- if (!message) {
- message = $translate.instant('error.unknown-error');
- }
- toast.showError($translate.instant('extension.export-failed-error', {error: message}));
- }
- );
-
- function getExtension(extensionId) {
- var deferred = $q.defer();
- var url = '/api/plugins/telemetry/DEVICE/' + extensionId;
- $http.get(url, null)
- .then(function success(response) {
- deferred.resolve(response.data);
- }, function fail() {
- deferred.reject();
- });
- return deferred.promise;
- }
-
- }
-
- function importExtension($event, options) {
- var deferred = $q.defer();
- openImportDialog($event, 'extension.import-extensions', 'extension.file')
- .then(
- function success(extension) {
- if (!validateImportedExtension(extension)) {
- toast.showError($translate.instant('extension.invalid-file-error'));
- deferred.reject();
- } else {
- attributeService
- .saveEntityAttributes(
- options.entityType,
- options.entityId,
- types.attributesScope.shared.value,
- [{
- key: "configuration",
- value: angular.toJson(extension)
- }]
- )
- .then(function success() {
- options.successFunc();
- });
- }
- },
- function fail() {
- deferred.reject();
- }
- );
- return deferred.promise;
- }
-
- function validateImportedExtension(configuration) {
- if (configuration.length) {
- for (let i = 0; i < configuration.length; i++) {
- if (angular.isUndefined(configuration[i].configuration) || angular.isUndefined(configuration[i].id) || angular.isUndefined(configuration[i].type)) {
- return false;
- }
- }
- } else {
- return false;
- }
- return true;
- }
-
- function processEntityAliases(entityAliases, aliasIds) {
- var deferred = $q.defer();
- var missingEntityAliases = {};
- var index = -1;
- checkNextEntityAliasOrComplete(index, aliasIds, entityAliases, missingEntityAliases, deferred);
- return deferred.promise;
- }
-
- function checkNextEntityAliasOrComplete(index, aliasIds, entityAliases, missingEntityAliases, deferred) {
- index++;
- if (index == aliasIds.length) {
- deferred.resolve(missingEntityAliases);
- } else {
- checkEntityAlias(index, aliasIds, entityAliases, missingEntityAliases, deferred);
- }
- }
-
- function checkEntityAlias(index, aliasIds, entityAliases, missingEntityAliases, deferred) {
- var aliasId = aliasIds[index];
- var entityAlias = entityAliases[aliasId];
- entityService.checkEntityAlias(entityAlias).then(
- function (result) {
- if (result) {
- checkNextEntityAliasOrComplete(index, aliasIds, entityAliases, missingEntityAliases, deferred);
- } else {
- var missingEntityAlias = angular.copy(entityAlias);
- missingEntityAlias.filter = null;
- missingEntityAliases[aliasId] = missingEntityAlias;
- checkNextEntityAliasOrComplete(index, aliasIds, entityAliases, missingEntityAliases, deferred);
- }
- }
- );
- }
-
- function editMissingAliases($event, widgets, isSingleWidget, customTitle, missingEntityAliases) {
- var deferred = $q.defer();
- $mdDialog.show({
- controller: 'EntityAliasesController',
- controllerAs: 'vm',
- templateUrl: entityAliasesTemplate,
- locals: {
- config: {
- entityAliases: missingEntityAliases,
- widgets: widgets,
- isSingleWidget: isSingleWidget,
- customTitle: customTitle,
- disableAdd: true
- }
- },
- parent: angular.element($document[0].body),
- multiple: true,
- fullscreen: true,
- targetEvent: $event
- }).then(function (updatedEntityAliases) {
- deferred.resolve(updatedEntityAliases);
- }, function () {
- deferred.reject();
- });
- return deferred.promise;
- }
-
- function splitCSV(str, sep) {
- for (var foo = str.split(sep = sep || ","), x = foo.length - 1, tl; x >= 0; x--) {
- if (foo[x].replace(/"\s+$/, '"').charAt(foo[x].length - 1) == '"') {
- if ((tl = foo[x].replace(/^\s+"/, '"')).length > 1 && tl.charAt(0) == '"') {
- foo[x] = foo[x].replace(/^\s*"|"\s*$/g, '').replace(/""/g, '"');
- } else if (x) {
- foo.splice(x - 1, 2, [foo[x - 1], foo[x]].join(sep));
- } else foo = foo.shift().split(sep).concat(foo);
- } else foo[x].replace(/""/g, '"');
- }
- return foo;
- }
-
- function isNumeric(str) {
- str = str.replace(',', '.');
- return !isNaN(parseFloat(str)) && isFinite(str);
- }
-
- function convertStringToJSType(str) {
- if (isNumeric(str.replace(',', '.'))) {
- return parseFloat(str.replace(',', '.'));
- }
- if (str.search(/^(true|false)$/im) === 0) {
- return str === 'true';
- }
- if (str === "") {
- return null;
- }
- return str;
- }
-
- function convertCSVToJson(csvdata, config) {
- config = config || {};
- const delim = config.delim || ",";
- const header = config.header || false;
- let result = {};
-
- let csvlines = csvdata.split(/[\r\n]+/);
- let csvheaders = splitCSV(csvlines[0], delim);
- if (csvheaders.length < 2) {
- toast.showError($translate.instant('import.import-csv-number-columns-error'));
- return -1;
- }
- let csvrows = header ? csvlines.slice(1, csvlines.length) : csvlines;
-
- result.headers = csvheaders;
- result.rows = [];
-
- for (let r in csvrows) {
- if (Object.prototype.hasOwnProperty.call(csvrows, r)) {
- let row = csvrows[r];
-
- if (row.length === 0)
- break;
-
- let rowitems = splitCSV(row, delim);
- if (rowitems.length !== result.headers.length) {
- toast.showError($translate.instant('import.import-csv-invalid-format-error', {line: (header ? result.rows.length + 2: result.rows.length + 1)}));
- return -1;
- }
- for (let i = 0; i < rowitems.length; i++) {
- rowitems[i] = convertStringToJSType(rowitems[i]);
- }
- result.rows.push(rowitems);
- }
- }
- return result;
- }
-
- function sumObject(obj1, obj2){
- Object.keys(obj2).map(function(key) {
- if (angular.isObject(obj2[key])) {
- obj1[key] = obj1[key] || {};
- angular.merge(obj1[key], sumObject(obj1[key], obj2[key]));
- } else {
- obj1[key] = (obj1[key] || 0) + obj2[key];
- }
- });
- return obj1;
- }
-
- function qAllWithProgress(promises) {
- promises.forEach(function(p) {
- p.then(function() {
- $rootScope.$broadcast('createImportEntityCompleted', {});
- });
- });
- return $q.all(promises);
- }
-
- function createMultiEntity(arrayData, entityType, updateData, config) {
- let partSize = 100;
- partSize = arrayData.length > partSize ? partSize : arrayData.length;
- let allPromise = [];
- let statisticalInfo = {};
- let deferred = $q.defer();
-
- for(let i = 0; i < partSize; i++){
- const promise = entityService.saveEntityParameters(entityType, arrayData[i], updateData, config);
- allPromise.push(promise);
- }
-
- qAllWithProgress(allPromise).then(function success(response) {
- for (let i = 0; i < response.length; i++){
- statisticalInfo = sumObject(statisticalInfo, response[i]);
- }
- arrayData.splice(0, partSize);
- if(arrayData.length > 0){
- deferred.resolve(createMultiEntity(arrayData, entityType, updateData, config).then(function (response) {
- return sumObject(statisticalInfo, response);
- }));
- } else {
- deferred.resolve(statisticalInfo);
- }
- });
- return deferred.promise;
- }
-
- // Common functions
-
- function prepareExport(data) {
- var exportedData = angular.copy(data);
- if (angular.isDefined(exportedData.id)) {
- delete exportedData.id;
- }
- if (angular.isDefined(exportedData.createdTime)) {
- delete exportedData.createdTime;
- }
- if (angular.isDefined(exportedData.tenantId)) {
- delete exportedData.tenantId;
- }
- if (angular.isDefined(exportedData.customerId)) {
- delete exportedData.customerId;
- }
- return exportedData;
- }
-
- function exportToPc(data, filename) {
- if (!data) {
- $log.error('No data');
- return;
- }
-
- if (!filename) {
- filename = 'download.json';
- }
-
- if (angular.isObject(data)) {
- data = angular.toJson(data, 2);
- }
-
- var blob = new Blob([data], {type: 'text/json'});
-
- // FOR IE:
-
- if (window.navigator && window.navigator.msSaveOrOpenBlob) {
- window.navigator.msSaveOrOpenBlob(blob, filename);
- } else {
- var e = document.createEvent('MouseEvents'),
- a = document.createElement('a');
-
- a.download = filename;
- a.href = window.URL.createObjectURL(blob);
- a.dataset.downloadurl = ['text/json', a.download, a.href].join(':');
- e.initEvent('click', true, false, window,
- 0, 0, 0, 0, 0, false, false, false, false, 0, null);
- a.dispatchEvent(e);
- }
- }
-
- function openImportDialog($event, importTitle, importFileLabel) {
- var deferred = $q.defer();
- $mdDialog.show({
- controller: 'ImportDialogController',
- controllerAs: 'vm',
- templateUrl: importDialogTemplate,
- locals: {
- importTitle: importTitle,
- importFileLabel: importFileLabel
- },
- parent: angular.element($document[0].body),
- multiple: true,
- fullscreen: true,
- targetEvent: $event
- }).then(function (importData) {
- deferred.resolve(importData);
- }, function () {
- deferred.reject();
- });
- return deferred.promise;
- }
-
- function openImportDialogCSV($event, entityType, importTitle, importFileLabel) {
- var deferred = $q.defer();
- $mdDialog.show({
- controller: 'ImportDialogCSVController',
- controllerAs: 'vm',
- templateUrl: importDialogCSVTemplate,
- locals: {
- importTitle: importTitle,
- importFileLabel: importFileLabel,
- entityType: entityType
- },
- parent: angular.element($document[0].body),
- onComplete: fixedDialogSize,
- multiple: true,
- fullscreen: true,
- targetEvent: $event
- }).then(function () {
- deferred.resolve();
- }, function () {
- deferred.reject();
- });
- return deferred.promise;
- }
-
- function fixedDialogSize(scope, element) {
- let dialogElement = element[0].getElementsByTagName('md-dialog');
- dialogElement[0].style.width = dialogElement[0].offsetWidth + 2 + "px";
- }
-
- function exportJSZip(data, filename) {
- let jsZip = new JSZip();
- for (let keyName in data) {
- let valueData = data[keyName];
- jsZip.file(keyName, valueData);
- }
- jsZip.generateAsync({type: "blob"}).then(function (content) {
- downloadFile(content, filename, ZIP_TYPE);
- });
- }
-
-
- function downloadFile(data, filename, fileType) {
- if (!filename) {
- filename = 'download';
- }
- filename += '.' + fileType.extension;
- var blob = new Blob([data], {type: fileType.mimeType});
- // FOR IE:
- if (window.navigator && window.navigator.msSaveOrOpenBlob) {
- window.navigator.msSaveOrOpenBlob(blob, filename);
- } else {
- var e = document.createEvent('MouseEvents'),
- a = document.createElement('a');
- a.download = filename;
- a.href = window.URL.createObjectURL(blob);
- a.dataset.downloadurl = [fileType.mimeType, a.download, a.href].join(':');
- e.initEvent('click', true, false, window,
- 0, 0, 0, 0, 0, false, false, false, false, 0, null);
- a.dispatchEvent(e);
- }
- }
-}
-
-/* eslint-enable no-undef, angular/window-service, angular/document-service */
diff --git a/ui/src/app/import-export/index.js b/ui/src/app/import-export/index.js
deleted file mode 100644
index 86617c9515..0000000000
--- a/ui/src/app/import-export/index.js
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright © 2016-2020 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 ImportExport from './import-export.service';
-import ImportDialogController from './import-dialog.controller';
-import ImportDialogCSVController from './import-dialog-csv.controller';
-import TableColumnsAssignment from './table-columns-assignment.directive';
-
-
-export default angular.module('thingsboard.importexport', [])
- .factory('importExport', ImportExport)
- .controller('ImportDialogController', ImportDialogController)
- .controller('ImportDialogCSVController', ImportDialogCSVController)
- .directive('tbTableColumnsAssignment', TableColumnsAssignment)
- .name;
diff --git a/ui/src/app/import-export/table-columns-assignment.directive.js b/ui/src/app/import-export/table-columns-assignment.directive.js
deleted file mode 100644
index a295621799..0000000000
--- a/ui/src/app/import-export/table-columns-assignment.directive.js
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-/* eslint-disable import/no-unresolved, import/default */
-
-import tableColumnsAssignment from './table-columns-assignment.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-/*@ngInject*/
-export default function TableColumnsAssignment() {
- return {
- restrict: "E",
- scope: true,
- bindToController: {
- theForm: '=?',
- columns: '=',
- entityType: '=',
- },
- templateUrl: tableColumnsAssignment,
- controller: TableColumnsAssignmentController,
- controllerAs: 'vm'
- };
-}
-
-/*@ngInject*/
-function TableColumnsAssignmentController($scope, types, $timeout) {
- var vm = this;
-
- vm.columnTypes = {};
-
- vm.columnTypes.name = types.importEntityColumnType.name;
- vm.columnTypes.type = types.importEntityColumnType.type;
- vm.columnTypes.label = types.importEntityColumnType.label;
- vm.columnTypes.description = types.importEntityColumnType.description;
-
- switch (vm.entityType) {
- case types.entityType.device:
- vm.columnTypes.sharedAttribute = types.importEntityColumnType.sharedAttribute;
- vm.columnTypes.serverAttribute = types.importEntityColumnType.serverAttribute;
- vm.columnTypes.timeseries = types.importEntityColumnType.timeseries;
- vm.columnTypes.accessToken = types.importEntityColumnType.accessToken;
- vm.columnTypes.gateway = types.importEntityColumnType.isGateway;
- break;
- case types.entityType.asset:
- vm.columnTypes.serverAttribute = types.importEntityColumnType.serverAttribute;
- vm.columnTypes.timeseries = types.importEntityColumnType.timeseries;
- break;
- }
-
- $scope.isColumnTypeDiffers = function(columnType) {
- return columnType !== types.importEntityColumnType.name.value &&
- columnType !== types.importEntityColumnType.type.value &&
- columnType !== types.importEntityColumnType.label.value &&
- columnType !== types.importEntityColumnType.accessToken.value&&
- columnType !== types.importEntityColumnType.isGateway.value&&
- columnType !== types.importEntityColumnType.description.value;
- };
-
- $scope.$watch('vm.columns', function(newVal){
- if (newVal) {
- var isSelectName = false;
- var isSelectType = false;
- var isSelectLabel = false;
- var isSelectCredentials = false;
- var isSelectGateway = false;
- var isSelectDescription = false;
- for (var i = 0; i < newVal.length; i++) {
- switch (newVal[i].type) {
- case types.importEntityColumnType.name.value:
- isSelectName = true;
- break;
- case types.importEntityColumnType.type.value:
- isSelectType = true;
- break;
- case types.importEntityColumnType.label.value:
- isSelectLabel = true;
- break;
- case types.importEntityColumnType.accessToken.value:
- isSelectCredentials = true;
- break;
- case types.importEntityColumnType.isGateway.value:
- isSelectGateway = true;
- break;
- case types.importEntityColumnType.description.value:
- isSelectDescription = true;
- }
- }
- if (isSelectName && isSelectType) {
- vm.theForm.$setDirty();
- } else {
- vm.theForm.$setPristine();
- }
- $timeout(function () {
- vm.columnTypes.name.disable = isSelectName;
- vm.columnTypes.type.disable = isSelectType;
- vm.columnTypes.label.disable = isSelectLabel;
- vm.columnTypes.gateway.disable = isSelectGateway;
- vm.columnTypes.description.disable = isSelectDescription;
- if (angular.isDefined(vm.columnTypes.accessToken)) {
- vm.columnTypes.accessToken.disable = isSelectCredentials;
- }
- });
- }
- }, true);
-}
diff --git a/ui/src/app/import-export/table-columns-assignment.tpl.html b/ui/src/app/import-export/table-columns-assignment.tpl.html
deleted file mode 100644
index 023155d6ac..0000000000
--- a/ui/src/app/import-export/table-columns-assignment.tpl.html
+++ /dev/null
@@ -1,53 +0,0 @@
-
-
-
-
-
diff --git a/ui/src/app/jsonform/index.js b/ui/src/app/jsonform/index.js
deleted file mode 100644
index 8dd3bd4f3c..0000000000
--- a/ui/src/app/jsonform/index.js
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright © 2016-2020 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 uiRouter from 'angular-ui-router';
-import ngMaterial from 'angular-material';
-import ngMessages from 'angular-messages';
-import thingsboardJsonForm from "../components/json-form.directive";
-
-import JsonFormRoutes from './jsonform.routes';
-import JsonFormController from './jsonform.controller';
-
-export default angular.module('thingsboard.jsonform', [
- uiRouter,
- ngMaterial,
- ngMessages,
- thingsboardJsonForm
-])
- .config(JsonFormRoutes)
- .controller('JsonFormController', JsonFormController)
- .name;
diff --git a/ui/src/app/jsonform/jsonform.controller.js b/ui/src/app/jsonform/jsonform.controller.js
deleted file mode 100644
index 29cf8406aa..0000000000
--- a/ui/src/app/jsonform/jsonform.controller.js
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- * Copyright © 2016-2020 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 './jsonform.scss';
-
-/*@ngInject*/
-export default function JsonFormController($scope/*, $rootScope, $log*/) {
-
- var vm = this;
-
- vm.pretty = pretty;
- vm.resetModel = resetModel;
- vm.itParses = true;
- vm.itParsesForm = true;
-
- vm.formJson = "[ \n" +
- " {\n" +
- " \"key\": \"name\",\n" +
- "\t\"type\": \"text\" \n" +
- " },\n" +
- " {\n" +
- "\t\"key\": \"name2\",\n" +
- "\t\"type\": \"color\"\n" +
- " },\n" +
- " {\n" +
- "\t\"key\": \"name3\",\n" +
- "\t\"type\": \"javascript\"\n" +
- " }, \n" +
- "\t\"name4\"\n" +
- "]";
- vm.schemaJson = "{\n" +
- " \"type\": \"object\",\n" +
- " \"title\": \"Comment\",\n" +
- " \"properties\": {\n" +
- " \"name\": {\n" +
- " \"title\": \"Name 1\",\n" +
- " \"type\": \"string\"\n" +
- " },\n" +
- " \"name2\": {\n" +
- " \"title\": \"Name 2\",\n" +
- " \"type\": \"string\"\n" +
- " },\n" +
- " \"name3\": {\n" +
- " \"title\": \"Name 3\",\n" +
- " \"type\": \"string\"\n" +
- " },\n" +
- " \"name4\": {\n" +
- " \"title\": \"Name 4\",\n" +
- " \"type\": \"number\"\n" +
- " }\n" +
- " },\n" +
- " \"required\": [\n" +
- " \"name1\", \"name2\", \"name3\", \"name4\"\n" +
- " ]\n" +
- "}";
-/* '{\n'+
- ' "type": "object",\n'+
- ' "title": "Comment",\n'+
- ' "properties": {\n'+
- ' "name": {\n'+
- ' "title": "Name",\n'+
- ' "type": "string"\n'+
- ' }\n'+
- ' },\n'+
- ' "required": [\n'+
- ' "name"\n'+
- ' ]\n'+
- '}';*/
-
- vm.schema = angular.fromJson(vm.schemaJson);
- vm.form = angular.fromJson(vm.formJson);
- vm.model = { name: '#ccc' };
-
- $scope.$watch('vm.schemaJson',function(val,old){
- if (val && val !== old) {
- try {
- vm.schema = angular.fromJson(vm.schemaJson);
- vm.itParses = true;
- } catch (e){
- vm.itParses = false;
- }
- }
- });
-
-
- $scope.$watch('vm.formJson',function(val,old){
- if (val && val !== old) {
- try {
- vm.form = angular.fromJson(vm.formJson);
- vm.itParsesForm = true;
- } catch (e){
- vm.itParsesForm = false;
- }
- }
- });
-
- function pretty (){
- return angular.isString(vm.model) ? vm.model : angular.toJson(vm.model, true);
- }
-
- function resetModel () {
- $scope.ngform.$setPristine();
- vm.model = { name: 'New hello world!' };
- }
-}
diff --git a/ui/src/app/jsonform/jsonform.routes.js b/ui/src/app/jsonform/jsonform.routes.js
deleted file mode 100644
index a1d3e5de1e..0000000000
--- a/ui/src/app/jsonform/jsonform.routes.js
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-/* eslint-disable import/no-unresolved, import/default */
-
-import jsonFormTemplate from './jsonform.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-/*@ngInject*/
-export default function JsonFormRoutes($stateProvider) {
- $stateProvider
- .state('home.jsonform', {
- url: '/jsonform',
- module: 'private',
- auth: ['SYS_ADMIN'],
- views: {
- "content@home": {
- templateUrl: jsonFormTemplate,
- controllerAs: 'vm',
- controller: 'JsonFormController'
- }
- },
- data: {
- key: 'general',
- pageTitle: 'admin.general-settings'
- },
- ncyBreadcrumb: {
- label: '{"icon": "settings", "label": "admin.system-settings"}'
- }
- });
-}
diff --git a/ui/src/app/jsonform/jsonform.scss b/ui/src/app/jsonform/jsonform.scss
deleted file mode 100644
index b04609d4c2..0000000000
--- a/ui/src/app/jsonform/jsonform.scss
+++ /dev/null
@@ -1,18 +0,0 @@
-/**
- * Copyright © 2016-2020 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.
- */
-.form { height: 400px; }
-
-.schema { height: 800px; }
diff --git a/ui/src/app/jsonform/jsonform.tpl.html b/ui/src/app/jsonform/jsonform.tpl.html
deleted file mode 100644
index 3a2d1b0efe..0000000000
--- a/ui/src/app/jsonform/jsonform.tpl.html
+++ /dev/null
@@ -1,54 +0,0 @@
-
-
-
-
-
The Generated Form
-
-
Readonly
-
-
Form is valid
-
Form is not valid
-
Form is dirty
-
Model
-
Reset model
-
{{vm.pretty()}}
-
-
-
-
-
-
\ No newline at end of file
diff --git a/ui/src/app/layout/breadcrumb-icon.filter.js b/ui/src/app/layout/breadcrumb-icon.filter.js
deleted file mode 100644
index cafed08278..0000000000
--- a/ui/src/app/layout/breadcrumb-icon.filter.js
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-export default function BreadcrumbIcon() {
- return function (bLabel) {
- var labelObj = angular.fromJson(bLabel);
- if (angular.isDefined(labelObj.icon)) {
- return labelObj.icon;
- }
- return null;
- };
-}
diff --git a/ui/src/app/layout/breadcrumb-label.filter.js b/ui/src/app/layout/breadcrumb-label.filter.js
deleted file mode 100644
index f304b5bf94..0000000000
--- a/ui/src/app/layout/breadcrumb-label.filter.js
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-/*@ngInject*/
-export default function BreadcrumbLabel($translate) {
- var labels = {};
-
- var breadcrumbLabel = function (bLabel) {
-
- var labelObj;
- labelObj = angular.fromJson(bLabel);
- if (labelObj) {
- var translate = !(labelObj.translate && labelObj.translate === 'false');
- var key = translate ? $translate.use() : 'orig';
- if (!labels[labelObj.label]) {
- labels[labelObj.label] = {};
- }
- if (!labels[labelObj.label][key]) {
- labels[labelObj.label][key] = labelObj.label;
- if (translate) {
- $translate([labelObj.label]).then(
- function (translations) {
- labels[labelObj.label][key] = translations[labelObj.label];
- }
- )
- }
- }
- return labels[labelObj.label][key];
- } else {
- return '';
- }
- };
-
- breadcrumbLabel.$stateful = true;
-
- return breadcrumbLabel;
-}
diff --git a/ui/src/app/layout/breadcrumb.tpl.html b/ui/src/app/layout/breadcrumb.tpl.html
deleted file mode 100644
index f948b06620..0000000000
--- a/ui/src/app/layout/breadcrumb.tpl.html
+++ /dev/null
@@ -1,38 +0,0 @@
-
-
diff --git a/ui/src/app/layout/home.controller.js b/ui/src/app/layout/home.controller.js
deleted file mode 100644
index df1dcc460f..0000000000
--- a/ui/src/app/layout/home.controller.js
+++ /dev/null
@@ -1,175 +0,0 @@
-/*
- * Copyright © 2016-2020 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 $ from 'jquery';
-
-/* eslint-disable import/no-unresolved, import/default */
-
-import logoSvg from '../../svg/logo_title_white.svg';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-/* eslint-disable angular/angularelement */
-
-/*@ngInject*/
-export default function HomeController(types, loginService, userService, deviceService, Fullscreen, $scope, $element, $rootScope, $document, $state,
- $window, $log, $mdMedia, $animate, $timeout) {
-
- var siteSideNav = $('.tb-site-sidenav', $element);
-
- var vm = this;
-
- vm.Fullscreen = Fullscreen;
- vm.logoSvg = logoSvg;
-
- if (angular.isUndefined($rootScope.searchConfig)) {
- $rootScope.searchConfig = {
- searchEnabled: false,
- searchByEntitySubtype: false,
- searchEntityType: null,
- showSearch: false,
- searchText: "",
- searchEntitySubtype: ""
- };
- }
-
- vm.isShowSidenav = false;
- vm.isLockSidenav = false;
-
- vm.displaySearchMode = displaySearchMode;
- vm.displayEntitySubtypeSearch = displayEntitySubtypeSearch;
- vm.openSidenav = openSidenav;
- vm.goBack = goBack;
- vm.searchTextUpdated = searchTextUpdated;
- vm.sidenavClicked = sidenavClicked;
- vm.toggleFullscreen = toggleFullscreen;
- vm.openSearch = openSearch;
- vm.closeSearch = closeSearch;
-
- $scope.$on('$stateChangeSuccess', function (evt, to, toParams, from) {
- watchEntitySubtype(false);
- if (angular.isDefined(to.data.searchEnabled)) {
- $scope.searchConfig.searchEnabled = to.data.searchEnabled;
- $scope.searchConfig.searchByEntitySubtype = to.data.searchByEntitySubtype;
- $scope.searchConfig.searchEntityType = to.data.searchEntityType;
- if ($scope.searchConfig.searchEnabled === false || to.name !== from.name) {
- $scope.searchConfig.showSearch = false;
- $scope.searchConfig.searchText = "";
- $scope.searchConfig.searchEntitySubtype = "";
- }
- } else {
- $scope.searchConfig.searchEnabled = false;
- $scope.searchConfig.searchByEntitySubtype = false;
- $scope.searchConfig.searchEntityType = null;
- $scope.searchConfig.showSearch = false;
- $scope.searchConfig.searchText = "";
- $scope.searchConfig.searchEntitySubtype = "";
- }
- watchEntitySubtype($scope.searchConfig.searchByEntitySubtype);
- });
-
- vm.isGtSm = $mdMedia('gt-sm');
- if (vm.isGtSm) {
- vm.isLockSidenav = true;
- $animate.enabled(siteSideNav, false);
- }
-
- $scope.$watch(function() { return $mdMedia('gt-sm'); }, function(isGtSm) {
- vm.isGtSm = isGtSm;
- vm.isLockSidenav = isGtSm;
- vm.isShowSidenav = isGtSm;
- if (!isGtSm) {
- $timeout(function() {
- $animate.enabled(siteSideNav, true);
- }, 0, false);
- } else {
- $animate.enabled(siteSideNav, false);
- }
- });
-
- function watchEntitySubtype(enableWatch) {
- if ($scope.entitySubtypeWatch) {
- $scope.entitySubtypeWatch();
- }
- if (enableWatch) {
- $scope.entitySubtypeWatch = $scope.$watch('searchConfig.searchEntitySubtype', function (newVal, prevVal) {
- if (!angular.equals(newVal, prevVal)) {
- $scope.$broadcast('searchEntitySubtypeUpdated');
- }
- });
- }
- }
-
- function displaySearchMode() {
- return $scope.searchConfig.searchEnabled &&
- $scope.searchConfig.showSearch;
- }
-
- function displayEntitySubtypeSearch() {
- return $scope.searchConfig.searchByEntitySubtype && vm.isGtSm;
- }
-
- function toggleFullscreen() {
- if (Fullscreen.isEnabled()) {
- Fullscreen.cancel();
- } else {
- Fullscreen.all();
- }
- }
-
- function openSearch() {
- if ($scope.searchConfig.searchEnabled) {
- $scope.searchConfig.showSearch = true;
- $timeout(() => {
- angular.element('#tb-search-text-input', $element).focus();
- });
- }
- }
-
- function closeSearch() {
- if ($scope.searchConfig.searchEnabled) {
- $scope.searchConfig.showSearch = false;
- if ($scope.searchConfig.searchText.length) {
- $scope.searchConfig.searchText = '';
- searchTextUpdated();
- }
- }
- }
-
- function searchTextUpdated() {
- $scope.$broadcast('searchTextUpdated');
- }
-
- function openSidenav() {
- vm.isShowSidenav = true;
- }
-
- function goBack() {
- $window.history.back();
- }
-
- function closeSidenav() {
- vm.isShowSidenav = false;
- }
-
- function sidenavClicked() {
- if (!vm.isLockSidenav) {
- closeSidenav();
- }
- }
-
-}
-
-/* eslint-enable angular/angularelement */
\ No newline at end of file
diff --git a/ui/src/app/layout/home.routes.js b/ui/src/app/layout/home.routes.js
deleted file mode 100644
index 78cd5cece3..0000000000
--- a/ui/src/app/layout/home.routes.js
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-/* eslint-disable import/no-unresolved, import/default */
-
-import breadcrumbTemplate from './breadcrumb.tpl.html';
-import homeTemplate from './home.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-/*@ngInject*/
-export default function HomeRoutes($stateProvider, $breadcrumbProvider) {
-
- $breadcrumbProvider.setOptions({
- prefixStateName: 'home',
- templateUrl: breadcrumbTemplate
- });
-
- $stateProvider
- .state('home', {
- url: '',
- module: 'private',
- auth: ['SYS_ADMIN', 'TENANT_ADMIN', 'CUSTOMER_USER'],
- views: {
- "@": {
- controller: 'HomeController',
- controllerAs: 'vm',
- templateUrl: homeTemplate
- }
- },
- data: {
- pageTitle: 'home.home'
- },
- ncyBreadcrumb: {
- skip: true
- }
- });
-}
diff --git a/ui/src/app/layout/home.scss b/ui/src/app/layout/home.scss
deleted file mode 100644
index ad0857412a..0000000000
--- a/ui/src/app/layout/home.scss
+++ /dev/null
@@ -1,96 +0,0 @@
-/**
- * Copyright © 2016-2020 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 "~compass-sass-mixins/lib/animate";
-
-.tb-invisible {
- display: none !important;
-}
-
-.tb-primary-toolbar {
- h1 {
- font-size: 24px !important;
- font-weight: 400 !important;
- }
-}
-
-.tb-breadcrumb {
- font-size: 18px !important;
- font-weight: 400 !important;
-
- h1,
- a,
- span {
- overflow: hidden;
- text-overflow: ellipsis;
- white-space: nowrap;
- }
-
- a {
- border: none;
- opacity: .75;
-
- transition: opacity .35s;
- }
-
- a:hover,
- a:focus {
- text-decoration: none !important;
- border: none;
- opacity: 1;
- }
-
- .divider {
- padding: 0 30px;
- }
-}
-
-md-sidenav.tb-site-sidenav {
- width: 250px;
-}
-
-md-icon.tb-logo-title {
- width: 200px;
- height: 36px;
-}
-
-.tb-nav-header {
- z-index: 2;
- flex-shrink: 0;
- white-space: nowrap;
-}
-
-.tb-nav-header-toolbar {
- z-index: 2;
- flex-shrink: 0;
- white-space: nowrap;
- border-bottom: 1px solid rgba(0, 0, 0, .12);
-
- .md-toolbar-tools {
- flex-basis: auto;
- }
-}
-
-.tb-side-menu-toolbar {
- overflow-y: auto;
-}
-
-.tb-entity-subtype-search {
- margin-top: 15px;
-}
-
-.tb-entity-search {
- margin-top: 34px;
-}
diff --git a/ui/src/app/layout/home.tpl.html b/ui/src/app/layout/home.tpl.html
deleted file mode 100644
index 01a4564f76..0000000000
--- a/ui/src/app/layout/home.tpl.html
+++ /dev/null
@@ -1,84 +0,0 @@
-
-
-
-
-
-
-
diff --git a/ui/src/app/layout/index.js b/ui/src/app/layout/index.js
deleted file mode 100644
index f3b4d10e4f..0000000000
--- a/ui/src/app/layout/index.js
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- * Copyright © 2016-2020 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 './home.scss';
-
-import uiRouter from 'angular-ui-router';
-import ngSanitize from 'angular-sanitize';
-import 'angular-breadcrumb';
-
-import thingsboardMenu from '../services/menu.service';
-import thingsboardApiDevice from '../api/device.service';
-import thingsboardApiLogin from '../api/login.service';
-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 thingsboardGatewayConfig from '../components/gateway/gateway-config.directive';
-import thingsboardGatewayConfigSelect from '../components/gateway/gateway-config-select.directive';
-import thingsboardGatewayForm from '../components/gateway/gateway-form.directive';
-import thingsboardJsonObjectEdit from '../components/json-object-edit.directive';
-import thingsboardJsonContent from '../components/json-content.directive';
-
-import thingsboardUserMenu from './user-menu.directive';
-
-import thingsboardEntity from '../entity';
-import thingsboardEvent from '../event';
-import thingsboardAlarm from '../alarm';
-import thingsboardAuditLog from '../audit';
-import thingsboardExtension from '../extension';
-import thingsboardTenant from '../tenant';
-import thingsboardCustomer from '../customer';
-import thingsboardUser from '../user';
-import thingsboardHomeLinks from '../home';
-import thingsboardAdmin from '../admin';
-import thingsboardProfile from '../profile';
-import thingsboardAsset from '../asset';
-import thingsboardDevice from '../device';
-import thingsboardEntityView from '../entity-view';
-import thingsboardWidgetLibrary from '../widget';
-import thingsboardDashboard from '../dashboard';
-import thingsboardRuleChain from '../rulechain';
-import thingsboardQueue from '../components/queue';
-
-import thingsboardJsonForm from '../jsonform';
-
-import HomeRoutes from './home.routes';
-import HomeController from './home.controller';
-import BreadcrumbLabel from './breadcrumb-label.filter';
-import BreadcrumbIcon from './breadcrumb-icon.filter';
-
-export default angular.module('thingsboard.home', [
- uiRouter,
- ngSanitize,
- 'ncy-angular-breadcrumb',
- thingsboardMenu,
- thingsboardHomeLinks,
- thingsboardUserMenu,
- thingsboardEntity,
- thingsboardEvent,
- thingsboardAlarm,
- thingsboardAuditLog,
- thingsboardExtension,
- thingsboardTenant,
- thingsboardCustomer,
- thingsboardUser,
- thingsboardAdmin,
- thingsboardProfile,
- thingsboardAsset,
- thingsboardDevice,
- thingsboardEntityView,
- thingsboardWidgetLibrary,
- thingsboardDashboard,
- thingsboardRuleChain,
- thingsboardQueue,
- thingsboardJsonForm,
- thingsboardApiDevice,
- thingsboardApiLogin,
- thingsboardApiUser,
- thingsboardNoAnimate,
- thingsboardOnFinishRender,
- thingsboardSideMenu,
- thingsboardNavTree,
- thingsboardDashboardAutocomplete,
- thingsboardKvMap,
- thingsboardGatewayConfig,
- thingsboardGatewayConfigSelect,
- thingsboardGatewayForm,
- thingsboardJsonObjectEdit,
- thingsboardJsonContent
-])
- .config(HomeRoutes)
- .controller('HomeController', HomeController)
- .filter('breadcrumbLabel', BreadcrumbLabel)
- .filter('breadcrumbIcon', BreadcrumbIcon)
- .name;
diff --git a/ui/src/app/layout/user-menu.directive.js b/ui/src/app/layout/user-menu.directive.js
deleted file mode 100644
index f64eab7221..0000000000
--- a/ui/src/app/layout/user-menu.directive.js
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * Copyright © 2016-2020 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 './user-menu.scss';
-
-/* eslint-disable import/no-unresolved, import/default */
-
-import userMenuTemplate from './user-menu.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-export default angular.module('thingsboard.directives.usermenu', [])
- .directive('tbUserMenu', UserMenu)
- .name;
-
-/*@ngInject*/
-function UserMenu() {
- return {
- restrict: "E",
- scope: true,
- bindToController: {
- displayUserInfo: '=',
- },
- controller: UserMenuController,
- controllerAs: 'vm',
- templateUrl: userMenuTemplate
- };
-}
-
-/*@ngInject*/
-function UserMenuController($scope, userService, $translate, $state) {
-
- var vm = this;
-
- var dashboardUser = userService.getCurrentUser();
-
- vm.authorityName = authorityName;
- vm.logout = logout;
- vm.openProfile = openProfile;
- vm.userDisplayName = userDisplayName;
-
- function authorityName() {
- var name = "user.anonymous";
- if (dashboardUser) {
- var authority = dashboardUser.authority;
- if (authority === 'SYS_ADMIN') {
- name = 'user.sys-admin';
- } else if (authority === 'TENANT_ADMIN') {
- name = 'user.tenant-admin';
- } else if (authority === 'CUSTOMER_USER') {
- name = 'user.customer';
- }
- }
- return $translate.instant(name);
- }
-
- function userDisplayName() {
- var name = "";
- if (dashboardUser) {
- if ((dashboardUser.firstName && dashboardUser.firstName.length > 0) ||
- (dashboardUser.lastName && dashboardUser.lastName.length > 0)) {
- if (dashboardUser.firstName) {
- name += dashboardUser.firstName;
- }
- if (dashboardUser.lastName) {
- if (name.length > 0) {
- name += " ";
- }
- name += dashboardUser.lastName;
- }
- } else {
- name = dashboardUser.email;
- }
- }
- return name;
- }
-
- function openProfile() {
- $state.go('home.profile');
- }
-
- function logout() {
- userService.logout();
- }
-}
\ No newline at end of file
diff --git a/ui/src/app/layout/user-menu.scss b/ui/src/app/layout/user-menu.scss
deleted file mode 100644
index b66cf7a128..0000000000
--- a/ui/src/app/layout/user-menu.scss
+++ /dev/null
@@ -1,43 +0,0 @@
-/**
- * Copyright © 2016-2020 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.
- */
-div.tb-user-info {
- line-height: 1.5;
-
- span {
- text-align: left;
- text-transform: none;
- }
-
- span.tb-user-display-name {
- font-size: .8rem;
- font-weight: 300;
- letter-spacing: .008em;
- }
-
- span.tb-user-authority {
- font-size: .8rem;
- font-weight: 300;
- letter-spacing: .005em;
- opacity: .8;
- }
-}
-
-md-icon.tb-mini-avatar {
- width: 36px;
- height: 36px;
- margin: auto 8px;
- font-size: 36px;
-}
diff --git a/ui/src/app/layout/user-menu.tpl.html b/ui/src/app/layout/user-menu.tpl.html
deleted file mode 100644
index f36936df0d..0000000000
--- a/ui/src/app/layout/user-menu.tpl.html
+++ /dev/null
@@ -1,45 +0,0 @@
-
-
-
-
account_circle
-
- {{vm.userDisplayName()}}
- {{vm.authorityName()}}
-
-
-
-
- more_vert
-
-
-
-
- account_circle
- home.profile
-
-
-
-
- exit_to_app
- home.logout
-
-
-
-
-
diff --git a/ui/src/app/locale/locale.constant-cs_CZ.json b/ui/src/app/locale/locale.constant-cs_CZ.json
deleted file mode 100644
index 13247f188a..0000000000
--- a/ui/src/app/locale/locale.constant-cs_CZ.json
+++ /dev/null
@@ -1,1646 +0,0 @@
-{
- "access": {
- "unauthorized": "Neautorizováno",
- "unauthorized-access": "Neautorizovaný přístup",
- "unauthorized-access-text": "Musíte se zaregistrovat, abyste měli přístup k tomuto zdroji!",
- "access-forbidden": "Přístup zakázán",
- "access-forbidden-text": "Pro přístup do tohoto umístění nemáte přístupová oprávnění!
Pokud si stále přejete získat přístup do tohoto umístění, zkuste se zaregistrovat pod jiným uživatelem.",
- "refresh-token-expired": "Relace vypršela",
- "refresh-token-failed": "Nemohu aktualizovat relaci"
- },
- "action": {
- "activate": "Aktivovat",
- "suspend": "Deaktivovat",
- "save": "Uložit",
- "saveAs": "Uložit jako",
- "cancel": "Storno",
- "ok": "OK",
- "delete": "Smazat",
- "add": "Přidat",
- "yes": "Ano",
- "no": "Ne",
- "update": "Aktualizovat",
- "remove": "Odstranit",
- "search": "Vyhledat",
- "clear-search": "Zrušit hledání",
- "assign": "Přiřadit",
- "unassign": "Odebrat",
- "share": "Sdílet",
- "make-private": "Učinit soukromým",
- "apply": "Použít",
- "apply-changes": "Uložit změny",
- "edit-mode": "Režim editace",
- "enter-edit-mode": "Vstoupit do režimu editace",
- "decline-changes": "Zahodit změny",
- "close": "Zavřít",
- "back": "Zpět",
- "run": "Spustit",
- "sign-in": "Zaregistrovat!",
- "edit": "Editovat",
- "view": "Zobrazit",
- "create": "Vytvořit",
- "drag": "Táhnout",
- "refresh": "Obnovit",
- "undo": "Vrátit",
- "copy": "Kopírovat",
- "paste": "Vložit",
- "copy-reference": "Kopírovat referenci",
- "paste-reference": "Vložit referenci",
- "import": "Importovat",
- "export": "Exportovat",
- "share-via": "Sdílet přes {{provider}}"
- },
- "aggregation": {
- "aggregation": "Agregace",
- "function": "Funkce pro agregaci dat",
- "limit": "Maximální hodnoty",
- "group-interval": "Interval seskupení",
- "min": "Min",
- "max": "Max",
- "avg": "Průměr",
- "sum": "Suma",
- "count": "Počet",
- "none": "Žádná"
- },
- "admin": {
- "general": "Obecné",
- "general-settings": "Obecná nastavení",
- "outgoing-mail": "Odchozí email",
- "outgoing-mail-settings": "Nastavení odchozího emailu",
- "system-settings": "Systémová nastavení",
- "test-mail-sent": "Testovací zpráva byla úspěšně odeslána!",
- "base-url": "Základní URL",
- "base-url-required": "Hodnota Základní URL je povinná.",
- "mail-from": "Email od",
- "mail-from-required": "Hodnota Email od je povinná.",
- "smtp-protocol": "SMTP protokol",
- "smtp-host": "SMTP host",
- "smtp-host-required": "Hodnota SMTP host je povinná.",
- "smtp-port": "SMTP port",
- "smtp-port-required": "Musíte zadat smtp port.",
- "smtp-port-invalid": "Tohle nevypadá jako platný smtp port.",
- "timeout-msec": "Časový limit (msec)",
- "timeout-required": "Hodnota Časový limit je povinná.",
- "timeout-invalid": "Tohle nevypadá jako platný časový limit.",
- "enable-tls": "Povolit TLS",
- "tls-version": "Verze TLS",
- "send-test-mail": "Odeslat testovací zprávu"
- },
- "alarm": {
- "alarm": "Alarm",
- "alarms": "Alarmy",
- "select-alarm": "Vybrat alarm",
- "no-alarms-matching": "Žádné alarmy odpovídající '{{entity}}' nebyly nalezeny.",
- "alarm-required": "Alarm je povinný",
- "alarm-status": "Stav alarmu",
- "search-status": {
- "ANY": "Všechny",
- "ACTIVE": "Aktivní",
- "CLEARED": "Odstraněné",
- "ACK": "Přijaté",
- "UNACK": "Nepřijaté"
- },
- "display-status": {
- "ACTIVE_UNACK": "Aktivní nepřijaté",
- "ACTIVE_ACK": "Aktivní přijaté",
- "CLEARED_UNACK": "Odstraněné nepřijaté",
- "CLEARED_ACK": "Odstraněné přijaté"
- },
- "no-alarms-prompt": "Žádné alarmy nebyly nalezeny",
- "created-time": "Datum vytvoření",
- "type": "Typ",
- "severity": "Závažnost",
- "originator": "Původce",
- "originator-type": "Typ původce",
- "details": "Detail",
- "status": "Stav",
- "alarm-details": "Detail alarmu",
- "start-time": "Datum zahájení",
- "end-time": "Datum ukončení",
- "ack-time": "Datum přijetí",
- "clear-time": "Datum vyřešení",
- "severity-critical": "Kritická",
- "severity-major": "Vysoká",
- "severity-minor": "Nízká",
- "severity-warning": "Varování",
- "severity-indeterminate": "Střední",
- "acknowledge": "Přijmout",
- "clear": "Vyřešit",
- "search": "Vyhledat alarmy",
- "selected-alarms": "Vybráno { count, plural, 1 {1 alarmů} other {# alarmů} }",
- "no-data": "Nejsou zde žádná data",
- "polling-interval": "Interval frekvence příjmu alarmů (vteřin)",
- "polling-interval-required": "Interval frekvence příjmu alarmů je povinný.",
- "min-polling-interval-message": "Minimální povolený interval frekvence příjmu alarmů je 1 vteřina.",
- "aknowledge-alarms-title": "Přijmout { count, plural, 1 {1 alarm} other {# alarmů} }",
- "aknowledge-alarms-text": "Jste si jisti že chcete přijmout { count, plural, 1 {1 alarm} other {# alarmů} }?",
- "aknowledge-alarm-title": "Přijmout alarm",
- "aknowledge-alarm-text": "Jste si jisti, že chcete přijmout alarm?",
- "clear-alarms-title": "Odstranit { count, plural, 1 {1 alarm} other {# alarmů} }",
- "clear-alarms-text": "Jste si jisti, že chcete odstranit { count, plural, 1 {1 alarm} other {# alarmů} }?",
- "clear-alarm-title": "Odstranit alarm",
- "clear-alarm-text": "Jste si jisti, že chcete alarm odstranit?",
- "alarm-status-filter": "Filtr stavu alarmu"
- },
- "alias": {
- "add": "Přidat alias",
- "edit": "Editovat alias",
- "name": "Název aliasu",
- "name-required": "Název aliasu je povinný",
- "duplicate-alias": "Alias s identickým názvem již existuje.",
- "filter-type-single-entity": "Jedna entita",
- "filter-type-entity-list": "Seznam entit",
- "filter-type-entity-name": "Název entity",
- "filter-type-state-entity": "Entita ze stavu dashboardu",
- "filter-type-state-entity-description": "Entita převzata z parametrů stavu dashboardu",
- "filter-type-asset-type": "Typ aktiva",
- "filter-type-asset-type-description": "Aktiva typu '{{assetType}}'",
- "filter-type-asset-type-and-name-description": "Aktiva typu '{{assetType}}' s názvem začínajícím '{{prefix}}'",
- "filter-type-device-type": "Typ zařízení",
- "filter-type-device-type-description": "Zařízení typu '{{deviceType}}'",
- "filter-type-device-type-and-name-description": "Zařízení typu '{{deviceType}}' s názvem začínajícím '{{prefix}}'",
- "filter-type-entity-view-type": "Typ entitního pohledu",
- "filter-type-entity-view-type-description": "Entitní pohledy typu '{{entityView}}'",
- "filter-type-entity-view-type-and-name-description": "Entitní pohledy typu '{{entityView}}' s názvem začínajícím '{{prefix}}'",
- "filter-type-relations-query": "Dotaz na vztahy",
- "filter-type-relations-query-description": "{{entities}} se {{relationType}} vztahem {{direction}} {{rootEntity}}",
- "filter-type-asset-search-query": "Dotaz na vyhledání aktiva",
- "filter-type-asset-search-query-description": "Aktiva typů {{assetTypes}} se {{relationType}} vztahem {{direction}} {{rootEntity}}",
- "filter-type-device-search-query": "Dotaz na vyhledání zařízení",
- "filter-type-device-search-query-description": "Zařízení typů {{deviceTypes}} se {{relationType}} vztahem {{direction}} {{rootEntity}}",
- "filter-type-entity-view-search-query": "Dotaz na vyhledání zobrazení entity",
- "filter-type-entity-view-search-query-description": "Entitní pohledy typů {{entityViewTypes}} se {{relationType}} vztahem {{direction}} {{rootEntity}}",
- "entity-filter": "Filtr entity",
- "resolve-multiple": "Použít jako více entit",
- "filter-type": "Typ filtru",
- "filter-type-required": "Typ filtru je povinný.",
- "entity-filter-no-entity-matched": "Žádné entity odpovídající specifikovanému filtru nebyly nalezeny.",
- "no-entity-filter-specified": "Nebyl specifikován žádný filtr entit",
- "root-state-entity": "Použít stav entity dashboard jako kořenovou",
- "root-entity": "Kořenová entita",
- "state-entity-parameter-name": "Název parametru stavu entity",
- "default-state-entity": "Defaultní stav entity",
- "default-entity-parameter-name": "Defaultně",
- "max-relation-level": "Maximální úroveň vazeb",
- "unlimited-level": "Neomezená úroveň",
- "state-entity": "Dashboard stav entity",
- "all-entities": "Všechny entity",
- "any-relation": "všechny"
- },
- "asset": {
- "asset": "Aktivum",
- "assets": "Aktiva",
- "management": "Správa aktiv",
- "view-assets": "Zobrazit aktiva",
- "add": "Přidat aktivum",
- "assign-to-customer": "Přiřadit zákazníkovi",
- "assign-asset-to-customer": "Přiřadit aktiva zákazníkovi",
- "assign-asset-to-customer-text": "Prosím vyberte aktiva, která mají být přiřazena zákazníkovi",
- "no-assets-text": "Žádná aktiva nenalezena",
- "assign-to-customer-text": "Prosím vyberte zákazníka, kterému mají být aktiva přiřazena",
- "public": "Veřejné",
- "assignedToCustomer": "Přiřazeno zákazníkovi",
- "make-public": "Zveřejnit aktivum",
- "make-private": "Učinit aktivum neveřejným",
- "unassign-from-customer": "Odebrat aktivum zákazníkovi",
- "delete": "Smazat aktivum",
- "asset-public": "Aktivum je veřejné",
- "asset-type": "Typ aktiva",
- "asset-type-required": "Typ aktiva je povinný.",
- "select-asset-type": "Vyberte typ aktiva",
- "enter-asset-type": "Zadejte typ aktiva",
- "any-asset": "Všechna aktiva",
- "no-asset-types-matching": "Žádné typy aktiv odpovídající '{{entitySubtype}}' nebyly nalezeny.",
- "asset-type-list-empty": "Žádné typy aktiv nebyly vybrány.",
- "asset-types": "Typy aktiv",
- "name": "Název",
- "name-required": "Název je povinný.",
- "description": "Popis",
- "type": "Typ",
- "type-required": "Typ je povinný.",
- "details": "Detail",
- "events": "Události",
- "add-asset-text": "Přidat nové aktivum",
- "asset-details": "Detail aktiva",
- "assign-assets": "Přiřadit aktiva",
- "assign-assets-text": "Přiřadit { count, plural, 1 {1 aktivum} other {# aktiva} } zákazníkovi",
- "delete-assets": "Smazat aktiva",
- "unassign-assets": "Odebrat aktiva",
- "unassign-assets-action-title": "Odebrat { count, plural, 1 {1 aktivum} other {# aktiva} } zákazníkovi",
- "assign-new-asset": "Přiřadit nové aktivum",
- "delete-asset-title": "Jste si jisti, že chcete smazat aktivum '{{assetName}}'?",
- "delete-asset-text": "Buďte opatrní, protože po potvrzení nebude možné aktivum ani žádná související data obnovit.",
- "delete-assets-title": "Jste si jisti, že chcete smazat { count, plural, 1 {1 aktivum} other {# aktiva} }?",
- "delete-assets-action-title": "Smazat { count, plural, 1 {1 aktivum} other {# aktiva} }",
- "delete-assets-text": "Buďte opatrní, protože po potvrzení budou všechna vybraná aktiva odstraněna a žádná související data nebude možné obnovit.",
- "make-public-asset-title": "Jste si jisti, že chcete aktivum '{{assetName}}' zveřejnit?",
- "make-public-asset-text": "Po potvrzení se aktivum a všechna související data stanou veřejnými a dostupnými pro ostatní.",
- "make-private-asset-title": "Jste si jisti, že chcete aktivum '{{assetName}}' učinit neveřejným?",
- "make-private-asset-text": "Po potvrzení se aktivum a všechna související data stanou neveřejnými a nedostupnými pro ostatní.",
- "unassign-asset-title": "Jste si jisti, že chcete odebrat aktivum '{{assetName}}'?",
- "unassign-asset-text": "Po potvrzení bude aktivum odebráno a nebude pro zákazníka dostupné.",
- "unassign-asset": "Odebrat aktivum",
- "unassign-assets-title": "Jste si jisti, že chcete odebrat { count, plural, 1 {1 aktivum} other {# aktiva} }?",
- "unassign-assets-text": "Po potvrzení budou všechna vybraná aktiva odebrána a nebudou pro zákazníka dostupná.",
- "copyId": "Kopírovat Id aktiva",
- "idCopiedMessage": "Id aktiva bylo zkopírováno do schránky",
- "select-asset": "Vybrat aktivum",
- "no-assets-matching": "Žádná aktiva odpovídající '{{entity}}' nebyla nalezena.",
- "asset-required": "Aktivum je povinné",
- "name-starts-with": "Název aktiva začíná",
- "label": "Název"
- },
- "attribute": {
- "attributes": "Atributy",
- "latest-telemetry": "Poslední telemetrie",
- "attributes-scope": "Rozsah atributů entity",
- "scope-latest-telemetry": "Poslední telemetrie",
- "scope-client": "Atributy klienta",
- "scope-server": "Atributy serveru",
- "scope-shared": "Sdílené atributy",
- "add": "Přidat atribut",
- "key": "Klíč",
- "last-update-time": "Čas poslední aktualizace",
- "key-required": "atribut klíč je povinný.",
- "value": "Hodnota",
- "value-required": "Atribut hodnota je povinný.",
- "delete-attributes-title": "Jste si jisti, že chcete smazat { count, plural, 1 {1 atribut} other {# atributů} }?",
- "delete-attributes-text": "Buďte opatrní, protože po potvrzení budou všechny vybrané atributy odstraněny.",
- "delete-attributes": "Smazat atributy",
- "enter-attribute-value": "Zadejte hodnotu atributu",
- "show-on-widget": "Zobrazit ve widgetu",
- "widget-mode": "Režim widgetu",
- "next-widget": "Další widget",
- "prev-widget": "Předchozí widget",
- "add-to-dashboard": "Přidat na dashboard",
- "add-widget-to-dashboard": "Přidat widget na dashboard",
- "selected-attributes": "Vybráno { count, plural, 1 {1 atributů} other {# atributů} }",
- "selected-telemetry": "Vybráno { count, plural, 1 {1 jednotek telemetrie} other {# jednotek telemetrie} }"
- },
- "audit-log": {
- "audit": "Audit",
- "audit-logs": "Záznamy auditu",
- "timestamp": "Časová značka",
- "entity-type": "Typ entity",
- "entity-name": "Název entity",
- "user": "Uživatel",
- "type": "Typ",
- "status": "Stav",
- "details": "Detail",
- "type-added": "Přidáno",
- "type-deleted": "Smazáno",
- "type-updated": "Aktualizováno",
- "type-attributes-updated": "Atributy aktualizovány",
- "type-attributes-deleted": "Atributy smazány",
- "type-rpc-call": "RPC volání",
- "type-credentials-updated": "Přístupové údaje aktualizovány",
- "type-assigned-to-customer": "Přiřazeno zákazníkovi",
- "type-unassigned-from-customer": "Odebráno zákazníkovi",
- "type-activated": "Aktivováno",
- "type-suspended": "Deaktivováno",
- "type-credentials-read": "Zobrazení přístupových údajů",
- "type-attributes-read": "Zobrazení atributů",
- "type-relation-add-or-update": "Vztah aktualizován",
- "type-relation-delete": "Vztah smazán",
- "type-relations-delete": "Všechny vztahy smazány",
- "type-alarm-ack": "Přijato",
- "type-alarm-clear": "Odstraněno",
- "status-success": "Úspěch",
- "status-failure": "Chyba",
- "audit-log-details": "Detail záznamu auditu",
- "no-audit-logs-prompt": "Žádné záznamy nenalezeny",
- "action-data": "Data akce",
- "failure-details": "Detail chyby",
- "search": "Prohledat záznamy auditu",
- "clear-search": "Vymazat vyhledávání"
- },
- "confirm-on-exit": {
- "message": "Některé změny nebyly uloženy. Jste si jisti, že chcete tuto stránku opustit?",
- "html-message": "Některé změny nebyly uloženy.
Jste si jisti, že chcete tuto stránku opustit?",
- "title": "Neuložené změny"
- },
- "contact": {
- "country": "Stát",
- "city": "Město",
- "state": "Region",
- "postal-code": "PSČ",
- "postal-code-invalid": "Formát PSČ neplatný.",
- "address": "Adresa",
- "address2": "Adresa 2",
- "phone": "Telefon",
- "email": "Email",
- "no-address": "Žádná adresa"
- },
- "common": {
- "username": "Uživatelské jméno",
- "password": "Heslo",
- "enter-username": "Zadejte uživatelské jméno",
- "enter-password": "Zadejte heslo",
- "enter-search": "Zadejte hledaný řetězec"
- },
- "content-type": {
- "json": "JSON",
- "text": "Text",
- "binary": "Binární (Base64)"
- },
- "customer": {
- "customer": "Zákazník",
- "customers": "Zákazníci",
- "management": "Správa zákazníků",
- "dashboard": "Dashboard zákazníka",
- "dashboards": "Dashboardy zákazníka",
- "devices": "Zařízení zákazníka",
- "entity-views": "Entitní pohledy zákazníka",
- "assets": "Aktiva zákazníka",
- "public-dashboards": "Veřejné dashboardy",
- "public-devices": "Veřejná zařízení",
- "public-assets": "Veřejná aktiva",
- "public-entity-views": "Veřejné entitní pohledy",
- "add": "Přidat zákazníka",
- "delete": "Smazat zákazníka",
- "manage-customer-users": "Spravovat uživatele zákazníka",
- "manage-customer-devices": "Spravovat zařízení zákazníka",
- "manage-customer-dashboards": "Spravovat dashboardy zákazníka",
- "manage-public-devices": "Spravovat veřejná zařízení",
- "manage-public-dashboards": "Spravovat veřejné dashboardy",
- "manage-customer-assets": "Spravovat aktiva zákazníka",
- "manage-public-assets": "Spravovat veřejná aktiva",
- "add-customer-text": "Přidat nového zákazníka",
- "no-customers-text": "Žádní zákazníci nenalezeni",
- "customer-details": "Detail zákazníka",
- "delete-customer-title": "Jste si jisti, že chcete smazat zákazníka '{{customerTitle}}'?",
- "delete-customer-text": "Buďte opatrní, protože po potvrzení nebude možné zákazníka ani žádná související data obnovit.",
- "delete-customers-title": "Jste si jisti, že chcete smazat { count, plural, 1 {1 zákazníka} other {# zákazníků} }?",
- "delete-customers-action-title": "Smazat { count, plural, 1 {1 zákazníka} other {# zákazníků} }",
- "delete-customers-text": "Buďte opatrní, protože po potvrzení budou všichni vybraní zákazníci odstraněni a žádná související data nebude možné obnovit.",
- "manage-users": "Spravovat uživatele",
- "manage-assets": "Spravovat aktiva",
- "manage-devices": "Spravovat zařízení",
- "manage-dashboards": "Spravovat dashboardy",
- "title": "Název",
- "title-required": "Název je povinný.",
- "description": "Popis",
- "details": "Detail",
- "events": "Události",
- "copyId": "Kopírovat Id zákazníka",
- "idCopiedMessage": "Id zákazníka bylo zkopírováno do schránky",
- "select-customer": "Vybrat zákazníka",
- "no-customers-matching": "Žádní zákazníky odpovídající '{{entity}}' nebyli nalezeni.",
- "customer-required": "Zákazník je povinný",
- "select-default-customer": "Vybrat defaultního zákazníka",
- "default-customer": "Defaultní zákazník",
- "default-customer-required": "Aby bylo možné ladit dashboard na úrovni tenanta, je nutné zadat defaultního zákazníka."
- },
- "datetime": {
- "date-from": "Datum od",
- "time-from": "Čas od",
- "date-to": "Datum do",
- "time-to": "Čas do"
- },
- "dashboard": {
- "dashboard": "Dashboard",
- "dashboards": "Dashboardy",
- "management": "Správa dashboardů",
- "view-dashboards": "Zobrazit dashboardy",
- "add": "Přidat dashboard",
- "assign-dashboard-to-customer": "Přiřadit dashboard(y) zákazníkovi",
- "assign-dashboard-to-customer-text": "Prosím vyberte dashboardy, které mají být přiřazeny zákazníkovi",
- "assign-to-customer-text": "Prosím vyberete zákazníka, kterému má být dashboard(y) přiřazen",
- "assign-to-customer": "Přiřadit zákazníkovi",
- "unassign-from-customer": "Odebrat zákazníkovi",
- "make-public": "Zveřejnit dashboard",
- "make-private": "Učinit dashboard neveřejným",
- "manage-assigned-customers": "Spravovat přiřazené zákazníky",
- "assigned-customers": "Přiřazení zákazníci",
- "assign-to-customers": "Přiřadit dashboard(y) zákazníkovi",
- "assign-to-customers-text": "Prosím vyberte zákazníky, kterým má být dashboard(y) přiřazen(y)",
- "unassign-from-customers": "Odebrat dashboard(y) zákazníkům",
- "unassign-from-customers-text": "Prosím vyberte zákazníky, kterým má být dashboard(y) odebrán(y)",
- "no-dashboards-text": "Nebyly nalezeny žádné dashboardy",
- "no-widgets": "Nejsou nastaveny žádné widgety",
- "add-widget": "Přidat nový widget",
- "title": "Název",
- "select-widget-title": "Vybrat widget",
- "select-widget-subtitle": "Seznam dostupných typů widgetu",
- "delete": "Smazat dashboard",
- "title-required": "Název je povinný.",
- "description": "Popis",
- "details": "Detail",
- "dashboard-details": "Detail dashboardu",
- "add-dashboard-text": "Přidat nový dashboard",
- "assign-dashboards": "Přiřadit dashboardy",
- "assign-new-dashboard": "Přiřadit nový dashboard",
- "assign-dashboards-text": "Přiřadit { count, plural, 1 {1 dashboard} other {# dashboardů} } zákazníkům",
- "unassign-dashboards-action-text": "Odebrat { count, plural, 1 {1 dashboard} other {# dashboardů} } zákazníkům",
- "delete-dashboards": "Smazat dashboardy",
- "unassign-dashboards": "Odebrat dashboardy",
- "unassign-dashboards-action-title": "Odebrat { count, plural, 1 {1 dashboard} other {# dashboardů} } zákazníkovi",
- "delete-dashboard-title": "Jste si jisti, že chcete odstranit dashboard '{{dashboardTitle}}'?",
- "delete-dashboard-text": "Buďte opatrní, protože po potvrzení nebude možné dashboard ani žádná soubisející data obnovit.",
- "delete-dashboards-title": "Jste si jisti, že chcete smazat { count, plural, 1 {1 dashboard} other {# dashboardů} }?",
- "delete-dashboards-action-title": "Smazat { count, plural, 1 {1 dashboard} other {# dashboardů} }",
- "delete-dashboards-text": "Buďte opatrní, protože po potvrzení budou všechny vybrané dashboardy smazány a žádná související data nebude možné obnovit.",
- "unassign-dashboard-title": "Jste si jistí, že chcete odebrat dashboard '{{dashboardTitle}}'?",
- "unassign-dashboard-text": "Po potvrzení bude dashboard odebrán a nebude pro zákazníka dostupný.",
- "unassign-dashboard": "Odebrat dashboard",
- "unassign-dashboards-title": "Jste si jisti, že chcete odebrat { count, plural, 1 {1 dashboard} other {# dashboardů} }?",
- "unassign-dashboards-text": "Po potvrzení budou všechny vybrané dashboardy odebrány a nebudou pro zákazníka dostupné.",
- "public-dashboard-title": "Dashboard je nyní veřejný",
- "public-dashboard-text": "Váš dashboard {{dashboardTitle}} je nyní veřejný a dostupný prostřednictvím následujícího veřejného odkazu:",
- "public-dashboard-notice": "Poznámka: Nezapomeňte zveřejnit také příslušná zařízení, aby bylo možné přistupovat k jejich datům.",
- "make-private-dashboard-title": "Jste si jisti, že chcete dashboard '{{dashboardTitle}}' zneveřejnit?",
- "make-private-dashboard-text": "Po potvrzení bude dashboard neveřejný a nebude pro ostatní dostupný.",
- "make-private-dashboard": "Učinit dashboard neveřejným",
- "socialshare-text": "'{{dashboardTitle}}' powered by ThingsBoard",
- "socialshare-title": "'{{dashboardTitle}}' powered by ThingsBoard",
- "select-dashboard": "Vybrat dashboard",
- "no-dashboards-matching": "Žádné dashboardy odpovídající '{{entity}}' nebyly nalezeny.",
- "dashboard-required": "Dashboard je povinný.",
- "select-existing": "Vybrat existující dashboard",
- "create-new": "Vytvořit nový dashboard",
- "new-dashboard-title": "Název nového dashboardu",
- "open-dashboard": "Otevřít dashboard",
- "set-background": "Nastavit pozadí",
- "background-color": "Barva pozadí",
- "background-image": "Obrázek pozadí",
- "background-size-mode": "Režim velikosti pozadí",
- "no-image": "Žádný obrázek nebyl vybrán",
- "drop-image": "Přetáhněte sem obrázek nebo klikněte pro výběr souboru pro nahrání.",
- "settings": "Nastavení",
- "columns-count": "Počet sloupců",
- "columns-count-required": "Počet sloupců je povinný.",
- "min-columns-count-message": "Minimální povolený počet sloupců je 10.",
- "max-columns-count-message": "Maximální povolený počet sloupců je 1000.",
- "widgets-margins": "Okraj mezi widgety",
- "horizontal-margin": "Horizontální okraj",
- "horizontal-margin-required": "Hodnota horizontálního okraje je povinná.",
- "min-horizontal-margin-message": "Minimální povolená hodnota horizontálního okraje je 0.",
- "max-horizontal-margin-message": "Maximální povolená hodnota horizontálního okraje je 50.",
- "vertical-margin": "Vertikální okraj",
- "vertical-margin-required": "Hodnota vertikálního okraje je povinná.",
- "min-vertical-margin-message": "Minimální povolená hodnota vertikálního okraje je 0.",
- "max-vertical-margin-message": "Maximální povolená hodnota vertikálního okraje je 50.",
- "autofill-height": "Automaticky vyplnit na výšku rozmístění",
- "mobile-layout": "Nastavení rozmístění pro mobilní zařízení",
- "mobile-row-height": "Výška řádku pro mobilní zařízení, px",
- "mobile-row-height-required": "Hodnota výšku řádku pro mobilní zařízení je povinná.",
- "min-mobile-row-height-message": "Minimální povolená hodnota výšku řádku pro mobilní zařízení je 5 pixelů.",
- "max-mobile-row-height-message": "Maximální povolená hodnota výšku řádku pro mobilní zařízení je 200 pixelů.",
- "display-title": "Zobrazit název dashboardu",
- "toolbar-always-open": "Ponechat nástrojovou lištu otevřenou",
- "title-color": "Barva názvu",
- "display-dashboards-selection": "Zobrazit výběr dashboardů",
- "display-entities-selection": "Zobrazit výběr entit",
- "display-dashboard-timewindow": "Zobrazit časové okno",
- "display-dashboard-export": "Zobrazit export",
- "import": "Importovat dashboard",
- "export": "Exportovat dashboard",
- "export-failed-error": "Dashboard nebylo možné exportovat: {{error}}",
- "create-new-dashboard": "Vytvořit nový dashboard",
- "dashboard-file": "Soubor dashboardu",
- "invalid-dashboard-file-error": "Dashboard nebylo možné importovat: Neplatná datová struktura dashboardu.",
- "dashboard-import-missing-aliases-title": "Konfigurovat aliasy používané importovaným dashboardem",
- "create-new-widget": "Přidat nový widget",
- "import-widget": "Importovat widget",
- "widget-file": "Soubor widgetu",
- "invalid-widget-file-error": "Widget nebylo možné importovat: Neplatná datová struktura widgetu.",
- "widget-import-missing-aliases-title": "Konfigurovat aliasy používané importovaným widgetem",
- "open-toolbar": "Otevřít nástrojovou lištu dashboardu",
- "close-toolbar": "Zavřít nástrojovou lištu",
- "configuration-error": "Chyba konfigurace",
- "alias-resolution-error-title": "Chyba konfigurace aliasů dashboardu",
- "invalid-aliases-config": "Nebylo možné nalézt žádná zařízení odpovídající některému z aliasů ve filtru.
Pro vyřešení tohoto problému prosím kontaktujte vašeho administrátora.",
- "select-devices": "Vybrat zařízení",
- "assignedToCustomer": "Přiřazeno zákazníkovi",
- "assignedToCustomers": "Přiřazeno zákazníkům",
- "public": "Veřejné",
- "public-link": "Veřejný odkaz",
- "copy-public-link": "Kopírovat veřejný odkaz",
- "public-link-copied-message": "Veřejný odkaz na dashboard byl zkopírován do schránky",
- "manage-states": "Spravovat stavy dashboardu",
- "states": "Stavy dashboardu",
- "search-states": "Vyhledat stavy dashboardu",
- "selected-states": "Vybráno { count, plural, 1 {1 stavů dashboardu} other {# stavů dashboardu} }",
- "edit-state": "Editovat stav dashboardu",
- "delete-state": "Smazat stav dashboardu",
- "add-state": "Přidat stav dashboardu",
- "state": "Stav dashboardu",
- "state-name": "Název",
- "state-name-required": "Název stavu dashboardu je povinný.",
- "state-id": "Id stavu",
- "state-id-required": "Id stavu dashboardu je povinné.",
- "state-id-exists": "Stav dashboardu s identickým Id již existuje.",
- "is-root-state": "Základní stav",
- "delete-state-title": "Smazat stav dashboardu",
- "delete-state-text": "Jste si jisti, že chcete odstranit stav dashboardu s názvem '{{stateName}}'?",
- "show-details": "Zobrazit detaily",
- "hide-details": "Skrýt detaily",
- "select-state": "Vybrat cílový stav",
- "state-controller": "Kontrolér stavu"
- },
- "datakey": {
- "settings": "Nastavení",
- "advanced": "Rozšířené",
- "label": "Název",
- "color": "Barva",
- "units": "Speciální symbol, který bude zobrazen vedle hodnoty",
- "decimals": "Počet číslic za desetinnou čárkou",
- "data-generation-func": "Funkce pro generování dat",
- "use-data-post-processing-func": "Použít funkci pro následné zpracování",
- "configuration": "Konfigurace datového klíče",
- "timeseries": "Časové řady",
- "attributes": "Atributy",
- "alarm": "Pole alarmu",
- "timeseries-required": "Časové řady entity jsou povinné.",
- "timeseries-or-attributes-required": "Časové řady / atributy entity jsou povinné.",
- "maximum-timeseries-or-attributes": "Maximálně { count, plural, 1 {1 časová řada/atribut je povolena.} other {# časových řad/atributů je povoleno} }",
- "alarm-fields-required": "Pole alarmu jsou povinná.",
- "function-types": "Typy funkcí",
- "function-types-required": "Typy funkcí jsou povinné.",
- "maximum-function-types": "Maximálně { count, plural, 1 {1 typ funkce je povolen.} other {# typů funkce je povoleno} }",
- "time-description": "Časová značka aktuální hodnoty;",
- "value-description": "Aktuální hodnota;",
- "prev-value-description": "Výsledek předchozího volání funkce;",
- "time-prev-description": "Časová značka předchozí hodnoty;",
- "prev-orig-value-description": "Původní předchozí hodnota;"
- },
- "datasource": {
- "type": "Typ datového zdroje",
- "name": "Název",
- "add-datasource-prompt": "Přidejte prosím datový zdroj"
- },
- "details": {
- "edit-mode": "Režim editace",
- "toggle-edit-mode": "Přepnout do režimu editace"
- },
- "device": {
- "device": "Zařízení",
- "device-required": "Zařízení je povinné.",
- "devices": "Zařízení",
- "management": "Správa zařízení",
- "view-devices": "Zobrazit zařízení",
- "device-alias": "Alias zařízení",
- "aliases": "Aliasy zařízení",
- "no-alias-matching": "'{{alias}}' nenalezen.",
- "no-aliases-found": "Žádné aliasy nebyly nalezeny.",
- "no-key-matching": "'{{key}}' nenalezen.",
- "no-keys-found": "Žádné klíče nenalezeny.",
- "create-new-alias": "Vytvořit nový!",
- "create-new-key": "Vytvořit nový!",
- "duplicate-alias-error": "Byl nalezen duplicitní alias '{{alias}}'.
Aliasy zařízení musí být v rámci dashboardu unikátní.",
- "configure-alias": "Konfigurovat '{{alias}}' alias",
- "no-devices-matching": "Žádná zařízení odpovídající '{{entity}}' nebyla nalezena.",
- "alias": "Alias",
- "alias-required": "Alias zařízení je povinný.",
- "remove-alias": "Odebrat alias zařízení",
- "add-alias": "Přidat alias zařízení",
- "name-starts-with": "Název zařízení začíná",
- "device-list": "Seznam zařízení",
- "use-device-name-filter": "Použít filtr",
- "device-list-empty": "Nebyla vybrána žádná zařízení.",
- "device-name-filter-required": "Název filtru zařízení je povinný.",
- "device-name-filter-no-device-matched": "Žádná zařízení začínající '{{device}}' nebyla nalezena.",
- "add": "Přidat zařízení",
- "assign-to-customer": "Přiřadit zákazníkovi",
- "assign-device-to-customer": "Přiřadit zařízení zákazníkovi",
- "assign-device-to-customer-text": "Vyberte prosím zařízení, která mají být přiřazena zákazníkovi",
- "make-public": "Zveřejnit zařízení",
- "make-private": "Učinit zařízení neveřejným",
- "no-devices-text": "Žádná zařízení nebyla nalezena",
- "assign-to-customer-text": "Vyberte prosím zákazníka, který má být přiřazen zařízení(m)",
- "device-details": "Detail zařízení",
- "add-device-text": "Přidat nové zařízení",
- "credentials": "Přístupové údaje",
- "manage-credentials": "Spravovat přístupové údaje",
- "delete": "Smazat zařízení",
- "assign-devices": "Přiřadit zařízení",
- "assign-devices-text": "Přiřadit { count, plural, 1 {1 zařízení} other {# zařízení} } zákazníkovi",
- "delete-devices": "Smazat zařízení",
- "unassign-from-customer": "Odebrat zákazníkovi",
- "unassign-devices": "Odebrat zařízení",
- "unassign-devices-action-title": "Odebrat { count, plural, 1 {1 zařízení} other {# zařízení} } zákazníkovi",
- "assign-new-device": "Přiřadit nové zařízení",
- "make-public-device-title": "Jste si jisti, že chcete zařízení '{{deviceName}}' zveřejnit?",
- "make-public-device-text": "Po potvrzení bude zařízení a všechna jeho data veřejná a dostupná pro ostatní.",
- "make-private-device-title": "Jste si jisti, že chcete zařízení '{{deviceName}}' učinit neveřejným?",
- "make-private-device-text": "Po potvrzení budou zařízení a všechna jeho data neveřejné a nedostupné pro ostatní.",
- "view-credentials": "Zobrazit přístupové údaje",
- "delete-device-title": "Jste si jisti, že chcete smazat zařízení '{{deviceName}}'?",
- "delete-device-text": "Buďte opatrní, protože po potvrzení nebude možné zařízení ani žádná související data obnovit.",
- "delete-devices-title": "Jste si jisti, že chcete smazat { count, plural, 1 {1 zařízení} other {# zařízení} }?",
- "delete-devices-action-title": "Smazat { count, plural, 1 {1 zařízení} other {# zařízení} }",
- "delete-devices-text": "Buďte opatrní, protože po potvrzení budou vybraná zařízení odstraněna a žádná související data nebude možné obnovit.",
- "unassign-device-title": "Jste si jisti, že chcete odebrat zařízení '{{deviceName}}'?",
- "unassign-device-text": "Po potvrzení bude zařízení odebráno a nebude pro zákazníka dostupné.",
- "unassign-device": "Odebrat zařízení",
- "unassign-devices-title": "Jste si jisti, že chcete odebrat { count, plural, 1 {1 zařízení} other {# zařízení} }?",
- "unassign-devices-text": "Po potvrzení budou všechna vybraná zařízení odebrána a nebudou pro zákazníka dostupná.",
- "device-credentials": "Přístupové údaje zařízení",
- "credentials-type": "Typ přístupových údajů",
- "access-token": "Přístupový token",
- "access-token-required": "Přístupový token je povinný.",
- "access-token-invalid": "Délka přístupového tokenu musí být od 1 do 20 znaků.",
- "rsa-key": "RSA veřejný klíč",
- "rsa-key-required": "RSA veřejný klíč je povinný.",
- "secret": "Heslo",
- "secret-required": "Heslo je povinné.",
- "device-type": "Typ zařízení",
- "device-type-required": "Typ zařízení je povinný.",
- "select-device-type": "Vybrat typ zařízení",
- "enter-device-type": "Zadejte typ zařízení",
- "any-device": "Všechna zařízení",
- "no-device-types-matching": "Žádné typy zařízení odpovídající '{{entitySubtype}}' nebyly nalezeny.",
- "device-type-list-empty": "Nebyl vybrán typ zařízení.",
- "device-types": "Typy zařízení",
- "name": "Název",
- "name-required": "Název je povinný.",
- "description": "Popis",
- "events": "Události",
- "details": "Detail",
- "copyId": "Kopírovat Id zařízení",
- "copyAccessToken": "Kopírovat přístupový token",
- "idCopiedMessage": "Id zařízení bylo zkopírováno do schránky",
- "accessTokenCopiedMessage": "Přístupový token zařízení byl zkopírován do schránky",
- "assignedToCustomer": "Přiřazeno zákazníkovi",
- "unable-delete-device-alias-title": "Nebylo možné smazat alias zařízení",
- "unable-delete-device-alias-text": "Alias zařízení '{{deviceAlias}}' nelze smazat, protože je používán následujícími widgety:
{{widgetsList}}",
- "is-gateway": "Je bránou",
- "public": "Veřejné",
- "device-public": "Zařízení je veřejné",
- "select-device": "vybrat zařízení"
- },
- "dialog": {
- "close": "Zavřít dialog"
- },
- "direction": {
- "column": "Sloupec",
- "row": "Řádek"
- },
- "error": {
- "unable-to-connect": "Nebylo možné se připojit k serveru! Zkontrolujte internetové připojení.",
- "unhandled-error-code": "Neošetřený chybový kód: {{errorCode}}",
- "unknown-error": "Neznámá chyba"
- },
- "entity": {
- "entity": "Entita",
- "entities": "Entity",
- "aliases": "Entitní aliasy",
- "entity-alias": "Alias entity",
- "unable-delete-entity-alias-title": "Alias entity nebylo možné smazat",
- "unable-delete-entity-alias-text": "Alias entity '{{entityAlias}}' nelze smazat, protože je používán následujícími widgety:
{{widgetsList}}",
- "duplicate-alias-error": "Nalezen dupliticní alias '{{alias}}'.
Aliasy entit musí být v rámci dashboardu unikátní.",
- "missing-entity-filter-error": "Ve filtru chybí alias '{{alias}}'.",
- "configure-alias": "Konfigurovat '{{alias}}' alias",
- "alias": "Alias",
- "alias-required": "Alias entity je povinný",
- "remove-alias": "Odebrat alias entity",
- "add-alias": "Přidat alias entity",
- "entity-list": "Seznam entit",
- "entity-type": "Typ entity",
- "entity-types": "Typy entit",
- "entity-type-list": "Seznam typů entit",
- "any-entity": "Všechny entity",
- "enter-entity-type": "Zadat typ entity",
- "no-entities-matching": "Žádné entity odpovídající '{{entity}}' nebyly nalezeny.",
- "no-entity-types-matching": "Žádné entity odpovídající '{{entityType}}' nebyly nalezeny.",
- "name-starts-with": "Název začíná",
- "use-entity-name-filter": "Použít filtr",
- "entity-list-empty": "Žádné entity nebyly nalezeny.",
- "entity-type-list-empty": "Nebyl vybrán žádný typ entity.",
- "entity-name-filter-required": "Filtr názvu entity je povinný.",
- "entity-name-filter-no-entity-matched": "Žádné entity začínající '{{entity}}' nebyly nalezeny.",
- "all-subtypes": "Vše",
- "select-entities": "Vybrat entity",
- "no-aliases-found": "Žádné aliasy nebyly nalezeny.",
- "no-alias-matching": "'{{alias}}' nebyl nalezen.",
- "create-new-alias": "Vytvořit nový!",
- "key": "Klíč",
- "key-name": "Název klíče",
- "no-keys-found": "Nebyly nalezeny žádné klíče.",
- "no-key-matching": "'{{key}}' nebyl nalezen.",
- "create-new-key": "Vytvořit nový!",
- "type": "Typ",
- "type-required": "Typ entity je povinný.",
- "type-device": "Zařízení",
- "type-devices": "Zařízení",
- "list-of-devices": "{ count, plural, 1 {Jedno zařízení} other {Seznam # zařízení} }",
- "device-name-starts-with": "Zařízení, jejichž název začíná '{{prefix}}'",
- "type-asset": "Aktivum",
- "type-assets": "Aktiva",
- "list-of-assets": "{ count, plural, 1 {Jedno aktivum} other {Seznam # aktiv} }",
- "asset-name-starts-with": "Aktiva, jejichž název začíná '{{prefix}}'",
- "type-entity-view": "Entitní pohled",
- "type-entity-views": "Entitní pohledy",
- "list-of-entity-views": "{ count, plural, 1 {Jeden entitní pohled} other {Seznam # entitních pohledů} }",
- "entity-view-name-starts-with": "Entitní pohledy, jejichž název začíná '{{prefix}}'",
- "type-rule": "Pravidlo",
- "type-rules": "Pravidla",
- "list-of-rules": "{ count, plural, 1 {Jedno pravidlo} other {Seznam # pravidel} }",
- "rule-name-starts-with": "Pravidla, jejichž název začíná '{{prefix}}'",
- "type-plugin": "Zásuvný modul",
- "type-plugins": "Zásuvné moduly",
- "list-of-plugins": "{ count, plural, 1 {Jeden zásuvný modul} other {Seznam # zásuvných modulů} }",
- "plugin-name-starts-with": "Závusné moduly, jejichž název začíná '{{prefix}}'",
- "type-tenant": "Tenant",
- "type-tenants": "Tenanti",
- "list-of-tenants": "{ count, plural, 1 {Jeden tenant} other {Seznam # tenantů} }",
- "tenant-name-starts-with": "Tenanti, jejichž název začíná '{{prefix}}'",
- "type-customer": "Zákazník",
- "type-customers": "Zákazníci",
- "list-of-customers": "{ count, plural, 1 {Jeden zákazník} other {Seznam # zákazníků} }",
- "customer-name-starts-with": "Zákazníci, jejichž název začíná '{{prefix}}'",
- "type-user": "Uživatel",
- "type-users": "Uživatelé",
- "list-of-users": "{ count, plural, 1 {Jeden uživatel} other {Seznam # uživatelů} }",
- "user-name-starts-with": "Uživatelé, jejichž název začíná '{{prefix}}'",
- "type-dashboard": "Dashboard",
- "type-dashboards": "Dashboardy",
- "list-of-dashboards": "{ count, plural, 1 {Jeden dashboard} other {Seznam # dashboardů} }",
- "dashboard-name-starts-with": "Dashboardy, jejichž název začíná '{{prefix}}'",
- "type-alarm": "Alarm",
- "type-alarms": "Alarmy",
- "list-of-alarms": "{ count, plural, 1 {Jeden alarm} other {Seznam # alarmů} }",
- "alarm-name-starts-with": "Alarmy, jejichž název začíná '{{prefix}}'",
- "type-rulechain": "Řetěz pravidel",
- "type-rulechains": "Řetězy pravidel",
- "list-of-rulechains": "{ count, plural, 1 {Jeden řetěz pravidel} other {Seznam # řetězů pravidel} }",
- "rulechain-name-starts-with": "Řetězy pravidel, jejichž název začíná '{{prefix}}'",
- "type-rulenode": "Uzel pravidla",
- "type-rulenodes": "Uzly pravidel",
- "list-of-rulenodes": "{ count, plural, 1 {Jeden uzel pravidla} other {Seznam # uzlů pravidel} }",
- "rulenode-name-starts-with": "Uzly pravidel, jejichž název začíná '{{prefix}}'",
- "type-current-customer": "Stávající zákazník",
- "type-current-tenant": "Stávající tenant",
- "search": "Vyhledat entity",
- "selected-entities": "{ count, plural, 1 {1 entita} other {# entit} } zvoleno",
- "entity-name": "Název entity",
- "details": "Detail entity",
- "no-entities-prompt": "Nebyly nalezeny žádné entity",
- "no-data": "Nelze zobrazit žádná data",
- "columns-to-display": "Zobrazit sloupce"
- },
- "entity-view": {
- "entity-view": "Entitní pohled",
- "entity-view-required": "Entitní pohled je povinný.",
- "entity-views": "Entitní pohledy",
- "management": "Správa entitních pohledů",
- "view-entity-views": "Zobrazit entitní pohledy",
- "entity-view-alias": "Alias entitního pohledu",
- "aliases": "Aliasy entitního pohledu",
- "no-alias-matching": "'{{alias}}' nenalezen.",
- "no-aliases-found": "Žádné aliasy nebyly nalezeny.",
- "no-key-matching": "'{{key}}' nenalezen.",
- "no-keys-found": "Nebyly nalezeny žádné klíče.",
- "create-new-alias": "Vytvořit nový!",
- "create-new-key": "Vytvořit nový!",
- "duplicate-alias-error": "Byl nalezen duplicitní alias '{{alias}}'.
Aliasy entitních pohledů musí být v rámci dashboardu unikátní.",
- "configure-alias": "Konfigurovat '{{alias}}' alias",
- "no-entity-views-matching": "Žádné entitní pohledy odpovídající '{{entity}}' nebyly nalezeny.",
- "alias": "Alias",
- "alias-required": "Alias entitního pohledu je povinný.",
- "remove-alias": "Odebrat alias entitního pohledu",
- "add-alias": "Přidat alias entitního pohledu",
- "name-starts-with": "Název entitního pohledu začíná",
- "entity-view-list": "Seznam entitních pohledů",
- "use-entity-view-name-filter": "Použít filtr",
- "entity-view-list-empty": "Nebyly vybrány žádné entitní pohledy.",
- "entity-view-name-filter-required": "Filtr názvu entitního pohledu je povinný.",
- "entity-view-name-filter-no-entity-view-matched": "Žádné entitní pohledy začínající '{{entityView}}' nebyly nalezeny.",
- "add": "Přidat entitní pohled",
- "assign-to-customer": "Přiřadit zákazníkovi",
- "assign-entity-view-to-customer": "Přiřadit entitní pohled(y) zákazníkovi",
- "assign-entity-view-to-customer-text": "Vyberte prosím entitní pohledy, které mají být přiřazeny zákazníkovi",
- "no-entity-views-text": "Žádné entitní pohledy nebyly nalezeny",
- "assign-to-customer-text": "Vyberte prosím zákazníka, kterému má být entitní pohled(y) přiřazen(y)",
- "entity-view-details": "Detail entitního pohledu",
- "add-entity-view-text": "Přidat nový entitní pohled",
- "delete": "Smazat entitní pohled",
- "assign-entity-views": "Přiřadit entitní pohledy",
- "assign-entity-views-text": "Přiřadit { count, plural, 1 {1 entitní pohled} other {# entitních pohledů} } zákazníkovi",
- "delete-entity-views": "Smazat entitní pohledy",
- "unassign-from-customer": "Odebrat zákazníkovi",
- "unassign-entity-views": "Odebrat entitní pohledy",
- "unassign-entity-views-action-title": "Odebrat { count, plural, 1 {1 entitní pohled} other {# entitních pohledů} } zákazníkovi",
- "assign-new-entity-view": "Přiřadit nový entitní pohled",
- "delete-entity-view-title": "Jste si jisti, že chcete smazat entitní pohled '{{entityViewName}}'?",
- "delete-entity-view-text": "Buďte opatrní, protože po potvrzení nebude možné entitní pohled ani žádná související data obnovit.",
- "delete-entity-views-title": "Jste si jisti, že chcete odstranit entitní pohled { count, plural, 1 {1 entitní pohled} other {# entitních pohledů} }?",
- "delete-entity-views-action-title": "Smazat { count, plural, 1 {1 entitní pohled} other {# entitních pohledů} }",
- "delete-entity-views-text": "Buďte opatrní, protože po potvrzení budou všechny vybrané entitní pohledy smazány a žádná související data nebude možné obnovit.",
- "unassign-entity-view-title": "Jste si jisti, že chcete odebrat entitní pohled '{{entityViewName}}'?",
- "unassign-entity-view-text": "Po potvrzení bude entitní pohled odebrán a nebude pro zákazníka dostupný.",
- "unassign-entity-view": "Odebrat entitní pohled",
- "unassign-entity-views-title": "Jste si jisti, že chcete odebrat { count, plural, 1 {1 entitní pohled} other {# entitních pohledů} }?",
- "unassign-entity-views-text": "Po potvrzení budou všechny vybrané entitní pohledy odebrány a nebudou pro zákazníka dostupné.",
- "entity-view-type": "Typ entitního pohledu",
- "entity-view-type-required": "Typ entitního pohledu je povinný.",
- "select-entity-view-type": "Vybrat typ entitního pohledu",
- "enter-entity-view-type": "Zadat typ entitního pohledu",
- "any-entity-view": "Všechny entitní pohledy",
- "no-entity-view-types-matching": "Žádné typy entitních pohledů odpovídající '{{entitySubtype}}' nebyly nalezeny.",
- "entity-view-type-list-empty": "Žádné typy entitních pohledů nebyly nalezeny.",
- "entity-view-types": "Typy entitních pohledů",
- "name": "Název",
- "name-required": "Název je povinný.",
- "description": "Popis",
- "events": "Události",
- "details": "Detail",
- "copyId": "Kopírovat Id entitního pohledu",
- "assignedToCustomer": "Přiřazeno zákazníkovi",
- "unable-entity-view-device-alias-title": "Alias entitního typu nebylo možné smazat",
- "unable-entity-view-device-alias-text": "Alias zařízení '{{entityViewAlias}}' nelze smazat, protože je používán následujícími widgety:
{{widgetsList}}",
- "select-entity-view": "Vybrat entitní pohled",
- "make-public": "Zveřejnit entitní pohled",
- "make-private": "Učinit entitní pohled neveřejným",
- "start-date": "Datum zahájení",
- "start-ts": "Čas zahájení",
- "end-date": "Datum ukončení",
- "end-ts": "Čas ukončení",
- "date-limits": "Omezení data",
- "client-attributes": "Klientské atributy",
- "shared-attributes": "Sdílené atributy",
- "server-attributes": "Serverové atributy",
- "timeseries": "Časové řady",
- "client-attributes-placeholder": "Klientské atributy",
- "shared-attributes-placeholder": "Sdílené atributy",
- "server-attributes-placeholder": "Serverové atributy",
- "timeseries-placeholder": "Časové řady",
- "target-entity": "Cílová entita",
- "attributes-propagation": "Propagace atributů",
- "attributes-propagation-hint": "Entitní pohled bude automaticky kopírovat specifikované atributy z cílové entity vždy, když uložíte nebo aktualizujete tento entitní pohled. Z výkonnostních důvodů nejsou atributy cílové entity propagovány při každé změně atributu. Automatickou propagaci můžete povolit konfigurací \"copy to view\" uzlu pravidla v rámci vašeho řetězu pravidel a provázáním \"Post attributes\" a \"Attributes Updated\" zpráv na nový uzel pravidla.",
- "timeseries-data": "Data časových řad",
- "timeseries-data-hint": "Nakonfigurujte klíče dat časových řad cílové entity, která budou dostupná pro entitní pohled. Tato data časových řad jsou pouze pro čtení.",
- "make-public-entity-view-title": "Jste si jisti, že chcete entitní pohled '{{entityViewName}}' zveřejnit?",
- "make-public-entity-view-text": "Po potvrzení bude entitní pohled a všechna jeho data veřejné a dostupné pro ostatní.",
- "make-private-entity-view-title": "Jste si jisti, že chcete entitní pohled '{{entityViewName}}' učinit neveřejným?",
- "make-private-entity-view-text": "Po potvrzení bude entitní pohled a všechna jeho data neveřejné a nebudou dostupné pro ostatní."
- },
- "event": {
- "event-type": "Typ události",
- "type-error": "Chyba",
- "type-lc-event": "Událost životního cyklu",
- "type-stats": "Statistika",
- "type-debug-rule-node": "Ladění",
- "type-debug-rule-chain": "Ladění",
- "no-events-prompt": "Nebyly nalezeny žádné události",
- "error": "Chyba",
- "alarm": "Alarm",
- "event-time": "Čas události",
- "server": "Server",
- "body": "Tělo",
- "method": "Metoda",
- "type": "Typ",
- "entity": "Entita",
- "message-id": "Id zprávy",
- "message-type": "Typ zprávy",
- "data-type": "Typ dat",
- "relation-type": "Typ vztahu",
- "metadata": "Metadata",
- "data": "Data",
- "event": "Událost",
- "status": "Stav",
- "success": "Úspěch",
- "failed": "Neúspěch",
- "messages-processed": "Zpracované zprávy",
- "errors-occurred": "Vyskytly se chyby"
- },
- "extension": {
- "extensions": "Rozšíření",
- "selected-extensions": "Vybráno { count, plural, 1 {1 rozšíření} other {# rozšíření} }",
- "type": "Typ",
- "key": "Klíč",
- "value": "Hodnota",
- "id": "Id",
- "extension-id": "Id rozšíření",
- "extension-type": "Typ rozšíření",
- "transformer-json": "JSON *",
- "unique-id-required": "Id stávajícího rozšíření již existuje.",
- "delete": "Smazat rozšíření",
- "add": "Přidat rozšíření",
- "edit": "Editovat rozšíření",
- "delete-extension-title": "Jste si jisti, že chcete smazat rozšíření '{{extensionId}}'?",
- "delete-extension-text": "Buďte opatrní, protože po potvrzení nebude možné rozšíření ani související data obnovit.",
- "delete-extensions-title": "Jste si jisti, že chcete smazat { count, plural, 1 {1 rozšíření} other {# rozšíření} }?",
- "delete-extensions-text": "Buďte opatrní, protože po potvrzení budou všechna vybraná rozšíření odstraněna.",
- "converters": "Převodník",
- "converter-id": "Id převodníku",
- "configuration": "Konfigurace",
- "converter-configurations": "Konfigurace převodníku",
- "token": "Bezpečnostní token",
- "add-converter": "Přidat převodník",
- "add-config": "Přidat konfiguraci převodníku",
- "device-name-expression": "Výraz názvu zařízení",
- "device-type-expression": "Výraz typu zařízení",
- "custom": "Vlastní",
- "to-double": "Zdvojnásobit",
- "transformer": "Transformátor",
- "json-required": "JSON transformátoru je povinný.",
- "json-parse": "Nebylo možné parsovat JSON transformátoru.",
- "attributes": "Atributy",
- "add-attribute": "Přidat atributy",
- "add-map": "Přidat mapovací prvek",
- "timeseries": "Časové řady",
- "add-timeseries": "Přidat časové řady",
- "field-required": "Pole je povinné",
- "brokers": "Message brokers",
- "add-broker": "Přidat message brokera",
- "host": "Host",
- "port": "Port",
- "port-range": "Port by měl být v rozsahu mezi 1 a 65535.",
- "ssl": "Ssl",
- "credentials": "Přístupové údaje",
- "username": "Uživatelské jméno",
- "password": "Heslo",
- "retry-interval": "Interval pro další pokus v milisekundách",
- "anonymous": "Anonymní",
- "basic": "Základní",
- "pem": "PEM",
- "ca-cert": "soubor CA certifikátu *",
- "private-key": "Soubor privátního klíče *",
- "cert": "Soubor certifikátu *",
- "no-file": "Žádný soubor nebyl vybrán.",
- "drop-file": "Přetáhněte sem soubor nebo klikněte pro výběr souboru pro nahrání.",
- "mapping": "Mapování",
- "topic-filter": "Filtr MQ fronty",
- "converter-type": "Typ převodníku",
- "converter-json": "JSON",
- "json-name-expression": "JSON výraz názvu zařízení",
- "topic-name-expression": "Výraz názvu MQ fronty",
- "json-type-expression": "JSON Výraz typu zařízení",
- "topic-type-expression": "Výraz MQ fronty typu zařízení",
- "attribute-key-expression": "Výraz klíče atributu",
- "attr-json-key-expression": "JSON výraz klíče atributu",
- "attr-topic-key-expression": "Výraz MQ fronty klíče atributu",
- "request-id-expression": "Výraz Id požadavku",
- "request-id-json-expression": "JSON výraz Id požadavku",
- "request-id-topic-expression": "Výraz MQ fronty ID požadavku",
- "response-topic-expression": "Výraz fronty odpovědi",
- "value-expression": "Výraz hodnoty",
- "topic": " MQ fronta",
- "timeout": "Timeout v milisekundách",
- "converter-json-required": "JSON převodníku je povinný.",
- "converter-json-parse": "JSON převodníku nebylo možné parsovat.",
- "filter-expression": "Výraz filtru",
- "connect-requests": "Požadavky na spojení",
- "add-connect-request": "Přidat požadavek na spojení",
- "disconnect-requests": "Požadavky na odpojení",
- "add-disconnect-request": "Přidat požadavek na odpojení",
- "attribute-requests": "Požadavky na atribut",
- "add-attribute-request": "Přidat požadavek na atribut",
- "attribute-updates": "Aktualizace atributu",
- "add-attribute-update": "Přidat aktualizaci atributu",
- "server-side-rpc": "RPC na straně serveru",
- "add-server-side-rpc-request": "Přidat požadavek na RPC na straně serveru",
- "device-name-filter": "Filtr názvu zařízení",
- "attribute-filter": "Filtr atributu",
- "method-filter": "Filtr metody",
- "request-topic-expression": "Výraz požadavku na MQ frontu",
- "response-timeout": "Timeout odpovědi v milisekundách",
- "topic-expression": "Výraz MQ fronty",
- "client-scope": "Scope klienta",
- "add-device": "Přidat zařízení",
- "opc-server": "Servery",
- "opc-add-server": "Přidat server",
- "opc-add-server-prompt": "Prosím přidejte server",
- "opc-application-name": "Název aplikace",
- "opc-application-uri": "URI aplikace",
- "opc-scan-period-in-seconds": "Interval skenování ve vteřinách",
- "opc-security": "Bezpečnost",
- "opc-identity": "Identita",
- "opc-keystore": "Úložiště klíčů",
- "opc-type": "Typ",
- "opc-keystore-type": "Typ",
- "opc-keystore-location": "Umístění *",
- "opc-keystore-password": "Heslo",
- "opc-keystore-alias": "Alias",
- "opc-keystore-key-password": "Heslo klíče",
- "opc-device-node-pattern": "Vzor uzlu zařízení",
- "opc-device-name-pattern": "Vzor názvu zařízení",
- "modbus-server": "Servery/slaves",
- "modbus-add-server": "Přidat server/slave",
- "modbus-add-server-prompt": "Prosím přidejte server/slave",
- "modbus-transport": "Transport",
- "modbus-tcp-reconnect": "Automaticky znovu připojit",
- "modbus-rtu-over-tcp": "RTU přes TCP",
- "modbus-port-name": "Název sériového portu",
- "modbus-encoding": "Šifrování",
- "modbus-parity": "Parita",
- "modbus-baudrate": "Baud rate",
- "modbus-databits": "Data bits",
- "modbus-stopbits": "Stop bits",
- "modbus-databits-range": "Data bits by měly být v rozsahu od 7 do 8.",
- "modbus-stopbits-range": "Stop bits by měly být v rozsahu od 1 do 2.",
- "modbus-unit-id": "ID jednotky",
- "modbus-unit-id-range": "ID jednotky by mělo být v rozsahu od 1 do 247.",
- "modbus-device-name": "Název zařízení",
- "modbus-poll-period": "Interval kontroly (ms)",
- "modbus-attributes-poll-period": "Interval kontroly atributů (ms)",
- "modbus-timeseries-poll-period": "Interval kontroly časových řad (ms)",
- "modbus-poll-period-range": "Interval kontroly by měl mít kladnou hodnotu.",
- "modbus-tag": "Štítek",
- "modbus-function": "Funkce",
- "modbus-register-address": "Adresa registrace",
- "modbus-register-address-range": "Adresa registrace by měla být v rozsahu od 0 do 65535.",
- "modbus-register-bit-index": "Bit index",
- "modbus-register-bit-index-range": "Bit index by měl být v rozsahu od 0 do 15.",
- "modbus-register-count": "Počet registrací",
- "modbus-register-count-range": "Počet registrací by měl mít kladnou hodnotu.",
- "modbus-byte-order": "Byte order",
- "sync": {
- "status": "Stav",
- "sync": "Synchronizováno",
- "not-sync": "Nesynchronizováno",
- "last-sync-time": "Čas poslední synchronizace",
- "not-available": "Nedostupné"
- },
- "export-extensions-configuration": "Exportovat konfiguraci rozšíření",
- "import-extensions-configuration": "Importovat konfiguraci rozšíření",
- "import-extensions": "Importovat rozšíření",
- "import-extension": "Importovat rozšíření",
- "export-extension": "Exportovat rozšíření",
- "file": "Soubor rozšíření",
- "invalid-file-error": "Neplatný soubor rozšíření"
- },
- "fullscreen": {
- "expand": "Rozšířit do režimu celé obrazovky",
- "exit": "Ukončit režim celé obrazovky",
- "toggle": "Přepnout do režimu celé obrazovky",
- "fullscreen": "Celá obrazovka"
- },
- "function": {
- "function": "Funkce"
- },
- "grid": {
- "delete-item-title": "Jste si jisti, že chcete smazat tuto položku?",
- "delete-item-text": "Buďte opatrní, protože po potvrzení nebude možné tuto položku ani žádná související data obnovit.",
- "delete-items-title": "Jste si jisti, že chcete smazat { count, plural, 1 {1 položku} other {# položek} }?",
- "delete-items-action-title": "Smazat { count, plural, 1 {1 položku} other {# položek} }",
- "delete-items-text": "Buďte opatrní, protože po potvrzení budou všechny vybrané položky odstraněny a žádná související data nebude možné obnovit.",
- "add-item-text": "Přidat novou položku",
- "no-items-text": "Žádné položky nebyly nalezeny",
- "item-details": "Detail položky",
- "delete-item": "Smazat položku",
- "delete-items": "Smazat položky",
- "scroll-to-top": "Nahoru"
- },
- "help": {
- "goto-help-page": "Jít na stránku nápovědy"
- },
- "home": {
- "home": "Domů",
- "profile": "Profil",
- "logout": "Odhlásit",
- "menu": "Menu",
- "avatar": "Avatar",
- "open-user-menu": "Otevřít uživatelské menu"
- },
- "import": {
- "no-file": "Nebyl vybrán žádný soubor",
- "drop-file": "Přetáhněte sem JSON soubor nebo klikněte pro výběr souboru pro nahrání."
- },
- "item": {
- "selected": "Vybráno"
- },
- "js-func": {
- "no-return-error": "Funkce musí vrátit hodnotu!",
- "return-type-mismatch": "Funkce musí vrátit hodnotu '{{type}}' typu!",
- "tidy": "Tidy"
- },
- "key-val": {
- "key": "Klíč",
- "value": "Hodnota",
- "remove-entry": "Odstranit záznam",
- "add-entry": "Přidat záznam",
- "no-data": "Žádné záznamy"
- },
- "layout": {
- "layout": "Rozmístění",
- "manage": "Spravovat rozmístění",
- "settings": "Nastavení rozmístění",
- "color": "Barva",
- "main": "Hlavní",
- "right": "Vpravo",
- "select": "Vybrat cílové rozmístění"
- },
- "legend": {
- "direction": "Směr legendy",
- "position": "Pozice legendy",
- "show-max": "Zobrazit max hodnotu",
- "show-min": "Zobrazit min hodnotu",
- "show-avg": "Zobrazit průměrnou hodnotu",
- "show-total": "Zobrazit celkovou hodnotu",
- "settings": "Nastavení legendy",
- "min": "min",
- "max": "max",
- "avg": "průměr",
- "total": "celkem"
- },
- "login": {
- "login": "Přihlásit se",
- "request-password-reset": "Vyžádat reset hesla",
- "reset-password": "Reset hesla",
- "create-password": "Vytvořit heslo",
- "passwords-mismatch-error": "Zadaná hesla se musí shodovat!",
- "password-again": "Heslo znovu",
- "sign-in": "Prosím zaregistrujte se",
- "username": "Uživatelské jméno (email)",
- "remember-me": "Zapamatovat si mě",
- "forgot-password": "Zapomněli jste heslo?",
- "password-reset": "Reset hesla",
- "new-password": "Nové heslo",
- "new-password-again": "Nové heslo znovu",
- "password-link-sent-message": "Odkaz pro reset hesla byl úspěšně odeslán!",
- "email": "Email",
- "login-with": "Přihlásit se přes {{name}}",
- "or": "nebo"
- },
- "position": {
- "top": "Nahoře",
- "bottom": "Dole",
- "left": "Vlevo",
- "right": "Vpravo"
- },
- "profile": {
- "profile": "Profil",
- "change-password": "Změnit heslo",
- "current-password": "Stávající heslo"
- },
- "relation": {
- "relations": "Vztahy",
- "direction": "Směr",
- "search-direction": {
- "FROM": "Od",
- "TO": "K"
- },
- "direction-type": {
- "FROM": "od",
- "TO": "k"
- },
- "from-relations": "Odchozí vztahy",
- "to-relations": "Příchozí vztahy",
- "selected-relations": "Vybráno { count, plural, 1 {1 vztahů} other {# vztahů} }",
- "type": "Typ",
- "to-entity-type": "K typ entity",
- "to-entity-name": "K název entity",
- "from-entity-type": "Z typ entity",
- "from-entity-name": "Z název entity",
- "to-entity": "K entitě",
- "from-entity": "Od entity",
- "delete": "Smazat vztah",
- "relation-type": "Typ vztahu",
- "relation-type-required": "Typ vztahu je povinný.",
- "any-relation-type": "Všechny typy",
- "add": "Přidat vztah",
- "edit": "Editovat vztah",
- "delete-to-relation-title": "Jste si jisti, že chcete smazat vztah k entitě '{{entityName}}'?",
- "delete-to-relation-text": "Buďte opatrní, protože po potvrzení bude vtah entity '{{entityName}}' k aktuální entitě zrušen.",
- "delete-to-relations-title": "Jste si jisti, že chcete smazat { count, plural, 1 {1 vztah} other {# vztahů} }?",
- "delete-to-relations-text": "Buďte opatrní, protože po potvrzení budou všechny vybrané vztahy odstraněny a vztah odpovídajících entit k aktuální entitě bude zrušen.",
- "delete-from-relation-title": "Jste si jisti, že chcete smazat vztah z entity '{{entityName}}'?",
- "delete-from-relation-text": "Buďte opatrní, protože po potvrzení bude zrušen vztah aktuální entity k entitě '{{entityName}}'.",
- "delete-from-relations-title": "Jste si jisti, že chcete smazat { count, plural, 1 {1 vztah} other {# vztahů} }?",
- "delete-from-relations-text": "Buďte opatrní, protože po potvrzení budou všechny vybrané vztahy odstraněny a bude zrušen vztah aktuální entity k odpovídajícím entitám.",
- "remove-relation-filter": "Odebrat filtr vztahů",
- "add-relation-filter": "Přidat filtr vztahu",
- "any-relation": "Všechny vztahy",
- "relation-filters": "Filtry vztahů",
- "additional-info": "Další info (JSON)",
- "invalid-additional-info": "Další informace v JSON nebylo možné parsovat."
- },
- "rulechain": {
- "rulechain": "Řetěz pravidel",
- "rulechains": "Řetězy pravidel",
- "root": "Základní",
- "delete": "Smazat řetěz pravidel",
- "name": "Název",
- "name-required": "Název je povinný.",
- "description": "Popis",
- "add": "Přidat řetěz pravidel",
- "set-root": "Učinit řetěz pravidel základním",
- "set-root-rulechain-title": "Jste si jisti, že chcete učinit řetěz pravidel '{{ruleChainName}}' základním?",
- "set-root-rulechain-text": "Po potvrzení se stane řetěz pravidel základním a bude zajišťovat zpracování všech příchozích transportních zpráv.",
- "delete-rulechain-title": "Jste si jisti, že chcete smazat řetěz pravidel '{{ruleChainName}}'?",
- "delete-rulechain-text": "Buďte opatrní, protože po potvrzení nebude možné řetěz pravidel ani žádná související data obnovit.",
- "delete-rulechains-title": "Jste si jisti, že chcete smazat { count, plural, 1 {1 řetěz pravidel} other {# řetězů pravidel} }?",
- "delete-rulechains-action-title": "Smazat { count, plural, 1 {1 řetěz pravidel} other {# řetězy pravidel} }",
- "delete-rulechains-text": "Buďte opatrní, protože po potvrzení budou všechny vybrané řetězy pravidel odstraněny a žádná související data nebude možné obnovit.",
- "add-rulechain-text": "Přidat nový řetěz pravidel",
- "no-rulechains-text": "Žádné řetězy pravidel nebyly nalezeny",
- "rulechain-details": "Detail řetězu pravidel",
- "details": "Detail",
- "events": "Události",
- "system": "Systém",
- "import": "Importovat řetěz pravidel",
- "export": "Exportovat řetěz pravidel",
- "export-failed-error": "Řetěz pravidel nebylo možné smazat: {{error}}",
- "create-new-rulechain": "Vytvořit nový řetěz pravidel",
- "rulechain-file": "Soubor řetězu pravidel",
- "invalid-rulechain-file-error": "Řetěz pravidel nebylo možné importovat: neplatná datová struktura řetězu pravidel.",
- "copyId": "Kopírovat Id řetězu pravidel",
- "idCopiedMessage": "Id řetězu pravidel bylo zkopírováno do schránky",
- "select-rulechain": "Vybrat řetěz pravidel",
- "no-rulechains-matching": "Žádné řetězy pravidel odpovídající '{{entity}}' nebyly nalezeny.",
- "rulechain-required": "Řetěz pravidel je povinný",
- "management": "Správa pravidel",
- "debug-mode": "Režim ladění"
- },
- "rulenode": {
- "details": "Detail",
- "events": "Události",
- "search": "Vyhledat uzly",
- "open-node-library": "Otevřít knihovnu uzlů",
- "add": "Přidat uzel pravidla",
- "name": "Název",
- "name-required": "Název je povinný.",
- "type": "Typ",
- "description": "Popis",
- "delete": "Smazat uzel pravidla",
- "select-all-objects": "Vybrat všechny uzly a spojení",
- "deselect-all-objects": "Zrušit výběr všech uzlů a spojení",
- "delete-selected-objects": "Smazat vybrané uzly a spojení",
- "delete-selected": "Smazat vybrané",
- "select-all": "Vybrat vše",
- "copy-selected": "Kopírovat vybrané",
- "deselect-all": "Zrušit výběr všech",
- "rulenode-details": "Detail uzlu pravidla",
- "debug-mode": "Režim ladění",
- "configuration": "Konfigurace",
- "link": "Odkaz",
- "link-details": "Detail odkazu uzlu pravidla",
- "add-link": "Přidat odkaz",
- "link-label": "Název odkazu",
- "link-label-required": "Název odkazu je povinný.",
- "custom-link-label": "Vlastní název odkazu",
- "custom-link-label-required": "Název vlastního odkazu je povinný.",
- "link-labels": "Názvy odkazu",
- "link-labels-required": "Názvy odkazu jsou povinné.",
- "no-link-labels-found": "Žádné názvy odkazů nebyly nalezeny",
- "no-link-label-matching": "'{{label}}' nenalezen.",
- "create-new-link-label": "Vytvořit nový!",
- "type-filter": "Filtr",
- "type-filter-details": "Filtruje příchozí zprávy na základě definovaných podmínek",
- "type-enrichment": "Obohacení",
- "type-enrichment-details": "Přidá doplňující informace do metadat zprávy",
- "type-transformation": "Transformace",
- "type-transformation-details": "Změní zprávu a metadata",
- "type-action": "Akce",
- "type-action-details": "Provede speciální akci",
- "type-external": "Externí",
- "type-external-details": "Interaguje s externím systémem",
- "type-rule-chain": "Řetěz pravidel",
- "type-rule-chain-details": "Předá příchozí zprávy specifikovanému řetězu pravidel",
- "type-input": "Vstup",
- "type-input-details": "Logický vstup řetězu pravidel, předává příchozí zprávy dalšímu navazujícímu uzlu pravidla",
- "type-unknown": "Neznámý",
- "type-unknown-details": "Nevyřešený uzel pravidla",
- "directive-is-not-loaded": "Definovaná konfigurační direktiva '{{directiveName}}' není dostupná.",
- "ui-resources-load-error": "Nepodařilo se nahrát konfigurační ui zdroje.",
- "invalid-target-rulechain": "Není možné interagovat s cílovým řetězem pravidel!",
- "test-script-function": "Testovat funkci skriptu",
- "message": "Zpráva",
- "message-type": "Typ zprávy",
- "select-message-type": "Vybrat typ zprávy",
- "message-type-required": "Typ zprávy je povinný",
- "metadata": "Metadata",
- "metadata-required": "Záznam metadat nemůže být prázdný.",
- "output": "Výstup",
- "test": "Test",
- "help": "Nápověda",
- "reset-debug-mode": "Resetovat režim ladění na všech uzlech"
- },
- "tenant": {
- "tenant": "Tenant",
- "tenants": "Tenanti",
- "management": "Správa tenantů",
- "add": "Přidat tenanta",
- "admins": "Administrátoři",
- "manage-tenant-admins": "Spravovat administrátory tenanta",
- "delete": "Smazat tenanta",
- "add-tenant-text": "Přidat nového tenanta",
- "no-tenants-text": "Žádní tenanti nebyli nalezeni",
- "tenant-details": "Detail tenanta",
- "delete-tenant-title": "Jste si jisti, že chcete smazat tenanta '{{tenantTitle}}'?",
- "delete-tenant-text": "Buďte opatrní, protože po potvrzení nebude možné tenanta ani žádná související data obnovit.",
- "delete-tenants-title": "Jste si jisti, že chcete smazat { count, plural, 1 {1 tenanta} other {# tenantů} }?",
- "delete-tenants-action-title": "Smazat { count, plural, 1 {1 tenanta} other {# tenantů} }",
- "delete-tenants-text": "Buďte opatrní, protože po potvrzení budou všichni vybraní tenanti odstranění a žádná související data nebude možné obnovit.",
- "title": "Název",
- "title-required": "Název je povinný.",
- "description": "Popis",
- "details": "Detail",
- "events": "Události",
- "copyId": "Kopírovat Id tenanta",
- "idCopiedMessage": "Id tenanta bylo zkopírováno do schránky",
- "select-tenant": "Vybrat tenanta",
- "no-tenants-matching": "Žádní tenanti odpovídající '{{entity}}' nebyli nalezeni.",
- "tenant-required": "Tenant je povinný"
- },
- "timeinterval": {
- "seconds-interval": "{ seconds, plural, 1 {1 vteřina} other {# vteřin} }",
- "minutes-interval": "{ minutes, plural, 1 {1 minuta} other {# minut} }",
- "hours-interval": "{ hours, plural, 1 {1 hodina} other {# hodin} }",
- "days-interval": "{ days, plural, 1 {1 den} other {# dnů} }",
- "days": "Dny",
- "hours": "Hodiny",
- "minutes": "Minuty",
- "seconds": "Vteřiny",
- "advanced": "Rozšířené"
- },
- "timewindow": {
- "days": "{ days, plural, 1 { den } other {# days } }",
- "hours": "{ hours, plural, 0 { hodina } 1 {1 hodina } other {# hodin } }",
- "minutes": "{ minutes, plural, 0 { minuta } 1 {1 minuta } other {# minut } }",
- "seconds": "{ seconds, plural, 0 { vteřina } 1 {1 vteřina } other {# vteřin } }",
- "realtime": "V reálném čase",
- "history": "Historie",
- "last-prefix": "poslední",
- "period": "od {{ startTime }} do {{ endTime }}",
- "edit": "Editovat časové okno",
- "date-range": "Rozsah data",
- "last": "Poslední",
- "time-period": "Časový interval"
- },
- "user": {
- "user": "Uživatel",
- "users": "Uživatelé",
- "customer-users": "Uživatelé zákazníka",
- "tenant-admins": "Administrátoři tenanta",
- "sys-admin": "Systémový administrátor",
- "tenant-admin": "Administrátor tenanta",
- "customer": "Zákazník",
- "anonymous": "Anonymní",
- "add": "Přidat uživatele",
- "delete": "Smazat uživatele",
- "add-user-text": "Přidat nového uživatele",
- "no-users-text": "Žádní uživatelé nebyli nalezeni",
- "user-details": "Detail uživatele",
- "delete-user-title": "Jste si jisti, že chcete smazat uživatele '{{userEmail}}'?",
- "delete-user-text": "Buďte opatrní, protože po potvrzení nebude možné uživatele ani žádná související data obnovit.",
- "delete-users-title": "Jste si jisti, že chcete smazat { count, plural, 1 {1 uživatele} other {# uživatele} }?",
- "delete-users-action-title": "Smazat { count, plural, 1 {1 uživatele} other {# uživatele} }",
- "delete-users-text": "Buďte opatrní, protože po potvrzení budou všichni vybraní uživatelé odstraněni a žádná související data nebude možné obnovit.",
- "activation-email-sent-message": "Aktivační email byl úspěšně odeslán!",
- "resend-activation": "Znovu poslat aktivační email",
- "email": "Email",
- "email-required": "Email je povinný.",
- "invalid-email-format": "Neplatný formát emailu.",
- "first-name": "Jméno",
- "last-name": "Příjmení",
- "description": "Popis",
- "default-dashboard": "Defaultní dashboard",
- "always-fullscreen": "Zobrazení vždy na celé obrazovce",
- "select-user": "Vybrat uživatele",
- "no-users-matching": "Žádní uživatelé odpovídající '{{entity}}' nebyli nalezeni.",
- "user-required": "Uživatel je povinný",
- "activation-method": "Metoda aktivace",
- "display-activation-link": "Zobrazit aktivační odkaz",
- "send-activation-mail": "Odeslat aktivační email",
- "activation-link": "Aktivační odkaz uživatele",
- "activation-link-text": "Pro aktivaci uživatele použijte následující aktivační odkaz :",
- "copy-activation-link": "Kopírovat aktivační odkaz",
- "activation-link-copied-message": "Aktivační odkaz uživatele byl zkopírován do schránky",
- "details": "Detail",
- "login-as-tenant-admin": "Přihlásit se jako administrátor tenanta",
- "login-as-customer-user": "Přihlásit se jako uživatel zákazníka"
- },
- "value": {
- "type": "Typ hodnoty",
- "string": "Řetězec",
- "string-value": "Hodnota řetězce",
- "integer": "Celé číslo",
- "integer-value": "Hodnota celého čísla",
- "invalid-integer-value": "Neplatná hodnota celého čísla",
- "double": "Číslo s plovoucí řádovou s dvojitou přesností",
- "double-value": "Hodnota čísla s plovoucí řádovou řádkou",
- "boolean": "Pravdivostní hodnota",
- "boolean-value": "Hodnota pravdivostní hodnoty",
- "false": "Nepravda",
- "true": "Pravda",
- "long": "Vysoké celé číslo"
- },
- "widget": {
- "widget-library": "Knihovna widgetů",
- "widget-bundle": "Kategorie widgetů",
- "select-widgets-bundle": "Vybrat kategorii widgetů",
- "management": "Správa widgetů",
- "editor": "Editor widgetů",
- "widget-type-not-found": "Problém s nahráním konfigurace widgetu.
Pravděpodobně byl asociovaný\n typ widgetu odstraněn.",
- "widget-type-load-error": "Widget nebyl nahrán z důvodu následujících chyb:",
- "remove": "Odebrat widget",
- "edit": "Editovat widget",
- "remove-widget-title": "Jste si jisti, že chcete odebrat widget '{{widgetTitle}}'?",
- "remove-widget-text": "Po potvrzení nebude možné widget ani žádná související data obnovit.",
- "timeseries": "Časové řady",
- "search-data": "Vyhledat data",
- "no-data-found": "Žádná data nebyla nalezena",
- "latest-values": "Poslední hodnoty",
- "rpc": "Ovládací widget",
- "alarm": "Widgety alarmu",
- "static": "Statické widgety",
- "select-widget-type": "Vybrat typ widgetu",
- "missing-widget-title-error": "Název widgetu musí být specifikován!",
- "widget-saved": "Widget uložen",
- "unable-to-save-widget-error": "Widget nebylo možné uložit! Widget obsahuje chyby!",
- "save": "Uložit widget",
- "saveAs": "Uložit widget jako",
- "save-widget-type-as": "Uložit typ widgetu jako",
- "save-widget-type-as-text": "Zadejte prosím název nového widgetu a/nebo vyberte cílovou kategorii widgetů",
- "toggle-fullscreen": "Přepnout na celou obrazovku",
- "run": "Spustit widget",
- "title": "Název widgetu",
- "title-required": "Název widgetu je povinný.",
- "type": "Typ widgetu",
- "resources": "Zdroje",
- "resource-url": "JavaScript/CSS URL",
- "remove-resource": "Odebrat zdroj",
- "add-resource": "Přidat zdroj",
- "html": "HTML",
- "tidy": "Tidy",
- "css": "CSS",
- "settings-schema": "Schéma nastavení",
- "datakey-settings-schema": "Schéma nastavení datového klíče",
- "javascript": "Javascript",
- "remove-widget-type-title": "Jste si jisti, že chcete odebrat typ widgetu '{{widgetName}}'?",
- "remove-widget-type-text": "Po potvrzení nebude možné typ widgetu ani žádná související data obnovit.",
- "remove-widget-type": "Odebrat typ widgetu",
- "add-widget-type": "Přidat nový typ widgetu",
- "widget-type-load-failed-error": "Nahrání typu widgetu selhalo!",
- "widget-template-load-failed-error": "Nahrání šablony widgetu selhalo!",
- "add": "Přidat widget",
- "undo": "Vrátit změny widgetu",
- "export": "Exportovat widget"
- },
- "widget-action": {
- "header-button": "Tlačítko hlavičky widgetu",
- "open-dashboard-state": "Přejít k novému stavu dashboardu",
- "update-dashboard-state": "Aktualizovat stávající stav dashboardu",
- "open-dashboard": "Přejít k jinému dashboardu",
- "custom": "Vlastní akce",
- "target-dashboard-state": "Cílový stav dashboardu",
- "target-dashboard-state-required": "Cílový stav dashboardu je povinný",
- "set-entity-from-widget": "Nastavit entitu z widgetu",
- "target-dashboard": "Cílový dashboard",
- "open-right-layout": "Otevřít rozmístění dashboardu vpravo (mobilní zobrazení)"
- },
- "widgets-bundle": {
- "current": "Vybraná kategorie",
- "widgets-bundles": "Kategorie widgetů",
- "add": "Přidat kategorii widgetů",
- "delete": "Smazat kategorii widgetů",
- "title": "Název",
- "title-required": "Název je povinný.",
- "add-widgets-bundle-text": "Přidat novou kategorii widgetů",
- "no-widgets-bundles-text": "Žádné kategorie widgetů nebyly nalezeny",
- "empty": "Kategorie widgetů je prázdná",
- "details": "Detail",
- "widgets-bundle-details": "Detail kategorie widgetů",
- "delete-widgets-bundle-title": "Jste si jisti, že chcete smazat kategorii widgetů '{{widgetsBundleTitle}}'?",
- "delete-widgets-bundle-text": "Buďte opatrní, po potvrzení nebude možné kategorii widgetů ani žádná související data obnovit.",
- "delete-widgets-bundles-title": "Jste si jisti, že chcete odstranit { count, plural, 1 {1 kategorii widgetů} other {# kategorií widgetů} }?",
- "delete-widgets-bundles-action-title": "Smazat { count, plural, 1 {1 kategorii widgetů} other {# kategorií widgetů} }",
- "delete-widgets-bundles-text": "Buďte opatrní, po potvrzení budou všechny vybrané kategorie widgetů odstraněny a žádná související data nebude možné obnovit.",
- "no-widgets-bundles-matching": "Žádné kategorie widgetů odpovídající '{{widgetsBundle}}' nebyly nalezeny.",
- "widgets-bundle-required": "Kategorie widgetů je povinná.",
- "system": "Systém",
- "import": "Importovat kategorii widgetů",
- "export": "Exportovat kategorii widgetů",
- "export-failed-error": "Kategorii widgetů nebylo možné exportovat: {{error}}",
- "create-new-widgets-bundle": "Vytvořit novou kategorii widgetů",
- "widgets-bundle-file": "Soubor kategorie widgetů",
- "invalid-widgets-bundle-file-error": "Kategorii widgetů nebylo možné importovat: Neplatná datová struktura kategorie widgetů."
- },
- "widget-config": {
- "data": "Data",
- "settings": "Nastavení",
- "advanced": "Rozšířené",
- "title": "Název",
- "general-settings": "Obecná nastavení",
- "display-title": "Zobrazovaný název",
- "drop-shadow": "Stín",
- "enable-fullscreen": "Povolit zobrazení na celé obrazovce",
- "background-color": "Barva pozadí",
- "text-color": "Barva textu",
- "padding": "Šířka vnitřního okraje",
- "margin": "Okraj",
- "widget-style": "Styl widgetu",
- "title-style": "Název stylu",
- "mobile-mode-settings": "Nastavení mobilního režimu",
- "order": "Pořadí",
- "height": "Výška",
- "units": "Speciální symbol zobrazovaný za hodnotou",
- "decimals": "Počet číslic za desetinnou čárkou",
- "timewindow": "Časové okno",
- "use-dashboard-timewindow": "Použít časové okno dashboardu",
- "display-legend": "Zobrazit legendu",
- "datasources": "Datové zdroje",
- "maximum-datasources": "Maximum { count, plural, 1 {1 datový zdroj je povolen.} other {# datových zdrojů je povoleno} }",
- "datasource-type": "Typ",
- "datasource-parameters": "Parametry",
- "remove-datasource": "Odebrat datový zdroj",
- "add-datasource": "Přidat datový zdroj",
- "target-device": "Cílové zařízení",
- "alarm-source": "Zdroj alarmu",
- "actions": "Akce",
- "action": "Akce",
- "add-action": "Přidat akci",
- "search-actions": "Vyhledat akce",
- "action-source": "Zdroj akce",
- "action-source-required": "Zdroj akce je povinný.",
- "action-name": "Název",
- "action-name-required": "Název akce je povinný.",
- "action-name-not-unique": "Jiná akce s identickým názvem již existuje.
Název akce by měl být v rámci zdroje akce unikátní.",
- "action-icon": "Ikona",
- "action-type": "Typ",
- "action-type-required": "Typ akce je povinný.",
- "edit-action": "Editovat akci",
- "delete-action": "Smazat akci",
- "delete-action-title": "Smazat akci widgetu",
- "delete-action-text": "Jste si jisti, že chcete smazat akci widgetu s názvem '{{actionName}}'?"
- },
- "widget-type": {
- "import": "Importovat typ widgetu",
- "export": "Exportovat typ widgetu",
- "export-failed-error": "Typ widgetu nebylo možné exportovat: {{error}}",
- "create-new-widget-type": "Vytvořit nový typ widgetu",
- "widget-type-file": "Soubor typu widgetu",
- "invalid-widget-type-file-error": "Typ widgetu nebylo možné importovat: Neplatná datová struktura typu widgetu."
- },
- "widgets": {
- "date-range-navigator": {
- "localizationMap": {
- "Sun": "Ne",
- "Mon": "Po",
- "Tue": "Út",
- "Wed": "St",
- "Thu": "Čt",
- "Fri": "Pá",
- "Sat": "So",
- "Jan": "Led",
- "Feb": "Úno",
- "Mar": "Bře",
- "Apr": "Dub",
- "May": "Květen",
- "Jun": "Čvn",
- "Jul": "Čvc",
- "Aug": "Srp",
- "Sep": "Zář",
- "Oct": "Říj",
- "Nov": "Lis",
- "Dec": "Pro",
- "January": "Leden",
- "February": "Únor",
- "March": "Březen",
- "April": "Duben",
- "June": "Červen",
- "July": "Červenec",
- "August": "Srpen",
- "September": "Září",
- "October": "Říjen",
- "November": "Listopad",
- "December": "Prosinec",
- "Custom Date Range": "Vlastní rozsah data",
- "Date Range Template": "Šablona rozsahu data",
- "Today": "Dnes",
- "Yesterday": "Včera",
- "This Week": "Tento týden",
- "Last Week": "Minulý týden",
- "This Month": "Tento měsíc",
- "Last Month": "Minulý měsíc",
- "Year": "Rok",
- "This Year": "Tento rok",
- "Last Year": "Minulý rok",
- "Date picker": "Výběr data",
- "Hour": "Hodina",
- "Day": "Den",
- "Week": "Týden",
- "2 weeks": "2 týdny",
- "Month": "Měsíc",
- "3 months": "3 měsíce",
- "6 months": "6 měsíců",
- "Custom interval": "Vlastní interval",
- "Interval": "Interval",
- "Step size": "Velikost kroku",
- "Ok": "Ok"
- }
- }
- },
- "icon": {
- "icon": "Ikona",
- "select-icon": "Vybrat ikonu",
- "material-icons": "Ikony Material",
- "show-all": "Zobrazit všechny ikony"
- },
- "custom": {
- "widget-action": {
- "action-cell-button": "Tlačítko buňky akce",
- "row-click": "Při kliknutí na řádek",
- "polygon-click": "Při kliknutí na polygon",
- "marker-click": "Při kliknutí na značku",
- "tooltip-tag-action": "Akce štítku nápovědy",
- "node-selected": "Při výběru uzlu"
- }
- },
- "language": {
- "language": "Jazyk"
- }
-}
diff --git a/ui/src/app/locale/locale.constant-de_DE.json b/ui/src/app/locale/locale.constant-de_DE.json
deleted file mode 100644
index 1f8b3b6fbe..0000000000
--- a/ui/src/app/locale/locale.constant-de_DE.json
+++ /dev/null
@@ -1,1693 +0,0 @@
-{
- "access": {
- "unauthorized": "Nicht autorisiert",
- "unauthorized-access": "Unautorisierter Zugriff",
- "unauthorized-access-text": "Sie sollten sich anmelden, um Zugriff auf diese Daten zu erhalten!",
- "access-forbidden": "Keine Zugangsberechtigung",
- "access-forbidden-text": "Sie haben keine Zugangsberechtigung für diesen Bereich!
Versuchen Sie sich mit einem anderen Benutzer anzumelden um Zugriff auf diesen Bereich zu bekommen.",
- "refresh-token-expired": "Sitzung ist abgelaufen",
- "refresh-token-failed": "Sitzung kann nicht aktualisiert werden"
- },
- "action": {
- "activate": "Aktivieren",
- "suspend": "Unterbrechen",
- "save": "Speichern",
- "saveAs": "Speichern unter",
- "cancel": "Abbrechen",
- "ok": "OK",
- "delete": "Löschen",
- "add": "Hinzufügen",
- "yes": "Ja",
- "no": "Nein",
- "update": "Aktualisieren",
- "remove": "Löschen",
- "search": "Suche",
- "clear-search": "Suchanfrage löschen",
- "assign": "Zuordnen",
- "unassign": "Zuordnung aufheben",
- "share": "Teilen",
- "make-private": "Privat machen",
- "apply": "Anwenden",
- "apply-changes": "Änderungen übernehmen",
- "edit-mode": "Bearbeitungsmodus",
- "enter-edit-mode": "Zum Bearbeitungsmodus wechseln",
- "decline-changes": "Änderungen nicht übernehmen",
- "close": "Schließen",
- "back": "Zurück",
- "run": "Ausführen",
- "sign-in": "Anmelden!",
- "edit": "Bearbeiten",
- "view": "Ansicht",
- "create": "Erstellen",
- "drag": "Ziehen",
- "refresh": "Aktualisieren",
- "undo": "Rückgängig machen",
- "copy": "Kopieren",
- "paste": "Einfügen",
- "copy-reference": "Zeichen kopieren",
- "paste-reference": "Zeichen einfügen",
- "import": "Importieren",
- "export": "Exportieren",
- "share-via": "Teilen mit {{provider}}"
- },
- "aggregation": {
- "aggregation": "Aggregation",
- "function": "Datenaggregationsfunktion",
- "limit": "Höchstwerte",
- "group-interval": "Gruppierungsintervall",
- "min": "Minimal",
- "max": "Maximal",
- "avg": "Durchschnitt",
- "sum": "Summe",
- "count": "Anzahl",
- "none": "kein Wert"
- },
- "admin": {
- "general": "Allgemein",
- "general-settings": "Allgemeine Einstellungen",
- "outgoing-mail": "E-Mail Versand",
- "outgoing-mail-settings": "Konfiguration des Postausgangsservers",
- "system-settings": "Systemeinstellungen",
- "test-mail-sent": "Test E-Mail wurde erfolgreich versendet!",
- "base-url": "Basis-URL",
- "base-url-required": "Basis-URL ist erforderlich.",
- "mail-from": "E-Mail von",
- "mail-from-required": "E-Mail von ist erforderlich.",
- "smtp-protocol": "SMTP Protokoll",
- "smtp-host": "SMTP Host",
- "smtp-host-required": "SMTP Host ist erforderlich.",
- "smtp-port": "SMTP Port",
- "smtp-port-required": "Sie müssen einen SMTP Port angeben.",
- "smtp-port-invalid": "Das ist kein gültiger SMTP Port.",
- "timeout-msec": "Wartezeit (msec)",
- "timeout-required": "Wartezeit ist erforderlich.",
- "timeout-invalid": "Das ist keine gültige Wartezeit.",
- "enable-tls": "TLS aktivieren",
- "tls-version" : "TLS-Version",
- "send-test-mail": "Test E-Mail senden",
- "security-settings": "Sicherheitseinstellungen",
- "password-policy": "Kennwortrichtlinie",
- "minimum-password-length": "Minimale Passwortlänge",
- "minimum-password-length-required": "Minimale Passwortlänge ist erforderlich",
- "minimum-password-length-range": "Die Mindestlänge des Passworts sollte zwischen 5 und 50 liegen",
- "minimum-uppercase-letters": "Mindestanzahl von Großbuchstaben",
- "minimum-uppercase-letters-range": "Die Mindestanzahl von Großbuchstaben kann nicht negativ sein",
- "minimum-lowercase-letters": "Mindestanzahl von Kleinbuchstaben",
- "minimum-lowercase-letters-range": "Die Mindestanzahl von Kleinbuchstaben kann nicht negativ sein",
- "minimum-digits": "Mindestanzahl von Ziffern",
- "minimum-digits-range": "Die Mindestanzahl von Ziffern kann nicht negativ sein",
- "minimum-special-characters": "Mindestanzahl von Sonderzeichen",
- "minimum-special-characters-range": "Die Mindestanzahl von Sonderzeichen kann nicht negativ sein",
- "password-expiration-period-days": "Gültigkeitsdauer des Passworts in Tagen",
- "password-expiration-period-days-range": "Die Gültigkeitsdauer des Passworts in Tagen kann nicht negativ sein",
- "password-reuse-frequency-days": "Häufigkeit der Kennwortwiederverwendung in Tagen",
- "password-reuse-frequency-days-range": "Die Häufigkeit der Kennwortwiederverwendung in Tagen kann nicht negativ sein",
- "general-policy": "Allgemeine Politik",
- "max-failed-login-attempts": "Maximale Anzahl fehlgeschlagener Anmeldeversuche, bevor das Konto gesperrt wird",
- "minimum-max-failed-login-attempts-range": "Die maximale Anzahl fehlgeschlagener Anmeldeversuche kann nicht negativ sein",
- "user-lockout-notification-email": "Wenn das Benutzerkonto gesperrt ist, senden Sie eine Benachrichtigung per E-Mail"
- },
- "alarm": {
- "alarm": "Alarm",
- "alarms": "Alarme",
- "select-alarm": "Alarm auswählen",
- "no-alarms-matching": "Keine passenden Alarme zu '{{entity}}' wurden gefunden.",
- "alarm-required": "Alarm ist erforderlich",
- "alarm-status": "Alarm Status",
- "search-status": {
- "ANY": "Jeder",
- "ACTIVE": "Aktiv",
- "CLEARED": "Gelöscht",
- "ACK": "Bestätigt",
- "UNACK": "Nicht bestätigt"
- },
- "display-status": {
- "ACTIVE_UNACK": "Nicht bestätigt aktiv",
- "ACTIVE_ACK": "Bestätigt aktiv",
- "CLEARED_UNACK": "Nicht bestätigt",
- "CLEARED_ACK": "Bestätigung gelöscht"
- },
- "no-alarms-prompt": "Keine Alarme gefunden",
- "created-time": "Erstellungszeit",
- "type": "Typ",
- "severity": "Schwere",
- "originator": "Urheber",
- "originator-type": "Urheber-Typ",
- "details": "Details",
- "status": "Status",
- "alarm-details": "Alarm-Details",
- "start-time": "Startzeit",
- "end-time": "Endzeit",
- "ack-time": "Bestätigungszeit",
- "clear-time": "Zeit gelöscht",
- "severity-critical": "Kritisch",
- "severity-major": "Groß",
- "severity-minor": "Klein",
- "severity-warning": "Warnung",
- "severity-indeterminate": "Unbestimmt",
- "acknowledge": "Bestätigen",
- "clear": "Löschen",
- "search": "Alarme Suchen",
- "selected-alarms": "{ count, plural, 1 {1 Alarm} other {# Alarme} } ausgewählt",
- "no-data": "Keine Daten zum Anzeigen",
- "polling-interval": "Alarmabfrageintervall (sec)",
- "polling-interval-required": "Alarmabfrageintervall ist erforderlich.",
- "min-polling-interval-message": "Mindestens 1 sec Abrufintervall ist zulässig.",
- "aknowledge-alarms-title": "{ count, plural, 1 {1 Alarm} other {# Alarme} } bestätigen",
- "aknowledge-alarms-text": "Sind Sie sicher, dass Sie { count, plural, 1 {1 Alarm} other {# Alarme} } bestätigen möchten?",
- "aknowledge-alarm-title": "Alarm bestätigen",
- "aknowledge-alarm-text": "Möchten Sie den Alarm wirklich bestätigen?",
- "clear-alarms-title": "{ count, plural, 1 {1 Alarm} other {# Alarme} } löschen",
- "clear-alarms-text": "Möchten Sie wirklich { count, plural, 1 {1 Alarm} other {# Alarme} } löschen?",
- "clear-alarm-title": "Alarm löschen",
- "clear-alarm-text": "Möchten Sie den Alarm wirklich löschen?",
- "alarm-status-filter": "Alarm Status Filter"
- },
- "alias": {
- "add": "Alias hinzufügen",
- "edit": "Alias bearbeiten",
- "name": "Aliasname",
- "name-required": "Aliasname ist erforderlich",
- "duplicate-alias": "Ein Alias mit demselben Namen ist bereits vorhanden.",
- "filter-type-single-entity": "Einzelne Entität",
- "filter-type-entity-list": "Entitätsliste",
- "filter-type-entity-name": "Entitätsname",
- "filter-type-state-entity": "Entität aus dem Dashboard Status",
- "filter-type-state-entity-description": "Entität aus den Dashboard Status Parametern",
- "filter-type-asset-type": "Objekttyp",
- "filter-type-asset-type-description": "Objekte vom Typ '{{assetType}}'",
- "filter-type-asset-type-and-name-description": "Objekte vom Typ '{{assetType}}' und Name beginnend mit '{{prefix}}'",
- "filter-type-device-type": "Gerätetyp",
- "filter-type-device-type-description": "Geräte vom Typ '{{deviceType}}'",
- "filter-type-device-type-and-name-description": "Geräte vom Typ '{{deviceType}}' und Name beginnend mit '{{prefix}}'",
- "filter-type-entity-view-type": "Entitätsansichtstyp",
- "filter-type-entity-view-type-description": "Entitätsansichten vom Typ '{{entityView}}'",
- "filter-type-entity-view-type-and-name-description": "Entitätsansichten vom Typ '{{entityView}}' und Name beginnend mit '{{prefix}}'",
- "filter-type-relations-query": "Beziehungsabfrage",
- "filter-type-relations-query-description": "{{entities}} mit {{relationType}} Beziehung {{direction}} {{rootEntity}}",
- "filter-type-asset-search-query": "Objektabfrage",
- "filter-type-asset-search-query-description": "Objekte vom Typ {{assetTypes}} mit {{relationType}} Beziehung {{direction}} {{rootEntity}}",
- "filter-type-device-search-query": "Geräteabfrage",
- "filter-type-device-search-query-description": "Geräte vom Typ {{deviceTypes}} mit {{relationType}} Beziehung {{direction}} {{rootEntity}}",
- "filter-type-entity-view-search-query": "Entitätsansichtsabfrage",
- "filter-type-entity-view-search-query-description": "Entitätsansichten vom Typ {{entityViewTypes}} mit {{relationType}} Beziehung {{direction}} {{rootEntity}}",
- "entity-filter": "Entitätsfilter",
- "resolve-multiple": "Als mehrere Entitäten auflösen",
- "filter-type": "Filtertyp",
- "filter-type-required": "Filtertyp ist erforderlich.",
- "entity-filter-no-entity-matched": "Es wurden keine Entitäten gefunden, die dem angegebenen Filter entsprechen.",
- "no-entity-filter-specified": "Es wurde kein Entitätsfilter angegeben",
- "root-state-entity": "Dashboard Status Entität als Wurzel verwenden",
- "root-entity": "Wurzelentität",
- "state-entity-parameter-name": "Parameter-Name der Statusentität",
- "default-state-entity": "Standard Statusentität",
- "default-entity-parameter-name": "Standardmäßig",
- "max-relation-level": "Maximale Beziehungstiefe",
- "unlimited-level": "Unbegrenzte Ebenen",
- "state-entity": "Dashboard Status Entität",
- "all-entities": "Alle Entitäten",
- "any-relation": "Jede Beziehung"
- },
- "asset": {
- "asset": "Objekt",
- "assets": "Objekte",
- "management": "Objektverwaltung",
- "view-assets": "Objekte anzeigen",
- "add": "Objekt hinzufügen",
- "assign-to-customer": "Einem Kunden zuordnen",
- "assign-asset-to-customer": "Objekte dem Kunden zuordnen",
- "assign-asset-to-customer-text": "Bitte wählen Sie die Objekte aus, die dem Kunden zugeordnet werden sollen",
- "no-assets-text": "Keine Objekte gefunden",
- "assign-to-customer-text": "Bitte wählen Sie den Kunden aus, dem die Objekte zugeordnet werden sollen",
- "public": "Öffentlich",
- "assignedToCustomer": "Kunden zugeordnet",
- "make-public": "Objekt öffentlich machen",
- "make-private": "Objekt privat machen",
- "unassign-from-customer": "Kundenzuordnung aufheben",
- "delete": "Objekt löschen",
- "asset-public": "Objekt ist öffentlich",
- "asset-type": "Objekttyp",
- "asset-type-required": "Objekttyp ist erforderlich.",
- "select-asset-type": "Objekttyp auswählen",
- "enter-asset-type": "Objekttyp bestätigen",
- "any-asset": "Jedes Objekt",
- "no-asset-types-matching": "Es wurden keine zu '{{entitySubtype}}' passenden Objekte gefunden.",
- "asset-type-list-empty": "Keine Objekttypen ausgewählt.",
- "asset-types": "Objekttypen",
- "name": "Name",
- "name-required": "Name ist erforderlich.",
- "description": "Beschreibung",
- "type": "Typ",
- "type-required": "Typ ist erforderlich.",
- "details": "Details",
- "events": "Ereignisse",
- "add-asset-text": "Neues Objekt hinzufügen",
- "asset-details": "Objektdetails",
- "assign-assets": "Objekte zuordnen",
- "assign-assets-text": "Kunden { count, plural, 1 {1 Objekt} other {# Objekte} } zuordnen",
- "delete-assets": "Objekte löschen",
- "unassign-assets": "Objektzuordnungen aufheben",
- "unassign-assets-action-title": "Kunden { count, plural, 1 {1 Objektzuordnung} other {# Objektzuordnungen} } aufheben",
- "assign-new-asset": "Neues Objekt zuordnen",
- "delete-asset-title": "Sind Sie sicher, dass Sie das Objekt '{{assetName}}' löschen möchten?",
- "delete-asset-text": "Vorsicht, nach Bestätigung wird das Objekt und alle zugehörigen Daten nicht wiederherstellbar gelöscht.",
- "delete-assets-title": "Sind Sie sicher, dass Sie { count, plural, 1 {1 Objekt} other {# Objekte} } löschen möchten?",
- "delete-assets-action-title": "{ count, plural, 1 {1 Objekt} other {# Objekte} } löschen",
- "delete-assets-text": "Vorsicht, nach Bestätigung werden die ausgewählten Objekte und alle zugehörigen Daten nicht wiederherstellbar gelöscht",
- "make-public-asset-title": "Sind Sie sicher, dass Sie das Objekt '{{assetName}}' öffentlich machen möchten?",
- "make-public-asset-text": "Nach Bestätigung wird das Objekt und alle zugehörigen Daten anderen zugänglich gemacht.",
- "make-private-asset-title": "Sind Sie sicher, dass Sie das Objekt '{{assetName}}' privat machen möchten?",
- "make-private-asset-text": "Nach Bestätigung wird das Objekt und alle zugehörigen Daten privat und ist für andere nicht mehr zugänglich.",
- "unassign-asset-title": "Sind Sie sicher, dass Sie die Zuordnung für das Objekt '{{assetName}}' aufheben möchten?",
- "unassign-asset-text": "Nach Bestätigung wird die Zuordnung des Objekts aufgehoben und es ist für den Kunden nicht mehr zugänglich.",
- "unassign-asset": "Zuordnung des Objekts aufheben",
- "unassign-assets-title": "Möchten Sie die Zuordnung von { count, plural, 1 {1 Objekt} other {# Objekte} } aufheben?",
- "unassign-assets-text": "Nach Bestätigung wird die Zuordnung der ausgewählten Objekte aufgehoben und sie sind für den Kunden nicht mehr zugänglich.",
- "copyId": "Objekt-ID kopieren",
- "idCopiedMessage": "Objekt-ID wurde in die Zwischenablage kopiert",
- "select-asset": "Objekt auswählen",
- "no-assets-matching": "Es wurden keine zu '{{entity}}' passenden Objekte gefunden.",
- "asset-required": "Objekt ist erforderlich",
- "name-starts-with": "Name des Objekts beginnt mit",
- "label": "Bezeichnung"
- },
- "attribute": {
- "attributes": "Eigenschaften",
- "latest-telemetry": "Neueste Telemetrie",
- "attributes-scope": "Entitätseigenschaftsbereich",
- "scope-latest-telemetry": "Neueste Telemetrie",
- "scope-client": "Client Eigenschaften",
- "scope-server": "Server Eigenschaften",
- "scope-shared": "Gemeinsame Eigenschaften",
- "add": "Eigenschaft hinzufügen",
- "key": "Schlüssel",
- "last-update-time": "Datum der letzten Aktualisierung",
- "key-required": "Eigenschaftsschlüssel ist erforderlich.",
- "value": "Wert",
- "value-required": "Eigenschaftswert ist erforderlich.",
- "delete-attributes-title": "Sind Sie sicher, dass Sie { count, plural, 1 {1 Eigenschaft} other {# Eigenschaften} } löschen möchten?",
- "delete-attributes-text": "Seien Sie vorsichtig, nach der Bestätigung werden alle ausgewählten Eigenschaften entfernt.",
- "delete-attributes": "Eigenschaften löschen",
- "enter-attribute-value": "Geben Sie den Eigenschaftswert ein",
- "show-on-widget": "Im Widget anzeigen",
- "widget-mode": "Widget-Modus",
- "next-widget": "Nächstes Widget",
- "prev-widget": "Vorheriges Widget",
- "add-to-dashboard": "Zum Dashboard hinzufügen",
- "add-widget-to-dashboard": "Widget zum Dashboard hinzufügen",
- "selected-attributes": "{ count, plural, 1 {1 Eigenschaft} other {# Eigenschaften} } ausgewählt",
- "selected-telemetry": "{ count, plural, 1 {1 Telemetrieeinheit } other {# Telemetrieeinheiten} } ausgewählt"
- },
- "audit-log": {
- "audit": "Audit",
- "audit-logs": "Audit-Protokolle",
- "timestamp": "Zeitstempel",
- "entity-type": "Entitätstype",
- "entity-name": "Entitätsname",
- "user": "User",
- "type": "Typ",
- "status": "Status",
- "details": "Details",
- "type-added": "Hinzugefügt",
- "type-deleted": "Gelöscht",
- "type-updated": "Aktualisiert",
- "type-attributes-updated": "Eigenschaften aktualisiert",
- "type-attributes-deleted": "Eigenschaften gelöscht",
- "type-rpc-call": "RPC Aufruf",
- "type-credentials-updated": "Anmeldeinformationen wurden aktualisiert",
- "type-assigned-to-customer": "Kunden Zuordnung",
- "type-unassigned-from-customer": "Kunden Zuordnung aufgehoben",
- "type-activated": "Aktiviert",
- "type-suspended": "Ausgesetzt",
- "type-credentials-read": "Anmeldeinformationen gelesen",
- "type-attributes-read": "Eigenschaften gelesen",
- "type-relation-add-or-update": "Beziehung aktualisiert",
- "type-relation-delete": "Beziehung gelöscht",
- "type-relations-delete": "Alle Beziehungen gelöscht",
- "type-alarm-ack": "Bestätigt",
- "type-alarm-clear": "Gelöscht",
- "type-login": "Anmeldung",
- "type-logout": "Ausloggen",
- "type-lockout": "Aussperrung",
- "status-success": "Erfolg",
- "status-failure": "Fehler",
- "audit-log-details": "Audit-Protokoll Details",
- "no-audit-logs-prompt": "Keine Protokolle gefunden",
- "action-data": "Aktionsdaten",
- "failure-details": "Fehlerdetails",
- "search": "Audit-Protokolle durchsuchen",
- "clear-search": "Suche leeren"
- },
- "confirm-on-exit": {
- "message": "Sie haben nicht gespeicherte Änderungen. Möchten Sie diese Seite wirklich verlassen?",
- "html-message": "Sie haben nicht gespeicherte Änderungen.
Möchten Sie diese Seite wirklich verlassen?",
- "title": "Nicht gespeicherte Änderungen"
- },
- "contact": {
- "country": "Land",
- "city": "Stadt",
- "state": "Bundesland",
- "postal-code": "Postleitzahl",
- "postal-code-invalid": "Ungültiges Format der Postleitzahl.",
- "address": "Adresse",
- "address2": "Adresse 2",
- "phone": "Telefon",
- "email": "E-Mail",
- "no-address": "Keine Adresse"
- },
- "common": {
- "username": "Benutzername",
- "password": "Passwort",
- "enter-username": "Benutzername eingeben",
- "enter-password": "Passwort eingeben",
- "enter-search": "Suche eingeben"
- },
- "content-type": {
- "json": "Json",
- "text": "Text",
- "binary": "Binär (Base64)"
- },
- "customer": {
- "customer": "Kunde",
- "customers": "Kunden",
- "management": "Kundenverwaltung",
- "dashboard": "Kunden Dashboard",
- "dashboards": "Kunden Dashboards",
- "devices": "Kundengeräte",
- "entity-views": "Kunden Entitätsansichten",
- "assets": "Kundenobjekte",
- "public-dashboards": "Öffentliche Dashboards",
- "public-devices": "Öffentliche Geräte",
- "public-assets": "Öffentliche Objekte",
- "public-entity-views": "Öffentliche Entitätsansichten",
- "add": "Kunde hinzufügen",
- "delete": "Kunde löschen",
- "manage-customer-users": "Kundenbenutzer verwalten",
- "manage-customer-devices": "Kundengeräte verwalten",
- "manage-customer-dashboards": "Kunden-Dashboards verwalten",
- "manage-public-devices": "Öffentliche Geräte verwalten",
- "manage-public-dashboards": "Öffentliche Dashboards verwalten",
- "manage-customer-assets": "Kundenobjekte verwalten",
- "manage-public-assets": "Öffentliche Objekte verwalten",
- "add-customer-text": "Neuen Kunden hinzufügen",
- "no-customers-text": "Keine Kunden gefunden",
- "customer-details": "Kundendetails",
- "delete-customer-title": "Sind Sie sicher, dass der Kunde '{{customerTitle}}' gelöscht werden soll?",
- "delete-customer-text": "Vorsicht, nach Bestätigung wird der Kunde und alle zugehörigen Daten nicht wiederherstellbar gelöscht.",
- "delete-customers-title": "Sind Sie sicher, dass Sie { count, plural, 1 {1 Kunde} other {# Kunden} } löschen möchten?",
- "delete-customers-action-title": "{ count, plural, 1 {1 Kunde} other {# Kunden} } löschen",
- "delete-customers-text": "Seien Sie vorsichtig, nach der Bestätigung werden alle ausgewählten Kunden und alle zugehörigen Daten nicht wiederherstellbar gelöscht.",
- "manage-users": "User verwalten",
- "manage-assets": "Objekte verwalten",
- "manage-devices": "Geräte verwalten",
- "manage-dashboards": "Dashboards verwalten",
- "title": "Titel",
- "title-required": "Titel ist erforderlich.",
- "description": "Beschreibung",
- "details": "Details",
- "events": "Ereignisse",
- "copyId": "Kunden-ID kopieren",
- "idCopiedMessage": "Kunden-ID wurde in die Zwischenablage kopiert",
- "select-customer": "Kunden auswählen",
- "no-customers-matching": "Keine Kunden für '{{entity}}' gefunden.",
- "customer-required": "Kunde ist erforderlich",
- "select-default-customer": "Wählen Sie den Standardkunden aus.",
- "default-customer": "Standardkunde",
- "default-customer-required": "Ein Standardkunde ist erforderlich, um das Dashboard auf Mandantenebene zu testen."
- },
- "datetime": {
- "date-from": "Datum von",
- "time-from": "Zeit von",
- "date-to": "Datum bis",
- "time-to": "Zeit bis"
- },
- "dashboard": {
- "dashboard": "Dashboard",
- "dashboards": "Dashboards",
- "management": "Dashboardverwaltung",
- "view-dashboards": "Dashboards anzeigen",
- "add": "Dashboard hinzufügen",
- "assign-dashboard-to-customer": "Dashboard(s) dem Kunden zuordnen",
- "assign-dashboard-to-customer-text": "Bitte wählen Sie die Dashboards aus, die Sie dem Kunden zuordnen möchten",
- "assign-to-customer-text": "Bitte wählen Sie den Kunden aus, dem die Dashboards zugeordnet werden sollen",
- "assign-to-customer": "Kunden zuordnen",
- "unassign-from-customer": "Zuordnung zum Kunden aufheben",
- "make-public": "Dashboard öffentlich machen",
- "make-private": "Dashboard privat machen",
- "manage-assigned-customers": "Zugeordnete Kunden verwalten",
- "assigned-customers": "Zugeordnete Kunden",
- "assign-to-customers": "Dashboard(s) zu Kunden zuweisen",
- "assign-to-customers-text": "Bitte wählen Sie den Kunden aus, dem Sie das Dashboard(s) zuweisen möchten",
- "unassign-from-customers": "Zuordnung von Dashboard(s) zu Kunden aufheben",
- "unassign-from-customers-text": "Bitte wählen Sie die Kunden aus, für die die Zuordnung von Dashboard(s) aufgehoben werden soll",
- "no-dashboards-text": "Keine Dashboard(s) gefunden",
- "no-widgets": "Keine Widgets konfiguriert",
- "add-widget": "Neues Widget hinzufügen",
- "title": "Titel",
- "select-widget-title": "Widget auswählen",
- "select-widget-subtitle": "Liste der verfügbaren Widget-Typen",
- "delete": "Dashboard löschen",
- "title-required": "Titel ist erforderlich.",
- "description": "Beschreibung",
- "details": "Details",
- "dashboard-details": "Dashboard-Details",
- "add-dashboard-text": "Neues Dashboard hinzufügen",
- "assign-dashboards": "Dashboards zuweisen",
- "assign-new-dashboard": "Neues Dashboard zuweisen",
- "assign-dashboards-text": "Zuordnen { count, plural, 1 {1 Dashboard} other {# Dashboards} } zu Kunden",
- "unassign-dashboards-action-text": "Zuordnung { count, plural, 1 {1 Dashboard} other {# Dashboards} } vom Kunden aufheben",
- "delete-dashboards": "Dashboards löschen",
- "unassign-dashboards": "Zuordnung von Dashboards aufheben",
- "unassign-dashboards-action-title": "Zuordnung { count, plural, 1 {1 Dashboard} other {# Dashboards} } vom Kunden aufheben",
- "delete-dashboard-title": "Sind Sie sicher, dass Sie das Dashboard '{{dashboardTitle}}' löschen möchten?",
- "delete-dashboard-text": "Vorsicht, nach Bestätigung werden das Dashboard und alle zugehörigen Daten nicht mehr wiederhergestellt.",
- "delete-dashboards-title": "Sind Sie sicher, dass Sie { count, plural, 1 {1 Dashboard} other {# Dashboards} } löschen möchten?",
- "delete-dashboards-action-title": "Löschen { count, plural, 1 {1 Dashboard} other {# Dashboards} }",
- "delete-dashboards-text": "Vorsicht, nach Bestätigung werden alle ausgewählten Dashboards entfernt und alle zugehörigen Daten nicht mehr wiederhergestellt.",
- "unassign-dashboard-title": "Sind Sie sicher, dass Sie die Zuordnung zum Dashboard '{{dashboardTitle}}' aufheben möchten?",
- "unassign-dashboard-text": "Nach der Bestätigung wird die Zuordnung des Dashboards aufgehoben und es ist für den Kunden nicht mehr zugänglich.",
- "unassign-dashboard": "Zuordnung zum Kunden aufheben",
- "unassign-dashboards-title": "Sind Sie sicher, dass Sie die Zuordug aufheben möchten { count, plural, 1 {1 Dashboard} other {# Dashboards} }?",
- "unassign-dashboards-text": "Nach der Bestätigung wird die Zuordnung aller ausgewählten Dashboards aufgehoben und sie sind für den Kunden nicht mehr zugänglich.",
- "public-dashboard-title": "Dashboard wurde veröffentlicht",
- "public-dashboard-text": "Ihr Dashboard {{dashboardTitle}} ist jetzt öffentlich und über nächste Öffentlichkeit zugänglich link:",
- "public-dashboard-notice": "Note: Vergessen Sie nicht, verwandte Geräte öffentlich zu machen, um auf Ihre Daten zugreifen zu können.",
- "make-private-dashboard-title": "Sind Sie sicher, dass Sie das Dashboard '{{dashboardTitle}}' privatisieren möchten?",
- "make-private-dashboard-text": "Nach der Bestätigung wird das Dashboard privatisiert und ist für andere nicht zugänglich.",
- "make-private-dashboard": "Dashboard privatisieren",
- "socialshare-text": "'{{dashboardTitle}}' Bereitgestellt vom ThingsBoard",
- "socialshare-title": "'{{dashboardTitle}}' Bereitgestellt vom ThingsBoard",
- "select-dashboard": "Dashboard auswählen",
- "no-dashboards-matching": "Es wurden keine passenden Dashboards '{{entity}}' gefunden.",
- "dashboard-required": "Dashboard ist erforderlich.",
- "select-existing": "Existierendes Dashboard auswählen",
- "create-new": "Neues Dashboard erstellen",
- "new-dashboard-title": "Neuer Dashboard Titel",
- "open-dashboard": "Dashboard öffnen",
- "set-background": "Hintergrund einstellen",
- "background-color": "Hintergrundfarbe",
- "background-image": "Hintergrundbild",
- "background-size-mode": "Hintergrundgrößenmodus",
- "no-image": "Kein Bild ausgewählt",
- "drop-image": "Legen Sie ein Bild ab oder klicken Sie, um eine hochzuladende Datei auszuwählen.",
- "settings": "Einstellungen",
- "columns-count": "Spalten zählen",
- "columns-count-required": "Die Anzahl der Spalten ist erforderlich.",
- "min-columns-count-message": "Es müssen mindestens 10 Spalten vorhanden sein.",
- "max-columns-count-message": "Es sind maximal 100 Spalten zulässig.",
- "widgets-margins": "Abstand zwischen den Widgets",
- "horizontal-margin": "Horizontaler Abstand",
- "horizontal-margin-required": "Horizontaler Abstandswert ist erforderlich.",
- "min-horizontal-margin-message": "Der horizontale Abstandswert muss mindestens 0 betragen.",
- "max-horizontal-margin-message": "Der horizontale Abstandswert beträgt maximal 50.",
- "vertical-margin": "Vertikaler Abstand",
- "vertical-margin-required": "Vertikaler Abstandswert ist erforderlich.",
- "min-vertical-margin-message": "Der vertikale Abstandswert muss mindestens 0 betragen.",
- "max-vertical-margin-message": "Der vertikale Abstandswert beträgt maximal 50.",
- "autofill-height": "Layouthöhe automatisch füllen",
- "mobile-layout": "Mobile Layouteinstellungen",
- "mobile-row-height": "Mobile Zeilenhöhe, px",
- "mobile-row-height-required": "Ein mobiler Zeilenhöhenwert ist erforderlich.",
- "min-mobile-row-height-message": "Der Mindestwert für die mobile Zeilenhöhe beträgt 5 Pixel.",
- "max-mobile-row-height-message": "Der Höchstwert für die mobile Zeilenhöhe beträgt 200 Pixel.",
- "display-title": "Display Dashboard Titel",
- "toolbar-always-open": "Werkzeugleiste geöffnet lassen",
- "title-color": "Titelfarbe ",
- "display-dashboards-selection": "Auswahl der Dashboards anzeigen",
- "display-entities-selection": "Auswahl der Einheiten zulassen",
- "display-dashboard-timewindow": "Zeitfenster anzeigen",
- "display-dashboard-export": "Export anzeigen",
- "import": "Dashboard importieren",
- "export": "Dashboard exportieren",
- "export-failed-error": "Dashboard kann nicht exportiert werden: {{error}}",
- "create-new-dashboard": "Neues Dashboard erstellen",
- "dashboard-file": "Dashboard-Datei",
- "invalid-dashboard-file-error": "Dashboard kann nicht importiert werden: Ungültige Dashboard-Datenstruktur.",
- "dashboard-import-missing-aliases-title": "Konfigurieren Sie die von importierten Dashboards verwendeten Aliasnamen",
- "create-new-widget": "Neues Widget erstellen",
- "import-widget": "Widget importieren",
- "widget-file": "Widget-Datei",
- "invalid-widget-file-error": "Widget kann nicht importiert werden: Ungültige Widget-Datenstruktur.",
- "widget-import-missing-aliases-title": "Konfigurieren Sie die von importierten Widgets verwendeten Aliase",
- "open-toolbar": "Dashboard-Werkzeugleiste öffnen",
- "close-toolbar": "Werkzeugleiste schließen",
- "configuration-error": "Konfigurationsfehler",
- "alias-resolution-error-title": "Konfigurationsfehler für Dashboard-Aliasnamen",
- "invalid-aliases-config": "Es konnten keine Geräte gefunden werden, die mit dem Aliase-Filter übereinstimmen.
Bitte wenden Sie sich an Ihren Administrator, um dieses problem zu beheben.",
- "select-devices": "Geräte auswählen",
- "assignedToCustomer": "Dem Kunden zugewiesen",
- "assignedToCustomers": "Kunden zugwiesen",
- "public": "Öffentlich",
- "public-link": "Öffentlicher Link",
- "copy-public-link": "Öffentlichen Link kopieren",
- "public-link-copied-message": "Der öffentliche Link des Dashboards wurde in die Zwischenablage kopiert",
- "manage-states": "Dashboard-Status verwalten",
- "states": "Dashboard-Status",
- "search-states": "Dashboard-Status suchen",
- "selected-states": "{ count, plural, 1 {1 dashboard state} other {# dashboard states} } ausgewählt",
- "edit-state": "Dashboard-Status bearbeiten",
- "delete-state": "Dashboard-Status löschen",
- "add-state": "Dashboard-Status hinzufügen",
- "state": "Dashboard-Status",
- "state-name": "Name",
- "state-name-required": "Name des Dashboard-Status ist erforderlich.",
- "state-id": "Status-Id",
- "state-id-required": "Dashboard-Status-ID ist erforderlich.",
- "state-id-exists": "Dashboard-Status mit derselben ID ist bereits vorhanden .",
- "is-root-state": "Grundzustand",
- "delete-state-title": "Dashboard-Status löschen",
- "delete-state-text": "Sind Sie sicher, dass Sie den Dashboard-Status '{{stateName}}' löschen möchten?",
- "show-details": "Details anzeigen",
- "hide-details": "Details ausblenden",
- "select-state": "Soll-Zustand auswählen",
- "state-controller": "Zustandssteuerung"
- },
- "datakey": {
- "settings": "Einstellungen",
- "advanced": "Erweitert",
- "label": "Bezeichnung",
- "color": "Farbe",
- "units": "Maßeinheit die neben dem Wert angezeigt wird",
- "decimals": "Anzahl der Stellen nach dem Komma",
- "data-generation-func": "Daten generieren",
- "use-data-post-processing-func": "Datenverarbeitungsfunktion verwenden",
- "configuration": "Datenschlüsselkonfiguration",
- "timeseries": "Zeitreihe",
- "attributes": "Eigenschaften",
- "alarm": "Alarmfelder",
- "timeseries-required": "Entity-Zeitreihen sind erforderlich.",
- "timeseries-or-attributes-required": "Entity-Zeitreihen/Eigenschaften sind erforderlich.",
- "maximum-timeseries-or-attributes": "Maximum { count, plural, 1 {1 Zeitreihe/Eigenschaft ist erlaubt} other {# Zeitreihen/Eigenschaften sind erlaubt} }.",
- "alarm-fields-required": "Alarmfelder sind erforderlich.",
- "function-types": "Funktionsarten",
- "function-types-required": "Funktionstypen sind erforderlich.",
- "maximum-function-types": "Maximal { count, plural, 1 {1 Funktionstyp ist erlaubt} other {# Funktionstypen sind erlaubt} }.",
- "time-description": "Zeitstempel des aktuellen Wertes;",
- "value-description": "Der aktuelle Wert;",
- "prev-value-description": "Ergebnis des vorherigen Funktionsaufrufs;",
- "time-prev-description": "Zeitmarke des vorherigen Wertes;",
- "prev-orig-value-description": "Ursprünglicher vorheriger Wert;"
- },
- "datasource": {
- "type": "Datenquellentyp",
- "name": "Name",
- "add-datasource-prompt": "Bitte Datenquelle hinzufügen"
- },
- "details": {
- "edit-mode": "Bearbeitungsmodus",
- "toggle-edit-mode": "Bearbeitungsmodus umschalten"
- },
- "device": {
- "device": "Gerät",
- "device-required": "Gerät ist erforderlich.",
- "devices": "Geräte",
- "management": "Geräte verwalten",
- "view-devices": "Geräte anzeigen",
- "device-alias": "Geräte-Alias",
- "aliases": "Gerätealiasnamen",
- "no-alias-matching": "'{{alias}}' nicht gefunden.",
- "no-aliases-found": "Keine Aliase gefunden.",
- "no-key-matching": "'{{key}}' nicht gefunden.",
- "no-keys-found": "Keine Schlüssel gefunden.",
- "create-new-alias": "Neues Alias erstellen!",
- "create-new-key": "Neuen Schlüssel erstellen!",
- "duplicate-alias-error": "Doppelter Alias gefunden '{{alias}}'.
Gerätealiasnamen müssen innerhalb des Dashboards eindeutig sein.",
- "configure-alias": "Alias '{{alias}}' konfigurieren",
- "no-devices-matching": "Keine passenden Geräte '{{entity}}' gefunden.",
- "alias": "Alias",
- "alias-required": "Geräte-Alias ist erforderlich.",
- "remove-alias": "Geräte-Alias entfernen",
- "add-alias": "Geräte-Alias hinzufügen",
- "name-starts-with": "Gerätename beginnt mit",
- "device-list": "Geräteliste",
- "use-device-name-filter": "Filter verwenden",
- "device-list-empty": "Keine Geräte ausgewählt.",
- "device-name-filter-required": "Der Gerätenamefilter ist erforderlich.",
- "device-name-filter-no-device-matched": "Keine Geräte beginnend mit '{{device}}' gefunden.",
- "add": "Gerät hinzufügen",
- "assign-to-customer": "Kunden zuordnen",
- "assign-device-to-customer": "Gerät(e) dem Kunden zuordnen",
- "assign-device-to-customer-text": "Bitte wählen Sie die Geräte aus, die Sie dem Kunden zuordnen möchten",
- "make-public": "Gerät veröffentlichen",
- "make-private": "Gerät privatisieren",
- "no-devices-text": "Keine Geräte gefunden",
- "assign-to-customer-text": "Bitte wählen Sie einen Kunden aus, dem die Geräte zugeordnet werden sollen",
- "device-details": "Gerätedetails",
- "add-device-text": "Neues Gerät hinzufügen",
- "credentials": "Zugangsdaten",
- "manage-credentials": "Zugangsdaten verwalten",
- "delete": "Gerät löschen",
- "assign-devices": "Gerät zuordnen",
- "assign-devices-text": "{ count, plural, 1 {1 Gerät} other {# Geräte} } dem Kunden zuordnen",
- "delete-devices": "Geräte löschen",
- "unassign-from-customer": "Zuordnung zum Kunden aufheben",
- "unassign-devices": "Nicht zugeordnete Geräte",
- "unassign-devices-action-title": "Zuordnung von { count, plural, 1 {1 Gerät} other {# Geräte} } zum Kunden aufheben",
- "assign-new-device": "Neues Gerät zuordnen",
- "make-public-device-title": "Sind Sie sicher, dass Sie das Gerät '{{deviceName}}' öffentlich machen möchten?",
- "make-public-device-text": "Nach der Bestätigung werden das Gerät und dessen Daten öffentlich und für andere zugänglich.",
- "make-private-device-title": "Sind Sie sicher, dass Sie das Gerät '{{deviceName}}' privat machen möchten?",
- "make-private-device-text": "Nach der Bestätigung werden das Gerät und dessen Daten privat und sind für andere nicht mehr zugänglich.",
- "view-credentials": "Zugangsdaten anzeigen",
- "delete-device-title": "Möchten Sie das Gerät '{{deviceName}}' wirklich löschen?",
- "delete-device-text": "Vorsicht, nach Bestätigung werden das Gerät und alle zugehörigen Daten nicht mehr wiederhergestellt.",
- "delete-devices-title": "Sind Sie sicher, dass Sie löschen möchten { count, plural, 1 {1 Gerät} other {# Geräte} }?",
- "delete-devices-action-title": "Löschen { count, plural, 1 {1 Gerät} other {# Geräte} }",
- "delete-devices-text": "Vorsicht, nach Bestätigung werden alle ausgewählten Geräte entfernt und alle zugehörigen Daten werden nicht mehr wiederhergestellt.",
- "unassign-device-title": "Sind Sie sicher, dass Sie die Zuordnung zum Gerät '{{deviceName}}' wirklich aufheben möchten?",
- "unassign-device-text": "Nach der Bestätigung ist das Gerät nicht zugeordnet und für den Kunden nicht zugänglich.",
- "unassign-device": "Nicht zugeordnete Geräte",
- "unassign-devices-title": "Sind Sie sicher, dass Sie { count, plural, 1 {1 Gerät} other {# Geräte} } nicht mehr zuordnen möchten?",
- "unassign-devices-text": "Nach der Bestätigung werden alle ausgewählten Geräte nicht zugewiesen und sind für den Kunden nicht zugänglich.",
- "device-credentials": "Geräte Zugangsdaten",
- "credentials-type": "Art der Zugangsdaten",
- "access-token": "Zugangs-Token",
- "access-token-required": "Zugangs-Token ist erforderlich.",
- "access-token-invalid": "Die Länge des Zugangs-Tokens muss zwischen 1 und 20 Zeichen betragen.",
- "rsa-key": "RSA öffentlicher Schlüssel",
- "rsa-key-required": "RSA öffentlicher Schlüssel ist erforderlich.",
- "secret": "Geheimnis",
- "secret-required": "Geheimnis ist erforderlich.",
- "device-type": "Gerätetyp",
- "device-type-required": "Gerätetyp ist erforderlich.",
- "select-device-type": "Gerätetyp auswählen",
- "enter-device-type": "Gerätetyp eingeben",
- "any-device": "Jedes Gerät",
- "no-device-types-matching": "Keine passenden Gerätetypen '{{entitySubtype}}' gefunden.",
- "device-type-list-empty": "Kein Gerätetyp ausgewählt.",
- "device-types": "Gerätetypen",
- "name": "Name",
- "name-required": "Name ist erforderlich.",
- "description": "Beschreibung",
- "events": "Ereignisse",
- "details": "Details",
- "copyId": "Geräte-ID kopieren",
- "copyAccessToken": "Zugangs-Token kopieren",
- "idCopiedMessage": "Geräte-ID wurde in die Zwischenablage kopiert",
- "accessTokenCopiedMessage": "Geräte-Zugangs-Token wurde in die Zwischenablage kopiert",
- "assignedToCustomer": "Dem Kunden zuordnen",
- "unable-delete-device-alias-title": "Geräte-Alias kann nicht gelöscht werden",
- "unable-delete-device-alias-text": "Geräte-Alias '{{deviceAlias}}' kann nicht gelöscht werden, da er von den folgenden Widgets verwendet wird:
{{widgetsList}}",
- "is-gateway": "Ist ein Gateway",
- "public": "Öffentlich",
- "device-public": "Gerät ist öffentlich",
- "select-device": "Gerät auswählen"
- },
- "dialog": {
- "close": "Dialog schließen"
- },
- "error": {
- "unable-to-connect": "Es konnte keine Verbindung zum Server hergestellt werden! Bitte überprüfen Sie Ihre Internetverbindung.",
- "unhandled-error-code": "Unbehandelter Fehlercode: {{errorCode}}",
- "unknown-error": "Unbekannter Fehler"
- },
- "entity": {
- "entity": "Entität",
- "entities": "Entitäten",
- "aliases": "Entitäts-Aliasnamen",
- "entity-alias": "Entitätsalias",
- "unable-delete-entity-alias-title": "Alias der Entität kann nicht gelöscht werden",
- "unable-delete-entity-alias-text": "Alias der Entität '{{entityAlias}}' kann nicht gelöscht werden, da es von den folgenden Widget(s) verwendet wird:
{{widgetsList}}",
- "duplicate-alias-error": "Doppelte Alias gefunden '{{alias}}'.
Die Aliase der Entität müssen innerhalb des Dashboards eindeutig sein.",
- "missing-entity-filter-error": "Fehlender Filter für Alias '{{alias}}'.",
- "configure-alias": "Alias '{{alias}}' konfigurieren",
- "alias": "Alias",
- "alias-required": "Alias der Entität ist erforderlich.",
- "remove-alias": "Alias der Entität entfernen",
- "add-alias": "Alias der Entität erforderlich",
- "entity-list": "Entitätsliste",
- "entity-type": "Entitätstyp",
- "entity-types": "Entitätstypen",
- "entity-type-list": "Liste der Entitätstyp",
- "any-entity": "Jede Entität",
- "enter-entity-type": "Entitätstyp eingeben",
- "no-entities-matching": "Keine passenden Entitäten für '{{entity}}' gefunden.",
- "no-entity-types-matching": "Keine passende Entitätstypen für '{{entityType}}' gefunden.",
- "name-starts-with": "Name beginnt mit",
- "use-entity-name-filter": "Filter verwenden",
- "entity-list-empty": "Keine Entitäten ausgewählt.",
- "entity-type-list-empty": "Keine Entitättypen ausgewählt.",
- "entity-name-filter-required": "Entitätsnamenfilter ist erforderlich.",
- "entity-name-filter-no-entity-matched": "Keine Entitäten beginnend mit '{{entity}}' gefunden.",
- "all-subtypes": "Alle",
- "select-entities": "Entitäten auswählen",
- "no-aliases-found": "Keine Aliase gefunden.",
- "no-alias-matching": "'{{alias}}' nicht gefunden.",
- "create-new-alias": "Erstellen Sie einen neuen Alias!",
- "key": "Schlüssel",
- "key-name": "Name des Schlüssels",
- "no-keys-found": "Kein Schlüssel gefunden.",
- "no-key-matching": "'{{key}}' nicht gefunden.",
- "create-new-key": "Erstellen Sie einen neuen Schlüssel!",
- "type": "Typ",
- "type-required": "Typ der Entität ist erforderlich.",
- "type-device": "Gerät",
- "type-devices": "Geräte",
- "list-of-devices": "{ count, plural, 1 {Ein Gerät} other {Liste von # Geräten} }",
- "device-name-starts-with": "Geräte beginnend mit '{{prefix}}'",
- "type-asset": "Objekt",
- "type-assets": "Objekte",
- "list-of-assets": "{ count, plural, 1 {Ein Objekt} other {Liste von # Objekten} }",
- "asset-name-starts-with": "Objekte beginnend mit '{{prefix}}'",
- "type-entity-view": "Entitätsansicht",
- "type-entity-views": "Entitätsansichten",
- "list-of-entity-views": "{ count, plural, 1 {Eine Entitätsansicht} other {Liste von # Entitätsansichten} }",
- "entity-view-name-starts-with": "Entitätsansichten beginnend mit'{{prefix}}'",
- "type-rule": "Regel",
- "type-rules": "Regeln",
- "list-of-rules": "{ count, plural, 1 {Eine Regel} other {Liste von # Regeln} }",
- "rule-name-starts-with": "Regeln beginnend mit '{{prefix}}'",
- "type-plugin": "Plugin",
- "type-plugins": "Plugins",
- "list-of-plugins": "{ count, plural, 1 {Ein Plugin} other {Liste von # Plugins} }",
- "plugin-name-starts-with": "Plugins beginnend mit '{{prefix}}'",
- "type-tenant": "Mandant",
- "type-tenants": "Mandanten",
- "list-of-tenants": "{ count, plural, 1 {Ein Mandant} other {Liste von # Mandanten} }",
- "tenant-name-starts-with": "Mandanten beginnend mit '{{prefix}}'",
- "type-customer": "Kunde",
- "type-customers": "Kunden",
- "list-of-customers": "{ count, plural, 1 {Ein Kunde} other {Liste von # Kunden} }",
- "customer-name-starts-with": "Kunden beginnend mit '{{prefix}}'",
- "type-user": "Benutzer",
- "type-users": "Benutzer",
- "list-of-users": "{ count, plural, 1 {Ein Benutzer} other {Liste von # Benutzern} }",
- "user-name-starts-with": "Benutzer beginnend mit '{{prefix}}'",
- "type-dashboard": "Dashboard",
- "type-dashboards": "Dashboards",
- "list-of-dashboards": "{ count, plural, 1 {Ein Dashboard} other {Liste von # Dashboards} }",
- "dashboard-name-starts-with": "Dashboards beginnend mit '{{prefix}}'",
- "type-alarm": "Alarm",
- "type-alarms": "Alarme",
- "list-of-alarms": "{ count, plural, 1 {Ein Alarm} other {Liste von # Alarmen} }",
- "alarm-name-starts-with": "Alarme, beginnend mit '{{prefix}}'",
- "type-rulechain": "Regelkette",
- "type-rulechains": "Regelketten",
- "list-of-rulechains": "{ count, plural, 1 {Eine Regelkette} other {Liste von # Regelketten} }",
- "rulechain-name-starts-with": "Regelketten beginnend mit '{{prefix}}'",
- "type-rulenode": "Regelknoten",
- "type-rulenodes": "Regelknoten",
- "list-of-rulenodes": "{ count, plural, 1 {Ein Regelknoten} other {Liste von # Regelknoten} }",
- "rulenode-name-starts-with": "Regelknoten beginnend mit '{{prefix}}'",
- "type-current-customer": "Aktueller Kunde",
- "search": "Entitäten suchen",
- "selected-entities": "{ count, plural, 1 {Entität} other {# Entitäten} } ausgewählt",
- "entity-name": "Entitätsname",
- "details": "Entitätsdetails",
- "no-entities-prompt": "Keine Entitäten gefunden",
- "no-data": "Keine Daten zum Anzeigen",
- "columns-to-display": "Anzuzeigende Spalten"
- },
- "entity-view": {
- "entity-view": "Entitätsansicht",
- "entity-view-required": "Entitätsansicht ist erforderlich.",
- "entity-views": "Entitätsansichten",
- "management": "Entitätsansichten verwalten",
- "view-entity-views": "Entitätsansichten anzeigen",
- "entity-view-alias": "Entitätsansichtsalias",
- "aliases": "Entitätsansichten-Aliase",
- "no-alias-matching": "'{{alias}}' nicht gefunden.",
- "no-aliases-found": "Keine Aliase gefunden.",
- "no-key-matching": "'{{key}}' nicht gefunden.",
- "no-keys-found": "Keine Schlüssel gefunden.",
- "create-new-alias": "Neuen Alias erstellen!",
- "create-new-key": "Neuen Schlüssel erstellen!",
- "duplicate-alias-error": "Doppelter Alias gefunden '{{alias}}'.
Aliase der Entitätsansicht müssen innerhalb des Dashboards eindeutig sein.",
- "configure-alias": "Alias '{{alias}}' konfigurieren",
- "no-entity-views-matching": "Keine passenden Entitätsansichten für '{{entity}}' gefunden.",
- "alias": "Alias",
- "alias-required": "Alias der Entitätsansicht erforderlich.",
- "remove-alias": "Alias der Entitätsansicht entfernen",
- "add-alias": "Alias für die Entitätsansicht hinzufügen",
- "name-starts-with": "Entitätsansichtsname beginnend mit",
- "entity-view-list": "Liste der Entitätsansichten",
- "use-entity-view-name-filter": "Filter anwenden",
- "entity-view-list-empty": "Keine der Entitätsansichten ausgewählt.",
- "entity-view-name-filter-required": "Filterung nach Entitätsansichtenname erforderlich.",
- "entity-view-name-filter-no-entity-view-matched": "Keine Entitätsansichten beginnend mit '{{entityView}}' wurden gefunden.",
- "add": "Entitätsansicht hinzufügen",
- "assign-to-customer": "Einem Kunden zuordnen",
- "assign-entity-view-to-customer": "Entitätsansichten dem Kunden zuordnen",
- "assign-entity-view-to-customer-text": "Bitte wählen Sie die Entitätsansichten aus, die dem Kunden zugeordnet werden sollen",
- "no-entity-views-text": "Keine Entitätsansichten gefunden",
- "assign-to-customer-text": "Bitte wählen Sie den Kunden aus, dem die Entitätsansichten zugeordnet werden sollen",
- "entity-view-details": "Details der Entitätsansicht",
- "add-entity-view-text": "Neue Entitätsansicht hinzufügen",
- "delete": "Entitätsansicht löschen",
- "assign-entity-views": "Entitätsansicht zuordnen",
- "assign-entity-views-text": "Dem Kunden { count, plural, 1 {1 Entitätsansicht} other {# Entitätsansichten} } zuordnen",
- "delete-entity-views": "Entitätsansichten löschen",
- "unassign-from-customer": "Zuordnung zum Kunden aufheben",
- "unassign-entity-views": "Zuordnung der Entitätsansichten aufheben",
- "unassign-entity-views-action-title": "Die Zuordnung { count, plural, 1 {1 Entitätsansicht} other {# Entitätsansichten} } zum Kunden aufheben",
- "assign-new-entity-view": "Neue Entitätsansicht zuordnen",
- "delete-entity-view-title": "Möchten Sie die Entitätsansicht wirklich löschen '{{entityViewName}}'?",
- "delete-entity-view-text": "Seien Sie vorsichtig, nach der Bestätigung werden die Entitätsansicht und alle zugehörigen Daten nicht wiederhergestellt.",
- "delete-entity-views-title": "Sind Sie sicher, dass Sie die Entitätsansichten löschen möchten { count, plural, 1 {1 Entitätsansicht} other {# Entitätsansichten} }?",
- "delete-entity-views-action-title": "Löschen { count, plural, 1 {1 Entitätsansicht} other {# Entitätsansichten} }",
- "delete-entity-views-text": "Vorsicht, nach Bestätigung werden alle ausgewählten Entitätsansichten entfernt und alle zugehörigen Daten werden nicht wiederhergestellt.",
- "unassign-entity-view-title": "Möchten Sie die Zuordnung der Entitätsansicht '{{entityViewName}}' wirklich aufheben?",
- "unassign-entity-view-text": "Nach der Bestätigung wird die Zuordnung der Entitätsansicht aufgehoben und ist für den Kunden nicht mehr zugänglich.",
- "unassign-entity-view": "Zuordnung der Entitätsansicht aufheben",
- "unassign-entity-views-title": "Sind Sie sicher, dass Sie die Zuordnung aufheben möchten { count, plural, 1 {1 Entitätsansicht} other {# Entitätsansichten} }?",
- "unassign-entity-views-text": "Nach der Bestätigung werden die Zuordnungen der ausgewählten Entitätsansichten aufgehoben und sind für den Kunden nicht mehr zugänglich.",
- "entity-view-type": "Entitätsansichtstyp",
- "entity-view-type-required": "Entitätsansichtstyp ist erforderlich.",
- "select-entity-view-type": "Entitätsansichtstyp auswählen",
- "enter-entity-view-type": "Entitätsansichtstyp eingeben",
- "any-entity-view": "Jede Entitätsansicht",
- "no-entity-view-types-matching": "Es wurden keine passenden Entitätsansichtstypen für '{{entitySubtype}}' gefunden.",
- "entity-view-type-list-empty": "Keine Entitätsansichtstypen ausgewählt.",
- "entity-view-types": "Entitätsansichtstypen",
- "name": "Name",
- "name-required": "Name ist erforderlich.",
- "description": "Beschreibung",
- "events": "Ereignisse",
- "details": "Details",
- "copyId": "Entitätsansichts-ID kopieren",
- "assignedToCustomer": "Dem Kunden zuordnen",
- "unable-entity-view-device-alias-title": "Alias der Entitätsansicht kann nicht gelöscht werden",
- "unable-entity-view-device-alias-text": "Geräte-Alias '{{entityViewAlias}}' kann nicht gelöscht werden, da es von den folgenden widget(s):
{{widgetsList}} verwendet wird",
- "select-entity-view": "Entitätsansicht auswählen",
- "make-public": "Entitätsansicht öffentlich machen",
- "start-date": "Start-Datum",
- "start-ts": "Start-Zeit",
- "end-date": "Ende-Datum",
- "end-ts": "Ende-Zeit",
- "date-limits": "Datumslimits",
- "client-attributes": "Client Eigenschaften",
- "shared-attributes": "Gemeinsame Eigenschaften",
- "server-attributes": "Server Eigenschaften",
- "timeseries": "Zeitreihe",
- "client-attributes-placeholder": "Client Eigenschaften",
- "shared-attributes-placeholder": "Gemeinsame Eigenschaften",
- "server-attributes-placeholder": "Server Eigenschaften",
- "timeseries-placeholder": "Zeitreihe",
- "target-entity": "Zielentität",
- "attributes-propagation": "Eigenschaftsübertragung",
- "attributes-propagation-hint": "Die Entitätsansicht kopiert automatisch die angegebenen Eigenschaften der Ziel-Entität, wenn Sie diese Entitätsansicht speichern oder aktualisieren. Aus Performance-Gründen werden die Attribute der Ziel-Entität nicht bei jeder Eigenschaftsänderung in die Entitätsansicht übertragen. Sie können die automatische Weitergabe aktivieren, indem Sie den Regelknoten \"copy to view\" in Ihrer Regelkette konfigurieren und die Nachrichten \"Post attributes\" und \"Attributes updated\" mit dem neuen Regelknoten verknüpfen.",
- "timeseries-data": "Zeitreihendaten",
- "timeseries-data-hint": "Konfigurieren Sie die Datensatzschlüssel der Zeitreihe der Zielentität, auf die die Entitätsansicht zugreifen kann. Die Daten dieser Zeitreihe sind schreibgeschützt."
- },
- "event": {
- "event-type": "Ereignistyp",
- "type-error": "Fehler",
- "type-lc-event": "Lebenszyklusereignis",
- "type-stats": "Statistiken",
- "type-debug-rule-node": "Fehlersuche",
- "type-debug-rule-chain": "Fehlersuche",
- "no-events-prompt": "Keine Ereignisse gefunden",
- "error": "Fehler",
- "alarm": "Alarm",
- "event-time": "Ereigniszeit",
- "server": "Server",
- "body": "Inhalt",
- "method": "Methode",
- "type": "Typ",
- "entity": "Entität",
- "message-id": "Nachrichten-Id",
- "message-type": "Nachrichten-Typ",
- "data-type": "Datentyp",
- "relation-type": "Beziehungstyp",
- "metadata": "Meta-Daten",
- "data": "Daten",
- "event": "Ereignis",
- "status": "Status",
- "success": "Erfolg",
- "failed": "Fehlgeschlagen",
- "messages-processed": "Nachrichten verarbeitet",
- "errors-occurred": "Fehler aufgetreten"
- },
- "extension": {
- "extensions": "Erweiterungen",
- "selected-extensions": "{ count, plural, 1 {Erweiterung} other {# extensions} } ausgewählt",
- "type": "Typ",
- "key": "Schlüssel",
- "value": "Wert",
- "id": "ID",
- "extension-id": "Erweiterungs-ID",
- "extension-type": "Erweiterungstyp",
- "transformer-json": "JSON *",
- "unique-id-required": "Die aktuelle Erweiterungs-ID ist bereits vorhanden.",
- "delete": "Erweiterung löschen",
- "add": "Erweiterung hinzufügen",
- "edit": "Erweiterung bearbeiten",
- "delete-extension-title": "Möchten Sie die Erweiterung '{{extensionId}}' wirklich löschen?",
- "delete-extension-text": "Vorsicht, nach Bestätigung werden die Erweiterung und alle zugehörigen Daten nicht wiederhergestellt.",
- "delete-extensions-title": "Möchten Sie wirklich löschen? { count, plural, 1 {1 extension} other {# extensions} }?",
- "delete-extensions-text": "Vorsicht, nach der Bestätigung werden alle ausgewählten Erweiterungen entfernt.",
- "converters": "Konverter",
- "converter-id": "Konverter-ID",
- "configuration": "Konfiguration",
- "converter-configurations": "Konvertierte Konfigurationen",
- "token": "Sicherheitszeichen",
- "add-converter": "Konverter hinzufügen",
- "add-config": "Konvertierte Konfigurationen hinzufügen",
- "device-name-expression": "Angabe des Gerätenamens",
- "device-type-expression": "Angabe des Gerätetyps",
- "custom": "Regel",
- "to-double": "Duplizieren",
- "transformer": "Transformator",
- "json-required": "Transformer json ist erforderlich.",
- "json-parse": "Transformer json kann nicht analysiert werden.",
- "attributes": "Eigenschaften",
- "add-attribute": "Eigenschaften hinzufügen",
- "add-map": "Mapping-Element hinzufügen",
- "timeseries": "Zeitreihe",
- "add-timeseries": "Zeitreihe hinzufügen",
- "field-required": "Feld ist erforderlich",
- "brokers": "Vermittler",
- "add-broker": "Vermittler hinzufügen",
- "host": "Host",
- "port": "Port",
- "port-range": "Der Port sollte im Bereich von 1 bis 65535 liegen.",
- "ssl": "Ssl",
- "credentials": "Zugangsdaten",
- "username": "Benutzername",
- "password": "Passwort",
- "retry-interval": "Wiederholungsintervall in Millisekunden",
- "anonymous": "Anonym",
- "basic": "Basic",
- "pem": "PEM",
- "ca-cert": "CA-Zertifikatsdatei *",
- "private-key": "Privatschlüsseldatei *",
- "cert": "Zertifikatsdatei *",
- "no-file": "Keine Datei ausgewählt.",
- "drop-file": "Legen Sie eine Datei ab oder wählen Sie eine Datei aus um diese hochzuladen.",
- "mapping": "Mapping",
- "topic-filter": "Themenfilter",
- "converter-type": "Konvertierungstyp",
- "converter-json": "Json",
- "json-name-expression": "Angabe des Gerätenamens json",
- "topic-name-expression": "Themenangabe des Gerätenamens",
- "json-type-expression": "Angabe des Gerätenamens json",
- "topic-type-expression": "Themenangabe des Gerätetyps",
- "attribute-key-expression": "Angabe des Eigenschaftenschlüssels",
- "attr-json-key-expression": "Angabe des Eigenschaftenschlüssels",
- "attr-topic-key-expression": "Themenangabe des Eigenschaftenschlüssels",
- "request-id-expression": "ID-Angabe anfordern",
- "request-id-json-expression": "ID-Angabe anforern json",
- "request-id-topic-expression": "Themenangabe der ID anfordern",
- "response-topic-expression": "Antwort Themenangabe",
- "value-expression": "Wertangabe",
- "topic": "Thema",
- "timeout": "Unterbrechung in Millisekunden",
- "converter-json-required": "Konvertierte json ist erforderlich.",
- "converter-json-parse": "Konvertierte json konnte nicht analysiert werden.",
- "filter-expression": "Filterangabe",
- "connect-requests": "Abfragen verbinden",
- "add-connect-request": "Verbindungsabfrage hinzufügen",
- "disconnect-requests": "Abfrage trennen",
- "add-disconnect-request": "Trennung der Abfrage hinzufügen",
- "attribute-requests": "Abfrage der Eigenschaften",
- "add-attribute-request": "Abfrage der Eigenschaften hinzufügen",
- "attribute-updates": "Aktualisierungen der Eigenschaften",
- "add-attribute-update": "Aktualisierung der Eigenschaften hinzufügen",
- "server-side-rpc": "Serverseite RPC",
- "add-server-side-rpc-request": "Abfrage der Serverseite RPC hinzufügen",
- "device-name-filter": "Gerätenamefilter",
- "attribute-filter": "Eigenschaftenfilter",
- "method-filter": "Methodenfilter",
- "request-topic-expression": "Themenabgabe anfordern",
- "response-timeout": "Antwortzeit in Millisekunden",
- "topic-expression": "Themenangabe",
- "client-scope": "Kundenumfrage",
- "add-device": "Gerät hinzufügen",
- "opc-server": "Servers",
- "opc-add-server": "Server hinzufügen",
- "opc-add-server-prompt": "Bitte einen Server hinzufügen",
- "opc-application-name": "Anwendungsname",
- "opc-application-uri": "Anwendung uri",
- "opc-scan-period-in-seconds": "Scanzeitraum in Sekunden",
- "opc-security": "Sicherheit",
- "opc-identity": "Identifizierung",
- "opc-keystore": "Schlüsselspeicher",
- "opc-type": "Typ",
- "opc-keystore-type": "Typ",
- "opc-keystore-location": "Standort *",
- "opc-keystore-password": "Passwort",
- "opc-keystore-alias": "Alias",
- "opc-keystore-key-password": "Schlüsselpasswort",
- "opc-device-node-pattern": "Geräteknotenmuster",
- "opc-device-name-pattern": "Gerätenamensmuster",
- "modbus-server": "Servers/Folgegerät",
- "modbus-add-server": "Server/Folgegerät hinzufügen",
- "modbus-add-server-prompt": "Bitte Server/Folgegerät hinzufügen",
- "modbus-transport": "Transport",
- "modbus-tcp-reconnect": "Verbindung automatisch wiederherstellen",
- "modbus-rtu-over-tcp": "RTU über TCP",
- "modbus-port-name": "Name des Seriellen Anschlusses",
- "modbus-encoding": "Verschlüsselung",
- "modbus-parity": "Übereinstimmung",
- "modbus-baudrate": "Datenübertragungsgeschwindigkeit",
- "modbus-databits": "Daten Bits",
- "modbus-stopbits": "Stopp-Bits",
- "modbus-databits-range": "Datenbits sollten im Bereich von 7 bis 8 liegen.",
- "modbus-stopbits-range": "Stoppbits sollten im Bereich von 1 bis 2 liegen.",
- "modbus-unit-id": "ID der Einheit",
- "modbus-unit-id-range": "Die Einheiten-ID sollte im Bereich von 1 bis 247 liegen.",
- "modbus-device-name": "Gerätename",
- "modbus-poll-period": "Abfragezeitraum in Millisekunden",
- "modbus-attributes-poll-period": "Abfrageintervall der Eigenschaften in Millisekunden",
- "modbus-timeseries-poll-period": "Abfrageintervall der Zeitreihen in Millisekunden",
- "modbus-poll-period-range": "Das Abfrageintervall sollte einen positiven Wert haben.",
- "modbus-tag": "Kennzeichnung",
- "modbus-function": "Funktion",
- "modbus-register-address": "Registeradresse",
- "modbus-register-address-range": "Die Registeradresse sollte im Bereich zwischen 0 und 65535 liegen.",
- "modbus-register-bit-index": "Bitindex",
- "modbus-register-bit-index-range": "Der Bitindex sollte im Bereich von 0 bis 15 liegen.",
- "modbus-register-count": "Registeranzahl",
- "modbus-register-count-range": "Die Registeranzahl sollten einen positiven Wert haben.",
- "modbus-byte-order": "Byte-Reihenfolge",
- "sync": {
- "status": "Status",
- "sync": "Synchronisiert",
- "not-sync": "Nicht synchronisiert",
- "last-sync-time": "Zeit der letzten Synchronisierung",
- "not-available": "Nicht verfügbar"
- },
- "export-extensions-configuration": "Erweiterungskonfiguration exportieren",
- "import-extensions-configuration": "Erweiterungskonfiguration importieren",
- "import-extensions": "Erweiterungen importieren",
- "import-extension": "Erweiterung importieren",
- "export-extension": "Erweiterung exportieren",
- "file": "Erweiterungsdatei",
- "invalid-file-error": "Ungültige Erweiterungsdatei"
- },
- "fullscreen": {
- "expand": "Auf Vollbildmodus erweitern",
- "exit": "Vollbildmodus verlassen",
- "toggle": "Vollbildmodus umschalten",
- "fullscreen": "Vollbild"
- },
- "function": {
- "function": "Funktion"
- },
- "grid": {
- "delete-item-title": "Möchten Sie dieses Element wirklich löschen?",
- "delete-item-text": "Vorsicht, nach Bestätigung wird das Element und alle zugehörigen Daten nicht wiederhergestellt.",
- "delete-items-title": "Sind Sie sicher, dass Sie löschen möchten { count, plural, 1 {Symbol} other {Symbole} }?",
- "delete-items-action-title": "Löschen { count, plural, 1 {Symbol} other {# Symbole} }",
- "delete-items-text": "Vorsicht, nach Bestätigung werden alle ausgewählten Elemente entfernt und alle zugehörigen Daten nicht wiederhergestellt.",
- "add-item-text": "Neues Element hinzufügen",
- "no-items-text": "Keine Elemente gefunden",
- "item-details": "Elementdetails",
- "delete-item": "Element löschen",
- "delete-items": "Elemente löschen",
- "scroll-to-top": "zum Seitenanfang"
- },
- "help": {
- "goto-help-page": "Gehen Sie zur Hilfeseite"
- },
- "home": {
- "home": "Startseite",
- "profile": "Profil",
- "logout": "Abmelden",
- "menu": "Menü",
- "avatar": "Benutzerbild",
- "open-user-menu": "Benutzermenü öffnen"
- },
- "import": {
- "no-file": "Keine Datei ausgewählt",
- "drop-file": "Legen Sie eine JSON-Datei ab oder wählen Sie eine Datei zum hochladen aus."
- },
- "item": {
- "selected": "Ausgewählt"
- },
- "js-func": {
- "no-return-error": "Funktion muss einen Wert zurückgeben!",
- "return-type-mismatch": "Funktion muss einen Wert vom Typ '{{type}}' zurückgeben!",
- "tidy": "Aufräumen"
- },
- "key-val": {
- "key": "Schlüssel",
- "value": "Wert",
- "remove-entry": "Eintrag entfernen",
- "add-entry": "Eintag hinzufügen",
- "no-data": "Keine Einträge"
- },
- "layout": {
- "layout": "Layout",
- "manage": "Layouts verwalten",
- "settings": "Layout-Einstellungen",
- "color": "Farbe",
- "main": "Hauptbereich",
- "right": "Recht",
- "select": "Wählen Sie das Ziellayout aus"
- },
- "legend": {
- "position": "Legendenposition",
- "show-max": "Maximalwert anzeigen",
- "show-min": "Minimalwert anzeigen",
- "show-avg": "Durchschnittswert anzeigen",
- "show-total": "Gesamtwert anzeigen",
- "settings": "Legendeneinstellungen",
- "min": "min.",
- "max": "max.",
- "avg": "mittelw.",
- "total": "Gesamt"
- },
- "login": {
- "login": "Anmelden",
- "request-password-reset": "Passwortzurücksetzung anfordern",
- "reset-password": "Passwort zurücksetzen",
- "create-password": "Passwort erstellen",
- "passwords-mismatch-error": "Eingegebene Passwörter müssen identisch sein!",
- "password-again": "Passwort wiederholen",
- "sign-in": "Bitte anmelden",
- "username": "Benutzername (E-Mail)",
- "remember-me": "Login speichern",
- "forgot-password": "Passwort vergessen?",
- "password-reset": "Passwort zurücksetzen",
- "new-password": "Neues Passwort",
- "new-password-again": "Neues Passwort wiederholen",
- "password-link-sent-message": "Der Link zum Zurücksetzen des Passworts wurde erfolgreich versendet!",
- "email": "E-Mail",
- "login-with": "Mit {{name}} anmelden",
- "or": "oder"
- },
- "position": {
- "top": "Oben",
- "bottom": "Unten",
- "left": "Links",
- "right": "Rechts"
- },
- "profile": {
- "profile": "Profil",
- "last-login-time": "Letzte Anmeldung",
- "change-password": "Passwort ändern",
- "current-password": "Aktuelles Passwort"
- },
- "relation": {
- "relations": "Beziehungen",
- "direction": "Richtung",
- "search-direction": {
- "FROM": "Von",
- "TO": "Zu"
- },
- "direction-type": {
- "FROM": "von",
- "TO": "zu"
- },
- "from-relations": "Ausgehende Verbindungen",
- "to-relations": "Eingehende Verbindungen",
- "selected-relations": "{ count, plural, 1 {1 Beziehung} other {# Beziehungen} } ausgewählt",
- "type": "Typ",
- "to-entity-type": "Zum Entitätstyp",
- "to-entity-name": "Zum Entitätsnamen",
- "from-entity-type": "Vom Entitätstyp",
- "from-entity-name": "Vom Entitätsnamen",
- "to-entity": "Zur Entität",
- "from-entity": "Von Entität",
- "delete": "Beziehung löschen",
- "relation-type": "Art der Beziehung",
- "relation-type-required": "Art der Beziehung erforderlich.",
- "any-relation-type": "Jede Art",
- "add": "Beziehung hinzufügen",
- "edit": "Beziehung bearbeiten",
- "delete-to-relation-title": "Möchten Sie die Beziehung zur Einheit'{{entityName}}' wirklich löschen?",
- "delete-to-relation-text": "Vorsicht, nach Bestätigung ist die Entität '{{entityName}}' nicht mehr mit der aktuellen Entität verbunden.",
- "delete-to-relations-title": "Sind Sie sicher, dass Sie { count, plural, 1 {1 Beziehung} other {# Beziehungen} } wirklich löschen?",
- "delete-to-relations-text": "Vorsicht, nach Bestätigung werden alle ausgewählten Beziehungen entfernt und die entsprechenden Entitäten sind nicht mehr mit der aktuellen Entität verbunden.",
- "delete-from-relation-title": "Sind Sie sicher, dass Sie die Verbindung aus der Entität '{{entityName}}' löschen möchten?",
- "delete-from-relation-text": "Vorsicht, nach Bestätigung wird die aktuelle Entität '{{entityName}}' von der Entität unabhängig sein.",
- "delete-from-relations-title": "Sind Sie sicher, dass Sie { count, plural, 1 {1 Beziehung} other {# Beziehungen} } löschen möchten?",
- "delete-from-relations-text": "Vorsicht, nach Bestätigung werden alle ausgewählten Beziehungen entfernt und die aktuellen Entität wird nicht mehr mit den entsprechenden Entitäten verknüpft sein.",
- "remove-relation-filter": "Beziehungsfilter entfernen",
- "add-relation-filter": "Beziehungsfilter hinzufügen",
- "any-relation": "Jede Beziehung",
- "relation-filters": "Beziehungsfilter",
- "additional-info": "Zusätzliche Information (JSON)",
- "invalid-additional-info": "Json der Zusätzlichen Informationen konnte nicht gelesen werden."
- },
- "rulechain": {
- "rulechain": "Regelkette",
- "rulechains": "Regelketten",
- "root": "Wurzel",
- "delete": "Regelkette löschen",
- "name": "Name",
- "name-required": "Name ist erforderlich.",
- "description": "Beschreibung",
- "add": "Regelkette hinzufügen",
- "set-root": "Regelkette zur Wurzel machen",
- "set-root-rulechain-title": "Sind Sie sicher, dass Sie die Regelkette '{{ruleChainName}}' zur Wurzel machen möchten?",
- "set-root-rulechain-text": "Nach der Bestätigung wird die Regelkette zur Wurzel und bearbeitet alle eingehenden Transportnachrichten.",
- "delete-rulechain-title": "Sind Sie sicher, dass Sie die Regelkette '{{ruleChainName}}' löschen möchten?",
- "delete-rulechain-text": "Vorsichtig, nach Bestätigung werden die Regelkette und alle zugehörigen Daten gelöscht.",
- "delete-rulechains-title": "Sind Sie sicher, dass Sie { count, plural, 1 {1 Regelkette} other {# Regelketten} } löschen möchten?",
- "delete-rulechains-action-title": "{ count, plural, 1 {1 Regelkette} other {# Regelketten} } löschen",
- "delete-rulechains-text": "Vorsichtig, nach Bestätigung werden alle ausgewählten Regelketten entfernt und alle zugehörigen Daten werden gelöscht.",
- "add-rulechain-text": "Neue Regelkette hinzufügen",
- "no-rulechains-text": "Keine Regelkette gefunden",
- "rulechain-details": "Regelketten-Details",
- "details": "Details",
- "events": "Ereignisse",
- "system": "System",
- "import": "Regelkette importieren",
- "export": "Regelkette exportieren",
- "export-failed-error": "Regelkette konnte nicht exportiert werden: {{error}}",
- "create-new-rulechain": "Neue Regelkette erstellen",
- "rulechain-file": "Regelkettendatei",
- "invalid-rulechain-file-error": "Regelkette konnte nicht importiert werden: Ungültige Regelkettendatenstruktur.",
- "copyId": "Regelketten-ID kopieren",
- "idCopiedMessage": "Regelketten-ID wurde in die Zwischenablage kopiert",
- "select-rulechain": "Regelkette auswählen",
- "no-rulechains-matching": "Es wurden keine passenden Regelketten für '{{entity}}' gefunden.",
- "rulechain-required": "Regelkette ist erforderlich",
- "management": "Regelverwaltung",
- "debug-mode": "Modus zur Fehlersuche"
- },
- "rulenode": {
- "details": "Details",
- "events": "Ereignisse",
- "search": "Knoten suchen",
- "open-node-library": "Knotenbibliothek öffnen",
- "add": "Neuen Regelknoten hinzufügen",
- "name": "Name",
- "name-required": "Name ist erforderlich.",
- "type": "Typ",
- "description": "Beschreibung",
- "delete": "Regelknoten löschen",
- "select-all-objects": "Alle Knoten und Verbindungen auswählen",
- "deselect-all-objects": "Auswahl aller Knoten und Verbindungen aufheben",
- "delete-selected-objects": "Ausgewählte Knoten und Verbindungen löschen",
- "delete-selected": "Auswahl löschen",
- "select-all": "Alle auswählen",
- "copy-selected": "Auswahl kopieren",
- "deselect-all": "Nichts auswählen",
- "rulenode-details": "Details der Regelknoten",
- "debug-mode": "Modus zur Fehlersuche",
- "configuration": "Konfiguration",
- "link": "Verbindung",
- "link-details": "Verbindungsdetails der Regelknoten",
- "add-link": "Verbindung hinzufügen",
- "link-label": "Verbindungsbeschriftung",
- "link-label-required": "Verbindungsbeschriftung ist erforderlich.",
- "custom-link-label": "Benutzerdefinierte Verbindungsbeschriftung",
- "custom-link-label-required": "Benutzerdefinierte Verbindungsbeschriftung ist erforderlich.",
- "link-labels": "Verbindungsbeschriftungen",
- "link-labels-required": "Verbindungsbeschriftungen sind erforderlich.",
- "no-link-labels-found": "Keine Verbindungsbeschriftungen gefunden",
- "no-link-label-matching": "'{{label}}' nicht gefunden.",
- "create-new-link-label": "Bitte erstellen Sie eine neue Verbindungsbeschriftung!",
- "type-filter": "Filter",
- "type-filter-details": "Eingehende Nachrichten mit konfigurierten Bedingungen filtern",
- "type-enrichment": "Anreicherung",
- "type-enrichment-details": "Fügen Sie zusätzliche Informationen zu den Nachrichtenmetadaten hinzu",
- "type-transformation": "Transformation",
- "type-transformation-details": "Ändern Sie die Nutzerdaten und Metadaten der Nachricht",
- "type-action": "Aktion",
- "type-action-details": "Besondere Aktion ausführen",
- "type-external": "Extern",
- "type-external-details": "Interagiert mit externem System",
- "type-rule-chain": "Regelkette",
- "type-rule-chain-details": "Leitet eingehende Nachrichten an die angegebene Regelkette weiter",
- "type-input": "Input",
- "type-input-details": "Logische Eingabe der Regelkette, leitet eingehende Nachrichten an die nächste zugehörige Regelkette weiter",
- "type-unknown": "Unbekannt",
- "type-unknown-details": "Nicht aufgelöster Regelknoten",
- "directive-is-not-loaded": "Definierte Konfigurationsanweisung '{{directiveName}}' ist nicht verfügbar.",
- "ui-resources-load-error": "Fehler beim Laden der Konfigurations-UI-Ressourcen.",
- "invalid-target-rulechain": "Zielregelkette kann nicht aufgelöst werden!",
- "test-script-function": "Skriptfunktion testen",
- "message": "Nachricht",
- "message-type": "Nachrichtentyp",
- "select-message-type": "Nachrichtentyp auswählen",
- "message-type-required": "Nachrichtentyp ist erforderlich",
- "metadata": "Metadaten",
- "metadata-required": "Metadateneinträge dürfen nicht leer sein.",
- "output": "Ausgabe",
- "test": "Test",
- "help": "Hilfe"
- },
- "tenant": {
- "tenant": "Mandant",
- "tenants": "Mandanten",
- "management": "Mandantenverwaltung",
- "add": "Mandant hinzufügen",
- "admins": "Administratoren",
- "manage-tenant-admins": "Mandantenadministratoren verwalten",
- "delete": "Mandant löschen",
- "add-tenant-text": "Neuen Mandanten hinzufügen",
- "no-tenants-text": "Keine Mandanten gefunden",
- "tenant-details": "Mandantendetails",
- "delete-tenant-title": "Möchten Sie den Mandanten '{{tenantTitle}}' wirklich löschen?",
- "delete-tenant-text": "Vorsicht, nach Bestätigung werden der Mandant und alle zugehörigen Daten gelöscht.",
- "delete-tenants-title": "Sind Sie sicher, dass Sie { count, plural, 1 {1 Mandant} other {# Mandanten} } löschen möchten?",
- "delete-tenants-action-title": "{ count, plural, 1 {1 Mandant} other {# Mandanten} } löschen",
- "delete-tenants-text": "Vorsicht, nach Bestätigung werden alle ausgewählten Mandanten entfernt und alle zugehörigen Daten werden gelöscht.",
- "title": "Titel",
- "title-required": "Titel ist erforderlich.",
- "description": "Beschreibung",
- "details": "Details",
- "events": "Ereignisse",
- "copyId": "Mandanten-ID kopieren",
- "idCopiedMessage": "Mandanten-ID wurde in die Zwischenablage kopiert",
- "select-tenant": "Mandant auswählen",
- "no-tenants-matching": "Es wurden keine passenden Mandanten für '{{entity}}' gefunden.",
- "tenant-required": "Mandant ist erforderlich"
- },
- "timeinterval": {
- "seconds-interval": "{ seconds, plural, 1 {1 Sekunde} other {# Sekunden} }",
- "minutes-interval": "{ minutes, plural, 1 {1 Minute} other {# Minuten} }",
- "hours-interval": "{ hours, plural, 1 {1 Stunde} other {# Stunden} }",
- "days-interval": "{ days, plural, 1 {1 Tag} other {# Tage} }",
- "days": "Tage",
- "hours": "Stunden",
- "minutes": "Minuten",
- "seconds": "Sekunden",
- "advanced": "Erweitert"
- },
- "timewindow": {
- "days": "{ days, plural, 1 { Tag } other {# Tage } }",
- "hours": "{ hours, plural, 0 { Stunde } 1 {1 Stunde } other {# Stunden } }",
- "minutes": "{ minutes, plural, 0 { Minute } 1 {1 Minute } other {# Minuten } }",
- "seconds": "{ seconds, plural, 0 { Sekunde } 1 {1 Sekunde } other {# Sekunden } }",
- "realtime": "Echtzeit",
- "history": "Historie",
- "last-prefix": "letzte",
- "period": "von {{ startTime }} bis {{ endTime }}",
- "edit": "Zeitfenster bearbeiten",
- "date-range": "Datumsbereich",
- "last": "Letzte",
- "time-period": "Zeitfenster"
- },
- "user": {
- "user": "User",
- "users": "Users",
- "customer-users": "Kunden Users",
- "tenant-admins": "Mandanten-Administratoren",
- "sys-admin": "System-Administrator",
- "tenant-admin": "Mandanten-Administrator",
- "customer": "Kunde",
- "anonymous": "Anonym",
- "add": "Benutzer hinzufügen",
- "delete": "Benutzer löschen",
- "add-user-text": "Neuen Benutzer hinzufügen",
- "no-users-text": "Keine Benutzer gefunden",
- "user-details": "Benutzer-Details",
- "delete-user-title": "Möchten Sie den Benutzer '{{userEmail}}' wirklich löschen?",
- "delete-user-text": "Vorsicht, nach Bestätigung werden der Benutzer und alle zugehörigen Daten gelöscht.",
- "delete-users-title": "Sind Sie sicher, dass Sie { count, plural, 1 {1 Benutzer} other {# Benutzer} } löschen möchten??",
- "delete-users-action-title": "{ count, plural, 1 {1 Benutzer} other {# Benutzer} } löschen",
- "delete-users-text": "Vorsicht, nach Bestätigung werden alle ausgewählten Benutzer entfernt und alle zugehörigen Daten werden gelöscht.",
- "activation-email-sent-message": "Aktivierungs E-Mail wurde erfolgreich gesendet!",
- "resend-activation": "Aktivierung erneut senden",
- "email": "E-Mail",
- "email-required": "E-Mail ist erforderlich.",
- "invalid-email-format": "Ungültiges E-Mail Format.",
- "first-name": "Vorname",
- "last-name": "Nachname",
- "description": "Beschreibung",
- "default-dashboard": "Standard-Dashboard",
- "always-fullscreen": "Immer Vollbild",
- "select-user": "Benutzer auswählen",
- "no-users-matching": "Keine passenden Benutzer für '{{entity}}' gefunden.",
- "user-required": "Benutzer ist erforderlich",
- "activation-method": "Aktivierungsmethode",
- "display-activation-link": "Aktivierungslink anzeigen",
- "send-activation-mail": "Aktivierungs E-Mail senden",
- "activation-link": "Link zur Benutzer-Aktivierung",
- "activation-link-text": "Um den Benutzer zu aktivieren, verwenden Sie bitte folgenden Aktivierungslink:",
- "copy-activation-link": "Aktivierungslink kopieren",
- "activation-link-copied-message": "Der Link zur Benutzer-Aktivierung wurde in die Zwischenablage kopiert ",
- "details": "Details",
- "login-as-tenant-admin": "Als Mandanten-Administrator anmelden",
- "login-as-customer-user": "Als Kunden-Benutzer anmelden",
- "disable-account": "Benutzerkonto deaktivieren",
- "enable-account": "Benutzerkonto aktivieren",
- "enable-account-message": "Benutzerkonto wurde erfolgreich aktiviert!",
- "disable-account-message": "Benutzerkonto wurde erfolgreich deaktiviert!"
- },
- "value": {
- "type": "Wertetyp",
- "string": "Text",
- "string-value": "Textwert",
- "integer": "Ganzzahlig",
- "integer-value": "Ganzzahliger Wert",
- "invalid-integer-value": "Ungültiger ganzzahliger Wert",
- "double": "Gleitkommazahl",
- "double-value": "Gleitkomma Wert",
- "boolean": "Binär",
- "boolean-value": "Binärwert",
- "false": "Falsch",
- "true": "Wahr",
- "long": "Lang"
- },
- "widget": {
- "widget-library": "Widget-Bibliothek",
- "widget-bundle": "Widget-Paket",
- "select-widgets-bundle": "Widget-Paket auswählen",
- "management": "Widget Verwaltung",
- "editor": "Widget Editor",
- "widget-type-not-found": "Problem beim Laden der Widget-Konfiguration.
Zugeordneter Widget-Typ wurde entfernt.",
- "widget-type-load-error": "Widget wurde aufgrund der folgenden Fehler nicht geladen:",
- "remove": "Widget entfernen",
- "edit": "Widget bearbeiten",
- "remove-widget-title": "Möchten Sie das Widget '{{widgetTitle}}' wirklich entfernen?",
- "remove-widget-text": "Nach der Bestätigung werden das Widget und alle zugehörigen Daten nicht wiederhergestellt.",
- "timeseries": "Zeitreihe",
- "search-data": "Daten suchen",
- "no-data-found": "Keine Daten gefunden",
- "latest-values": "Neueste Werte",
- "rpc": "Steuerungswidget",
- "alarm": "Alarm-Widget",
- "static": "Statisches Widget",
- "select-widget-type": "Widget-Typ auswählen",
- "missing-widget-title-error": "Widget-Titel muss angegeben werden!",
- "widget-saved": "Widget gespeichert",
- "unable-to-save-widget-error": "Das Widget kann nicht gespeichert werden! Fehlermeldung!",
- "save": "Widget speichern",
- "saveAs": "Widget speichern unter",
- "save-widget-type-as": "Widget-Typ speichern unter",
- "save-widget-type-as-text": "Bitte geben Sie den neuen Widget-Titel ein und/oder wählen Sie das Ziel-Widget-Paket aus",
- "toggle-fullscreen": "Vollbild umschalten",
- "run": "Widget ausführen",
- "title": "Widget-Titel",
- "title-required": "Widget-Titel ist erforderlich.",
- "type": "Widget-Typ",
- "resources": "Ressourcen",
- "resource-url": "JavaScript/CSS URL",
- "remove-resource": "Ressource entfernen",
- "add-resource": "Ressource hinzufügen",
- "html": "HTML",
- "tidy": "Aufgeräumt",
- "css": "CSS",
- "settings-schema": "Einstellungsschema",
- "datakey-settings-schema": "Datenschlüssel-Einstellungsschema",
- "javascript": "Javascript",
- "remove-widget-type-title": "Möchten Sie den Widget-Typ '{{widgetName}}' wirklich entfernen?",
- "remove-widget-type-text": "Nach der Bestätigung werden der Widget-Typ und alle zugehörigen Daten nicht wiederhergestellt.",
- "remove-widget-type": "Widget-Typ entfernen",
- "add-widget-type": "Neuen Widget-Typ hinzufügen",
- "widget-type-load-failed-error": "Widget-Typ konnte nicht geladen werden!",
- "widget-template-load-failed-error": "Widget-Vorlage konnte nicht geladen werden!",
- "add": "Widget hinzufügen",
- "undo": "Widget-Änderungen widerrufen ",
- "export": "Widget exportieren"
- },
- "widget-action": {
- "header-button": "Widget-Header-Schaltfläche",
- "open-dashboard-state": "Zum neuen Dashboard-Status navigieren",
- "update-dashboard-state": "Aktuellen Dashboard-Status aktualisieren",
- "open-dashboard": "Zu einem anderen Dashboard navigieren",
- "custom": "Benutzerdefinierte Aktion",
- "target-dashboard-state": "Zielstatus des Dashboards",
- "target-dashboard-state-required": "Der Zielstatus ist erforderlich",
- "set-entity-from-widget": "Widget-Entität festlegen",
- "target-dashboard": "Ziel-Dashboard",
- "open-right-layout": "Das rechte Dashboard-Layout öffnen (mobile Ansicht)"
- },
- "widgets-bundle": {
- "current": "Aktuelles Paket",
- "widgets-bundles": "Widget-Pakete",
- "add": "Widget-Pakete hinzufügen",
- "delete": "Widget-Pakete löschen",
- "title": "Titel",
- "title-required": "Titel ist erforderlich.",
- "add-widgets-bundle-text": "Neues Widget-Paket hinzufügen",
- "no-widgets-bundles-text": "Keine Widget-Pakete gefunden",
- "empty": "Widget-Paket ist leer ",
- "details": "Details",
- "widgets-bundle-details": "Widget-Paket-Details",
- "delete-widgets-bundle-title": "Möchten Sie das Widget-Paket '{{widgetsBundleTitle}}' wirklich löschen? ",
- "delete-widgets-bundle-text": "Seien Sie vorsichtig, nach der Bestätigung werden das Widget-Paket und alle zugehörigen Daten gelöscht.",
- "delete-widgets-bundles-title": "Sind Sie sicher, dass Sie { count, plural, 1 {1 Widget-Paket} other {# Widget-Pakete} } löschen möchten?",
- "delete-widgets-bundles-action-title": "{ count, plural, 1 {1 Widgets-Paket} other {# Widget-Pakete} } löschen",
- "delete-widgets-bundles-text": "Vorsicht, nach Bestätigung werden alle ausgewählten Widget-Pakete entfernt und alle zugehörigen Daten werden gelöscht.",
- "no-widgets-bundles-matching": "Keine passenden Widget-Pakete '{{widgetsBundle}}' gefunden.",
- "widgets-bundle-required": "Widget-Paket ist erforderlich.",
- "system": "System",
- "import": "Widget-Paket importieren",
- "export": "Widget-Paket exportieren",
- "export-failed-error": "Widget-Paket kann nicht exportiert werden: {{error}}",
- "create-new-widgets-bundle": "Neues Widget-Paket erstellen",
- "widgets-bundle-file": "Widget-Paket-Datei",
- "invalid-widgets-bundle-file-error": "Widget-Paket kann nicht importiert werden: Ungültige Widget-Paket-Datenstruktur."
- },
- "widget-config": {
- "data": "Daten",
- "settings": "Einstellungen",
- "advanced": "Erweitert ",
- "title": "Titel",
- "title-tooltip": "Titel Tooltip",
- "general-settings": "Allgemeine Einstellungen",
- "display-title": "Titel anzeigen",
- "drop-shadow": "Schlagschatten",
- "enable-fullscreen": "Vollbild aktivieren",
- "background-color": "Hintergrundfarbe",
- "text-color": "Textfarbe",
- "padding": "Pufferung",
- "margin": "Rand",
- "widget-style": "Widget-Stil",
- "title-style": "Titel-Stil",
- "mobile-mode-settings": "Einstellungen für den mobilen Modus",
- "order": "Reihenfolge",
- "height": "Größe",
- "units": "Spezielles Symbol, das neben dem Wert angezeigt wird",
- "decimals": "Anzahl der Stellen nach dem Fließkomma",
- "timewindow": "Zeitfenster",
- "use-dashboard-timewindow": "Dashboard-Zeitfenster verwenden",
- "display-timewindow": "Zeitfenster anzeigen",
- "display-legend": "Legende anzeigen",
- "datasources": "Datenquellen",
- "maximum-datasources": "Maximal { count, plural, 1 {1 Datenquelle ist erlaubt} other {# Datenquellen sind erlaubt} }.",
- "datasource-type": "Typ",
- "datasource-parameters": "Parameter",
- "remove-datasource": "Datenquelle entfernen",
- "add-datasource": "Datenquelle hinzufügen ",
- "target-device": "Zielgerät",
- "alarm-source": "Alarmquelle",
- "actions": "Aktionen",
- "action": "Aktion",
- "add-action": "Aktion hinzufügen",
- "search-actions": "Aktion suchen",
- "action-source": "Aktionsquelle",
- "action-source-required": "Aktionsquelle ist erforderlich.",
- "action-name": "Name",
- "action-name-required": "Aktionsname ist erforderlich.",
- "action-name-not-unique": "Eine andere Aktion mit demselben Namen ist bereits vorhanden.
Der Aktionsname sollte innerhalb derselben Aktionsquelle eindeutig sein.",
- "action-icon": "Symbol ",
- "action-type": "Art",
- "action-type-required": "Aktionsart ist erforderlich.",
- "edit-action": "Aktion bearbeiten",
- "delete-action": "Aktion löschen",
- "delete-action-title": "Widget-Aktion löschen",
- "delete-action-text": "Möchten Sie die Widget-Aktion mit Namen '{{actionName}}' wirklich löschen?"
- },
- "widget-type": {
- "import": "Widget-Typ importieren",
- "export": "Widget-Typ exportieren",
- "export-failed-error": "Widget-Typ kann nicht exportiert werden: {{error}}",
- "create-new-widget-type": "Neuen Widget-Typ erstellen",
- "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"
- }
- },
- "input-widgets": {
- "attribute-not-allowed": "Attributparameter können in diesem Widget nicht verwendet werden",
- "date": "Datum",
- "discard-changes": "Änderungen verwerfen",
- "entity-attribute-required": "Entitätsattribut ist erforderlich",
- "entity-timeseries-required": "Zeitreihen für Entitäten sind erforderlich",
- "not-allowed-entity": "Die ausgewählte Entität kann keine gemeinsamen Attribute haben",
- "no-attribute-selected": "Es ist kein Attribut ausgewählt",
- "no-datakey-selected": "Es ist kein Datenschlüssel ausgewählt",
- "no-entity-selected": "Keine Entität ausgewählt",
- "no-image": "Kein Bild",
- "no-support-web-camera": "Keine unterstützte Webcam",
- "no-timeseries-selected": "Keine Zeitreihen ausgewählt",
- "switch-attribute-value": "Entitätsattributwert wechseln",
- "switch-camera": "Kamera wechseln",
- "switch-timeseries-value": "Wert für Zeitreihen von Entitäten wechseln",
- "take-photo": "Foto machen",
- "time": "Zeit",
- "timeseries-not-allowed": "Der Timeseries-Parameter kann in diesem Widget nicht verwendet werden",
- "update-failed": "Aktualisierung fehlgeschlagen",
- "update-successful": "Aktualisierung erfolgreich",
- "update-attribute": "Attribut aktualisieren",
- "update-timeseries": "Zeitreihen aktualisieren",
- "value": "Wert"
- }
- },
- "icon": {
- "icon": "Symbol",
- "select-icon": "Symbol auswählen",
- "material-icons": "Material-Symbole",
- "show-all": "Alle Symbole anzeigen"
- },
- "custom": {
- "widget-action": {
- "action-cell-button": "Aktionszellenschaltfläche",
- "row-click": "Klick auf Zeile",
- "polygon-click": "Klick auf Polygon",
- "marker-click": "Klick auf Marker",
- "tooltip-tag-action": "Tooltip-Tag-Aktion",
- "node-selected": "Klick auf Node",
- "element-click": "Klick auf HTML element",
- "pie-slice-click": "Klicken auf Slice",
- "row-double-click": "Doppelklicken auf Zeile"
- }
- },
- "language": {
- "language": "Sprache"
- }
-}
diff --git a/ui/src/app/locale/locale.constant-el_GR.json b/ui/src/app/locale/locale.constant-el_GR.json
deleted file mode 100644
index bf51056f94..0000000000
--- a/ui/src/app/locale/locale.constant-el_GR.json
+++ /dev/null
@@ -1,2608 +0,0 @@
-{
- "access": {
- "unauthorized": "Χωρίς δικαιώματα πρόσβασης",
- "unauthorized-access": "Μη εξουσιοδοτημένη πρόσβαση",
- "unauthorized-access-text": "Θα πρέπει να συνδεθείτε για να έχετε πρόσβαση σε αυτόν τον πόρο!",
- "access-forbidden": "Απαγορεύεται η πρόσβαση!",
- "access-forbidden-text": "Δεν έχετε δικαιώματα πρόσβασης σε αυτήν την τοποθεσία!
Συνδεθείτε με διαφορετικό όνομα χρήστη, αν εξακολουθείτε να θέλετε να έχετε πρόσβαση σε αυτήν την τοποθεσία.",
- "refresh-token-expired": "Η περίοδος χρήσης έχει λήξει",
- "refresh-token-failed": "Δεν είναι δυνατή η ανανέωση της περιόδου χρήσης",
- "permission-denied": "Άρνηση πρόσβασης!",
- "permission-denied-text": "Δεν έχετε δικαίωμα εκτέλεσης αυτής της λειτουργίας!"
- },
- "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": "Drag",
- "refresh": "Ανανέωση",
- "undo": "Αναίρεση",
- "copy": "Αντιγραφή",
- "paste": "Επικόλληση",
- "copy-reference": "Αντιγραφή παραπομπής",
- "paste-reference": "Επικόλληση παραπομπής",
- "import": "Εισαγωγή",
- "export": "Εξαγωγή",
- "share-via": "Διαμοίραση μέσω {{provider}}",
- "move": "Μετακίνηση",
- "select": "Επιλογή",
- "continue": "Συνέχεια"
- },
- "aggregation": {
- "aggregation": "Συνάθροιση",
- "function": "Συνάρτηση συνάθροισης δεδομένων",
- "limit": "Μέγιστες τιμές",
- "group-interval": "Διάστημα ομαδοποίησης",
- "min": "Min",
- "max": "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": "Απαιτείται ορισμός Base URL.",
- "mail-from": "Αποστολέας",
- "mail-from-required": "Απαιτείται βασική διεύθυνση URL.",
- "smtp-protocol": "Πρωτόκολλο SMTP",
- "smtp-host": "SMTP host",
- "smtp-host-required": "Απαιτείται ορισμός SMTP host.",
- "smtp-port": "Θύρα SMTP",
- "smtp-port-required": "Πρέπει να εισάγετε SMTP port.",
- "smtp-port-invalid": "Αυτή δε φαίνεται να είναι μια έγκυρη SMTP port.",
- "timeout-msec": "Timeout (msec)",
- "timeout-required": "Απαιτείται τιμή Timeout.",
- "timeout-invalid": "Αυτή δε φαίνεται να είναι μια έγκυρη τιμή timeout.",
- "enable-tls": "Ενεργοποίηση TLS",
- "tls-version": "Έκδοση 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": "Μήνυμα επαναφοράς κωδικού πρόσβασης",
- "user-activated": "Μήνυμα ενεργοποίησης χρήστη",
- "user-registered": "Μήνυμα καταχώρησης χρήστη"
- },
- "mail-subject": "Θέμα μηνύματος (subject)",
- "mail-body": "Κυρίως μήνυμα (body)"
- },
- "alarm": {
- "alarm": "Alarm",
- "alarms": "Alarms",
- "select-alarm": "Επιλογή alarm",
- "no-alarms-matching": "Δεν βρέθηκαν alarms σχετικά με '{{entity}}'.",
- "alarm-required": "Απαιτείται Alarm",
- "alarm-status": "Κατάσταση Alarm",
- "search-status": {
- "ANY": "'Ολες",
- "ACTIVE": "Ενεργό",
- "CLEARED": "Εκκαθαρίστηκε",
- "ACK": "Επιβεβαιώθηκε",
- "UNACK": "Χωρίς επιβεβαίωση"
- },
- "display-status": {
- "ACTIVE_UNACK": "Ενεργό χωρίς επιβεβαίωση",
- "ACTIVE_ACK": "Ενεργό επιβεβαιωμένο",
- "CLEARED_UNACK": "Εκκαθαρίστηκε χωρίς επιβεβαίωση",
- "CLEARED_ACK": "Εκκαθαρίστηκε επιβεβαιωμένο"
- },
- "no-alarms-prompt": "Δεν βρέθηκαν alarm",
- "created-time": "Ώρα δημιουργίας",
- "type": "Τύπος",
- "severity": "Βαρύτητα",
- "originator": "Δημιουργός",
- "originator-type": "Τύπος δημιουργού",
- "details": "Λεπτομέρειες",
- "status": "Κατάσταση",
- "alarm-details": "Λεπτομέρειες Alarm",
- "start-time": "Ώρα έναρξης",
- "end-time": "Ώρα λήξης",
- "ack-time": "Ώρα επιβεβαίωσης",
- "clear-time": "Ώρα εκκαθάρισης",
- "severity-critical": "Critical",
- "severity-major": "Κρίσιμο",
- "severity-minor": "Ασήμαντο",
- "severity-warning": "Προειδοποίηση",
- "severity-indeterminate": "Απροσδιόριστο",
- "acknowledge": "Επιβεβαίωση",
- "clear": "Εκκαθάριση",
- "search": "Αναζήτηση alarm",
- "selected-alarms": "{ count, plural, 1 {1 alarm} other {# alarms} } επιλέχθηκαν",
- "no-data": "Δεν υπάρχουν δεδομένα για εμφάνιση",
- "polling-interval": "Διάστημα δειγματοληψίας alarm(sec)",
- "polling-interval-required": "Απαιτείται ορισμός διαστήματος δειγματοληψίας alarm.",
- "min-polling-interval-message": "Η ελάχιστη επιτρεπόμενη τιμή διαστήματος δειγματοληψίας alarm είναι 1 sec.",
- "aknowledge-alarms-title": "Επιβεβαίωση { count, plural, 1 {1 alarm} other {# alarms} }",
- "aknowledge-alarms-text": "Είστε σίγουρος ότι θέλετε να επιβεβαιώσετε { count, plural, 1 {1 alarm} other {# alarms} };",
- "aknowledge-alarm-title": "Επιβεβαίωση Alarm",
- "aknowledge-alarm-text": "Είστε σίγουρος ότι θέλετε να επιβεβαιώσετε το Alarm?",
- "clear-alarms-title": "Εκκαθάριση { count, plural, 1 {1 alarm} other {# alarms} }",
- "clear-alarms-text": "Είστε σίγουρος ότι θέλετε να εκκαθαρίσετε { count, plural, 1 {1 alarm} other {# alarms} }?",
- "clear-alarm-title": "Εκκαθάριση Alarm",
- "clear-alarm-text": "Είστε σίγουρος ότι θέλετε να εκκαθαρίσετε το Alarm?",
- "alarm-status-filter": "Φίλτρο κατάστασης Alarm"
- },
- "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": "Οντότητα από την κατάσταση του dashboard",
- "filter-type-state-entity-description": "Οντότητα που λαμβάνεται από τις παραμέτρους κατάστασης του dashboard",
- "filter-type-asset-type": "Τύπος Asset",
- "filter-type-asset-type-description": "Assets του τύπου '{{assetType}}'",
- "filter-type-asset-type-and-name-description": "Assets του τύπου '{{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": "Ερώτημα αναζήτησης Asset",
- "filter-type-asset-search-query-description": "Asset με τύπο {{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": "Δεν έχει οριστεί Φίλτρο Οντοτήτων",
- "root-state-entity": "Χρήση της οντότητας κατάστασης του dashboard ως ρίζα",
- "group-state-entity": "Χρήση της οντότητας κατάστασης του dashboard ως ομάδας οντοτήτων",
- "root-entity": "Οντότητα ρίζας",
- "state-entity-parameter-name": "Όνομα παραμέτρου οντότητας κατάστασης",
- "default-state-entity": "Προεπιλεγμένη οντότητα κατάστασης",
- "default-state-entity-group": "Προεπιλεγμένη ομάδα καταστάσεων οντοτήτων",
- "default-entity-parameter-name": "Εξ ορισμού",
- "max-relation-level": "Μέγιστος βαθμός συσχέτισης",
- "unlimited-level": "Απεριόριστος βαθμός",
- "state-entity": "Οντότητα κατάστασης του Dashboard",
- "entities-of-group-state-entity": "Οντότητες από την ομάδα οντοτήτων κατάστασης του dashboard",
- "all-entities": "Όλες οι Οντότητες",
- "any-relation": "Οποιαδήποτε"
- },
- "asset": {
- "asset": "Asset",
- "assets": "Assets",
- "management": "Διαχείριση Asset",
- "view-assets": "Προβολή Asset",
- "add": "Προσθήκη Asset",
- "assign-to-customer": "Ανάθεση σε Πελάτη",
- "assign-asset-to-customer": "Ανάθεση Asset(s) σε Πελάτη",
- "assign-asset-to-customer-text": "Επιλέξτε τα Asset που θα αναθέσετε στον πελάτη",
- "no-assets-text": "Δεν βρέθηκαν Asset",
- "assign-to-customer-text": "Παρακαλώ επιλέξτε πελάτη για να αναθέσετε το Asset(s)",
- "public": "Δημόσιο",
- "assignedToCustomer": "Συνδεδεμένο με πελάτη",
- "make-public": "Κάνε το Asset δημόσιο",
- "make-private": "Κάνε το Asset ιδιωτικό",
- "unassign-from-customer": "Αποσύνδεση από τον πελάτη",
- "delete": "Διαγραφή Αsset",
- "asset-public": "Το Asset είναι δημόσιο",
- "asset-type": "Τύπος Asset",
- "asset-type-required": "Απαιτείται ορισμός είδους Asset.",
- "select-asset-type": "Επιλογή τύπου Αsset",
- "enter-asset-type": "Εισαγωγή τύπου Αsset",
- "any-asset": "Οποιοδήποτε Αsset",
- "no-asset-types-matching": "Δεν βρέθηκαν τύποι Asset που να τιαιριάζουν με '{{entitySubtype}}'.",
- "asset-type-list-empty": "Δεν επιλέχθηκε τύπος Asset.",
- "asset-types": "Τύποι Asset",
- "name": "Όνομα",
- "name-required": "Απαιτείται Όνομα.",
- "description": "Περιγραφή",
- "type": "Τύπος",
- "type-required": "Απαιτείται Τύπος.",
- "details": "Λεπτομέρειες",
- "events": "Γεγονότα",
- "add-asset-text": "Προσθήκη νέου Asset",
- "asset-details": "Λεπτομέρειες Asset",
- "assign-assets": "Ανάθεση Assets",
- "assign-assets-text": "Ανάθεση { count, plural, 1 {1 asset} other {# assets} } σε πελάτη",
- "delete-assets": "Διαγραφή Assets",
- "unassign-assets": "Αποσύνδεση Assets",
- "unassign-assets-action-title": "Αποσύνδεση { count, plural, 1 {1 asset} other {# assets} } από πελάτη",
- "assign-new-asset": "Ανάθεση νέου Asset",
- "delete-asset-title": "Είστε βέβαιοι ότι θέλετε να διαγράψετε το Asset '{{assetName}}'?",
- "delete-asset-text": "Προσοχή!, Μετά την επιβεβαίωση, το Asset και όλα τα σχετικά δεδομένα θα διαγραφούν οριστικά.",
- "delete-assets-title": "Είστε βέβαιοι ότι θέλετε να διαγράψετε { count, plural, 1 {1 asset} other {# assets} };",
- "delete-assets-action-title": "Διαγραφή { count, plural, 1 {1 asset} other {# assets} }",
- "delete-assets-text": "Προσοχή! Μετά την επιβεβαίωση, όλα τα επιλεγμένα Asset και όλα τα σχετικά δεδομένα θα διαγραφούν οριστικά.",
- "make-public-asset-title": "Είστε βέβαιοι ότι θέλετε να κάνετε το Asset '{{assetName}}' δημόσιο;",
- "make-public-asset-text": "Μετά την επιβεβαίωση, το Asset και όλα τα στοιχεία του θα είναι προσβάσιμα από άλλους.",
- "make-private-asset-title": "Είστε βέβαιοι ότι θέλετε να κάνετε το Asset '{{assetName}}' ιδιωτικό;",
- "make-private-asset-text": "Μετά την επιβεβαίωση, το Asset και όλα τα στοιχεία του θα είναι ιδιωτικά και μη προσβάσιμα από άλλους.",
- "unassign-asset-title": "Είστε βέβαιοι ότι θέλετε να αποσυνδέσετε το Asset '{{assetName}}';",
- "unassign-asset-text": "Μετά την επιβεβαίωση, το Asset θα αποσυνδεθεί και δεν θα είναι προσβάσιμο από τον πελάτη.",
- "unassign-asset": "Αποσύνδεση Asset",
- "unassign-assets-title": "Είστε βέβαιοι ότι θέλετε να αποσυνδέσετε { count, plural, 1 {1 asset} other {# assets} };",
- "unassign-assets-text": "Μετά την επιβεβαίωση, όλα τα επιλεγμένα Asset θα αποσυνδεθούν και δεν θα είναι προσβάσιμα από τον πελάτη.",
- "copyId": "Αντιγραφή Asset Id",
- "idCopiedMessage": "Το Asset Id αντιγράφηκε στο πρόχειρο",
- "select-asset": "Επιλογή Asset",
- "no-assets-matching": "Δεν βρέθηκαν Asset που να ταιριάζουν με '{{entity}}'.",
- "asset-required": "Απαιτείται Asset",
- "name-starts-with": "Όνομα Asset που ξεκινάει με",
- "selected-assets": "{ count, plural, 1 {1 asset} other {# assets} } επιλέχθηκαν",
- "search": "Αναζήτηση Asset",
- "select-group-to-add": "Επιλέξτε ομάδα στόχο για να προσθέσετε επιλεγμένα Asset",
- "select-group-to-move": "Επιλέξτε ομάδα στόχο για να μετακινήσετε επιλεγμένα assets",
- "remove-assets-from-group": "Είστε βέβαιοι ότι θέλετε να καταργήσετε { count, plural, 1 {1 asset} other {# assets} } από την ομάδα '{entityGroup}';",
- "group": "Ομάδα Asset",
- "list-of-groups": "{ count, plural, 1 {One asset group} other {List of # asset groups} }",
- "group-name-starts-with": "Ομάδες Asset των οποίων τα ονόματα ξεκινούν με '{{prefix}}'",
- "import": "Εισαγωγή Asset",
- "asset-file": "Αρχείο Asset"
- },
- "attribute": {
- "attributes": "Χαρακτηριστικά",
- "latest-telemetry": "Τελευταία τηλεμετρία",
- "attributes-scope": "Πεδίο εφαρμογής Χαρακτηριστικών Οντότητας",
- "scope-latest-telemetry": "Τελευταία τηλεμετρία",
- "scope-client": "Χαρακτηριστικά Client",
- "scope-server": "Χαρακτηριστικά 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",
- "widget-mode": "Είδος λειτουργίας widget",
- "next-widget": "Επόμενο widget",
- "prev-widget": "Προηγούμενο widget",
- "add-to-dashboard": "Προσθήκη σε dashboard",
- "add-widget-to-dashboard": "Προσθήκη widget στο dashboard",
- "selected-attributes": "{ count, plural, 1 {1 attribute} other {# attributes} } επιλέχθηκαν",
- "selected-telemetry": "{ count, plural, 1 {1 telemetry unit} other {# telemetry units} } επιλέχθηκαν"
- },
- "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": "Relation updated",
- "type-relation-delete": "Η συσχέτιση ενημερώθηκε",
- "type-relations-delete": "Όλες οι συσχετίσεις διαγράφηκαν",
- "type-alarm-ack": "Επιβεβαιώθηκε",
- "type-alarm-clear": "Εκκαθαρίστηκε",
- "type-rest-api-rule-engine-call": "Κλήση Rule engine REST API",
- "type-made-public": "Έγινε δημόσιο",
- "type-made-private": "Έγινε ιδιωτικό",
- "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": "Διεύθυνση (γραμμή 1)",
- "address2": "Διεύθυνση (γραμμή 2)",
- "phone": "Τηλέφωνο",
- "email": "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 data converter} other {# data converters} } επιλέχθηκαν",
- "delete-converter-title": "Είστε βέβαιοι ότι θέλετε να διαγράψετε τον μετατροπέα δεδομένων '{{converterName}}'?",
- "delete-converter-text": "Προσέξτε, μετά την επιβεβαίωση, ο μετατροπέας δεδομένων και όλα τα σχετικά δεδομένα θα διαγραφούν οριστικά.",
- "delete-converters-title": "Είστε βέβαιοι ότι θέλετε να διαγράψετε { count, plural, 1 {1 data converter} other {# data converters} };",
- "delete-converters-action-title": "Διαγραφή { count, plural, 1 {1 data converter} other {# data converters} }",
- "delete-converters-text": "Προσοχή! Μετά την επιβεβαίωση, όλοι οι επιλεγμένοι μετατροπείς δεδομένων και όλα τα σχετικά δεδομένα θα καταστούν μη ανακτήσιμα.",
- "events": "Γεγονότα",
- "add": "Προσθήκη μετατροπέα δεδομένων",
- "converter-details": "Λεπτομέρειες μετατροπέα δεδομένων",
- "details": "Λεπτομέρειες",
- "copyId": "Αντιγραφή ID μετατροπέα δεδομένων",
- "idCopiedMessage": "Το ID του μετατροπέα δεδομένων αντιγράφηκε στο πρόχειρο.",
- "debug-mode": "Λειτουργία εντοπισμού σφαλμάτων",
- "name": "Όνομα",
- "name-required": "Απαιτείται Όνομα.",
- "description": "Περιγραφή",
- "decoder": "Αποκωδικοποιητής",
- "encoder": "Kωδικοποιητής",
- "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": "Δεν είναι δυνατή η εξαγωγή του μετατροπέα: {{error}}",
- "create-new-converter": "Δημιουργία νέου μετατροπέα",
- "converter-file": "Αρχείο μετατροπέα",
- "invalid-converter-file-error": "Δεν είναι δυνατή η εισαγωγή του μετατροπέα: Μη έγκυρη δομή δεδομένων μετατροπέα.",
- "type": "Τύπος",
- "type-required": "Απαιτείται τύπος.",
- "type-uplink": "Uplink",
- "type-downlink": "Downlink"
- },
- "content-type": {
- "json": "Json",
- "text": "Text",
- "binary": "Binary (Base64)"
- },
- "customer": {
- "customer": "Πελάτης",
- "customers": "Πελάτες",
- "management": "Διαχείριση Πελατών",
- "dashboard": "Dashboard Πελάτη",
- "dashboards": "Dashboards Πελάτη",
- "devices": "Συσκευές Πελάτη",
- "entity-views": "Προβολές Οντοτήτων ΠελάτηCustomer Entity Views",
- "assets": "Assets Πελάτη",
- "public-dashboards": "Δημόσια Dashboards",
- "public-devices": "Δημόσιες Devices",
- "public-assets": "Δημόσια Assets",
- "public-entity-views": "Δημόσιες Προβολές Οντοτήτων",
- "add": "Προσθήκη Πελάτη",
- "delete": "Διαγραφή πελάτη",
- "manage-customer-user-groups": "Διαχείριση ομάδων χρηστών πελατών",
- "manage-customer-groups": "Διαχείριση ομάδων πελατών",
- "manage-customer-device-groups": "Διαχείριση ομάδων συσκευών πελατών",
- "manage-customer-asset-groups": "Διαχείριση ομάδων Asset πελατών",
- "manage-customer-entity-view-groups": "Διαχείριση ομάδων προβολής οντότητας πελατών",
- "manage-customer-dashboard-groups": "Διαχείριση ομάδων dashboard πελατών",
- "manage-customer-users": "Διαχείριση χρηστών πελατών",
- "manage-customers": "Διαχείριση πελατών",
- "manage-customer-devices": "Διαχείρηση συσκευών πελατών",
- "manage-customer-entity-views": "Διαχείριση προβολής οντότητας πελατών",
- "manage-customer-dashboards": "Διαχείριση 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 customer} other {# customers} }?",
- "delete-customers-action-title": "Διαγραφή { count, plural, 1 {1 customer} other {# customers} }",
- "delete-customers-text": "Προσέξτε, μετά την επιβεβαίωση, οι πελάτες και όλα τα σχετικά δεδομένα θα διαγραφούν οριστικά.",
- "manage-user-groups": "Διαχείρηση ομαδών χρηστών",
- "manage-asset-groups": "Διαχείρηση ομαδών οντοτήτων",
- "manage-device-groups": "Διαχείρηση ομαδών συσκευών",
- "manage-dashboard-groups": "Διαχείρηση ομαδών dashboards",
- "manage-entity-view-groups": "Διαχείρηση ομαδών προβολής οντοτήτων",
- "manage-users": "Διαχείρηση χρηστών",
- "manage-assets": "Διαχείρηση οντοτήτων",
- "manage-devices": "Διαχείρηση συσκευών",
- "manage-dashboards": "Διαχείρηση 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 customer} other {# customers} } επιλέχθηκαν",
- "search": "Αναζήτηση πελατών",
- "select-group-to-add": "Επιλέξτε ομάδα για να προσθέσετε τους επιλεγμένους πελάτες",
- "select-group-to-move": "Επιλέξτε ομάδα για να μετακινήσετε τους επιλεγμένους πελάτες",
- "remove-customers-from-group": "Είστε σίγουροι ότι θέλετε να αφαιρέσετε { count, plural, 1 {1 customer} other {# customers} } από την ομάδα '{entityGroup}'?",
- "group": "Ομάδα πελατών",
- "list-of-groups": "{ count, plural, 1 {One customer group} other {List of # customer groups} }",
- "group-name-starts-with": "Πελάτες των οποίων το όνομα αρχίζει από '{{prefix}}'",
- "select-default-customer": "Επιλογή προεπιλεγμένου πελάτη",
- "default-customer": "Προεπιλεγμένος πελάτης",
- "default-customer-required": "Ο προεπιλεγμένος πελάτης είναι υποχρεωτικός για να είναι δυνατή η απασφαλμάτωση του dashboard από τον Tenant",
- "allow-white-labeling": "Επιτρέψτε το White Labeling"
- },
- "customers-hierarchy": {
- "customers-hierarchy": "Ιεραρχία Πελατών",
- "open-nav-tree": "Άνοιγμα διακλάδωσης",
- "return-to-top-level": "Επιστροφή στο αρχικό επίπεδο"
- },
- "custom-menu": {
- "custom-menu": "Προσαρμοσμένο Μενού",
- "custom-menu-hint": "Ορίστε το προσαρμοσμένο μενού (JSON) παρακάτω. Αυτό το JSON περιέχει μια λίστα με προσαρμοσμένα στοιχεία μενού."
- },
- "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": "Dashboard",
- "dashboards": "Dashboards",
- "management": "Διαχείριση Dashboard",
- "view-dashboards": "Προβολή Dashboards",
- "add": "Προσθήκη Dashboard",
- "assign-dashboard-to-customer": "Ανάθεση Dashboard(s) Σε Πελάτη",
- "assign-dashboard-to-customer-text": "Παρακαλώ επιλέξτε τα dashboards που θέλετε να αναθέσετε σε πελάτη",
- "assign-to-customer-text": "Παρακαλώ επιλέξτε τον πελάτη στον οποίο θέλετε να αναθέσετε το/τα dashboard(s)",
- "assign-to-customer": "Ανάθεση σε πελάτη",
- "unassign-from-customer": "Αφαίρεση από πελάτη",
- "make-public": "Δημοσιοποιήση Dashboard",
- "make-private": "Ιδιωτικοποίηση Dashboard",
- "manage-assigned-customers": "Διαχείρηση ανατεθειμένων πελατών",
- "assigned-customers": "Ανατεθειμένοι πελάτες",
- "assign-to-customers": "Ανάθεση Dashboard(s) Σε Πελάτες",
- "assign-to-customers-text": "Παρακαλώ επιλέξτε τους πελάτες στους οποίους θέλετε να αναθέσετε το/τα dashboard(s)",
- "unassign-from-customers": "Μη Ανατεθειμένα Dashboard(s) Από Πελάτες",
- "unassign-from-customers-text": "Παρακαλώ επιλέξτε τους πελάτες τους οποίους θέλετε να αφαιρέσετε από το/τα dashboard(s)",
- "no-dashboards-text": "Δεν βρέθηκαν dashboards",
- "no-widgets": "Δεν έχουν ρυθμιστεί widgets",
- "add-widget": "Προσθέστε νέο widget",
- "title": "Τίτλος",
- "select-widget-title": "Επιλογή widget",
- "select-widget-subtitle": "Λίστα με τους διαθέσιμους τύπους widget",
- "delete": "Διαγραφή dashboard",
- "title-required": "Απαιτείται ένας τίτλος.",
- "description": "Περιγραφή",
- "details": "Λεπτομέρειες",
- "dashboard-details": "Λεπτομέρειες Dashboard",
- "add-dashboard-text": "Προσθέστε νέο dashboard",
- "assign-dashboards": "Αναθέστε dashboards",
- "assign-new-dashboard": "Ανάθεση νέου dashboard",
- "assign-dashboards-text": "Ανάθεση { count, plural, 1 {1 dashboard} other {# dashboards} } σε πελάτες",
- "unassign-dashboards-action-text": "Μη ανατεθειμένο/α { count, plural, 1 {1 dashboard} other {# dashboards} } από πελάτες",
- "delete-dashboards": "Διαγραφή dashboards",
- "unassign-dashboards": "Αφαίρεση dashboards",
- "unassign-dashboards-action-title": "Αφαίρεση { count, plural, 1 {1 dashboard} other {# dashboards} } από πελάτη",
- "delete-dashboard-title": "Είστε σίγουροι ότι θέλετε να διαγράψετε το dashboard '{{dashboardTitle}}'?",
- "delete-dashboard-text": "Προσοχή, μετά την επιβεβαίωση, το dashboard και όλα τα σχετικά δεδομένα θα διαγραφούν οριστικά.",
- "delete-dashboards-title": "Είστε σίγουροι ότι θέλετε να διαγράψετε { count, plural, 1 {1 dashboard} other {# dashboards} }?",
- "delete-dashboards-action-title": "Διααγραφή { count, plural, 1 {1 dashboard} other {# dashboards} }",
- "delete-dashboards-text": "Προσοχή, μετά την επιβεβαίωση, όλα τα επιλεγμένα dashboards και όλα τα σχετικά δεδομένα θα διαγραφούν οριστικά.",
- "unassign-dashboard-title": "Είστε σίγουρου ότι θέλετε να αφαιρέσετε το dashboard '{{dashboardTitle}}'?",
- "unassign-dashboard-text": "Μετά την επιβεβαίωση το dashboard θα αφαιρεθεί και δεν θα είναι διαθέσιμο στον πελάτη.",
- "unassign-dashboard": "Αφαίρεση dashboard",
- "unassign-dashboards-title": "Είστε σίγουρου ότι θέλετε να αφαιρέσετε { count, plural, 1 {1 dashboard} other {# dashboards} }?",
- "unassign-dashboards-text": "Μετά την επιβεβαίωση όλα τα επιλεγμένα dashboards θα αφαιρεθούν και δεν θα είναι διαθέσιμα στον πελάτη.",
- "public-dashboard-title": "Το dashboard είναι δημόσιο",
- "public-dashboard-text": "Το dashboard {{dashboardTitle}} είναι δημόσιο και διαθέσιμο μέσω του παρακάτω συνδέσμου:",
- "public-dashboard-notice": "Σημείωση: Μην ξεχνάτε να κάνετε δημόσιες τις συσκευές που συσχετίζονται ώστε να είναι δυνατή η πρόσβαση στα δεδομένα τους.",
- "public-dashboard-link": "Σύνδεσμος δημόσιου dashboard",
- "public-dashboard-link-text": "Το δημόσιο dashboard {{dashboardTitle}} είναι πλέον διαθέσιμο μέσω μέσω του παρακάτω συνδέσμου:",
- "public-dashboard-link-notice": "Σημείωση: Μην ξεχνάτε να κάνετε δημόσιες τις συσκευές, τα assets και την προβολή οντοτήτων που συσχετίζονται ώστε να είναι δυνατή η πρόσβαση στα δεδομένα τους.",
- "make-private-dashboard-title": "Είστε σίγουροι ότι θέλετε να κάνετε το dashboard '{{dashboardTitle}}' ιδιωτικό",
- "make-private-dashboard-text": "Μετά την επιβεβαίωση το dashboard θα γίνουν ιδιωτικά και δεν θα είναι διαθέσιμα από τρίτους.",
- "make-private-dashboard": "Κάνε το dashboard ιδιωτικό",
- "socialshare-text": "'{{dashboardTitle}}' powered by EyeTech",
- "socialshare-title": "'{{dashboardTitle}}' powered by EyeTech",
- "select-dashboard": "Επιλογή dashboard",
- "no-dashboards-matching": "Δεν βρέθηκαν dashboards που να αντιστοιχούν σε '{{entity}}'.",
- "dashboard-required": "Απαιτείται dashboard.",
- "select-existing": "Επιλέξτε ένα υπάρχον dashboard",
- "create-new": "Δημιουργία νέου dashboard",
- "new-dashboard-title": "Τίτλος νέου dashboard",
- "open-dashboard": "Άνοιγμα 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": "Περιθώριο μεταξύ widgets",
- "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",
- "mobile-row-height": "ύψος γραμμής mobile, σε px",
- "mobile-row-height-required": "Απαιτείται ύψος γραμμής mobile.",
- "min-mobile-row-height-message": "Ελάχιστη τιμή ύψους γραμμής mobile είναι 5.",
- "max-mobile-row-height-message": "Μέγιστη τιμή ύψους γραμμής mobile είναι 200.",
- "display-title": "Τίτλος εμφάνισης dashboard",
- "toolbar-always-open": "Γραμμή εργαλείων πάντα ανοιχτή",
- "title-color": "Χρώμα τίτλου",
- "display-dashboards-selection": "Εμφάνηση επιλογής dashboards",
- "display-entities-selection": "Εμφάνιση επιλογής οντοτήτων",
- "display-dashboard-timewindow": "Εμφάνιση χρονικού πλαισίου",
- "display-dashboard-export": "Εμφάνιση εξαγωγής",
- "import": "Εισαγωγή dashboard",
- "export": "Εξαγωγή dashboard",
- "export-failed-error": "Δεν ήταν δυνατή η εξαγωγή dashboard: {{error}}",
- "export-pdf": "Εξαγωγή ως PDF",
- "export-png": "Εξαγωγή ως PNG",
- "export-jpg": "Εξαγωγή ως JPEG",
- "export-json-config": "Εξαγωγή ρυθμίσεις JSON",
- "download-dashboard-progress": "Δημιουργία dashboard {{reportType}} ...",
- "create-new-dashboard": "Δημιουργία νέου dashboard",
- "dashboard-file": "Αρχείο dashboard",
- "invalid-dashboard-file-error": "Δεν ήταν δυνατή η εισαγωγή dashboard: Μη έγκυρη δομή δεδομένων dashboard.",
- "dashboard-import-missing-aliases-title": "Διαμορφώστε τα ψευδώνυμα που χρησιμοποιούνται από το dashboard που εισαγάγατε",
- "create-new-widget": "Δημιουργία νέου widget",
- "import-widget": "Εισαγωγή widget",
- "widget-file": "Αρχείο widget",
- "invalid-widget-file-error": "Δεν ήταν δυνατή η εισαγωγή widget: Μη έγκυρη δομή δεδομένων dashboard.",
- "widget-import-missing-aliases-title": "Διαμορφώστε τα ψευδώνυμα που χρησιμοποιούνται από το widget που εισαγάγατε",
- "open-toolbar": "Άνοιγμα γραμμής εργαλείων dashboard",
- "close-toolbar": "Κλείσιμο γραμμής εργαλείων",
- "configuration-error": "Σφάλμα ρυθμίσεων",
- "alias-resolution-error-title": "Σφάλμα ρυθμίσεων ψευδωνύμων dashboard",
- "invalid-aliases-config": "Δεν βρέθηκε καμία συσκευή που να ταιριάζει με κάποιο από τα φίλτρα.
Παρακαλούμε επικοινωνήστε με τον Διαχειριστή για την επίλυση του ζητήματος.",
- "select-devices": "Επιλογή συσκευών",
- "assignedToCustomer": "Ανατεθειμένο σε πελάτη",
- "assignedToCustomers": "Ανατεθειμένο σε πελάτες",
- "public": "Δημόσιο",
- "public-link": "Δημόσιος σύνδεσμος",
- "copy-public-link": "Αντιγραφή δημόσιου συνδέσμου",
- "public-link-copied-message": "Ο δημόσιος σύνδεσμος έχει αντιγραφεί στο πρόχειρο",
- "manage-states": "Διαχείρηση κατάστασης dashboard",
- "states": "Κατάσταση dashboard",
- "search-states": "Αναζήτηση σε κατάσταση dashboard",
- "selected-states": "{ count, plural, 1 {1 dashboard state} other {# dashboard states} } επιλεγμένα",
- "edit-state": "Επεξεργασία κατάστασης dashboard",
- "delete-state": "Διαγραφή κατάστασης dashboard",
- "add-state": "Προσθήκη κατάστασης dashboard",
- "state": "Κατάσταση Dashboard",
- "state-name": "Όνομα",
- "state-name-required": "Απαιτείται όνομα κατάστασης dashboard.",
- "state-id": "ID Κατάστασης",
- "state-id-required": "Απαιτείται ID κατάστασης dashboard.",
- "state-id-exists": "Υπάρχει ήδη κατάσταση dashboard με το ίδιο ID.",
- "is-root-state": "Root state",
- "delete-state-title": "Διαγραφή κατάστασης dashboard",
- "delete-state-text": "Είστε σίγουροι ότι θέλετε να διαγράψετε την κατάσταση dashboard με όνομα '{{stateName}}'?",
- "show-details": "Εμφάνιση λεπτομερειών",
- "hide-details": "Απόκρυψη λεπτομερειών",
- "select-state": "Επιλογή κατάστασης",
- "state-controller": "Έλεγχος κατάστασης",
- "selected-dashboards": "{ count, plural, 1 {1 dashboard} other {# dashboards} } επιλεγμένα",
- "search": "Αναζήτηση dashboards",
- "select-group-to-add": "Επιλογή ομάδας για να προστεθεί στα επιλεγμένα dashboards",
- "select-group-to-move": "Επιλογή ομάδας για να μετακινηθεί στα επιλεγμένα dashboards",
- "remove-dashboards-from-group": "Είστε σίγουροι ότι θέλετε να αφαιρέσετε { count, plural, 1 {1 dashboard} other {# dashboards} } from group '{entityGroup}'?",
- "group": "Ομάδα dashboards",
- "list-of-groups": "{ count, plural, 1 {One dashboard group} other {List of # dashboard groups} }",
- "group-name-starts-with": "Ομάδες dashboard των οποίων το όνομα αρχίζει από '{{prefix}}'"
- },
- "datakey": {
- "settings": "Ρυθμίσεις",
- "advanced": "Προχωρημένες",
- "label": "Ετικέτα",
- "color": "Χρώμα",
- "units": "Ειδικό σύμβολο που εμφανίζεται δίπλα από την τιμή",
- "decimals": "Αριθμός ψηφίων μετά την υποδιαστολή",
- "data-generation-func": "Λειτουργία δημιουργίας δεδομένων",
- "use-data-post-processing-func": "Χρησιμοποιήστε τη λειτουργία μετα-επεξεργασίας δεδομένων",
- "configuration": "Ρυθμίσεις ονομάτων δεδομένων",
- "timeseries": "Χρονική σειρά",
- "attributes": "Ιδιώτητες",
- "alarm": "Πεδία alarm",
- "timeseries-required": "Απαιτείται χρονική σειρά οντοτήτων.",
- "timeseries-or-attributes-required": "Απαιτείται χρονική σειρά/ιδιώτητες οντοτήτων.",
- "maximum-timeseries-or-attributes": "Μέγιστο { count, plural, 1 {1 timeseries/attribute is allowed.} other {# timeseries/attributes are allowed} }",
- "alarm-fields-required": "Απαιτούνται πεδία alarm.",
- "function-types": "Τύποι λειτουργιών",
- "function-types-required": "Απαιτούνται τύποι λειτουργιών.",
- "maximum-function-types": "Μέγιστο { 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}}'.
Τα ψευδώνυμα συσκευών πρέπει να είναι μοναδικά σε ένα dashboard.",
- "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 device} other {# devices} } σε πελάτη",
- "delete-devices": "Διαγραφή συσκευών",
- "unassign-from-customer": "Αφαίρεση από πελάτη",
- "unassign-devices": "Αφαίρεση συσκευών",
- "unassign-devices-action-title": "Αφαίρεση { count, plural, 1 {1 device} other {# devices} } από πελάτη",
- "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 device} other {# devices} };",
- "delete-devices-action-title": "Διαγραφή { count, plural, 1 {1 device} other {# devices} }",
- "delete-devices-text": "Προσοχή, μετά την επιβεβαίωση, όλες οι επιλεγμένες συσκευές θα αφαιρεθούν και όλα τα σχετικά δεδομένα θα διαγραφούν οριστικά.",
- "unassign-device-title": "Είστε σίγουροι ότι θέλετε να αφαιρέσετε την συσκευή '{{deviceName}}'?",
- "unassign-device-text": "Μετά την επιβεβαίωση, η συσκευή θα αφαιρεθεί και δεν θα είναι προσβάσιμες από τον πελάτη.",
- "unassign-device": "Αφαίρεση συσκευής",
- "unassign-devices-title": "Είστε σίγουροι ότι θέλετε να αφαιρέσετε { count, plural, 1 {1 device} other {# devices} }?",
- "unassign-devices-text": "Μετά την επιβεβαίωση, όλες οι επιλεγμένες συσκευές θα καταργηθούν και δεν θα είναι προσβάσιμες από τον πελάτη.",
- "device-credentials": "Πιστοποιητικά συσκευής",
- "credentials-type": "Τύπος διαπιστευτηρίων",
- "access-token": "Διακριτικό πρόσβασης",
- "access-token-required": "Απαιτείται διακριτικό πρόσβασης.",
- "access-token-invalid": "Access token length must be from 1 to 20 characters.",
- "rsa-key": "RSA public key",
- "rsa-key-required": "Απαιτείται RSA public key.",
- "secret": "Secret",
- "secret-required": "Απαιτείται secret.",
- "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": "Περιγραφή",
- "label": "Ετικέτα",
- "events": "Γεγονότα",
- "details": "Λεπτομέρειες",
- "copyId": "Αντιγραφή ID συσκευής",
- "copyAccessToken": "Αντιγραφή διακριτικού διαπιστευτηρίου",
- "idCopiedMessage": "Το ID της συσκευής έχει αντιγραφεί στο πρόχειρο",
- "accessTokenCopiedMessage": "Το διακριτικό διαπιστευτήριο έχει αντιγραφεί στο πρόχειρο",
- "assignedToCustomer": "Ανάθεση σε πελάτη",
- "unable-delete-device-alias-title": "Αδύνατο να διαγραφεί το ψευδώνυμο συσκευής",
- "unable-delete-device-alias-text": "Το ψευδώνυμο συσκευής '{{deviceAlias}}' δεν μπορεί να διαγραφεί όσο εξακωλουθεί να χρησιμοποιείται από τα ακόλουθα widget(s):
{{widgetsList}}",
- "is-gateway": "είναι gateway",
- "public": "Δημόσιο",
- "device-public": "Η συσκευή είναι δημόσια",
- "select-device": "Επιλογή συσκευής",
- "selected-devices": "{ count, plural, 1 {1 device} other {# devices} } επιλέχθηκαν",
- "search": "Αναζήτηση συσκευών",
- "select-group-to-add": "Επιλέξτε την ομάδα στην οποία θα προστεθουν οι επιλεγμένες συσκευές",
- "select-group-to-move": "Επιλέξτε την ομάδα στην οποία θα μετακινηθούν οι επιλεγμένες συσκευές",
- "remove-devices-from-group": "Είστε σίγουροι ότι θέλετε να αφαιρέσετε { count, plural, 1 {1 device} other {# devices} } from group '{entityGroup}'?",
- "group": "Ομάδα Συσκευών",
- "list-of-groups": "{ count, plural, 1 {One device group} other {List of # device groups} }",
- "group-name-starts-with": "Ομάδες συσκευών των οποίων το όνομα αρχίζει από '{{prefix}}'",
- "import": "Εισαγωγή συσκευής",
- "device-file": "Αρχείο συσκευής"
- },
- "dialog": {
- "close": "Κλείσιμο διαλόγου"
- },
- "direction": {
- "column": "Στήλη",
- "row": "Γραμμή"
- },
- "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}}' δεν μπορεί να διαγραφεί όσο εξακολουθεί να χρησιμοποιείται από τα παρακάτω widget(s):
{{widgetsList}}",
- "duplicate-alias-error": "Βρέθηκε διπλότυπο το ψευδώνυμο '{{alias}}'.
Τα ψευδώνυμα οντοτήτων πρέπει να είναι μοναδικά σε ένα dashboard.",
- "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-key-matching": "Δεν βρέθηκε '{{key}}'.",
- "create-new-key": "Δημιουργείστε ένα νέο!",
- "type": "Τύπος",
- "type-required": "Απαιτείται τύπος οντότητας.",
- "type-device": "Συσκευή",
- "type-devices": "Συσκευές",
- "list-of-devices": "{ count, plural, 1 {One device} other {List of # devices} }",
- "device-name-starts-with": "Συσκευές των οποίων το όνομα αρχίζει από '{{prefix}}'",
- "type-asset": "Asset",
- "type-assets": "Assets",
- "list-of-assets": "{ count, plural, 1 {One asset} other {List of # assets} }",
- "asset-name-starts-with": "Assets των οποίων το όνομα αρχίζει από '{{prefix}}'",
- "type-entity-view": "Προβολή οντότητας",
- "type-entity-views": "Προβολές οντότητας",
- "list-of-entity-views": "{ count, plural, 1 {One entity view} other {List of # entity views} }",
- "entity-view-name-starts-with": "Προβολές οντότητας των οποίων το όνομα αρχίζει από '{{prefix}}'",
- "type-rule": "Κανόνας",
- "type-rules": "Κανόνες",
- "list-of-rules": "{ count, plural, 1 {One rule} other {List of # rules} }",
- "rule-name-starts-with": "Κανόνες των οποίων το όνομα αρχίζει από '{{prefix}}'",
- "type-plugin": "Πρόσθετο",
- "type-plugins": "Προσθετα",
- "list-of-plugins": "{ count, plural, 1 {One plugin} other {List of # plugins} }",
- "plugin-name-starts-with": "Πρόσθετα των οποίων το όνομα αρχίζει από '{{prefix}}'",
- "type-tenant": "Μισθωτής",
- "type-tenants": "Μισθωτές",
- "list-of-tenants": "{ count, plural, 1 {One tenant} other {List of # tenants} }",
- "tenant-name-starts-with": "Μισθωτές των οποίων το όνομα αρχίζει από '{{prefix}}'",
- "type-customer": "Πελάτης",
- "type-customers": "Πελάτες",
- "list-of-customers": "{ count, plural, 1 {One customer} other {List of # customers} }",
- "customer-name-starts-with": "Πελάτες των οποίων το όνομα αρχίζει από '{{prefix}}'",
- "type-user": "Χρήστης",
- "type-users": "Χρήστες",
- "list-of-users": "{ count, plural, 1 {One user} other {List of # users} }",
- "user-name-starts-with": "Χρήστες των οποίων το όνομα αρχίζει από '{{prefix}}'",
- "type-dashboard": "Dashboard",
- "type-dashboards": "Dashboards",
- "list-of-dashboards": "{ count, plural, 1 {One dashboard} other {List of # dashboards} }",
- "dashboard-name-starts-with": "Dashboards των οποίων το όνομα αρχίζει από '{{prefix}}'",
- "type-alarm": "Alarm",
- "type-alarms": "Alarms",
- "list-of-alarms": "{ count, plural, 1 {One alarms} other {List of # alarms} }",
- "alarm-name-starts-with": "Alarms των οποίων το όνομα αρχίζει από '{{prefix}}'",
- "type-rulechain": "Αλυσίδα Κανόνων",
- "type-rulechains": "Αλυσίδες Κανόνων",
- "list-of-rulechains": "{ count, plural, 1 {One rule chain} other {List of # rule chains} }",
- "rulechain-name-starts-with": "Αλυσίδες Κανόνων των οποίων το όνομα αρχίζει από '{{prefix}}'",
- "type-scheduler-event": "Προγραμματιστής",
- "type-scheduler-events": "Προγραμματιστής",
- "list-of-scheduler-events": "{ count, plural, 1 {One scheduler event} other {List of # scheduler events} }",
- "scheduler-event-name-starts-with": "Προγραμματιστές γεγονότων των οποίων το όνομα αρχίζει από '{{prefix}}'",
- "type-blob-entity": "Ογκώδη οντότητα",
- "type-blob-entities": "Ογκώδεις οντότητες",
- "list-of-blob-entities": "{ count, plural, 1 {One blob entity} other {List of # blob entities} }",
- "blob-entity-name-starts-with": "Ογκώδεις οντότητες των οποίων το όνομα αρχίζει από '{{prefix}}'",
- "type-rulenode": "Κόμβος κανόνα",
- "type-rulenodes": "Κόμβοι κανόνων",
- "list-of-rulenodes": "{ count, plural, 1 {One rule node} other {List of # rule nodes} }",
- "rulenode-name-starts-with": "Κόμβοι κανόνων των οποίων το όνομα αρχίζει από '{{prefix}}'",
- "type-current-customer": "Τρέχον Πελάτης",
- "search": "Αναζήτηση Οντότητες",
- "selected-entities": "{ count, plural, 1 {1 entity} other {# entities} } επιλεγμένα",
- "entity-name": "Όνομα οντότητας",
- "details": "Λεπτομέρειες οντότητας",
- "no-entities-prompt": "Δεν βρέθηκαν οντότητες",
- "no-data": "Δεν υπάρχουν δεδομένα προς προβολή",
- "columns-to-display": "στήλες που προβάλονται",
- "type-entity-group": "Ομάδα Οντότητας",
- "type-converter": "Μετατροπέας Δεδομένων",
- "type-converters": "Μετατροπείς Δεδομένων",
- "list-of-converters": "{ count, plural, 1 {One data converter} other {List of # data converters} }",
- "converter-name-starts-with": "Μετατροπείς δεδομένων των οποίων το όνομα αρχίζει από '{{prefix}}'",
- "type-integration": "Ενσωμάτωση",
- "type-integrations": "Ενσωματώσεις",
- "list-of-integrations": "{ count, plural, 1 {One integration} other {List of # integrations} }",
- "integration-name-starts-with": "Ενσωματώσεις των οποίων το όνομα αρχίζει από '{{prefix}}'",
- "type-role": "Ρόλος",
- "type-roles": "Ρόλοι",
- "list-of-roles": "{ count, plural, 1 {One role} other {List of # roles} }",
- "role-name-starts-with": "Ρόλοι των οποίων το όνομα αρχίζει από '{{prefix}}'",
- "type-group-permission": "Άδεια Ομάδας"
- },
- "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": "κρυφό σε mobile",
- "use-cell-style-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 entity group} other {# entity groups} }?",
- "delete-entity-groups-action-title": "Διαγραφή { count, plural, 1 {1 entity group} other {# entity groups} }",
- "delete-entity-groups-text": "Προσοχή, αφού ολοκληρωθεί η επιβεβαίωση, όλες οι επιλεγμένες ομάδες οντοτήτων θα αφαιρεθούν και όλα τα σχετικά δεδομένα θα διαγραφούν οριστικά.",
- "device-groups": "Ομάδες Συσκευών",
- "asset-groups": "Ομάδες Asset",
- "customer-groups": "Ομάδες Πελατών",
- "device-group": "Ομάδα Πελατών",
- "asset-group": "Ομάδα Asset",
- "user-group": "Ομάδα Χρηστών",
- "user-groups": "Ομάδες Χρηστών",
- "customer-group": "Ομάδα Χρηστών",
- "entity-view-groups": "Ομάδες Όψεων",
- "entity-view-group": "Προβολή ομαδών οντοτήτων",
- "dashboard-groups": "Ομάδες Dashboard",
- "dashboard-group": "Ομάδα Dashboard",
- "fetch-more": "Περισσότερα",
- "column-type": {
- "column-type": "Τύπος στήλης",
- "client-attribute": "Χαρακτηριστικά Client",
- "shared-attribute": "Κοινόχρηστα Χαρακτηριστικά",
- "server-attribute": "Χαρακτηριστικό Server",
- "timeseries": "Χρονική σειρά",
- "entity-field": "Πεδίο οντότητας"
- },
- "column-type-required": "Απαιτείται τύπος στήλης.",
- "entity-field": {
- "created-time": "Δημιουργήθηκε",
- "name": "Όνομα",
- "type": "Τύπος",
- "assigned_customer": "Ανατεθειμένος πελάτης",
- "authority": "Εξουσιοδότηση",
- "first_name": "Όνομα",
- "last_name": "Επίθετο",
- "email": "Email",
- "title": "Τίτλος",
- "country": "Χώρα",
- "state": "Νομός",
- "city": "Πόλη",
- "address": "Διεύθυνση",
- "address2": "Διεύθυνση 2",
- "zip": "Τ.Κ.",
- "phone": "Τηλέφωνο"
- },
- "sort-order": {
- "asc": "Αύξουσα",
- "desc": "Φθίνουσα",
- "none": "Καμία"
- },
- "details-mode": {
- "on-row-click": "στο κλικ στη γραμμη",
- "on-action-button-click": "στο κλικ στο κουμπί λεπτομέρειες",
- "disabled": "μη διαθέσιμο"
- },
- "change-owner": "Αλλαγή ιδιοκτήτη",
- "select-target-owner": "Επιλογή ιδιοκτήτη",
- "no-owners-matching": "Δεν βρέθηκε ιδιοκτήτης που να αντιστοιχεί σε '{{owner}}'.",
- "target-owner-required": "Απαιτείται επιλεγμένος ιδιοκτήτης.",
- "confirm-change-owner-title": "Είστε σίγουροι ότι θέλετε να αλλάξετε ιδιοκτήτη για { count, plural, 1 {1 selected entity} other {# selected entities} }?",
- "confirm-change-owner-text": "Προσοχή, μετά την επιβεβαίωση, όλες οι επιλεγμένες οντότητες θα αφαιρεθούν από τον τρέχοντα ιδιοκτήτη και θα τοποθετηθούν στην ομάδα 'Όλα' του επιλεγμένου ιδιοκτήτη.",
- "add-to-group": "Προσθήκη σε ομάδα",
- "move-to-group": "Μετακίνηση σε ομάδα",
- "select-entity-group": "Επιλογή ομάδας οντοτήτων",
- "no-entity-groups-matching": "Δεν βρέθηκαν ομάδες οντοτήτων που να αντιστοιχούν με '{{entityGroup}}'.",
- "target-entity-group-required": "Απαιτείται επιλεγμένη ομάδα οντοτήτων.",
- "select-user-group": "Επιλογή ομάδας χρηστών",
- "no-user-groups-matching": "Δεν βρέθηκαν ομάδες χρηστών οι οποίες να αντιστοιχούν σε '{{entityGroup}}'.",
- "target-user-group-required": "Απαιτείται επιλεγμένη ομάδα χρηστών.",
- "remove-from-group": "Αφαίρεση από ομάδα",
- "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-login-as-user": "Ενεργοποίηση εισόδου ως χρήστη",
- "enable-users-management": "Ενεργοποίηση διαχείρισης χρήστών",
- "enable-customers-management": "Ενεργοποίηση διαχείρησης πελατών",
- "enable-assets-management": "Ενεργοποίηση διαχείρησης assets",
- "enable-devices-management": "Ενεργοποίηση διαχείρησης συσκευών",
- "enable-entity-views-management": "Ενεργοποίηση διαχείρησης προβολής οντοτήτων",
- "enable-dashboards-management": "Ενεργοποίηση διαχείρησης dashboard",
- "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": "Απαιτείται φίλτρο ονόματος ομάδας οντοτήτων.",
- "roles": "Ρόλοι",
- "permissions": "Δικαιώματα",
- "public": "Δημόσιο",
- "entity-group-public": "Η ομάδα οντοτήτων είναι δημόσια",
- "make-public": "Δημοσιοποίηση ομάδας οντοτήτων",
- "make-private": "Ιδιωτικοποίηση ομάδας οντοτήτων",
- "make-public-entity-group-title": "Είστε σίγουροι ότι θέλετε να κάνετε την ομάδα οντοτήτων '{{entityGroupName}}' δημόσια;",
- "make-public-entity-group-text": "Μετά την επιβεβαίωση, η ομάδα οντοτήτων και όλες οι οντότητές της θα δημοσιοποιηθούν και θα είναι προσβάσιμες από τρίτους.",
- "make-private-entity-group-title": "Είστε σίγουροι ότι θέλετε να κάνετε την ομάδα οντοτήτων '{{entityGroupName}}' ιδιωτική?",
- "make-private-entity-group-text": "Μετά την επιβεβαίωση, η ομάδα οντοτήτων και όλες οι οντότητές της θα γίνουν ιδιωτικές και δεν θα είναι προσβάσιμες από τρίτους.",
- "copyId": "Αντιγραφή ID ομάδας οντοτήτων",
- "idCopiedMessage": "Το ID της ομάδας οντοτήτων έχει αντιγραφεί στο πρόχειρο"
- },
- "entity-field": {
- "created-time": "Δημιουργήθηκε",
- "name": "Όνομα",
- "type": "Τύπος",
- "first-name": "Όνομα",
- "last-name": "Επίθετο",
- "email": "Email",
- "title": "Τίτλος",
- "country": "Χώρα",
- "state": "Νομός",
- "city": "Πόλη",
- "address": "Διεύθυνση",
- "address2": "Διεύθυνση 2",
- "zip": "Τ.Κ.",
- "phone": "Τηλέφωνο"
- },
- "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}}'.
Τα ψευδώνυμα προβολής οντότητας πρέπει να είναι μοναδικά εντός του dashboard.",
- "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 entityView} other {# entityViews} } σε πελάτη",
- "delete-entity-views": "Διαγραφή προβολών οντότητας",
- "make-public": "Δημοσιοποίηση προβολής οντότητας",
- "make-private": "Ιδιωτικοποίηση προβολής οντότητας",
- "unassign-from-customer": "Αφαίρεση από πελάτη",
- "unassign-entity-views": "Αφαίρεση προβολών οντότητας",
- "unassign-entity-views-action-title": "Αφαίρεση { count, plural, 1 {1 entityView} other {# entityViews} } από πελάτη",
- "assign-new-entity-view": "Ανάθεση νέας προβολής οντότητας",
- "delete-entity-view-title": "Είστε σίγουροι ότι θέλετε να διαγράψετε την προβολή οντότητας '{{entityViewName}}'?",
- "delete-entity-view-text": "Προσοχή, μετά την επιβεβαίωση, η προβολή της οντότητας και όλα τα σχετικά δεδομένα θα διαγραφούν οριστικά.",
- "delete-entity-views-title": "Είστε σίγουροι ότι θέλετε να προβάλετε την οντότητα { count, plural, 1 {1 entityView} other {# entityViews} };",
- "delete-entity-views-action-title": "Διαγραφή { count, plural, 1 {1 entityView} other {# entityViews} }",
- "delete-entity-views-text": "Προσοχή, μετά την επιβεβαίωση, όλες οι επιλεγμένες προβολές της οντότητας και όλα τα σχετικά δεδομένα θα διαγραφούν οριστικά.",
- "make-public-entity-view-title": "Είστε σίγουροι ότι θέλετε να κάνετε την προβολή οντότητας '{{entityViewName}}' δημόσια?",
- "make-public-entity-view-text": "Μετά την επιβεβαίωση, η προβολή της οντότητας και όλα τα δεδομένα της θα δημοσιοποιηθούν και θα είναι προσβάσιμα από τρίτους.",
- "make-private-entity-view-title": "Είστε σίγουροι ότι θέλετε να κάνετε την προβολή οντότητας '{{entityViewName}}' ιδιωτική;",
- "make-private-entity-view-text": "Μετά την επιβεβαίωση, η προβολή της οντότητας και όλα τα δεδομένα της θα γίνουν ιδιωτικά και θα δεν είναι προσβάσιμα από τρίτους.",
- "unassign-entity-view-title": "Είστε σίγουροι ότι θέλετε να αφαιρέσετε την προβολη οντότητας '{{entityViewName}}';",
- "unassign-entity-view-text": "Μετά την επιβεβαίωση, η προβολή της οντότητας θα καταργηθεί και δεν θα είναι προσβάσιμη από τον πελάτη.",
- "unassign-entity-view": "Αφαίρεση προβολής οντότητας",
- "unassign-entity-views-title": "Είστε σίγουροι ότι θέλετε να αφαιρέσετε { count, plural, 1 {1 entityView} other {# entityViews} };",
- "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 προβολής οντότητας",
- "idCopiedMessage": "Το ID της προβολής οντότητας έχει αντιγραφεί στο πρόχειρο",
- "assignedToCustomer": "Αναθέση σε πελάτη",
- "unable-entity-view-device-alias-title": "Αδύνατον να διαγραφεί το ψευδώνυμο προβολής οντότητας",
- "unable-entity-view-device-alias-text": "Το ψευδώνυμο συσκευής '{{entityViewAlias}}' δεν μπορεί να διαγραφεί όσο εξακωλουθεί να χρησιμοποιείτε από τα παρακάτω widget(s):
{{widgetsList}}",
- "select-entity-view": "Επιλογή προβολής οντότητας",
- "start-date": "Ημερομηνία έναρξης",
- "start-ts": "Ώρα έναρξης",
- "end-date": "Ημερομηνία λήξης",
- "end-ts": "Ώρα λήξης",
- "date-limits": "Όρια ημερομηνίας",
- "client-attributes": "Χαρακτηριστικά Client",
- "shared-attributes": "Κοινόχρηστα Χαρακτηριστικά",
- "server-attributes": "Χαρακτηριστικά Server",
- "timeseries": "Χρονική σειρά",
- "client-attributes-placeholder": "Χαρακτηριστικά Client",
- "shared-attributes-placeholder": "Κοινόχρηστα Χαρακτηριστικά",
- "server-attributes-placeholder": "Χαρακτηριστικά Server",
- "timeseries-placeholder": "Χρονική σειρά",
- "target-entity": "Στοχευμένη οντότητα",
- "attributes-propagation": "Διάδοση χαρακτηριστικών",
- "attributes-propagation-hint": "Η προβολή οντοτήτων θα αντιγράφει αυτόματα καθορισμένα χαρακτηριστικά από την στοχευμένη οντότητα κάθε φορά που αποθηκεύετε ή ενημερώνετε αυτήν την προβολή οντότητας. Για λόγους απόδοσης, τα χαρακτηριστικά της στοχευμένης οντότητας δεν μεταδίδονται στην προβολή οντότητας με κάθε αλλαγή χαρακτηριστικών. Μπορείτε να ενεργοποιήσετε την αυτόματη διάδοση ρυθμίζοντας τον κόμβο \"αντιγραφή για προβολή \" στην αλυσίδα κανόνων σας και συνδέοντας τα μηνύματα \"Χαρακτηριστικά Post \" και \"Ενημερωμένα Χαρακτηριστικά \" στον νέο κόμβο.",
- "timeseries-data": "Δεδομένα χρονικής σειράς",
- "timeseries-data-hint": "Ρυθμίστε τα δεδομένα της χρονικής σειράς της στοχευμένης οντότητας που θα είναι διαθέσιμα στην προβολή οντοτητας. Αυτά τα δεδομένα χρονικής σειράς είναι μόνο για ανάγνωση.",
- "selected-entity-views": "{ count, plural, 1 {1 entity view} other {# entity views} } επιλεγμένα",
- "search": "Αναζήτηση προβολών οντότητας",
- "select-group-to-add": "Επιλογή ομάδας για προσθήκη των επιλεγμένων προβολών οντότητας",
- "select-group-to-move": "Επιλογή ομάδας για μετακίνηση των επιλεγμένων προβολών οντότητας",
- "remove-entity-views-from-group": "Είστε σίγουροι ότι θέλετε να αφαιρέσετε { count, plural, 1 {1 entity view} other {# entity views} } from group '{entityGroup}'?",
- "group": "Ομάδα προβολών οντότητας",
- "list-of-groups": "{ count, plural, 1 {One entity view group} other {List of # entity view groups} }",
- "group-name-starts-with": "Ομάδες προβολής οντότητας των οποίων το όνομα αρχίζει από '{{prefix}}'"
- },
- "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": "Alarm",
- "event-time": "Ώρα Γεγονότος",
- "server": "Διακομιστής",
- "body": "Σώμα (body)",
- "method": "Μέθοδος",
- "type": "Τύπος",
- "in": "Είσοδος",
- "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 extension} other {# extensions} } επιλέχθηκαν",
- "type": "Τύπος",
- "key": "Κλειδί",
- "value": "Τιμή",
- "id": "ID",
- "extension-id": "ID επέκτασης",
- "extension-type": "Τύπος επέκτασης",
- "transformer-json": "JSON *",
- "unique-id-required": "Το τρέχον ID επέκτασης υπάρχει ήδη.",
- "delete": "Διαγραφή επέκτασης",
- "add": "Προσθήκη επέκτασης",
- "edit": "Επεξεργασία επέκτασης",
- "view": "Προβολή επέκτασης",
- "delete-extension-title": "Είστε σίγουροι ότι θέλετε να διαγράψετε την επέκταση '{{extensionId}}';",
- "delete-extension-text": "Προσοχή, μετά την επιβεβαίωση, η επέκταση και όλα τα σχετικά δεδομένα θα διαγραφούν μόνιμα.",
- "delete-extensions-title": "Είστε σίγουροι ότι θέλετε να διαγράψετε { count, plural, 1 {1 extension} other {# extensions} }?",
- "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": "Απαιτείται το πεδίο",
- "brokers": "Brokers",
- "add-broker": "Προσθήκη broker",
- "host": "Host",
- "port": "Port",
- "port-range": "Η Port πρέπει να είναι από 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": "Αίτημα ID έκφρασης JSON",
- "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": "Server side RPC",
- "add-server-side-rpc-request": "Προσθήκη αιτήματος server-side RPC",
- "device-name-filter": "Φίλτρο ονόματος συσκευής",
- "attribute-filter": "ίλτρο χαρακτηριστικού",
- "method-filter": "Φίλτρο μεθόδου",
- "request-topic-expression": "Αίτημα έκφρασης θέματος",
- "response-timeout": "Λήξη απάντησης σε χιλιοστά του δευτερολέπτου",
- "topic-expression": "Έκφρασου θέματος",
- "client-scope": "Πεδίο εφαρμογής πελάτη",
- "add-device": "Προσθήκη συσκευής",
- "opc-server": "Servers",
- "opc-add-server": "Προσθήκη server",
- "opc-add-server-prompt": "Παρακαλούμε προσθέστε server",
- "opc-application-name": "Όνομα εφαρμογής",
- "opc-application-uri": "URI Εφαρμογής",
- "opc-scan-period-in-seconds": "Περίοδος σάρωσης σε δευτερόλεπτα",
- "opc-security": "Ασφάλεια",
- "opc-identity": "Ταυτότητα",
- "opc-keystore": "Keystore",
- "opc-type": "Τύπος",
- "opc-keystore-type": "Τύπος",
- "opc-keystore-location": "τοποθεσία *",
- "opc-keystore-password": "Κωδικός",
- "opc-keystore-alias": "Ψευδώνυμο",
- "opc-keystore-key-password": "Κωδικός Κλειδί",
- "opc-device-node-pattern": "Μοτίβο κόμβου συσκευής",
- "opc-device-name-pattern": "Μοτίβο ονόματος συσκευής",
- "modbus-server": "Servers/slaves",
- "modbus-add-server": "Προσθήκη server/slave",
- "modbus-add-server-prompt": "Παρακαλούμε προσθέστε server/slave",
- "modbus-transport": "Μεταφορά",
- "modbus-tcp-reconnect": "Αυτόματη επανασύνδεση",
- "modbus-rtu-over-tcp": "RTU over TCP",
- "modbus-port-name": "Όνομα serial port",
- "modbus-encoding": "Encoding",
- "modbus-parity": "Parity",
- "modbus-baudrate": "Baud rate",
- "modbus-databits": "Data bits",
- "modbus-stopbits": "Stop bits",
- "modbus-databits-range": "Τα Data bits πρέπει να κυμαίνονται από 7 εώς 8.",
- "modbus-stopbits-range": "Τα Stop bits πρέπει να κυμαίνονται από 1 εώς 2.",
- "modbus-unit-id": "ID Μονάδας",
- "modbus-unit-id-range": "Το ID Μονάδας πρέπει να κυμαίνεται από 1 εώς 247.",
- "modbus-device-name": "Όνομα συσκευής",
- "modbus-poll-period": "Poll period (ms)",
- "modbus-attributes-poll-period": "Χαρακτηριστικά poll period (ms)",
- "modbus-timeseries-poll-period": "Χρονική σειρά poll period (ms)",
- "modbus-poll-period-range": "Το Poll period θα πρέπει να έχει θετική τιμή.",
- "modbus-tag": "Ετικέτα",
- "modbus-function": "Λειτουργία",
- "modbus-register-address": "Καταχώριση διεύθυνσης",
- "modbus-register-address-range": "η καταχωριμένη διεύθυνση πρεπει να κυμαίνεται από 0 ως 65535.",
- "modbus-register-bit-index": "Bit index",
- "modbus-register-bit-index-range": "Το Bit index πρέπει να κυμαίνεται από 0 ως 15.",
- "modbus-register-count": "Μετρητής καταχώρησης",
- "modbus-register-count-range": "Ο μετρητής καταχώρησης πρεέπει να έχει θετική τιμή.",
- "modbus-byte-order": "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 item} other {# items} }?",
- "delete-items-action-title": "Διαγραφή { count, plural, 1 {1 item} other {# items} }",
- "delete-items-text": "Προσοχή, μετά την επιβεβαίωση, όλα τα επιλεγμένα στοιχεία θα καταργηθούν και όλα τα σχετικά δεδομένα θα διαγραφούν οριστικά.",
- "add-item-text": "Προσθήκη νέου αντικειμένου",
- "no-items-text": "Δεν βρέθηκαν αντικείμενα",
- "item-details": "λεπτομέρειες αντικείμενου",
- "delete-item": "Διαγραφή Αντικειμένου",
- "delete-items": "Διαγραφή Αντικειμένων",
- "scroll-to-top": "Κύλιση προς τα πάνω"
- },
- "help": {
- "goto-help-page": "Πηγαίνετε στη σελίδα"
- },
- "home": {
- "home": "Αρχικη",
- "profile": "Προφίλ",
- "logout": "Αποσυνδέση",
- "menu": "Μενού",
- "avatar": "Avatar",
- "open-user-menu": "Άνοιγμα μενού χρήστη"
- },
- "import": {
- "no-file": "Δεν έχει επιλεχθεί αρχείο",
- "drop-file": "Αποθέστε ένα αρχείο JSON ή κάνετε κλικ για να επιλέξετε ένα αρχείο για ανέβασμα.",
- "drop-csv-file": "Αποθέστε ένα αρχείο CVS ή κάνετε κλικ για να επιλέξετε ένα αρχείο για ανέβασμα.",
- "drop-file-csv": "Αποθέστε ένα αρχείο CSV ή κάνετε κλικ για να επιλέξετε ένα αρχείο για ανέβασμα.",
- "column-value": "Τιμή",
- "column-title": "Τίτλος",
- "column-example": "Παράδειγμα δεδομένων",
- "column-key": "Κλειδί χαρακτηριστικού/τηλεμετρίας",
- "csv-delimiter": "Οριοθέτηση CSV",
- "csv-first-line-header": "Η πρώτη σειρά περιέχει ονόματα στηλών",
- "csv-update-data": "Ανανέωση χαρακτηριστικών/τηλεμετρίας",
- "import-csv-number-columns-error": "Ένα αρχείο θα πρέπει να περιέχει τουλάχιστον δυο στήλες",
- "import-csv-invalid-format-error": "Μη έγκυρη μορφή αρχείου. Σειρά: '{{line}}'",
- "column-type": {
- "name": "Όνομα",
- "type": "Τύπος",
- "column-type": "Τύπος στήλης",
- "client-attribute": "Χαρακτηριστικό Client",
- "shared-attribute": "Χαρακτηριστικό Shared",
- "server-attribute": "Χαρακτηριστικό Server",
- "timeseries": "Χρονική σειρά",
- "entity-field": "Πεδίο Οντότητας",
- "access-token": "Διακριτικό πρόσβασης"
- },
- "stepper-text": {
- "select-file": "Επιλογή αρχείου",
- "configuration": "Εισαγωγή ρύθμισης",
- "column-type": "Επιλογή τύπου στήλης",
- "creat-entities": "Δημιουργία νέων οντοτήτων",
- "done": "Ολοκληρώθηκε"
- },
- "message": {
- "create-entities": "{{count}} νέες οντότητες δημιουργήθηκαν με επιτυχία.",
- "update-entities": "{{count}} οντότητες ενημερώθηκαν με επιτυχία.",
- "error-entities": "Υπήρξε κάποιο σφάλμα κατά τη δημιουργία {{count}} οντοτήτων."
- }
- },
- "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 integration} other {# integrations} } επιλέχθηκαν",
- "delete-integration-title": "Είστε σίγουροι ότι θέλετε να διαγράψετε την ενσωμάτωση '{{integrationName}}';",
- "delete-integration-text": "Προσοχή, μετά την επιβεβαίωση, η ενσωμάτωση και όλα τα σχετικά δεδομένα θα διαγραφούν οριστικά.",
- "delete-integrations-title": "Είστε σίγουροι ότι θέλετε { count, plural, 1 {1 integration} other {# integrations} };",
- "delete-integrations-action-title": "Διαγραφή { count, plural, 1 {1 integration} other {# integrations} }",
- "delete-integrations-text": "Προσοχή, αφού ολοκληρωθεί η επιβεβαίωση, όλες οι επιλεγμένες ενσωματώσεις θα αφαιρεθούν και όλα τα σχετικά δεδομένα θα διαγραφούν οριστικά.",
- "events": "Γεγονότα",
- "add": "Προσθήκη Ενσωμάτωσης",
- "integration-details": "Λεπτομέρειες Ενσωμάτωσης",
- "details": "Λεπτομέρειες",
- "copyId": "Αντιγραη ID ενσωμάτωσης",
- "idCopiedMessage": "Το ID της ενσωμάτωσης έχει αντιγραφεί στο πρόχειρο.",
- "debug-mode": "Λειτουργία απασφαλμάτωσης",
- "enable-security": "Ενεργοποίηση ασφάλειας",
- "headers-filter": "Φίλτρο Headers",
- "header": "Header",
- "no-headers-filter": "Όχι φίλτρο headers",
- "downlink-url": "URL Λήψης",
- "application-uri": "URI Εφαρμογής",
- "as-id": "AS ID",
- "as-id-required": "Απαιτείται AS ID.",
- "as-key": "AS Key",
- "as-key-required": "Απαιτείται AS Key.",
- "max-time-diff-in-seconds": "Μέγιστη χρονική διαφορά (δευτερόλεπτα)",
- "max-time-diff-in-seconds-required": "Απαιτείται μέγιστη χρονική διαφορά.",
- "name": "Όνομα",
- "name-required": "Απαιτείται όνομα.",
- "description": "Περιγραφή",
- "base-url": "Base URL",
- "base-url-required": "Απαιτείται Base URL",
- "security-key": "Κλειδί ασφάλειας",
- "http-endpoint": "HTTP endpoint URL",
- "copy-http-endpoint-url": "Αντιγραφή HTTP endpoint URL",
- "http-endpoint-url-copied-message": "Το HTTP endpoint URL έχει αντιγραφεί στο πρόχειρο",
- "host": "Host",
- "host-required": "Απαιτείται Host.",
- "host-type": "Τύπος Host",
- "host-type-required": "Απαιτείται τύπος Host.",
- "custom-host": "Προσαρμοσμένο host",
- "custom-host-required": "Απαιτείται προσαρμοσμένο host.",
- "port": "Port",
- "port-required": "Απαιτείται Port.",
- "port-range": "Η Port πρέπει να κυμαίνεται από 1 ως 65535.",
- "connect-timeout": "Λήξη σύνδεσης (δευτερόλεπτα)",
- "connect-timeout-required": "Απαιτείται λήξη σύνδεσης.",
- "connect-timeout-range": "Η λήξη σύνδεσης πρέπει να κυμαίνεται από 1 ως 200.",
- "client-id": "Client ID",
- "clean-session": "Καθαρή συνεδρία 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-required": "Απαιτείται μοτίβο θέματος σύνδεσης.",
- "aws-iot-endpoint": "AWS IoT Endpoint",
- "aws-iot-endpoint-required": "Απαιτείται AWS IoT Endpoint.",
- "aws-iot-credentials": "AWS IoT Διαπιστευτήρια",
- "application-credentials": "Διαπιστευτήρια Εφαρμογής",
- "api-key": "API Key",
- "api-key-required": "Απαιτείται API Key.",
- "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.",
- "event-hub-name": "Όνομα Event Hub",
- "event-hub-name-required": "Απαιτείται όνομα Event Hub.",
- "sas-key-name": "Όνομα SAS Key",
- "sas-key-name-required": "Απαιτείται όνομα SAS Key.",
- "sas-key": "SAS Key",
- "sas-key-required": "Απαιτείται SAS Key.",
- "iot-hub-name": "IoT Hub Name (απαιτείται για downlink)",
- "metadata": "Μεταδεδομένα",
- "type": "Τύπος",
- "type-required": "Απαιτείται τύπος.",
- "uplink-converter": "Μετατροπέας δεδομένων uplink",
- "uplink-converter-required": "Απαιτείται μετατροπέας δεδομένων uplink.",
- "downlink-converter": "Μετατροπέας δεδομένων downlink",
- "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",
- "opc-ua-application-name": "Όνομα εφαρμογής",
- "opc-ua-application-uri": "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": "Keystore",
- "add-opc-ua-keystore-prompt": "Παρακαλούμε προσθέστε αρχείο keystore",
- "opc-ua-keystore-required": "Απαιτείται keystore",
- "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-namespace": "Namespace",
- "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": {
- "direction": "Κατεύθυνση Λεζάντας",
- "position": "Θέση λεζάντας",
- "show-max": "Προβολή μέγιστης τιμής",
- "show-min": "Προβολή ελάχιστης τιμής",
- "show-avg": "Προβολή μέσης τιμής",
- "show-total": "Προβολή συνολικής τιμής",
- "settings": "Ρυθμίσεις λεζάντας",
- "min": "min",
- "max": "max",
- "avg": "Μ.Ο.",
- "total": "Σύνολο"
- },
- "login": {
- "login": "Σύνδεση",
- "request-password-reset": "Αίτημα επαναφοράς κωδικού πρόσβασης",
- "reset-password": "Επαναφορά κωδικού πρόσβασης",
- "create-password": "Δημιουργία κωδικού πρόσβασης",
- "passwords-mismatch-error": "Οι καταχωρημένοι κωδικοί πρόσβασης πρέπει να είναι ίδιοι!",
- "password-again": "Επανάληψη κωδικού πρόσβασης",
- "sign-in": "Παρακαλώ, συνδεθείτε",
- "username": "Όνομα Χρήστη (email)",
- "remember-me": "Να με Θυμάσαι",
- "forgot-password": "Ξεχάσατε τον κωδικό πρόσβασης;",
- "password-reset": "Επαναφορά κωδικού πρόσβασης",
- "new-password": "Νέος κωδικός πρόσβασης",
- "new-password-again": "Επανάληψη νέου κωδικού πρόσβασης",
- "password-link-sent-message": "Ο σύνδεσμος επαναφοράς κωδικού πρόσβασης στάλθηκε με επιτυχία!",
- "email": "Email",
- "no-account": "Δεν έχετε λογαριασμό;",
- "create-account": "Δημιουργία λογαριασμού",
- "login-with": "Σύνδεση μέσω {{name}}",
- "or": "ή"
- },
- "signup": {
- "firstname": "Όνομα",
- "lastname": "Επίθετο",
- "email": "Email",
- "signup": "Εγγραφή",
- "create-password": "Δημιουργία κωδικού",
- "repeat-password": "Επαναλάβετε τον κωδικό",
- "have-account": "Έχετε ήδη έναν λογαριασμό;",
- "signin": "Είσοδος",
- "no-captcha-message": "Πρέπει να επιβεβαιώσετε ότι δεν είστε ρομπότ",
- "password-length-message": "Ο κωδικός σας πρεπει να περιλαμβάνει τουλάχιστον 6 χαρακτήρες",
- "email-verification": "Επιβεβαίωση email",
- "email-verification-message": "Έχει σταλεί ένα email επιβεβαίωσης στην διεύθυνση email που καθορίσατε. Παρακαλούμε ακολουθήστε τις οδηγίες που συμπεριλαμβανονται στο email ώστε να ολοκληρωθεί η εγγραφή σας.Σημείωση: Αν δεν έχει εμφανιστεί σχετικά άμεσα το email, παρακαλούμε ελέγξτε στον φάκελο με την 'Ανεπιθύμητη Αλληλογραφία' (spam) ή ξαναπροσπαθείστε να στείλετε το email κάνοντας κλικ στο κουμπί 'Αποστολή εκ νέου'",
- "account-activation-title": "Ενεργοποίηση λογαριασμού",
- "account-activated": "Ο λογαριασμός ενεργοποιήθηκε με επιτυχία!",
- "account-activated-text": "Συγχαρητήρια!Ο λογαριασμός σας έχει ενεργοποιηθεί.Τώρα μπορείται να κάνετε είσοδο στην πλατφόρμα.",
- "resend": "Αποστολή εκ νέου",
- "inactive-user-exists-title": "Ο ανενεργός χρήστης υπάρχει ήδη",
- "inactive-user-exists-text": "Υπάρχει ήδη εγγεγραμμένος χρήστης με μη επιβεβαιωμένη διεύθυνση email. Click Πατήστε το κουμπί 'Επαναποστολή', αν θέλετε να στείλετε ξανά email επιβεβαίωσης.",
- "activating-account": "Ενεργοποίηση λογαριασμού...",
- "activating-account-text": "Ο λογαριασμός σας ενεργοποιείται αυτήν τη στιγμή. Παρακαλούμε περιμένετε...",
- "accept-privacy-policy": "Αποδοχή Πολιτικής Απορρήτου",
- "accept": "Αποδοχή",
- "privacy-policy": "Πολιτική Απορρήτου"
- },
- "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 relation} άλλες {# relations} } επιλέχθηκαν",
- "type": "Τύπος",
- "to-entity-type": "Στον τύπο οντότητας",
- "to-entity-name": "Στο όνομα οντότητας",
- "from-entity-type": "Από τύπο οντότητας",
- "from-entity-name": "Από όνομα οντότητας",
- "to-entity": "Σε οντότητα",
- "from-entity": "Από οντότητα",
- "delete": "Διαγραφή σχέσης",
- "relation-type": "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 relation} άλλες {# relations} };",
- "delete-to-relations-text": "Προσοχή, μετά την επιβεβαίωση όλες οι επιλεγμένες σχέσεις θα αφαιρεθούν και οι αντίστοιχες οντότητες δεν θα σχετίζονται με την τρέχουσα οντότητα.",
- "delete-from-relation-title": "Είστε σίγουροι ότι θέλετε να διαγράψετε σχέση από την οντότητα '{{entityName}}';",
- "delete-from-relation-text": "Προσοχή, μετά την επιβεβαίωση η τρέχουσα οντότητα δεν θα σχετίζεται με την οντότητα '{{entityName}}'.",
- "delete-from-relations-title": "Είστε σίγουροι ότι θέλετε να διαγράψετε { count, plural, 1 {1 relation} other {# relations} };",
- "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 rule chain} other {# rule chains} };",
- "delete-rulechains-action-title": "Διαγραφή { count, plural, 1 {1 rule chain} other {# rule chains} }",
- "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": "Αντιγραφή ταυτότητας Αλυσίδας Κανόνων",
- "idCopiedMessage": "Η ταυτότητα της Αλυσίδας Κανόνων έχει αντιγραφεί στο πρόχειρο",
- "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": "Delete selected",
- "select-all": "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": "Φίλτρο",
- "type-filter-details": "Φιλτράρετε εισερχόμενα μηνύματα με διαμορφωμένες συνθήκες",
- "type-enrichment": "Εμπλουτισμός",
- "type-enrichment-details": "Προσθέστε επιπλέον πληροφορίες στα Μεταδεδομένα του μηνύματος",
- "type-transformation": "Μεταμόρφωση",
- "type-transformation-details": "Αλλαγή ωφέλιμου φορτίου και μεταδεδομένων μηνύματος",
- "type-action": "Ενέργεια",
- "type-action-details": "Εκτέλεση ειδικής ενέργειας",
- "type-analytics": "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": "Βοήθεια",
- "reset-debug-mode": "Επαναφορά λειτουργίας εντοπισμού σφαλμάτων σε όλους τους κόμβους"
- },
- "role": {
- "role": "Ρόλος",
- "roles": "Ρόλοι",
- "management": "Διαχείριση ρόλων",
- "view-roles": "Προβολή ρόλων",
- "no-roles-matching": "Δεν βρέθηκαν ρόλοι που να ταιριάζουν '{{entity}}'.",
- "role-list": "Λίστα ρόλων",
- "add": "Προσθήκη ρόλου",
- "view": "Προβολή ρόλου",
- "no-roles-text": "Δεν βρέθηκαν ρόλοι",
- "role-details": "Λεπτομέρειες ρόλου",
- "add-role-text": "Προσθήκη νέου ρόλου",
- "delete": "Διαγραφή ρόλου",
- "delete-roles": "Διαγραφή ρόλων",
- "delete-role-title": "Είστε σίγουροι ότι θέλετε να διαγράψετε το ρόλο '{{roleName}}';",
- "delete-role-text": "Προσοχή, μετά την επιβεβαίωση ο ρόλος και όλα τα σχετικά δεδομένα θα διαγραφούν οριστικά.",
- "delete-roles-title": "Είστε σίγουροι ότι θέλετε να παίξετε { count, plural, 1 {1 role} other {# roles} };",
- "delete-roles-action-title": "Διαγραφή { count, plural, 1 {1 role} other {# roles} }",
- "delete-roles-text": "Προσοχή, μετά την επιβεβαίωση όλοι οι επιλεγμένοι ρόλοι θα καταργηθούν και όλα τα σχετικά δεδομένα θα διαγραφούν οριστικά.",
- "role-type": "΄Τύπος ρόλου",
- "role-type-required": "Απαιτείται τύπος ρόλου.",
- "select-role-type": "Επιλογή τύπου ρόλου",
- "enter-role-type": "Εισαγωγή τύπου ρόλου",
- "any-role": "Οποιοσδήποτε ρόλος",
- "no-role-types-matching": "Δεν βρέθηκαν τύποι ρόλων που να ταιριάζουν '{{entitySubtype}}'.",
- "role-type-list-empty": "Δεν έγινε επιλογή τύπου ρόλου.",
- "role-types": "Τύποι ρόλου",
- "name": "Όνομα",
- "name-required": "Απαιτείται όνομα.",
- "description": "Περιγραφή",
- "events": "Γεγονότα",
- "details": "Λεπτομέρειες",
- "copyId": "Αντιγραφή ταυτότητας ρόλου",
- "idCopiedMessage": "Η ταυτότητα ρόλου έχει αντιγραφεί στο πρόχειρο",
- "permissions": "Άδειες",
- "role-required": "Απαιτείται ρόλος",
- "display-type": {
- "GENERIC": "Γενικός",
- "GROUP": "Ομάδα"
- }
- },
- "group-permission": {
- "user-group-roles": "Ρόλοι ομάδας χρηστών",
- "entity-group-permissions": "Άδειες ομάδας Οντοτήτων",
- "role-type": "Τύπος ρόλου",
- "role-name": "Όνομα ρόλου",
- "group-type": "Τύπος ομάδας",
- "group-name": "Όνομα ομάδας",
- "group-owner": "Κάτοχος ομάδας",
- "user-group-name": "Όνομα χρήστη ομάδας",
- "user-group-owner": "Κάτοχος χρήστη ομάδας",
- "edit": "Επεξεργασία Αδειών",
- "delete": "Διαγραφή αδειών",
- "selected-group-permissions": "{ count, plural, 1 {1 group permission} other {# group permissions} } επιλέχθηκαν",
- "delete-group-permission-title": "Είστε σίγουροι ότι θέλετε να διαγράψετε την άδεια ομάδας '{{roleName}}';",
- "delete-group-permission-text": "Προσοχή, μετά την επιβεβαίωση η άδεια ομάδας και όλα τα σχετικά δεδομένα θα διαγραφούν οριστικά.",
- "delete-group-permission": "Διαγραφή άδειας ομάδας",
- "delete-group-permissions-title": "Έίστε σίγουροι ότι θέλετε να διαγράψετε { count, plural, 1 {1 group permission} other {# group permission} };",
- "delete-group-permissions-text": "Προσοχή, μετά την επιβεβαίωση όλες οι επιλεγμένες άδειες ομάδας θα καταργηθούν και όλα τα σχετικά δεδομένα θα διαγραφούν οριστικά.",
- "delete-group-permissions": "Διαγραφή αδειών ομάδας",
- "add-group-permission": "Προσθήκη ομαδικής άδειας",
- "edit-group-permission": "Επεξεργασία άδειας ομάδας",
- "entity-group": "Ομάδα οντοτήτων",
- "user-group": "Χρήστης ομάδας",
- "no-owners-matching": "Δεν βρέθηκαν κάτοχοι που να ταιριάζουν '{{owner}}'.",
- "target-owner-required": " Απαιτείται κάτοχος της ομάδας οντότητας.",
- "target-user-group-owner-required": "Απαιτείται κάτοχος χρήστη ομάδας."
- },
- "permission": {
- "permissions-required": "Τουλάχιστον μία εγγραφή άδειας πρέπει να οριστεί.",
- "remove-permission": "Καταργήστε την καταχώριση δικαιωμάτων",
- "add-permission": "Προσθήκη καταχώρησης άδειας",
- "resource": {
- "resource": "Πηγή",
- "select-resource": "Επιλογή πηγής",
- "resource-required": "Απαιτείται πηγή",
- "no-resources-matching": "Δεν βρέθηκαν πηγές που να ταιριάζουν '{{resource}}'.",
- "display-type": {
- "ALL": "Όλες",
- "PROFILE": "Προφίλ",
- "ADMIN_SETTINGS": "Ρυθμίσεις Διαχειριστή",
- "ALARM": "Alarm",
- "DEVICE": "Συσκευή",
- "ASSET": "Asset",
- "CUSTOMER": "Πελάτης",
- "DASHBOARD": "Dashboard",
- "ENTITY_VIEW": "Προβολή οντοτήτων",
- "TENANT": "Μισθωτής",
- "RULE_CHAIN": "Αλυσίδα Κανόνα",
- "USER": "Χρήστης",
- "WIDGETS_BUNDLE": "Δέσμη Widgets",
- "WIDGET_TYPE": "Τύπος Widget",
- "CONVERTER": "Μετατροπέας",
- "INTEGRATION": "Ενσωμάτωση",
- "SCHEDULER_EVENT": "Πρόγραμμα εκδηλώσεων",
- "BLOB_ENTITY": "Δέσμη Οντότητας",
- "CUSTOMER_GROUP": "Ομάδα Πελατών",
- "DEVICE_GROUP": "Ομάδα Συσκευών",
- "ASSET_GROUP": "Ομάδες Asset",
- "USER_GROUP": "Ομάδα Χρηστών",
- "ENTITY_VIEW_GROUP": "Ομάδα Οντοτήτων",
- "DASHBOARD_GROUP": "Ομάδα Dashboard",
- "ROLE": "Ρόλος",
- "GROUP_PERMISSION": "Ομαδική Άδεια",
- "WHITE_LABELING": "Εμφάνιση",
- "AUDIT_LOG": "Αρχείο Ελέγχου"
- }
- },
- "operation": {
- "operation": "Εργασία",
- "operations": "Εργασίες",
- "operations-required": "Τουλάχιστον μία εργασία πρέπει να καθοριστεί.",
- "enter-operation": "Εισαγωγή εργασίας",
- "no-operations-matching": "Δεν βρέθηκαν εργασίες που να ταιριάζουν '{{operation}}'.",
- "display-type": {
- "ALL": "'Ολες",
- "CREATE": "Δημιουργία",
- "READ": "Ανάγνωση",
- "WRITE": "Εγγραφή",
- "DELETE": "Διαγραφή",
- "ASSIGN_TO_CUSTOMER": "Ανάθεση σε Πελάτη",
- "UNASSIGN_FROM_CUSTOMER": "Αποσύνδεση από Πελάτη",
- "RPC_CALL": "Κλήση RPC",
- "READ_CREDENTIALS": "Ανάγνωση Διαπιστευτηρίων",
- "WRITE_CREDENTIALS": "Γράψτε Διαπιστευτήρια",
- "READ_ATTRIBUTES": "Ανάγνωση Χαρακτηριστικών",
- "WRITE_ATTRIBUTES": "Γράψτε Χαρακτηριστικά",
- "READ_TELEMETRY": "Ανάγνωση Τηλεμετρίας",
- "WRITE_TELEMETRY": "Γράψτε Τηλεμετρία",
- "CLAIM_DEVICES": "Αιτήματα Συσκευών",
- "IMPERSONATE": "Impersonate",
- "CHANGE_OWNER": "Αλλαγή Κατόχου",
- "ADD_TO_GROUP": "Προσθήκη στην Ομάδα",
- "REMOVE_FROM_GROUP": "Αφαίρεση από την Ομάδα"
- }
- }
- },
- "scheduler": {
- "scheduler": "Προγραμματιστής",
- "scheduler-event": "Προγραμματισμένο γεγονός",
- "select-scheduler-event": "Επιλέξτε προγραμματισμένα γεγονότα που να ταιριάζουν '{{entity}}'",
- "scheduler-event-required": "Απαιτείται προγραμματισμένο γεγονός",
- "management": "Διαχείριση Προγράμματος",
- "scheduler-events": "Προγραμματισμένα γεγονότα",
- "add-scheduler-event": "Προσθήκη προγραμματισμένου γεγονότος",
- "search-scheduler-events": "Αναζήτηση προγραμματισμένων γεγονότων",
- "created-time": "Χρόνος που δημιουργήθηκε",
- "name": "Όνομα",
- "type": "Τύπος",
- "created_customer": "Πελάτης που δημιουργήθηκε",
- "edit-scheduler-event": "Επεξεργασία προγραμματισμένου γεγονότος",
- "view-scheduler-event": "Προβολή προγραμματισμένου γεγονότος",
- "delete-scheduler-event": "Διαγραφή προγραμματισμένου γεγονότος",
- "no-scheduler-events": "Δεν βρέθηκαν προγραμματισμένα γεγονότα",
- "selected-scheduler-events": "{ count, plural, 1 {1 scheduler event} other {# scheduler events} } επιλέχθηκαν",
- "delete-scheduler-event-title": "Είστε σίγουροι ότι θέλετε να διαγράψετε το προγραμματισμένο γεγονός '{{schedulerEventName}}';",
- "delete-scheduler-event-text": "Προσοχή, μετά την επιβεβαίωση το προγραμματισμένο γεγονός και όλα τα σχετικά δεδομένα θα διαγραφούν οριστικά.",
- "delete-scheduler-events-title": "Είστε σίγουροι ότι θέλετε να διαγράψετε { count, plural, 1 {1 scheduler event} other {# scheduler events} };",
- "delete-scheduler-events-text": "Προσοχή, μετά την επιβεβαίωση όλα τα επιλεγμένα προγραμματισμένα γεγονότα θα καταργηθούν και όλα τα σχετικά δεδομένα θα διαγραφούν οριστικά.",
- "create": "Δημιουργία προγραμματισμένου γεγονότος",
- "edit": "Επεξεργασία προγραμματισμένου γεγονότος",
- "view": "Προβολή προγραμματισμένου γεγονότος",
- "name-required": "Απαιτείται Όνομα",
- "configuration": "Διαμόρφωση",
- "schedule": "Πρόγραμμα",
- "start": "Έναρξη",
- "date": "Ημερομηνία",
- "time": "Ώρα",
- "repeat": "Επανάληψη",
- "repeats": "Επαναλήψεις",
- "daily": "Καθημερινά",
- "weekly": "Εβδομαδιαία",
- "timer": "Χρονομετρητής",
- "repeats-required": "Απαιτούνται επαναλήψεις.",
- "repeat-on": "Επανάληψη σε",
- "repeat-every": "Επανάληψη κάθε",
- "ends-on": "Τελειώνει σε",
- "sunday-label": "K",
- "monday-label": "Δ",
- "tuesday-label": "T",
- "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": "Επιλογή κατάστασης πίνακα ελέγχου",
- "hours": "Ώρες",
- "minutes": "Λεπτά",
- "seconds": "Δευτερόλεπτα",
- "time-interval-required": "Απαιτείται χρονικό διάστημα",
- "time-unit-required": "Απαιτείται μονάδα ώρας"
- },
- "report": {
- "report-config": "Διαμόρφωση αναφοράς",
- "email-config": "Διαμόρφωση email",
- "dashboard-state-param": "Τιμή παραμέτρου κατάστασης πίνακα",
- "base-url": "Βάση URL",
- "base-url-required": "Απαιτείται Βάση URL.",
- "use-dashboard-timewindow": "Χρησιμοποιήστε το χρονικό πλαίσιο του πίνακα ελέγχου",
- "timewindow": "Χρονικό πλαίσιο",
- "name-pattern": "Αναφορά πρότυπου ονόματος",
- "name-pattern-required": "Απαιτείται αναφορά πρότυπου ονόματος",
- "type": "Τύπος αναφοράς",
- "use-current-user-credentials": "Χρησιμοποιήστε τα τρέχοντα διαπιστευτήρια του χρήστη",
- "customer-user-credentials": "Διαπιστευτήρια του χρήστη του πελάτη",
- "customer-user-credentials-required": "Απαιτούνται διαπιστευτήρια του χρήστη του πελάτη",
- "generate-test-report": "Δημιουργία αναφοράς δοκιμής",
- "send-email": "Αποστολή email",
- "from": "Από",
- "from-required": "Απαιτείται Από.",
- "to": "Σε",
- "to-required": "Απαιτείται Σε.",
- "cc": "Cc",
- "bcc": "Bcc",
- "subject": "Θέμα",
- "subject-required": "Απαιτείται Θέμα.",
- "body": "Σώμα",
- "body-required": "Απαιτείται Σώμα."
- },
- "blob-entity": {
- "blob-entity": "Ογκώδης οντότητα",
- "select-blob-entity": "Επιλογή ογκώδους οντότητας",
- "no-blob-entities-matching": "Δεν βρέθηκαν ογκώδεις οντότητες που να ταιριάζουν '{{entity}}'.",
- "blob-entity-required": "Απαιτείται ογκώδης οντότητα",
- "files": "Αρχεία",
- "search": "Αναζήτηση αρχείων",
- "clear-search": "Εκκαθάριση αναζήτησης",
- "no-blob-entities-prompt": "Δεν βρέθηκαν αρχεία",
- "report": "Αναφορά",
- "created-time": "Χρόνος που δημιουργήθηκε",
- "name": "Όνομα",
- "type": "Τύπος",
- "created_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 tenant} other {# tenants} };",
- "delete-tenants-action-title": "Διαγραφή { count, plural, 1 {1 tenant} other {# tenants} }",
- "delete-tenants-text": "Προσοχή, μετά την επιβεβαίωση όλοι οι επιλεγμένοι Μισθωτές θα αφαιρεθούν και όλα τα σχετικά δεδομένα θα διαγραφούν οριστικά.",
- "title": "Τίτλος",
- "title-required": "Απαιτείται Τίτλος.",
- "description": "Περιγραφή",
- "details": "Λεπτομέρειες",
- "events": "Γεγονότα",
- "copyId": "Αντιγραφή Ταυτότητας του Μισθωτή",
- "idCopiedMessage": "Η Ταυτότητα του Μισθωτή έχει αντιγραφεί στο πρόχειρο",
- "select-tenant": "Επιλογή Μισθωτή",
- "no-tenants-matching": "Δεν βρέθηκαν Μισθωτές που να ταιριάζουν '{{entity}}'.",
- "tenant-required": "Απαιτείται Μισθωτής",
- "selected-tenants": "{ count, plural, 1 {1 tenant} other {# tenants} } επιλέχθηκαν",
- "search": "Αναζήτηση Μισθωτών",
- "allow-white-labeling": "Επιτρέπεται Προσαρμογή Εμφάνισης",
- "allow-customer-white-labeling": "Επιτρέπεται Προσαρμογή Εμφάνισης Πελάτη"
- },
- "timeinterval": {
- "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": "Λεπτά",
- "seconds": "Δευτερόλεπτα",
- "advanced": "Προηγμένος"
- },
- "timewindow": {
- "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": "Τελευταίος",
- "period": "από {{ startTime }} σε {{ endTime }}",
- "edit": "Επεξεργασία Χρονικού Πλαισίου",
- "date-range": "Εύρος ημερομηνιών",
- "last": "Τελευταίος",
- "time-period": "Χρονική Περίοδος"
- },
- "user": {
- "user": "Χρήστης",
- "users": "Χρήστες",
- "management": "Διαχείριση Χρηστών",
- "customer-users": "Χρήστες του Πελάτη",
- "tenant-admins": "Διαχειριστές Μισθωτή",
- "sys-admin": "Διαχειριστής Συστήματος",
- "tenant-admin": "Διαχειριστής Μισθωτή",
- "customer": "Πελάτης",
- "anonymous": "Ανώνυμος",
- "add": "Προσθήκη χρήστη",
- "delete": "Διαγραφή χρήστη",
- "add-user-text": "Προσθήκη νέου Χρήστη",
- "no-users-text": "Δεν βρέθηκαν Χρήστες",
- "user-details": "Λεπτομέρειες Χρήστη",
- "delete-users": "Διαγραφή Χρηστών",
- "delete-user-title": "Είστε σίγουροι ότι θέλετε να διαγράψετε το Χρήστη '{{userEmail}}'?",
- "delete-user-text": "Προσοχή, μετά την επιβεβαίωση ο Χρήστης και όλα τα σχετικά δεδομένα θα διαγραφούν οριστικά.",
- "delete-users-title": "Είστε σίγουροι ότι θέλετε να διαγράψετε { count, plural, 1 {1 user} other {# users} };",
- "delete-users-action-title": "Διαγραφή { count, plural, 1 {1 user} other {# users} }",
- "delete-users-text": "Προσοχή, μετά την επιβεβαίωση όλοι οι επιλεγμένοι Χρήστες θα αφαιρεθούν και όλα τα σχετικά δεδομένα θα διαγραφούν οριστικά.",
- "activation-email-sent-message": "Το email ενεργοποίησης στάλθηκε με επιτυχία!",
- "resend-activation": "Επανάληψη ενεργοποίησης",
- "email": "Email",
- "email-required": "Απαιτείται email.",
- "invalid-email-format": "Μη έγκυρη μορφή email.",
- "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": "Αποστολή mail ενεργοποίησης",
- "activation-link": "Σύνδεσμος ενεργοποίησης Χρήστη",
- "activation-link-text": "΄Προκειμένου να ενεργοποιήσετε το Χρήστη, χρησιμοποιήστε το εξής activation link :",
- "copy-activation-link": "Αντιγραφή συνδέσμου ενεργοποίησης",
- "activation-link-copied-message": "Ο σύνδεσμος ενεργοποίησης χρήστη έχει αντιγραφεί στο πρόχειρο",
- "selected-users": "{ count, plural, 1 {1 user} other {# users} } επιλέχθηκαν",
- "search": "Αναζήτηση Χρηστών",
- "details": "Λεπτομέρειες",
- "login-as-tenant-admin": "Συνδεθείτε ως Διαχειριστής Μισθωτή",
- "login-as-customer-user": "Συνδεθείτε ως Χρήστης του Πελάτη",
- "select-group-to-add": "Επιλέξτε την ομάδα προορισμού για να προσθέσετε επιλεγμένους Χρήστες",
- "select-group-to-move": "Επιλέξτε την ομάδα προορισμού για να μετακινήσετε επιλεγμένους χρήστες",
- "remove-users-from-group": "Είστε σίγουροι ότι θέλετε να καταργήσετε { count, plural, 1 {1 user} other {# users} } από την ομάδα '{entityGroup}';",
- "group": "Ομάδα από Χρήστες",
- "list-of-groups": "{ count, plural, 1 {One user group} other {List of # user groups} }",
- "group-name-starts-with": "Ομάδες Χρηστών των οποίων τα ονόματα ξεκινούν με'{{prefix}}'"
- },
- "value": {
- "type": "Είδος τιμής",
- "string": "Συμβολοσειρά",
- "string-value": "Τιμή συμβολοσειράς",
- "integer": "Ακέραιος",
- "integer-value": "Ακέραια τιμή",
- "invalid-integer-value": "Μη έγκυρη ακέραια τιμή",
- "double": "Πραγματικός",
- "double-value": "Πραγματική τιμή",
- "boolean": "Λογικό",
- "boolean-value": "Λογική τιμή",
- "false": "Εσφαλμένος",
- "true": "Αληθής",
- "long": "Μακρύς"
- },
- "widget": {
- "widget-library": "Βιβλιοθήκη Widget",
- "widget-bundle": "Δέσμη Widget",
- "select-widgets-bundle": "Επιλογή δέσμης Widgets",
- "management": "Διαχείριση Widget",
- "editor": "Συντάκτης Widget",
- "widget-type-not-found": "Πρόβλημα φόρτωσης διαμόρφωσης Widget.
Probably associated\n widget type was removed.",
- "widget-type-load-error": "Το Widget δεν φορτώθηκε λόγω των παρακάτω σφαλμάτων:",
- "remove": "Αφαίρεση Widget",
- "edit": "Επεξεργασία Widget",
- "remove-widget-title": "Είστε σίγουροι ότι θέλετε να αφαιρέσετε το Widget '{{widgetTitle}}'?",
- "remove-widget-text": "Προσοχή, μετά την επιβεβαίωση το widget και όλα τα σχετικά δεδομένα θα διαγραφούν οριστικά.",
- "timeseries": "Χρονική σειρά",
- "search-data": "Αναζήτηση δεδομένων",
- "no-data-found": "Δεν βρέθηκαν δεδομένα",
- "latest-values": "Τελευταίες αξίες",
- "rpc": "Έλεγχος Widget",
- "alarm": "Alarm widget",
- "static": "Στατικό widget",
- "select-widget-type": "Επιλογή τύπου Widget",
- "missing-widget-title-error": "Ο τίτλος Widget πρέπει να καθοριστεί!",
- "widget-saved": "Το Widget αποθηκεύτηκε",
- "unable-to-save-widget-error": "Δεν είναι δυνατή η αποθήκευση του Widget! Το Widget έχει σφάλματα!",
- "save": "Αποθήκευση widget",
- "saveAs": "Αποθήκευση widget ως",
- "save-widget-type-as": "Αποθήκευση τύπου Widget type ως",
- "save-widget-type-as-text": "Παρακαλούμε εισάγετε νέο τίτλο Widget και/ή επιλέξετε στοχευμένη δέσμη widgets",
- "toggle-fullscreen": "Λειτουργεία πλήρους οθόνης",
- "run": "Εκτέλεση Widget",
- "title": "Τίτλος Widget",
- "title-required": "Απαιτείται τίτλος Widget.",
- "type": "Τύπος Widget",
- "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": "Είστε σίγουροι ότι θέλετε να αφαιρέσετε τον τύπο Widget '{{widgetName}}'?",
- "remove-widget-type-text": "Προσοχή, μετά την επιβεβαίωση ο τύπος Widget και όλα τα σχετικά δεδομένα θα διαγραφούν οριστικά.",
- "remove-widget-type": "Αφαίρεση τύπου Widget",
- "add-widget-type": "Προσθήκη νέου τύπου Widget",
- "widget-type-load-failed-error": "Αποτυχία φόρτωσης τύπου Widget!",
- "widget-template-load-failed-error": "Αποτυχία φόρτωσης προτύπου Widget!",
- "add": "Προσθήκη Widget",
- "undo": "Αναίρεση αλλαγών Widget",
- "export": "Εξαγωγή Widget",
- "export-data": "Εξαγωγή δεδομένων Widget",
- "export-to-csv": "Εξαγωγή δεδομένων σε CSV...",
- "export-to-excel": "Εξαγωγή δεδομένων σε XLS...",
- "no-data": "Δεν υπάρχουν δεδομένα για εμφάνιση στο Widget"
- },
- "widget-action": {
- "header-button": "Κουμπί κεφαλίδας στη νέα κατάσταση του πίνακα ελέγχου",
- "update-dashboard-state": "Ενημέρωση της τρέχουσας κατάστασης του dashboard",
- "open-dashboard": "Πλοήγηση σε άλλο dashboard",
- "custom": "Προσαρμοσμένη ενέργεια",
- "target-dashboard-state": "Κατάσταση προορισμού dashboard",
- "target-dashboard-state-required": "Απαιτείται κατάσταση προορισμού dashboard",
- "set-entity-from-widget": "Ορισμός οντότητας από Widget",
- "target-dashboard": "dashboard προορισμού",
- "open-right-layout": "Ανοίξτε τη δεξιά διάταξη του dashboard (προβολή κινητού)"
- },
- "widgets-bundle": {
- "current": "Τρέχουσα δέσμη",
- "widgets-bundles": "Δέσμες Widgets",
- "add": "Προσθήκη δέσμης Widgets",
- "delete": "Διαγραφή δέσμης Widgets",
- "title": "Τίτλος",
- "title-required": "Απαιτείται τίτλος.",
- "add-widgets-bundle-text": "Προσθήκη νέας δέσμης widgets",
- "no-widgets-bundles-text": "Δεν βρέθηκαν δέσμες widgets",
- "empty": "Η δέσμη Widgets είναι κενή",
- "details": "Λεπτομέρειες",
- "widgets-bundle-details": "Λεπτομέρειες δέσμης Widgets",
- "delete-widgets-bundle-title": "Είστε σίγουροι ότι θέλετε να διαγράψετε τη δέσμη Widgets '{{widgetsBundleTitle}}';",
- "delete-widgets-bundle-text": "Προσοχή, μετά την επιβεβαίωση η δέσμη Widget και όλα τα σχετικά δεδομένα θα διαγραφούν οριστικά.",
- "delete-widgets-bundles-title": "Είστε σίγουροι ότι θέλετε να διαγράψετε { count, plural, 1 {1 widgets bundle} other {# widgets bundles} };",
- "delete-widgets-bundles-action-title": "Διαγραφή { count, plural, 1 {1 widgets bundle} other {# widgets bundles} }",
- "delete-widgets-bundles-text": "Προσοχή, μετά την επιβεβαίωση όλες οι επιλεγμένες δέσμες Widget και όλα τα σχετικά δεδομένα θα διαγραφούν οριστικά.",
- "no-widgets-bundles-matching": "Δεν βρέθηκαν δέσμες Widgets που να ταιριάζουν'{{widgetsBundle}}'.",
- "widgets-bundle-required": "Απαιτείται δέσμη Widgets.",
- "system": "Σύστημα",
- "import": "Εισαγωγή δέσμης Widgets",
- "export": "Εξαγωγή δέσμης Widgets",
- "export-failed-error": "Δεν είναι δυνατή η εξαγωγή δέσμης Widgets: {{error}}",
- "create-new-widgets-bundle": "Δημιουργία νέας δέσμης Widgets",
- "widgets-bundle-file": "Αρχείο δέσμης Widgets",
- "invalid-widgets-bundle-file-error": "Δεν είναι δυνατή η εισαγωγή δέσμης Widgets: Μη έγκυρη δομή δεδομένων Widgets."
- },
- "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": "Στυλ Widget",
- "title-style": "Στυλ τίτλου",
- "mobile-mode-settings": "Ρυθμίσεις λειτουργίας κινητού",
- "order": "Εντολή",
- "height": "Ύψος",
- "units": "Ειδικό σύμβολο για εμφάνιση δίπλα στην αξία",
- "decimals": "Αριθμός ψηφίων μετά το κυμαινόμενο σημείο",
- "timewindow": "Timewindow",
- "use-dashboard-timewindow": "Χρήση dashboard timewindow",
- "display-timewindow": "Απεικόνιση timewindow",
- "display-legend": "Απεικόνιση λεζάντας",
- "datasources": "Πηγές δεδομένων",
- "maximum-datasources": "Το μέγιστο { count, plural, 1 {1 datasource is allowed.} other {# datasources are allowed} }",
- "datasource-type": "Τύπος",
- "datasource-parameters": "Παράμετροι",
- "remove-datasource": "Κατάργηση της πηγής δεδομένων",
- "add-datasource": "Προσθήκη πηγής δεδομένων",
- "target-device": "Target device",
- "alarm-source": "Πηγή Alarm",
- "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": "Διαγραφή ενέργειας Widget",
- "delete-action-text": "Είστε σίγουροι ότι θέλετε να διαγράψετε δράση widget με όνομα '{{actionName}}';"
- },
- "widget-type": {
- "import": "Εισαγωγή τύπου Widget",
- "export": "Εξαγωγή τύπου Widget",
- "export-failed-error": "Δεν είναι δυνατή η εξαγωγή τύπου Widget: {{error}}",
- "create-new-widget-type": "Δημιουργία νέου τύπου Widget",
- "widget-type-file": "Αρχείο τύπου Widget",
- "invalid-widget-type-file-error": "Δεν είναι δυνατή η εισαγωγή τύπου Widget: Μη έγκυρη δομή δεδομένων τύπου Widget."
- },
- "self-registration": {
- "self-registration": "Αυτόματη εγγραφή",
- "self-registration-url": "Αυτόματη εγγραφή URL",
- "captcha-site-key": "reCAPTCHA κλειδί ιστότοπου",
- "captcha-secret-key": "reCAPTCHA μυστικό κλειδί",
- "notification-email": "Εmail γνωστοποίησης",
- "privacy-policy-text": "Κείμενο πολιτικής απορρήτου",
- "text-message-page": "Μήνυμα κειμένου για τη σελίδα εγγραφής"
- },
- "white-labeling": {
- "white-labeling": "Εμφάνιση",
- "login-white-labeling": "Εμφάνιση Σύδεσης",
- "preview": "Προεπισκόπηση",
- "app-title": "Τίτλος εφαρμογής",
- "favicon": "Εικονίδιο Ιστότοπου",
- "favicon-description": "Εικόνα *.ico, *.gif or *.png με μέγιστο μέγεθος {{kbSize}} KBytes.",
- "favicon-size-error": "Η εικόνα ιστότοπου είναι πολύ μεγάλη. Μέγιστο επιτρεπόμενο μέγεθος {{kbSize}} KBytes.",
- "favicon-type-error": "Μη έγκυρη μορφή αρχείου εικόνας ιστότοπου. Μόνο εικόνες ICO, GIF ή PNG γίνονται αποδεκτές.",
- "drop-favicon-image": "Σύρετε ένα εικονίδιο ιστότοπου ή κάντε κλικ για να επιλέξετε ένα αρχείο για μεταφόρτωση.",
- "no-favicon-image": "Δεν έχει επιλεχθεί εικονίδιο",
- "logo": "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": "Όνομα Domain",
- "help-link-base-url": "Base url για συνδέσμους βοηθείας",
- "enable-help-links": "Ενεργοποίηση συνδέσμων βοηθείας",
- "error-verification-url": "Ένα όνομα domain δεν πρέπει να περιέχει σύμβολα '/' και ':'. Παράδειγμα: gprs.cloud",
- "show-platform-name-version": "Εμφάνιση ονόματος και έκδοσης πλατφόρμας",
- "platform-name": "Όνομα πλατφόρμας",
- "platform-version": "Έκδοση πλατφόρμας",
- "version-mask": "{{name}} v.{{verion}}",
- "position": {
- "label": "Όνομα πλατφόρμας και θέση έκδοσης",
- "under-logo": "Κάτω από το λογότυπο",
- "bottom": "Στο κάτω μέρος της φόρμας σύνδεσης"
- }
- },
- "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": "Επιλογή εικονιδίου ",
- "material-icons": "Υλικά εικονίδια",
- "show-all": "Προβολή όλων των εικονιδίων"
- },
- "subscription": {
- "entity-limit-text": "Ωστόσο, μπορείτε να αναβαθμίσετε το πρόγραμμα εγγραφής σας για να αυξήσετε τα όριά σας.",
- "upgrade-your-plan": "Αναβάθμιση του σχεδίου συνδρομής",
- "white-labeling-feature": "Εμφάνιση χαρακτηριστικού",
- "white-labeling-text-full": "Αλλάξτε το διακριτικό τίτλο της πλατφόρμας με το λογότυπο της εταιρείας ή του προϊόντος σας και το συνδυασμό χρωμάτων σε 2 λεπτά.
Αφαιρέστε το \"Powered By\" στο κάτω μέρος του dashboard.
Δεν απαιτείται κώδικας ή επανεκκίνηση υπηρεσίας. Επιτρέψτε και στους πελάτες σας να αλλάξουν το περιβάλλον τους.",
- "enable-white-labeling": "Ενεργοποίηση εμφάνισης χαρακτηριστικού τώρα αναβαθμίζοντας το σχέδιο εγγραφής σας!",
- "read-more": "Διαβάστε περισσότερα",
- "white-labeling-video-text": "Δείτε το εκπαιδευτικό βίντεο παρακάτω για να δείτε πώς λειτουργεί αυτό το χαρακτηριστικό!"
- },
- "subscription-error": {
- "title": "Παραβίαση συνδρομής",
- "warning-title": "Προειδοποίηση συνδρομής",
- "limit-reached": {
- "device-count": "Έχετε φτάσει τις μέγιστες συσκευές ({{value}}) που επιτρέπονται από το πρόγραμμα εγγραφής σας!",
- "asset-count": "Έχετε φτάσει τα μέγιστα assets ({{value}}) που επιτρέπονται από το πρόγραμμα εγγραφής σας!"
- },
- "feature-disabled": {
- "white-labeling": "Η εμφάνιση χαρακτηριστικού δεν επιτρέπεται από το σχέδιο εγγραφής σας!"
- }
- },
- "custom": {
- "widget-action": {
- "action-cell-button": "Κουμπί ενέργειας κελιών",
- "row-click": "Κλικ στη σειρά",
- "polygon-click": "Κλικ στο πολύγωνο",
- "marker-click": "Κλικ στο δείκτη",
- "tooltip-tag-action": "Ετικέτα εργαλείου ενέργειας",
- "node-selected": "Στον επιλεγμένο κόμβο",
- "element-click": "Κλικ στο στοιχείο HTML"
- }
- },
- "language": {
- }
-}
diff --git a/ui/src/app/locale/locale.constant-en_US.json b/ui/src/app/locale/locale.constant-en_US.json
deleted file mode 100644
index 933f58887e..0000000000
--- a/ui/src/app/locale/locale.constant-en_US.json
+++ /dev/null
@@ -1,1916 +0,0 @@
-{
- "access": {
- "unauthorized": "Unauthorized",
- "unauthorized-access": "Unauthorized Access",
- "unauthorized-access-text": "You should sign in to have access to this resource!",
- "access-forbidden": "Access Forbidden",
- "access-forbidden-text": "You haven't access rights to this location!
Try to sign in with different user if you still wish to gain access to this location.",
- "refresh-token-expired": "Session has expired",
- "refresh-token-failed": "Unable to refresh session"
- },
- "action": {
- "activate": "Activate",
- "suspend": "Suspend",
- "save": "Save",
- "saveAs": "Save as",
- "cancel": "Cancel",
- "ok": "OK",
- "delete": "Delete",
- "add": "Add",
- "yes": "Yes",
- "no": "No",
- "update": "Update",
- "remove": "Remove",
- "search": "Search",
- "clear-search": "Clear search",
- "assign": "Assign",
- "unassign": "Unassign",
- "share": "Share",
- "make-private": "Make private",
- "apply": "Apply",
- "apply-changes": "Apply changes",
- "edit-mode": "Edit mode",
- "enter-edit-mode": "Enter edit mode",
- "decline-changes": "Decline changes",
- "close": "Close",
- "back": "Back",
- "run": "Run",
- "sign-in": "Sign in!",
- "edit": "Edit",
- "view": "View",
- "create": "Create",
- "drag": "Drag",
- "refresh": "Refresh",
- "undo": "Undo",
- "copy": "Copy",
- "paste": "Paste",
- "copy-reference": "Copy reference",
- "paste-reference": "Paste reference",
- "import": "Import",
- "export": "Export",
- "share-via": "Share via {{provider}}",
- "continue": "Continue",
- "discard-changes": "Discard Changes",
- "download": "Download"
- },
- "aggregation": {
- "aggregation": "Aggregation",
- "function": "Data aggregation function",
- "limit": "Max values",
- "group-interval": "Grouping interval",
- "min": "Min",
- "max": "Max",
- "avg": "Average",
- "sum": "Sum",
- "count": "Count",
- "none": "None"
- },
- "admin": {
- "general": "General",
- "general-settings": "General Settings",
- "outgoing-mail": "Mail Server",
- "outgoing-mail-settings": "Outgoing Mail Server Settings",
- "system-settings": "System Settings",
- "test-mail-sent": "Test mail was successfully sent!",
- "base-url": "Base URL",
- "base-url-required": "Base URL is required.",
- "mail-from": "Mail From",
- "mail-from-required": "Mail From is required.",
- "smtp-protocol": "SMTP 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-invalid": "That doesn't look like a valid smtp port.",
- "timeout-msec": "Timeout (msec)",
- "timeout-required": "Timeout is required.",
- "timeout-invalid": "That doesn't look like a valid timeout.",
- "enable-tls": "Enable TLS",
- "tls-version": "TLS version",
- "send-test-mail": "Send test mail",
- "security-settings": "Security settings",
- "password-policy": "Password policy",
- "minimum-password-length": "Minimum password length",
- "minimum-password-length-required": "Minimum password length is required",
- "minimum-password-length-range": "Minimum password length should be in a range from 5 to 50",
- "minimum-uppercase-letters": "Minimum number of uppercase letters",
- "minimum-uppercase-letters-range": "Minimum number of uppercase letters can't be negative",
- "minimum-lowercase-letters": "Minimum number of lowercase letters",
- "minimum-lowercase-letters-range": "Minimum number of lowercase letters can't be negative",
- "minimum-digits": "Minimum number of digits",
- "minimum-digits-range": "Minimum number of digits can't be negative",
- "minimum-special-characters": "Minimum number of special characters",
- "minimum-special-characters-range": "Minimum number of special characters can't be negative",
- "password-expiration-period-days": "Password expiration period in days",
- "password-expiration-period-days-range": "Password expiration period in days can't be negative",
- "password-reuse-frequency-days": "Password reuse frequency in days",
- "password-reuse-frequency-days-range": "Password reuse frequency in days can't be negative",
- "general-policy": "General policy",
- "max-failed-login-attempts": "Maximum number of failed login attempts, before account is locked",
- "minimum-max-failed-login-attempts-range": "Maximum number of failed login attempts can't be negative",
- "user-lockout-notification-email": "In case user account lockout, send notification to email"
- },
- "alarm": {
- "alarm": "Alarm",
- "alarms": "Alarms",
- "select-alarm": "Select alarm",
- "no-alarms-matching": "No alarms matching '{{entity}}' were found.",
- "alarm-required": "Alarm is required",
- "alarm-status": "Alarm status",
- "search-status": {
- "ANY": "Any",
- "ACTIVE": "Active",
- "CLEARED": "Cleared",
- "ACK": "Acknowledged",
- "UNACK": "Unacknowledged"
- },
- "display-status": {
- "ACTIVE_UNACK": "Active Unacknowledged",
- "ACTIVE_ACK": "Active Acknowledged",
- "CLEARED_UNACK": "Cleared Unacknowledged",
- "CLEARED_ACK": "Cleared Acknowledged"
- },
- "no-alarms-prompt": "No alarms found",
- "created-time": "Created time",
- "type": "Type",
- "severity": "Severity",
- "originator": "Originator",
- "originator-type": "Originator type",
- "details": "Details",
- "status": "Status",
- "alarm-details": "Alarm details",
- "start-time": "Start time",
- "end-time": "End time",
- "ack-time": "Acknowledged time",
- "clear-time": "Cleared time",
- "severity-critical": "Critical",
- "severity-major": "Major",
- "severity-minor": "Minor",
- "severity-warning": "Warning",
- "severity-indeterminate": "Indeterminate",
- "acknowledge": "Acknowledge",
- "clear": "Clear",
- "search": "Search alarms",
- "selected-alarms": "{ count, plural, 1 {1 alarm} other {# alarms} } selected",
- "no-data": "No data to display",
- "polling-interval": "Alarms polling interval (sec)",
- "polling-interval-required": "Alarms polling interval is required.",
- "min-polling-interval-message": "At least 1 sec polling interval is allowed.",
- "aknowledge-alarms-title": "Acknowledge { count, plural, 1 {1 alarm} other {# alarms} }",
- "aknowledge-alarms-text": "Are you sure you want to acknowledge { count, plural, 1 {1 alarm} other {# alarms} }?",
- "aknowledge-alarm-title": "Acknowledge Alarm",
- "aknowledge-alarm-text": "Are you sure you want to acknowledge Alarm?",
- "clear-alarms-title": "Clear { count, plural, 1 {1 alarm} other {# alarms} }",
- "clear-alarms-text": "Are you sure you want to clear { count, plural, 1 {1 alarm} other {# alarms} }?",
- "clear-alarm-title": "Clear Alarm",
- "clear-alarm-text": "Are you sure you want to clear Alarm?",
- "alarm-status-filter": "Alarm Status Filter",
- "max-count-load": "Maximum number of alarms to load (0 - unlimited)",
- "max-count-load-required": "Maximum number of alarms to load is required.",
- "max-count-load-error-min": "Minimum value is 0.",
- "fetch-size": "Fetch size",
- "fetch-size-required": "Fetch size is required.",
- "fetch-size-error-min": "Minimum value is 10."
- },
- "alias": {
- "add": "Add alias",
- "edit": "Edit alias",
- "name": "Alias name",
- "name-required": "Alias name is required",
- "duplicate-alias": "Alias with same name is already exists.",
- "filter-type-single-entity": "Single entity",
- "filter-type-entity-list": "Entity list",
- "filter-type-entity-name": "Entity name",
- "filter-type-state-entity": "Entity from dashboard state",
- "filter-type-state-entity-description": "Entity taken from dashboard state parameters",
- "filter-type-asset-type": "Asset type",
- "filter-type-asset-type-description": "Assets of type '{{assetType}}'",
- "filter-type-asset-type-and-name-description": "Assets of type '{{assetType}}' and with name starting with '{{prefix}}'",
- "filter-type-device-type": "Device type",
- "filter-type-device-type-description": "Devices of type '{{deviceType}}'",
- "filter-type-device-type-and-name-description": "Devices of type '{{deviceType}}' and with name starting with '{{prefix}}'",
- "filter-type-entity-view-type": "Entity View type",
- "filter-type-entity-view-type-description": "Entity Views of type '{{entityView}}'",
- "filter-type-entity-view-type-and-name-description": "Entity Views of type '{{entityView}}' and with name starting with '{{prefix}}'",
- "filter-type-relations-query": "Relations query",
- "filter-type-relations-query-description": "{{entities}} that have {{relationType}} relation {{direction}} {{rootEntity}}",
- "filter-type-asset-search-query": "Asset search query",
- "filter-type-asset-search-query-description": "Assets with types {{assetTypes}} that have {{relationType}} relation {{direction}} {{rootEntity}}",
- "filter-type-device-search-query": "Device search query",
- "filter-type-device-search-query-description": "Devices with types {{deviceTypes}} that have {{relationType}} relation {{direction}} {{rootEntity}}",
- "filter-type-entity-view-search-query": "Entity view search query",
- "filter-type-entity-view-search-query-description": "Entity views with types {{entityViewTypes}} that have {{relationType}} relation {{direction}} {{rootEntity}}",
- "entity-filter": "Entity filter",
- "resolve-multiple": "Resolve as multiple entities",
- "filter-type": "Filter type",
- "filter-type-required": "Filter type is required.",
- "entity-filter-no-entity-matched": "No entities matching specified filter were found.",
- "no-entity-filter-specified": "No entity filter specified",
- "root-state-entity": "Use dashboard state entity as root",
- "last-level-relation": "Fetch last level relation only",
- "root-entity": "Root entity",
- "state-entity-parameter-name": "State entity parameter name",
- "default-state-entity": "Default state entity",
- "default-entity-parameter-name": "By default",
- "max-relation-level": "Max relation level",
- "unlimited-level": "Unlimited level",
- "state-entity": "Dashboard state entity",
- "all-entities": "All entities",
- "any-relation": "any"
- },
- "asset": {
- "asset": "Asset",
- "assets": "Assets",
- "management": "Asset management",
- "view-assets": "View Assets",
- "add": "Add Asset",
- "assign-to-customer": "Assign to customer",
- "assign-asset-to-customer": "Assign Asset(s) To Customer",
- "assign-asset-to-customer-text": "Please select the assets to assign to the customer",
- "no-assets-text": "No assets found",
- "assign-to-customer-text": "Please select the customer to assign the asset(s)",
- "public": "Public",
- "assignedToCustomer": "Assigned to customer",
- "make-public": "Make asset public",
- "make-private": "Make asset private",
- "unassign-from-customer": "Unassign from customer",
- "delete": "Delete asset",
- "asset-public": "Asset is public",
- "asset-type": "Asset type",
- "asset-type-required": "Asset type is required.",
- "select-asset-type": "Select asset type",
- "enter-asset-type": "Enter asset type",
- "any-asset": "Any asset",
- "no-asset-types-matching": "No asset types matching '{{entitySubtype}}' were found.",
- "asset-type-list-empty": "No asset types selected.",
- "asset-types": "Asset types",
- "name": "Name",
- "name-required": "Name is required.",
- "description": "Description",
- "type": "Type",
- "type-required": "Type is required.",
- "details": "Details",
- "events": "Events",
- "add-asset-text": "Add new asset",
- "asset-details": "Asset details",
- "assign-assets": "Assign assets",
- "assign-assets-text": "Assign { count, plural, 1 {1 asset} other {# assets} } to customer",
- "delete-assets": "Delete assets",
- "unassign-assets": "Unassign assets",
- "unassign-assets-action-title": "Unassign { count, plural, 1 {1 asset} other {# assets} } from customer",
- "assign-new-asset": "Assign new asset",
- "delete-asset-title": "Are you sure you want to delete the asset '{{assetName}}'?",
- "delete-asset-text": "Be careful, after the confirmation the asset and all related data will become unrecoverable.",
- "delete-assets-title": "Are you sure you want to delete { count, plural, 1 {1 asset} other {# assets} }?",
- "delete-assets-action-title": "Delete { count, plural, 1 {1 asset} other {# assets} }",
- "delete-assets-text": "Be careful, after the confirmation all selected assets will be removed and all related data will become unrecoverable.",
- "make-public-asset-title": "Are you sure you want to make the asset '{{assetName}}' public?",
- "make-public-asset-text": "After the confirmation the asset and all its data will be made public and accessible by others.",
- "make-private-asset-title": "Are you sure you want to make the asset '{{assetName}}' private?",
- "make-private-asset-text": "After the confirmation the asset and all its data will be made private and won't be accessible by others.",
- "unassign-asset-title": "Are you sure you want to unassign the asset '{{assetName}}'?",
- "unassign-asset-text": "After the confirmation the asset will be unassigned and won't be accessible by the customer.",
- "unassign-asset": "Unassign asset",
- "unassign-assets-title": "Are you sure you want to unassign { count, plural, 1 {1 asset} other {# assets} }?",
- "unassign-assets-text": "After the confirmation all selected assets will be unassigned and won't be accessible by the customer.",
- "copyId": "Copy asset Id",
- "idCopiedMessage": "Asset Id has been copied to clipboard",
- "select-asset": "Select asset",
- "no-assets-matching": "No assets matching '{{entity}}' were found.",
- "asset-required": "Asset is required",
- "name-starts-with": "Asset name starts with",
- "import": "Import assets",
- "asset-file": "Asset file",
- "label": "Label"
- },
- "attribute": {
- "attributes": "Attributes",
- "latest-telemetry": "Latest telemetry",
- "attributes-scope": "Entity attributes scope",
- "scope-latest-telemetry": "Latest telemetry",
- "scope-client": "Client attributes",
- "scope-server": "Server attributes",
- "scope-shared": "Shared attributes",
- "add": "Add attribute",
- "key": "Key",
- "last-update-time": "Last update time",
- "key-required": "Attribute key is required.",
- "value": "Value",
- "value-required": "Attribute value is required.",
- "delete-attributes-title": "Are you sure you want to delete { count, plural, 1 {1 attribute} other {# attributes} }?",
- "delete-attributes-text": "Be careful, after the confirmation all selected attributes will be removed.",
- "delete-attributes": "Delete attributes",
- "enter-attribute-value": "Enter attribute value",
- "show-on-widget": "Show on widget",
- "widget-mode": "Widget mode",
- "next-widget": "Next widget",
- "prev-widget": "Previous widget",
- "add-to-dashboard": "Add to dashboard",
- "add-widget-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",
- "audit-logs": "Audit Logs",
- "timestamp": "Timestamp",
- "entity-type": "Entity Type",
- "entity-name": "Entity Name",
- "user": "User",
- "type": "Type",
- "status": "Status",
- "details": "Details",
- "type-added": "Added",
- "type-deleted": "Deleted",
- "type-updated": "Updated",
- "type-attributes-updated": "Attributes updated",
- "type-attributes-deleted": "Attributes deleted",
- "type-rpc-call": "RPC call",
- "type-credentials-updated": "Credentials updated",
- "type-assigned-to-customer": "Assigned to Customer",
- "type-unassigned-from-customer": "Unassigned from Customer",
- "type-activated": "Activated",
- "type-suspended": "Suspended",
- "type-credentials-read": "Credentials read",
- "type-attributes-read": "Attributes read",
- "type-relation-add-or-update": "Relation updated",
- "type-relation-delete": "Relation deleted",
- "type-relations-delete": "All relation deleted",
- "type-alarm-ack": "Acknowledged",
- "type-alarm-clear": "Cleared",
- "type-login": "Login",
- "type-logout": "Logout",
- "type-lockout": "Lockout",
- "status-success": "Success",
- "status-failure": "Failure",
- "audit-log-details": "Audit log details",
- "no-audit-logs-prompt": "No logs found",
- "action-data": "Action data",
- "failure-details": "Failure details",
- "search": "Search audit logs",
- "clear-search": "Clear search"
- },
- "confirm-on-exit": {
- "message": "You have unsaved changes. Are you sure you want to leave this page?",
- "html-message": "You have unsaved changes.
Are you sure you want to leave this page?",
- "title": "Unsaved changes"
- },
- "contact": {
- "country": "Country",
- "city": "City",
- "state": "State / Province",
- "postal-code": "Zip / Postal Code",
- "postal-code-invalid": "Invalid Zip / Postal Code format.",
- "address": "Address",
- "address2": "Address 2",
- "phone": "Phone",
- "email": "Email",
- "no-address": "No address"
- },
- "common": {
- "username": "Username",
- "password": "Password",
- "enter-username": "Enter username",
- "enter-password": "Enter password",
- "enter-search": "Enter search"
- },
- "content-type": {
- "json": "Json",
- "text": "Text",
- "binary": "Binary (Base64)"
- },
- "customer": {
- "customer": "Customer",
- "customers": "Customers",
- "management": "Customer management",
- "dashboard": "Customer Dashboard",
- "dashboards": "Customer Dashboards",
- "devices": "Customer Devices",
- "entity-views": "Customer Entity Views",
- "assets": "Customer Assets",
- "public-dashboards": "Public Dashboards",
- "public-devices": "Public Devices",
- "public-assets": "Public Assets",
- "public-entity-views": "Public Entity Views",
- "add": "Add Customer",
- "delete": "Delete customer",
- "manage-customer-users": "Manage customer users",
- "manage-customer-devices": "Manage customer devices",
- "manage-customer-dashboards": "Manage customer dashboards",
- "manage-public-devices": "Manage public devices",
- "manage-public-dashboards": "Manage public dashboards",
- "manage-customer-assets": "Manage customer assets",
- "manage-public-assets": "Manage public assets",
- "add-customer-text": "Add new customer",
- "no-customers-text": "No customers found",
- "customer-details": "Customer details",
- "delete-customer-title": "Are you sure you want to delete the customer '{{customerTitle}}'?",
- "delete-customer-text": "Be careful, after the confirmation the customer and all related data will become unrecoverable.",
- "delete-customers-title": "Are you sure you want to delete { count, plural, 1 {1 customer} other {# customers} }?",
- "delete-customers-action-title": "Delete { count, plural, 1 {1 customer} other {# customers} }",
- "delete-customers-text": "Be careful, after the confirmation all selected customers will be removed and all related data will become unrecoverable.",
- "manage-users": "Manage users",
- "manage-assets": "Manage assets",
- "manage-devices": "Manage devices",
- "manage-dashboards": "Manage dashboards",
- "title": "Title",
- "title-required": "Title is required.",
- "description": "Description",
- "details": "Details",
- "events": "Events",
- "copyId": "Copy customer Id",
- "idCopiedMessage": "Customer Id has been copied to clipboard",
- "select-customer": "Select customer",
- "no-customers-matching": "No customers matching '{{entity}}' were found.",
- "customer-required": "Customer is required",
- "select-default-customer": "Select default customer",
- "default-customer": "Default customer",
- "default-customer-required": "Default customer is required in order to debug dashboard on Tenant level"
- },
- "datetime": {
- "date-from": "Date from",
- "time-from": "Time from",
- "date-to": "Date to",
- "time-to": "Time to"
- },
- "dashboard": {
- "dashboard": "Dashboard",
- "dashboards": "Dashboards",
- "management": "Dashboard management",
- "view-dashboards": "View Dashboards",
- "add": "Add Dashboard",
- "assign-dashboard-to-customer": "Assign Dashboard(s) To Customer",
- "assign-dashboard-to-customer-text": "Please select the dashboards to assign to the customer",
- "assign-to-customer-text": "Please select the customer to assign the dashboard(s)",
- "assign-to-customer": "Assign to customer",
- "unassign-from-customer": "Unassign from customer",
- "make-public": "Make dashboard public",
- "make-private": "Make dashboard private",
- "manage-assigned-customers": "Manage assigned customers",
- "assigned-customers": "Assigned customers",
- "assign-to-customers": "Assign Dashboard(s) To Customers",
- "assign-to-customers-text": "Please select the customers to assign the dashboard(s)",
- "unassign-from-customers": "Unassign Dashboard(s) From Customers",
- "unassign-from-customers-text": "Please select the customers to unassign from the dashboard(s)",
- "no-dashboards-text": "No dashboards found",
- "no-widgets": "No widgets configured",
- "add-widget": "Add new widget",
- "title": "Title",
- "select-widget-title": "Select widget",
- "select-widget-subtitle": "List of available widget types",
- "delete": "Delete dashboard",
- "title-required": "Title is required.",
- "description": "Description",
- "details": "Details",
- "dashboard-details": "Dashboard details",
- "add-dashboard-text": "Add new dashboard",
- "assign-dashboards": "Assign dashboards",
- "assign-new-dashboard": "Assign new dashboard",
- "assign-dashboards-text": "Assign { count, plural, 1 {1 dashboard} other {# dashboards} } to customers",
- "unassign-dashboards-action-text": "Unassign { count, plural, 1 {1 dashboard} other {# dashboards} } from customers",
- "delete-dashboards": "Delete dashboards",
- "unassign-dashboards": "Unassign dashboards",
- "unassign-dashboards-action-title": "Unassign { count, plural, 1 {1 dashboard} other {# dashboards} } from customer",
- "delete-dashboard-title": "Are you sure you want to delete the dashboard '{{dashboardTitle}}'?",
- "delete-dashboard-text": "Be careful, after the confirmation the dashboard and all related data will become unrecoverable.",
- "delete-dashboards-title": "Are you sure you want to delete { count, plural, 1 {1 dashboard} other {# dashboards} }?",
- "delete-dashboards-action-title": "Delete { count, plural, 1 {1 dashboard} other {# dashboards} }",
- "delete-dashboards-text": "Be careful, after the confirmation all selected dashboards will be removed and all related data will become unrecoverable.",
- "unassign-dashboard-title": "Are you sure you want to unassign the dashboard '{{dashboardTitle}}'?",
- "unassign-dashboard-text": "After the confirmation the dashboard will be unassigned and won't be accessible by the customer.",
- "unassign-dashboard": "Unassign dashboard",
- "unassign-dashboards-title": "Are you sure you want to unassign { count, plural, 1 {1 dashboard} other {# dashboards} }?",
- "unassign-dashboards-text": "After the confirmation all selected dashboards will be unassigned and won't be accessible by the customer.",
- "public-dashboard-title": "Dashboard is now public",
- "public-dashboard-text": "Your dashboard {{dashboardTitle}} is now public and accessible via next public link:",
- "public-dashboard-notice": "Note: Do not forget to make related devices public in order to access their data.",
- "make-private-dashboard-title": "Are you sure you want to make the dashboard '{{dashboardTitle}}' private?",
- "make-private-dashboard-text": "After the confirmation the dashboard will be made private and won't be accessible by others.",
- "make-private-dashboard": "Make dashboard private",
- "socialshare-text": "'{{dashboardTitle}}' powered by ThingsBoard",
- "socialshare-title": "'{{dashboardTitle}}' powered by ThingsBoard",
- "select-dashboard": "Select dashboard",
- "no-dashboards-matching": "No dashboards matching '{{entity}}' were found.",
- "dashboard-required": "Dashboard is required.",
- "select-existing": "Select existing dashboard",
- "create-new": "Create new dashboard",
- "new-dashboard-title": "New dashboard title",
- "open-dashboard": "Open dashboard",
- "set-background": "Set background",
- "background-color": "Background color",
- "background-image": "Background image",
- "background-size-mode": "Background size mode",
- "no-image": "No image selected",
- "drop-image": "Drop an image or click to select a file to upload.",
- "settings": "Settings",
- "columns-count": "Columns count",
- "columns-count-required": "Columns count is required.",
- "min-columns-count-message": "Only 10 minimum column count is allowed.",
- "max-columns-count-message": "Only 1000 maximum column count is allowed.",
- "widgets-margins": "Margin between widgets",
- "horizontal-margin": "Horizontal margin",
- "horizontal-margin-required": "Horizontal margin value is required.",
- "min-horizontal-margin-message": "Only 0 is allowed as minimum horizontal margin value.",
- "max-horizontal-margin-message": "Only 50 is allowed as maximum horizontal margin value.",
- "vertical-margin": "Vertical margin",
- "vertical-margin-required": "Vertical margin value is required.",
- "min-vertical-margin-message": "Only 0 is allowed as minimum vertical margin value.",
- "max-vertical-margin-message": "Only 50 is allowed as maximum vertical margin value.",
- "autofill-height": "Auto fill layout height",
- "mobile-layout": "Mobile layout settings",
- "mobile-row-height": "Mobile row height, px",
- "mobile-row-height-required": "Mobile row height value is required.",
- "min-mobile-row-height-message": "Only 5 pixels is allowed as minimum mobile row height value.",
- "max-mobile-row-height-message": "Only 200 pixels is allowed as maximum mobile row height value.",
- "display-title": "Display dashboard title",
- "toolbar-always-open": "Keep toolbar opened",
- "title-color": "Title color",
- "display-dashboards-selection": "Display dashboards selection",
- "display-entities-selection": "Display entities selection",
- "display-dashboard-timewindow": "Display timewindow",
- "display-dashboard-export": "Display export",
- "import": "Import dashboard",
- "export": "Export dashboard",
- "export-failed-error": "Unable to export dashboard: {{error}}",
- "create-new-dashboard": "Create new dashboard",
- "dashboard-file": "Dashboard file",
- "invalid-dashboard-file-error": "Unable to import dashboard: Invalid dashboard data structure.",
- "dashboard-import-missing-aliases-title": "Configure aliases used by imported dashboard",
- "create-new-widget": "Create new widget",
- "import-widget": "Import widget",
- "widget-file": "Widget file",
- "invalid-widget-file-error": "Unable to import widget: Invalid widget data structure.",
- "widget-import-missing-aliases-title": "Configure aliases used by imported widget",
- "open-toolbar": "Open dashboard toolbar",
- "close-toolbar": "Close toolbar",
- "configuration-error": "Configuration error",
- "alias-resolution-error-title": "Dashboard aliases configuration error",
- "invalid-aliases-config": "Unable to find any devices matching to some of the aliases filter.
Please contact your administrator in order to resolve this issue.",
- "select-devices": "Select devices",
- "assignedToCustomer": "Assigned to customer",
- "assignedToCustomers": "Assigned to customers",
- "public": "Public",
- "public-link": "Public link",
- "copy-public-link": "Copy public link",
- "public-link-copied-message": "Dashboard public link has been copied to clipboard",
- "manage-states": "Manage dashboard states",
- "states": "Dashboard states",
- "search-states": "Search dashboard states",
- "selected-states": "{ count, plural, 1 {1 dashboard state} other {# dashboard states} } selected",
- "edit-state": "Edit dashboard state",
- "delete-state": "Delete dashboard state",
- "add-state": "Add dashboard state",
- "state": "Dashboard state",
- "state-name": "Name",
- "state-name-required": "Dashboard state name is required.",
- "state-id": "State Id",
- "state-id-required": "Dashboard state id is required.",
- "state-id-exists": "Dashboard state with the same id is already exists.",
- "is-root-state": "Root state",
- "delete-state-title": "Delete dashboard state",
- "delete-state-text": "Are you sure you want delete dashboard state with name '{{stateName}}'?",
- "show-details": "Show details",
- "hide-details": "Hide details",
- "select-state": "Select target state",
- "state-controller": "State controller"
- },
- "datakey": {
- "settings": "Settings",
- "advanced": "Advanced",
- "label": "Label",
- "color": "Color",
- "units": "Special symbol to show next to value",
- "decimals": "Number of digits after floating point",
- "data-generation-func": "Data generation function",
- "use-data-post-processing-func": "Use data post-processing function",
- "configuration": "Data key configuration",
- "timeseries": "Timeseries",
- "attributes": "Attributes",
- "entity-field": "Entity field",
- "alarm": "Alarm fields",
- "timeseries-required": "Entity timeseries are required.",
- "timeseries-or-attributes-required": "Entity timeseries/attributes are required.",
- "maximum-timeseries-or-attributes": "Maximum { count, plural, 1 {1 timeseries/attribute is allowed.} other {# timeseries/attributes are allowed} }",
- "alarm-fields-required": "Alarm fields are required.",
- "function-types": "Function types",
- "function-types-required": "Function types are required.",
- "maximum-function-types": "Maximum { count, plural, 1 {1 function type is allowed.} other {# function types are allowed} }",
- "time-description": "timestamp of the current value;",
- "value-description": "the current value;",
- "prev-value-description": "result of the previous function call;",
- "time-prev-description": "timestamp of the previous value;",
- "prev-orig-value-description": "original previous value;"
- },
- "datasource": {
- "type": "Datasource type",
- "name": "Name",
- "add-datasource-prompt": "Please add datasource"
- },
- "details": {
- "edit-mode": "Edit mode",
- "edit-json": "Edit JSON",
- "toggle-edit-mode": "Toggle edit mode"
- },
- "device": {
- "device": "Device",
- "device-required": "Device is required.",
- "devices": "Devices",
- "management": "Device management",
- "view-devices": "View Devices",
- "device-alias": "Device alias",
- "aliases": "Device aliases",
- "no-alias-matching": "'{{alias}}' not found.",
- "no-aliases-found": "No aliases found.",
- "no-key-matching": "'{{key}}' not found.",
- "no-keys-found": "No keys found.",
- "create-new-alias": "Create a new one!",
- "create-new-key": "Create a new one!",
- "duplicate-alias-error": "Duplicate alias found '{{alias}}'.
Device aliases must be unique whithin the dashboard.",
- "configure-alias": "Configure '{{alias}}' alias",
- "no-devices-matching": "No devices matching '{{entity}}' were found.",
- "alias": "Alias",
- "alias-required": "Device alias is required.",
- "remove-alias": "Remove device alias",
- "add-alias": "Add device alias",
- "name-starts-with": "Device name starts with",
- "device-list": "Device list",
- "use-device-name-filter": "Use filter",
- "device-list-empty": "No devices selected.",
- "device-name-filter-required": "Device name filter is required.",
- "device-name-filter-no-device-matched": "No devices starting with '{{device}}' were found.",
- "add": "Add Device",
- "assign-to-customer": "Assign to customer",
- "assign-device-to-customer": "Assign Device(s) To Customer",
- "assign-device-to-customer-text": "Please select the devices to assign to the customer",
- "make-public": "Make device public",
- "make-private": "Make device private",
- "no-devices-text": "No devices found",
- "assign-to-customer-text": "Please select the customer to assign the device(s)",
- "device-details": "Device details",
- "add-device-text": "Add new device",
- "credentials": "Credentials",
- "manage-credentials": "Manage credentials",
- "delete": "Delete device",
- "assign-devices": "Assign devices",
- "assign-devices-text": "Assign { count, plural, 1 {1 device} other {# devices} } to customer",
- "delete-devices": "Delete devices",
- "unassign-from-customer": "Unassign from customer",
- "unassign-devices": "Unassign devices",
- "unassign-devices-action-title": "Unassign { count, plural, 1 {1 device} other {# devices} } from customer",
- "assign-new-device": "Assign new device",
- "make-public-device-title": "Are you sure you want to make the device '{{deviceName}}' public?",
- "make-public-device-text": "After the confirmation the device and all its data will be made public and accessible by others.",
- "make-private-device-title": "Are you sure you want to make the device '{{deviceName}}' private?",
- "make-private-device-text": "After the confirmation the device and all its data will be made private and won't be accessible by others.",
- "view-credentials": "View credentials",
- "delete-device-title": "Are you sure you want to delete the device '{{deviceName}}'?",
- "delete-device-text": "Be careful, after the confirmation the device and all related data will become unrecoverable.",
- "delete-devices-title": "Are you sure you want to delete { count, plural, 1 {1 device} other {# devices} }?",
- "delete-devices-action-title": "Delete { count, plural, 1 {1 device} other {# devices} }",
- "delete-devices-text": "Be careful, after the confirmation all selected devices will be removed and all related data will become unrecoverable.",
- "unassign-device-title": "Are you sure you want to unassign the device '{{deviceName}}'?",
- "unassign-device-text": "After the confirmation the device will be unassigned and won't be accessible by the customer.",
- "unassign-device": "Unassign device",
- "unassign-devices-title": "Are you sure you want to unassign { count, plural, 1 {1 device} other {# devices} }?",
- "unassign-devices-text": "After the confirmation all selected devices will be unassigned and won't be accessible by the customer.",
- "device-credentials": "Device Credentials",
- "credentials-type": "Credentials type",
- "access-token": "Access token",
- "access-token-required": "Access token is required.",
- "access-token-invalid": "Access token length must be from 1 to 20 characters.",
- "rsa-key": "RSA public key",
- "rsa-key-required": "RSA public key is required.",
- "secret": "Secret",
- "secret-required": "Secret is required.",
- "device-type": "Device type",
- "device-type-required": "Device type is required.",
- "select-device-type": "Select device type",
- "enter-device-type": "Enter device type",
- "any-device": "Any device",
- "no-device-types-matching": "No device types matching '{{entitySubtype}}' were found.",
- "device-type-list-empty": "No device types selected.",
- "device-types": "Device types",
- "name": "Name",
- "name-required": "Name is required.",
- "description": "Description",
- "label": "Label",
- "events": "Events",
- "details": "Details",
- "copyId": "Copy device Id",
- "copyAccessToken": "Copy access token",
- "idCopiedMessage": "Device Id has been copied to clipboard",
- "accessTokenCopiedMessage": "Device access token has been copied to clipboard",
- "assignedToCustomer": "Assigned to customer",
- "unable-delete-device-alias-title": "Unable to delete device alias",
- "unable-delete-device-alias-text": "Device alias '{{deviceAlias}}' can't be deleted as it used by the following widget(s):
{{widgetsList}}",
- "is-gateway": "Is gateway",
- "public": "Public",
- "device-public": "Device is public",
- "select-device": "Select device",
- "import": "Import device",
- "device-file": "Device file"
- },
- "dialog": {
- "close": "Close dialog"
- },
- "direction": {
- "column": "Column",
- "row": "Row"
- },
- "error": {
- "unable-to-connect": "Unable to connect to the server! Please check your internet connection.",
- "unhandled-error-code": "Unhandled error code: {{errorCode}}",
- "unknown-error": "Unknown error"
- },
- "entity": {
- "entity": "Entity",
- "entities": "Entities",
- "aliases": "Entity aliases",
- "entity-alias": "Entity alias",
- "unable-delete-entity-alias-title": "Unable to delete entity alias",
- "unable-delete-entity-alias-text": "Entity alias '{{entityAlias}}' can't be deleted as it used by the following widget(s):
{{widgetsList}}",
- "duplicate-alias-error": "Duplicate alias found '{{alias}}'.
Entity aliases must be unique whithin the dashboard.",
- "missing-entity-filter-error": "Filter is missing for alias '{{alias}}'.",
- "configure-alias": "Configure '{{alias}}' alias",
- "alias": "Alias",
- "alias-required": "Entity alias is required.",
- "remove-alias": "Remove entity alias",
- "add-alias": "Add entity alias",
- "entity-list": "Entity list",
- "entity-type": "Entity type",
- "entity-types": "Entity types",
- "entity-type-list": "Entity type list",
- "any-entity": "Any entity",
- "enter-entity-type": "Enter entity type",
- "no-entities-matching": "No entities matching '{{entity}}' were found.",
- "no-entity-types-matching": "No entity types matching '{{entityType}}' were found.",
- "name-starts-with": "Name starts with",
- "use-entity-name-filter": "Use filter",
- "entity-list-empty": "No entities selected.",
- "entity-type-list-empty": "No entity types selected.",
- "entity-name-filter-required": "Entity name filter is required.",
- "entity-name-filter-no-entity-matched": "No entities starting with '{{entity}}' were found.",
- "all-subtypes": "All",
- "select-entities": "Select entities",
- "no-aliases-found": "No aliases found.",
- "no-alias-matching": "'{{alias}}' not found.",
- "create-new-alias": "Create a new one!",
- "key": "Key",
- "key-name": "Key name",
- "no-keys-found": "No keys found.",
- "no-key-matching": "'{{key}}' not found.",
- "create-new-key": "Create a new one!",
- "type": "Type",
- "type-required": "Entity type is required.",
- "type-device": "Device",
- "type-devices": "Devices",
- "list-of-devices": "{ count, plural, 1 {One device} other {List of # devices} }",
- "device-name-starts-with": "Devices whose names start with '{{prefix}}'",
- "type-asset": "Asset",
- "type-assets": "Assets",
- "list-of-assets": "{ count, plural, 1 {One asset} other {List of # assets} }",
- "asset-name-starts-with": "Assets whose names start with '{{prefix}}'",
- "type-entity-view": "Entity View",
- "type-entity-views": "Entity Views",
- "list-of-entity-views": "{ count, plural, 1 {One entity view} other {List of # entity views} }",
- "entity-view-name-starts-with": "Entity Views whose names start with '{{prefix}}'",
- "type-rule": "Rule",
- "type-rules": "Rules",
- "list-of-rules": "{ count, plural, 1 {One rule} other {List of # rules} }",
- "rule-name-starts-with": "Rules whose names start with '{{prefix}}'",
- "type-plugin": "Plugin",
- "type-plugins": "Plugins",
- "list-of-plugins": "{ count, plural, 1 {One plugin} other {List of # plugins} }",
- "plugin-name-starts-with": "Plugins whose names start with '{{prefix}}'",
- "type-tenant": "Tenant",
- "type-tenants": "Tenants",
- "list-of-tenants": "{ count, plural, 1 {One tenant} other {List of # tenants} }",
- "tenant-name-starts-with": "Tenants whose names start with '{{prefix}}'",
- "type-customer": "Customer",
- "type-customers": "Customers",
- "list-of-customers": "{ count, plural, 1 {One customer} other {List of # customers} }",
- "customer-name-starts-with": "Customers whose names start with '{{prefix}}'",
- "type-user": "User",
- "type-users": "Users",
- "list-of-users": "{ count, plural, 1 {One user} other {List of # users} }",
- "user-name-starts-with": "Users whose names start with '{{prefix}}'",
- "type-dashboard": "Dashboard",
- "type-dashboards": "Dashboards",
- "list-of-dashboards": "{ count, plural, 1 {One dashboard} other {List of # dashboards} }",
- "dashboard-name-starts-with": "Dashboards whose names start with '{{prefix}}'",
- "type-alarm": "Alarm",
- "type-alarms": "Alarms",
- "list-of-alarms": "{ count, plural, 1 {One alarms} other {List of # alarms} }",
- "alarm-name-starts-with": "Alarms whose names start with '{{prefix}}'",
- "type-rulechain": "Rule chain",
- "type-rulechains": "Rule chains",
- "list-of-rulechains": "{ count, plural, 1 {One rule chain} other {List of # rule chains} }",
- "rulechain-name-starts-with": "Rule chains whose names start with '{{prefix}}'",
- "type-rulenode": "Rule node",
- "type-rulenodes": "Rule nodes",
- "list-of-rulenodes": "{ count, plural, 1 {One rule node} other {List of # rule nodes} }",
- "rulenode-name-starts-with": "Rule nodes whose names start with '{{prefix}}'",
- "type-current-customer": "Current Customer",
- "type-current-tenant": "Current Tenant",
- "search": "Search entities",
- "selected-entities": "{ count, plural, 1 {1 entity} other {# entities} } selected",
- "entity-name": "Entity name",
- "entity-label": "Entity label",
- "details": "Entity details",
- "no-entities-prompt": "No entities found",
- "no-data": "No data to display",
- "columns-to-display": "Columns to Display"
- },
- "entity-field": {
- "created-time": "Created time",
- "name": "Name",
- "type": "Type",
- "first-name": "First name",
- "last-name": "Last name",
- "email": "Email",
- "title": "Title",
- "country": "Country",
- "state": "State",
- "city": "City",
- "address": "Address",
- "address2": "Address 2",
- "zip": "Zip",
- "phone": "Phone",
- "label": "Label"
- },
- "entity-view": {
- "entity-view": "Entity View",
- "entity-view-required": "Entity view is required.",
- "entity-views": "Entity Views",
- "management": "Entity View management",
- "view-entity-views": "View Entity Views",
- "entity-view-alias": "Entity View alias",
- "aliases": "Entity View aliases",
- "no-alias-matching": "'{{alias}}' not found.",
- "no-aliases-found": "No aliases found.",
- "no-key-matching": "'{{key}}' not found.",
- "no-keys-found": "No keys found.",
- "create-new-alias": "Create a new one!",
- "create-new-key": "Create a new one!",
- "duplicate-alias-error": "Duplicate alias found '{{alias}}'.
Entity View aliases must be unique within the dashboard.",
- "configure-alias": "Configure '{{alias}}' alias",
- "no-entity-views-matching": "No entity views matching '{{entity}}' were found.",
- "alias": "Alias",
- "alias-required": "Entity View alias is required.",
- "remove-alias": "Remove entity view alias",
- "add-alias": "Add entity view alias",
- "name-starts-with": "Entity View name starts with",
- "entity-view-list": "Entity View list",
- "use-entity-view-name-filter": "Use filter",
- "entity-view-list-empty": "No entity views selected.",
- "entity-view-name-filter-required": "Entity view name filter is required.",
- "entity-view-name-filter-no-entity-view-matched": "No entity views starting with '{{entityView}}' were found.",
- "add": "Add Entity View",
- "assign-to-customer": "Assign to customer",
- "assign-entity-view-to-customer": "Assign Entity View(s) To Customer",
- "assign-entity-view-to-customer-text": "Please select the entity views to assign to the customer",
- "no-entity-views-text": "No entity views found",
- "assign-to-customer-text": "Please select the customer to assign the entity view(s)",
- "entity-view-details": "Entity view details",
- "add-entity-view-text": "Add new entity view",
- "delete": "Delete entity view",
- "assign-entity-views": "Assign entity views",
- "assign-entity-views-text": "Assign { count, plural, 1 {1 entity view} other {# entity views} } to customer",
- "delete-entity-views": "Delete entity views",
- "unassign-from-customer": "Unassign from customer",
- "unassign-entity-views": "Unassign entity views",
- "unassign-entity-views-action-title": "Unassign { count, plural, 1 {1 entity view} other {# entity views} } from customer",
- "assign-new-entity-view": "Assign new entity view",
- "delete-entity-view-title": "Are you sure you want to delete the entity view '{{entityViewName}}'?",
- "delete-entity-view-text": "Be careful, after the confirmation the entity view and all related data will become unrecoverable.",
- "delete-entity-views-title": "Are you sure you want to delete { count, plural, 1 {1 entity view} other {# entity views} }?",
- "delete-entity-views-action-title": "Delete { count, plural, 1 {1 entity view} other {# entity views} }",
- "delete-entity-views-text": "Be careful, after the confirmation all selected entity views will be removed and all related data will become unrecoverable.",
- "unassign-entity-view-title": "Are you sure you want to unassign the entity view '{{entityViewName}}'?",
- "unassign-entity-view-text": "After the confirmation the entity view will be unassigned and won't be accessible by the customer.",
- "unassign-entity-view": "Unassign entity view",
- "unassign-entity-views-title": "Are you sure you want to unassign { count, plural, 1 {1 entity view} other {# entity views} }?",
- "unassign-entity-views-text": "After the confirmation all selected entity views will be unassigned and won't be accessible by the customer.",
- "entity-view-type": "Entity View type",
- "entity-view-type-required": "Entity View type is required.",
- "select-entity-view-type": "Select entity view type",
- "enter-entity-view-type": "Enter entity view type",
- "any-entity-view": "Any entity view",
- "no-entity-view-types-matching": "No entity view types matching '{{entitySubtype}}' were found.",
- "entity-view-type-list-empty": "No entity view types selected.",
- "entity-view-types": "Entity View types",
- "name": "Name",
- "name-required": "Name is required.",
- "description": "Description",
- "events": "Events",
- "details": "Details",
- "copyId": "Copy entity view Id",
- "assignedToCustomer": "Assigned to customer",
- "unable-entity-view-device-alias-title": "Unable to delete entity view alias",
- "unable-entity-view-device-alias-text": "Device alias '{{entityViewAlias}}' can't be deleted as it used by the following widget(s):
{{widgetsList}}",
- "select-entity-view": "Select entity view",
- "make-public": "Make entity view public",
- "make-private": "Make entity view private",
- "start-date": "Start date",
- "start-ts": "Start time",
- "end-date": "End date",
- "end-ts": "End time",
- "date-limits": "Date limits",
- "client-attributes": "Client attributes",
- "shared-attributes": "Shared attributes",
- "server-attributes": "Server attributes",
- "timeseries": "Timeseries",
- "client-attributes-placeholder": "Client attributes",
- "shared-attributes-placeholder": "Shared attributes",
- "server-attributes-placeholder": "Server attributes",
- "timeseries-placeholder": "Timeseries",
- "target-entity": "Target entity",
- "attributes-propagation": "Attributes propagation",
- "attributes-propagation-hint": "Entity View will automatically copy specified attributes from Target Entity each time you save or update this entity view. For performance reasons target entity attributes are not propagated to entity view on each attribute change. You can enable automatic propagation by configuring \"copy to view\" rule node in your rule chain and linking \"Post attributes\" and \"Attributes Updated\" messages to the new rule node.",
- "timeseries-data": "Timeseries data",
- "timeseries-data-hint": "Configure timeseries data keys of the target entity that will be accessible to the entity view. This timeseries data is read-only.",
- "make-public-entity-view-title": "Are you sure you want to make the entity view '{{entityViewName}}' public?",
- "make-public-entity-view-text": "After the confirmation the entity view and all its data will be made public and accessible by others.",
- "make-private-entity-view-title": "Are you sure you want to make the entity view '{{entityViewName}}' private?",
- "make-private-entity-view-text": "After the confirmation the entity view and all its data will be made private and won't be accessible by others."
- },
- "event": {
- "event-type": "Event type",
- "type-error": "Error",
- "type-lc-event": "Lifecycle event",
- "type-stats": "Statistics",
- "type-debug-rule-node": "Debug",
- "type-debug-rule-chain": "Debug",
- "no-events-prompt": "No events found",
- "error": "Error",
- "alarm": "Alarm",
- "event-time": "Event time",
- "server": "Server",
- "body": "Body",
- "method": "Method",
- "type": "Type",
- "entity": "Entity",
- "message-id": "Message Id",
- "message-type": "Message Type",
- "data-type": "Data Type",
- "relation-type": "Relation Type",
- "metadata": "Metadata",
- "data": "Data",
- "event": "Event",
- "status": "Status",
- "success": "Success",
- "failed": "Failed",
- "messages-processed": "Messages processed",
- "errors-occurred": "Errors occurred"
- },
- "extension": {
- "extensions": "Extensions",
- "selected-extensions": "{ count, plural, 1 {1 extension} other {# extensions} } selected",
- "type": "Type",
- "key": "Key",
- "value": "Value",
- "id": "Id",
- "extension-id": "Extension id",
- "extension-type": "Extension type",
- "transformer-json": "JSON *",
- "unique-id-required": "Current extension id already exists.",
- "delete": "Delete extension",
- "add": "Add extension",
- "edit": "Edit extension",
- "delete-extension-title": "Are you sure you want to delete the extension '{{extensionId}}'?",
- "delete-extension-text": "Be careful, after the confirmation the extension and all related data will become unrecoverable.",
- "delete-extensions-title": "Are you sure you want to delete { count, plural, 1 {1 extension} other {# extensions} }?",
- "delete-extensions-text": "Be careful, after the confirmation all selected extensions will be removed.",
- "converters": "Converters",
- "converter-id": "Converter id",
- "configuration": "Configuration",
- "converter-configurations": "Converter configurations",
- "token": "Security token",
- "add-converter": "Add converter",
- "add-config": "Add converter configuration",
- "device-name-expression": "Device name expression",
- "device-type-expression": "Device type expression",
- "custom": "Custom",
- "to-double": "To Double",
- "transformer": "Transformer",
- "json-required": "Transformer json is required.",
- "json-parse": "Unable to parse transformer json.",
- "attributes": "Attributes",
- "add-attribute": "Add attribute",
- "add-map": "Add mapping element",
- "timeseries": "Timeseries",
- "add-timeseries": "Add timeseries",
- "field-required": "Field is required",
- "brokers": "Brokers",
- "add-broker": "Add broker",
- "host": "Host",
- "port": "Port",
- "port-range": "Port should be in a range from 1 to 65535.",
- "ssl": "Ssl",
- "credentials": "Credentials",
- "username": "Username",
- "password": "Password",
- "retry-interval": "Retry interval in milliseconds",
- "anonymous": "Anonymous",
- "basic": "Basic",
- "pem": "PEM",
- "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.",
- "mapping": "Mapping",
- "topic-filter": "Topic filter",
- "converter-type": "Converter type",
- "converter-json": "Json",
- "json-name-expression": "Device name json expression",
- "topic-name-expression": "Device name topic expression",
- "json-type-expression": "Device type json expression",
- "topic-type-expression": "Device type topic expression",
- "attribute-key-expression": "Attribute key expression",
- "attr-json-key-expression": "Attribute key json expression",
- "attr-topic-key-expression": "Attribute key topic expression",
- "request-id-expression": "Request id expression",
- "request-id-json-expression": "Request id json expression",
- "request-id-topic-expression": "Request id topic expression",
- "response-topic-expression": "Response topic expression",
- "value-expression": "Value expression",
- "topic": "Topic",
- "timeout": "Timeout in milliseconds",
- "converter-json-required": "Converter json is required.",
- "converter-json-parse": "Unable to parse converter json.",
- "filter-expression": "Filter expression",
- "connect-requests": "Connect requests",
- "add-connect-request": "Add connect request",
- "disconnect-requests": "Disconnect requests",
- "add-disconnect-request": "Add disconnect request",
- "attribute-requests": "Attribute requests",
- "add-attribute-request": "Add attribute request",
- "attribute-updates": "Attribute updates",
- "add-attribute-update": "Add attribute update",
- "server-side-rpc": "Server side RPC",
- "add-server-side-rpc-request": "Add server-side RPC request",
- "device-name-filter": "Device name filter",
- "attribute-filter": "Attribute filter",
- "method-filter": "Method filter",
- "request-topic-expression": "Request topic expression",
- "response-timeout": "Response timeout in milliseconds",
- "topic-expression": "Topic expression",
- "client-scope": "Client scope",
- "add-device": "Add device",
- "opc-server": "Servers",
- "opc-add-server": "Add server",
- "opc-add-server-prompt": "Please add server",
- "opc-application-name": "Application name",
- "opc-application-uri": "Application uri",
- "opc-scan-period-in-seconds": "Scan period in seconds",
- "opc-security": "Security",
- "opc-identity": "Identity",
- "opc-keystore": "Keystore",
- "opc-type": "Type",
- "opc-keystore-type": "Type",
- "opc-keystore-location": "Location *",
- "opc-keystore-password": "Password",
- "opc-keystore-alias": "Alias",
- "opc-keystore-key-password": "Key password",
- "opc-device-node-pattern": "Device node pattern",
- "opc-device-name-pattern": "Device name pattern",
- "modbus-server": "Servers/slaves",
- "modbus-add-server": "Add server/slave",
- "modbus-add-server-prompt": "Please add server/slave",
- "modbus-transport": "Transport",
- "modbus-tcp-reconnect": "Automatically reconnect",
- "modbus-rtu-over-tcp": "RTU over TCP",
- "modbus-port-name": "Serial port name",
- "modbus-encoding": "Encoding",
- "modbus-parity": "Parity",
- "modbus-baudrate": "Baud rate",
- "modbus-databits": "Data bits",
- "modbus-stopbits": "Stop bits",
- "modbus-databits-range": "Data bits should be in a range from 7 to 8.",
- "modbus-stopbits-range": "Stop bits should be in a range from 1 to 2.",
- "modbus-unit-id": "Unit ID",
- "modbus-unit-id-range": "Unit ID should be in a range from 1 to 247.",
- "modbus-device-name": "Device name",
- "modbus-poll-period": "Poll period (ms)",
- "modbus-attributes-poll-period": "Attributes poll period (ms)",
- "modbus-timeseries-poll-period": "Timeseries poll period (ms)",
- "modbus-poll-period-range": "Poll period should be positive value.",
- "modbus-tag": "Tag",
- "modbus-function": "Function",
- "modbus-register-address": "Register address",
- "modbus-register-address-range": "Register address should be in a range from 0 to 65535.",
- "modbus-register-bit-index": "Bit index",
- "modbus-register-bit-index-range": "Bit index should be in a range from 0 to 15.",
- "modbus-register-count": "Register count",
- "modbus-register-count-range": "Register count should be a positive value.",
- "modbus-byte-order": "Byte order",
- "sync": {
- "status": "Status",
- "sync": "Sync",
- "not-sync": "Not sync",
- "last-sync-time": "Last sync time",
- "not-available": "Not available"
- },
- "export-extensions-configuration": "Export extensions configuration",
- "import-extensions-configuration": "Import extensions configuration",
- "import-extensions": "Import extensions",
- "import-extension": "Import extension",
- "export-extension": "Export extension",
- "file": "Extensions file",
- "invalid-file-error": "Invalid extension file"
- },
- "fullscreen": {
- "expand": "Expand to fullscreen",
- "exit": "Exit fullscreen",
- "toggle": "Toggle fullscreen mode",
- "fullscreen": "Fullscreen"
- },
- "function": {
- "function": "Function"
- },
- "gateway": {
- "add-entry": "Add configuration",
- "connector-add": "Add new connector",
- "connector-enabled": "Enable connector",
- "connector-name": "Connector name",
- "connector-name-required": "Connector name is required.",
- "connector-type": "Connector type",
- "connector-type-required": "Connector type is required.",
- "connectors": "Connectors configuration",
- "create-new-gateway": "Create a new gateway",
- "create-new-gateway-text": "Are you sure you want create a new gateway with name: '{{gatewayName}}'?",
- "delete": "Delete configuration",
- "download-tip": "Download configuration file",
- "gateway": "Gateway",
- "gateway-exists": "Device with same name is already exists.",
- "gateway-name": "Gateway name",
- "gateway-name-required": "Gateway name is required.",
- "gateway-saved": "Gateway configuration successfully saved.",
- "json-parse": "Not valid JSON.",
- "json-required": "Field cannot be empty.",
- "no-connectors": "No connectors",
- "no-data": "No configurations",
- "no-gateway-found": "No gateway found.",
- "no-gateway-matching": " '{{item}}' not found.",
- "path-logs": "Path to log files",
- "path-logs-required": "Path is required.",
- "remote": "Remote configuration",
- "remote-logging-level": "Logging level",
- "remove-entry": "Remove configuration",
- "save-tip": "Save configuration file",
- "security-type": "Security type",
- "security-types": {
- "access-token": "Access Token",
- "tls": "TLS"
- },
- "storage": "Storage",
- "storage-max-file-records": "Maximum records in file",
- "storage-max-files": "Maximum number of files",
- "storage-max-files-min": "Minimum number is 1.",
- "storage-max-files-pattern": "Number is not valid.",
- "storage-max-files-required": "Number is required.",
- "storage-max-records": "Maximum records in storage",
- "storage-max-records-min": "Minimum number of records is 1.",
- "storage-max-records-pattern": "Number is not valid.",
- "storage-max-records-required": "Maximum records is required.",
- "storage-pack-size": "Maximum event pack size",
- "storage-pack-size-min": "Minimum number is 1.",
- "storage-pack-size-pattern": "Number is not valid.",
- "storage-pack-size-required": "Maximum event pack size is required.",
- "storage-path": "Storage path",
- "storage-path-required": "Storage path is required.",
- "storage-type": "Storage type",
- "storage-types": {
- "file-storage": "File storage",
- "memory-storage": "Memory storage"
- },
- "thingsboard": "ThingsBoard",
- "thingsboard-host": "ThingsBoard host",
- "thingsboard-host-required": "Host is required.",
- "thingsboard-port": "ThingsBoard port",
- "thingsboard-port-max": "Maximum port number is 65535.",
- "thingsboard-port-min": "Minimum port number is 1.",
- "thingsboard-port-pattern": "Port is not valid.",
- "thingsboard-port-required": "Port is required.",
- "tidy": "Tidy",
- "tidy-tip": "Tidy config JSON",
- "title-connectors-json": "Connector {{typeName}} configuration",
- "tls-path-ca-certificate": "Path to CA certificate on gateway",
- "tls-path-client-certificate": "Path to client certificate on gateway",
- "tls-path-private-key": "Path to private key on gateway",
- "toggle-fullscreen": "Toggle fullscreen",
- "transformer-json-config": "Configuration JSON*",
- "update-config": "Add/update configuration JSON",
- "state-title": "Gateway state",
- "show-config-tip": "Show gateway configuration",
- "title-show-config": "Show gateway configuration",
- "read-only": "Read only",
- "read-write": ""
- },
- "grid": {
- "delete-item-title": "Are you sure you want to delete this item?",
- "delete-item-text": "Be careful, after the confirmation this item and all related data will become unrecoverable.",
- "delete-items-title": "Are you sure you want to delete { count, plural, 1 {1 item} other {# items} }?",
- "delete-items-action-title": "Delete { count, plural, 1 {1 item} other {# items} }",
- "delete-items-text": "Be careful, after the confirmation all selected items will be removed and all related data will become unrecoverable.",
- "add-item-text": "Add new item",
- "no-items-text": "No items found",
- "item-details": "Item details",
- "delete-item": "Delete Item",
- "delete-items": "Delete Items",
- "scroll-to-top": "Scroll to top"
- },
- "help": {
- "goto-help-page": "Go to help page"
- },
- "home": {
- "home": "Home",
- "profile": "Profile",
- "logout": "Logout",
- "menu": "Menu",
- "avatar": "Avatar",
- "open-user-menu": "Open user menu"
- },
- "import": {
- "no-file": "No file selected",
- "drop-file": "Drop a JSON file or click to select a file to upload.",
- "drop-file-csv": "Drop a CSV file or click to select a file to upload.",
- "column-value": "Value",
- "column-title": "Title",
- "column-example": "Example value data",
- "column-key": "Attribute/telemetry key",
- "csv-delimiter": "CSV delimiter",
- "csv-first-line-header": "First line contains column names",
- "csv-update-data": "Update attributes/telemetry",
- "import-csv-number-columns-error": "A file should contain at least two columns",
- "import-csv-invalid-format-error": "Invalid file format. Line: '{{line}}'",
- "column-type": {
- "name": "Name",
- "type": "Type",
- "label": "Label",
- "column-type": "Column type",
- "client-attribute": "Client attribute",
- "shared-attribute": "Shared attribute",
- "server-attribute": "Server attribute",
- "timeseries": "Timeseries",
- "entity-field": "Entity field",
- "access-token": "Access token",
- "isgateway": "Is Gateway",
- "description": "Description"
- },
- "stepper-text":{
- "select-file": "Select a file",
- "configuration": "Import configuration",
- "column-type": "Select columns type",
- "creat-entities": "Creating new entities",
- "done": "Done"
- },
- "message": {
- "create-entities": "{{count}} new entities were successfully created.",
- "update-entities": "{{count}} entities were successfully updated.",
- "error-entities": "There was an error creating {{count}} entities."
- }
- },
- "item": {
- "selected": "Selected"
- },
- "js-func": {
- "no-return-error": "Function must return value!",
- "return-type-mismatch": "Function must return value of '{{type}}' type!",
- "tidy": "Tidy",
- "mini": "Mini"
- },
- "key-val": {
- "key": "Key",
- "value": "Value",
- "remove-entry": "Remove entry",
- "add-entry": "Add entry",
- "no-data": "No entries"
- },
- "layout": {
- "layout": "Layout",
- "manage": "Manage layouts",
- "settings": "Layout settings",
- "color": "Color",
- "main": "Main",
- "right": "Right",
- "select": "Select target layout"
- },
- "legend": {
- "direction": "Legend direction",
- "position": "Legend position",
- "show-max": "Show max value",
- "show-min": "Show min value",
- "show-avg": "Show average value",
- "show-total": "Show total value",
- "settings": "Legend settings",
- "min": "min",
- "max": "max",
- "avg": "avg",
- "total": "total",
- "comparison-time-ago": {
- "days": "(day ago)",
- "weeks": "(week ago)",
- "months": "(month ago)",
- "years": "(year ago)"
- }
- },
- "login": {
- "login": "Log in",
- "request-password-reset": "Request Password Reset",
- "reset-password": "Reset Password",
- "create-password": "Create Password",
- "passwords-mismatch-error": "Entered passwords must be same!",
- "password-again": "Password again",
- "sign-in": "Please sign in",
- "username": "Username (email)",
- "remember-me": "Remember me",
- "forgot-password": "Forgot Password?",
- "password-reset": "Password reset",
- "expired-password-reset-message": "Your credentials has been expired! Please create new password.",
- "new-password": "New password",
- "new-password-again": "New password again",
- "password-link-sent-message": "Password reset link was successfully sent!",
- "email": "Email",
- "login-with": "Login with {{name}}",
- "or": "or",
- "error": "Login error"
- },
- "position": {
- "top": "Top",
- "bottom": "Bottom",
- "left": "Left",
- "right": "Right"
- },
- "profile": {
- "profile": "Profile",
- "last-login-time": "Last Login",
- "change-password": "Change Password",
- "current-password": "Current password"
- },
- "relation": {
- "relations": "Relations",
- "direction": "Direction",
- "search-direction": {
- "FROM": "From",
- "TO": "To"
- },
- "direction-type": {
- "FROM": "from",
- "TO": "to"
- },
- "from-relations": "Outbound relations",
- "to-relations": "Inbound relations",
- "selected-relations": "{ count, plural, 1 {1 relation} other {# relations} } selected",
- "type": "Type",
- "to-entity-type": "To entity type",
- "to-entity-name": "To entity name",
- "from-entity-type": "From entity type",
- "from-entity-name": "From entity name",
- "to-entity": "To entity",
- "from-entity": "From entity",
- "delete": "Delete relation",
- "relation-type": "Relation type",
- "relation-type-required": "Relation type is required.",
- "any-relation-type": "Any type",
- "add": "Add relation",
- "edit": "Edit relation",
- "delete-to-relation-title": "Are you sure you want to delete relation to the entity '{{entityName}}'?",
- "delete-to-relation-text": "Be careful, after the confirmation the entity '{{entityName}}' will be unrelated from the current entity.",
- "delete-to-relations-title": "Are you sure you want to delete { count, plural, 1 {1 relation} other {# relations} }?",
- "delete-to-relations-text": "Be careful, after the confirmation all selected relations will be removed and corresponding entities will be unrelated from the current entity.",
- "delete-from-relation-title": "Are you sure you want to delete relation from the entity '{{entityName}}'?",
- "delete-from-relation-text": "Be careful, after the confirmation current entity will be unrelated from the entity '{{entityName}}'.",
- "delete-from-relations-title": "Are you sure you want to delete { count, plural, 1 {1 relation} other {# relations} }?",
- "delete-from-relations-text": "Be careful, after the confirmation all selected relations will be removed and current entity will be unrelated from the corresponding entities.",
- "remove-relation-filter": "Remove relation filter",
- "add-relation-filter": "Add relation filter",
- "any-relation": "Any relation",
- "relation-filters": "Relation filters",
- "additional-info": "Additional info (JSON)",
- "invalid-additional-info": "Unable to parse additional info json."
- },
- "rulechain": {
- "rulechain": "Rule chain",
- "rulechains": "Rule chains",
- "root": "Root",
- "delete": "Delete rule chain",
- "name": "Name",
- "name-required": "Name is required.",
- "description": "Description",
- "add": "Add Rule Chain",
- "set-root": "Make rule chain root",
- "set-root-rulechain-title": "Are you sure you want to make the rule chain '{{ruleChainName}}' root?",
- "set-root-rulechain-text": "After the confirmation the rule chain will become root and will handle all incoming transport messages.",
- "delete-rulechain-title": "Are you sure you want to delete the rule chain '{{ruleChainName}}'?",
- "delete-rulechain-text": "Be careful, after the confirmation the rule chain and all related data will become unrecoverable.",
- "delete-rulechains-title": "Are you sure you want to delete { count, plural, 1 {1 rule chain} other {# rule chains} }?",
- "delete-rulechains-action-title": "Delete { count, plural, 1 {1 rule chain} other {# rule chains} }",
- "delete-rulechains-text": "Be careful, after the confirmation all selected rule chains will be removed and all related data will become unrecoverable.",
- "add-rulechain-text": "Add new rule chain",
- "no-rulechains-text": "No rule chains found",
- "rulechain-details": "Rule chain details",
- "details": "Details",
- "events": "Events",
- "system": "System",
- "import": "Import rule chain",
- "export": "Export rule chain",
- "export-failed-error": "Unable to export rule chain: {{error}}",
- "create-new-rulechain": "Create new rule chain",
- "rulechain-file": "Rule chain file",
- "invalid-rulechain-file-error": "Unable to import rule chain: Invalid rule chain data structure.",
- "copyId": "Copy rule chain Id",
- "idCopiedMessage": "Rule chain Id has been copied to clipboard",
- "select-rulechain": "Select rule chain",
- "no-rulechains-matching": "No rule chains matching '{{entity}}' were found.",
- "rulechain-required": "Rule chain is required",
- "management": "Rules management",
- "debug-mode": "Debug mode"
- },
- "rulenode": {
- "details": "Details",
- "events": "Events",
- "search": "Search nodes",
- "open-node-library": "Open node library",
- "add": "Add rule node",
- "name": "Name",
- "name-required": "Name is required.",
- "type": "Type",
- "description": "Description",
- "delete": "Delete rule node",
- "select-all-objects": "Select all nodes and connections",
- "deselect-all-objects": "Deselect all nodes and connections",
- "delete-selected-objects": "Delete selected nodes and connections",
- "delete-selected": "Delete selected",
- "select-all": "Select all",
- "copy-selected": "Copy selected",
- "deselect-all": "Deselect all",
- "rulenode-details": "Rule node details",
- "debug-mode": "Debug mode",
- "configuration": "Configuration",
- "link": "Link",
- "link-details": "Rule node link details",
- "add-link": "Add link",
- "link-label": "Link label",
- "link-label-required": "Link label is required.",
- "custom-link-label": "Custom link label",
- "custom-link-label-required": "Custom link label is required.",
- "link-labels": "Link labels",
- "link-labels-required": "Link labels is required.",
- "no-link-labels-found": "No link labels found",
- "no-link-label-matching": "'{{label}}' not found.",
- "create-new-link-label": "Create a new one!",
- "type-filter": "Filter",
- "type-filter-details": "Filter incoming messages with configured conditions",
- "type-enrichment": "Enrichment",
- "type-enrichment-details": "Add additional information into Message Metadata",
- "type-transformation": "Transformation",
- "type-transformation-details": "Change Message payload and Metadata",
- "type-action": "Action",
- "type-action-details": "Perform special action",
- "type-external": "External",
- "type-external-details": "Interacts with external system",
- "type-rule-chain": "Rule Chain",
- "type-rule-chain-details": "Forwards incoming messages to specified Rule Chain",
- "type-input": "Input",
- "type-input-details": "Logical input of Rule Chain, forwards incoming messages to next related Rule Node",
- "type-unknown": "Unknown",
- "type-unknown-details": "Unresolved Rule Node",
- "directive-is-not-loaded": "Defined configuration directive '{{directiveName}}' is not available.",
- "ui-resources-load-error": "Failed to load configuration ui resources.",
- "invalid-target-rulechain": "Unable to resolve target rule chain!",
- "test-script-function": "Test script function",
- "message": "Message",
- "message-type": "Message type",
- "select-message-type": "Select message type",
- "message-type-required": "Message type is required",
- "metadata": "Metadata",
- "metadata-required": "Metadata entries can't be empty.",
- "output": "Output",
- "test": "Test",
- "help": "Help",
- "reset-debug-mode": "Reset debug mode in all nodes"
- },
- "queue": {
- "select_name": "Select queue name",
- "name": "Queue Name",
- "name_required": "Queue name is required!"
-
- },
- "tenant": {
- "tenant": "Tenant",
- "tenants": "Tenants",
- "management": "Tenant management",
- "add": "Add Tenant",
- "admins": "Admins",
- "manage-tenant-admins": "Manage tenant admins",
- "delete": "Delete tenant",
- "add-tenant-text": "Add new tenant",
- "no-tenants-text": "No tenants found",
- "tenant-details": "Tenant details",
- "delete-tenant-title": "Are you sure you want to delete the tenant '{{tenantTitle}}'?",
- "delete-tenant-text": "Be careful, after the confirmation the tenant and all related data will become unrecoverable.",
- "delete-tenants-title": "Are you sure you want to delete { count, plural, 1 {1 tenant} other {# tenants} }?",
- "delete-tenants-action-title": "Delete { count, plural, 1 {1 tenant} other {# tenants} }",
- "delete-tenants-text": "Be careful, after the confirmation all selected tenants will be removed and all related data will become unrecoverable.",
- "title": "Title",
- "title-required": "Title is required.",
- "description": "Description",
- "details": "Details",
- "events": "Events",
- "copyId": "Copy tenant Id",
- "idCopiedMessage": "Tenant Id has been copied to clipboard",
- "select-tenant": "Select tenant",
- "no-tenants-matching": "No tenants matching '{{entity}}' were found.",
- "tenant-required": "Tenant is required",
- "isolated-tb-core": "Processing in isolated ThingsBoard Core container",
- "isolated-tb-rule-engine": "Processing in isolated ThingsBoard Rule Engine container",
- "isolated-tb-core-details": "Requires separate microservice(s) per isolated Tenant",
- "isolated-tb-rule-engine-details": "Requires separate microservice(s) per isolated Tenant"
- },
- "timeinterval": {
- "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": "Days",
- "hours": "Hours",
- "minutes": "Minutes",
- "seconds": "Seconds",
- "advanced": "Advanced"
- },
- "timewindow": {
- "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": "Realtime",
- "history": "History",
- "last-prefix": "last",
- "period": "from {{ startTime }} to {{ endTime }}",
- "edit": "Edit timewindow",
- "date-range": "Date range",
- "last": "Last",
- "time-period": "Time period",
- "hide": "Hide"
- },
- "user": {
- "user": "User",
- "users": "Users",
- "customer-users": "Customer Users",
- "tenant-admins": "Tenant Admins",
- "sys-admin": "System administrator",
- "tenant-admin": "Tenant administrator",
- "customer": "Customer",
- "anonymous": "Anonymous",
- "add": "Add User",
- "delete": "Delete user",
- "add-user-text": "Add new user",
- "no-users-text": "No users found",
- "user-details": "User details",
- "delete-user-title": "Are you sure you want to delete the user '{{userEmail}}'?",
- "delete-user-text": "Be careful, after the confirmation the user and all related data will become unrecoverable.",
- "delete-users-title": "Are you sure you want to delete { count, plural, 1 {1 user} other {# users} }?",
- "delete-users-action-title": "Delete { count, plural, 1 {1 user} other {# users} }",
- "delete-users-text": "Be careful, after the confirmation all selected users will be removed and all related data will become unrecoverable.",
- "activation-email-sent-message": "Activation email was successfully sent!",
- "resend-activation": "Resend activation",
- "email": "Email",
- "email-required": "Email is required.",
- "invalid-email-format": "Invalid email format.",
- "first-name": "First Name",
- "last-name": "Last Name",
- "description": "Description",
- "default-dashboard": "Default dashboard",
- "always-fullscreen": "Always fullscreen",
- "select-user": "Select user",
- "no-users-matching": "No users matching '{{entity}}' were found.",
- "user-required": "User is required",
- "activation-method": "Activation method",
- "display-activation-link": "Display activation link",
- "send-activation-mail": "Send activation mail",
- "activation-link": "User activation link",
- "activation-link-text": "In order to activate user use the following activation link :",
- "copy-activation-link": "Copy activation link",
- "activation-link-copied-message": "User activation link has been copied to clipboard",
- "details": "Details",
- "login-as-tenant-admin": "Login as Tenant Admin",
- "login-as-customer-user": "Login as Customer User",
- "disable-account": "Disable User Account",
- "enable-account": "Enable User Account",
- "enable-account-message": "User account was successfully enabled!",
- "disable-account-message": "User account was successfully disabled!"
- },
- "value": {
- "type": "Value type",
- "string": "String",
- "string-value": "String value",
- "integer": "Integer",
- "integer-value": "Integer value",
- "invalid-integer-value": "Invalid integer value",
- "double": "Double",
- "double-value": "Double value",
- "boolean": "Boolean",
- "boolean-value": "Boolean value",
- "false": "False",
- "true": "True",
- "long": "Long",
- "json": "JSON",
- "json-value": "JSON value"
- },
- "widget": {
- "widget-library": "Widgets Library",
- "widget-bundle": "Widgets Bundle",
- "select-widgets-bundle": "Select widgets bundle",
- "management": "Widget management",
- "editor": "Widget Editor",
- "widget-type-not-found": "Problem loading widget configuration.
Probably associated\n widget type was removed.",
- "widget-type-load-error": "Widget wasn't loaded due to the following errors:",
- "remove": "Remove widget",
- "edit": "Edit widget",
- "remove-widget-title": "Are you sure you want to remove the widget '{{widgetTitle}}'?",
- "remove-widget-text": "After the confirmation the widget and all related data will become unrecoverable.",
- "timeseries": "Time series",
- "search-data": "Search data",
- "no-data-found": "No data found",
- "latest-values": "Latest values",
- "rpc": "Control widget",
- "alarm": "Alarm widget",
- "static": "Static widget",
- "select-widget-type": "Select widget type",
- "missing-widget-title-error": "Widget title must be specified!",
- "widget-saved": "Widget saved",
- "unable-to-save-widget-error": "Unable to save widget! Widget has errors!",
- "save": "Save widget",
- "saveAs": "Save widget as",
- "save-widget-type-as": "Save widget type as",
- "save-widget-type-as-text": "Please enter new widget title and/or select target widgets bundle",
- "toggle-fullscreen": "Toggle fullscreen",
- "run": "Run widget",
- "title": "Widget title",
- "title-required": "Widget title is required.",
- "type": "Widget type",
- "resources": "Resources",
- "resource-url": "JavaScript/CSS URL",
- "remove-resource": "Remove resource",
- "add-resource": "Add resource",
- "html": "HTML",
- "tidy": "Tidy",
- "css": "CSS",
- "settings-schema": "Settings schema",
- "datakey-settings-schema": "Data key settings schema",
- "javascript": "Javascript",
- "js": "JS",
- "remove-widget-type-title": "Are you sure you want to remove the widget type '{{widgetName}}'?",
- "remove-widget-type-text": "After the confirmation the widget type and all related data will become unrecoverable.",
- "remove-widget-type": "Remove widget type",
- "add-widget-type": "Add new widget type",
- "widget-type-load-failed-error": "Failed to load widget type!",
- "widget-template-load-failed-error": "Failed to load widget template!",
- "add": "Add Widget",
- "undo": "Undo widget changes",
- "export": "Export widget"
- },
- "widget-action": {
- "header-button": "Widget header button",
- "open-dashboard-state": "Navigate to new dashboard state",
- "update-dashboard-state": "Update current dashboard state",
- "open-dashboard": "Navigate to other dashboard",
- "custom": "Custom action",
- "custom-pretty": "Custom action (with HTML template)",
- "target-dashboard-state": "Target dashboard state",
- "target-dashboard-state-required": "Target dashboard state is required",
- "set-entity-from-widget": "Set entity from widget",
- "target-dashboard": "Target dashboard",
- "open-right-layout": "Open right dashboard layout (mobile view)"
- },
- "widgets-bundle": {
- "current": "Current bundle",
- "widgets-bundles": "Widgets Bundles",
- "add": "Add Widgets Bundle",
- "delete": "Delete widgets bundle",
- "title": "Title",
- "title-required": "Title is required.",
- "add-widgets-bundle-text": "Add new widgets bundle",
- "no-widgets-bundles-text": "No widgets bundles found",
- "empty": "Widgets bundle is empty",
- "details": "Details",
- "widgets-bundle-details": "Widgets bundle details",
- "delete-widgets-bundle-title": "Are you sure you want to delete the widgets bundle '{{widgetsBundleTitle}}'?",
- "delete-widgets-bundle-text": "Be careful, after the confirmation the widgets bundle and all related data will become unrecoverable.",
- "delete-widgets-bundles-title": "Are you sure you want to delete { count, plural, 1 {1 widgets bundle} other {# widgets bundles} }?",
- "delete-widgets-bundles-action-title": "Delete { count, plural, 1 {1 widgets bundle} other {# widgets bundles} }",
- "delete-widgets-bundles-text": "Be careful, after the confirmation all selected widgets bundles will be removed and all related data will become unrecoverable.",
- "no-widgets-bundles-matching": "No widgets bundles matching '{{widgetsBundle}}' were found.",
- "widgets-bundle-required": "Widgets bundle is required.",
- "system": "System",
- "import": "Import widgets bundle",
- "export": "Export widgets bundle",
- "export-failed-error": "Unable to export widgets bundle: {{error}}",
- "create-new-widgets-bundle": "Create new widgets bundle",
- "widgets-bundle-file": "Widgets bundle file",
- "invalid-widgets-bundle-file-error": "Unable to import widgets bundle: Invalid widgets bundle data structure."
- },
- "widget-config": {
- "data": "Data",
- "settings": "Settings",
- "advanced": "Advanced",
- "title": "Title",
- "title-tooltip": "Title Tooltip",
- "general-settings": "General settings",
- "display-title": "Display title",
- "drop-shadow": "Drop shadow",
- "enable-fullscreen": "Enable fullscreen",
- "background-color": "Background color",
- "text-color": "Text color",
- "padding": "Padding",
- "margin": "Margin",
- "widget-style": "Widget style",
- "title-style": "Title style",
- "mobile-mode-settings": "Mobile mode settings",
- "order": "Order",
- "height": "Height",
- "units": "Special symbol to show next to value",
- "decimals": "Number of digits after floating point",
- "timewindow": "Timewindow",
- "use-dashboard-timewindow": "Use dashboard timewindow",
- "display-timewindow": "Display timewindow",
- "display-legend": "Display legend",
- "datasources": "Datasources",
- "maximum-datasources": "Maximum { count, plural, 1 {1 datasource is allowed.} other {# datasources are allowed} }",
- "datasource-type": "Type",
- "datasource-parameters": "Parameters",
- "remove-datasource": "Remove datasource",
- "add-datasource": "Add datasource",
- "target-device": "Target device",
- "alarm-source": "Alarm source",
- "actions": "Actions",
- "action": "Action",
- "add-action": "Add action",
- "search-actions": "Search actions",
- "action-source": "Action source",
- "action-source-required": "Action source is required.",
- "action-name": "Name",
- "action-name-required": "Action name is required.",
- "action-name-not-unique": "Another action with the same name already exists.
Action name should be unique within the same action source.",
- "action-icon": "Icon",
- "action-type": "Type",
- "action-type-required": "Action type is required.",
- "edit-action": "Edit action",
- "delete-action": "Delete action",
- "delete-action-title": "Delete widget action",
- "delete-action-text": "Are you sure you want delete widget action with name '{{actionName}}'?",
- "display-icon": "Display title icon",
- "icon-color": "Icon color",
- "icon-size": "Icon size"
- },
- "widget-type": {
- "import": "Import widget type",
- "export": "Export widget type",
- "export-failed-error": "Unable to export widget type: {{error}}",
- "create-new-widget-type": "Create new widget type",
- "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"
- }
- },
- "input-widgets": {
- "attribute-not-allowed": "Attribute parameter cannot be used in this widget",
- "blocked-location": "Geolocation is blocked in your browser",
- "claim-device": "Claim device",
- "claim-failed": "Failed to claim the device!",
- "claim-not-found": "Device not found!",
- "claim-successful": "Device was successfully claimed!",
- "date": "Date",
- "device-name": "Device name",
- "device-name-required": "Device name is required",
- "discard-changes": "Discard changes",
- "entity-attribute-required": "Entity attribute is required",
- "entity-coordinate-required": "Both fields, latitude and longitude, are required",
- "entity-timeseries-required": "Entity timeseries is required",
- "get-location": "Get current location",
- "latitude": "Latitude",
- "longitude": "Longitude",
- "not-allowed-entity": "Selected entity cannot have shared attributes",
- "no-attribute-selected": "No attribute is selected",
- "no-datakey-selected": "No datakey is selected",
- "no-coordinate-specified": "Datakey for latitude/longitude doesn't specified",
- "no-entity-selected": "No entity selected",
- "no-image": "No image",
- "no-support-geolocation": "Your browser doesn't support geolocation",
- "no-support-web-camera": "No supported web camera",
- "no-timeseries-selected": "No timeseries selected",
- "secret-key": "Secret key",
- "secret-key-required": "Secret key is required",
- "switch-attribute-value": "Switch entity attribute value",
- "switch-camera": "Switch camera",
- "switch-timeseries-value": "Switch entity timeseries value",
- "take-photo": "Take photo",
- "time": "Time",
- "timeseries-not-allowed": "Timeseries parameter cannot be used in this widget",
- "update-failed": "Update failed",
- "update-successful": "Update successful",
- "update-attribute": "Update attribute",
- "update-timeseries": "Update timeseries",
- "value": "Value"
- }
- },
- "icon": {
- "icon": "Icon",
- "select-icon": "Select icon",
- "material-icons": "Material icons",
- "show-all": "Show all icons"
- },
- "custom": {
- "widget-action": {
- "action-cell-button": "Action cell button",
- "row-click": "On row click",
- "polygon-click": "On polygon click",
- "marker-click": "On marker click",
- "tooltip-tag-action": "Tooltip tag action",
- "node-selected": "On node selected",
- "element-click": "On HTML element click",
- "pie-slice-click": "On slice click",
- "row-double-click": "On row double click"
- }
- },
- "language": {
- "language": "Language",
- "locales": {
- "de_DE": "Deutsch",
- "fr_FR": "Français",
- "zh_CN": "简体中文",
- "zh_TW": "繁體中文",
- "en_US": "English",
- "it_IT": "Italiano",
- "ko_KR": "한글",
- "ru_RU": "Русский",
- "es_ES": "Español",
- "ja_JA": "日本語",
- "tr_TR": "Türkçe",
- "fa_IR": "فارسي",
- "uk_UA": "Українська",
- "cs_CZ": "Česky",
- "el_GR": "Ελληνικά",
- "ro_RO": "Română",
- "lv_LV": "Latviešu"
- }
- }
-}
diff --git a/ui/src/app/locale/locale.constant-es_ES.json b/ui/src/app/locale/locale.constant-es_ES.json
deleted file mode 100644
index df5752f54b..0000000000
--- a/ui/src/app/locale/locale.constant-es_ES.json
+++ /dev/null
@@ -1,1765 +0,0 @@
-{
- "access": {
- "unauthorized": "No autorizado",
- "unauthorized-access": "Acceso no autorizado",
- "unauthorized-access-text": "¡Debe registrarse para tener acceso a este recurso!",
- "access-forbidden": "Acceso Prohibido",
- "access-forbidden-text": "No tiene permisos para acceder a esta ubicación!
Intente registrarse con otro usuario si aún desea acceder a esta ubicación.",
- "refresh-token-expired": "La sesión ha expirado",
- "refresh-token-failed": "No se puede actualizar la sesión"
- },
- "action": {
- "activate": "Activar",
- "suspend": "Suspender",
- "save": "Guardar",
- "saveAs": "Guardar como",
- "cancel": "Cancelar",
- "ok": "Aceptar",
- "delete": "Eliminar",
- "add": "Agregar",
- "yes": "Si",
- "no": "No",
- "update": "Actualizar",
- "remove": "Eliminar",
- "search": "Buscar",
- "clear-search": "Borrar búsqueda",
- "assign": "Asignar",
- "unassign": "Anular asignación",
- "share": "Compartir",
- "make-private": "Hacer privado",
- "apply": "Aplicar",
- "apply-changes": "Aplicar cambios",
- "edit-mode": "Modo edición",
- "enter-edit-mode": "Entrar en modo edición",
- "decline-changes": "Descartar cambios",
- "close": "Cerrar",
- "back": "Atrás",
- "run": "Ejecutar",
- "sign-in": "¡Registrarse!",
- "edit": "Editar",
- "view": "Ver",
- "create": "Crear",
- "drag": "Arrastrar",
- "refresh": "Actualizar",
- "undo": "Deshacer",
- "copy": "Copiar",
- "paste": "Pegar",
- "copy-reference": "Copiar referencia",
- "paste-reference": "Pegar referencia",
- "import": "Importar",
- "export": "Exportar",
- "share-via": "Compartir vía {{provider}}",
- "discard-changes": "Cancelar los cambios",
- "continue": "Continuar"
- },
- "aggregation": {
- "aggregation": "Agregación",
- "function": "Función de agregación de datos",
- "limit": "Valores máximos",
- "group-interval": "Intervalo de agrupamiento",
- "min": "Min",
- "max": "Max",
- "avg": "Promedio",
- "sum": "Suma",
- "count": "Contar",
- "none": "Ninguno"
- },
- "admin": {
- "general": "General",
- "general-settings": "Configuración general",
- "outgoing-mail": "Servidor de correo",
- "outgoing-mail-settings": "Configuración del servidor de correo de salida",
- "system-settings": "Configuración del sistema",
- "test-mail-sent": "¡El correo de prueba fue enviado correctamente!",
- "base-url": "URL base",
- "base-url-required": "URL base es requerida.",
- "mail-from": "Correo desde",
- "mail-from-required": "Correo desde es requerido.",
- "smtp-protocol": "Protocolo SMTP",
- "smtp-host": "Host SMTP",
- "smtp-host-required": "Host SMTP es requerido.",
- "smtp-port": "Puerto SMTP",
- "smtp-port-required": "Debe suministrar un puerto SMTP",
- "smtp-port-invalid": "Eso no parece un puerto SMTP válido.",
- "timeout-msec": "Tiempo de espera (ms)",
- "timeout-required": "Tiempo de espera es requerido.",
- "timeout-invalid": "Eso no parece un tiempo de espera válido.",
- "enable-tls": "Habilitar TLS",
- "tls-version": "Versión TLS",
- "send-test-mail": "Enviar correo de prueba",
- "password-policy": "Política de contraseñas",
- "security-settings": "Configuraciones de seguridad",
- "minimum-password-length": "Longitud mínima de contraseña",
- "minimum-password-length-required": "Se requiere una longitud mínima de contraseña",
- "minimum-password-length-range": "La longitud mínima de la contraseña debe estar en un rango de 5 a 50",
- "minimum-uppercase-letters": "Número mínimo de letras mayúsculas",
- "minimum-uppercase-letters-range": "El número mínimo de letras mayúsculas no puede ser negativo",
- "minimum-lowercase-letters": "Número mínimo de letras minúsculas",
- "minimum-lowercase-letters-range": "El número mínimo de letras minúsculas no puede ser negativo",
- "minimum-digits": "Número mínimo de dígitos",
- "minimum-digits-range": "El número mínimo de dígitos no puede ser negativo",
- "minimum-special-characters": "Número mínimo de caracteres especiales.",
- "minimum-special-characters-range": "El número mínimo de caracteres especiales no puede ser negativo.",
- "password-expiration-period-days": "Periodo de caducidad de contraseña en días",
- "password-expiration-period-days-range": "El período de caducidad de la contraseña en días no puede ser negativo",
- "password-reuse-frequency-days": "Frecuencia de reutilización de contraseña en días",
- "password-reuse-frequency-days-range": "La frecuencia de reutilización de contraseña en días no puede ser negativa",
- "general-policy": "Política general",
- "max-failed-login-attempts": "Número máximo de intentos fallidos de inicio de sesión, antes de que la cuenta esté bloqueada",
- "minimum-max-failed-login-attempts-range": "El número máximo de intentos fallidos de inicio de sesión no puede ser negativo",
- "user-lockout-notification-email": "En caso de bloqueo de la cuenta del usuario, envíe una notificación por correo electrónico"
- },
- "alarm": {
- "alarm": "Alarma",
- "alarms": "Alarmas",
- "select-alarm": "Seleccionar alarma",
- "no-alarms-matching": "Alarmas que coincidan con '{{entity}}' no fueron encontradas.",
- "alarm-required": "Alarma es requerida",
- "alarm-status": "Estado de la alarma",
- "search-status": {
- "ANY": "Todas",
- "ACTIVE": "Activas",
- "CLEARED": "Borradas",
- "ACK": "Reconocidas",
- "UNACK": "Ignoradas"
- },
- "display-status": {
- "ACTIVE_UNACK": "Activa ignorada",
- "ACTIVE_ACK": "Activa reconocida",
- "CLEARED_UNACK": "Borrada ignorada",
- "CLEARED_ACK": "Borrada reconocida"
- },
- "no-alarms-prompt": "No se encontraron alarmas",
- "created-time": "Tiempo de creación",
- "type": "Tipo",
- "severity": "Criticidad",
- "originator": "Origen",
- "originator-type": "Tipo de origen",
- "details": "Detalles",
- "status": "Estado",
- "alarm-details": "Detalles de la alarma",
- "start-time": "Tiempo de inicio",
- "end-time": "Tiempo de finalización",
- "ack-time": "Tiempo de reconocimiento",
- "clear-time": "Tiempo de borrado",
- "severity-critical": "Crítica",
- "severity-major": "Alta",
- "severity-minor": "Baja",
- "severity-warning": "Alerta",
- "severity-indeterminate": "Indeterminada",
- "acknowledge": "Reconocer",
- "clear": "Borrar",
- "search": "buscar alarmas",
- "selected-alarms": "{ count, plural, 1 {1 alarma} other {# alarmas} } seleccionadas",
- "no-data": "No hay datos para mostrar",
- "polling-interval": "Intervalo de sondeo de alarmas (seg)",
- "polling-interval-required": "Intervalo de sondeo de alarmas es requerido.",
- "min-polling-interval-message": "Se permite al menos 1 segundo de intervalo de sondeo.",
- "aknowledge-alarms-title": "Reconocer { count, plural, 1 {1 alarma} other {# alarmas} }",
- "aknowledge-alarms-text": "¿Está seguro de que desea reconocer { count, plural, 1 {1 alarma} other {# alarmas} }?",
- "aknowledge-alarm-title": "Reconocer alarma",
- "aknowledge-alarm-text": "¿Está seguro que quiere reconocer la alarma?",
- "clear-alarms-title": "Quitar { count, plural, 1 {1 alarma} other {# alarmas} }",
- "clear-alarms-text": "¿Está seguro de que desea quitar { count, plural, 1 {1 alarma} other {# alarmas}?",
- "clear-alarm-title": "Quitar alarma",
- "clear-alarm-text": "¿Está seguro que quiere quitar la alarma?",
- "alarm-status-filter": "Filtro de estado de alarma"
- },
- "alias": {
- "add": "Agregar alias",
- "edit": "Editar alias",
- "name": "Nombre de alias",
- "name-required": "Nombre de alias es requerido",
- "duplicate-alias": "Ya existe un alias con el mismo nombre.",
- "filter-type-single-entity": "Entidad única",
- "filter-type-entity-list": "Lista de entidades",
- "filter-type-entity-name": "Nombre de entidad",
- "filter-type-state-entity": "Entidad del panel de estados",
- "filter-type-state-entity-description": "Entidad tomada desde los parámetros del panel de estados",
- "filter-type-asset-type": "Tipo de activo",
- "filter-type-asset-type-description": "Activos de tipo '{{assetType}}'",
- "filter-type-asset-type-and-name-description": "Activos del tipo '{{assetType}}' y su nombre empieza con '{{prefix}}'",
- "filter-type-device-type": "Tipo de dispositivo",
- "filter-type-device-type-description": "Dispositivos de tipo '{{deviceType}}'",
- "filter-type-device-type-and-name-description": "Dispositivos del tipo '{{deviceType}}' y su nombre empieza con '{{prefix}}'",
- "filter-type-entity-view-type": "Tipo de vista de entidad",
- "filter-type-entity-view-type-description": "Vista de entidad del tipo '{{entityView}}'",
- "filter-type-entity-view-type-and-name-description": "Las vista de entidad del tipo '{{entityView}}' y cuyo nombre comienza con '{{prefix}}'",
- "filter-type-relations-query": "Consulta de relaciones",
- "filter-type-relations-query-description": "{{entities}} que tienen {{relationType}} relación {{direction}} {{rootEntity}}",
- "filter-type-asset-search-query": "Consultar búsqueda de activos",
- "filter-type-asset-search-query-description": "Activos con tipos {{assetTypes}} que tienen {{relationType}} relación {{direction}} {{rootEntity}}",
- "filter-type-device-search-query": "Consultar búqueda de dispositivos",
- "filter-type-device-search-query-description": "Dispositivos con tipos {{deviceTypes}} que tienen {{relationType}} relación {{direction}} {{rootEntity}}",
- "filter-type-entity-view-search-query": "Consultar vista de entidad",
- "filter-type-entity-view-search-query-description": "Las vista de entidad de tipo {{entityViewTypes}} que tienen {{relationType}} relación {{direction}} {{rootEntity}}",
- "entity-filter": "Filtro de entidad",
- "resolve-multiple": "Resolver como entidades múltiples",
- "filter-type": "Tipo de filtro",
- "filter-type-required": "Tipo de filtro es requerido.",
- "entity-filter-no-entity-matched": "No se encontraron entidades que coincidan con el filtro especificado.",
- "no-entity-filter-specified": "No se especificó el filtro de entidad",
- "root-state-entity": "Utilizar la entidad del panel de estados como raíz",
- "root-entity": "Entidad raíz",
- "state-entity-parameter-name": "Nombre de parámetro de entidad de estado",
- "default-state-entity": "Entidad de estado predeterminada",
- "default-entity-parameter-name": "Por defecto",
- "max-relation-level": "Nivel máximo de relación",
- "unlimited-level": "Nivel ilimitado",
- "state-entity": "Entidad del panel de estados",
- "all-entities": "Todas las entidades",
- "any-relation": "alguna"
- },
- "asset": {
- "asset": "Activo",
- "assets": "Activos",
- "management": "Gestión de activos",
- "view-assets": "Ver activos",
- "add": "Agregar activo",
- "assign-to-customer": "Asignar al cliente",
- "assign-asset-to-customer": "Asignar activo(s) al cliente",
- "assign-asset-to-customer-text": "Por favor, seleccione los activos para asignar al cliente",
- "no-assets-text": "No se encontraron activos",
- "assign-to-customer-text": "Por favor, seleccione el cliente para asignar el(los) activo(s)",
- "public": "Público",
- "assignedToCustomer": "Asignado al cliente",
- "make-public": "Hacer público el activo",
- "make-private": "Hacer privado el activo",
- "unassign-from-customer": "Anular asignación del cliente",
- "delete": "Eliminar activo",
- "asset-public": "El activo es público",
- "asset-type": "Tipo de activo",
- "asset-type-required": "El tipo de activo es requerido.",
- "select-asset-type": "Seleccionar tipo de activo",
- "enter-asset-type": "Introduzca el tipo de activo",
- "any-asset": "Algún activo",
- "no-asset-types-matching": "No se encontraron tipos de activos que coincidan con '{{entitySubtype}}'.",
- "asset-type-list-empty": "No se seleccionaron tipos de activos.",
- "asset-types": "Tipos de activos",
- "name": "Nombre",
- "name-required": "El nombre es requerido.",
- "description": "Descripción",
- "type": "Tipo",
- "type-required": "El tipo es requerido.",
- "details": "Detalles",
- "events": "Eventos",
- "add-asset-text": "Agregar nuevo activo",
- "asset-details": "Detalles del activo",
- "assign-assets": "Asignar activos",
- "assign-assets-text": "Asignar { count, plural, 1 {1 activo} other {# activos} } al cliente",
- "delete-assets": "Eliminar activos",
- "unassign-assets": "Anular asignación de activos",
- "unassign-assets-action-title": "Anular asignación { count, plural, 1 {1 activo} other {# activos} } del cliente",
- "assign-new-asset": "Asignar nuevo activo",
- "delete-asset-title": "¿Está seguro de que desea eliminar el activo '{{assetName}}'?",
- "delete-asset-text": "¡Cuidado! Después de la confirmación, el activo y todos los datos relacionados serán irrecuperables.",
- "delete-assets-title": "¿Está seguro de que desea eliminar { count, plural, 1 {1 activos} other {# activos} }?",
- "delete-assets-action-title": "Eliminar { count, plural, 1 {1 activo} other {# activos} }",
- "delete-assets-text": "¡Cuidado! Después de la confirmación se eliminarán todos los activos seleccionados y todos los datos relacionados serán irrecuperables.",
- "make-public-asset-title": "¿Está seguro de que desea que el activo '{{assetName}}' sea público?",
- "make-public-asset-text": "Después de la confirmación, el activo y todos sus datos se harán públicos y accesibles por otros.",
- "make-private-asset-title": "¿Está seguro de que desea que el activo '{{assetName}}' sea privado?",
- "make-private-asset-text": "Después de la confirmación, el activo y todos sus datos se harán privados y no serán accesibles para otros",
- "unassign-asset-title": "¿Está seguro de que desea anular asignación del activo '{{assetName}}'?",
- "unassign-asset-text": "Después de la confirmación, se anulará asignación del activo y no será accesible por el cliente.",
- "unassign-asset": "Anular asignación activo",
- "unassign-assets-title": "¿Está seguro de que desea anular asignación { count, plural, 1 {1 activo} other {# activos} }?",
- "unassign-assets-text": "Después de la confirmación, se anulará asignación de todos los activos seleccionados y no serán accesibles por el cliente",
- "copyId": "Copiar ID del activo",
- "idCopiedMessage": "ID del activo has sido copiada al portapapeles",
- "select-asset": "Seleccionar activo",
- "no-assets-matching": "No se encontraron activos que coincidan con '{{entity}}'.",
- "asset-required": "El activo es requerido",
- "name-starts-with": "El nombre del activo comienza con",
- "import": "Importar activos",
- "asset-file": "Archivo del activo",
- "label": "Etiqueta"
- },
- "attribute": {
- "attributes": "Atributos",
- "latest-telemetry": "Última telemetría",
- "attributes-scope": "Alcance de los atributos de la entidad",
- "scope-latest-telemetry": "Última telemetría",
- "scope-client": "Atributos del cliente",
- "scope-server": "Atributos del servidor",
- "scope-shared": "Atributos compartidos",
- "add": "Agregar atributos",
- "key": "Clave",
- "last-update-time": "Hora de la última actualización",
- "key-required": "La clave del aributo es requerida.",
- "value": "Valor",
- "value-required": "Valor del atributo es requerido.",
- "delete-attributes-title": "¿Está seguro de que desea eliminar { count, plural, 1 {1 atributo} other {# atributos} }?",
- "delete-attributes-text": "¡Cuidado! Después de la confirmación, se eliminarán todos los atributos seleccionados.",
- "delete-attributes": "Eliminar atributos",
- "enter-attribute-value": "Introduzca el valor del atributo",
- "show-on-widget": "Mostrar en widget",
- "widget-mode": "Modo widget",
- "next-widget": "Widget siguiente",
- "prev-widget": "Widget previo",
- "add-to-dashboard": "Agregar al panel",
- "add-widget-to-dashboard": "Agregar widget al panel",
- "selected-attributes": "{ count, plural, 1 {1 atributo} other {# atributos} } seleccionados",
- "selected-telemetry": "{ count, plural, 1 {1 telemetry unit} other {# telemetry units} } seleccionadas"
- },
- "audit-log": {
- "audit": "Auditoría",
- "audit-logs": "Registros de auditoría",
- "timestamp": "Marca de tiempo",
- "entity-type": "Tipo de entidad",
- "entity-name": "Nombre de entidad",
- "user": "Usuario",
- "type": "Tipo",
- "status": "Estado",
- "details": "Detalles",
- "type-added": "Agregado",
- "type-deleted": "Eliminado",
- "type-updated": "Actualizado",
- "type-attributes-updated": "Atributos actualizados",
- "type-attributes-deleted": "Atributos eliminados",
- "type-rpc-call": "Llamada RPC",
- "type-credentials-updated": "Credenciales actualizadas",
- "type-assigned-to-customer": "Asignado al cliente",
- "type-unassigned-from-customer": "Asignación anulada del cliente",
- "type-activated": "Activado",
- "type-suspended": "Suspendido",
- "type-credentials-read": "Credenciales leídas",
- "type-attributes-read": "Atributos leídos",
- "type-relation-add-or-update": "Relación actualizada",
- "type-relation-delete": "Relación eliminada",
- "type-relations-delete": "Toda relación eliminada",
- "type-alarm-ack": "Reconocida",
- "type-alarm-clear": "Borrada",
- "type-login": "Inicio de sesión",
- "type-logout": "Cierre de sesión",
- "type-lockout": "Cierre patronal",
- "status-success": "Correcto",
- "status-failure": "Erróneo",
- "audit-log-details": "Detalle del registro de auditoría",
- "no-audit-logs-prompt": "No se encontraron registros",
- "action-data": "Datos de acción",
- "failure-details": "Detalles del error",
- "search": "Buscar registros de auditoría",
- "clear-search": "Borrar búsqueda"
- },
- "confirm-on-exit": {
- "message": "Tiene cambios sin guardar. ¿Está seguro de que desea salir de esta página?",
- "html-message": "Tiene cambios sin guardar.
¿Está seguro de que desea salir de esta página?",
- "title": "Cambios sin guardar"
- },
- "contact": {
- "country": "País",
- "city": "Ciudad",
- "state": "Estado / Provincia",
- "postal-code": "Código Postal",
- "postal-code-invalid": "Formato de código postal inválido.",
- "address": "Dirección",
- "address2": "Dirección 2",
- "phone": "Teléfono",
- "email": "Correo Electrónico",
- "no-address": "Sin dirección"
- },
- "common": {
- "username": "Nombre de usuario",
- "password": "Contraseña",
- "enter-username": "Introduzca nombre de usuario",
- "enter-password": "Introduzca contraseña",
- "enter-search": "Introduzca búsqueda"
- },
- "content-type": {
- "json": "Json",
- "text": "Texto",
- "binary": "Binario (Base64)"
- },
- "customer": {
- "customer": "Cliente",
- "customers": "Clientes",
- "management": "Gestión del cliente",
- "dashboard": "Panel del cliente",
- "dashboards": "Paneles del cliente",
- "devices": "Dispositivos del cliente",
- "entity-views": "Vistas de entidad del cliente",
- "assets": "Activos del Cliente",
- "public-dashboards": "Paneles públicos",
- "public-devices": "Dispositivos públicos",
- "public-assets": "Activos públicos",
- "public-entity-views": "Vista de entidad públicas",
- "add": "Agregar cliente",
- "delete": "Eliminar cliente",
- "manage-customer-users": "Gestionar usuarios del cliente",
- "manage-customer-devices": "Gestionar dispositivos del cliente",
- "manage-customer-dashboards": "Gestionar paneles del cliente",
- "manage-public-devices": "Gestionar dispositivos públicos",
- "manage-public-dashboards": "Gestionar paneles públicos",
- "manage-customer-assets": "Gestionar activos del cliente",
- "manage-public-assets": "Gestionar activos públicos",
- "add-customer-text": "Agregar nuevo cliente",
- "no-customers-text": "No se encontraron clientes",
- "customer-details": "Detalles del cliente",
- "delete-customer-title": "¿Está seguro de que desea eliminar al cliente '{{customerTitle}}'?",
- "delete-customer-text": "¡Cuidado! Después de la confirmación, el cliente y todos los datos relacionados serán irrecuperables.",
- "delete-customers-title": "¿Está seguro de que desea eliminar { count, plural, 1 {1 cliente} other {# clientes} }?",
- "delete-customers-action-title": "Eliminar { count, plural, 1 {1 cliente} other {# clientes} }",
- "delete-customers-text": "¡Cuidado! Después de la confirmación, todos los clientes seleccionados serán eliminados y todos los datos relacionados serán irrecuperables.",
- "manage-users": "Gestionar usuarios",
- "manage-assets": "Gestionar activos",
- "manage-devices": "Gestionar dispositivos",
- "manage-dashboards": "Gestionar paneles",
- "title": "Título",
- "title-required": "El título es requerido.",
- "description": "Descripción",
- "details": "Detalles",
- "events": "Eventos",
- "copyId": "Copiar ID del cliente",
- "idCopiedMessage": "ID del cliente ha sido copiada al portapapeles",
- "select-customer": "Seleccionar cliente",
- "no-customers-matching": "No se encontraron clientes que coincidan con '{{entity}}'.",
- "customer-required": "El cliente es requerido",
- "select-default-customer": "Seleccionar cliente predeterminado",
- "default-customer": "Cliente predeterminado",
- "default-customer-required": "Cliente predeterminado es requerido para depurar el panel en el nivel Organización"
- },
- "datetime": {
- "date-from": "Fecha desde",
- "time-from": "Tiempo desde",
- "date-to": "Fecha hasta",
- "time-to": "Tiempo hasta"
- },
- "dashboard": {
- "dashboard": "Panel",
- "dashboards": "Paneles",
- "management": "Gestión del panel",
- "view-dashboards": "Ver panel",
- "add": "Agregar paneles",
- "assign-dashboard-to-customer": "Asignar panel(es) al cliente",
- "assign-dashboard-to-customer-text": "Por favor selecciona los paneles para asignar al cliente",
- "assign-to-customer-text": "Por favor selecciona el cliente para asignar el(los) panel(es)",
- "assign-to-customer": "Asignar al cliente",
- "unassign-from-customer": "Anular asignación del cliente",
- "make-public": "Hacer panel público",
- "make-private": "Hacer panel privado",
- "manage-assigned-customers": "Gestionar clientes asignados",
- "assigned-customers": "Clientes asignados",
- "assign-to-customers": "Asignar panel(es) al(los) cliente(s)",
- "assign-to-customers-text": "Por favor seleccionar los clientes para asignar el(los) panel(es)",
- "unassign-from-customers": "Anular asignación del(de los) panel(es) de los clientes",
- "unassign-from-customers-text": "Por favor selecciona los clientes para anular asignación del(de los) panel(es)",
- "no-dashboards-text": "No se encontraron paneles",
- "no-widgets": "Sin widgets configurados",
- "add-widget": "Agregar nuevo widget",
- "title": "Título",
- "select-widget-title": "Seleccionar widget",
- "select-widget-subtitle": "Lista de tipos de widget disponibles",
- "delete": "Eliminar panel",
- "title-required": "El título es requerido.",
- "description": "Descripción",
- "details": "Detalles",
- "dashboard-details": "Detalles del panel",
- "add-dashboard-text": "Agregar nuevo panel",
- "assign-dashboards": "Asignar paneles",
- "assign-new-dashboard": "Asignar nuevo panel",
- "assign-dashboards-text": "Asignar { count, plural, 1 {1 panel} other {# paneles} } a los clientes",
- "unassign-dashboards-action-text": "Anular asignación { count, plural, 1 {1 dashboard} other {# dashboards} } de los clientes",
- "delete-dashboards": "Eliminar paneles",
- "unassign-dashboards": "Anular asignación de paneles",
- "unassign-dashboards-action-title": "Anular asignación { count, plural, 1 {1 panel} other {# paneles} } del cliente",
- "delete-dashboard-title": "¿Está seguro de que desea eliminar el panel '{{dashboardTitle}}'?",
- "delete-dashboard-text": "¡Cuidado! Después de la confirmación, el panel y todos los datos relacionados serán irrecuperables.",
- "delete-dashboards-title": "¿Está seguro de que desea eliminar { count, plural, 1 {1 dashboard} other {# dashboards} }?",
- "delete-dashboards-action-title": "Eliminar { count, plural, 1 {1 dashboard} other {# dashboards} }",
- "delete-dashboards-text": "¡Cuidado! Después de la confirmación, todos los paneles seleccionados serán eliminados y todos los datos relacionados serán irrecuperables.",
- "unassign-dashboard-title": "¿Está seguro de que desea anular la asignación del panel '{{dashboardTitle}}'?",
- "unassign-dashboard-text": "Después de la confirmación, se anulará la asignación del panel y no será accesible por el cliente.",
- "unassign-dashboard": "Anular asignación del panel",
- "unassign-dashboards-title": "¿Está seguro de que desea anular asignación { count, plural, 1 {1 panel} other {# paneles} }?",
- "unassign-dashboards-text": "Después de la confirmación, se anulará la asignación de todos los paneles seleccionados y no serán accesibles por el cliente.",
- "public-dashboard-title": "El panel es ahora público",
- "public-dashboard-text": "Su panel {{dashboardTitle}} es ahora público y es accesible a través del siguiente enlace público :",
- "public-dashboard-notice": "Nota No olvide hacer públicos los dispositivos relacionados para acceder a sus datos.",
- "make-private-dashboard-title": "¿Está seguro de que desea hacer el panel '{{dashboardTitle}}' privado?",
- "make-private-dashboard-text": "Después de la confirmación el panel se hará privado y no será accesible por otros.",
- "make-private-dashboard": "Hacer el panel privado",
- "socialshare-text": "'{{dashboardTitle}}' desarrollado por ThingsBoard.",
- "socialshare-title": "'{{dashboardTitle}}' desarrollado por ThingsBoard",
- "select-dashboard": "Seleccionar panel",
- "no-dashboards-matching": "Paneles que coincidan con '{{entity}}' no fueron encontrados.",
- "dashboard-required": "Panel es requerido.",
- "select-existing": "Seleccionar panel existente",
- "create-new": "Crear nuevo panel",
- "new-dashboard-title": "Nuevo título de panel",
- "open-dashboard": "Abrir panel",
- "set-background": "Definir fondo",
- "background-color": "Color de fondo",
- "background-image": "Imagen de fondo",
- "background-size-mode": "Modo de tamaño de fondo",
- "no-image": "Ninguna imagen seleccionada",
- "drop-image": "Colocar una imagen o hacer clic para seleccionar un archivo para cargar.",
- "settings": "Configuración",
- "columns-count": "Número de columnas",
- "columns-count-required": "Número de columnas es requerido.",
- "min-columns-count-message": "Solo está permitido 10 columnas como mínimo.",
- "max-columns-count-message": "Sólo está permitido 1000 columnas como máximo.",
- "widgets-margins": "Margen entre widgets",
- "horizontal-margin": "Margen horizontal",
- "horizontal-margin-required": "El valor del margen horizontal es requerido.",
- "min-horizontal-margin-message": "Sólo está permitido el 0 como valor mínimo para el margen horizontal",
- "max-horizontal-margin-message": "Sólo está permitido el 50 como valor máximo para el margen horizontal",
- "vertical-margin": "Margen vertical",
- "vertical-margin-required": "El valor del margen vertical es requerido.",
- "min-vertical-margin-message": "Sólo está permitido el 0 como valor mínimo para el margen vertical.",
- "max-vertical-margin-message": "Solo está permitido el 50 como valor máximo para el margen vertical",
- "autofill-height": "Llenado automático de altura de diseño",
- "mobile-layout": "Configuración de diseño para móvil",
- "mobile-row-height": "Altura de fila para móvil, píxel",
- "mobile-row-height-required": "Altura de fila para móvil es requerida.",
- "min-mobile-row-height-message": "Sólo está permitido 5 píxeles como valor mínimo en la altura de fila para móvil.",
- "max-mobile-row-height-message": "Sólo está permitido 200 píxeles como valor máximo en la altura de fila para móvil.",
- "display-title": "Mostrar título del panel",
- "toolbar-always-open": "Mantener la barra de herramientas abierta",
- "title-color": "Color del título",
- "display-dashboards-selection": "Mostrar selección del panel",
- "display-entities-selection": "Mostrar selección de entidades",
- "display-dashboard-timewindow": "Mostrar ventana de tiempo",
- "display-dashboard-export": "Mostrar exportar",
- "import": "Importar panel",
- "export": "Exportar panel",
- "export-failed-error": "No se puede exportar el panel: {{error}}",
- "create-new-dashboard": "Crear nuevo panel",
- "dashboard-file": "Archivo del panel",
- "invalid-dashboard-file-error": "No se puede importar el panel: estructura de datos del panel no es válida.",
- "dashboard-import-missing-aliases-title": "Configurar los alias utilizados por el panel importado",
- "create-new-widget": "Crear nuevo widget",
- "import-widget": "Importar widget",
- "widget-file": "Archivo del widget",
- "invalid-widget-file-error": "No se puede importar el widget: estructura de datos del widger no es válida.",
- "widget-import-missing-aliases-title": "Configurar los alias utilizados por el widget importado",
- "open-toolbar": "Abrir barra de herramientas del panel",
- "close-toolbar": "Cerrar barra de herramientas",
- "configuration-error": "Error de configuración",
- "alias-resolution-error-title": "Error de configuración de los alias del panel",
- "invalid-aliases-config": "No se puede encontrar algún dispositivo que coincida con algunos alias del filtro.
Por favor, contacte a su administrador para resolver este problema.",
- "select-devices": "Seleccionar dispositivos",
- "assignedToCustomer": "Asignado al cliente",
- "assignedToCustomers": "Asignado a los clientes",
- "public": "Público",
- "public-link": "Enlace público",
- "copy-public-link": "Copiar enlace público",
- "public-link-copied-message": "El enlace público del panel ha sido copiado al portapapeles",
- "manage-states": "Gestionar estados del panel",
- "states": "Estados del panel",
- "search-states": "Buscar estados del panel",
- "selected-states": "{ count, plural, 1 {1 estado del panel } other {# estados del panel } } seleccionados",
- "edit-state": "Editar estado del panel",
- "delete-state": "Eliminar estado del panel",
- "add-state": "Agregar estado del panel",
- "state": "Estado del panel",
- "state-name": "Nombre",
- "state-name-required": "El nombre del estado del panel es requerido.",
- "state-id": "ID del estado",
- "state-id-required": "ID del estado del panel es requerida.",
- "state-id-exists": "Ya existe el estado del panel con el mismo ID.",
- "is-root-state": "Estado raíz",
- "delete-state-title": "Eliminar estado del panel",
- "delete-state-text": "¿Está seguro de que desea eliminar el estado del panel con el nombre '{{stateName}}'?",
- "show-details": "Mostrar detalles",
- "hide-details": "Ocultar detalles",
- "select-state": "Seleccionar estado objetivo",
- "state-controller": "Estado del controlador"
- },
- "datakey": {
- "settings": "Configuración",
- "advanced": "Avanzado",
- "label": "Etiqueta",
- "color": "Color",
- "units": "Símbolo especial para mostrar al lado del valor",
- "decimals": "Número de dígitos después del punto flotante",
- "data-generation-func": "Función de generación de datos",
- "use-data-post-processing-func": "Usar la función de post-procesamiento de datos",
- "configuration": "Configuración de clave de datos",
- "timeseries": "Series temporales",
- "attributes": "Atributos",
- "alarm": "Campos de alarma",
- "timeseries-required": "Series temporales de la entidad son requeridas",
- "timeseries-or-attributes-required": "Series temporales/atributos de la entidad son requeridos.",
- "maximum-timeseries-or-attributes": "Máximo { count, plural, 1 {1 serie temporal/atributo permitido.} other {# series temporales/atributos permitidos} }",
- "alarm-fields-required": "Campos de alarma son requeridos.",
- "function-types": "Tipos de funciones",
- "function-types-required": "Tipos de funciones son requeridos.",
- "maximum-function-types": "Máximo { count, plural, 1 {1 function type is allowed.} other {# function types are allowed} }",
- "time-description": "marca de tiempo del valor actual;",
- "value-description": "el valor actual;",
- "prev-value-description": "resultado de la llamada a la función anterior;",
- "time-prev-description": "marca de tiempo del valor anterior;",
- "prev-orig-value-description": "valor anterior original;"
- },
- "datasource": {
- "type": "Tipo de fuente de datos",
- "name": "Nombre",
- "add-datasource-prompt": "Por favor agregue fuente de datos"
- },
- "details": {
- "edit-mode": "Modo de edición",
- "toggle-edit-mode": "Cambiar modo de edición"
- },
- "device": {
- "device": "Dispositivo",
- "device-required": "Dispositivo es requerido.",
- "devices": "Dispositivos",
- "management": "Gestión del dispositivo",
- "view-devices": "Ver dispositivos",
- "device-alias": "Alias del dispositivo",
- "aliases": "Alias de los dispositivos",
- "no-alias-matching": "'{{alias}}' no encontrado.",
- "no-aliases-found": "No se encontraron alias.",
- "no-key-matching": "'{{key}}' no encontrado.",
- "no-keys-found": "Claves no encontradas.",
- "create-new-alias": "¡Crear uno nuevo!",
- "create-new-key": "¡Crear una nueva!",
- "duplicate-alias-error": "Alias duplicado encontrado '{{alias}}'.
Los alias del dispositivo deben ser únicos dentro del panel.",
- "configure-alias": "Configurar '{{alias}}' alias",
- "no-devices-matching": "Dispositivos que coincidan con '{{entity}}' no fueron encontrados.",
- "alias": "Alias",
- "alias-required": "Alias del dispositivo es requerido.",
- "remove-alias": "Eliminar alias del dispositivo",
- "add-alias": "Agregar alias del dispositivo",
- "name-starts-with": "El nombre del dispositivo comienza con",
- "device-list": "Lista de dispositivos",
- "use-device-name-filter": "Utilizar filtro",
- "device-list-empty": "Ningún dispositivo seleccionado.",
- "device-name-filter-required": "Filtro de nombre de dispositivo es requerido.",
- "device-name-filter-no-device-matched": "Dispositivos que comienzan con '{{device}}' no fueron encontrados.",
- "add": "Agregar Dispositivo",
- "assign-to-customer": "Asignar al cliente",
- "assign-device-to-customer": "Asignar Dispositivo(s) Al Cliente",
- "assign-device-to-customer-text": "Por favor selecciona los dispositivos para asignar al cliente",
- "make-public": "Hacer público el dispositivo",
- "make-private": "Hacer privado el dispositivo",
- "no-devices-text": "No se encontraron dispositivos",
- "assign-to-customer-text": "Por favor seleccionar el cliente para asignar el(los) dispositivo(s)",
- "device-details": "Detalles del dispositivo",
- "add-device-text": "Agregar nuevo dispositivo",
- "credentials": "Credenciales",
- "manage-credentials": "Gestionar credenciales",
- "delete": "Eliminar dispositivo",
- "assign-devices": "Asignar dispositivos",
- "assign-devices-text": "Asignar { count, plural, 1 {1 dispositivo} other {# dispositivos} } al cliente",
- "delete-devices": "Eliminar dispositivos",
- "unassign-from-customer": "Anular asignación del cliente",
- "unassign-devices": "Desasignar dispositivos",
- "unassign-devices-action-title": "Anular asignación { count, plural, 1 {1 dispositivo} other {# dispositivos} } del cliente",
- "assign-new-device": "Asignar nuevo dispositivo",
- "make-public-device-title": "¿Está seguro de que desea hacer el dispositivo '{{deviceName}}' público?",
- "make-public-device-text": "Después de la confirmación, el dispositivo y todos sus datos se harán públicos y accesibles por otros.",
- "make-private-device-title": "¿Está seguro de que desea hacer el dispositivo '{{deviceName}}' privado?",
- "make-private-device-text": "Después de la confirmación, el dispositivo y todos sus datos se harán privados y no serán accesibles para otros.",
- "view-credentials": "Ver credenciales",
- "delete-device-title": "¿Está seguro de que desea hacer el dispositivo '{{deviceName}}'?",
- "delete-device-text": "¡Cuidado! Después de la confirmación, el dispositivo y todos sus datos relacionados serán irrecuperables.",
- "delete-devices-title": "¿Está seguro de que desea eliminar { count, plural, 1 {1 dispositivo} other {# dispositivos} }?",
- "delete-devices-action-title": "Eliminar { count, plural, 1 {1 dispositivo} other {# dispositivos} }",
- "delete-devices-text": "¡Cuidado! Después de la confirmación, todos los dispositivos seleccionados serán eliminados y todos los datos relacionados serán irrecuperables.",
- "unassign-device-title": "¿Está seguro de que desea anular la asignación del dispositivo '{{deviceName}}'?",
- "unassign-device-text": "Después de la confirmación, se anulará asignación del dispositivo y no será accesible por el cliente.",
- "unassign-device": "Desasignar dispositivo",
- "unassign-devices-title": "¿Está seguro de que desea desasignar { count, plural, 1 {1 dispositivo } other {# dispositivos} }?",
- "unassign-devices-text": "Después de la confirmación, se anulará asignación de todos los dispositivos seleccionados y no serán accesibles por el cliente.",
- "device-credentials": "Credenciales del dispositivo",
- "credentials-type": "Tipo de credenciales",
- "access-token": "Token de acceso",
- "access-token-required": "Token de acceso es requerido.",
- "access-token-invalid": "La longitud del token de acceso debe ser de 1 a 20 caracteres.",
- "rsa-key": "Clave pública RSA",
- "rsa-key-required": "Clave pública RSA es requerida.",
- "secret": "Secreto",
- "secret-required": "Secreto es requerido.",
- "device-type": "Tipo de dispositivo",
- "device-type-required": "Tipo de dispositivo es requerido.",
- "select-device-type": "Seleccionar tipo de dispositivo",
- "enter-device-type": "Teclee tipo de dispositivo",
- "any-device": "Algún dispositivo",
- "no-device-types-matching": "Tipos de dispositivos que coincidan con '{{entitySubtype}}' no fueron encontrados.",
- "device-type-list-empty": "No se seleccionaron tipos de dispositivos.",
- "device-types": "Tipo de dispositivos",
- "name": "Nombre",
- "name-required": "El nombre es requerido.",
- "label": "Etiqueta",
- "description": "Descripción",
- "events": "Eventos",
- "details": "Detalles",
- "copyId": "Copiar ID del dispositivo",
- "copyAccessToken": "Copiar token de acceso",
- "idCopiedMessage": "ID del dispositivo ha sido copiada al portapapeles",
- "accessTokenCopiedMessage": "Token de acceso al dispositivo ha sido copiado al portapapeles",
- "assignedToCustomer": "Asignado al cliente",
- "unable-delete-device-alias-title": "No se puede eliminar el alias del dispositivo",
- "unable-delete-device-alias-text": "El alias del dispositivo '{{deviceAlias}}' no puede ser eliminado porque es usado por los siguientes widget(s):
{{widgetsList}}",
- "is-gateway": "Es puerta de entrada",
- "public": "Público",
- "device-public": "El dispositivo es público",
- "select-device": "Seleccionar dispositivo",
- "device-file": "Archivo de dispositivo",
- "import": "Importar dispositivo"
- },
- "dialog": {
- "close": "Cerrar diálogo"
- },
- "direction": {
- "column": "Columna",
- "row": "Fila"
- },
- "error": {
- "unable-to-connect": "¡No se puede conectar al servidor! Por favor, revise su conexión a Internet.",
- "unhandled-error-code": "Código de error no controlado: {{errorCode}}",
- "unknown-error": "Error desconocido"
- },
- "entity": {
- "entity": "Entidad",
- "entities": "Entidades",
- "aliases": "Alias de las entidades",
- "entity-alias": "Alias de la entidad",
- "unable-delete-entity-alias-title": "No se puede borrar alias de la entidad",
- "unable-delete-entity-alias-text": "Alias de la entidad '{{entityAlias}}' no se puede eliminar porque es usado por los siguientes widget(s):
{{widgetsList}}",
- "duplicate-alias-error": "Alias duplicado fue encontrado '{{alias}}'.
Alias de las entidades deben ser únicos dentro del panel.",
- "missing-entity-filter-error": "Falta filtro para el alias '{{alias}}'.",
- "configure-alias": "Configurar '{{alias}}' alias",
- "alias": "Alias",
- "alias-required": "Alias de la entidad es requerida.",
- "remove-alias": "Eliminar alias de la entidad",
- "add-alias": "Agregar alias de la entidad",
- "entity-list": "Lista de entidades",
- "entity-type": "Tipo de entidad",
- "entity-types": "Tipos de entidades",
- "entity-type-list": "Lista de tipos de entidades",
- "any-entity": "Alguna entidad",
- "enter-entity-type": "Teclee tipo de entidad",
- "no-entities-matching": "No se encontraron entidades que coincidan con '{{entity}}'.",
- "no-entity-types-matching": "No se encontraron tipos de entidades que coincidan con '{{entityType}}'.",
- "name-starts-with": "El nombre comienza con",
- "use-entity-name-filter": "Utilizar filtro",
- "entity-list-empty": "Entidades no seleccionadas.",
- "entity-type-list-empty": "Tipos de entidades no seleccionados.",
- "entity-name-filter-required": "Filtro del nombre de la entidad es requerido.",
- "entity-name-filter-no-entity-matched": "No se encontraron entidades que comienzan con '{{entity}}'.",
- "all-subtypes": "Todas",
- "select-entities": "Seleccionar entidades",
- "no-aliases-found": "No se encontraron alias.",
- "no-alias-matching": "'{{alias}}' no encontrado.",
- "create-new-alias": "¡Crear uno nuevo!",
- "key": "Clave",
- "key-name": "Nombre de clave",
- "no-keys-found": "No se encontraron claves.",
- "no-key-matching": "'{{key}}' no encontrada.",
- "create-new-key": "¡Crear una nueva!",
- "type": "Tipo",
- "type-required": "Tipo de entidad es requerido.",
- "type-device": "Dispositivo",
- "type-devices": "Dispositivos",
- "list-of-devices": "{ count, plural, 1 {Un dispositivo} other {Lista de # dispositivos} }",
- "device-name-starts-with": "Dispositivos cuyos nombres comienzan con '{{prefix}}'",
- "type-asset": "Activo",
- "type-assets": "Activos",
- "list-of-assets": "{ count, plural, 1 {Un activo} other {Lista de # activos} }",
- "asset-name-starts-with": "Activos cuyos nombres comienzan con '{{prefix}}'",
- "type-entity-view": "Vista de entidad",
- "type-entity-views": "Vistas de entidad",
- "list-of-entity-views": "{ count, plural, 1 {Una vista de entidad} other {Lista de # vistas de entidad} }",
- "entity-view-name-starts-with": "Vistas de entidad cuyos nombres que comienzan con '{{prefix}}'",
- "type-rule": "Regla",
- "type-rules": "Reglas",
- "list-of-rules": "{ count, plural, 1 {Una regla} other {Lista de # reglas} }",
- "rule-name-starts-with": "Reglas cuyos nombres comienzan con '{{prefix}}'",
- "type-plugin": "Complemento",
- "type-plugins": "Complementos",
- "list-of-plugins": "{ count, plural, 1 {Un complemento} other {Lista de # complementos} }",
- "plugin-name-starts-with": "Complementos cuyos nombres comienzan con '{{prefix}}'",
- "type-tenant": "Organización",
- "type-tenants": "Organizaciones",
- "list-of-tenants": "{ count, plural, 1 {Una organización} other {Lista de # organizaciones} }",
- "tenant-name-starts-with": "Organizaciones cuyos nombres comienzan con '{{prefix}}'",
- "type-customer": "Cliente",
- "type-customers": "Clientes",
- "list-of-customers": "{ count, plural, 1 {Un cliente} other {Lista de # clientes} }",
- "customer-name-starts-with": "Clientes cuyos nombres comienzan con '{{prefix}}'",
- "type-user": "Usuario",
- "type-users": "Usuarios",
- "list-of-users": "{ count, plural, 1 {Un usuario} other {Lista de # usuarios} }",
- "user-name-starts-with": "Usuarios cuyos nombres comienzan con '{{prefix}}'",
- "type-dashboard": "Panel",
- "type-dashboards": "Paneles",
- "list-of-dashboards": "{ count, plural, 1 {One dashboard} other {List of # dashboards} }",
- "dashboard-name-starts-with": "Paneles cuyos nombres comienzan con '{{prefix}}'",
- "type-alarm": "Alarma",
- "type-alarms": "Alarmas",
- "list-of-alarms": "{ count, plural, 1 {Una alarma} other {Lista de # alarmas} }",
- "alarm-name-starts-with": "Alarmas cuyos nombres comienzan con '{{prefix}}'",
- "type-rulechain": "Cadena de reglas",
- "type-rulechains": "Cadenas de reglas",
- "list-of-rulechains": "{ count, plural, 1 {Una cadena de reglas} other {Lista de # cadenas de reglas} }",
- "rulechain-name-starts-with": "Cadenas de reglas cuyos nombres comienzan con '{{prefix}}'",
- "type-rulenode": "Nodo de reglas",
- "type-rulenodes": "Nodos de reglas",
- "list-of-rulenodes": "{ count, plural, 1 {Un nodo de reglas} other {Lista de # nodos de reglas} }",
- "rulenode-name-starts-with": "Nodos de reglas cuyos nombres comienzan con '{{prefix}}'",
- "type-current-customer": "Cliente Actual",
- "search": "Buscar entidades",
- "selected-entities": "{ count, plural, 1 {1 entidad} other {# entidades} } seleccionadas",
- "entity-name": "Nombre de la entidad",
- "details": "Detalles de la entidad",
- "no-entities-prompt": "Entidades no encontradas",
- "no-data": "No hay datos para mostrar",
- "columns-to-display": "Columnas a mostrar"
- },
- "entity-field": {
- "created-time": "Tiempo de creación",
- "name": "Nombre",
- "type": "Tipo",
- "first-name": "Nombre",
- "last-name": "Apellido",
- "email": "Correo electrónico",
- "title": "Título",
- "country": "País",
- "state": "Estado",
- "city": "Ciudad",
- "address": "Dirección",
- "address2": "Dirección 2",
- "zip": "Código postal",
- "phone": "Teléfono"
- },
- "entity-view": {
- "entity-view": "Vista de entidad",
- "entity-view-required": "Vista de entidad es requerido.",
- "entity-views": "Vistas de entidad",
- "management": "Gestión de vistas de entidad",
- "view-entity-views": "Ver vista de entidad",
- "entity-view-alias": "Alias de vista de entidad",
- "aliases": "Alias de vista de entidad",
- "no-alias-matching": "'{{alias}}' no encontrado.",
- "no-aliases-found": "No se encontraron alias.",
- "no-key-matching": "'{{key}}' no encontrado.",
- "no-keys-found": "No se encontraron claves.",
- "create-new-alias": "¡Crear un nuevo!",
- "create-new-key": "¡Crear una nueva!",
- "duplicate-alias-error": "Alias duplicado'{{alias}}'.
Los alias de Entity View deben ser únicos en el panel.",
- "configure-alias": "Configurar alias '{{alias}}'",
- "no-entity-views-matching": "No se encontraron vistas que coincidan con '{{entity}}'.",
- "alias": "Alias",
- "alias-required": "Alias de vista de entidad es requerido.",
- "remove-alias": "Borrar alias de la vista de entidad",
- "add-alias": "Añadir alias a la vista de entidad",
- "name-starts-with": "Nombre de vista de entidad comienza con",
- "entity-view-list": "Lista de vistas de entidad",
- "use-entity-view-name-filter": "Usar el filtro",
- "entity-view-list-empty": "No hay vistas de entidad seleccionadas.",
- "entity-view-name-filter-required": "Nombre del filtro de vista de entidad es requerido.",
- "entity-view-name-filter-no-entity-view-matched": "No se encontraron vistas de entidad que comiencen con '{{entityView}}'.",
- "add": "Añadir vista de entidad",
- "assign-to-customer": "Asignar a cliente",
- "assign-entity-view-to-customer": "Asignar vista de entidad a cliente",
- "assign-entity-view-to-customer-text": "Por favor, seleccione las vistas de entidad para asignar al cliente",
- "no-entity-views-text": "No se encontraron vistas de entidad",
- "assign-to-customer-text": "Por favor, seleccione el cliente para asignar la vista de entidad",
- "entity-view-details": "Detalles de la vista de entidad",
- "add-entity-view-text": "Añadir nueva vista de entidad",
- "delete": "Borrar vista de entidad",
- "assign-entity-views": "Asignar vistas de entidad",
- "assign-entity-views-text": "Asignar { count, plural, 1 {1 vista de entidad} other {# vistas de entidad} } a cliente",
- "delete-entity-views": "Borrar vistas de entidad",
- "unassign-from-customer": "Anular asignación a cliente",
- "unassign-entity-views": "Anular asignación de vistas de entidad",
- "unassign-entity-views-action-title": "Anular asignación { count, plural, 1 {1 vista de entidad} other {# vistas de entidad} } al cliente",
- "assign-new-entity-view": "Asignar nueva vista de entidad",
- "delete-entity-view-title": "¿Está seguro que quiere borrar la vista de entidad '{{entityViewName}}'?",
- "delete-entity-view-text": "¡Cuidado! Después de la confirmación, la vista de la entidad y todos los datos relacionados serán irrecuperables.",
- "delete-entity-views-title": "¿Está seguro que quiere borrar las vistas de entidad { count, plural, 1 {1 entityView} other {# entityViews} }?",
- "delete-entity-views-action-title": "Borrar { count, plural, 1 {1 vista de entidad} other {# vistas de entidad} }",
- "delete-entity-views-text": "¡Cuidado! Después de la confirmación, todas las vistas de entidades seleccionadas se eliminarán y todos los datos relacionados serán irrecuperables.",
- "unassign-entity-view-title": "¿Está seguro que quiere anular la asignación de la vista de entidad '{{entityViewName}}'?",
- "unassign-entity-view-text": "Después de la confirmación, la vista de la entidad quedará sin asignar y el cliente no podrá acceder a ella.",
- "unassign-entity-view": "Anular asignación de la vista de entidad",
- "unassign-entity-views-title": "¿Está seguro que quiere anular la asignación de { count, plural, 1 {1 vista de entidad} other {# vistas de entidad} }?",
- "unassign-entity-views-text": "Después de la confirmación, todas las vistas de entidades seleccionadas quedarán sin asignar y el cliente no podrá acceder a ellas.",
- "entity-view-type": "Tipo de vista de entidad",
- "entity-view-type-required": "Tipo de vista de entidad es requerido.",
- "select-entity-view-type": "Seleccione el tipo de vista de entidad",
- "enter-entity-view-type": "Teclee el tipo de vista de entidad",
- "any-entity-view": "Cualquier vista de entidad",
- "no-entity-view-types-matching": "No se encontraron tipos de vista de entidad que coincidan con '{{entitySubtype}}'.",
- "entity-view-type-list-empty": "No hay tipos de vista de entidad seleccionados.",
- "entity-view-types": "Tipos de vista de entidad",
- "name": "Nombre",
- "name-required": "Nombre es requerido.",
- "description": "Descripción",
- "events": "Eventos",
- "details": "Detalles",
- "copyId": "Copiar el Id de la vista de entidad",
- "assignedToCustomer": "Asignado a cliente",
- "unable-entity-view-device-alias-title": "No se puede eliminar el alias de vista de entidad",
- "unable-entity-view-device-alias-text": "El alias del dispositivo '{{entityViewAlias}}' no se puede borrar porque está siendo usado por el widget(s):
{{widgetsList}}",
- "select-entity-view": "Seleccionar vista de entidad",
- "make-public": "Hacer pública la vista de entidad",
- "make-private": "Hacer que la vista de entidad sea privada",
- "start-date": "Fecha de inicio",
- "start-ts": "Tiempo de inicio",
- "end-date": "Fecha de finalización",
- "end-ts": "Tiempo de finalización",
- "date-limits": "Limites de fecha",
- "client-attributes": "Atributos de cliente",
- "shared-attributes": "Atributos compartidos",
- "server-attributes": "Atributos de servidor",
- "timeseries": "Series temporales",
- "client-attributes-placeholder": "Atributos de cliente",
- "shared-attributes-placeholder": "Atributos compartidos",
- "server-attributes-placeholder": "Atributos de servidor",
- "timeseries-placeholder": "Series temporales",
- "target-entity": "Entidad objetivo",
- "attributes-propagation": "Propagación de atributos",
- "attributes-propagation-hint": "La vista de entidad copiará automáticamente los atributos especificados de la entidad de destino cada vez que guarde o actualice esta vista de entidad. Por razones de rendimiento, los atributos de entidad objetivo no se propagan a la vista de entidad en cada cambio de atributo. Puede habilitar la propagación automática configurando el nodo de la regla \"copiar a la vista\" en su cadena de reglas y vincular los mensajes \"Atributos de la publicación\" y \"Atributos actualizados\" al nuevo nodo de la regla.",
- "timeseries-data": "Datos de series temporales",
- "timeseries-data-hint": "Configure las claves de los datos de las series temporales de la entidad de destino que serán accesibles para la vista de la entidad. Los datos de esta serie temporal son de solo lectura.",
- "make-public-entity-view-title": "¿Está seguro de que desea que la vista de entidad '{{entityViewName}}' sea pública?",
- "make-public-entity-view-text": "Después de la confirmación, la vista de la entidad y todos sus datos se harán públicos y accesibles para otros.",
- "make-private-entity-view-title": "¿Está seguro de que desea que la vista de entidad '{{entityViewName}}' sea privada?",
- "make-private-entity-view-text": "Después de la confirmación, la vista de la entidad y todos sus datos se harán privados y no serán accesibles para otros."
- },
- "event": {
- "event-type": "Tipo de evento",
- "type-error": "Error",
- "type-lc-event": "Ciclo de vida del evento",
- "type-stats": "Estadísticas",
- "type-debug-rule-node": "Depurar",
- "type-debug-rule-chain": "Depurar",
- "no-events-prompt": "No se encontraron eventos",
- "error": "Error",
- "alarm": "Alarma",
- "event-time": "Tiempo del evento",
- "server": "Servidor",
- "body": "Cuerpo",
- "method": "Método",
- "type": "Tipo",
- "entity": "Entidad",
- "message-id": "ID del mensaje",
- "message-type": "Tipo de mensaje",
- "data-type": "Tipo de datos",
- "relation-type": "Tipo de relación",
- "metadata": "Metadatos",
- "data": "Datos",
- "event": "Evento",
- "status": "Estado",
- "success": "Correcto",
- "failed": "Erróneo",
- "messages-processed": "Mensajes procesados",
- "errors-occurred": "Errores ocurridos"
- },
- "extension": {
- "extensions": "Extensiones",
- "selected-extensions": "{ count, plural, 1 {1 extensión} other {# extensiones} } seleccionadas",
- "type": "Tipo",
- "key": "Clave",
- "value": "Valor",
- "id": "ID",
- "extension-id": "ID de extensión",
- "extension-type": "Tipo de extensión",
- "transformer-json": "JSON *",
- "unique-id-required": "Ya existe ID de extensión actual.",
- "delete": "Eliminar extensión",
- "add": "Agregar extensión",
- "edit": "Editar extensión",
- "delete-extension-title": "¿Está seguro de que desea eliminar la extensión '{{extensionId}}'?",
- "delete-extension-text": "¡Cuidado! Después de la confirmación, la extensión y todos los datos relacionados serán irrecuperables.",
- "delete-extensions-title": "¿Está seguro de que desea eliminar { count, plural, 1 {1 extensión} other {# extensiones} }?",
- "delete-extensions-text": "¡Cuidado! Después de la confirmación, se eliminarán todas las extensiones seleccionadas.",
- "converters": "Conversores",
- "converter-id": "ID del conversor",
- "configuration": "Configuración",
- "converter-configurations": "Configuraciones del conversor",
- "token": "Token de seguridad",
- "add-converter": "Agregar conversor",
- "add-config": "Agregar configuración del conversor",
- "device-name-expression": "Expresión del nombre del dispositivo",
- "device-type-expression": "Expresión del tipo del dispositivo",
- "custom": "Personalizado",
- "to-double": "Para duplicar",
- "transformer": "Transformador",
- "json-required": "Transformador json es requerido.",
- "json-parse": "No se puede analizar el transformador json.",
- "attributes": "Atributos",
- "add-attribute": "Agregar atributos",
- "add-map": "Agregar elemento de mapeo",
- "timeseries": "Series temporales",
- "add-timeseries": "Agregar series temporales",
- "field-required": "Campo es requerido",
- "brokers": "Agentes",
- "add-broker": "Agregar agente",
- "host": "Host",
- "port": "Puerto",
- "port-range": "El puerto debe estar en un rango desde 1 hasta 65535.",
- "ssl": "SSL",
- "credentials": "Credenciales",
- "username": "Nombre de usuario",
- "password": "Contraseña",
- "retry-interval": "Intervalo de reintento en milisegundos",
- "anonymous": "Anónimo",
- "basic": "Básico",
- "pem": "PEM",
- "ca-cert": "Archivo de certificado CA *",
- "private-key": "Archivo de clave privado *",
- "cert": "Archivo de certificado *",
- "no-file": "Ningún archivo seleccionado.",
- "drop-file": "Colocar un archivo o hacer clic para seleccionar un archivo para cargar.",
- "mapping": "Mapeo",
- "topic-filter": "Filtro de tema",
- "converter-type": "Tipo de conversor",
- "converter-json": "Json",
- "json-name-expression": "Expresión json para nombre del dispositivo",
- "topic-name-expression": "Expresión temática para nombre del dispositivo",
- "json-type-expression": "Expresión json para tipo de dispositivo",
- "topic-type-expression": "Expresión temática para tipo de dispositivo",
- "attribute-key-expression": "Expresión para clave de atributo",
- "attr-json-key-expression": "Expresión json para clave de atributo",
- "attr-topic-key-expression": "Expresión temática para clave de atributo",
- "request-id-expression": "Expresión para solicitud de ID",
- "request-id-json-expression": "Expresión json para solicitud de ID",
- "request-id-topic-expression": "Expresión temática para solicitud de ID",
- "response-topic-expression": "Expresión temática para respuesta",
- "value-expression": "Expresión para valor",
- "topic": "Tema",
- "timeout": "Tiempo de espera en milisegundos",
- "converter-json-required": "Conversor json es requerido.",
- "converter-json-parse": "No se puede analizar el conversor json.",
- "filter-expression": "Expresión para filtro",
- "connect-requests": "Solicitudes de conexión",
- "add-connect-request": "Agregar solicitudes de conexión",
- "disconnect-requests": "Solicitudes de desconexión",
- "add-disconnect-request": "Agregar solicitud de desconexión",
- "attribute-requests": "Solicitudes de atributo",
- "add-attribute-request": "Agregar solicitudes de atributo",
- "attribute-updates": "Actualizaciones de atributo",
- "add-attribute-update": "Agregar actualizaciones de atributo",
- "server-side-rpc": "RPC lado servidor",
- "add-server-side-rpc-request": "Agregar solicitud RPC lado servidor",
- "device-name-filter": "Filtro de nombre de dispositivo",
- "attribute-filter": "Filtro de atributo",
- "method-filter": "Filtro de método",
- "request-topic-expression": "Expresión temática para solicitud",
- "response-timeout": "Tiempo de espera de respuesta en milisegundos",
- "topic-expression": "Expresión temática",
- "client-scope": "Alcance del cliente",
- "add-device": "Agregar dispositivo",
- "opc-server": "Servidores",
- "opc-add-server": "Agregar servidor",
- "opc-add-server-prompt": "Por favor agregar servidor",
- "opc-application-name": "Nombre de aplicación",
- "opc-application-uri": "Aplicación URI",
- "opc-scan-period-in-seconds": "Período de exploración en segundos",
- "opc-security": "Seguridad",
- "opc-identity": "Identidad",
- "opc-keystore": "Repositorio",
- "opc-type": "Tipo",
- "opc-keystore-type": "Tipo",
- "opc-keystore-location": "Ubicación *",
- "opc-keystore-password": "Contraseña",
- "opc-keystore-alias": "Alias",
- "opc-keystore-key-password": "Clave de contraseña",
- "opc-device-node-pattern": "Patrón de nodo de dispositivo",
- "opc-device-name-pattern": "Patrón de nombre de dispositivo",
- "modbus-server": "Servidores/esclavos",
- "modbus-add-server": "Agregar servidor/esclavo",
- "modbus-add-server-prompt": "Por favor agregar servidor/esclavo",
- "modbus-transport": "Transporte",
- "modbus-tcp-reconnect": "Reconexión automática",
- "modbus-rtu-over-tcp": "RTU sobre TCP",
- "modbus-port-name": "Nombre del puerto serial",
- "modbus-encoding": "Codificación",
- "modbus-parity": "Paridad",
- "modbus-baudrate": "Tasa de baudios",
- "modbus-databits": "Bits de datos",
- "modbus-stopbits": "Bits de parada",
- "modbus-databits-range": "Bits de datos deben estar en un rango entre 7 y 8.",
- "modbus-stopbits-range": "Bits de parada deben estar en un rango entre 1 a 2.",
- "modbus-unit-id": "ID de unidad",
- "modbus-unit-id-range": "ID de unidad debe estar en un rango entre 1 a 247.",
- "modbus-device-name": "Nombre del dispositivo",
- "modbus-poll-period": "Período de sondeo (ms)",
- "modbus-attributes-poll-period": "Atributos del período de sondeo (ms)",
- "modbus-timeseries-poll-period": "Período de sondeo de las series temporales (ms)",
- "modbus-poll-period-range": "El período de sondeo debe ser una valor positivo.",
- "modbus-tag": "Etiqueta",
- "modbus-function": "Función",
- "modbus-register-address": "Dirección del registro",
- "modbus-register-address-range": "Dirección del registro debe estar en un rango entre 0 y 65535.",
- "modbus-register-bit-index": "Índice de bit",
- "modbus-register-bit-index-range": "Índice de bit debe estar en un rango entre 0 y 15.",
- "modbus-register-count": "Contador del registro",
- "modbus-register-count-range": "Contador del registro debe ser un valor positivo.",
- "modbus-byte-order": "Orden del byte",
- "sync": {
- "status": "Estado",
- "sync": "Sincronización",
- "not-sync": "No sincronización",
- "last-sync-time": "Ultima hora de sincronización",
- "not-available": "No disponible"
- },
- "export-extensions-configuration": "Exportar configuración de extensiones",
- "import-extensions-configuration": "Importar configuración de extensiones",
- "import-extensions": "Importar extensiones",
- "import-extension": "Importar extensión",
- "export-extension": "Exportar extensión",
- "file": "Archivo de extensiones",
- "invalid-file-error": "Archivo de extensión no válido"
- },
- "fullscreen": {
- "expand": "Expandir a pantalla completa",
- "exit": "Salir de pantalla completa",
- "toggle": "Alternar el modo de pantalla completa",
- "fullscreen": "Pantalla completa"
- },
- "function": {
- "function": "Función"
- },
- "grid": {
- "delete-item-title": "¿Está seguro de que desea eliminar este ítem?",
- "delete-item-text": "¡Cuidado! Después de la confirmación, este ítem y todos los datos relacionados serán irrecuperables.",
- "delete-items-title": "¿Está seguro de que desea eliminar { count, plural, 1 {1 ítem} other {# ítems} }?",
- "delete-items-action-title": "Eliminar { count, plural, 1 {1 ítem} other {# ítems} }",
- "delete-items-text": "¡Cuidado! Después de la confirmación se eliminarán todos los ítems seleccionados y todos los datos relacionados serán irrecuperables.",
- "add-item-text": "Agregar nuevo ítem",
- "no-items-text": "No se encontraron ítems",
- "item-details": "Detalles del ítem",
- "delete-item": "Eliminar ítem",
- "delete-items": "Eliminar ítems",
- "scroll-to-top": "Desplazar al inicio"
- },
- "help": {
- "goto-help-page": "Ir a la página de ayuda"
- },
- "home": {
- "home": "Página principal",
- "profile": "Perfil",
- "logout": "Cerrar sesión",
- "menu": "Menú",
- "avatar": "Avatar",
- "open-user-menu": "Abrir menú de usuario"
- },
- "import": {
- "no-file": "Ningún archivo seleccionado",
- "drop-file": "Suelte un archivo JSON o haga clic para seleccionar un archivo para cargar.",
- "column-value": "Valor",
- "column-title": "Título",
- "column-example": "Datos de ejemplo",
- "drop-file-csv": "Suelte un archivo CSV o haga clic para seleccionar un archivo para cargar.",
- "column-key": "Clave de atributo/telemetría",
- "csv-delimiter": "Delimitador CSV",
- "csv-first-line-header": "La primera línea contiene nombres de columna.",
- "csv-update-data": "Actualizar atributos/telemetría",
- "import-csv-number-columns-error": "Un archivo debe contener al menos dos columnas",
- "import-csv-invalid-format-error": "Formato de archivo inválido. Línea: '{{line}}'",
- "column-type": {
- "access-token": "Token de acceso",
- "client-attribute": "Atributo de cliente",
- "column-type": "Tipo de columna",
- "entity-field": "Campo de entidad",
- "name": "Nombre",
- "server-attribute": "Atributo de servidor",
- "shared-attribute": "Atributo compartido",
- "timeseries": "Series temporales",
- "type": "Tipo"
- },
- "stepper-text": {
- "select-file": "Seleccione un archivo",
- "configuration": "Importar configuración",
- "column-type": "Seleccionar tipo de columnas",
- "creat-entities": "Creando nuevas entidades",
- "done": "Hecho"
- },
- "message": {
- "create-entities": "Se crearon{{count}} nuevas entidades correctamente.",
- "update-entities": "{{count}} entidades se actualizaron correctamente.",
- "error-entities": "Se produjo un error al crear {{count}} entidades."
- }
- },
- "item": {
- "selected": "Seleccionado"
- },
- "js-func": {
- "no-return-error": "La función debe devolver el valor!",
- "return-type-mismatch": "La función debe devolver el valor de '{{type}}' type!",
- "tidy": "Formatear"
- },
- "key-val": {
- "key": "Clave",
- "value": "Valor",
- "remove-entry": "Eliminar entrada",
- "add-entry": "Agregar entrada",
- "no-data": "Ninguna entrada"
- },
- "layout": {
- "layout": "Diseño",
- "manage": "Gestionar diseños",
- "settings": "Configuración de diseño",
- "color": "Color",
- "main": "Principal",
- "right": "Derecha",
- "select": "Seleccionar diseño objetivo"
- },
- "legend": {
- "direction": "Dirección de la leyenda",
- "position": "Posición de la leyenda",
- "show-max": "Mostrar valor máximo",
- "show-min": "Mostrar valor mínimo",
- "show-avg": "Mostrar valor promedio",
- "show-total": "Mostrar valor total",
- "settings": "Configuración de la leyenda",
- "min": "mínimo",
- "max": "máximo",
- "avg": "promedio",
- "total": "total"
- },
- "login": {
- "login": "Iniciar sesión",
- "request-password-reset": "Restablecer contraseña",
- "reset-password": "Restablecer contraseña",
- "create-password": "Crear contraseña",
- "passwords-mismatch-error": "¡Las contraseñas introducidas deben ser iguales!",
- "password-again": "Repita la contraseña de nuevo",
- "sign-in": "Por favor, inicie sesión",
- "username": "Nombre de usuario (correo electrónico)",
- "remember-me": "Recordarme",
- "forgot-password": "¿Olvidó la contraseña?",
- "password-reset": "Restablecer contraseña",
- "new-password": "Nueva contraseña",
- "new-password-again": "Repita la nueva contraseña",
- "password-link-sent-message": "¡El enlace para el restablecer la contraseña fue enviado correctamente!",
- "email": "Correo electrónico",
- "login-with": "Iniciar sesión con {{name}}",
- "or": "o"
- },
- "position": {
- "top": "Superior",
- "bottom": "Inferior",
- "left": "Izquierda",
- "right": "Derecha"
- },
- "profile": {
- "profile": "Perfil",
- "last-login-time": "Último acceso",
- "change-password": "Cambiar contraseña",
- "current-password": "Contraseña actual"
- },
- "relation": {
- "relations": "Relaciones",
- "direction": "Dirección",
- "search-direction": {
- "FROM": "Desde",
- "TO": "Hacia"
- },
- "direction-type": {
- "FROM": "desde",
- "TO": "hacia"
- },
- "from-relations": "Relaciones salientes",
- "to-relations": "Relaciones entrantes",
- "selected-relations": "{ count, plural, 1 {1 relación} other {# relaciones} } selecciondas",
- "type": "Tipo",
- "to-entity-type": "Hacia tipo de entidad",
- "to-entity-name": "Hacia nombre de entidad",
- "from-entity-type": "Desde tipo de entidad",
- "from-entity-name": "Desde nombre de entidad",
- "to-entity": "Hacia entidad",
- "from-entity": "Desde entidad",
- "delete": "Eliminar relación",
- "relation-type": "Tipo de relación",
- "relation-type-required": "Tipo de relación es requerido.",
- "any-relation-type": "Algún tipo",
- "add": "Agregar relación",
- "edit": "Editar relación",
- "delete-to-relation-title": "¿Está seguro de que desea eliminar la relación hacia la entidad '{{entityName}}'?",
- "delete-to-relation-text": "¡Cuidado! Después de la confirmación, la entidad '{{entityName}}' no estará relacionada desde la entidad actual.",
- "delete-to-relations-title": "¿Está seguro de que desea eliminar { count, plural, 1 {1 relación} other {# relaciones} }?",
- "delete-to-relations-text": "¡Cuidado! Después de la confirmación, se eliminarán todas las relaciones seleccionadas y las entidades correspondientes no estarán relacionadas desde la entidad actual.",
- "delete-from-relation-title": "¿Está seguro de que desea eliminar la relación desde la entidad '{{entityName}}'?",
- "delete-from-relation-text": "¡Cuidado! Después de la confirmación, la entidad actual no será relacionada desde la entidad '{{entityName}}'.",
- "delete-from-relations-title": "¿Está seguro de que desea eliminar { count, plural, 1 {1 relación} other {# relaciones} }?",
- "delete-from-relations-text": "¡Cuidado! Después de la confirmación, se eliminarán todas las relaciones seleccionadas y la entidad actual no será relacionada desde las correspondientes entidades.",
- "remove-relation-filter": "Eliminar filtro de relación",
- "add-relation-filter": "Agregar filtro de relación",
- "any-relation": "Alguna relación",
- "relation-filters": "Filtros de relación",
- "additional-info": "Información adicional (JSON)",
- "invalid-additional-info": "No se puede analizar información adicional json."
- },
- "rulechain": {
- "rulechain": "Cadena de reglas",
- "rulechains": "Cadenas de reglas",
- "root": "Raíz",
- "delete": "Eliminar cadena de reglas",
- "name": "Nombre",
- "name-required": "El nombre es requerido.",
- "description": "Descripción",
- "add": "Agregar cadena de reglas",
- "set-root": "Hacer la cadena de reglas raíz",
- "set-root-rulechain-title": "¿Está seguro de que desea hacer la cadena de reglas '{{ruleChainName}}' root?",
- "set-root-rulechain-text": "Después de la confirmación, la cadena de reglas se volverá raíz y manejará todos los mensajes de transporte entrantes.",
- "delete-rulechain-title": "¿Está seguro de que desea eliminar la cadena de reglas '{{ruleChainName}}'?",
- "delete-rulechain-text": "¡Cuidado! Después de la confirmación, la cadena de reglas y todos los datos relacionados serán irrecuperables.",
- "delete-rulechains-title": "¿Está seguro de que desea eliminar { count, plural, 1 {1 cadena de reglas} other {# cadenas de reglas} }?",
- "delete-rulechains-action-title": "Eliminar { count, plural, 1 {1 cadena de reglas} other {# cadenas de reglas} }",
- "delete-rulechains-text": "¡Cuidado! Después de la confirmación se eliminarán todas las cadenas de reglas seleccionadas y todos los datos relacionados serán irrecuperables.",
- "add-rulechain-text": "Agregar nueva cadena de reglas",
- "no-rulechains-text": "Cadenas de reglas no encontradas",
- "rulechain-details": "Detalles de la cadena de reglas",
- "details": "Detalles",
- "events": "Eventos",
- "system": "Sistema",
- "import": "Importar cadena de reglas",
- "export": "Exportar cadena de reglas",
- "export-failed-error": "No se puede exportar la cadena de reglas: {{error}}",
- "create-new-rulechain": "Crear nueva cadena de reglas",
- "rulechain-file": "Archivo de la cadena de reglas",
- "invalid-rulechain-file-error": "No se puede importar la cadena de reglas: Estructura de datos de la cadena de reglas inválida.",
- "copyId": "Copiar ID de la cadena de reglas",
- "idCopiedMessage": "ID de la cadena de reglas ha sido copiada al portapapeles",
- "select-rulechain": "Seleccionar cadena de reglas",
- "no-rulechains-matching": "Cadenas de reglas que coincidan con '{{entity}}' no fueron encontradas.",
- "rulechain-required": "Cadena de reglas es requerida",
- "management": "Gestión de reglas",
- "debug-mode": "Mode de depuración"
- },
- "rulenode": {
- "details": "Detalles",
- "events": "Eventos",
- "search": "Nodos de búsqueda",
- "open-node-library": "Abrir librería de nodos",
- "add": "Agregar nodo de reglas",
- "name": "Nombre",
- "name-required": "El nombre es requerido.",
- "type": "Tipo",
- "description": "Descripción",
- "delete": "Eliminar nodo de reglas",
- "select-all-objects": "Seleccionar todos los nodos y conexiones",
- "deselect-all-objects": "Deshacer selección de todos los nodos y conexiones",
- "delete-selected-objects": "Eliminar nodos y conexiones seleccionados",
- "delete-selected": "Eliminar seleccionado",
- "select-all": "Seleccionar todos",
- "copy-selected": "Copiar seleccionado",
- "deselect-all": "Deshace selección de todos",
- "rulenode-details": "Detalles del nodo de reglas",
- "debug-mode": "Modo de depuración",
- "configuration": "Configuración",
- "link": "Enlace",
- "link-details": "Detalles del enlace del nodo de reglas",
- "add-link": "Agregar enlace",
- "link-label": "Etiqueta del enlace",
- "link-label-required": "Etiqueta del enlace es requerida.",
- "custom-link-label": "Etiqueta del enlace personalizada",
- "custom-link-label-required": "Etiqueta del enlace personalizado es requerida.",
- "link-labels": "Etiquetas del enlace",
- "link-labels-required": "Etiquetas del enlace son requeridas.",
- "no-link-labels-found": "No se encontraron etiquetas de enlaces",
- "no-link-label-matching": "'{{label}}' no encontrada.",
- "create-new-link-label": "Crear una nueva!",
- "type-filter": "Filtro",
- "type-filter-details": "Filtrar mensajes entrantes con las condiciones configuradas",
- "type-enrichment": "Enriquecimiento",
- "type-enrichment-details": "Agregar información adicional en mensajes de metadatos",
- "type-transformation": "Transformación",
- "type-transformation-details": "Cambiar carga útil del Mensaje y Metadatos",
- "type-action": "Acción",
- "type-action-details": "Ejecutar acción especial",
- "type-external": "Externo",
- "type-external-details": "Interactuar con sistemas externos",
- "type-rule-chain": "Cadena de reglas",
- "type-rule-chain-details": "Reenvía los mensajes entrantes a la cadena de reglas especificada",
- "type-input": "Entrada",
- "type-input-details": "Entrada lógica de la Cadena de Reglas, reenvíar los mensajes entrantes al siguiente nodo de regla relacionado.",
- "type-unknown": "Desconocido",
- "type-unknown-details": "Regla de nodo no resuelta",
- "directive-is-not-loaded": "La directiva de configuración definida '{{directiveName}}' no está disponible.",
- "ui-resources-load-error": "Error al cargar los recursos de configuración ui.",
- "invalid-target-rulechain": "¡No se puede resolver la cadena de reglas objetivo!",
- "test-script-function": "Probar función script",
- "message": "Mensaje",
- "message-type": "Tipo de mensaje",
- "select-message-type": "Seleccionar tipo de mensaje",
- "message-type-required": "Tipo de mensaje es requerido",
- "metadata": "Metadatos",
- "metadata-required": "La entradas de matadatos no pueden estar vacías.",
- "output": "Salida",
- "test": "Prueba",
- "help": "Ayuda",
- "reset-debug-mode": "Restablecer el modo de depuración en todos los nodos"
- },
- "tenant": {
- "tenant": "Organización",
- "tenants": "Organizaciones",
- "management": "Gestión de la organización",
- "add": "Agregar organización",
- "admins": "Administradores",
- "manage-tenant-admins": "Gestionar administradores de la organización",
- "delete": "Eliminar organización",
- "add-tenant-text": "Agregar nueva organización",
- "no-tenants-text": "Organizaciones no encontradas",
- "tenant-details": "Detalles de la organización",
- "delete-tenant-title": "¿Está seguro de que desea eliminar la organización '{{tenantTitle}}'?",
- "delete-tenant-text": "¡Cuidado! Después de la confirmación, la organización y todos los datos relacionados serán irrecuperables.",
- "delete-tenants-title": "¿Está seguro de que desea eliminar { count, plural, 1 {1 organización} other {# organizaciones} }?",
- "delete-tenants-action-title": "Eliminar { count, plural, 1 {1 organización} other {# organizaciones} }",
- "delete-tenants-text": "¡Cuidado! Después de la confirmación se eliminarán todas las organizaciones seleccionadas y todos los datos relacionados serán irrecuperables.",
- "title": "Título",
- "title-required": "Título es requerido.",
- "description": "Descripción",
- "details": "Detalles",
- "events": "Eventos",
- "copyId": "Copiar ID de la organización",
- "idCopiedMessage": "ID de la organización ha sido copiado al portapapeles",
- "select-tenant": "Seleccionar organización",
- "no-tenants-matching": "No se encontraron organizaciones que coincidan con '{{entity}}'.",
- "tenant-required": "Organización es requerida"
- },
- "timeinterval": {
- "seconds-interval": "{ seconds, plural, 1 {1 segundo} other {# segundos} }",
- "minutes-interval": "{ minutes, plural, 1 {1 minuto} other {# minutos} }",
- "hours-interval": "{ hours, plural, 1 {1 hora} other {# horas} }",
- "days-interval": "{ days, plural, 1 {1 día} other {# días} }",
- "days": "Días",
- "hours": "Horas",
- "minutes": "Minutos",
- "seconds": "Segundos",
- "advanced": "Avanzado"
- },
- "timewindow": {
- "days": "{ days, plural, 1 { día } other {# días } }",
- "hours": "{ hours, plural, 0 { horas } 1 {1 hora } other {# horas } }",
- "minutes": "{ minutes, plural, 0 { minutos } 1 {1 minuto } other {# minutos } }",
- "seconds": "{ seconds, plural, 0 { segundos } 1 {1 segundo } other {# segundos } }",
- "realtime": "Tiempo real",
- "history": "Historia",
- "last-prefix": "último(s)",
- "period": "desde {{ startTime }} hasta {{ endTime }}",
- "edit": "Editar ventana de tiempo",
- "date-range": "Rango de fecha",
- "last": "Último(s)",
- "time-period": "Período de tiempo",
- "hide": "Ocultar"
- },
- "user": {
- "user": "Usuario",
- "users": "Usuarios",
- "customer-users": "Usuarios cliente",
- "tenant-admins": "Administradores de la Organización",
- "sys-admin": "Administrador del sistema",
- "tenant-admin": "Administrador de la organización",
- "customer": "Cliente",
- "anonymous": "Anónimo",
- "add": "Agregar Usuario",
- "delete": "Eliminar usuario",
- "add-user-text": "Agregar nuevo usuario",
- "no-users-text": "No se encontraron usuarios",
- "user-details": "Detalles de usuario",
- "delete-user-title": "¿Está seguro de que desea eliminar el usuario '{{userEmail}}'?",
- "delete-user-text": "¡Cuidado! Después de la confirmación, el usuario y todos los datos relacionados serán irrecuperables.",
- "delete-users-title": "¿Está seguro de que desea eliminar { count, plural, 1 {1 usuario} other {# usuarios} }?",
- "delete-users-action-title": "Borrar { count, plural, 1 {1 usuario} other {# usuarios} }",
- "delete-users-text": "¡Cuidado! Después de la confirmación se eliminarán todas los usuarios seleccionados y todos los datos relacionados serán irrecuperables.",
- "activation-email-sent-message": "¡Correo electrónico de activación fue enviado correctamente!",
- "resend-activation": "Reenviar activación",
- "email": "Correo electrónico",
- "email-required": "Correo electrónico es requerido.",
- "invalid-email-format": "Formato de correo electrónico inválido.",
- "first-name": "Nombre",
- "last-name": "Apellido",
- "description": "Descripción",
- "default-dashboard": "Panel predeterminado",
- "always-fullscreen": "Siempre pantalla completa",
- "select-user": "Seleccionar usuario",
- "no-users-matching": "Usuarios que coincidan con '{{entity}}' no fueron encontrados.",
- "user-required": "Usuario es requerido",
- "activation-method": "Método de activación",
- "display-activation-link": "Mostrar enlace de activación",
- "send-activation-mail": "Enviar correo electrónico de activación",
- "activation-link": "Enlace de activación de usuario",
- "activation-link-text": "Para activar el usuario, utilice el siguiente enlace de activación :",
- "copy-activation-link": "Copiar enlace de activación",
- "activation-link-copied-message": "El enlace de activación de usuario ha sido copiado al portapapeles",
- "details": "Detalles",
- "login-as-tenant-admin": "Iniciar sesión como Administrador de la Organización",
- "login-as-customer-user": "Iniciar sesión como Usuario cliente",
- "disable-account": "Deshabilitar cuenta de usuario",
- "enable-account": "Habilitar cuenta de usuario",
- "enable-account-message": "¡La cuenta de usuario se ha habilitado correctamente!",
- "disable-account-message": "¡La cuenta de usuario se deshabilitó correctamente!"
- },
- "value": {
- "type": "Tipo de valor",
- "string": "Cadena de caracteres",
- "string-value": "Valor de la cadena de caracteres",
- "integer": "Entero",
- "integer-value": "Valor entero",
- "invalid-integer-value": "Valor de entero inválido",
- "double": "Doble",
- "double-value": "Valor doble",
- "boolean": "Booleano",
- "boolean-value": "Valor booleano",
- "false": "Falso",
- "true": "Verdadero",
- "long": "Largo"
- },
- "widget": {
- "widget-library": "Librería de widgets",
- "widget-bundle": "Paquete de widgets",
- "select-widgets-bundle": "Seleccionar paquete de widgets",
- "management": "Gestión de widget",
- "editor": "Editor de Widget",
- "widget-type-not-found": "Problema cargando configuración de widget.
Probablemente el tipo de widget asociado fue eliminado.",
- "widget-type-load-error": "El widget no fue cargado debido a los siguientes errores:",
- "remove": "Eliminar widget",
- "edit": "Editar widget",
- "remove-widget-title": "¿Está seguro de que desea eliminar el widget '{{widgetTitle}}'?",
- "remove-widget-text": "Después de la confirmación, el widget y todos los datos relacionados serán irrecuperables.",
- "timeseries": "Series temporales",
- "search-data": "Buscar datos",
- "no-data-found": "No se encontraron datos",
- "latest-values": "Últimos valores",
- "rpc": "Widget de control",
- "alarm": "Widget de alarma",
- "static": "Widget estático",
- "select-widget-type": "Seleccionar tipo de widget",
- "missing-widget-title-error": "¡Título del widget debe ser especificado!",
- "widget-saved": "Widget guardado",
- "unable-to-save-widget-error": "¡No se puede guardar widget! ¡El widget tiene errores!",
- "save": "Guardar widget",
- "saveAs": "Guardar widget como",
- "save-widget-type-as": "Guardar tipo de widget como",
- "save-widget-type-as-text": "Por favor escriba el nuevo título del widget y/o seleccionar paquete de widgets objetivo",
- "toggle-fullscreen": "Alternar pantalla completa",
- "run": "Ejecutar widget",
- "title": "Título del widget",
- "title-required": "Título del widget es requerido.",
- "type": "Tipo de widget",
- "resources": "Recursos",
- "resource-url": "URL JavaScript/CSS",
- "remove-resource": "Eliminar recurso",
- "add-resource": "Agregar recurso",
- "html": "HTML",
- "tidy": "Formatear",
- "css": "CSS",
- "settings-schema": "Esquema de configuración",
- "datakey-settings-schema": "Esquema de configuración de clave de datos",
- "javascript": "Javascript",
- "js": "JS",
- "remove-widget-type-title": "¿Está seguro de que desea eliminar el tipo de widget '{{widgetName}}'?",
- "remove-widget-type-text": "Después de la confirmación, el tipo de widget y todos los datos relacionados serán irrecuperables.",
- "remove-widget-type": "Eliminar tipo de widget",
- "add-widget-type": "Agregar nuevo tipo de widget",
- "widget-type-load-failed-error": "¡Error al cargar el tipo de widget!",
- "widget-template-load-failed-error": "¡Error al cargar la plantilla del widget!",
- "add": "Agregar widget",
- "undo": "Deshacer cambios en el widget",
- "export": "Exportar widget"
- },
- "widget-action": {
- "header-button": "Botón del encabezado del widget",
- "open-dashboard-state": "Navegar a nuevo estado del panel",
- "update-dashboard-state": "Actualizar estado vigente del panel",
- "open-dashboard": "Navegar a otro panel",
- "custom": "Acción personalizada",
- "target-dashboard-state": "Estado del panel objetivo",
- "target-dashboard-state-required": "Estado del panel objetivo es requerido",
- "set-entity-from-widget": "Asignar entidad desde widget",
- "target-dashboard": "Panel objetivo",
- "open-right-layout": "Abrir diseño del panel derecho (vista móvil)"
- },
- "widgets-bundle": {
- "current": "Paquete actual",
- "widgets-bundles": "Paquetes de widgets",
- "add": "Agregar paquete de widgets",
- "delete": "Eliminar paquete de widgets",
- "title": "Título",
- "title-required": "Título es requerido.",
- "add-widgets-bundle-text": "Agregar nuevo paquete de widgets",
- "no-widgets-bundles-text": "No se encontraron paquetes de widgets",
- "empty": "Paquete de widgets está vacío",
- "details": "Detalles",
- "widgets-bundle-details": "Detalles del paquete de widgets",
- "delete-widgets-bundle-title": "¿Está seguro de que desea eliminar el paquete de widgets '{{widgetsBundleTitle}}'?",
- "delete-widgets-bundle-text": "¡Cuidado! Después de la confirmación, el paquete de widgets y todos los datos relacionados serán irrecuperables.",
- "delete-widgets-bundles-title": "¿Está seguro de que desea eliminar { count, plural, 1 {1 paquete de widgets} other {# paquetes de widgets} }?",
- "delete-widgets-bundles-action-title": "Eliminar { count, plural, 1 {1 paquete de widgets} other {# paquetes de widgets} }",
- "delete-widgets-bundles-text": "¡Cuidado! Después de la confirmación se eliminarán todas los paquetes de widgets seleccionados y todos los datos relacionados serán irrecuperables.",
- "no-widgets-bundles-matching": "Paquetes de widgets que coincidan con '{{widgetsBundle}}' no fueron encontrados.",
- "widgets-bundle-required": "Paquete de widgets es requerido.",
- "system": "Sistema",
- "import": "Importar paquete de widgets",
- "export": "Exportar paquete de widgets",
- "export-failed-error": "No se puede exportar paquete de widgets: {{error}}",
- "create-new-widgets-bundle": "Crear nuevo paquete de widgets",
- "widgets-bundle-file": "Archivo de paquete de widgets",
- "invalid-widgets-bundle-file-error": "No se puede importar paquete de widgets: Estructura de datos del paquete de widgets inválida."
- },
- "widget-config": {
- "data": "Datos",
- "settings": "Configuración",
- "advanced": "Avanzado",
- "title": "Título",
- "title-tooltip": "Tooltip Título",
- "general-settings": "Configuración general",
- "display-title": "Mostrar título",
- "drop-shadow": "Colocar sombra",
- "enable-fullscreen": "Habilitar pantalla completa",
- "background-color": "Color de fondo",
- "text-color": "Color del texto",
- "padding": "Relleno",
- "margin": "Margen",
- "widget-style": "Estilo del widget",
- "title-style": "Estilo del título",
- "mobile-mode-settings": "Configuración del modo móvil",
- "order": "Orden",
- "height": "Altura",
- "units": "Símbolo especial para mostrar junto al valor.",
- "decimals": "Número de dígitos después del punto flotante",
- "timewindow": "Ventana de tiempo",
- "use-dashboard-timewindow": "Utilizar ventana de tiempo del panel",
- "display-timewindow": "Mostrar ventana de tiempo",
- "display-legend": "Mostrar leyenda",
- "datasources": "Orígenes de datos",
- "maximum-datasources": "Máximo { count, plural, 1 {1 origen de datos permitido.} other {# orígenes de datos permitidos} }",
- "datasource-type": "Tipo",
- "datasource-parameters": "Parámetros",
- "remove-datasource": "Eliminar origen de datos",
- "add-datasource": "Agregar origen de datos",
- "target-device": "Dispositivo objetivo",
- "alarm-source": "Origen de la alarma",
- "actions": "Acciones",
- "action": "Acción",
- "add-action": "Agregar acción",
- "search-actions": "Buscar acciones",
- "action-source": "Origen de acción",
- "action-source-required": "Fuente de acción es requerida.",
- "action-name": "Nombre",
- "action-name-required": "Nombre de acción es requerido.",
- "action-name-not-unique": "Ya existe otra acción con el mismo nombre.
El nombre de la acción debe ser único dentro del mismo orígen de acción.",
- "action-icon": "Icono",
- "action-type": "Tipo",
- "action-type-required": "Tipo de acción es requerido.",
- "edit-action": "Editar acción",
- "delete-action": "Eliminar acción",
- "delete-action-title": "Eliminar acción del widget",
- "delete-action-text": "¿Está seguro de que desea eliminar la acción del widget con nombre '{{actionName}}'?",
- "display-icon": "Mostrar icono del título",
- "icon-color": "Color del icono",
- "icon-size": "Tamaño del icono"
- },
- "widget-type": {
- "import": "Importar tipo de widget",
- "export": "Exportar tipo de widget",
- "export-failed-error": "No se puede exportar tipo de widget: {{error}}",
- "create-new-widget-type": "Crear nuevo tipo de widget",
- "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"
- }
- },
- "input-widgets": {
- "attribute-not-allowed": "El parámetro de atributo no se puede usar en este widget",
- "date": "Fecha",
- "discard-changes": "Descartar los cambios",
- "entity-attribute-required": "Se requiere atributo de entidad",
- "entity-timeseries-required": "Se requiere la serie de tiempo de la entidad",
- "not-allowed-entity": "La entidad seleccionada no puede tener atributos compartidos",
- "no-attribute-selected": "No se seleccionó ningún atributo",
- "no-datakey-selected": "No se seleccionó ninguna clave de datos",
- "no-entity-selected": "Ninguna entidad seleccionada",
- "no-image": "Sin imágen",
- "no-support-web-camera": "No hay cámara web compatible",
- "no-timeseries-selected": "No hay series de tiempo seleccionadas",
- "switch-attribute-value": "Cambiar el valor del atributo de entidad",
- "switch-camera": "Cambiar de cámara",
- "switch-timeseries-value": "Cambiar el valor de la serie de tiempo de la entidad",
- "take-photo": "Tomar foto",
- "time": "Tiempo",
- "timeseries-not-allowed": "El parámetro Timeseries no se puede usar en este widget",
- "update-failed": "Actualización fallida",
- "update-successful": "Actualización exitosa",
- "update-attribute": "Actualizar atributo",
- "update-timeseries": "Actualizar series de tiempo",
- "value": "Valor"
- }
- },
- "icon": {
- "icon": "Icono",
- "select-icon": "Seleccionar icono",
- "material-icons": "Iconos de material design",
- "show-all": "Mostrar todos los iconos"
- },
- "custom": {
- "widget-action": {
- "action-cell-button": "Botón de acción de celda",
- "row-click": "Clic en la fila",
- "polygon-click": "Clic en la fila",
- "marker-click": "Clic en el polígono",
- "tooltip-tag-action": "Acción de etiqueta para globo de ayuda",
- "node-selected": "Clic en el nodo seleccionado",
- "element-click": "Clic en el elemento HTML",
- "pie-slice-click": "Clic en la rebanada",
- "row-double-click": "Doble clic en la fila"
- }
- },
- "language": {
- "language": "Lenguaje"
- }
-}
diff --git a/ui/src/app/locale/locale.constant-fa_IR.json b/ui/src/app/locale/locale.constant-fa_IR.json
deleted file mode 100644
index b4ca2eaf4a..0000000000
--- a/ui/src/app/locale/locale.constant-fa_IR.json
+++ /dev/null
@@ -1,1630 +0,0 @@
-{
- "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": "قبول",
- "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}} اشتراک گذاري از طريق"
- },
- "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 فعال سازي",
- "tls-version": "نسخه TLS",
- "send-test-mail": "ارسال پيام آزمايشي"
- },
- "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": "هشدار دهنده فاصله نمونه برداري (sec)",
- "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-list": "ليست موجودي",
- "filter-type-entity-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": ".شروع مي شود '{{prefix}}' که نامشان با '{{assetType}}' دارايي هاي نوع",
- "filter-type-device-type": "نوع دستگاه",
- "filter-type-device-type-description": "'{{deviceType}}' دستگاه هاي نوع",
- "filter-type-device-type-and-name-description": ".شروع مي شود '{{prefix}}' که نامشان با '{{deviceType}}' دستگاه هاي نوع",
- "filter-type-entity-view-type": "نوع نمايش موجودي",
- "filter-type-entity-view-type-description": "'{{entityView}}' نمايش هاي موجودي نوع ",
- "filter-type-entity-view-type-and-name-description": ".شروع مي شود '{{prefix}}' که نامشان با '{{entityView}}' نمايش هاي موجودي نوع",
- "filter-type-relations-query": "پرس و جو درمورد ارتباطات",
- "filter-type-relations-query-description": ". دارند {{direction}} {{rootEntity}} را {{relationType}} که ارتباط {{entities}}",
- "filter-type-asset-search-query": "پرس و جو درمورد جستجوي دارايي",
- "filter-type-asset-search-query-description": ".دارند {{direction}} {{rootEntity}} را {{relationType}} که ارتباط{{assetTypes}} دارايي ها از انواع",
- "filter-type-device-search-query": "پرس و چو درمورد جستجوي دستگاه",
- "filter-type-device-search-query-description": ".دارند {{direction}} {{rootEntity}} را {{relationType}} که ارتباط{{deviceTypes}} دستگاه ها از انواع",
- "filter-type-entity-view-search-query": "پرس و جو درمورد جستجوي نمايش موجودي",
- "filter-type-entity-view-search-query-description": ".دارند {{direction}} {{rootEntity}} را {{relationType}} که ارتباط{{entityViewTypes}} نمايش هاي موجودي از انواع",
- "entity-filter": "فيلتر موجودي",
- "resolve-multiple": "تصميم با توجه به موجودي هاي متعدد",
- "filter-type": "نوع فيلتر",
- "filter-type-required": ".نوع فيلتر مورد نياز است",
- "entity-filter-no-entity-matched": ".هيچ موجودي منطبق بر فيلتر مشخص شده يافت نشد",
- "no-entity-filter-specified": ".هيچ فيلتر موجودي اي تعيين نشده است",
- "root-state-entity": "موجودي وضعيت داشبورد به عنوان پايه استفاده شود",
- "root-entity": "موجودي پايه",
- "state-entity-parameter-name": "نام پارامتر موجودي وضعيت",
- "default-state-entity": "موجودي وضعيت پيش فرض",
- "default-entity-parameter-name": "به صورت پيش فرض",
- "max-relation-level": "بالاترين سطح ارتباط",
- "unlimited-level": "سطح نامحدود",
- "state-entity": "موجودي وضعيت داشبورد",
- "all-entities": "تمام موجودي ها",
- "any-relation": "هر"
- },
- "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": "نام دارايي شروع مي شود با",
- "label": "برچسب"
- },
- "attribute": {
- "attributes": "ويژگي ها",
- "latest-telemetry": "آخرين سنجش",
- "attributes-scope": "حوزه ويژگي هاي موجودي",
- "scope-latest-telemetry": "آخرين سنجش",
- "scope-client": "ويژگي هاي مشتري",
- "scope-server": "ويژگي هاي سِروِر",
- "scope-shared": "ويژگي هاي مشترک",
- "add": "افزودن ويژگي ها",
- "key": "کليد",
- "last-update-time": "آخرين زمان به روز رساني",
- "key-required": ".کليد ويژگي مورد نياز است",
- "value": "مقدار",
- "value-required": ".مقدار ويژگي مورد نياز است",
- "delete-attributes-title": "مطمئنيد؟ { count, plural, 1 {1 ويژگي} other {# ويژگي} } آيا از حذف",
- "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 ويژگي} other {# ويژگي} }",
- "selected-telemetry": "انتخاب شد { count, plural, 1 {1 واحد سنجش} other {# واحد سنجش} }"
- },
- "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-relation-add-or-update": "ارتباط به روز شد",
- "type-relation-delete": "ارتباط حذف شد",
- "type-relations-delete": "تمام ارتباطات حذف شد",
- "type-alarm-ack": "تصديق شده",
- "type-alarm-clear": "پاک شده",
- "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": "وارد کردن جستجو"
- },
- "content-type": {
- "json": "JSON",
- "text": "Text",
- "binary": "Binary (Base64)"
- },
- "customer": {
- "customer": "مشتري",
- "customers": "مشتريان",
- "management": "مديريت مشتري",
- "dashboard": "داشبورد مشتري",
- "dashboards": "داشبوردهاي مشتري",
- "devices": "دستگاه هاي مشتري",
- "entity-views": "نمايش موجودي مشتري",
- "assets": "دارايي هاي مشتري",
- "public-dashboards": "داشبوردهاي عمومي",
- "public-devices": "دستگاه هاي عمومي",
- "public-assets": "دارايي هاي عمومي",
- "public-entity-views": "نمايش موجودي عمومي",
- "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 مشتري} other {# مشتري} } از حذف",
- "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": "مشتري مورد نياز است",
- "select-default-customer": "انتخاب مشتري پيش فرض",
- "default-customer": "مشتري پيش فرض",
- "default-customer-required": "جهت عيب يابي داشبورد در سطح کاربر مياني، مشتري پيش فرض مورد نياز است"
- },
- "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": "مطمئنيد؟ '{{dashboardTitle}}' از حذف",
- "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": "مطمئنيد؟ '{{dashboardTitle}}' از لغو تخصيص داشبورد",
- "unassign-dashboard-text": ".پس از تأييد، داشبورد، لغو تخصيص و خارج از دسترس مشتري مي شود",
- "unassign-dashboard": "لغو تخصيص داشبورد",
- "unassign-dashboards-title": "مطمئنيد؟ { count, plural, 1 {1 داشبورد} other {# داشبورد} } از لغو تخصيص",
- "unassign-dashboards-text": ".پس از تأييد، تمام داشبوردهاي انتخاب شده، لغو تخصيص و خارج از دسترس مشتري مي شوند",
- "public-dashboard-title": "داشبورد اکنون عمومي است",
- "public-dashboard-text": ":قابل دسترسي است اکنون عمومي بوده و از طريق پيوند عمومي ديگر ، {{dashboardTitle}} ،داشبورد شما",
- "public-dashboard-notice": ".فراموش نکنيد براي دسترسي به داده هاي دستگاه هاي مربوطه، آنها را عمومي نماييد :توجه",
- "make-private-dashboard-title": "مطمئنيد؟ '{{dashboardTitle}}' از شخصي سازي داشبورد",
- "make-private-dashboard-text": ".پس از تأييد، داشبورد، شخصي و خارج از دسترس ديگران مي شود",
- "make-private-dashboard": "شخصي سازي داشبورد",
- "socialshare-text": "ThingsBoard طراحي شده توسط '{{dashboardTitle}}'",
- "socialshare-title": "ThingsBoard طراحي شده توسط '{{dashboardTitle}}'",
- "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}} :صدور داشبورد ممکن نيست",
- "create-new-dashboard": "ايجاد داشبورد جديد",
- "dashboard-file": "پرونده داشبورد",
- "invalid-dashboard-file-error": ".وارد کردن داشبورد ممکن نيست: ساختار داده داشبورد نامعتبر است",
- "dashboard-import-missing-aliases-title": "پيکربندي نامهاي مستعار استفاده شده توسط داشبوردِ وارده",
- "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 وضعيت داشبورد} other {# وضعيت داشبورد} }",
- "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": "{ count, plural, 1 {.1 نوع تابع مجاز است} other {# نوع تابع مجازند} } بيشترين",
- "time-description": "برچسب زماني مقدار فعلي؛",
- "value-description": "مقدار فعلي؛",
- "prev-value-description": "نتيجه ي فراخوانيِ تابع قبلي؛",
- "time-prev-description": "برچسب زماني مقدار قبلي؛",
- "prev-orig-value-description": "ممقدار اصلي قبلي"
- },
- "datasource": {
- "type": "نوع منبع داده",
- "name": "نام",
- "add-datasource-prompt": "لطفا منبع داده را اضافه کنيد"
- },
- "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": "
{{widgetsList}} :را تا زمان استفاده توسط ويجت(هاي) زير نمي توان حذف کرد ، '{{deviceAlias}}' ،نام مستعار دستگاه",
- "is-gateway": "درگاه است",
- "public": "عمومي",
- "device-public": "دستگاه عمومي است",
- "select-device": "انتخاب دستگاه"
- },
- "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": "
{{widgetsList}} :را تا زمان استفاده توسط ويجت(هاي) زير نمي توان حذف کرد ، '{{entityAlias}}' ،نام مستعار موجودي",
- "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-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-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": "ستون ها براي نمايش"
- },
- "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": "
{{widgetsList}} :را تا زمان استفاده توسط ويجت(هاي) زير نمي توان حذف کرد ، '{{entityViewAlias}}' ،نام مستعار دستگاه",
- "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": "هر بار که شما نمايش موجودي را بروز رساني يا ذخيره مي کنيد، نمايش موجودي بصور خودکار ويژگي هاي تعيين شده را از موجودي هدف کپي مي کند و به دلايل عملکردي، ويژگي هاي موجودي هدف، با هر بار تغيير ويژگي، در نمايش موجودي انتشار نمي يابند. مي توانيد با پيکربندي گره قواعد در زنجيره قواعد خود و پيوند دهي \"Post attributes\" و \"Attributes Updated\" آن به گره قواعد جديد، انتشار خودکار \"copy to view\" را ممکن سازيد ." ,
- "timeseries-data": "داده ي سري هاي زماني",
- "timeseries-data-hint": "کليدهاي داده ي سري هاي زمانيِ موجوديِ هدف را پيکربندي کنيد تا در دسترسِ نمايش موجودي باشند. اين سري هاي زماني، فقط خواندني است"
- },
- "event": {
- "event-type": "نوع رويداد",
- "type-error": "خطا",
- "type-lc-event": "رويداد چرخه عمر",
- "type-stats": "آمار",
- "type-debug-rule-node": "اشکال زدايي",
- "type-debug-rule-chain": "اشکال زدايي",
- "no-events-prompt": "هيچ رويدادي يافت نشد",
- "error": "خطا",
- "alarm": "هشدار",
- "event-time": "زمان رويداد",
- "server": "سِروِر",
- "body": "بدنه",
- "method": "روش",
- "type": "نوع",
- "entity": "موجودي",
- "message-id": "پيام ID",
- "message-type": "نوع پيام",
- "data-type": "نوع داده",
- "relation-type": "نوع ارتباط",
- "metadata": "فرا داده",
- "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": "دامنه مورد نياز است",
- "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": "ID JSON درخواست عبارت",
- "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-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": "واحد ID",
- "modbus-unit-id-range": ".واحد بايد در بازه اي بين 1 تا 247 باشد ID",
- "modbus-device-name": "نام دستگاه",
- "modbus-poll-period": "(ms) دوره نمونه برداري",
- "modbus-attributes-poll-period": "(ms) دوره نمونه برداري ويژگي ها",
- "modbus-timeseries-poll-period": "(ms) دوره نمونه برداري سري هاي زماني",
- "modbus-poll-period-range": ".دوره نمونه برداري بايد مقداري مثبت باشد",
- "modbus-tag": "برچسب",
- "modbus-function": "تابع",
- "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": ".شمارش ثبت بايد مقداري مثبت باشد",
- "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": "حذف مورد",
- "delete-items": "حذف موارد",
- "scroll-to-top": "پيمايش به بالا"
- },
- "help": {
- "goto-help-page": "رفتن به صفحه کمک"
- },
- "home": {
- "home": "خانه",
- "profile": "پرونده شخصي",
- "logout": "خروج",
- "menu": "فهرست انتخاب",
- "avatar": "آواتار",
- "open-user-menu": "بازکردن فهرست انتخاب کاربر"
- },
- "import": {
- "no-file": "هيچ پرونده اي انتخاب نشد",
- "drop-file": ".آن را با موس کِشيده و رها کنيد، و يا روي آن کليک نماييد ،JSON جهت بارگذاري يک پرونده"
- },
- "item": {
- "selected": "انتخاب شده"
- },
- "js-func": {
- "no-return-error": "!تابع بايد مقدار را برگرداند",
- "return-type-mismatch": "!را برگرداند '{{type}}' تابع بايد مقدار نوع",
- "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": "فيلتر",
- "type-filter-details": "پيام هاي ورودي را با شرايط پيکربندي فيلتر کنيد",
- "type-enrichment": "افزودن",
- "type-enrichment-details": "افزودن اطلاعات تکميلي به فرا داده ي پيام",
- "type-transformation": "تبديل",
- "type-transformation-details": "تغيير بازده و فرا داده ي پيام",
- "type-action": "اقدام",
- "type-action-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": "کمک"
- },
- "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": "کاربر مورد نياز است"
- },
- "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": "{{ endTime }} تا {{ startTime }} از",
- "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": ": استفاده کنيد جهت فعال سازي کاربر، از پيوند فعال سازي زير",
- "copy-activation-link": "رونوشت پيوند فعال سازي",
- "activation-link-copied-message": "پيوند فعال سازي کاربر در حافظه موقت رونوشت شد",
- "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": "صدور ويجت"
- },
- "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 {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": "فعال سازي حالت تمام صفحه",
- "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": ".وارد کردن نوع ويجت ممکن نيست: ساختار داده نوع ويجت نامعتبر است"
- },
- "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": "انتخاب آيکون",
- "material-icons": "آيکونهاي اجسام",
- "show-all": "نمايش تمام آيکونها"
- },
- "custom": {
- "widget-action": {
- "action-cell-button": "دکمه سلول عملياتي",
- "row-click": "در رديف کليک کنيد",
- "marker-click": "روي نشانگر کليک کنيد",
- "tooltip-tag-action": "اقدام برچسب راهنماي ابزار"
- }
- },
- "language": {
- "language": "زبان"
- }
-}
diff --git a/ui/src/app/locale/locale.constant-fr_FR.json b/ui/src/app/locale/locale.constant-fr_FR.json
deleted file mode 100644
index 274063445f..0000000000
--- a/ui/src/app/locale/locale.constant-fr_FR.json
+++ /dev/null
@@ -1,1720 +0,0 @@
-{
- "access": {
- "access-forbidden": "Accès interdit",
- "access-forbidden-text": "Vous n'avez pas accès à cet emplacement!
Essayez de vous connecter avec un autre utilisateur si vous souhaitez toujours accéder à cet emplacement.",
- "refresh-token-expired": "La session a expiré",
- "refresh-token-failed": "Impossible de rafraîchir la session",
- "unauthorized": "non autorisé",
- "unauthorized-access": "accès non autorisé",
- "unauthorized-access-text": "Vous devez vous connecter pour avoir accès à cette ressource!"
- },
- "action": {
- "activate": "Activer",
- "add": "Ajouter",
- "apply": "Appliquer",
- "apply-changes": "Appliquer les modifications",
- "assign": "Attribuer",
- "back": "retour",
- "cancel": "Annuler",
- "clear-search": "Effacer la recherche",
- "close": "Fermer",
- "continue": "Continue",
- "copy": "Copier",
- "copy-reference": "Copier la référence",
- "create": "Créer",
- "decline-changes": "Refuser les modifications",
- "delete": "Supprimer",
- "discard-changes": "Annuler les modifications",
- "drag": "Drag",
- "edit": "Modifier",
- "edit-mode": "Mode édition",
- "enter-edit-mode": "Entrer en mode édition",
- "export": "Exporter",
- "import": "Importer",
- "make-private": "Rendre privé",
- "no": "Non",
- "ok": "OK",
- "paste": "coller",
- "paste-reference": "Coller référence",
- "refresh": "Rafraîchir",
- "remove": "Supprimer",
- "run": "Exécuter",
- "save": "Enregistrer",
- "saveAs": "Enregistrer sous",
- "search": "Rechercher",
- "share": "Partager",
- "share-via": "Partager via {{provider}}",
- "sign-in": "Connectez-vous!",
- "suspend": "Suspendre",
- "unassign": "Retirer",
- "undo": "Annuler",
- "update": "mise à jour",
- "view": "Afficher",
- "yes": "Oui"
- },
- "admin": {
- "base-url": "URL de base",
- "base-url-required": "L'URL de base est requise.",
- "enable-tls": "Activer TLS",
- "tls-version": "Version TLS",
- "general": "Général",
- "general-settings": "Paramètres généraux",
- "mail-from": "Mail de",
- "mail-from-required": "Mail de est requis.",
- "outgoing-mail": "courrier sortant",
- "outgoing-mail-settings": "Paramètres de courrier sortant",
- "send-test-mail": "Envoyer un mail de test",
- "smtp-host": "Hôte SMTP",
- "smtp-host-required": "L'hôte SMTP est requis.",
- "smtp-port": "Port SMTP",
- "smtp-port-invalid": "Cela ne ressemble pas à un port smtp valide.",
- "smtp-port-required": "Vous devez fournir un port smtp.",
- "smtp-protocol": "Protocole SMTP",
- "system-settings": "Paramètres système",
- "test-mail-sent": "Le courrier de test a été envoyé avec succés!",
- "timeout-invalid": "Cela ne ressemble pas à un délai d'expiration valide.",
- "timeout-msec": "Délai (msec)",
- "timeout-required": "Le délai est requis.",
- "security-settings": "Les paramètres de sécurité",
- "password-policy": "Politique de mot de passe",
- "minimum-password-length": "Longueur minimale du mot de passe",
- "minimum-password-length-required": "La longueur minimale du mot de passe est requise",
- "minimum-password-length-range": "La longueur minimale du mot de passe doit être comprise entre 5 et 50.",
- "minimum-uppercase-letters": "Nombre minimum de lettres majuscules",
- "minimum-uppercase-letters-range": "Le nombre minimum de lettres majuscules ne peut pas être négatif",
- "minimum-lowercase-letters": "Nombre minimum de lettres minuscules",
- "minimum-lowercase-letters-range": "Le nombre minimum de lettres minuscules ne peut pas être négatif",
- "minimum-digits": "Nombre minimum de chiffres",
- "minimum-digits-range": "Le nombre minimum de chiffres ne peut pas être négatif",
- "minimum-special-characters": "Nombre minimum de caractères spéciaux",
- "minimum-special-characters-range": "Le nombre minimum de caractères spéciaux ne peut pas être négatif",
- "password-expiration-period-days": "Délai d'expiration du mot de passe en jours",
- "password-expiration-period-days-range": "La période d'expiration du mot de passe en jours ne peut pas être négative",
- "password-reuse-frequency-days": "Fréquence de réutilisation du mot de passe en jours",
- "password-reuse-frequency-days-range": "La fréquence de réutilisation du mot de passe en jours ne peut être négative",
- "general-policy": "Politique générale",
- "max-failed-login-attempts": "Nombre maximal de tentatives de connexion infructueuses avant que le compte ne soit verrouillé",
- "minimum-max-failed-login-attempts-range": "Le nombre maximal de tentatives de connexion ayant échoué ne peut pas être négatif",
- "user-lockout-notification-email": "En cas de verrouillage du compte d'utilisateur, envoyez une notification par courrier électronique."
- },
- "aggregation": {
- "aggregation": "agrégation",
- "avg": "Moyenne",
- "count": "Compte",
- "function": "Fonction d'agrégation de données",
- "group-interval": "Intervalle de regroupement",
- "limit": "Valeurs maximales",
- "max": "Max",
- "min": "Min",
- "none": "Aucune",
- "sum": "Somme"
- },
- "alarm": {
- "ack-time": "Heure d'acquittement",
- "acknowledge": "Acquitter",
- "aknowledge-alarm-text": "Êtes-vous sûr de vouloir reconnaître l'alarme?",
- "aknowledge-alarm-title": "Reconnaître l'alarme",
- "aknowledge-alarms-text": "Êtes-vous sûr de vouloir acquitter {count, plural, 1 {1 alarme} other {# alarmes}}?",
- "aknowledge-alarms-title": "Acquitter {count, plural, 1 {1 alarme} other {# alarmes}}",
- "alarm": "Alarme",
- "alarm-details": "Détails de l'alarme",
- "alarm-required": "Une alarme est requise",
- "alarm-status": "État d'alarme",
- "alarm-status-filter": "Filtre d'état d'alarme",
- "alarms": "Alarmes",
- "clear": "Effacer",
- "clear-alarm-text": "Êtes-vous sûr de vouloir effacer l'alarme?",
- "clear-alarm-title": "Effacer l'alarme",
- "clear-alarms-text": "Êtes-vous sûr de vouloir effacer {count, plural, 1 {1 alarme} other {# alarmes}}?",
- "clear-alarms-title": "Effacer {count, plural, 1 {1 alarme} other {# alarmes}}",
- "clear-time": "Heure d'éffacement",
- "created-time": "Heure de création",
- "details": "Détails",
- "display-status": {
- "ACTIVE_ACK": "Active acquittée",
- "ACTIVE_UNACK": "Active non acquittée",
- "CLEARED_ACK": "effacée acquittée",
- "CLEARED_UNACK": "effacée non acquittée"
- },
- "end-time": "Heure de fin",
- "min-polling-interval-message": "Un intervalle d'interrogation d'au moins 1 seconde est autorisé.",
- "no-alarms-matching": "Aucune alarme correspondant à {{entity}} n'a été trouvée. ",
- "no-alarms-prompt": "Aucune alarme",
- "no-data": "Aucune donnée à afficher",
- "originator": "Source",
- "originator-type": "Type de Source",
- "polling-interval": "Intervalle d'interrogation des alarmes (sec)",
- "polling-interval-required": "L'intervalle d'interrogation des alarmes est requis.",
- "search": "Rechercher des alarmes",
- "search-status": {
- "ACK": "acquitté",
- "ACTIVE": "active",
- "ANY": "Toutes",
- "CLEARED": "effacée",
- "UNACK": "non acquittée"
- },
- "select-alarm": "Sélectionnez une alarme",
- "selected-alarms": "{count, plural, 1 {1 alarme} other {# alarmes}} sélectionnées",
- "severity": "Gravité",
- "severity-critical": "Critique",
- "severity-indeterminate": "indéterminée",
- "severity-major": "Majeure",
- "severity-minor": "mineure",
- "severity-warning": "Avertissement",
- "start-time": "Heure de début",
- "status": "État",
- "type": "Type"
- },
- "alias": {
- "add": "Ajouter un alias",
- "all-entities": "Toutes les entités",
- "any-relation": "toutes",
- "default-entity-parameter-name": "Par défaut",
- "default-state-entity": "Entité d'état par défaut",
- "duplicate-alias": "Un alias portant le même nom existe déjà.",
- "edit": "Modifier l'alias",
- "entity-filter": "Filtre d'entité",
- "entity-filter-no-entity-matched": "Aucune entité correspondant au filtre spécifié n'a été trouvée.",
- "filter-type": "Type de filtre",
- "filter-type-asset-search-query": "requête de recherche d'actifs",
- "filter-type-asset-search-query-description": "Actifs de types {{assetTypes}} ayant {{relationType}} relation {{direction}} {{rootEntity}}",
- "filter-type-asset-type": "type d'actif",
- "filter-type-asset-type-and-name-description": "Actifs de type '{{assetType}}' et dont le nom commence par '{{prefix}}'",
- "filter-type-asset-type-description": "Actifs de type '{{assetType}}'",
- "filter-type-device-search-query": "Requête de recherche de dispositif",
- "filter-type-device-search-query-description": "Dispositifs de types {{deviceTypes}} ayant {{relationType}} relation {{direction}} {{rootEntity}}",
- "filter-type-device-type": "Type de dispositif",
- "filter-type-device-type-and-name-description": "Dispositifs de type '{{deviceType}}' et dont le nom commence par '{{prefix}}'",
- "filter-type-device-type-description": "Dispositifs de type '{{deviceType}}'",
- "filter-type-entity-list": "Liste d'entités",
- "filter-type-entity-name": "Nom d'entité",
- "filter-type-entity-view-search-query": "Requête de recherche vue d'entité",
- "filter-type-entity-view-search-query-description": "Vues d'entité avec les types {{entityViewTypes}} ayant {{relationType}} relation {{direction}} {{rootEntity}}",
- "filter-type-entity-view-type": "Type de vue d'entité",
- "filter-type-entity-view-type-and-name-description": "Vues d'entité de type '{{entityView}}' et dont le nom commence par '{{prefix}}'",
- "filter-type-entity-view-type-description": "Vues d'entité de type '{{entityView}}'",
- "filter-type-relations-query": "Interrogation des relations",
- "filter-type-relations-query-description": "{{entities}} ayant {{relationType}} relation {{direction}} {{rootEntity}}",
- "filter-type-required": "Le type de filtre est requis.",
- "filter-type-single-entity": "Entité unique",
- "filter-type-state-entity": "Entité de l'état du tableau de bord",
- "filter-type-state-entity-description": "Entité extraite des paramétres d'état du tableau de bord",
- "max-relation-level": "Niveau de relation maximum",
- "name": "Nom de l'alias",
- "name-required": "Le nom d'alias est requis",
- "no-entity-filter-specified": "Aucun filtre d'entité spécifié",
- "resolve-multiple": "Résoudre en plusieurs entités",
- "root-entity": "Entité racine",
- "root-state-entity": "Utiliser l'entité d'état du tableau de bord en tant que racine",
- "state-entity": "Entité d'état du tableau de bord",
- "state-entity-parameter-name": "Nom du paramétre d'entité d'état",
- "unlimited-level": "niveau illimité"
- },
- "asset": {
- "add": "Ajouter un actif",
- "add-asset-text": "Ajouter un nouvel actif",
- "any-asset": "Tout actif",
- "asset": "Actif",
- "asset-details": "Détails de l'actif",
- "asset-file": "Actif file",
- "asset-public": "L'actif est public",
- "asset-required": "Actif requis",
- "asset-type": "Type d'actif",
- "asset-type-list-empty": "Aucun type d'actif sélectionné.",
- "asset-type-required": "Le type d'actif est requis.",
- "asset-types": "Types d'actif",
- "assets": "Actifs",
- "assign-asset-to-customer": "Attribuer des actifs au client",
- "assign-asset-to-customer-text": "Veuillez sélectionner les actifs à attribuer au client",
- "assign-assets": "Attribuer des actifs",
- "assign-assets-text": "Attribuer {count, plural, 1 {1 asset} other {# assets}} au client",
- "assign-new-asset": "Attribuer un nouvel Asset",
- "assign-to-customer": "Attribuer au client",
- "assign-to-customer-text": "Veuillez sélectionner le client pour attribuer le ou les actifs",
- "assignedToCustomer": "attribué au client",
- "copyId": "Copier l'Id de l'actif",
- "delete": "Supprimer un actif",
- "delete-asset-text": "Faites attention, après la confirmation, l'actif et toutes les données associées deviendront irrécupérables.",
- "delete-asset-title": "Êtes-vous sûr de vouloir supprimer l'actif '{{assetName}}'?",
- "delete-assets": "Supprimer des actifs",
- "delete-assets-action-title": "Supprimer {count, plural, 1 {1 asset} other {# assets}}",
- "delete-assets-text": "Attention, après la confirmation, tous les actifs sélectionnés seront supprimés et toutes les données associées deviendront irrécupérables.",
- "delete-assets-title": "Êtes-vous sûr de vouloir supprimer {count, plural, 1 {1 asset} other {# assets}}?",
- "description": "Description",
- "details": "Détails",
- "enter-asset-type": "Entrez le type d'actif",
- "events": "Evénements",
- "idCopiedMessage": "L'Id d'asset a été copié dans le presse-papier",
- "import": "Import actifs",
- "make-private": "Rendre l'actif privé",
- "make-private-asset-text": "Après la confirmation, l'actif et toutes ses données seront rendus privés et ne seront pas accessibles par d'autres.",
- "make-private-asset-title": "Êtes-vous sûr de vouloir rendre l'actif '{{assetName}}' privé '?",
- "make-public": "Rendre l'actif public",
- "make-public-asset-text": "Après la confirmation, l'asset et toutes ses données seront rendus publics et accessibles aux autres.",
- "make-public-asset-title": "Êtes-vous sûr de vouloir rendre l'actif '{{assetName}}' public '?",
- "management": "Gestion d'actifs",
- "name": "Nom",
- "name-required": "Nom est requis.",
- "name-starts-with": "Le nom de l'actif commence par",
- "no-asset-types-matching": "Aucun type d'actif correspondant à {{entitySubtype}} n'a été trouvé. ",
- "no-assets-matching": "Aucun actif correspondant à {{entity}} n'a été trouvé. ",
- "no-assets-text": "Aucun actif trouvé",
- "public": "Public",
- "select-asset": "Sélectionner un actif",
- "select-asset-type": "Sélectionner le type d'actif",
- "type": "Type",
- "type-required": "Le type est requis.",
- "unassign-asset": "Retirer l'actif",
- "unassign-asset-text": "Après la confirmation, l'actif sera non attribué et ne sera pas accessible au client.",
- "unassign-asset-title": "Êtes-vous sûr de vouloir retirer l'attribution de l'actif '{{assetName}}'?",
- "unassign-assets": "Retirer les actifs",
- "unassign-assets-action-title": "Retirer {count, plural, 1 {1 asset} other {# assets}} du client",
- "unassign-assets-text": "Après la confirmation, tous les actifs sélectionnés ne seront pas attribués et ne seront pas accessibles au client.",
- "unassign-assets-title": "Êtes-vous sûr de vouloir retirer l'attribution de {count, plural, 1 {1 asset} other {# assets}}?",
- "unassign-from-customer": "Retirer du client",
- "view-assets": "Afficher les actifs",
- "label": "Label"
- },
- "attribute": {
- "add": "Ajouter un attribut",
- "add-to-dashboard": "Ajouter au tableau de bord",
- "add-widget-to-dashboard": "Ajouter un widget au tableau de bord",
- "attributes": "Attributs",
- "attributes-scope": "Étendue des attributs d'entité",
- "delete-attributes": "Supprimer les attributs",
- "delete-attributes-text": "Attention, après la confirmation, tous les attributs sélectionnés seront supprimés.",
- "delete-attributes-title": "Êtes-vous sûr de vouloir supprimer {count, plural, 1 {1 attribut} other {# attributs}}?",
- "enter-attribute-value": "Entrez la valeur de l'attribut",
- "key": "Clé",
- "key-required": "La Clé d'attribut est requise.",
- "last-update-time": "Dernière mise à jour",
- "latest-telemetry": "Dernière télémétrie",
- "next-widget": "Widget suivant",
- "prev-widget": "Widget précédent",
- "scope-client": "Attributs du client",
- "scope-latest-telemetry": "Dernière télémétrie",
- "scope-server": "Attributs du serveur",
- "scope-shared": "Attributs partagés",
- "selected-attributes": "{count, plural, 1 {1 attribut} other {# attributs}} sélectionnés",
- "selected-telemetry": "{count, plural, 1 {1 unité de télémétrie} other {# unités de télémétrie}} sélectionnées",
- "show-on-widget": "Afficher sur le widget",
- "value": "Valeur",
- "value-required": "La valeur d'attribut est obligatoire.",
- "widget-mode": "Mode du widget"
- },
- "audit-log": {
- "action-data": "Action data",
- "audit": "Audit",
- "audit-log-details": "Détails du journal d'audit",
- "audit-logs": "Journaux d'audit",
- "clear-search": "Effacer la recherche",
- "details": "Détails",
- "entity-name": "Nom de l'entité",
- "entity-type": "Type d'entité",
- "failure-details": "Détails de l'échec",
- "no-audit-logs-prompt": "Aucun journal trouvé",
- "search": "Rechercher les journaux d'audit",
- "status": "État",
- "status-failure": "Échec",
- "status-success": "Succès",
- "timestamp": "Horodatage",
- "type": "Type",
- "type-activated": "Activé",
- "type-added": "Ajouté",
- "type-alarm-ack": "Acquitté",
- "type-alarm-clear": "Effacé",
- "type-assigned-to-customer": "Attribué au client",
- "type-attributes-deleted": "Attributs supprimés",
- "type-attributes-read": "Attributs lus",
- "type-attributes-updated": "Attributs mis à jour",
- "type-credentials-read": "Lecture des informations d'identification",
- "type-credentials-updated": "Informations d'identification actualisées",
- "type-deleted": "Supprimé",
- "type-login": "Login",
- "type-logout": "Connectez - Out",
- "type-lockout": "Verrouillage",
- "type-relation-add-or-update": "Relation mise à jour",
- "type-relation-delete": "Relation supprimée",
- "type-relations-delete": "Toutes les relations ont été supprimées",
- "type-rpc-call": "Appel RPC",
- "type-suspended": "Suspendu",
- "type-unassigned-from-customer": "Non attribué du client",
- "type-updated": "Mise à jour",
- "user": "Utilisateur"
- },
- "common": {
- "enter-password": "Entrez le mot de passe",
- "enter-search": "Entrez la recherche",
- "enter-username": "Entrez le nom d'utilisateur",
- "password": "Mot de passe",
- "username": "Nom d'utilisateur"
- },
- "confirm-on-exit": {
- "html-message": "Vous avez des modifications non enregistrées.
Êtes-vous sûr de vouloir quitter cette page?",
- "message": "Vous avez des modifications non enregistrées. Êtes-vous sûr de vouloir quitter cette page?",
- "title": "Modifications non enregistrées"
- },
- "contact": {
- "address": "Adresse",
- "address2": "adresse 2",
- "city": "Ville",
- "country": "Pays",
- "email": "Email",
- "no-address": "Pas d'adresse",
- "phone": "Téléphone",
- "postal-code": "Code postal",
- "postal-code-invalid": "Format de code postal / code postal invalide",
- "state": "Province"
- },
- "content-type": {
- "binary": "Binaire (Base64)",
- "json": "Json",
- "text": "Texte"
- },
- "custom": {
- "widget-action": {
- "action-cell-button": "Bouton de cellule d'action",
- "marker-click": "Sur le marqueur cliquez",
- "row-click": "Au rang, cliquez",
- "polygon-click": "Cliquez sur le polygone",
- "tooltip-tag-action": "Action de balise d'info-bulle",
- "node-selected": "Sur le noeud sélectionné",
- "element-click": "Sur l'élément HTML, cliquez sur",
- "pie-slice-click": "Sur tranche cliquez",
- "row-double-click": "Sur la ligne double clic"
- }
- },
- "customer": {
- "add": "Ajouter un client",
- "add-customer-text": "Ajouter un nouveau client",
- "assets": "Actifs du client",
- "copyId": "Copier l'id du client",
- "customer": "Client",
- "customer-details": "Détails du client",
- "customer-required": "Le client est requis",
- "customers": "Clients",
- "dashboard": "Tableau de bord du client",
- "dashboards": "tableaux de bord du client",
- "default-customer": "Client par défaut",
- "default-customer-required": "Le client par défaut est requis pour déboguer le tableau de bord au niveau du Tenant",
- "delete": "Supprimer le client",
- "delete-customer-text": "Faites attention, après la confirmation, le client et toutes les données associées deviendront irrécupérables.",
- "delete-customer-title": "Êtes-vous sûr de vouloir supprimer le client '{{customerTitle}}'?",
- "delete-customers-action-title": "Supprimer {count, plural, 1 {1 customer} other {# customers}}",
- "delete-customers-text": "Faites attention, après la confirmation, tous les clients sélectionnés seront supprimés et toutes les données associées deviendront irrécupérables.",
- "delete-customers-title": "Êtes-vous sûr de vouloir supprimer {count, plural, 1 {1 customer} other {# customers}}?",
- "description": "Description",
- "details": "Détails",
- "devices": "Dispositifs du client",
- "entity-views": "Vues de l'entité client",
- "events": "Événements",
- "idCopiedMessage": "L'Id du client a été copié dans le presse-papier",
- "manage-assets": "Gérer les actifs",
- "manage-customer-assets": "Gérer les actifs du client",
- "manage-customer-dashboards": "Gérer les tableaux de bord du client",
- "manage-customer-devices": "Gérer les dispositifs du client",
- "manage-customer-users": "Gérer les utilisateurs du client",
- "manage-dashboards": "Gérer les tableaux de bord",
- "manage-devices": "Gérer les dispositifs",
- "manage-public-assets": "Gérer les actifs publics",
- "manage-public-dashboards": "Gérer les tableaux de bord publics",
- "manage-public-devices": "Gérer les dispositifs publics",
- "manage-users": "Gérer les utilisateurs",
- "management": "Gestion des clients",
- "no-customers-matching": "Aucun client correspondant à '{{entity}} n'a été trouvé.",
- "no-customers-text": "Aucun client trouvé",
- "public-assets": "Actifs publics",
- "public-dashboards": "Tableaux de bord publics",
- "public-devices": "Dispositifs publics",
- "public-entity-views": "Vues d'entités publiques",
- "select-customer": "Sélectionner un client",
- "select-default-customer": "Sélectionnez le client par défaut",
- "title": "Titre",
- "title-required": "Le titre est requis."
- },
- "dashboard": {
- "add": "Ajouter un tableau de bord",
- "add-dashboard-text": "Ajouter un nouveau tableau de bord",
- "add-state": "Ajouter un état du tableau de bord",
- "add-widget": "Ajouter un nouveau widget",
- "alias-resolution-error-title": "Erreur de configuration des alias de tableau de bord",
- "assign-dashboard-to-customer": "Attribuer des tableaux de bord au client",
- "assign-dashboard-to-customer-text": "Veuillez sélectionner les tableaux de bord à affecter au client",
- "assign-dashboards": "Attribuer des tableaux de bord",
- "assign-dashboards-text": "Attribuer {count, plural, 1 {1 tableau de bord} other {# tableaux de bord}} aux clients",
- "assign-new-dashboard": "Attribuer un nouveau tableau de bord",
- "assign-to-customer": "Attribuer au client",
- "assign-to-customer-text": "Veuillez sélectionner le client pour attribuer le ou les tableaux de bord",
- "assign-to-customers": "Attribuer des tableaux de bord aux clients",
- "assign-to-customers-text": "Veuillez sélectionner les clients pour attribuer les tableaux de bord",
- "assigned-customers": "clients affectés",
- "assignedToCustomer": "Attribué au client",
- "assignedToCustomers": "attribué aux clients",
- "autofill-height": "Hauteur de remplissage automatique",
- "background-color": "Couleur de fond",
- "background-image": "Image d'arriére-plan",
- "background-size-mode": "Mode de taille d'arriére-plan",
- "close-toolbar": "Fermer la barre d'outils",
- "columns-count": "Nombre de colonnes",
- "columns-count-required": "Le nombre de colonnes est requis.",
- "configuration-error": "Erreur de configuration",
- "copy-public-link": "Copier le lien public",
- "create-new": "Créer un nouveau tableau de bord",
- "create-new-dashboard": "Créer un nouveau tableau de bord",
- "create-new-widget": "Créer un nouveau widget",
- "dashboard": "Tableau de bord",
- "dashboard-details": "Détails du tableau de bord",
- "dashboard-file": "Fichier du tableau de bord",
- "dashboard-import-missing-aliases-title": "Configurer les alias utilisés par le tableau de bord importé",
- "dashboard-required": "Le tableau de bord est requis.",
- "dashboards": "Tableaux de bord",
- "delete": "Supprimer le tableau de bord",
- "delete-dashboard-text": "Faites attention, après la confirmation, le tableau de bord et toutes les données associées deviendront irrécupérables.",
- "delete-dashboard-title": "Êtes-vous sûr de vouloir supprimer le tableau de bord '{{dashboardTitle}}'?",
- "delete-dashboards": "Supprimer les tableaux de bord",
- "delete-dashboards-action-title": "Supprimer {count, plural, 1 {1 tableau de bord} other {# tableaux de bord}}",
- "delete-dashboards-text": "Attention, après la confirmation, tous les tableaux de bord sélectionnés seront supprimés et toutes les données associées deviendront irrécupérables.",
- "delete-dashboards-title": "Voulez-vous vraiment supprimer {count, plural, 1 {1 tableau de bord} other {# tableaux de bord}}?",
- "delete-state": "Supprimer l'état du tableau de bord",
- "delete-state-text": "Etes-vous sûr de vouloir supprimer l'état du tableau de bord avec le nom '{{stateName}}'?",
- "delete-state-title": "Supprimer l'état du tableau de bord",
- "description": "Description",
- "details": "Détails",
- "display-dashboard-export": "Afficher l'exportation",
- "display-dashboard-timewindow": "Afficher fenêtre de temps",
- "display-dashboards-selection": "Afficher la sélection des tableaux de bord",
- "display-entities-selection": "Afficher la sélection des entités",
- "display-title": "Afficher le titre du tableau de bord",
- "drop-image": "Déposer une image ou cliquez pour sélectionner un fichier à télécharger.",
- "edit-state": "Modifier l'état du tableau de bord",
- "export": "Exporter le tableau de bord",
- "export-failed-error": "Impossible d'exporter le tableau de bord: {{error}}",
- "hide-details": "Masquer les détails",
- "horizontal-margin": "Marge horizontale",
- "horizontal-margin-required": "Une valeur de marge horizontale est requise.",
- "import": "Importer le tableau de bord",
- "import-widget": "Importer un widget",
- "invalid-aliases-config": "Impossible de trouver des dispositifs correspondant à certains filtres d'alias.
Veuillez contacter votre administrateur pour résoudre ce problème.",
- "invalid-dashboard-file-error": "Impossible d'importer le tableau de bord: structure de données du tableau de bord non valide",
- "invalid-widget-file-error": "Impossible d'importer le widget: structure de données de widget invalide.",
- "is-root-state": "État racine",
- "make-private": "Rendre privé le tableau de bord",
- "make-private-dashboard": "Rendre privé le tableau de bord",
- "make-private-dashboard-text": "Après la confirmation, le tableau de bord sera rendu privé et ne sera plus accessible aux autres.",
- "make-private-dashboard-title": "Êtes-vous sûr de vouloir rendre le tableau de bord '{{dashboardTitle}}' privé?",
- "make-public": "Rendre public le tableau de bord",
- "manage-assigned-customers": "Gérer les clients affectés",
- "manage-states": "Gérer les états du tableau de bord",
- "management": "Gestion du tableau de bord",
- "max-columns-count-message": "Seulement 1000 colonnes maximum sont autorisées.",
- "max-horizontal-margin-message": "Seulement 50 sont autorisés en tant que valeur de marge horizontale maximale.",
- "max-mobile-row-height-message": "Seuls 200 pixels sont autorisés en tant que valeur maximale de hauteur de ligne mobile.",
- "max-vertical-margin-message": "Seulement 50 sont autorisés en tant que valeur de marge verticale maximale.",
- "min-columns-count-message": "Seul un nombre minimum de 10 colonnes est autorisé.",
- "min-horizontal-margin-message": "Seul 0 est autorisé comme valeur de marge horizontale minimale.",
- "min-mobile-row-height-message": "Seuls 5 pixels sont autorisés en tant que valeur minimale de hauteur de ligne mobile.",
- "min-vertical-margin-message": "Seul 0 est autorisé comme valeur de marge verticale minimale.",
- "mobile-layout": "Paramètres de mise en page mobiles",
- "mobile-row-height": "Hauteur de ligne mobile, px",
- "mobile-row-height-required": "Une valeur de hauteur de ligne mobile est requise.",
- "new-dashboard-title": "Nouveau titre du tableau de bord",
- "no-dashboards-matching": "Aucun tableau de bord correspondant à {{entity}} n'a été trouvé. ",
- "no-dashboards-text": "Aucun tableau de bord trouvé",
- "no-image": "Aucune image sélectionnée",
- "no-widgets": "Aucun widget configuré",
- "open-dashboard": "Ouvrir le tableau de bord",
- "open-toolbar": "Ouvrir la barre d'outils du tableau de bord",
- "public": "Public",
- "public-dashboard-notice": " Remarque: b> N'oubliez pas de rendre publics les dispositifs associés pour accéder à leurs données.",
- "public-dashboard-text": "Votre tableau de bord {{dashboardTitle}} b> est maintenant public et accessible via le lien public : ",
- "public-dashboard-title": "Le tableau de bord est maintenant public",
- "public-link": "Lien public",
- "public-link-copied-message": "Le lien public du tableau de bord a été copié dans le presse-papier",
- "search-states": "Recherche des états du tableau de bord",
- "select-dashboard": "Sélectionner le tableau de bord",
- "select-devices": "Selectionner les dispositifs",
- "select-existing": "Sélectionnez un tableau de bord existant",
- "select-state": "Sélectionnez l'état cible",
- "select-widget-subtitle": "Liste des types de widgets disponibles",
- "select-widget-title": "Sélectionner un widget",
- "selected-states": "{count, plural, 1 {1 état du tableau de bord} other {# états du tableau de bord}} sélectionnés",
- "set-background": "Définir l'arrière-plan",
- "settings": "Paramètres",
- "show-details": "Afficher les détails",
- "socialshare-text": "'{{dashboardTitle}}' propulsé par ThingsBoard",
- "socialshare-title": "'{{dashboardTitle}}' propulsé par ThingsBoard",
- "state": "État du tableau de bord",
- "state-controller": "Contrôleur d'état",
- "state-id": "ID d'état",
- "state-id-exists": "L'état du tableau de bord avec le même Id existe déjà.",
- "state-id-required": "L'Id d'état du tableau de bord est requis.",
- "state-name": "Nom",
- "state-name-required": "Le nom de l'état du tableau de bord est requis",
- "states": "États du tableau de bord",
- "title": "Titre",
- "title-color": "Couleur du titre",
- "title-required": "Le titre est requis.",
- "toolbar-always-open": "Garder la barre d'outils ouverte",
- "unassign-dashboard": "Retirer le tableau de bord",
- "unassign-dashboard-text": "Après la confirmation, le tableau de bord ne sera pas attribué et ne sera pas accessible au client.",
- "unassign-dashboard-title": "Êtes-vous sûr de vouloir annuler l'affectation du tableau de bord '{{dashboardTitle}}'?",
- "unassign-dashboards": "Retirer les tableaux de bord",
- "unassign-dashboards-action-text": "Annuler l'affectation {count, plural, 1 {1 tableau de bord} other {# tableaux de bord}} des clients",
- "unassign-dashboards-action-title": "Annuler l'affectation {count, plural, 1 {1 tableau de bord} other {# tableaux de bord}} du client",
- "unassign-dashboards-text": "Après la confirmation, tous les tableaux de bord sélectionnés ne seront pas attribués et ne seront pas accessibles au client.",
- "unassign-dashboards-title": "Etes-vous sûr de vouloir annuler l'affectation {count, plural, 1 {1 tableau de bord} other {# tableaux de bord}}?",
- "unassign-from-customer": "Retirer du client",
- "unassign-from-customers": "Retirer les tableaux de bord des clients",
- "unassign-from-customers-text": "Veuillez sélectionner les clients à annuler l'affectation du ou des tableaux de bord",
- "vertical-margin": "Marge verticale",
- "vertical-margin-required": "Une valeur de marge verticale est requise",
- "view-dashboards": "Afficher les tableaux de bord",
- "widget-file": "Fichier du Widget",
- "widget-import-missing-aliases-title": "Configurer les alias utilisés par le widget importé",
- "widgets-margins": "Marge entre les widgets"
- },
- "datakey": {
- "advanced": "Avancé",
- "alarm": "Champs d'alarme",
- "alarm-fields-required": "Les champs d'alarme sont obligatoires.",
- "attributes": "Attributs",
- "color": "Couleur",
- "configuration": "Configuration de la clé de données",
- "data-generation-func": "Fonction de génération de données",
- "decimals": "Nombre de chiffres après virgule flottante",
- "function-types": "Types de fonctions",
- "function-types-required": "Les types de fonctions sont obligatoires",
- "label": "Label",
- "maximum-function-types": "Maximum {count, plural, 1 {1 type de fonction est autorisé.} other {# types de fonctions sont autorisés}}",
- "maximum-timeseries-or-attributes": "Maximum {count, plural, 1 {1 timeseries / attribut est autorisé.} other {# timeseries / attributs sont autorisés}}",
- "prev-orig-value-description": "valeur précédente d'origine;",
- "prev-value-description": "résultat de l'appel de fonction précédent;",
- "settings": "Paramètres",
- "time-description": "horodatage de la valeur actuelle;",
- "time-prev-description": "horodatage de la valeur précédente;",
- "timeseries": "Timeseries",
- "timeseries-or-attributes-required": "Les timeseries / attributs d'entité sont obligatoires.",
- "timeseries-required": "Les Timeseries de l'entité sont obligatoires.",
- "units": "Symbole spécial à afficher à côté de la valeur",
- "use-data-post-processing-func": "Utiliser la fonction de post-traitement des données",
- "value-description": "la valeur actuelle;"
- },
- "datasource": {
- "add-datasource-prompt": "Veuillez ajouter une source de données",
- "name": "Nom",
- "type": "Type de source de données"
- },
- "datetime": {
- "date-from": "Date de",
- "date-to": "Date à",
- "time-from": "Heure de",
- "time-to": "Heure à"
- },
- "details": {
- "edit-mode": "Mode édition",
- "toggle-edit-mode": "Activer le mode édition"
- },
- "device": {
- "access-token": "Jeton d'accès",
- "access-token-invalid": "La longueur du jeton d'accès doit être comprise entre 1 et 20 caractéres.",
- "access-token-required": "Le jeton d'accès est requis.",
- "accessTokenCopiedMessage": "Le jeton d'accès au dispositif a été copié dans le presse-papier",
- "add": "Ajouter un dispositif",
- "add-alias": "Ajouter un alias de dispositif",
- "add-device-text": "Ajouter un nouveau dispositif",
- "alias": "Alias",
- "alias-required": "Un alias du dispositif est requis.",
- "aliases": "Alias des dispositifs",
- "any-device": "N'importe quel dispositif",
- "assign-device-to-customer": "Affecter des dispositifs au client",
- "assign-device-to-customer-text": "Veuillez sélectionner les dispositif à affecter au client",
- "assign-devices": "Attribuer des dispositifs",
- "assign-devices-text": "Attribuer {count, plural, 1 {1 dispositif} other {# dispositifs}} au client",
- "assign-new-device": "Attribuer un nouveau dispositif",
- "assign-to-customer": "Attribuer au client",
- "assign-to-customer-text": "Veuillez sélectionner le client pour attribuer le ou les dispositifs",
- "assignedToCustomer": "Attribué au client",
- "configure-alias": "Configurer '{{alias}}' alias",
- "copyAccessToken": "Copier le jeton d'accès",
- "copyId": "Copier l'Id du dispositif",
- "create-new-alias": "Créez un nouveau!",
- "create-new-key": "Créez un nouveau!",
- "credentials": "Informations d'identification",
- "credentials-type": "Type d'identification",
- "delete": "Supprimer le dispositif",
- "delete-device-text": "Faites attention, après la confirmation, le dispositif et toutes les données associées deviendront irrécupérables.",
- "delete-device-title": "Êtes-vous sûr de vouloir supprimer le dispositif '{{deviceName}}'?",
- "delete-devices": "Supprimer les dispositifs",
- "delete-devices-action-title": "Supprimer {count, plural, 1 {1 device} other {# devices}}",
- "delete-devices-text": "Faites attention, après la confirmation, tous les dispositifs sélectionnés seront supprimés et toutes les données associées deviendront irrécupérables.",
- "delete-devices-title": "Êtes-vous sûr de vouloir supprimer {count, plural, 1 {1 device} other {# devices}}?",
- "description": "Description",
- "details": "Détails",
- "device": "Dispositif",
- "device-alias": "Alias du dispositif",
- "device-credentials": "Informations d'identification du dispositif",
- "device-details": "Détails du dispositif",
- "device-list": "Liste des dispositifs",
- "device-list-empty": "Aucun dispositif sélectionné.",
- "device-name-filter-no-device-matched": "Aucun dispositif commençant par '{{device}} n'a été trouvé.",
- "device-name-filter-required": "Le filtre de nom de dispositif est requis.",
- "device-public": "Le dispositif est public",
- "device-required": "Le dispositif est requis.",
- "device-type": "Type de dispositif",
- "device-type-list-empty": "Aucun type de dispositif sélectionné.",
- "device-type-required": "Le type de dispositif est requis.",
- "device-types": "Types de dispositif",
- "devices": "Dispositifs",
- "duplicate-alias-error": "Alias ??en double trouvé '{{alias}}'.
Les alias de dispositifs doivent être uniques dans le tableau de bord.",
- "enter-device-type": "Entrez le type de dispositif",
- "events": "Événements",
- "idCopiedMessage": "l'Id du dispositif a été copié dans le presse-papiers",
- "is-gateway": "Est une passerelle",
- "label": "Label",
- "make-private": "Rendre le dispositif privé",
- "make-private-device-text": "Après la confirmation, le dispositif et toutes ses données seront rendues privées et ne seront pas accessibles par d'autres.",
- "make-private-device-title": "Êtes-vous sûr de vouloir rendre le dispositif {{deviceName}} privé?",
- "make-public": "Rendre le dispositif public",
- "make-public-device-text": "Après la confirmation, le dispositif et toutes ses données seront rendus publics et accessibles par d'autres.",
- "make-public-device-title": "Êtes-vous sûr de vouloir rendre le dispositif {{deviceName}} 'public?",
- "manage-credentials": "Gérer les informations d'identification",
- "management": "Gestion des dispositifs",
- "name": "Nom",
- "name-required": "Le nom est requis.",
- "name-starts-with": "Le nom du dispositif commence par",
- "no-alias-matching": "'{{alias}}' introuvable.",
- "no-aliases-found": "Aucun alias trouvé.",
- "no-device-types-matching": "Aucun type de dispositif correspondant à {{entitySubtype}} n'a été trouvé.",
- "no-devices-matching": "Aucun dispositif correspondant à '{{entity}} n'a été trouvé.",
- "no-devices-text": "Aucun dispositif trouvé",
- "no-key-matching": "'{{key}}' introuvable.",
- "no-keys-found": "Aucune clé trouvée",
- "public": "Public",
- "remove-alias": "Supprimer l'alias du dispositif",
- "rsa-key": "Clé publique RSA",
- "rsa-key-required": "La clé publique RSA est requise.",
- "secret": "Secret",
- "secret-required": "Code secret est requis.",
- "select-device": "Selectionner un dispositif",
- "select-device-type": "Sélectionner le type d'appareil",
- "unable-delete-device-alias-text": "L'alias du dispositif '{{deviceAlias}}' ne peut pas être supprimé car il est utilisé par les widgets suivants:
{{widgetsList}}",
- "unable-delete-device-alias-title": "Impossible de supprimer l'alias du dispositif",
- "unassign-device": "Annuler l'affectation du dispositif",
- "unassign-device-text": "Après la confirmation, le dispositif ne sera pas attribué et ne sera pas accessible au client.",
- "unassign-device-title": "Êtes-vous sûr de vouloir annuler l'affection du dispositif {{deviceName}} '?",
- "unassign-devices": "Annuler l'affectation des dispositifs",
- "unassign-devices-action-title": "Annuler l'affectation de {count, plural, 1 {1 device} other {#devices}} du client",
- "unassign-devices-text": "Après la confirmation, tous les dispositifs sélectionnés ne seront pas attribues et ne seront pas accessibles par le client.",
- "unassign-devices-title": "Voulez-vous vraiment annuler l'affectation de {count, plural, 1 {1 device} other {# devices}}?",
- "unassign-from-customer": "Retirer du client",
- "use-device-name-filter": "Utiliser le filtre",
- "view-credentials": "Afficher les informations d'identification",
- "view-devices": "Afficher les dispositifs"
- },
- "dialog": {
- "close": "Fermer le dialogue"
- },
- "entity": {
- "add-alias": "Ajouter un alias d'entité",
- "alarm-name-starts-with": "Les actifs dont le nom commence par '{{prefix}}'",
- "alias": "Alias",
- "alias-required": "Un alias d'entité est requis.",
- "aliases": "alias d'entité",
- "all-subtypes": "Tout",
- "any-entity": "Toute entité",
- "asset-name-starts-with": "Les Assets dont le nom commence par '{{prefix}}'",
- "columns-to-display": "Colonnes à afficher",
- "configure-alias": "Configurer '{{alias}}' alias",
- "create-new-alias": "Créez un nouveau!",
- "create-new-key": "Créez un nouveau!",
- "customer-name-starts-with": "Les clients dont les noms commencent par '{{prefix}}'",
- "dashboard-name-starts-with": "Les tableaux de bord dont les noms commencent par '{{prefix}}'",
- "details": "Détails de l'entité",
- "device-name-starts-with": "Dispositifs dont le nom commence par '{{prefix}}'",
- "duplicate-alias-error": "Alias en double trouvé '{{alias}}'.
Les alias d'entité doivent être uniques dans le tableau de bord.",
- "enter-entity-type": "Entrez le type d'entité",
- "entities": "Entités",
- "entity": "Entité",
- "entity-alias": "Alias de l'entité",
- "entity-list": "Liste d'entités",
- "entity-list-empty": "Aucune entité sélectionnée.",
- "entity-name": "Nom de l'entité",
- "entity-name-filter-no-entity-matched": "Aucune entité commençant par '{{entity}}' n'a été trouvée.",
- "entity-name-filter-required": "Le filtre de nom d'entité est requis.",
- "entity-type": "Type d'entité",
- "entity-type-list": "Liste de types d'entités",
- "entity-type-list-empty": "Aucun type d'entité sélectionné.",
- "entity-types": "Types d'entité",
- "entity-view-name-starts-with": "Les vues d'entité dont le nom commence par '{{prefix}}'",
- "key": "Clé",
- "key-name": "Nom de la clé",
- "list-of-alarms": "{count, plural, 1 {Une alarme} other {Liste de # alarmes}}",
- "list-of-assets": "{count, plural, 1 {Un Asset} other {Liste de # Assets}}",
- "list-of-customers": "{count, plural, 1 {Un client} other {Liste de # clients}}",
- "list-of-dashboards": "{count, plural, 1 {Un tableau de bord} other {Liste de # tableaux de bord}}",
- "list-of-devices": "{count, plural, 1 {Un dispositif} other {Liste de # dispositifs}}",
- "list-of-plugins": "{count, plural, 1 {Un plugin} other {Liste de # plugins}}",
- "list-of-rulechains": "{count, plural, 1 {Une chaîne de règles} other {Liste de # chaînes de règles}}",
- "list-of-rulenodes": "{count, plural, 1 {Un noeud de règles} other {Liste de # noeuds de règles}}",
- "list-of-rules": "{count, plural, 1 {Une règle} other {Liste de # règles}}",
- "list-of-tenants": "{count, plural, 1 {Un tenant} other {Liste de # tenants}}",
- "list-of-users": "{count, plural, 1 {Un utilisateur} other {Liste de # utilisateurs}}",
- "missing-entity-filter-error": "Le filtre est manquant pour l'alias '{{alias}}'.",
- "name-starts-with": "Nom commence par",
- "no-alias-matching": "'{{alias}}' introuvable.",
- "no-aliases-found": "Aucun alias trouvé.",
- "no-data": "Aucune donnée à afficher",
- "no-entities-matching": "Aucune entité correspondant à '{{entity}}' n'a été trouvée.",
- "no-entities-prompt": "Aucune entité trouvée",
- "no-entity-types-matching": "Aucun type d'entité correspondant à {{entityType}} n'a été trouvé. ",
- "no-key-matching": "'{{key}}' introuvable.",
- "no-keys-found": "Aucune clé trouvée",
- "plugin-name-starts-with": "Plugins dont les noms commencent par '{{prefix}}'",
- "remove-alias": "Supprimer l'alias d'entité",
- "rule-name-starts-with": "Régles dont les noms commencent par '{{prefix}}'",
- "rulechain-name-starts-with": "Chaînes de régles dont les noms commencent par '{{prefix}}'",
- "rulenode-name-starts-with": "Les noeuds de régles dont le nom commence par '{{prefix}}'",
- "search": "Recherche d'entités",
- "select-entities": "Sélectionner des entités",
- "selected-entities": "{count, plural, 1 {1 entité} other {# entités}} sélectionnées",
- "tenant-name-starts-with": "Les Tenant dont le nom commence par '{{prefix}}'",
- "type": "Type",
- "type-alarm": "Alarme",
- "type-alarms": "Alarmes",
- "type-asset": "Actif",
- "type-assets": "Actifs",
- "type-current-customer": "Client actuel",
- "type-customer": "Client",
- "type-customers": "Clients",
- "type-dashboard": "Tableau de bord",
- "type-dashboards": "Tableaux de bord",
- "type-device": "Dispositif",
- "type-devices": "Dispositifs",
- "type-entity-view": "Vue d'entité",
- "type-entity-views": "Vues d'entités",
- "type-plugin": "Plugin",
- "type-plugins": "Plugins",
- "type-required": "Le type d'entité est obligatoire.",
- "type-rule": "Régle",
- "type-rulechain": "Chaîne de régles",
- "type-rulechains": "Chaînes de régles",
- "type-rulenode": "Noeud de régle",
- "type-rulenodes": "Noeuds de régle",
- "type-rules": "Régles",
- "type-tenant": "Tenant",
- "type-tenants": "Tenants",
- "type-user": "Utilisateur",
- "type-users": "Utilisateurs",
- "unable-delete-entity-alias-text": "L'alias d'entité '{{entityAlias}}' ne peut pas être supprimé car il est utilisé par les widgets suivants:
{{widgetsList}}",
- "unable-delete-entity-alias-title": "Impossible de supprimer l'alias d'entité",
- "use-entity-name-filter": "Utiliser un filtre",
- "user-name-starts-with": "Utilisateurs dont les noms commencent par '{{prefix}}'"
- },
- "entity-field": {
- "address": "Adresse",
- "address2": "Adresse 2",
- "city": "Ville",
- "country": "Pays",
- "created-time": "Heure de création",
- "email": "Email",
- "first-name": "Prénom",
- "last-name": "Nom de famille",
- "name": "Nom",
- "phone": "Téléphone",
- "state": "Prov",
- "title": "Titre",
- "type": "Type",
- "zip": "Code postal"
- },
- "entity-view": {
- "add": "Ajouter une vue d'entité",
- "add-alias": "Ajouter un alias de vue d'entité",
- "add-entity-view-text": "Ajouter une nouvelle vue d'entité",
- "alias": "Alias",
- "alias-required": "Un alias de vue d'entité est requis.",
- "aliases": "Alias de vue d'entité",
- "any-entity-view": "Toute vue d'entité",
- "assign-entity-view-to-customer": "Attribuer une (des) vue (s) d'entité à un client",
- "assign-entity-view-to-customer-text": "Veuillez sélectionner les vues d'entité à affecter au client",
- "assign-entity-views": "Attribuer des vues d'entité",
- "assign-entity-views-text": "Attribuer { count, plural, 1 {1 entityView} other {# entityViews} } au client",
- "assign-new-entity-view": "Attribuer une nouvelle vue d'entité",
- "assign-to-customer": "Attribuer au client",
- "assign-to-customer-text": "Veuillez sélectionner le client auquel attribuer la ou les vues d'entité.",
- "assignedToCustomer": "Assigné au client",
- "attributes-propagation": "Propagation des attributs",
- "attributes-propagation-hint": "La vue d'entité copiera automatiquement les attributs spécifiés de l'entité cible chaque fois que vous enregistrez ou mettez à jour cette vue d'entité. Pour des raisons de performances, les attributs d'entité cible ne sont pas propagés à la vue d'entité à chaque changement d'attribut. Vous pouvez activer la propagation automatique en configurant le noeud de règle \" copier pour afficher \" dans votre chaîne de règles et en liant les messages \"Post attributs \" et \"attributs mis à jour \" au nouveau noeud de règle.",
- "client-attributes": "Attributs du client",
- "client-attributes-placeholder": "Attributs du client",
- "configure-alias": "Configurez l'alias '{{alias}}'",
- "copyId": "Copier l'ID de la vue d'entité",
- "create-new-alias": "Créer un nouveau!",
- "create-new-key": "Créer un nouveau!",
- "date-limits": "Limites de date",
- "delete": "Supprimer la vue d'entité",
- "delete-entity-view-text": "Attention, après la confirmation, la vue de l'entité et toutes les données associées deviendront irrécupérables.",
- "delete-entity-view-title": "Êtes-vous sûr de vouloir supprimer la vue de l'entité '{{entityViewName}}'?",
- "delete-entity-views": "Supprimer les vues d'entité",
- "delete-entity-views-action-title": "Supprimer { count, plural, 1 {1 entityView} other {# entityViews} }",
- "delete-entity-views-text": "Attention, après la confirmation, toutes les vues d'entité sélectionnées seront supprimées et toutes les données associées deviendront irrécupérables.",
- "delete-entity-views-title": "Êtes-vous sûr de vouloir voir l'entité { count, plural, 1 {1 entityView} other {# entityViews} }?",
- "description": "Description",
- "details": "Détails",
- "duplicate-alias-error": "Alias '{{alias}}' existe déjà.
Les alias de vue d'entité doivent être uniques dans le tableau de bord.",
- "end-date": "Date de fin",
- "end-ts": "Heure de fin",
- "enter-entity-view-type": "Entrer le type de vue d'entité",
- "entity-view": "Vue d'entité",
- "entity-view-alias": "Alias de vue d'entité",
- "entity-view-details": "Détails de la vue d'entité",
- "entity-view-list": "Liste de vues d'entités",
- "entity-view-list-empty": "Aucune vue d'entité sélectionnée.",
- "entity-view-name-filter-no-entity-view-matched": "Aucune vue d'entité commençant par '{{entityView}}' n'a été trouvée.",
- "entity-view-name-filter-required": "Un filtre de nom de vue d'entité est requis.",
- "entity-view-required": "Une vue d'entité est requise.",
- "entity-view-type": "Type de vue d'entité",
- "entity-view-type-list-empty": "Aucun type de vue d'entité sélectionné.",
- "entity-view-type-required": "Le type d'entité est requis.",
- "entity-view-types": "Types de vues d'entité",
- "entity-views": "Vues d'entité",
- "events": "Événements",
- "make-private": "Rendre la vue d'entité privée",
- "make-private-entity-view-text": "Après la confirmation, la vue de l'entité et toutes ses données seront rendues privées et ne seront pas accessibles par d'autres",
- "make-private-entity-view-title": "Êtes-vous sûr de vouloir rendre la vue d'entité '{{entityViewName}}' privée?",
- "make-public": "Rendre la vue d'entité publique",
- "make-public-entity-view-text": "Après la confirmation, la vue de l'entité et toutes ses données seront rendues publiques et accessibles à d'autres",
- "make-public-entity-view-title": "Voulez-vous vraiment que la vue de l'entité '{{entityViewName}}' soit publique?",
- "management": "Gestion de vue d'entité",
- "name": "Nom",
- "name-required": "Un nom est requis.",
- "name-starts-with": "Le nom de la vue d'entité commence par",
- "no-alias-matching": "'{{alias}}' non trouvé.",
- "no-aliases-found": "Aucun alias trouvé.",
- "no-entity-view-types-matching": "Aucun type de vue d'entité correspondant à '{{entitySubtype}}' n'a été trouvé.",
- "no-entity-views-matching": "Aucune vue d'entité correspondant à '{{entity}}' n'a été trouvée.",
- "no-entity-views-text": "Aucune vue d'entité trouvée.",
- "no-key-matching": "'{{key}}' non trouvé.",
- "no-keys-found": "Aucune clé trouvée.",
- "remove-alias": "Supprimer un alias de vue d'entité",
- "select-entity-view": "Sélectionner une vue d'entité",
- "select-entity-view-type": "Sélectionner le type de vue d'entité",
- "server-attributes": "Attributs du serveur",
- "server-attributes-placeholder": "Attributs du serveur",
- "shared-attributes": "Attributs partagés",
- "shared-attributes-placeholder": "Attributs partagés",
- "start-date": "Date de début",
- "start-ts": "Heure de début",
- "target-entity": "Entité cible",
- "timeseries": "Séries chronologiques",
- "timeseries-data": "Données de séries chronologiques",
- "timeseries-data-hint": "Configurez les clés de données de séries chronologiques de l'entité cible qui seront accessibles à la vue de l'entité. Ces données temporelles sont en lecture seule.",
- "timeseries-placeholder": "Séries chronologiques",
- "unable-entity-view-device-alias-text": "L'alias de dispositif '{{entityViewAlias}}' ne peut pas être supprimé car il est utilisé par les widgets suivants:
{{widgetsList}}",
- "unable-entity-view-device-alias-title": "Impossible de supprimer l'alias de la vue d'entité.",
- "unassign-entity-view": "Annuler l'affectation de la vue d'entité",
- "unassign-entity-view-text": "Après la confirmation, la vue de l'entité sera non attribuée et ne sera pas accessible par le client.",
- "unassign-entity-view-title": "Voulez-vous vraiment annuler l'attribution de la vue d'entité '{{entityViewName}}'?",
- "unassign-entity-views": "Annuler l'attribution des vues d'entité",
- "unassign-entity-views-action-title": "Annuler l'attribution { count, plural, 1 {1 entityView} other {# entityViews} } du client",
- "unassign-entity-views-text": "Après la confirmation, toutes les vues des entités sélectionnées seront non attribuées et ne seront pas accessibles par le client.",
- "unassign-entity-views-title": "Êtes-vous sûr de vouloir annuler l'attribution { count, plural, 1 {1 entityView} other {# entityViews} }?",
- "unassign-from-customer": "Annuler l'attribution au client",
- "use-entity-view-name-filter": "Use filter",
- "view-entity-views": "Voir les vues d'entité"
- },
- "error": {
- "unable-to-connect": "Impossible de se connecter au serveur! Veuillez vérifier votre connexion Internet.",
- "unhandled-error-code": "Code d'erreur non géré: {{errorCode}}",
- "unknown-error": "Erreur inconnue"
- },
- "event": {
- "alarm": "Alarme",
- "body": "Corps",
- "data": "Données",
- "data-type": "Type de données",
- "entity": "Entité",
- "error": "erreur",
- "errors-occurred": "Des erreurs sont survenues",
- "event": "événement",
- "event-time": "Heure de l'événement",
- "event-type": "Type d'événement",
- "failed": "Échec",
- "message-id": "Message Id",
- "message-type": "Type de message",
- "messages-processed": "Messages traités",
- "metadata": "Métadonnées",
- "method": "Méthode",
- "no-events-prompt": "Aucun événement trouvé",
- "relation-type": "Type de relation",
- "server": "Serveur",
- "status": "État",
- "success": "Succès",
- "type": "Type",
- "type-debug-rule-chain": "Debug",
- "type-debug-rule-node": "Debug",
- "type-error": "Erreur",
- "type-lc-event": "Evénement du cycle de vie",
- "type-stats": "Statistiques"
- },
- "extension": {
- "add": "Ajouter une extension",
- "add-attribute": "Ajouter un attribut",
- "add-attribute-request": "Ajouter une demande d'attribut",
- "add-attribute-update": "Ajouter une mise à jour d'attribut",
- "add-broker": "Ajouter un Broker",
- "add-config": "Ajouter une configuration de convertisseur",
- "add-connect-request": "Ajouter une demande de connexion",
- "add-converter": "Ajouter un convertisseur",
- "add-device": "Ajouter un dispositif",
- "add-disconnect-request": "Ajouter une demande de déconnexion",
- "add-map": "Ajouter un élément de mappage",
- "add-server-side-rpc-request": "Ajouter une requête RPC côté serveur",
- "add-timeseries": "Ajouter des timeseries",
- "anonymous": "Anonyme",
- "attr-json-key-expression": "Expression json de la clé d'attribut",
- "attr-topic-key-expression": "Expression du topic de la clé d'attribut",
- "attribute-filter": "Filtre d'attribut",
- "attribute-key-expression": "Expression de clé d'attribut",
- "attribute-requests": "Demandes d'attributs",
- "attribute-updates": "Mises à jour des attributs",
- "attributes": "Attributs",
- "basic": "Basic",
- "brokers": "Brokers",
- "ca-cert": "Fichier de certificat CA",
- "cert": "Fichier de certificat *",
- "client-scope": "Portée client",
- "configuration": "Configuration",
- "connect-requests": "Demandes de connexion",
- "converter-configurations": "Configurations du convertisseur",
- "converter-id": "ID du convertisseur",
- "converter-json": "Json",
- "converter-json-parse": "Impossible d'analyser le convertisseur json.",
- "converter-json-required": "Le convertisseur json est requis.",
- "converter-type": "Type de convertisseur",
- "converters": "Convertisseurs",
- "credentials": "Informations d'identification",
- "custom": "Sur mesure",
- "delete": "Supprimer l'extension",
- "delete-extension-text": "Attention, après la confirmation, l'extension et toutes les données associées deviendront irrécupérables.",
- "delete-extension-title": "Êtes-vous sûr de vouloir supprimer l'extension '{{extensionId}}'?",
- "delete-extensions-text": "Attention, après la confirmation, toutes les extensions sélectionnées seront supprimées.",
- "delete-extensions-title": "Êtes-vous sûr de vouloir supprimer {count, plural, 1 {1 extension} other {# extensions}}?",
- "device-name-expression": "expression du nom du dispositif",
- "device-name-filter": "Filtre de nom de dispositif",
- "device-type-expression": "expression de type de dispositif",
- "disconnect-requests": "Demandes de déconnection",
- "drop-file": "Déposez un fichier ou cliquez pour sélectionner un fichier à télécharger.",
- "edit": "Modifier l'extension",
- "export-extension": "Exporter l'extension",
- "export-extensions-configuration": "Exporter la configuration des extensions",
- "extension-id": "Id de l'extension",
- "extension-type": "Type d'extension",
- "extensions": "Extensions",
- "field-required": "Le champ est obligatoire",
- "file": "Fichier d'extensions",
- "filter-expression": "Expression du filtre",
- "host": "Hôte",
- "id": "Id",
- "import-extension": "Importer une extension",
- "import-extensions": "Importer des extensions",
- "import-extensions-configuration": "Importer la configuration des extensions",
- "invalid-file-error": "Fichier d'extension non valide",
- "json-name-expression": "Expression json du nom du dispositif",
- "json-parse": "Impossible d'analyser json transformer.",
- "json-required": "Transformer json est requis.",
- "json-type-expression": "Expression json du type de dispositif",
- "key": "Clé",
- "mapping": "Mappage",
- "method-filter": "Filtre de méthode",
- "modbus-add-server": "Ajouter serveur/esclave",
- "modbus-add-server-prompt": "Veuillez ajouter serveur/esclave",
- "modbus-attributes-poll-period": "Période d'interrogation des attributs (ms)",
- "modbus-baudrate": "Débit en bauds",
- "modbus-byte-order": "Ordre des octets",
- "modbus-databits": "Bits de données",
- "modbus-databits-range": "Les bits de données doivent être compris entre 7 et 8.",
- "modbus-device-name": "Nom du dispositif",
- "modbus-encoding": "Encodage",
- "modbus-function": "Fonction",
- "modbus-parity": "parité",
- "modbus-poll-period": "Période d'interrogation (ms)",
- "modbus-poll-period-range": "La période d'interrogation doit être une valeur positive.",
- "modbus-port-name": "Nom du port série",
- "modbus-register-address": "Adresse du registre",
- "modbus-register-address-range": "L'adresse du registre doit être comprise entre 0 et 65535.",
- "modbus-register-bit-index": "Bit index",
- "modbus-register-bit-index-range": "L'index de bit doit être compris entre 0 et 15.",
- "modbus-register-count": "Nombre de registre",
- "modbus-register-count-range": "Le nombre de registres doit être une valeur positive.",
- "modbus-server": "Serveurs / esclaves",
- "modbus-stopbits": "Bits d'arrêt",
- "modbus-stopbits-range": "Les bits d'arrêt doivent être compris entre 1 et 2.",
- "modbus-tag": "Tag",
- "modbus-timeseries-poll-period": "Période d'interrogation des Timeseries (ms)",
- "modbus-transport": "Transport",
- "modbus-unit-id": "Id de l'unité",
- "modbus-unit-id-range": "L'ID de l'unité doit être compris entre 1 et 247.",
- "no-file": "Aucun fichier sélectionné.",
- "opc-add-server": "Ajouter un serveur",
- "opc-add-server-prompt": "Veuillez ajouter un serveur",
- "opc-application-name": "Nom de l'application",
- "opc-application-uri": "Uri de l'application",
- "opc-device-name-pattern": "modèle de nom du dispositif",
- "opc-device-node-pattern": "modèle de noeud de dispositif",
- "opc-identity": "Identité",
- "opc-keystore": "Magasin de clés",
- "opc-keystore-alias": "Alias",
- "opc-keystore-key-password": "Mot de passe de la clé",
- "opc-keystore-location": "Emplacement *",
- "opc-keystore-password": "Mot de passe",
- "opc-keystore-type": "Type",
- "opc-scan-period-in-seconds": "Période d'analyse en secondes",
- "opc-security": "Sécurité",
- "opc-server": "Serveurs",
- "opc-type": "Type",
- "password": "Mot de passe",
- "pem": "PEM",
- "port": "Port",
- "port-range": "Le port doit être compris entre 1 et 65535.",
- "private-key": "Fichier de clé privée *",
- "request-id-expression": "Expression de demande d'id",
- "request-id-json-expression": "Expression json de la demande d'id",
- "request-id-topic-expression": "Expression de la demande d'id du topic",
- "request-topic-expression": "Expression de la demande du topic",
- "response-timeout": "Délai de réponse en millisecondes",
- "response-topic-expression": "Expression du topic de la réponse",
- "retry-interval": "Intervalle de nouvelle tentative en millisecondes",
- "selected-extensions": "{count, plural, 1 {1 extension} other {# extensions}} sélectionné",
- "server-side-rpc": "RPC côté serveur",
- "ssl": "Ssl",
- "sync": {
- "last-sync-time": "Dernière heure de synchronisation",
- "not-available": "Non disponible",
- "not-sync": "Non sync",
- "status": "Status",
- "sync": "Sync"
- },
- "timeout": "Délai d'attente en millisecondes",
- "timeseries": "Timeseries",
- "to-double": "Au double",
- "token": "Jeton de sécurité",
- "topic": "Topic",
- "topic-expression": "Expression du topic",
- "topic-filter": "Filtre du topic",
- "topic-name-expression": "Expression du nom du dispositif (topic)",
- "topic-type-expression": "Expression de type de dispositif (topic)",
- "transformer": "Transformer",
- "transformer-json": "JSON *",
- "type": "Type",
- "unique-id-required": "L'identifiant d'extension actuel existe déjà.",
- "username": "Nom d'utilisateur",
- "value": "Valeur",
- "value-expression": "Expression de la valeur"
- },
- "fullscreen": {
- "exit": "Quitter le plein écran",
- "expand": "Afficher en plein écran",
- "fullscreen": "Plein écran",
- "toggle": "Activer le mode plein écran"
- },
- "function": {
- "function": "Fonction"
- },
- "grid": {
- "add-item-text": "Ajouter un nouvel élément",
- "delete-item": "Supprimer l'élément",
- "delete-item-text": "Faites attention, après la confirmation, cet élément et toutes les données associées deviendront irrécupérables.",
- "delete-item-title": "Êtes-vous sûr de vouloir supprimer cet élément?",
- "delete-items": "Supprimer les éléments",
- "delete-items-action-title": "Supprimer {count, plural, 1 {1 élément} other {# éléments}}",
- "delete-items-text": "Attention, après la confirmation, tous les éléments sélectionnés seront supprimés et toutes les données associées deviendront irrécupérables.",
- "delete-items-title": "Êtes-vous sûr de vouloir supprimer {count, plural, 1 {1 élément} other {# éléments}}?",
- "item-details": "Détails de l'élément",
- "no-items-text": "Aucun élément trouvé",
- "scroll-to-top": "Défiler vers le haut"
- },
- "help": {
- "goto-help-page": "Aller à la page d'aide"
- },
- "home": {
- "avatar": "Avatar",
- "home": "Accueil",
- "logout": "Déconnexion",
- "menu": "Menu",
- "open-user-menu": "Ouvrir le menu utilisateur",
- "profile": "Profile"
- },
- "icon": {
- "icon": "Icône",
- "material-icons": "Icônes matérielles",
- "select-icon": "Sélectionner l'icône",
- "show-all": "Afficher toutes les icônes"
- },
- "import": {
- "drop-file": "Déposez un fichier JSON ou cliquez pour sélectionner un fichier à télécharger.",
- "no-file": "Aucun fichier sélectionné"
- },
- "item": {
- "selected": "Sélectionné"
- },
- "js-func": {
- "no-return-error": "La fonction doit renvoyer une valeur!",
- "return-type-mismatch": "La fonction doit renvoyer une valeur de type '{{type}}' !",
- "tidy": "Nettoyer"
- },
- "key-val": {
- "add-entry": "Ajouter une entrée",
- "key": "Clé",
- "no-data": "Aucune entrée",
- "remove-entry": "Supprimer l'entrée",
- "value": "Valeur"
- },
- "language": {
- "language": "Language"
- },
- "layout": {
- "color": "Couleur",
- "layout": "Mise en page",
- "main": "Principal",
- "manage": "Gérer les mises en page",
- "right": "Droite",
- "select": "Sélectionner la mise en page cible",
- "settings": "Paramètres de mise en page"
- },
- "legend": {
- "avg": "moy",
- "max": "max",
- "min": "min",
- "position": "Position de la légende",
- "settings": "Paramètres de la légende",
- "show-avg": "Afficher la valeur moyenne",
- "show-max": "Afficher la valeur maximale",
- "show-min": "Afficher la valeur min",
- "show-total": "Afficher la valeur totale",
- "total": "total"
- },
- "login": {
- "create-password": "Créer un mot de passe",
- "email": "Email",
- "forgot-password": "Mot de passe oublié?",
- "login": "Connexion",
- "new-password": "Nouveau mot de passe",
- "new-password-again": "nouveau mot de passe",
- "password-again": "Mot de passe à nouveau",
- "password-link-sent-message": "Le lien de réinitialisation du mot de passe a été envoyé avec succès!",
- "password-reset": "Mot de passe réinitialisé",
- "passwords-mismatch-error": "Les mots de passe saisis doivent être identiques!",
- "remember-me": "Se souvenir de moi",
- "request-password-reset": "Demander la réinitialisation du mot de passe",
- "reset-password": "Réinitialiser le mot de passe",
- "sign-in": "Veuillez vous connecter",
- "username": "Nom d'utilisateur (courriel)",
- "login-with": "Se connecter avec {{name}}",
- "or": "ou"
- },
- "position": {
- "bottom": "Bas",
- "left": "Gauche",
- "right": "Droite",
- "top": "Haut"
- },
- "profile": {
- "change-password": "Modifier le mot de passe",
- "current-password": "Mot de passe actuel",
- "last-login-time": "Dernière connexion",
- "profile": "Profile"
- },
- "relation": {
- "add": "Ajouter une relation",
- "add-relation-filter": "Ajouter un filtre de relation",
- "additional-info": "Informations supplémentaires (JSON)",
- "any-relation": "toute relation",
- "any-relation-type": "N'importe quel type",
- "delete": "Supprimer la relation",
- "delete-from-relation-text": "Attention, après la confirmation, l'entité actuelle ne sera pas liée à l'entité '{{entityName}}'.",
- "delete-from-relation-title": "Êtes-vous sûr de vouloir supprimer la relation de l'entité '{{entityName}}'?",
- "delete-from-relations-text": "Attention, après la confirmation, toutes les relations sélectionnées seront supprimées et l'entité actuelle ne sera pas liée aux entités correspondantes.",
- "delete-from-relations-title": "Êtes-vous sûr de vouloir supprimer {count, plural, 1 {1 relation} other {# relations}}?",
- "delete-to-relation-text": "Attention, après la confirmation, l'entité '{{entityName}} ne sera plus liée à l'entité actuelle.",
- "delete-to-relation-title": "Êtes-vous sûr de vouloir supprimer la relation avec l'entité '{{entityName}}'?",
- "delete-to-relations-text": "Attention, après la confirmation, toutes les relations sélectionnées seront supprimées et les entités correspondantes ne seront pas liées à l'entité en cours.",
- "delete-to-relations-title": "Êtes-vous sûr de vouloir supprimer {count, plural, 1 {1 relation} other {# relations}}?",
- "direction": "Sens",
- "direction-type": {
- "FROM": "de",
- "TO": "à"
- },
- "edit": "Modifier la relation",
- "from-entity": "De l'entité",
- "from-entity-name": "Du nom d'entité",
- "from-entity-type": "Du type d'entité",
- "from-relations": "Relations sortantes",
- "invalid-additional-info": "Impossible d'analyser les informations supplémentaires json.",
- "relation-filters": "Filtres de relation",
- "relation-type": "Type de relation",
- "relation-type-required": "Le type de relation est requis.",
- "relations": "Relations",
- "remove-relation-filter": "Supprimer le filtre de relation",
- "search-direction": {
- "FROM": "De",
- "TO": "Vers"
- },
- "selected-relations": "{count, plural, 1 {1 relation} other {# relations}} sélectionné",
- "to-entity": "Vers l'entité",
- "to-entity-name": "vers le nom de l'entité",
- "to-entity-type": "Vers le type d'entité",
- "to-relations": "Relations entrantes",
- "type": "Type"
- },
- "rulechain": {
- "add": "Ajouter une chaîne de règles",
- "add-rulechain-text": "Ajouter une nouvelle chaîne de règles",
- "copyId": "Copier l'identifiant de la chaîne de règles",
- "create-new-rulechain": "Créer une nouvelle chaîne de règles",
- "debug-mode": "Mode de débogage",
- "delete": "Supprimer la chaîne de règles",
- "delete-rulechain-text": "Attention, après la confirmation, la chaîne de règles et toutes les données associées deviendront irrécupérables.",
- "delete-rulechain-title": "Voulez-vous vraiment supprimer la chaîne de règles '{{ruleChainName}}'?",
- "delete-rulechains-action-title": "Supprimer {count, plural, 1 {1 chaîne de règles} other {# chaînes de règles}}",
- "delete-rulechains-text": "Attention, après la confirmation, toutes les chaînes de règles sélectionnées seront supprimées et toutes les données associées deviendront irrécupérables.",
- "delete-rulechains-title": "Êtes-vous sûr de vouloir supprimer {count, plural, 1 {1 chaîne de règles} other {# chaînes de règles}}?",
- "description": "Description",
- "details": "Détails",
- "events": "Evénements",
- "export": "Exporter la chaîne de règles",
- "export-failed-error": "Impossible d'exporter la chaîne de règles: {{error}}",
- "idCopiedMessage": "L'ID de la chaîne de règles a été copié dans le presse-papier",
- "import": "Importer la chaîne de règles",
- "invalid-rulechain-file-error": "Impossible d'importer la chaîne de règles: structure de données de la chaîne de règles non valide",
- "management": "Gestion des règles",
- "name": "Nom",
- "name-required": "Le nom est requis.",
- "no-rulechains-matching": "Aucune chaîne de règles correspondant à {{entity}} n'a été trouvée.",
- "no-rulechains-text": "Aucune chaîne de règles trouvée",
- "root": "Racine",
- "rulechain": "Chaîne de règles",
- "rulechain-details": "Détails de la chaîne de règles",
- "rulechain-file": "Fichier de chaîne de règles",
- "rulechain-required": "Chaîne de règles requise",
- "rulechains": "Chaînes de règles",
- "select-rulechain": "Sélectionner la chaîne de règles",
- "set-root": "Rend la chaîne de règles racine (root) ",
- "set-root-rulechain-text": "Après la confirmation, la chaîne de règles deviendra racine (root) et gérera tous les messages de transport entrants.",
- "set-root-rulechain-title": "Voulez-vous vraiment que la chaîne de règles '{{ruleChainName}} soit racine (root) ?",
- "system": "Système"
- },
- "rulenode": {
- "add": "Ajouter un noeud de règle",
- "add-link": "Ajouter un lien",
- "configuration": "Configuration",
- "copy-selected": "Copier les éléments sélectionnés",
- "create-new-link-label": "Créez un nouveau!",
- "custom-link-label": "Etiquette de lien personnalisée",
- "custom-link-label-required": "Une étiquette de lien personnalisée est requise",
- "debug-mode": "Mode de débogage",
- "delete": "Supprimer le noeud de règle",
- "delete-selected": "Supprimer les éléments sélectionnés",
- "delete-selected-objects": "Supprimer les nœuds et les connexions sélectionnés",
- "description": "Description",
- "deselect-all": "Désélectionner tout",
- "deselect-all-objects": "Désélectionnez tous les nœuds et toutes les connexions",
- "details": "Détails",
- "directive-is-not-loaded": "La directive de configuration définie '{{directiveName}} n'est pas disponible.",
- "events": "Événements",
- "help": "Aide",
- "invalid-target-rulechain": "Impossible de résoudre la chaîne de règles cible!",
- "link": "Lien",
- "link-details": "Détails du lien du noeud de la règle",
- "link-label": "Étiquette du lien",
- "link-label-required": "L'étiquette du lien est obligatoire",
- "link-labels": "Étiquettes de lien",
- "link-labels-required": "Les étiquettes de lien sont obligatoires",
- "message": "Message",
- "message-type": "Type de message",
- "message-type-required": "Le type de message est obligatoire",
- "metadata": "Métadonnées",
- "metadata-required": "Les entrées de métadonnées ne peuvent pas être vides.",
- "name": "Nom",
- "name-required": "Le nom est requis.",
- "no-link-label-matching": "'{{label}}' introuvable.",
- "no-link-labels-found": "Aucune étiquette de lien trouvée",
- "open-node-library": "Ouvrir la bibliothèque de noeud",
- "output": "Output",
- "rulenode-details": "Détails du noeud de la régle",
- "search": "Recherche de noeuds",
- "select-all": "Tout sélectionner",
- "select-all-objects": "Sélectionnez tous les noeuds et connexions",
- "select-message-type": "Sélectionner le type de message",
- "test": "Test",
- "test-script-function": "Tester le script",
- "type": "Type",
- "type-action": "Action",
- "type-action-details": "Effectuer une action spéciale",
- "type-enrichment": "Enrichissement",
- "type-enrichment-details": "Ajouter des informations supplémentaires dans les métadonnées de message",
- "type-external": "Externe",
- "type-external-details": "Interagit avec le systéme externe",
- "type-filter": "Filtre",
- "type-filter-details": "Filtrer les messages entrants avec des conditions configurées",
- "type-input": "Input",
- "type-input-details": "Entrée logique de la chaîne de règles, transmet les messages entrants au prochain nœud de règle associé",
- "type-rule-chain": "Chaîne de régles",
- "type-rule-chain-details": "Transmet les messages entrants à la chaîne de régles spécifiée",
- "type-transformation": "Transformation",
- "type-transformation-details": "Modifier le payload du message et les métadonnées ",
- "type-unknown": "Inconnu",
- "type-unknown-details": "Noeud de règle non résolu",
- "ui-resources-load-error": "Impossible de charger les ressources de configuration de l'interface utilisateur."
- },
- "tenant": {
- "add": "Ajouter un Tenant",
- "add-tenant-text": "Ajouter un nouveau Tenant",
- "admins": "Admins",
- "copyId": "Copier l'Id du Tenant",
- "delete": "Supprimer le Tenant",
- "delete-tenant-text": "Attention, après la confirmation, le Tenant et toutes les données associées deviendront irrécupérables.",
- "delete-tenant-title": "Êtes-vous sûr de vouloir supprimer le tenant '{{tenantTitle}}'?",
- "delete-tenants-action-title": "Supprimer {count, plural, 1 {1 tenant} other {# tenants}}",
- "delete-tenants-text": "Attention, après la confirmation, tous les Tenants sélectionnés seront supprimés et toutes les données associées deviendront irrécupérables.",
- "delete-tenants-title": "Êtes-vous sûr de vouloir supprimer {count, plural, 1 {1 tenant} other {# tenants}}?",
- "description": "Description",
- "details": "Détails",
- "events": "Événements",
- "idCopiedMessage": "L'Id du Tenant a été copié dans le Presse-papiers",
- "manage-tenant-admins": "Gérer les administrateurs du Tenant",
- "management": "Gestion des Tenants",
- "no-tenants-matching": "Aucun Tenant correspondant à {{entity}} n'a été trouvé. ",
- "no-tenants-text": "Aucun Tenant trouvé",
- "select-tenant": "Sélectionner un Tenant",
- "tenant": "Tenant",
- "tenant-details": "Détails du Tenant",
- "tenant-required": "Tenant requis",
- "tenants": "Tenants",
- "title": "Titre",
- "title-required": "Le titre est requis."
- },
- "timeinterval": {
- "advanced": "Avancé",
- "days": "Jours",
- "days-interval": "{days, plural, 1 {1 jour} other {# jours}}",
- "hours": "Heures",
- "hours-interval": "{hours, plural, 1 {1 heure} other {# heures}}",
- "minutes": "Minutes",
- "minutes-interval": "{minutes, plural, 1 {1 minute} other {# minutes}}",
- "seconds": "Secondes",
- "seconds-interval": "{seconds, plural, 1 {1 seconde} other {# secondes}}"
- },
- "timewindow": {
- "date-range": "Plage de dates",
- "days": "{days, plural, 1 {jour} other {# jours}}",
- "edit": "Modifier timewindow",
- "history": "Historique",
- "hours": "{hours, plural, 0 {heure} 1 {1 heure} other {# heures}}",
- "last": "Dernier",
- "last-prefix": "dernier",
- "minutes": "{minutes, plural, 0 {minute} 1 {1 minute} other {# minutes}}",
- "period": "de {{startTime}} à {{endTime}}",
- "realtime": "Temps réel",
- "seconds": "{seconds, plural, 0 {second} 1 {1 second} other {# seconds}}",
- "time-period": "Période",
- "hide": "Masquer"
- },
- "user": {
- "activation-email-sent-message": "Le courriel d'activation a été envoyé avec succès!",
- "activation-link": "Lien d'activation utilisateur",
- "activation-link-copied-message": "le lien d'activation de l'utilisateur a été copié dans le presse-papier",
- "activation-link-text": "Pour activer l'utilisateur, utilisez le lien d'activation suivant: ",
- "activation-method": "Méthode d'activation",
- "add": "Ajouter un utilisateur",
- "add-user-text": "Ajouter un nouvel utilisateur",
- "always-fullscreen": "Toujours en plein écran",
- "anonymous": "Anonyme",
- "copy-activation-link": "Copier le lien d'activation",
- "customer": "Client",
- "customer-users": "Utilisateurs du client",
- "default-dashboard": "Tableau de bord par défaut",
- "delete": "Supprimer l'utilisateur",
- "delete-user-text": "Attention, après la confirmation, l'utilisateur et toutes les données associées deviendront irrécupérables.",
- "delete-user-title": "Êtes-vous sûr de vouloir supprimer l'utilisateur '{{userEmail}}'?",
- "delete-users-action-title": "Supprimer {count, plural, 1 {1 utilisateur} other {# utilisateurs}}",
- "delete-users-text": "Attention, après la confirmation, tous les utilisateurs sélectionnés seront supprimés et toutes les données associées deviendront irrécupérables.",
- "delete-users-title": "Êtes-vous sûr de vouloir supprimer {count, plural, 1 {1 utilisateur} other {# utilisateurs}}?",
- "description": "Description",
- "details": "Détails",
- "disable-account": "Désactiver le compte d'utilisateur",
- "disable-account-message": "Le compte d'utilisateur a été désactivé avec succès!",
- "display-activation-link": "Afficher le lien d'activation",
- "email": "Email",
- "email-required": "Email est requis.",
- "enable-account": "Activer le compte d'utilisateur",
- "enable-account-message": "Le compte d'utilisateur a été activé avec succès!",
- "first-name": "Prénom",
- "invalid-email-format": "Format de courrier électronique non valide",
- "last-name": "Nom de famille",
- "login-as-customer-user": "Se connecter en tant qu'utilisateur client",
- "login-as-tenant-admin": "Connectez-vous en tant qu'administrateur Tenant",
- "no-users-matching": "Aucun utilisateur correspondant à '{{entity}}' n'a été trouvé.",
- "no-users-text": "Aucun utilisateur trouvé",
- "resend-activation": "Renvoyer l'activation",
- "select-user": "Sélectionner l'utilisateur",
- "send-activation-mail": "Envoyer un mail d'activation",
- "sys-admin": "Administrateur du système",
- "tenant-admin": "Administrateur du Tenant",
- "tenant-admins": "administrateurs du Tenant",
- "user": "utilisateur",
- "user-details": "Détails de l'utilisateur",
- "user-required": "L'utilisateur est requis",
- "users": "Utilisateurs"
- },
- "value": {
- "boolean": "booléen",
- "boolean-value": "Valeur booléenne",
- "double": "Double",
- "double-value": "Valeur double",
- "false": "Faux",
- "integer": "Entier",
- "integer-value": "Valeur entière",
- "invalid-integer-value": "Valeur entière invalide",
- "long": "Long",
- "string": "String",
- "string-value": "Valeur String",
- "true": "Vrai",
- "type": "Type de valeur"
- },
- "widget": {
- "add": "Ajouter un widget",
- "add-resource": "Ajouter une ressource",
- "add-widget-type": "Ajouter un nouveau type de widget",
- "alarm": "Widget d'alarme",
- "css": "CSS",
- "datakey-settings-schema": "Schéma des paramètres de Data key",
- "edit": "Modifier le widget",
- "editor": " Editeur de widget",
- "export": "Exporter widget",
- "html": "HTML",
- "javascript": "Javascript",
- "latest-values": "Dernières valeurs",
- "management": "Gestion des widgets",
- "missing-widget-title-error": "Le titre du widget doit être spécifié!",
- "no-data-found": "Aucune donnée trouvée",
- "remove": "Supprimer le widget",
- "remove-resource": "Supprimer une ressource",
- "remove-widget-text": "Après la confirmation, le widget et toutes les données associées deviendront irrécupérables.",
- "remove-widget-title": "Êtes-vous sûr de vouloir supprimer le widget '{{widgetTitle}}'?",
- "remove-widget-type": "Supprimer le type de widget",
- "remove-widget-type-text": "Après la confirmation, le type de widget et toutes les données associées deviendront irrécupérables.",
- "remove-widget-type-title": "Êtes-vous sûr de vouloir supprimer le type de widget '{{widgetName}}'?",
- "resource-url": "URL JavaScript / CSS",
- "resources": "Ressources",
- "rpc": "Widget de contrôle",
- "run": "Exécuter un widget",
- "save": "Enregistrer le widget",
- "save-widget-type-as": "Enregistrer le type de widget sous",
- "save-widget-type-as-text": "Veuillez saisir un nouveau titre de widget et / ou sélectionner un ensemble de widgets cibles",
- "saveAs": "Enregistrer le widget sous",
- "search-data": "Rechercher des données",
- "select-widget-type": "Sélectionnez le type de widget",
- "select-widgets-bundle": "Sélectionner un ensemble de widgets",
- "settings-schema": "Schéma des paramétres",
- "static": "Widget statique",
- "tidy": "Nettoyer",
- "timeseries": "Séries chronologiques",
- "title": "Titre du widget",
- "title-required": "Le titre du widget est requis.",
- "toggle-fullscreen": "Basculer le mode plein écran",
- "type": "Type de widget",
- "unable-to-save-widget-error": "Impossible de sauvegarder le widget! Le widget a des erreurs!",
- "undo": "Annuler les modifications du widget",
- "widget-bundle": "Ensemble de widget",
- "widget-library": "Bibliothèque de widgets",
- "widget-saved": "Widget enregistré",
- "widget-template-load-failed-error": "Impossible de charger le modéle de widget!",
- "widget-type-load-error": "Le widget n'a pas été chargé à cause des erreurs suivantes:",
- "widget-type-load-failed-error": "Impossible de charger le type de widget!",
- "widget-type-not-found": "Problème de chargement de la configuration du widget.
Le type de widget associé a probablement été supprimé."
- },
- "widget-action": {
- "custom": "Action personnalisée",
- "header-button": "Bouton d'en-tête de widget",
- "open-dashboard": "Naviguer vers un autre tableau de bord",
- "open-dashboard-state": "Naviguer vers un nouvel état du tableau de bord",
- "open-right-layout": "Ouvrir la disposition du tableau de bord droite (vue mobile)",
- "set-entity-from-widget": "Définir l'entité à partir du widget",
- "target-dashboard": "Tableau de bord cible",
- "target-dashboard-state": "État du tableau de bord cible",
- "target-dashboard-state-required": "L'état du tableau de bord cible est requis",
- "update-dashboard-state": "Mettre à jour l'état actuel du tableau de bord"
- },
- "widget-config": {
- "action": "Action",
- "action-icon": "Icône",
- "action-name": "Nom",
- "action-name-not-unique": "Une autre action portant le même nom existe déjà.
Le nom de l'action doit être unique dans la même source d'action.",
- "action-name-required": "Le nom de l'action est requis",
- "action-source": "Source de l'action",
- "action-source-required": "Une source d'action est requise.",
- "action-type": "Type",
- "action-type-required": "Le type d'action est requis.",
- "actions": "Actions",
- "add-action": "Ajouter une action",
- "add-datasource": "Ajouter une source de données",
- "advanced": "Avancé",
- "alarm-source": "Source d'alarme",
- "background-color": "couleur de fond",
- "data": "Données",
- "datasource-parameters": "Paramètres",
- "datasource-type": "Type",
- "datasources": "Sources de données",
- "decimals": "Nombre de chiffres après virgule flottante",
- "delete-action": "Supprimer l'action",
- "delete-action-text": "Êtes-vous sûr de vouloir supprimer l'action du widget nommé '{{actionName}}'?",
- "delete-action-title": "Supprimer l'action du widget",
- "display-timewindow": "Afficher fenêtre de temps",
- "display-legend": "Afficher la légende",
- "display-title": "Afficher le titre",
- "drop-shadow": "Ombre portée",
- "edit-action": "Modifier l'action",
- "enable-fullscreen": "Activer le plein écran",
- "general-settings": "Paramètres généraux",
- "height": "Hauteur",
- "margin": "Marge",
- "maximum-datasources": "Maximum {count, plural, 1 {1 datasource est autorisé.} other {# datasources sont autorisés}}",
- "mobile-mode-settings": "Paramètres du mode mobile",
- "order": "Ordre",
- "padding": "Padding",
- "remove-datasource": "Supprimer la source de données",
- "search-actions": "Recherche d'actions",
- "settings": "Paramètres",
- "target-device": "Dispositif cible",
- "text-color": "Couleur du texte",
- "timewindow": "Fenêtre de temps",
- "title": "Titre",
- "title-style": "Style de titre",
- "title-tooltip": "Tooltip de titre",
- "units": "Symbole spécial à afficher à côté de la valeur",
- "use-dashboard-timewindow": "Utiliser la fenêtre de temps du tableau de bord",
- "widget-style": "Style du widget",
- "display-icon": "Afficher l'icône du titre",
- "icon-color": "Couleur de l'icône",
- "icon-size": "Taille de l'icône"
- },
- "widget-type": {
- "create-new-widget-type": "Créer un nouveau type de widget",
- "export": "Exporter le type de widget",
- "export-failed-error": "Impossible d'exporter le type de widget: {{error}}",
- "import": "Importer le type de widget",
- "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"
- }
- },
- "input-widgets": {
- "attribute-not-allowed": "Le paramètre d'attribut ne peut pas être utilisé dans ce widget",
- "date": "Date",
- "discard-changes": "Annuler les modifications",
- "entity-attribute-required": "L'attribut d'entité est requis",
- "entity-timeseries-required": "Entité timeseries est requis",
- "not-allowed-entity": "L'entité sélectionnée ne peut pas avoir d'attributs partagés",
- "no-attribute-selected": "Aucun attribut n'est sélectionné",
- "no-datakey-selected": "Aucune date n'est sélectionnée",
- "no-entity-selected": "Aucune entité sélectionnée",
- "no-image": "Pas d'image",
- "no-support-web-camera": "Pas de webcam supportée",
- "no-timeseries-selected": "Aucune série temporelle sélectionnée",
- "switch-attribute-value": "Changer la valeur de l'attribut d'entité",
- "switch-camera": "Changer de caméra",
- "switch-timeseries-value": "Changer la valeur de l'entité série temporelle",
- "take-photo": "Prendre une photo",
- "time": "Temps",
- "timeseries-not-allowed": "Le paramètre série temporelle ne peut pas être utilisé dans ce widget",
- "update-failed": "Mise à jour a échoué",
- "update-successful": "Mise à jour réussie",
- "update-attribute": "Attribut de mise à jour",
- "update-timeseries": "Mise à jour de la série temporelle",
- "value": "Valeur"
- }
- },
- "widgets-bundle": {
- "add": "Ajouter un groupe de widgets",
- "add-widgets-bundle-text": "Ajouter un nouveau groupe de widgets",
- "create-new-widgets-bundle": "Créer un nouveau groupe de widgets",
- "current": "Groupe actuel",
- "delete": "Supprimer le groupe de widgets",
- "delete-widgets-bundle-text": "Attention, après la confirmation, le groupe de widgets et toutes les données associées deviendront irrécupérables.",
- "delete-widgets-bundle-title": "Êtes-vous sûr de vouloir supprimer le groupe de widgets '{{widgetsBundleTitle}}'?",
- "delete-widgets-bundles-action-title": "Supprimer {count, plural, 1 {1 groupe de widgets} other {# groupes de widgets}}",
- "delete-widgets-bundles-text": "Attention, après la confirmation, tous les groupes de widgets sélectionnés seront supprimés et toutes les données associées deviendront irrécupérables.",
- "delete-widgets-bundles-title": "Voulez-vous vraiment supprimer {count, plural, 1 {1 groupe de widgets} other {# groupes de widgets}}?",
- "details": "Détails",
- "empty": "Le groupe de widgets est vide",
- "export": "Exporter le groupe de widgets",
- "export-failed-error": "Impossible d'exporter le groupe de widgets: {{error}}",
- "import": "Importer un groupe de widgets",
- "invalid-widgets-bundle-file-error": "Impossible d'importer un groupe de widgets: structure de données du groupe de widgets non valides.",
- "no-widgets-bundles-matching": "Aucun groupe de widgets correspondant à {{widgetsBundle}} n'a été trouvé.",
- "no-widgets-bundles-text": "Aucun groupe de widgets trouvé",
- "system": "Système",
- "title": "Titre",
- "title-required": "Le titre est requis.",
- "widgets-bundle-details": "Détails des groupes de widgets",
- "widgets-bundle-file": "Fichier de groupe de widgets",
- "widgets-bundle-required": "Un groupe de widgets est requis.",
- "widgets-bundles": "Groupes de widgets"
- }
-}
diff --git a/ui/src/app/locale/locale.constant-it_IT.json b/ui/src/app/locale/locale.constant-it_IT.json
deleted file mode 100644
index 8d246c361d..0000000000
--- a/ui/src/app/locale/locale.constant-it_IT.json
+++ /dev/null
@@ -1,1708 +0,0 @@
-{
- "access": {
- "unauthorized": "Non autorizzato",
- "unauthorized-access": "Accesso non autorizzato",
- "unauthorized-access-text": "Devi effettuare il login per accedere a questa risorsa!",
- "access-forbidden": "Accesso Vietato",
- "access-forbidden-text": "Non hai i diritti di accesso a questa posizione!
Prova ad effettuare il login con un diverso account.",
- "refresh-token-expired": "Sessione scaduta",
- "refresh-token-failed": "Impossibile aggiornare la sessione"
- },
- "action": {
- "activate": "Attiva",
- "suspend": "Sospendi",
- "save": "Salva",
- "saveAs": "Salva come",
- "cancel": "Cancella",
- "ok": "OK",
- "delete": "Elimina",
- "add": "Aggiungi",
- "yes": "Sì",
- "no": "No",
- "update": "Aggiorna",
- "remove": "Rimuovi",
- "search": "Cerca",
- "clear-search": "Cancella ricerca",
- "assign": "Assegna",
- "unassign": "Annulla assegnazione",
- "share": "Condividi",
- "make-private": "Rendi privato",
- "apply": "Applica",
- "apply-changes": "Applica modifiche",
- "edit-mode": "Modalità modifica",
- "enter-edit-mode": "Attiva modalità di modifica",
- "decline-changes": "Annulla modifiche",
- "close": "Chiudi",
- "back": "Indietro",
- "run": "Esegui",
- "sign-in": "Registrati!",
- "edit": "Modifica",
- "view": "Visualizza",
- "create": "Crea",
- "drag": "Trascina",
- "refresh": "Aggiorna",
- "undo": "Annulla",
- "copy": "Copia",
- "paste": "Incolla",
- "copy-reference": "Copia riferimento",
- "paste-reference": "Incolla riferimento",
- "import": "Importa",
- "export": "Esporta",
- "share-via": "Condividi con {{provider}}",
- "discard-changes": "Annulla le modifiche"
- },
- "aggregation": {
- "aggregation": "Aggregazione",
- "function": "Funzione di aggregazione dati",
- "limit": "Valori max",
- "group-interval": "Intervallo di raggruppamento",
- "min": "Min",
- "max": "Max",
- "avg": "Media",
- "sum": "Somma",
- "count": "Conteggio",
- "none": "Nessuna"
- },
- "admin": {
- "general": "Generale",
- "general-settings": "Impostazioni Generali",
- "outgoing-mail": "Posta in uscita",
- "outgoing-mail-settings": "Impostazioni Posta in uscita",
- "system-settings": "Impostazioni di sistema",
- "test-mail-sent": "Mail di test inviata con successo!",
- "base-url": "URL di base",
- "base-url-required": "URL di base obbligatoria.",
- "mail-from": "Mittente",
- "mail-from-required": "Mittente obbligatorio.",
- "smtp-protocol": "Protocollo SMTP",
- "smtp-host": "Host SMTP",
- "smtp-host-required": "Host SMTP obbligatorio.",
- "smtp-port": "Porta SMTP",
- "smtp-port-required": "Porta SMTP obbligatoria.",
- "smtp-port-invalid": "Numero di porta SMTP non valido.",
- "timeout-msec": "Timeout (msec)",
- "timeout-required": "Timeout obbligatorio.",
- "timeout-invalid": "Timeout non valido.",
- "enable-tls": "Abilita TLS",
- "tls-version" : "Versione TLS",
- "send-test-mail": "Invia mail di test",
- "security-settings": "Settaggi di sicurezza",
- "password-policy": "Politica password",
- "minimum-password-length": "Lunghezza minima password",
- "minimum-password-length-required": "È richiesta una lunghezza minima della password",
- "minimum-password-length-range": "La lunghezza minima della password deve essere compresa tra 5 e 50",
- "minimum-uppercase-letters": "Numero minimo di lettere maiuscole",
- "minimum-uppercase-letters-range": "Il numero minimo di lettere maiuscole non può essere negativo",
- "minimum-lowercase-letters": "Numero minimo di lettere minuscole",
- "minimum-lowercase-letters-range": "Il numero minimo di lettere minuscole non può essere negativo",
- "minimum-digits": "Numero minimo di cifre",
- "minimum-digits-range": "Il numero minimo di cifre non può essere negativo",
- "minimum-special-characters": "Numero minimo di caratteri speciali",
- "minimum-special-characters-range": "Il numero minimo di caratteri speciali non può essere negativo",
- "password-expiration-period-days": "Periodo di scadenza della password in giorni",
- "password-expiration-period-days-range": "Il periodo di scadenza della password in giorni non può essere negativo",
- "password-reuse-frequency-days": "Frequenza di riutilizzo della password in giorni",
- "password-reuse-frequency-days-range": "La frequenza di riutilizzo della password in giorni non può essere negativa",
- "general-policy": "Politica generale",
- "max-failed-login-attempts": "Numero massimo di tentativi di accesso non riusciti, prima che l'account sia bloccato",
- "minimum-max-failed-login-attempts-range": "Il numero massimo di tentativi di accesso non riusciti non può essere negativo",
- "user-lockout-notification-email": "In caso di blocco dell'account utente, inviare una notifica via e-mail"
- },
- "alarm": {
- "alarm": "Allarme",
- "alarms": "Allarmi",
- "select-alarm": "Seleziona un allarme",
- "no-alarms-matching": "Nessun allarme corrispondente a '{{entity}}' è stato trovato.",
- "alarm-required": "Allarme richiesto",
- "alarm-status": "Stato Allarme",
- "search-status": {
- "ANY": "Qualsiasi",
- "ACTIVE": "Attivo",
- "CLEARED": "Cancellato",
- "ACK": "Riconosciuto",
- "UNACK": "Non riconosciuto"
- },
- "display-status": {
- "ACTIVE_UNACK": "Active Unacknowledged",
- "ACTIVE_ACK": "Active Acknowledged",
- "CLEARED_UNACK": "Cleared Unacknowledged",
- "CLEARED_ACK": "Cleared Acknowledged"
- },
- "no-alarms-prompt": "Nessun allarme trovato",
- "created-time": "Orario di creazione",
- "type": "Tipo",
- "severity": "Livello di gravità",
- "originator": "Origine",
- "originator-type": "Tipo origine",
- "details": "Dettagli",
- "status": "Stato",
- "alarm-details": "Dettagli allarme",
- "start-time": "Orario inizio",
- "end-time": "Orario fine",
- "ack-time": "Orario conferma",
- "clear-time": "Orario cancellazione",
- "severity-critical": "Critico",
- "severity-major": "Maggiore",
- "severity-minor": "Minore",
- "severity-warning": "Avviso",
- "severity-indeterminate": "Indeterminato",
- "acknowledge": "Conferma",
- "clear": "Cancella",
- "search": "Cerca allarmi",
- "selected-alarms": "{ count, plural, 1 {1 allarme selezionato} other {# allarmi selezionati} }",
- "no-data": "Nessun dato da visualizzare",
- "polling-interval": "Intervallo di polling (sec) Allarmi",
- "polling-interval-required": "Intervallo di polling Allarmi richiesto.",
- "min-polling-interval-message": "L'intervallo di polling deve essere di almeno 1 sec.",
- "aknowledge-alarms-title": "Conferma { count, plural, 1 {1 allarme} other {# allarmi} }",
- "aknowledge-alarms-text": "Sei sicuro di voler confermare { count, plural, 1 {1 allarme} other {# allarmi} }?",
- "aknowledge-alarm-title": "Conferma allarme",
- "aknowledge-alarm-text": "Sei sicuro di voler confermare l'allarme?",
- "clear-alarms-title": "Elimina { count, plural, 1 {1 allarme} other {# allarmi} }",
- "clear-alarms-text": "Sei sicuro di voler eliminare { count, plural, 1 {1 allarme} other {# allarmi} }?",
- "clear-alarm-title": "Elimina allarme",
- "clear-alarm-text": "Sei sicuro di voler eliminare l'allarme?",
- "alarm-status-filter": "Filtro stato allarme"
- },
- "alias": {
- "add": "Aggiungi alias",
- "edit": "Modifica alias",
- "name": "Nome Alias",
- "name-required": "Nome Alias obbligatorio",
- "duplicate-alias": "Un Alias con lo stesso nome è già presente.",
- "filter-type-single-entity": "Singola entità",
- "filter-type-entity-list": "Lista Entità",
- "filter-type-entity-name": "Nome Entità",
- "filter-type-state-entity": "Entità dallo stato della dashboard",
- "filter-type-state-entity-description": "Entità prelevata dai parametri di stato della dashboard",
- "filter-type-asset-type": "Tipo di Asset",
- "filter-type-asset-type-description": "Asset di tipo '{{assetType}}'",
- "filter-type-asset-type-and-name-description": "Asset di tipo '{{assetType}}' e con un nome che inizia per '{{prefix}}'",
- "filter-type-device-type": "Tipo di dispositivo",
- "filter-type-device-type-description": "Dispositivi di tipo '{{deviceType}}'",
- "filter-type-device-type-and-name-description": "Dispositivi di tipo '{{deviceType}}' e con un nome che inizia per '{{prefix}}'",
- "filter-type-entity-view-type": "Tipo vista entità",
- "filter-type-entity-view-type-description": "Viste entità di tipo '{{entityView}}'",
- "filter-type-entity-view-type-and-name-description": "Viste entità di tipo '{{entityView}}' e con un nome che inizia per '{{prefix}}'",
- "filter-type-relations-query": "Query relazioni",
- "filter-type-relations-query-description": "{{entities}} che hanno una relazione {{relationType}} {{direction}} {{rootEntity}}",
- "filter-type-asset-search-query": "Query ricerca asset",
- "filter-type-asset-search-query-description": "Asset di tipo {{assetTypes}} che hanno una relazione {{relationType}} {{direction}} {{rootEntity}}",
- "filter-type-device-search-query": "Query ricerca dispositivo",
- "filter-type-device-search-query-description": "Dispositivi di tipo {{deviceTypes}} che hanno una relazione {{relationType}} {{direction}} {{rootEntity}}",
- "filter-type-entity-view-search-query": "Query ricerca Vista entità",
- "filter-type-entity-view-search-query-description": "Viste entità di tipo {{entityViewTypes}} che hanno una relazione {{relationType}} {{direction}} {{rootEntity}}",
- "entity-filter": "Filtro entità",
- "resolve-multiple": "Risolvi come entità multiple",
- "filter-type": "Tipo di filtro",
- "filter-type-required": "Tipo di filtro richiesto.",
- "entity-filter-no-entity-matched": "Nessuna entità corrispondente al filtro specificato è stata trovata.",
- "no-entity-filter-specified": "Nessun filtro di entità specificato",
- "root-state-entity": "Usa l'entità di stato della dashboard come radice",
- "root-entity": "Entità radice",
- "state-entity-parameter-name": "Nome parametro entità di stato",
- "default-state-entity": "Entità di stato predefinita",
- "default-entity-parameter-name": "Predefinito",
- "max-relation-level": "Massimo livello relazione",
- "unlimited-level": "Illimitato",
- "state-entity": "Entità di stato della dashboard",
- "all-entities": "Tutte le entità",
- "any-relation": "qualsiasi"
- },
- "asset": {
- "asset": "Asset",
- "assets": "Asset",
- "management": "Gestione Asset",
- "view-assets": "Visualizza Asset",
- "add": "Aggiungi Asset",
- "assign-to-customer": "Assegna a cliente",
- "assign-asset-to-customer": "Assegna Asset al Cliente",
- "assign-asset-to-customer-text": "Seleziona gli asset da assegnare al cliente",
- "no-assets-text": "Nessun asset trovato",
- "assign-to-customer-text": "Seleziona il cliente a cui assegnare l'asset / gli asset",
- "public": "Pubblico",
- "assignedToCustomer": "Assegnato al cliente",
- "make-public": "Rendi pubblico l'asset",
- "make-private": "Rendi privato l'asset",
- "unassign-from-customer": "Assegnazione annullata dal cliente",
- "delete": "Cancella asset",
- "asset-public": "L'Asset è pubblico",
- "asset-type": "Tipo di Asset",
- "asset-type-required": "Tipo di Asset richiesto.",
- "select-asset-type": "Seleziona tipo di asset",
- "enter-asset-type": "Inserisci tipo di asset",
- "any-asset": "Qualsiasi asset",
- "no-asset-types-matching": "Nessun asset corrispondente al tipo '{{entitySubtype}}' è stato trovato.",
- "asset-type-list-empty": "Nessun tipo di asset selezionato.",
- "asset-types": "Tipi di Asset",
- "name": "Nome",
- "name-required": "Nome obbligatorio.",
- "description": "Descrizione",
- "type": "Tipo",
- "type-required": "Tipo obbligatorio.",
- "details": "Dettagli",
- "events": "Eventi",
- "add-asset-text": "Aggiungi un nuovo asset",
- "asset-details": "Dettagli Asset",
- "assign-assets": "Assegna asset",
- "assign-assets-text": "Assegna { count, plural, 1 {1 asset} other {# asset} } al cliente",
- "delete-assets": "Cancella asset",
- "unassign-assets": "Annulla assegnazione asset",
- "unassign-assets-action-title": "Annulla assegnazione { count, plural, 1 {1 asset} other {# asset} } al cliente",
- "assign-new-asset": "Assegna un nuovo asset",
- "delete-asset-title": "Sei sicuro di voler cancellare l'asset '{{assetName}}'?",
- "delete-asset-text": "Attenzione, dopo la conferma l'asset e tutti i relativi dati non saranno più recuperabili.",
- "delete-assets-title": "Sei sicuro di voler eliminare { count, plural, 1 {1 asset} other {# asset} }?",
- "delete-assets-action-title": "Elimina { count, plural, 1 {1 asset} other {# asset} }",
- "delete-assets-text": "Attenzione, dopo la modifica tutti gli asset selezionati saranno rimossi e tutti i relativi dati non saranno più recuperabili.",
- "make-public-asset-title": "Sei sicuro di voler rendere pubblico l'asset '{{assetName}}'?",
- "make-public-asset-text": "Dopo la conferma l'asset e tutti i suoi dati saranno resi pubblici e accessibili dagli altri.",
- "make-private-asset-title": "Sei sicuro di voler rendere privato l'asset '{{assetName}}'?",
- "make-private-asset-text": "Dopo la conferma l'asset e tutti i suoi dati saranno resi privati e non accessibili dagli altri.",
- "unassign-asset-title": "Sei sicuro di voler annullare l'assegnazione dell'asset '{{assetName}}'?",
- "unassign-asset-text": "Dopo la conferma l'assegnazione dell'asset sarà annullata e l'asset non sarà più accessibile dal cliente.",
- "unassign-asset": "Annulla assegnazione asset",
- "unassign-assets-title": "Sei sicuro di voler annullare l'assegnazione di { count, plural, 1 {1 asset} other {# asset} }?",
- "unassign-assets-text": "Dopo la conferma sarà annullata l'assegnazione di tutti gli asset selezionati e questi non saranno più accessibili dal cliente.",
- "copyId": "Copia Id asset",
- "idCopiedMessage": "Id Asset copiato negli Appunti",
- "select-asset": "Seleziona asset",
- "no-assets-matching": "Nessun asset corrispondente a '{{entity}}' è stato trovato.",
- "asset-required": "Asset obbligatorio",
- "name-starts-with": "Asset con nome che inizia per",
- "label": "Etichetta"
- },
- "attribute": {
- "attributes": "Attributi",
- "latest-telemetry": "Ultima telemetria",
- "attributes-scope": "Visibilità attributi entità",
- "scope-latest-telemetry": "Ultima telemetria",
- "scope-client": "Attributi client",
- "scope-server": "Attributi server",
- "scope-shared": "Attributi condivisi",
- "add": "Aggiungi attributo",
- "key": "Chiave",
- "last-update-time": "Ultimo aggiornamento",
- "key-required": "Attributo chiave richiesto.",
- "value": "Valore",
- "value-required": "Attributo valore richiesto.",
- "delete-attributes-title": "Sei sicuro di voler eliminare { count, plural, 1 {1 attributo} other {# attributi} }?",
- "delete-attributes-text": "Attenzione, dopo la conferma tutti gli attributi selezionati saranno rimossi.",
- "delete-attributes": "Elimina attributi",
- "enter-attribute-value": "Inserisci il valore dell'attributo",
- "show-on-widget": "Mostra sul widget",
- "widget-mode": "Modalità Widget",
- "next-widget": "Widget successivo",
- "prev-widget": "Widget precedente",
- "add-to-dashboard": "Aggiungi alla dashboard",
- "add-widget-to-dashboard": "Aggiungi widget alla dashboard",
- "selected-attributes": "{ count, plural, 1 {1 attributo selezionato} other {# attributi selezionati} }",
- "selected-telemetry": "{ count, plural, 1 {1 unità di telemetria selezionata} other {# unità di telemetria selezionate} }"
- },
- "audit-log": {
- "audit": "Audit",
- "audit-logs": "Log Audit",
- "timestamp": "Timestamp",
- "entity-type": "Tipo Entità",
- "entity-name": "Nome Entità",
- "user": "Utente",
- "type": "Tipo",
- "status": "Stato",
- "details": "Dettagli",
- "type-added": "Aggiunto",
- "type-deleted": "Eliminato",
- "type-updated": "Aggiornato",
- "type-attributes-updated": "Attributi aggiornati",
- "type-attributes-deleted": "Attributi eliminati",
- "type-rpc-call": "Chiamata RPC",
- "type-credentials-updated": "Credenziali aggiornate",
- "type-assigned-to-customer": "Assegnato al Cliente",
- "type-unassigned-from-customer": "Assegnazione annullata dal Cliente",
- "type-activated": "Attivato",
- "type-suspended": "Sospeso",
- "type-credentials-read": "Credenziali lette",
- "type-attributes-read": "Attributi letti",
- "type-relation-add-or-update": "Relazione aggiornata",
- "type-relation-delete": "Relazione eliminata",
- "type-relations-delete": "Eliminate tutte le relazioni",
- "type-alarm-ack": "Confermato",
- "type-alarm-clear": "Eliminato",
- "type-login": "Accesso",
- "type-logout": "Disconnettersi",
- "type-lockout": "Bloccato",
- "status-success": "Successo",
- "status-failure": "Fallito",
- "audit-log-details": "Dettaglio log audit",
- "no-audit-logs-prompt": "Log non trovati",
- "action-data": "Action data",
- "failure-details": "Dettagli fallimento",
- "search": "Cerca log audit",
- "clear-search": "Cancella ricerca"
- },
- "confirm-on-exit": {
- "message": "Alcune modifiche non sono state salvate. Sei sicuro di voler abbandonare questa pagina?",
- "html-message": "Alcune modifiche non sono state salvate.
Sei sicuro di voler abbandonare questa pagina?",
- "title": "Modifiche non salvate"
- },
- "contact": {
- "country": "Nazione",
- "city": "Città",
- "state": "Stato / Provincia",
- "postal-code": "CAP",
- "postal-code-invalid": "Formato CAP non valido.",
- "address": "Indirizzo",
- "address2": "Indirizzo 2",
- "phone": "Telefono",
- "email": "Email",
- "no-address": "Nessun indirizzo"
- },
- "common": {
- "username": "Nome utente",
- "password": "Password",
- "enter-username": "Inserisci nome utente",
- "enter-password": "Inserisci password",
- "enter-search": "Cerca ..."
- },
- "content-type": {
- "json": "Json",
- "text": "Testo",
- "binary": "Binario (Base64)"
- },
- "customer": {
- "customer": "Cliente",
- "customers": "Clienti",
- "management": "Gestione cliente",
- "dashboard": "Dashboard cliente",
- "dashboards": "Dashboard cliente",
- "devices": "Dispositivi cliente",
- "entity-views": "Viste entità cliente",
- "assets": "Asset cliente",
- "public-dashboards": "Dashboard pubbliche",
- "public-devices": "Dispositivi pubblici",
- "public-assets": "Asset pubblici",
- "public-entity-views": "Viste entità pubbliche",
- "add": "Aggiungi cliente",
- "delete": "Elimina cliente",
- "manage-customer-users": "Gestisci utenti cliente",
- "manage-customer-devices": "Gestisci dispositivi cliente",
- "manage-customer-dashboards": "Gestisci dashboard cliente",
- "manage-public-devices": "Gestisci dispositivi pubblici",
- "manage-public-dashboards": "Gestisci dashboard pubbliche",
- "manage-customer-assets": "Gestisci asset cliente",
- "manage-public-assets": "Gestisci asset pubblici",
- "add-customer-text": "Aggiungi nuovo cliente",
- "no-customers-text": "Nessun cliente trovato",
- "customer-details": "Dettagli cliente",
- "delete-customer-title": "Sei sicuro di voler eliminare il cliente '{{customerTitle}}'?",
- "delete-customer-text": "Attenzione, dopo la conferma il cliente e tutti i suoi dati non saranno più recuperabili.",
- "delete-customers-title": "Sei sicuro di voler cancellare { count, plural, 1 {1 cliente} other {# clienti} }?",
- "delete-customers-action-title": "Elimina { count, plural, 1 {1 cliente} other {# clienti} }",
- "delete-customers-text": "Attenzione, dopo la conferma tutti i clienti selezionati saranno rimossi e i loro dati non saranno più recuperabili.",
- "manage-users": "Gestisci utenti",
- "manage-assets": "Gestisci asset",
- "manage-devices": "Gestisci dispositivi",
- "manage-dashboards": "Gestisci dashboard",
- "title": "Titolo",
- "title-required": "Titolo obbligatorio.",
- "description": "Descrizione",
- "details": "Dettagli",
- "events": "Eventi",
- "copyId": "Copia Id cliente",
- "idCopiedMessage": "Id cliente copiato negli appunti",
- "select-customer": "Seleziona cliente",
- "no-customers-matching": "Nessun cliente corrispondente a '{{entity}}' è stato trovato.",
- "customer-required": "Cliente obbligatorio",
- "select-default-customer": "Seleziona cliente di default",
- "default-customer": "Cliente di default",
- "default-customer-required": "Il cliente di default è obbligatorio per il debug della dashboard a livello di Tenant"
- },
- "datetime": {
- "date-from": "Data da",
- "time-from": "Orario da",
- "date-to": "Data a",
- "time-to": "Orario a"
- },
- "dashboard": {
- "dashboard": "Dashboard",
- "dashboards": "Dashboard",
- "management": "Gestione Dashboard",
- "view-dashboards": "Mostra Dashboard",
- "add": "Aggiungi Dashboard",
- "assign-dashboard-to-customer": "Assegna Dashboard al cliente",
- "assign-dashboard-to-customer-text": "Seleziona le dashboard da assegnare al client",
- "assign-to-customer-text": "Seleziona il cliente a cui assegnare la/le dashboard",
- "assign-to-customer": "Assegna al cliente",
- "unassign-from-customer": "Annulla assegnazione al cliente",
- "make-public": "Rendi pubblica la dashboard",
- "make-private": "Rendi privata la dashboard",
- "manage-assigned-customers": "Gestisci clienti assegnati",
- "assigned-customers": "Clienti assegnati",
- "assign-to-customers": "Assegna Dashboard ai Clienti",
- "assign-to-customers-text": "Seleziona i clienti da assegnare alla/alle dashboard",
- "unassign-from-customers": "Annulla assegnazione Dashboard ai Clienti",
- "unassign-from-customers-text": "Seleziona i clienti di cui annullare l'assegnazione alla/alle dashboard",
- "no-dashboards-text": "Nessuna dashboard trovata",
- "no-widgets": "Nessun widget configurato",
- "add-widget": "Aggiungi nuovo widget",
- "title": "Titolo",
- "select-widget-title": "Seleziona widget",
- "select-widget-subtitle": "Elenco tipi di widget disponibili",
- "delete": "Elimina dashboard",
- "title-required": "Titolo obbligatorio.",
- "description": "Descrizione",
- "details": "Dettagli",
- "dashboard-details": "Dettagli dashboard",
- "add-dashboard-text": "Aggiungi nuova dashboard",
- "assign-dashboards": "Assegna dashboard",
- "assign-new-dashboard": "Assegna nuova dashboard",
- "assign-dashboards-text": "Assegna { count, plural, 1 {1 dashboard} other {# dashboard} } ai clienti",
- "unassign-dashboards-action-text": "Annulla assegnazione { count, plural, 1 {1 dashboard} other {# dashboard} } ai clienti",
- "delete-dashboards": "Elimina dashboard",
- "unassign-dashboards": "Annulla assegnazione dashboard",
- "unassign-dashboards-action-title": "Annulla assegnazione { count, plural, 1 {1 dashboard} other {# dashboard} } al cliente",
- "delete-dashboard-title": "Sei sicuro di voler cancellare la dashboard '{{dashboardTitle}}'?",
- "delete-dashboard-text": "Attenzione, dopo la conferma la dashboard e tutti i suoi dati non saranno più recuperabili.",
- "delete-dashboards-title": "Sei sicuro di voler eliminare { count, plural, 1 {1 dashboard} other {# dashboard} }?",
- "delete-dashboards-action-title": "Cancella { count, plural, 1 {1 dashboard} other {# dashboard} }",
- "delete-dashboards-text": "Attenzione, dopo la conferma tutte le dashboard selezionate saranno eliminate e tutti i loro dati non saranno più recuperabili.",
- "unassign-dashboard-title": "Sei sicuro di voler annullare l'assegnazione della dashboard '{{dashboardTitle}}'?",
- "unassign-dashboard-text": "Dopo la conferma sarà annullata l'assegnazione della dashboard e questa non sarà più accessibile dal cliente.",
- "unassign-dashboard": "Annulla assegnazione dashboard",
- "unassign-dashboards-title": "Sei sicuro di voler annullare l'assegnazione di { count, plural, 1 {1 dashboard} other {# dashboard} }?",
- "unassign-dashboards-text": "Dopo la conferma sarà annullata l'assegnazione di tutte le dashboard selezionate e queste non saranno più accessibili dal cliente.",
- "public-dashboard-title": "La Dashboard è ora pubblica",
- "public-dashboard-text": "La dashboard {{dashboardTitle}} è ora pubblica e accessibile al link:",
- "public-dashboard-notice": "Nota: Ricorda di rendere pubblici i relativi dispositivi per accedere ai loro dati.",
- "make-private-dashboard-title": "Sei sicuro di voler rendere privata la dashboard '{{dashboardTitle}}'?",
- "make-private-dashboard-text": "Dopo la conferma la dashboard sarà resa privata e non più accessibile dagli altri.",
- "make-private-dashboard": "Rendi privata la dashboard",
- "socialshare-text": "'{{dashboardTitle}}' powered by ThingsBoard",
- "socialshare-title": "'{{dashboardTitle}}' powered by ThingsBoard",
- "select-dashboard": "Seleziona dashboard",
- "no-dashboards-matching": "Nessuna dashboard corrispondente a '{{entity}}' è stata trovata.",
- "dashboard-required": "Dashboard obbligatoria.",
- "select-existing": "Seleziona una dashboard esistente",
- "create-new": "Crea nuova dashboard",
- "new-dashboard-title": "Titolo nuova dashboard",
- "open-dashboard": "Apri dashboard",
- "set-background": "Imposta sfondo",
- "background-color": "Colore sfondo",
- "background-image": "Immagine sfondo",
- "background-size-mode": "Modalità dimensione sfondo",
- "no-image": "Nessuna immagine selezionata",
- "drop-image": "Trascina un'immagine o fai clic per selezionare un file da caricare.",
- "settings": "Impostazioni",
- "columns-count": "Numero colonne",
- "columns-count-required": "Numero colonne obbligatorio.",
- "min-columns-count-message": "Ammesso un numero minimo di colonne pari a 10.",
- "max-columns-count-message": "Ammesso un numero massimo di colonne pari a 1000.",
- "widgets-margins": "Margine tra i widget",
- "horizontal-margin": "Margine orizzontale",
- "horizontal-margin-required": "Margine orizzontale obbligatorio.",
- "min-horizontal-margin-message": "Ammesso un margine orizzontale minimo pari a 0.",
- "max-horizontal-margin-message": "Ammesso un margine orizzontale massimo pari a 50.",
- "vertical-margin": "Margine verticale",
- "vertical-margin-required": "Margine verticale obbligatorio.",
- "min-vertical-margin-message": "Ammesso un margine verticale minimo pari a 0.",
- "max-vertical-margin-message": "Ammesso un margine verticale massimo pari a 50.",
- "autofill-height": "Riempi automaticamente altezza layout",
- "mobile-layout": "Impostazioni layout mobile",
- "mobile-row-height": "Altezza riga mobile (px)",
- "mobile-row-height-required": "Altezza riga mobile è richiesta.",
- "min-mobile-row-height-message": "5 pixel è il minimo concesso al valore altezza riga mobile.",
- "max-mobile-row-height-message": "200 pixel è il massimo concesso al valore altezza riga mobile.",
- "display-title": "Mostra titolo dashboard",
- "toolbar-always-open": "Mantieni aperta la barra degli strumenti",
- "title-color": "Colore titolo",
- "display-dashboards-selection": "Mostra selezione dashboard",
- "display-entities-selection": "Mostra selezione entità",
- "display-dashboard-timewindow": "Mostra intervallo temporale",
- "display-dashboard-export": "Mostra esportazione",
- "import": "Importa dashboard",
- "export": "Esporta dashboard",
- "export-failed-error": "Impossibile esportare la dashboard: {{error}}",
- "create-new-dashboard": "Crea nuova dashboard",
- "dashboard-file": "File dashboard",
- "invalid-dashboard-file-error": "Impossibile importare la dashboard: struttura dati della dashboard non valida.",
- "dashboard-import-missing-aliases-title": "Configura alias utilizzati dalla dashboard importata",
- "create-new-widget": "Crea nuovo widget",
- "import-widget": "Importa widget",
- "widget-file": "Widget file",
- "invalid-widget-file-error": "Impossibile importare il widget: struttura dati del widget non valida.",
- "widget-import-missing-aliases-title": "Configura gli alias utilizzati dai widget importati",
- "open-toolbar": "Apri barra degli strumenti",
- "close-toolbar": "Chiudi barra degli strumenti",
- "configuration-error": "Errore di configurazione",
- "alias-resolution-error-title": "Errore di configurazione degli alias della dashboard",
- "invalid-aliases-config": "Impossibile trovare un dispositivo corrispondente ad un qualche filtro degli alias.
Contatta l'amministratore per risolvere il problema.",
- "select-devices": "Seleziona dispositivi",
- "assignedToCustomer": "Assegnato al cliente",
- "assignedToCustomers": "Assegnato ai clienti",
- "public": "Pubblico",
- "public-link": "Link pubblico",
- "copy-public-link": "Copia link pubblico",
- "public-link-copied-message": "Link pubblico della dashboard copiato negli appunti",
- "manage-states": "Gestisci stati dashboard",
- "states": "Stati dashboard",
- "search-states": "Ricerca stati dashboard",
- "selected-states": "{ count, plural, 1 {1 stato dashboard selezionato} other {# stati dashboard selezionati} }",
- "edit-state": "Modifica stato dashboard",
- "delete-state": "Elimina stato dashboard",
- "add-state": "Aggiungi stato dashboard",
- "state": "Stato dashboard",
- "state-name": "Nome",
- "state-name-required": "Nome stato dashboard obbligatorio.",
- "state-id": "Id stato",
- "state-id-required": "Id stato dashboard obbligatorio.",
- "state-id-exists": "Uno stato della dashboard con lo stesso id è già presente.",
- "is-root-state": "Stato radice",
- "delete-state-title": "Elimina stato dashboard",
- "delete-state-text": "Sei sicuro di voler eliminare lo stato della dashboard di nome '{{stateName}}'?",
- "show-details": "Mostra dettagli",
- "hide-details": "Nascondi dettagli",
- "select-state": "Seleziona stato target",
- "state-controller": "Stato controller"
- },
- "datakey": {
- "settings": "Impostazioni",
- "advanced": "Avanzate",
- "label": "Etichetta",
- "color": "Colore",
- "units": "Simbolo speciale da mostrare accanto al valore",
- "decimals": "Numero cifre decimali",
- "data-generation-func": "Funzione generazione dati",
- "use-data-post-processing-func": "Usa funzione dopo il processamento dei dati",
- "configuration": "Configurazione data key",
- "timeseries": "Serie temporali",
- "attributes": "Attributi",
- "alarm": "Campi allarme",
- "timeseries-required": "Le serie temporali dell'entità sono richieste.",
- "timeseries-or-attributes-required": "Le serie temporali o gli attributi dell'entità sono richiesti.",
- "maximum-timeseries-or-attributes": "Massimo { count, plural, 1 {1 serie temporale/attributo consentito.} other {# serie temporali/attributi consentiti.} }",
- "alarm-fields-required": "Campi allarme obbligatori.",
- "function-types": "Tipi funzione",
- "function-types-required": "Tipi funzione obbligatorio.",
- "maximum-function-types": "Massimo { count, plural, 1 {1 tipo di funzione consentito.} other {# tipi di funzione consentiti} }",
- "time-description": "timestamp del valore corrente;",
- "value-description": "il valore corrente;",
- "prev-value-description": "risultato della precedente chiamata alla funzione;",
- "time-prev-description": "timestamp del valore precedente;",
- "prev-orig-value-description": "valore precedente originale;"
- },
- "datasource": {
- "type": "Tipo sorgente dati",
- "name": "Nome",
- "add-datasource-prompt": "Aggiungi una sorgente dati"
- },
- "details": {
- "edit-mode": "Modalità modifica",
- "toggle-edit-mode": "Attiva/disattiva modalità di modifica"
- },
- "device": {
- "device": "Dispositivo",
- "device-required": "Dispositivo richiesto.",
- "devices": "Dispositivi",
- "management": "Gestione dispositivo",
- "view-devices": "Visualizza Dispositivi",
- "device-alias": "Alias dispositivo",
- "aliases": "Alias dispositivo",
- "no-alias-matching": "'{{alias}}' non trovato.",
- "no-aliases-found": "Nessun alias trovato.",
- "no-key-matching": "'{{key}}' non trovata.",
- "no-keys-found": "Nessuna chiave trovata.",
- "create-new-alias": "Creane uno nuovo!",
- "create-new-key": "Creane una nuova!",
- "duplicate-alias-error": "Sono stati trovati dei duplicati dell'alias '{{alias}}'.
Gli alias di un dispositivo devono essere univoci all'interno della dashboard.",
- "configure-alias": "Configura alias '{{alias}}'",
- "no-devices-matching": "Nessun dispositivo corrispondente a '{{entity}}' è stato trovato.",
- "alias": "Alias",
- "alias-required": "Alias dispositivo richiesto.",
- "remove-alias": "Rimuovi alias dispositivo",
- "add-alias": "Aggiungi alias dispositivo",
- "name-starts-with": "Dispositivo il cui nome inizia per",
- "device-list": "Lista dispositivi",
- "use-device-name-filter": "Usa filtro",
- "device-list-empty": "Nessun dispositivo selezionato.",
- "device-name-filter-required": "Filtro nome dispositivo obbligatorio.",
- "device-name-filter-no-device-matched": "Nessun dispositivo il cui nome inizia per '{{device}}' è stato trovato.",
- "add": "Aggiungi Dispositivo",
- "assign-to-customer": "Assegna al cliente",
- "assign-device-to-customer": "Assegna dispositivo/dispositivi al Cliente",
- "assign-device-to-customer-text": "Seleziona i dispositivi da assegnare al cliente",
- "make-public": "Rendi pubblico il dispositivo",
- "make-private": "Rendi privato il dispositivo",
- "no-devices-text": "Nessun dispositivo trovato",
- "assign-to-customer-text": "Seleziona il cliente a cui assegnare il dispositivo/i dispositivi",
- "device-details": "Dettagli dispositivo",
- "add-device-text": "Aggiungi nuovo dispositivo",
- "credentials": "Credenziali",
- "manage-credentials": "Gestisci credenziali",
- "delete": "Elimina dispositivo",
- "assign-devices": "Assegna dispositivi",
- "assign-devices-text": "Assegna { count, plural, 1 {1 dispositivo} other {# dispositivi} } al cliente",
- "delete-devices": "Elimina dispositivi",
- "unassign-from-customer": "Annulla assegnazione al cliente",
- "unassign-devices": "Annulla assegnazione dispositivi",
- "unassign-devices-action-title": "Annulla assegnazione { count, plural, 1 {1 dispositivo} other {# dispositivi} } al cliente",
- "assign-new-device": "Assegna nuovo dispositivo",
- "make-public-device-title": "Sei sicuro di voler rendere pubblico il dispositivo '{{deviceName}}'?",
- "make-public-device-text": "Dopo la conferma il dispositivo e tutti i suoi dati saranno resi pubblici e accessibili dagli altri.",
- "make-private-device-title": "Sei sicuro di voler rendere privato il dispositivo '{{deviceName}}'?",
- "make-private-device-text": "Dopo la conferma il dispositivo e tutti i suoi dati saranno resi privati e non più accessibili da altri utenti.",
- "view-credentials": "Visualizza credenziali",
- "delete-device-title": "Sei sicuro di voler eliminare il dispositivo '{{deviceName}}'?",
- "delete-device-text": "Attenzione, dopo la conferma il dispositivo e tutti i suoi dati non saranno più recuperabili.",
- "delete-devices-title": "Sei sicuro di voler eliminare { count, plural, 1 {1 dispositivo} other {# dispositivi} }?",
- "delete-devices-action-title": "Elimina { count, plural, 1 {1 dispositivo} other {# dispositivi} }",
- "delete-devices-text": "Attenzione, dopo la conferma tutti i dispositivi selezionati saranno eliminati e i relativi dati non saranno più recuperabili.",
- "unassign-device-title": "Sei sicuro di voler annullare l'assegnazione del dispositivo '{{deviceName}}'?",
- "unassign-device-text": "Dopo la conferma sarà annullata l'assegnazione del dispositivo e questo non sarà più accessibile dal cliente.",
- "unassign-device": "Annulla assegnazione dispositivo",
- "unassign-devices-title": "Sei sicuro di voler annullare l'assegnazione di { count, plural, 1 {1 dispositivo} other {# dispositivi} }?",
- "unassign-devices-text": "Dopo la conferma sarà annullata l'assegnazione di tutti i dispositivi selezionati e questi non saranno più accessibili dal cliente.",
- "device-credentials": "Credenziali Dispositivo",
- "credentials-type": "Tipo credenziali",
- "access-token": "Token di accesso",
- "access-token-required": "Token di accesso obbligatorio.",
- "access-token-invalid": "Il token di accesso deve avere una lunghezza compresa tra 1 e 20 caratteri.",
- "rsa-key": "Chiave pubblica RSA",
- "rsa-key-required": "Chiave pubblica RSA obbligatoria.",
- "secret": "Secret",
- "secret-required": "Secret obbligatorio.",
- "device-type": "Tipo dispositivo",
- "device-type-required": "Tipo dispositivo obbligatorio.",
- "select-device-type": "Seleziona tipo dispositivo",
- "enter-device-type": "Inserisci typo dispositivo",
- "any-device": "Qualsiasi dispositivo",
- "no-device-types-matching": "Nessun dispositivo corrispondente a '{{entitySubtype}}' è stato trovato.",
- "device-type-list-empty": "Nessun tipo di dispositivo selezionato.",
- "device-types": "Tipi dispositivo",
- "name": "Nome",
- "name-required": "Nome obbligatorio.",
- "description": "Descrizione",
- "events": "Eventi",
- "details": "Dettagli",
- "copyId": "Copia Id dispositivo",
- "copyAccessToken": "Copia token di accesso",
- "idCopiedMessage": "Id dispositivo copiato negli Appunti",
- "accessTokenCopiedMessage": "Token di accesso del dispositivo copiato negli Appunti",
- "assignedToCustomer": "Assegnato al cliente",
- "unable-delete-device-alias-title": "Impossibile rimuovere l'alias del dispositivo",
- "unable-delete-device-alias-text": "L'alias del dispositivo '{{deviceAlias}}' non può essere eliminato perché utilizzato dai seguenti widget:
{{widgetsList}}",
- "is-gateway": "È un gateway",
- "public": "Pubblico",
- "device-public": "Il dispositivo è pubblico",
- "select-device": "Seleziona dispositivo"
- },
- "dialog": {
- "close": "Close dialog"
- },
- "direction": {
- "column": "Colonna",
- "row": "Riga"
- },
- "error": {
- "unable-to-connect": "Impossibile connettersi al server! Controlla la connessione ad Internet.",
- "unhandled-error-code": "Codice errore non gestito: {{errorCode}}",
- "unknown-error": "Errore sconosciuto"
- },
- "entity": {
- "entity": "Entità",
- "entities": "Entità",
- "aliases": "Alias entità",
- "entity-alias": "Alias entità",
- "unable-delete-entity-alias-title": "Impossibile eliminare alias entità",
- "unable-delete-entity-alias-text": "L'alias dell'entità '{{entityAlias}}' non può essere eliminato perché utilizzato dai seguenti widget:
{{widgetsList}}",
- "duplicate-alias-error": "Trovato un duplicato dell'alias '{{alias}}'.
Gli alias dell'entità devono essere univoci all'interno della dashboard.",
- "missing-entity-filter-error": "Manca il filtro per l'alias '{{alias}}'.",
- "configure-alias": "Configura '{{alias}}' alias",
- "alias": "Alias",
- "alias-required": "Alias entità obbligatorio.",
- "remove-alias": "Rimuovi alias entità",
- "add-alias": "Aggiungi alias entità",
- "entity-list": "Lista entità",
- "entity-type": "Tipo entità",
- "entity-types": "Tipi entità",
- "entity-type-list": "Lista tipo entità",
- "any-entity": "Qualsiasi entità",
- "enter-entity-type": "Inserisci tipo entità",
- "no-entities-matching": "Nessuna entità corrispondente a '{{entity}}' è stata trovata.",
- "no-entity-types-matching": "Nessun tipo di entità corrispondente a '{{entityType}}' è stato trovato.",
- "name-starts-with": "Nome inizia per",
- "use-entity-name-filter": "Usa filtro",
- "entity-list-empty": "Nessuna entità selezionata.",
- "entity-type-list-empty": "Nessun tipo di entità selezionato.",
- "entity-name-filter-required": "Filtro nome entità obbligatorio.",
- "entity-name-filter-no-entity-matched": "Nessuna entità che inizia per '{{entity}}' è stata trovata.",
- "all-subtypes": "Tutte",
- "select-entities": "Seleziona entità",
- "no-aliases-found": "Nessun alias trovato.",
- "no-alias-matching": "'{{alias}}' non trovato.",
- "create-new-alias": "Creane uno nuovo!",
- "key": "Chiave",
- "key-name": "Nome chiave",
- "no-keys-found": "Nessuna chiave trovata.",
- "no-key-matching": "'{{key}}' non trovata.",
- "create-new-key": "Creane una nuova!",
- "type": "Tipo",
- "type-required": "Tipo entità obbligatorio.",
- "type-device": "Dispositivo",
- "type-devices": "Dispositivi",
- "list-of-devices": "{ count, plural, 1 {Un dispositivo} other {Lista di # dispositivi} }",
- "device-name-starts-with": "Dispositivi i cui nomi iniziano per '{{prefix}}'",
- "type-asset": "Asset",
- "type-assets": "Asset",
- "list-of-assets": "{ count, plural, 1 {Un asset} other {Lista di # asset} }",
- "asset-name-starts-with": "Asset i cui nomi iniziano per '{{prefix}}'",
- "type-entity-view": "Vista entità",
- "type-entity-views": "Viste entità",
- "list-of-entity-views": "{ count, plural, 1 {Una vista entità} other {Lista di # viste entità} }",
- "entity-view-name-starts-with": "Viste entità i cui nomi iniziano per '{{prefix}}'",
- "type-rule": "Regola",
- "type-rules": "Regole",
- "list-of-rules": "{ count, plural, 1 {Una regola} other {Lista di # regole} }",
- "rule-name-starts-with": "Regole i cui nomi iniziano per '{{prefix}}'",
- "type-plugin": "Plugin",
- "type-plugins": "Plugin",
- "list-of-plugins": "{ count, plural, 1 {Un plugin} other {Lista di # plugin} }",
- "plugin-name-starts-with": "Plugin i cui nomi iniziano per '{{prefix}}'",
- "type-tenant": "Tenant",
- "type-tenants": "Tenants",
- "list-of-tenants": "{ count, plural, 1 {One tenant} other {Lista di # tenants} }",
- "tenant-name-starts-with": "Tenants whose names start with '{{prefix}}'",
- "type-customer": "Cliente",
- "type-customers": "Clienti",
- "list-of-customers": "{ count, plural, 1 {Un cliente} other {Lista di # clienti} }",
- "customer-name-starts-with": "Clienti i cui nomi iniziano per '{{prefix}}'",
- "type-user": "Utente",
- "type-users": "Utenti",
- "list-of-users": "{ count, plural, 1 {Un utente} other {Lista di # utenti} }",
- "user-name-starts-with": "Utenti i cui nomi iniziano per '{{prefix}}'",
- "type-dashboard": "Dashboard",
- "type-dashboards": "Dashboard",
- "list-of-dashboards": "{ count, plural, 1 {Una dashboard} other {Lista di # dashboard} }",
- "dashboard-name-starts-with": "Dashboard i cui nomi iniziano per '{{prefix}}'",
- "type-alarm": "Allarme",
- "type-alarms": "Allarmi",
- "list-of-alarms": "{ count, plural, 1 {Un allarme} other {Lista di # allarmi} }",
- "alarm-name-starts-with": "Allarmi i cui nomi iniziano per '{{prefix}}'",
- "type-rulechain": "Rule chain",
- "type-rulechains": "Rule chain",
- "list-of-rulechains": "{ count, plural, 1 {Una rule chain} other {Lista di # catene di regole} }",
- "rulechain-name-starts-with": "Catene di regole i cui nomi iniziano per '{{prefix}}'",
- "type-rulenode": "Nodo regola",
- "type-rulenodes": "Nodi regola",
- "list-of-rulenodes": "{ count, plural, 1 {Un nodo regola} other {Lista di # nodi regola} }",
- "rulenode-name-starts-with": "Nodi regola i cui nomi iniziano per '{{prefix}}'",
- "type-current-customer": "Cliente attuale",
- "search": "Ricerca entità",
- "selected-entities": "{ count, plural, 1 {1 entità selezionata} other {# entità selezionate} }",
- "entity-name": "Nome entità",
- "details": "Dettagli entità",
- "no-entities-prompt": "Nessuna entità trovata",
- "no-data": "Nessun dato da mostrare",
- "columns-to-display": "Colonne da mostrare"
- },
- "entity-view": {
- "entity-view": "Vista entità",
- "entity-view-required": "Vista entità richiesta.",
- "entity-views": "Viste entità",
- "management": "Gestione viste entità",
- "view-entity-views": "Visualizza Viste entità",
- "entity-view-alias": "Alias vista entità",
- "aliases": "Alias vista entità",
- "no-alias-matching": "'{{alias}}' non trovato.",
- "no-aliases-found": "Nessun alias trovato.",
- "no-key-matching": "'{{key}}' non trovata.",
- "no-keys-found": "Nessuna chiave trovata.",
- "create-new-alias": "Creane uno nuovo!",
- "create-new-key": "Creane una nuova!",
- "duplicate-alias-error": "Sono stati trovati dei duplicati dell'alias '{{alias}}'.
Gli alias di una vista entità devono essere univoci all'interno della dashboard.",
- "configure-alias": "Configura alias '{{alias}}'",
- "no-entity-views-matching": "Nessuna vista entità corrispondente a '{{entity}}' è stata trovato.",
- "alias": "Alias",
- "alias-required": "Alias vista entità richiesto.",
- "remove-alias": "Rimuovi alias vista entità",
- "add-alias": "Aggiungi alias vista entità",
- "name-starts-with": "Vista entità il cui nome inizia per",
- "entity-view-list": "Lista viste entità",
- "use-entity-view-name-filter": "Usa filtro",
- "entity-view-list-empty": "Nessuna vista entità selezionata.",
- "entity-view-name-filter-required": "Filtro nome vista entità obbligatorio.",
- "entity-view-name-filter-no-entity-view-matched": "Nessuna vista entità il cui nome inizia per '{{entity-view}}' è stata trovata.",
- "add": "Aggiungi Vista entità",
- "assign-to-customer": "Assegna al cliente",
- "assign-entity-view-to-customer": "Assegna vista entità/viste entità al Cliente",
- "assign-entity-view-to-customer-text": "Seleziona la vista entità da assegnare al cliente",
- "no-entity-views-text": "Nessuna vista entità trovata",
- "assign-to-customer-text": "Seleziona il cliente a cui assegnare la vista entità/le vista entità",
- "entity-view-details": "Dettagli vista entità",
- "add-entity-view-text": "Aggiungi nuova vista entità",
- "delete": "Elimina vista entità",
- "assign-entity-views": "Assegna viste entità",
- "assign-entity-views-text": "Assegna { count, plural, 1 {1 vista entità} other {# viste entità} } al cliente",
- "delete-entity-views": "Elimina viste entità",
- "unassign-from-customer": "Annulla assegnazione al cliente",
- "unassign-entity-views": "Annulla assegnazione viste entità",
- "unassign-entity-views-action-title": "Annulla assegnazione { count, plural, 1 {1 vista entità} other {# viste entità} } al cliente",
- "assign-new-entity-view": "Assegna nuova vista entità",
- "delete-entity-view-title": "Sei sicuro di voler eliminare la vista entità '{{entity-viewName}}'?",
- "delete-entity-view-text": "Attenzione, dopo la conferma la vista entità e tutti i suoi dati non saranno più recuperabili.",
- "delete-entity-views-title": "Sei sicuro di voler eliminare { count, plural, 1 {1 vista entità} other {# viste entità} }?",
- "delete-entity-views-action-title": "Elimina { count, plural, 1 {1 vista entità} other {# viste entità} }",
- "delete-entity-views-text": "Attenzione, dopo la conferma tutte le vista entità selezionati saranno eliminate e i relativi dati non saranno più recuperabili.",
- "unassign-entity-view-title": "Sei sicuro di voler annullare l'assegnazione della vista entità '{{entity-viewName}}'?",
- "unassign-entity-view-text": "Dopo la conferma sarà annullata l'assegnazione della vista entità e questa non sarà più accessibile dal cliente.",
- "unassign-entity-view": "Annulla assegnazione vista entità",
- "unassign-entity-views-title": "Sei sicuro di voler annullare l'assegnazione di { count, plural, 1 {1 vista entità} other {# viste entità} }?",
- "unassign-entity-views-text": "Dopo la conferma sarà annullata l'assegnazione di tutte le vista entità selezionate e queste non saranno più accessibili dal cliente.",
- "entity-view-type": "Tipo vista entità",
- "entity-view-type-required": "Tipo vista entità obbligatorio.",
- "select-entity-view-type": "Seleziona tipo vista entità",
- "enter-entity-view-type": "Inserisci tipo vista entità",
- "any-entity-view": "Qualsiasi vista entità",
- "no-entity-view-types-matching": "Nessuna vista entità corrispondente a '{{entitySubtype}}' è stata trovata.",
- "entity-view-type-list-empty": "Nessun tipo di vista entità selezionato.",
- "entity-view-types": "Tipi vista entità",
- "name": "Nome",
- "name-required": "Nome obbligatorio.",
- "description": "Descrizione",
- "events": "Eventi",
- "details": "Dettagli",
- "copyId": "Copia Id vista entità",
- "assignedToCustomer": "Assegnata al cliente",
- "unable-entity-view-device-alias-title": "Impossibile rimuovere l'alias del vista entità",
- "unable-entity-view-device-alias-text": "L'alias del vista entità '{{entity-viewAlias}}' non può essere eliminato perché utilizzato dai seguenti widget:
{{widgetsList}}",
- "select-entity-view": "Seleziona vista entità",
- "make-public": "Rendi pubblica la vista entità",
- "make-private": "Rendi privata la vista entità",
- "start-date": "Data inizio",
- "start-ts": "Ora inizio",
- "end-date": "Data fine",
- "end-ts": "Ora fine",
- "date-limits": "Limiti temporali",
- "client-attributes": "Attributi cliente",
- "shared-attributes": "Attributi condivisi",
- "server-attributes": "Attributi server",
- "timeseries": "Serie temporali",
- "client-attributes-placeholder": "Attributi cliente",
- "shared-attributes-placeholder": "Attributi condivisi",
- "server-attributes-placeholder": "Attributi server",
- "timeseries-placeholder": "Serie temporali",
- "target-entity": "Entità target",
- "attributes-propagation": "Propagazione degli attributi",
- "attributes-propagation-hint": "La vista entità copierà automaticamente gli attributi specificati dall'entità target ogni volta che questa vista entità sarà salvata e aggiornata. Per ragioni di performance, gli attributi dell'entità target non sono propagati alle viste entità ogni cambiamento di attributo. È possibile abilitare la propagazione automatica configurando il nodo regola \"Copia alla vista\" nella rule chain e collegando i messaggi \"Post attributes\" a \"Attributes Updated\" al nuovo nodo regola.",
- "timeseries-data": "Dati delle serie temporali",
- "timeseries-data-hint": "Imposta le chiavi delle serie temporali dell'entità target che saranno accessibili alla vista entità. Questi dati sono di sola lettura.",
- "make-public-entity-view-title": "Sei sicuro di voler rendere pubblica la vista entità '{{entity-viewName}}'?",
- "make-public-entity-view-text": "Dopo la conferma la vista entità e tutti i suoi dati saranno resi pubblici e accessibili dagli altri.",
- "make-private-entity-view-title": "Sei sicuro di voler rendere privata la vista entità '{{entity-viewName}}'?",
- "make-private-entity-view-text": "Dopo la conferma la vista entità e tutti i suoi dati saranno resi privati e non più accessibili da altri utenti."
- },
- "event": {
- "event-type": "Tipo evento",
- "type-error": "Errore",
- "type-lc-event": "Ciclo di vita evento",
- "type-stats": "Statistiche",
- "type-debug-rule-node": "Debug",
- "type-debug-rule-chain": "Debug",
- "no-events-prompt": "Nessun evento trovato",
- "error": "Errore",
- "alarm": "Allarme",
- "event-time": "Orario evento",
- "server": "Server",
- "body": "Body",
- "method": "Metodo",
- "type": "Tipo",
- "entity": "Entità",
- "message-id": "Id Messaggio",
- "message-type": "Tipo Messaggio",
- "data-type": "Tipo di dato",
- "relation-type": "Tipo di relazione",
- "metadata": "Metadati",
- "data": "Dati",
- "event": "Evento",
- "status": "Stato",
- "success": "Success",
- "failed": "Failed",
- "messages-processed": "Messaggi elaborati",
- "errors-occurred": "Si sono verificati degli errori"
- },
- "extension": {
- "extensions": "Estensioni",
- "selected-extensions": "{ count, plural, 1 {1 estensione selezionata} other {# estensioni selezionate} }",
- "type": "Tipo",
- "key": "Chiave",
- "value": "Valore",
- "id": "Id",
- "extension-id": "Id Estensione",
- "extension-type": "Tipo Estensione",
- "transformer-json": "JSON *",
- "unique-id-required": "Id estensione corrente già esistente.",
- "delete": "Elimina estensione",
- "add": "Aggiungi estensione",
- "edit": "Modifica estensione",
- "delete-extension-title": "Sei sicuro di voler eliminare l'estensione '{{extensionId}}'?",
- "delete-extension-text": "Attenzione, dopo la conferma l'estensione e tutti i suoi data non saranno più recuperabili.",
- "delete-extensions-title": "Sei sicuro di voler eliminare { count, plural, 1 {1 estensione} other {# estensioni} }?",
- "delete-extensions-text": "Attenzione, dopo la conferma tutte le estensioni selezionate saranno eliminate.",
- "converters": "Convertitori",
- "converter-id": "Id convertitore",
- "configuration": "Configurazione",
- "converter-configurations": "Configurazioni convertitore",
- "token": "Token di sicurezza",
- "add-converter": "Aggiungi convertitore",
- "add-config": "Aggiungi configurazione convertitore",
- "device-name-expression": "Espressione nome dispositivo",
- "device-type-expression": "Espressione tipo dispositivo",
- "custom": "Custom",
- "to-double": "To Double",
- "transformer": "Transformer",
- "json-required": "Transformer json is required.",
- "json-parse": "Unable to parse transformer json.",
- "attributes": "Attributi",
- "add-attribute": "Aggiungi attributo",
- "add-map": "Add mapping element",
- "timeseries": "Serie temporali",
- "add-timeseries": "Add timeseries",
- "field-required": "Campo obbligatorio",
- "brokers": "Broker",
- "add-broker": "Aggiungi broker",
- "host": "Host",
- "port": "Porta",
- "port-range": "Il numero di porta deve essere compreso tra 1 e 65535.",
- "ssl": "Ssl",
- "credentials": "Credenziali",
- "username": "Nome utente",
- "password": "Password",
- "retry-interval": "Intervallo di ripetizione in millisecondi",
- "anonymous": "Anonimo",
- "basic": "Basic",
- "pem": "PEM",
- "ca-cert": "File certificato CA *",
- "private-key": "File chiave privata *",
- "cert": "File certificato *",
- "no-file": "Nessun file selezionato.",
- "drop-file": "Trascina un file o fai clic per selezionare un file da caricare.",
- "mapping": "Mapping",
- "topic-filter": "Filtro topic",
- "converter-type": "Tipo convertitore",
- "converter-json": "Json",
- "json-name-expression": "Device name json expression",
- "topic-name-expression": "Device name topic expression",
- "json-type-expression": "Device type json expression",
- "topic-type-expression": "Device type topic expression",
- "attribute-key-expression": "Attribute key expression",
- "attr-json-key-expression": "Attribute key json expression",
- "attr-topic-key-expression": "Attribute key topic expression",
- "request-id-expression": "Request id expression",
- "request-id-json-expression": "Request id json expression",
- "request-id-topic-expression": "Request id topic expression",
- "response-topic-expression": "Response topic expression",
- "value-expression": "Value expression",
- "topic": "Topic",
- "timeout": "Timeout in millisecondi",
- "converter-json-required": "Convertitore json obbligatorio.",
- "converter-json-parse": "Unable to parse converter json.",
- "filter-expression": "Filter expression",
- "connect-requests": "Richieste di connessione",
- "add-connect-request": "Aggiungi richiesta di connessione",
- "disconnect-requests": "Richieste di disconnessione",
- "add-disconnect-request": "Aggiungi richiesta di disconnessione",
- "attribute-requests": "Attribute requests",
- "add-attribute-request": "Add attribute request",
- "attribute-updates": "Attribute updates",
- "add-attribute-update": "Add attribute update",
- "server-side-rpc": "RPC lato server",
- "add-server-side-rpc-request": "Add server-side RPC request",
- "device-name-filter": "Filtro nome dispositivo",
- "attribute-filter": "Filtro attributo",
- "method-filter": "Filtro metodo",
- "request-topic-expression": "Request topic expression",
- "response-timeout": "Response timeout in milliseconds",
- "topic-expression": "Topic expression",
- "client-scope": "Visibilità client",
- "add-device": "Aggiungi dispositivo",
- "opc-server": "Server",
- "opc-add-server": "Aggiungi server",
- "opc-add-server-prompt": "Aggiungi server",
- "opc-application-name": "Nome applicazione",
- "opc-application-uri": "Uri applicazione",
- "opc-scan-period-in-seconds": "Intervallo di scansione in secondi",
- "opc-security": "Sicurezza",
- "opc-identity": "Identità",
- "opc-keystore": "Keystore",
- "opc-type": "Tipo",
- "opc-keystore-type": "Tipo",
- "opc-keystore-location": "Location *",
- "opc-keystore-password": "Password",
- "opc-keystore-alias": "Alias",
- "opc-keystore-key-password": "Chiave password",
- "opc-device-node-pattern": "Device node pattern",
- "opc-device-name-pattern": "Device name pattern",
- "modbus-server": "Server/slave",
- "modbus-add-server": "Aggiungi server/slave",
- "modbus-add-server-prompt": "Aggiungi server/slave",
- "modbus-transport": "Transport",
- "modbus-tcp-reconnect": "Riconnessione automatica",
- "modbus-rtu-over-tcp": "RTU over TCP",
- "modbus-port-name": "Nome porta seriale",
- "modbus-encoding": "Codifica",
- "modbus-parity": "Parità",
- "modbus-baudrate": "Baud rate",
- "modbus-databits": "Data bits",
- "modbus-stopbits": "Stop bits",
- "modbus-databits-range": "Data bits deve essere compreso nell'intervallo 7-8.",
- "modbus-stopbits-range": "Stop bits deve essere compreso nell'intervallo 1-2.",
- "modbus-unit-id": "ID unità",
- "modbus-unit-id-range": "ID unità deve essere compreso nell'intervallo 1-247.",
- "modbus-device-name": "Nome dispositivo",
- "modbus-poll-period": "Intervallo di polling (ms)",
- "modbus-attributes-poll-period": "Intervallo di polling degli attributi (ms)",
- "modbus-timeseries-poll-period": "Intervallo di polling delle serie temporali (ms)",
- "modbus-poll-period-range": "L'intervallo di polling deve essere un valore positivo.",
- "modbus-tag": "Tag",
- "modbus-function": "Funzione",
- "modbus-register-address": "Indirizzo registro",
- "modbus-register-address-range": "Indirizzo registro deve essere compreso tra 0 e 65535.",
- "modbus-register-bit-index": "Bit index",
- "modbus-register-bit-index-range": "Bit index should be in a range from 0 to 15.",
- "modbus-register-count": "Register count",
- "modbus-register-count-range": "Register count should be a positive value.",
- "modbus-byte-order": "Byte order",
- "sync": {
- "status": "Stato",
- "sync": "Sincronizzato",
- "not-sync": "Non sincronizzato",
- "last-sync-time": "Ultima sincronizzazione",
- "not-available": "Non disponibile"
- },
- "export-extensions-configuration": "Esporta configurazione estensioni",
- "import-extensions-configuration": "Importa configurazione estensioni",
- "import-extensions": "Importa estensione",
- "import-extension": "Importa estensione",
- "export-extension": "Esporta estensione",
- "file": "File estensione",
- "invalid-file-error": "File estensione non valido"
- },
- "fullscreen": {
- "expand": "Espandi a tutto schermo",
- "exit": "Esci da schermo intero",
- "toggle": "Commuta modalità schermo intero",
- "fullscreen": "Schermo intero"
- },
- "function": {
- "function": "Funzione"
- },
- "grid": {
- "delete-item-title": "Sei sicuro di voler eliminare questo elemento?",
- "delete-item-text": "Attenzione, dopo la conferma questo elemento e tutti i suoi dati non saranno più recuperabili.",
- "delete-items-title": "Sei sicuro di voler eliminare { count, plural, 1 {1 elemento} other {# elementi} }?",
- "delete-items-action-title": "Elimina { count, plural, 1 {1 elemento} other {# elementi} }",
- "delete-items-text": "Attenzione, dopo la conferma tutti gli elementi selezionati saranno rimossi e i relativi dati non saranno più recuperabili.",
- "add-item-text": "Aggiungi nuovo elemento",
- "no-items-text": "Nessun elemento trovato",
- "item-details": "Dettagli elemento",
- "delete-item": "Elimina elemento",
- "delete-items": "Elimina elementi",
- "scroll-to-top": "Scorri verso l'alto"
- },
- "help": {
- "goto-help-page": "Vai all'help"
- },
- "home": {
- "home": "Home",
- "profile": "Profilo",
- "logout": "Logout",
- "menu": "Menu",
- "avatar": "Avatar",
- "open-user-menu": "Apri menu utente"
- },
- "import": {
- "no-file": "Nessun file selezionato",
- "drop-file": "Trascina un file JSON o fai clic per selezionare un file da caricare."
- },
- "item": {
- "selected": "Selezionata"
- },
- "js-func": {
- "no-return-error": "La funzione deve restituire un valore!",
- "return-type-mismatch": "La funzione deve restituire un valore di tipo '{{type}}'!",
- "tidy": "Tidy"
- },
- "key-val": {
- "key": "Chiave",
- "value": "Valore",
- "remove-entry": "Rimuovi voce",
- "add-entry": "Aggiungi voce",
- "no-data": "Nessuna voce"
- },
- "layout": {
- "layout": "Layout",
- "manage": "Gestisci layout",
- "settings": "Impostazioni layout",
- "color": "Colore",
- "main": "Main",
- "right": "Destra",
- "select": "Select target layout"
- },
- "legend": {
- "direction": "Direzione",
- "position": "Posizione Legenda",
- "show-max": "Mostra valore max",
- "show-min": "Mostra valore min",
- "show-avg": "Mostra valore medio",
- "show-total": "Mostra valore totale",
- "settings": "Impostazioni legenda",
- "min": "min",
- "max": "max",
- "avg": "avg",
- "total": "totale"
- },
- "login": {
- "login": "Accedi",
- "request-password-reset": "Richiesta reset password",
- "reset-password": "Reset Password",
- "create-password": "Crea Password",
- "passwords-mismatch-error": "Le password inserite devono corrispondere!",
- "password-again": "Ripeti Password",
- "sign-in": "Please sign in",
- "username": "Nome utente (email)",
- "remember-me": "Ricordami",
- "forgot-password": "Password dimenticata?",
- "password-reset": "Password reset",
- "new-password": "Nuova password",
- "new-password-again": "Ripeti nuova password",
- "password-link-sent-message": "Link reset password inviato con successo!",
- "email": "Email",
- "login-with": "Accedi con {{name}}",
- "or": "o"
- },
- "position": {
- "top": "Alto",
- "bottom": "Basso",
- "left": "Sinistra",
- "right": "Destra"
- },
- "profile": {
- "profile": "Profilo",
- "last-login-time": "Ultimo accesso",
- "change-password": "Modifica Password",
- "current-password": "Password attuale"
- },
- "relation": {
- "relations": "Relazioni",
- "direction": "Direzione",
- "search-direction": {
- "FROM": "Da",
- "TO": "A"
- },
- "direction-type": {
- "FROM": "da",
- "TO": "a"
- },
- "from-relations": "Relazioni in uscita",
- "to-relations": "Relazioni in ingresso",
- "selected-relations": "{ count, plural, 1 {1 relazione selezionata} other {# relazioni selezionate} }",
- "type": "Tipo",
- "to-entity-type": "A tipo entità",
- "to-entity-name": "A nome entità",
- "from-entity-type": "Da tipo entità",
- "from-entity-name": "Da nome entità",
- "to-entity": "A entità",
- "from-entity": "Da entità",
- "delete": "Elimina relazione",
- "relation-type": "Tipo di relazione",
- "relation-type-required": "Tipo di relazione obbligatorio.",
- "any-relation-type": "Ogni tipo",
- "add": "Aggiungi relazione",
- "edit": "Modifica relazione",
- "delete-to-relation-title": "Sei sicuro di voler eliminare la relazione con l'entità '{{entityName}}'?",
- "delete-to-relation-text": "Attenzione, dopo la conferma l'entità '{{entityName}}' sarà scollegata dall'entità corrente.",
- "delete-to-relations-title": "Sei sicuro di voler eliminare { count, plural, 1 {1 relazione} other {# relazioni} }?",
- "delete-to-relations-text": "Attenzione, dopo la conferma tutte le relazioni selezionate saranno rimosse e le corrispondenti entità scollegate da quella corrente.",
- "delete-from-relation-title": "Sei sicuro di voler eliminare la relazione dall'entità '{{entityName}}'?",
- "delete-from-relation-text": "Attenzione, dopo la conferma l'entità corrente sarà scollegata dall'entità '{{entityName}}'.",
- "delete-from-relations-title": "Sei sicuro di voler eliminare { count, plural, 1 {1 relazione} other {# relazioni} }?",
- "delete-from-relations-text": "Attenzione, dopo la conferma tutte le relazioni selezionate saranno rimosse e l'entità corrente scollegata dalle corrispondenti entità.",
- "remove-relation-filter": "Rimuovi filtro relazioni",
- "add-relation-filter": "Aggiungi filtro relazioni",
- "any-relation": "Qualsiasi relazione",
- "relation-filters": "Filtri relazioni",
- "additional-info": "Informazioni aggiuntive (JSON)",
- "invalid-additional-info": "Impossibile analizzare le informazioni aggiuntive in JSON."
- },
- "rulechain": {
- "rulechain": "Rule chain",
- "rulechains": "Rule chain",
- "root": "Root",
- "delete": "Cancella rule chain",
- "name": "Nome",
- "name-required": "Nome obbligatorio.",
- "description": "Descrizione",
- "add": "Aggiungi Rule Chain",
- "set-root": "Imposta la rule chain come root",
- "set-root-rulechain-title": "Sei sicuro di voler impostare la rule chain '{{ruleChainName}}' come root?",
- "set-root-rulechain-text": "Dopo la conferma la rule chain diverrà root a gestirà tutti i messaggi in arrivo.",
- "delete-rulechain-title": "Sei sicuro di voler eliminare la rule chain '{{ruleChainName}}'?",
- "delete-rulechain-text": "Attenzione, dopo la conferma la rule chain e tutti i dati relativi non saranno più recuperabili.",
- "delete-rulechains-title": "Sei sicuro di voler eliminare { count, plural, 1 {1 rule chain} other {# rule chain} }?",
- "delete-rulechains-action-title": "Elimina { count, plural, 1 {1 rule chain} other {# rule chain} }",
- "delete-rulechains-text": "Attenzione, dopo la conferma tutte le rule chain selezionate saranno rimosse e tutti i relativi dati non saranno più recuperabili.",
- "add-rulechain-text": "Aggiungi nuova rule chain",
- "no-rulechains-text": "Nessuna rule chain trovata",
- "rulechain-details": "Dettagli rule chain",
- "details": "Dettagli",
- "events": "Eventi",
- "system": "Sistema",
- "import": "Importa rule chain",
- "export": "Esporta rule chain",
- "export-failed-error": "Impossibile esportare rule chain: {{error}}",
- "create-new-rulechain": "Crea nuova rule chain",
- "rulechain-file": "File rule chain",
- "invalid-rulechain-file-error": "Impossibile importare rule chain: struttura dati rule chain non valida.",
- "copyId": "Copia Id rule chain",
- "idCopiedMessage": "Id rule chain copiato negli appunti",
- "select-rulechain": "Seleziona rule chain",
- "no-rulechains-matching": "Nessuna rule chain corrispondente a '{{entity}}' è stata trovata.",
- "rulechain-required": "Rule chain obbligatoria",
- "management": "Gestione regole",
- "debug-mode": "Modalità debug"
- },
- "rulenode": {
- "details": "Dettagli",
- "events": "Eventi",
- "search": "Ricerca nodi",
- "open-node-library": "Apri libreria nodi",
- "add": "Aggiungi nodo regola",
- "name": "Nome",
- "name-required": "Nome obbligatorio.",
- "type": "Tipo",
- "description": "Descrizione",
- "delete": "Elimina nodo regola",
- "select-all-objects": "Seleziona tutti i nodi e le connessioni",
- "deselect-all-objects": "Deseleziona tutti i nodi e le connessioni",
- "delete-selected-objects": "Cancella nodi e connessioni selezionate",
- "delete-selected": "Elimina selezionati",
- "select-all": "Seleziona tutto",
- "copy-selected": "Copia selezionata",
- "deselect-all": "Deseleziona tutto",
- "rulenode-details": "Dettagli nodo regola",
- "debug-mode": "Modalità debug",
- "configuration": "Configurazione",
- "link": "Link",
- "link-details": "Dettagli link nodo regola",
- "add-link": "Aggiungi link",
- "link-label": "Etichetta link",
- "link-label-required": "Etichetta link obbligatoria.",
- "custom-link-label": "Etichetta link personalizzata",
- "custom-link-label-required": "Etichetta link personalizzata obbligatoria.",
- "link-labels": "Etichette link",
- "link-labels-required": "Etichette link richieste.",
- "no-link-labels-found": "Nessuna etichetta link trovata.",
- "no-link-label-matching": "'{{label}}' non trovata.",
- "create-new-link-label": "Creane una nuova!",
- "type-filter": "Filtro",
- "type-filter-details": "Filtra i messaggi in arrivo con le condizioni configurate",
- "type-enrichment": "Enrichment",
- "type-enrichment-details": "Aggiungi informazioni addizionali nei metadati del messaggio",
- "type-transformation": "Transformation",
- "type-transformation-details": "Change Message payload and Metadata",
- "type-action": "Azioni",
- "type-action-details": "Perform special action",
- "type-external": "External",
- "type-external-details": "Interacts with external system",
- "type-rule-chain": "Rule Chain",
- "type-rule-chain-details": "Forwards incoming messages to specified Rule Chain",
- "type-input": "Input",
- "type-input-details": "Logical input of Rule Chain, forwards incoming messages to next related Rule Node",
- "type-unknown": "Sconosciuto",
- "type-unknown-details": "Nodo regola non trovato",
- "directive-is-not-loaded": "Defined configuration directive '{{directiveName}}' is not available.",
- "ui-resources-load-error": "Failed to load configuration ui resources.",
- "invalid-target-rulechain": "Unable to resolve target rule chain!",
- "test-script-function": "Test script function",
- "message": "Messaggio",
- "message-type": "Tipo messaggio",
- "select-message-type": "Seleziona tipo messaggio",
- "message-type-required": "Tipo messaggio obbligatorio",
- "metadata": "Metadata",
- "metadata-required": "Metadata entries can't be empty.",
- "output": "Output",
- "test": "Test",
- "help": "Aiuto"
- },
- "tenant": {
- "tenant": "Tenant",
- "tenants": "Tenant",
- "management": "Gestione Tenant",
- "add": "Aggiungi Tenant",
- "admins": "Amministratori",
- "manage-tenant-admins": "Gestisci amministratori tenant",
- "delete": "Cancella tenant",
- "add-tenant-text": "Aggiungi nuovo tenant",
- "no-tenants-text": "Nessun tenant trovato",
- "tenant-details": "Dettagli tenant",
- "delete-tenant-title": "Sei sicuro di voler eliminare il tenant '{{tenantTitle}}'?",
- "delete-tenant-text": "Attenzione, dopo la conferma il tenant e tutti i suoi dati non saranno più recuperabili.",
- "delete-tenants-title": "Sei sicuro di voler eliminare { count, plural, 1 {1 tenant} other {# tenant} }?",
- "delete-tenants-action-title": "Elimina { count, plural, 1 {1 tenant} other {# tenant} }",
- "delete-tenants-text": "Attenzione, dopo la conferma tutti i tenant selezionati saranno eliminati e tutti i loro dati non saranno più recuperabili.",
- "title": "Titolo",
- "title-required": "Titolo obbligatorio.",
- "description": "Descrizione",
- "details": "Dettagli",
- "events": "Eventi",
- "copyId": "Copia Id tenant",
- "idCopiedMessage": "Id tenant copiato negli appunti",
- "select-tenant": "Seleziona tenant",
- "no-tenants-matching": "Nessun tenant corrispondente a '{{entity}}' è stato trovato.",
- "tenant-required": "Tenant obbligatorio"
- },
- "timeinterval": {
- "seconds-interval": "{ seconds, plural, 1 {1 secondo} other {# secondi} }",
- "minutes-interval": "{ minutes, plural, 1 {1 minuto} other {# minuti} }",
- "hours-interval": "{ hours, plural, 1 {1 ora} other {# ore} }",
- "days-interval": "{ days, plural, 1 {1 giorno} other {# giorni} }",
- "days": "Giorni",
- "hours": "Ore",
- "minutes": "Minuti",
- "seconds": "Secondi",
- "advanced": "Avanzate"
- },
- "timewindow": {
- "days": "{ days, plural, 1 { giorno } other {# giorni } }",
- "hours": "{ hours, plural, 0 { ora } 1 {1 ora } other {# ore } }",
- "minutes": "{ minutes, plural, 0 { minuto } 1 {1 minuto } other {# minuti } }",
- "seconds": "{ seconds, plural, 0 { secondo } 1 {1 secondo } other {# secondi } }",
- "realtime": "Realtime",
- "history": "Cronologia",
- "last-prefix": "ultimo",
- "period": "da {{ startTime }} a {{ endTime }}",
- "edit": "Modifica intervallo temporale",
- "date-range": "Intervallo date",
- "last": "Ultimo",
- "time-period": "Intervallo temporale",
- "hide": "Nascondi"
- },
- "user": {
- "user": "Utente",
- "users": "Utenti",
- "customer-users": "Utente cliente",
- "tenant-admins": "Amministratori Tenant",
- "sys-admin": "Amministratore di sistema",
- "tenant-admin": "Amministratore tenant",
- "customer": "Cliente",
- "anonymous": "Anonimo",
- "add": "Aggiungi Utente",
- "delete": "Elimina utente",
- "add-user-text": "Aggiungi nuovo utente",
- "no-users-text": "Nessun utente trovato",
- "user-details": "Dettagli utente",
- "delete-user-title": "Sei sicuro di voler eliminare l'utente '{{userEmail}}'?",
- "delete-user-text": "Attenzione, dopo la conferma l'utente e tutti i suoi dati non saranno più recuperabili.",
- "delete-users-title": "Sei sicuro di voler eliminare { count, plural, 1 {1 utente} other {# utenti} }?",
- "delete-users-action-title": "Elimina { count, plural, 1 {1 utente} other {# utenti} }",
- "delete-users-text": "Attenzione, dopo la conferma tutti gli utenti selezionati saranno eliminati e tutti i relativi dati non saranno più recuperabili.",
- "activation-email-sent-message": "Email di attivazione inviata con successo!",
- "resend-activation": "Invia di nuovo attivazione",
- "email": "Email",
- "email-required": "Email obbligatoria.",
- "invalid-email-format": "Formato email non valido.",
- "first-name": "Nome",
- "last-name": "Cognome",
- "description": "Descrizione",
- "default-dashboard": "Dashboard di default",
- "always-fullscreen": "Sempre a schermo intero",
- "select-user": "Seleziona utente",
- "no-users-matching": "Nessun utente corrispondente a '{{entity}}' è stato trovato.",
- "user-required": "Utente obbligatorio",
- "activation-method": "Metodo di attivazione",
- "display-activation-link": "Mostra link di attivazione",
- "send-activation-mail": "Invia email di attivazione",
- "activation-link": "Link attivazione utente",
- "activation-link-text": "Per attivare l'utente utilizza il seguente link di attivazione :",
- "copy-activation-link": "Copia link di attivazione",
- "activation-link-copied-message": "Link di attivazione utente copiato negli appunti",
- "details": "Dettagli",
- "login-as-tenant-admin": "Accedi come Amministratore tenant",
- "login-as-customer-user": "Accedi come Utente cliente",
- "disable-account": "Disabilita account utente",
- "enable-account": "Abilita account utente",
- "enable-account-message": "L'account utente è stato abilitato correttamente!",
- "disable-account-message": "L'account utente è stato disabilitato correttamente!"
- },
- "value": {
- "type": "Tipo valore",
- "string": "String",
- "string-value": "Valore string",
- "integer": "Integer",
- "integer-value": "Valore integer",
- "invalid-integer-value": "Valore integer non valido",
- "double": "Double",
- "double-value": "Valore double",
- "boolean": "Boolean",
- "boolean-value": "Valore boolean",
- "false": "Falso",
- "true": "Vero",
- "long": "Long"
- },
- "widget": {
- "widget-library": "Libreria Widget",
- "widget-bundle": "Bundle widget",
- "select-widgets-bundle": "Seleziona bundle widget",
- "management": "Gestione widget",
- "editor": "Editor Widget",
- "widget-type-not-found": "Problem loading widget configuration.
Probably associated\n widget type was removed.",
- "widget-type-load-error": "Widget non caricato a causa dei seguenti errori:",
- "remove": "Elimina widget",
- "edit": "Modifica widget",
- "remove-widget-title": "sei sicuro di voler eliminare il widget '{{widgetTitle}}'?",
- "remove-widget-text": "Dopo la conferma il widget e tutti i suoi dati non saranno più recuperabili.",
- "timeseries": "Time series",
- "search-data": "Cerca dati",
- "no-data-found": "Nessun dato trovato",
- "latest-values": "Ultimi valori",
- "rpc": "Control widget",
- "alarm": "Alarm widget",
- "static": "Static widget",
- "select-widget-type": "Seleziona tipo widget",
- "missing-widget-title-error": "Il tiolo del widget deve essere specificato!",
- "widget-saved": "Widget salvato",
- "unable-to-save-widget-error": "Impossibile salvare il widget! Sono presenti degli errori!",
- "save": "Salva widget",
- "saveAs": "Salva widget come",
- "save-widget-type-as": "Salva tipo widget come",
- "save-widget-type-as-text": "Please enter new widget title and/or select target widgets bundle",
- "toggle-fullscreen": "Commuta modalità schermo intero",
- "run": "Esegui widget",
- "title": "Titolo widget",
- "title-required": "Titolo widget obbligatorio.",
- "type": "Tipo widget",
- "resources": "Risorse",
- "resource-url": "JavaScript/CSS URL",
- "remove-resource": "Rimuovi risorsa",
- "add-resource": "Aggiungi risorsa",
- "html": "HTML",
- "tidy": "Tidy",
- "css": "CSS",
- "settings-schema": "Impostazioni schema",
- "datakey-settings-schema": "Impostazioni Data key schema",
- "javascript": "Javascript",
- "remove-widget-type-title": "Sei sicuro di voler rimuovere il tipo di widget '{{widgetName}}'?",
- "remove-widget-type-text": "Dopo la conferma il tipo di widget e tutti i suoi dati non saranno più recuperabili.",
- "remove-widget-type": "Rimuovi tipo widget",
- "add-widget-type": "Aggiungi nuovo tipo widget",
- "widget-type-load-failed-error": "Caricamento tipo widget fallito!",
- "widget-template-load-failed-error": "Caricamento template widget fallito!",
- "add": "Aggiungi Widget",
- "undo": "Annulla modifiche widget",
- "export": "Esporta widget"
- },
- "widget-action": {
- "header-button": "Widget header button",
- "open-dashboard-state": "Navigate to new dashboard state",
- "update-dashboard-state": "Update current dashboard state",
- "open-dashboard": "Navigate to other dashboard",
- "custom": "Custom action",
- "target-dashboard-state": "Target dashboard state",
- "target-dashboard-state-required": "Target dashboard state is required",
- "set-entity-from-widget": "Set entity from widget",
- "target-dashboard": "Target dashboard",
- "open-right-layout": "Open right dashboard layout (mobile view)"
- },
- "widgets-bundle": {
- "current": "Bundle corrente",
- "widgets-bundles": "Bundle Widget",
- "add": "Aggiungi Bundle Widget",
- "delete": "Cancella bundle widget",
- "title": "Titolo",
- "title-required": "Titolo obbligatorio.",
- "add-widgets-bundle-text": "Aggiungi nuovo bundle widget",
- "no-widgets-bundles-text": "Nessun bundle widget trovato",
- "empty": "Bundle widget vuoto",
- "details": "Dettagli",
- "widgets-bundle-details": "Dettagli bundle widget",
- "delete-widgets-bundle-title": "Sei sicuro di voler eliminare il bundle widget '{{widgetsBundleTitle}}'?",
- "delete-widgets-bundle-text": "Attenzione, dopo la conferma il bundle widget e tutti i suoi dati non saranno più recuperabili.",
- "delete-widgets-bundles-title": "Sei sicuro di voler eliminare { count, plural, 1 {1 bundle widget} other {# bundle widget} }?",
- "delete-widgets-bundles-action-title": "Elimina { count, plural, 1 {1 bundle widget} other {# bundle widget} }",
- "delete-widgets-bundles-text": "Attenzione, dopo la conferma tutti i bundle widget selezionati saranno rimossi e tutti i loro dati non saranno più recuperabili.",
- "no-widgets-bundles-matching": "Nessun bundle widget corrispondente a '{{widgetsBundle}}' è stato trovato.",
- "widgets-bundle-required": "Bundle widget obbligatorio.",
- "system": "Sistema",
- "import": "Importa bundle widget",
- "export": "Esporta bundle widget",
- "export-failed-error": "Impossibile esportare bundle widget: {{error}}",
- "create-new-widgets-bundle": "Crea nuovo bundle widget",
- "widgets-bundle-file": "File bundle widget",
- "invalid-widgets-bundle-file-error": "Impossibile importare bundle widget: struttura dati non valida."
- },
- "widget-config": {
- "data": "Dati",
- "settings": "Impostazioni",
- "advanced": "Avanzate",
- "title": "Titolo",
- "title-tooltip": "Tooltip titolo",
- "general-settings": "Impostazioni generali",
- "display-title": "Mostra titolo",
- "drop-shadow": "Drop shadow",
- "enable-fullscreen": "Abilita schermo intero",
- "background-color": "Colore sfondo",
- "text-color": "Colore testo",
- "padding": "Padding",
- "margin": "Margin",
- "widget-style": "Stile Widget",
- "title-style": "Stile titolo",
- "mobile-mode-settings": "Impostazioni modalità mobile",
- "order": "Ordinamento",
- "height": "Altezza",
- "units": "Simbolo speciale da mostrare accanto al valore",
- "decimals": "Numero di cifre decimali",
- "timewindow": "Intervallo temporale",
- "use-dashboard-timewindow": "Usa intervallo temporale dashboard",
- "display-timewindow": "Mostra intervallo temporale",
- "display-legend": "Mostra legenda",
- "datasources": "Sorgenti dei dati",
- "maximum-datasources": "Massimo { count, plural, 1 {1 sorgente dati consentita.} other {# sorgenti dati consentite} }",
- "datasource-type": "Tipo",
- "datasource-parameters": "Parametri",
- "remove-datasource": "Rimuovi sorgente dati",
- "add-datasource": "Aggiungi sorgente dati",
- "target-device": "Dispositivo Target",
- "alarm-source": "Sorgente Allarme",
- "actions": "Azioni",
- "action": "Azione",
- "add-action": "Aggiungi azione",
- "search-actions": "Ricerca azioni",
- "action-source": "Sorgente azione",
- "action-source-required": "Sorgente azione obbligatoria.",
- "action-name": "Nome",
- "action-name-required": "Nome azione obbligatorio.",
- "action-name-not-unique": "Un'altra azione con lo stesso nome è già presente.
Il nome di una azione dovrebbe essere univoco all'interno della stessa sorgente.",
- "action-icon": "Icona",
- "action-type": "Tipo",
- "action-type-required": "Tipo azione obbligatorio.",
- "edit-action": "Modifica azione",
- "delete-action": "Cancella azione",
- "delete-action-title": "Cancella azione del widget",
- "delete-action-text": "Sei sicuro di voler cancellare l'azione del widget '{{actionName}}'?",
- "display-icon": "Mostra icona titolo",
- "icon-color": "Colore dell'icona",
- "icon-size": "Dimensione dell'icona"
- },
- "widget-type": {
- "import": "Importa un tipo di widget",
- "export": "Esporta un tipo di widget",
- "export-failed-error": "Impossibile esportare il tipo di widget: {{error}}",
- "create-new-widget-type": "Crea un nuovo tipo di widget",
- "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"
- }
- },
- "input-widgets": {
- "attribute-not-allowed": "Questo widget non può usare un parametro di tipo attributo",
- "date": "Data",
- "discard-changes": "Annulla modifiche",
- "entity-attribute-required": "E' richiesta un'entità di tipo attributo",
- "entity-timeseries-required": "E' richiesta un'entità di tipo serie temporale",
- "not-allowed-entity": "L'entità selezionata non può avere attributi condivisi",
- "no-attribute-selected": "Nessun attributo selezionato",
- "no-datakey-selected": "Nessuna datakey selezionata",
- "no-entity-selected": "Nessuna entità selezionata",
- "no-image": "Nessuna immagine",
- "no-support-web-camera": "Web camera non supportata",
- "no-timeseries-selected": "Nessuna serie temporale selezionata",
- "switch-attribute-value": "Cambia il valore dell'attributo",
- "switch-camera": "Cambia camera",
- "switch-timeseries-value": "Cambia il valore della serie temporale",
- "take-photo": "Fai una foto",
- "time": "Tempo",
- "timeseries-not-allowed": "Questo widget non può usare un parametro di tipo serie temporale",
- "update-failed": "Aggiornamento fallito",
- "update-successful": "Aggiornamento eseguito con successo",
- "update-attribute": "Aggiorna attributo",
- "update-timeseries": "Aggiorna serie temporale",
- "value": "Valore"
- }
- },
- "icon": {
- "icon": "Icona",
- "select-icon": "Seleziona icona",
- "material-icons": "Icone Material",
- "show-all": "Mostra tutte le icone"
- },
- "custom": {
- "widget-action": {
- "action-cell-button": "Pulsante azione cella",
- "row-click": "Click sulla riga",
- "polygon-click": "Click sul poligono",
- "marker-click": "Click sul marker",
- "tooltip-tag-action": "Azione tooltip",
- "node-selected": "Click su nodo selezionato",
- "element-click": "Click su elemento HTML",
- "pie-slice-click": "Click sulla fetta",
- "row-double-click": "Doppio click sulla riga"
- }
- },
- "language": {
- "language": "Lingua"
- }
-}
diff --git a/ui/src/app/locale/locale.constant-ja_JA.json b/ui/src/app/locale/locale.constant-ja_JA.json
deleted file mode 100644
index ec372ce513..0000000000
--- a/ui/src/app/locale/locale.constant-ja_JA.json
+++ /dev/null
@@ -1,1516 +0,0 @@
-{
- "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}}"
- },
- "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": "タイムアウト(ミリ秒)",
- "timeout-required": "タイムアウトが必要です。",
- "timeout-invalid": "それは有効なタイムアウトのようには見えません。",
- "enable-tls": "TLSを有効にする",
- "tls-version": "TLSバージョン",
- "send-test-mail": "テストメールを送信する"
- },
- "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": "Active Acknowledged",
- "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 alarm} other {# alarms} }選択された",
- "no-data": "表示するデータがありません",
- "polling-interval": "アラームポーリング間隔(秒)",
- "polling-interval-required": "アラームのポーリング間隔が必要です。",
- "min-polling-interval-message": "少なくとも1秒間のポーリング間隔が許可されます。",
- "aknowledge-alarms-title": "{ count, plural, 1 {1 alarm} other {# alarms} }",
- "aknowledge-alarms-text": "{ count, plural, 1 {1 alarm} other {# alarms} }?",
- "clear-alarms-title": "{ count, plural, 1 {1 alarm} other {# alarms} }",
- "clear-alarms-text": "{ count, plural, 1 {1 alarm} other {# alarms} }?"
- },
- "alias": {
- "add": "エイリアスを追加する",
- "edit": "エイリアスを編集する",
- "name": "エイリアス名",
- "name-required": "エイリアス名は必須です",
- "duplicate-alias": "同じ名前のエイリアスは既に存在します。",
- "filter-type-single-entity": "単一のエンティティ",
- "filter-type-entity-list": "エンティティリスト",
- "filter-type-entity-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-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}}",
- "entity-filter": "エンティティフィルタ",
- "resolve-multiple": "複数のエンティティとして解決する",
- "filter-type": "フィルタタイプ",
- "filter-type-required": "フィルタタイプが必要です。",
- "entity-filter-no-entity-matched": "指定されたフィルタに一致するエンティティは見つかりませんでした。",
- "no-entity-filter-specified": "エンティティフィルタが指定されていない",
- "root-state-entity": "ルートとしてダッシュボードの状態エンティティを使用する",
- "root-entity": "ルートエンティティ",
- "state-entity-parameter-name": "状態エンティティのパラメータ名",
- "default-state-entity": "デフォルト状態エンティティ",
- "default-entity-parameter-name": "デフォルトでは",
- "max-relation-level": "最大関連レベル",
- "unlimited-level": "無制限レベル",
- "state-entity": "ダッシュボードの状態エンティティ",
- "all-entities": "すべてのエンティティ",
- "any-relation": "どれか"
- },
- "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 asset} other {# assets} }顧客に",
- "delete-assets": "アセットを削除する",
- "unassign-assets": "アセットの割り当てを解除する",
- "unassign-assets-action-title": "{ count, plural, 1 {1 asset} other {# assets} }顧客から",
- "assign-new-asset": "新しいアセットを割り当てる",
- "delete-asset-title": "'{{assetName}}'?",
- "delete-asset-text": "確認後、資産と関連するすべてのデータが回復不能になることに注意してください。",
- "delete-assets-title": "{ count, plural, 1 {1 asset} other {# assets} }?",
- "delete-assets-action-title": "{ count, plural, 1 {1 asset} other {# assets} }",
- "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 asset} other {# assets} }?",
- "unassign-assets-text": "確認後、選択されたすべての資産が割り当て解除され、顧客がアクセスできなくなります。",
- "copyId": "アセットIDをコピーする",
- "idCopiedMessage": "アセットIDがクリップボードにコピーされました",
- "select-asset": "アセットを選択",
- "no-assets-matching": "'{{entity}}'発見されました。",
- "asset-required": "資産が必要です",
- "name-starts-with": "アセット名はで始まります",
- "label": "ラベル"
- },
- "attribute": {
- "attributes": "属性",
- "latest-telemetry": "最新テレメトリ",
- "attributes-scope": "エンティティ属性のスコープ",
- "scope-latest-telemetry": "最新テレメトリ",
- "scope-client": "クライアントの属性",
- "scope-server": "サーバーの属性",
- "scope-shared": "共有属性",
- "add": "属性を追加する",
- "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-telemetry": "{ count, plural, 1 {1 telemetry unit} other {# telemetry units} }選択された"
- },
- "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-relation-add-or-update": "関係が更新されました",
- "type-relation-delete": "関係が削除されました",
- "type-relations-delete": "すべてのリレーションを削除",
- "type-alarm-ack": "承認された",
- "type-alarm-clear": "クリアされた",
- "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": "Eメール",
- "no-address": "住所がありません"
- },
- "common": {
- "username": "ユーザー名",
- "password": "パスワード",
- "enter-username": "ユーザーネームを入力してください",
- "enter-password": "パスワードを入力する",
- "enter-search": "検索を入力"
- },
- "content-type": {
- "json": "Json",
- "text": "テキスト",
- "binary": "バイナリ(Base64)"
- },
- "customer": {
- "customer": "顧客",
- "customers": "顧客",
- "management": "顧客管理",
- "dashboard": "カスタマーダッシュボード",
- "dashboards": "カスタマーダッシュボード",
- "devices": "顧客デバイス",
- "assets": "顧客資産",
- "public-dashboards": "パブリックダッシュボード",
- "public-devices": "パブリックデバイス",
- "public-assets": "公的資産",
- "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 customer} other {# customers} }?",
- "delete-customers-action-title": "{ count, plural, 1 {1 customer} other {# customers} }",
- "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": "顧客は必須です",
- "select-default-customer": "デフォルトの顧客を選択",
- "default-customer": "デフォルトの顧客",
- "default-customer-required": "テナントレベルのダッシュボードをデバッグするには、デフォルトの顧客が必要です"
- },
- "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 dashboard} other {# dashboards} }顧客に",
- "unassign-dashboards-action-text": "{ count, plural, 1 {1 dashboard} other {# dashboards} }顧客から",
- "delete-dashboards": "ダッシュボードの削除",
- "unassign-dashboards": "ダッシュボードの割り当てを解除する",
- "unassign-dashboards-action-title": "{ count, plural, 1 {1 dashboard} other {# dashboards} }顧客から",
- "delete-dashboard-title": "'{{dashboardTitle}}'?",
- "delete-dashboard-text": "確認後、ダッシュボードとすべての関連データが回復不能になるので注意してください。",
- "delete-dashboards-title": "{ count, plural, 1 {1 dashboard} other {# dashboards} }?",
- "delete-dashboards-action-title": "{ count, plural, 1 {1 dashboard} other {# dashboards} }",
- "delete-dashboards-text": "注意してください。確認後、選択したダッシュボードはすべて削除され、関連するすべてのデータは回復不能になります。",
- "unassign-dashboard-title": "'{{dashboardTitle}}'?",
- "unassign-dashboard-text": "確認後、ダッシュボードは割り当てられなくなり、顧客はアクセスできなくなります。",
- "unassign-dashboard": "ダッシュボードの割り当てを解除する",
- "unassign-dashboards-title": "{ count, plural, 1 {1 dashboard} other {# dashboards} }?",
- "unassign-dashboards-text": "確認の後、選択したすべてのダッシュボードは割り当てられなくなり、顧客はアクセスできなくなります。",
- "public-dashboard-title": "ダッシュボードは公開されました",
- "public-dashboard-text": "{{dashboardTitle}} is now public and accessible via next public link:",
- "public-dashboard-notice": "注: b>データにアクセスするために、関連するデバイスを公開することを忘れないでください。",
- "make-private-dashboard-title": "'{{dashboardTitle}}'プライベート?",
- "make-private-dashboard-text": "確認の後、ダッシュボードはプライベートにされ、他の人がアクセスすることはできません。",
- "make-private-dashboard": "ダッシュボードを非公開にする",
- "socialshare-text": "'{{dashboardTitle}}'ThingsBoardを搭載",
- "socialshare-title": "'{{dashboardTitle}}'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}}",
- "create-new-dashboard": "新しいダッシュボードを作成する",
- "dashboard-file": "ダッシュボードファイル",
- "invalid-dashboard-file-error": "ダッシュボードをインポートできません:ダッシュボードのデータ構造が無効です。",
- "dashboard-import-missing-aliases-title": "インポートされたダッシュボードで使用されるエイリアスを設定する",
- "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": "エンティティのtimeseries /属性は必須です。",
- "maximum-timeseries-or-attributes": "{ count, plural, 1 {1 timeseries/attribute is allowed.} other {# timeseries/attributes are allowed} }",
- "alarm-fields-required": "アラームフィールドが必要です。",
- "function-types": "関数型",
- "function-types-required": "関数型が必要です。",
- "maximum-function-types": "{ count, plural, 1 {1 function type is allowed.} other {# function types are allowed} }"
- },
- "datasource": {
- "type": "データソースタイプ",
- "name": "名",
- "add-datasource-prompt": "データソースを追加してください"
- },
- "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 device} other {# devices} }顧客に",
- "delete-devices": "デバイスを削除する",
- "unassign-from-customer": "顧客からの割り当て解除",
- "unassign-devices": "デバイスの割り当てを解除する",
- "unassign-devices-action-title": "{ count, plural, 1 {1 device} other {# devices} }顧客から",
- "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 device} other {# devices} }?",
- "delete-devices-action-title": "{ count, plural, 1 {1 device} other {# devices} }",
- "delete-devices-text": "注意してください。確認後、選択したすべてのデバイスが削除され、関連するすべてのデータは回復不能になります。",
- "unassign-device-title": "'{{deviceName}}'?",
- "unassign-device-text": "確認の後、デバイスは割り当てが解除され、顧客がアクセスできなくなります。",
- "unassign-device": "デバイスの割り当てを解除する",
- "unassign-devices-title": "{ count, plural, 1 {1 device} other {# devices} }?",
- "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": "デバイスの選択"
- },
- "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}}'{{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-key-matching": "'{{key}}'見つかりません。",
- "create-new-key": "新しいものを作成してください!",
- "type": "タイプ",
- "type-required": "エンティティタイプが必要です。",
- "type-device": "デバイス",
- "type-devices": "デバイス",
- "list-of-devices": "{ count, plural, 1 {One device} other {List of # devices} }",
- "device-name-starts-with": "'{{prefix}}'",
- "type-asset": "資産",
- "type-assets": "資産",
- "list-of-assets": "{ count, plural, 1 {One asset} other {List of # assets} }",
- "asset-name-starts-with": "'{{prefix}}'",
- "type-rule": "ルール",
- "type-rules": "ルール",
- "list-of-rules": "{ count, plural, 1 {One rule} other {List of # rules} }",
- "rule-name-starts-with": "'{{prefix}}'",
- "type-plugin": "プラグイン",
- "type-plugins": "プラグイン",
- "list-of-plugins": "{ count, plural, 1 {One plugin} other {List of # plugins} }",
- "plugin-name-starts-with": "'{{prefix}}'",
- "type-tenant": "テナント",
- "type-tenants": "テナント",
- "list-of-tenants": "{ count, plural, 1 {One tenant} other {List of # tenants} }",
- "tenant-name-starts-with": "'{{prefix}}'",
- "type-customer": "顧客",
- "type-customers": "顧客",
- "list-of-customers": "{ count, plural, 1 {One customer} other {List of # customers} }",
- "customer-name-starts-with": "'{{prefix}}'",
- "type-user": "ユーザー",
- "type-users": "ユーザー",
- "list-of-users": "{ count, plural, 1 {One user} other {List of # users} }",
- "user-name-starts-with": "'{{prefix}}'",
- "type-dashboard": "ダッシュボード",
- "type-dashboards": "ダッシュボード",
- "list-of-dashboards": "{ count, plural, 1 {One dashboard} other {List of # dashboards} }",
- "dashboard-name-starts-with": "'{{prefix}}'",
- "type-alarm": "警報",
- "type-alarms": "アラーム",
- "list-of-alarms": "{ count, plural, 1 {One alarms} other {List of # alarms} }",
- "alarm-name-starts-with": "'{{prefix}}'",
- "type-rulechain": "ルールチェーン",
- "type-rulechains": "ルールチェーン",
- "list-of-rulechains": "{ count, plural, 1 {One rule chain} other {List of # rule chains} }",
- "rulechain-name-starts-with": "'{{prefix}}'",
- "type-rulenode": "ルールノード",
- "type-rulenodes": "ルールノード",
- "list-of-rulenodes": "{ count, plural, 1 {One rule node} other {List of # rule nodes} }",
- "rulenode-name-starts-with": "'{{prefix}}'",
- "type-current-customer": "現在の顧客",
- "search": "検索エンティティ",
- "selected-entities": "{ count, plural, 1 {1 entity} other {# entities} }選択された",
- "entity-name": "エンティティ名",
- "details": "エンティティの詳細",
- "no-entities-prompt": "エンティティが見つかりません",
- "no-data": "表示するデータがありません"
- },
- "event": {
- "event-type": "イベントタイプ",
- "type-error": "エラー",
- "type-lc-event": "ライフサイクルイベント",
- "type-stats": "統計",
- "type-debug-rule-node": "デバッグ",
- "type-debug-rule-chain": "デバッグ",
- "no-events-prompt": "イベントは見つかりませんでした",
- "error": "エラー",
- "alarm": "警報",
- "event-time": "イベント時間",
- "server": "サーバ",
- "body": "体",
- "method": "方法",
- "type": "タイプ",
- "entity": "エンティティ",
- "message-id": "メッセージID",
- "message-type": "メッセージタイプ",
- "data-type": "データ・タイプ",
- "relation-type": "関係タイプ",
- "metadata": "メタデータ",
- "data": "データ",
- "event": "イベント",
- "status": "状態",
- "success": "成功",
- "failed": "失敗",
- "messages-processed": "処理されたメッセージ",
- "errors-occurred": "エラーが発生しました"
- },
- "extension": {
- "extensions": "拡張機能",
- "selected-extensions": "{ count, plural, 1 {1 extension} other {# extensions} }選択された",
- "type": "タイプ",
- "key": "キー",
- "value": "値",
- "id": "イド",
- "extension-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 extension} other {# extensions} }?",
- "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": "フィールドは必須項目です",
- "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": "リクエストID json式",
- "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-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": "ユニットID",
- "modbus-unit-id-range": "ユニットIDは1〜247の範囲で指定してください。",
- "modbus-device-name": "装置名",
- "modbus-poll-period": "投票期間(ミリ秒)",
- "modbus-attributes-poll-period": "属性のポーリング期間(ミリ秒)",
- "modbus-timeseries-poll-period": "時系列ポーリング期間(ミリ秒)",
- "modbus-poll-period-range": "投票期間は正の値でなければなりません。",
- "modbus-tag": "タグ",
- "modbus-function": "関数",
- "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": "レジスタ数は正の値でなければなりません。",
- "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 item} other {# items} }?",
- "delete-items-action-title": "{ count, plural, 1 {1 item} other {# items} }",
- "delete-items-text": "注意してください。確認後、選択したすべてのアイテムが削除され、関連するすべてのデータは回復不能になります。",
- "add-item-text": "新しいアイテムを追加",
- "no-items-text": "項目は見つかりませんでした",
- "item-details": "商品詳細",
- "delete-item": "アイテムを削除",
- "delete-items": "アイテムを削除する",
- "scroll-to-top": "トップにスクロールします"
- },
- "help": {
- "goto-help-page": "ヘルプページに行く"
- },
- "home": {
- "home": "ホーム",
- "profile": "プロフィール",
- "logout": "ログアウト",
- "menu": "メニュー",
- "avatar": "アバター",
- "open-user-menu": "ユーザーメニューを開く"
- },
- "import": {
- "no-file": "ファイルが選択されていません",
- "drop-file": "JSONファイルをドロップするか、アップロードするファイルをクリックして選択します。"
- },
- "item": {
- "selected": "選択された"
- },
- "js-func": {
- "no-return-error": "関数は値を返す必要があります!",
- "return-type-mismatch": "'{{type}}'タイプ!",
- "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": "Eメール",
- "login-with": "{{name}}でログイン",
- "or": "または"
- },
- "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 relation} other {# relations} }選択された",
- "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 relation} other {# relations} }?",
- "delete-to-relations-text": "注意してください。確認後、選択されたリレーションはすべて削除され、対応するエンティティは現在のエンティティとは無関係になります。",
- "delete-from-relation-title": "'{{entityName}}'?",
- "delete-from-relation-text": "'{{entityName}}'.",
- "delete-from-relations-title": "{ count, plural, 1 {1 relation} other {# relations} }?",
- "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 rule chain} other {# rule chains} }?",
- "delete-rulechains-action-title": "{ count, plural, 1 {1 rule chain} other {# rule chains} }",
- "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": "フィルタ",
- "type-filter-details": "設定された条件で着信メッセージをフィルタリングする",
- "type-enrichment": "豊かな",
- "type-enrichment-details": "メッセージメタデータに追加情報を追加する",
- "type-transformation": "変換",
- "type-transformation-details": "メッセージペイロードとメタデータの変更",
- "type-action": "アクション",
- "type-action-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": "助けて"
- },
- "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 tenant} other {# tenants} }?",
- "delete-tenants-action-title": "{ count, plural, 1 {1 tenant} other {# tenants} }",
- "delete-tenants-text": "注意してください。確認後、選択されたすべてのテナントが削除され、関連するすべてのデータは回復不能になります。",
- "title": "タイトル",
- "title-required": "タイトルは必須です。",
- "description": "説明",
- "details": "詳細",
- "events": "イベント",
- "copyId": "テナントIDをコピーする",
- "idCopiedMessage": "テナントIDがクリップボードにコピーされました",
- "select-tenant": "テナントを選択",
- "no-tenants-matching": "'{{entity}}'発見されました。",
- "tenant-required": "テナントが必要です"
- },
- "timeinterval": {
- "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": "分",
- "seconds": "秒",
- "advanced": "上級"
- },
- "timewindow": {
- "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": "最終",
- "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 user} other {# users} }?",
- "delete-users-action-title": "{ count, plural, 1 {1 user} other {# users} }",
- "delete-users-text": "注意してください。確認後、選択したすべてのユーザーが削除され、関連するすべてのデータは回復不能になります。",
- "activation-email-sent-message": "アクティベーション電子メールが正常に送信されました!",
- "resend-activation": "アクティブ化を再送",
- "email": "Eメール",
- "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": "ユーザーのアクティベーションリンクがクリップボードにコピーされました",
- "details": "詳細"
- },
- "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": "ウィジェットの設定を読み込む際に問題が発生しました。
おそらく関連付けられているウィジェットのタイプが削除されています。",
- "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": "ウィジェットの書き出し"
- },
- "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 {1 widgets bundle} other {# widgets bundles} }?",
- "delete-widgets-bundles-action-title": "{ count, plural, 1 {1 widgets bundle} other {# widgets bundles} }",
- "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": "ウィジェットをインポートできません。bundle:データ構造が無効です。"
- },
- "widget-config": {
- "data": "データ",
- "settings": "設定",
- "advanced": "上級",
- "title": "タイトル",
- "general-settings": "一般設定",
- "display-title": "タイトルを表示",
- "drop-shadow": "影を落とす",
- "enable-fullscreen": "フルスクリーンを有効にする",
- "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 datasource is allowed.} other {# datasources are allowed} }",
- "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": "ウィジェットタイプをインポートできません:ウィジェットタイプのデータ構造が無効です。"
- },
- "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": "選択アイコン",
- "material-icons": "マテリアルアイコン",
- "show-all": "すべてのアイコンを表示する"
- },
- "custom": {
- "widget-action": {
- "action-cell-button": "アクションセルボタン",
- "row-click": "行のクリック",
- "polygon-click": "ポリゴンクリック",
- "marker-click": "マーカークリック",
- "tooltip-tag-action": "ツールチップのタグアクション"
- }
- },
- "language": {
- "language": "言語"
- }
-}
diff --git a/ui/src/app/locale/locale.constant-ko_KR.json b/ui/src/app/locale/locale.constant-ko_KR.json
deleted file mode 100644
index e5f09184b9..0000000000
--- a/ui/src/app/locale/locale.constant-ko_KR.json
+++ /dev/null
@@ -1,1391 +0,0 @@
-{
- "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": "확인",
- "delete": "삭제",
- "add": "추가",
- "yes": "네",
- "no": "아니오",
- "update": "업데이트",
- "remove": "제거",
- "search": "검색",
- "clear-search": "Clear search",
- "assign": "할당",
- "unassign": "비할당",
- "share": "Share",
- "make-private": "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": "Copy reference",
- "paste-reference": "Paste reference",
- "import": "가져오기",
- "export": "내보내기",
- "share-via": "Share via {{provider}}"
- },
- "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 사용",
- "tls-version" : "TLS 버전",
- "send-test-mail": "테스트 메일 보내기"
- },
- "alarm": {
- "alarm": "Alarm",
- "alarms": "Alarms",
- "select-alarm": "Select alarm",
- "no-alarms-matching": "No alarms matching '{{entity}}' were found.",
- "alarm-required": "Alarm is required",
- "alarm-status": "Alarm status",
- "search-status": {
- "ANY": "Any",
- "ACTIVE": "Active",
- "CLEARED": "Cleared",
- "ACK": "Acknowledged",
- "UNACK": "Unacknowledged"
- },
- "display-status": {
- "ACTIVE_UNACK": "Active Unacknowledged",
- "ACTIVE_ACK": "Active Acknowledged",
- "CLEARED_UNACK": "Cleared Unacknowledged",
- "CLEARED_ACK": "Cleared Acknowledged"
- },
- "no-alarms-prompt": "No alarms found",
- "created-time": "Created time",
- "type": "Type",
- "severity": "Severity",
- "originator": "Originator",
- "originator-type": "Originator type",
- "details": "Details",
- "status": "Status",
- "alarm-details": "Alarm details",
- "start-time": "Start time",
- "end-time": "End time",
- "ack-time": "Acknowledged time",
- "clear-time": "Cleared time",
- "severity-critical": "Critical",
- "severity-major": "Major",
- "severity-minor": "Minor",
- "severity-warning": "Warning",
- "severity-indeterminate": "Indeterminate",
- "acknowledge": "Acknowledge",
- "clear": "Clear",
- "search": "Search alarms",
- "selected-alarms": "{ count, plural, 1 {1 alarm} other {# alarms} } selected",
- "no-data": "No data to display",
- "polling-interval": "Alarms polling interval (sec)",
- "polling-interval-required": "Alarms polling interval is required.",
- "min-polling-interval-message": "At least 1 sec polling interval is allowed.",
- "aknowledge-alarms-title": "Acknowledge { count, plural, 1 {1 alarm} other {# alarms} }",
- "aknowledge-alarms-text": "Are you sure you want to acknowledge { count, plural, 1 {1 alarm} other {# alarms} }?",
- "clear-alarms-title": "Clear { count, plural, 1 {1 alarm} other {# alarms} }",
- "clear-alarms-text": "Are you sure you want to clear { count, plural, 1 {1 alarm} other {# alarms} }?"
- },
- "alias": {
- "add": "Add alias",
- "edit": "Edit alias",
- "name": "Alias name",
- "name-required": "Alias name is required",
- "duplicate-alias": "Alias with same name is already exists.",
- "filter-type-single-entity": "Single entity",
- "filter-type-entity-list": "Entity list",
- "filter-type-entity-name": "Entity name",
- "filter-type-state-entity": "Entity from dashboard state",
- "filter-type-state-entity-description": "Entity taken from dashboard state parameters",
- "filter-type-asset-type": "Asset type",
- "filter-type-asset-type-description": "Assets of type '{{assetType}}'",
- "filter-type-asset-type-and-name-description": "Assets of type '{{assetType}}' and with name starting with '{{prefix}}'",
- "filter-type-device-type": "Device type",
- "filter-type-device-type-description": "Devices of type '{{deviceType}}'",
- "filter-type-device-type-and-name-description": "Devices of type '{{deviceType}}' and with name starting with '{{prefix}}'",
- "filter-type-relations-query": "Relations query",
- "filter-type-relations-query-description": "{{entities}} that have {{relationType}} relation {{direction}} {{rootEntity}}",
- "filter-type-asset-search-query": "Asset search query",
- "filter-type-asset-search-query-description": "Assets with types {{assetTypes}} that have {{relationType}} relation {{direction}} {{rootEntity}}",
- "filter-type-device-search-query": "Device search query",
- "filter-type-device-search-query-description": "Devices with types {{deviceTypes}} that have {{relationType}} relation {{direction}} {{rootEntity}}",
- "entity-filter": "Entity filter",
- "resolve-multiple": "Resolve as multiple entities",
- "filter-type": "Filter type",
- "filter-type-required": "Filter type is required.",
- "entity-filter-no-entity-matched": "No entities matching specified filter were found.",
- "no-entity-filter-specified": "No entity filter specified",
- "root-state-entity": "Use dashboard state entity as root",
- "root-entity": "Root entity",
- "state-entity-parameter-name": "State entity parameter name",
- "default-state-entity": "Default state entity",
- "default-entity-parameter-name": "By default",
- "max-relation-level": "Max relation level",
- "unlimited-level": "Unlimited level",
- "state-entity": "Dashboard state entity",
- "all-entities": "All entities",
- "any-relation": "any"
- },
- "asset": {
- "asset": "Asset",
- "assets": "Assets",
- "management": "Asset management",
- "view-assets": "View Assets",
- "add": "Add Asset",
- "assign-to-customer": "Assign to customer",
- "assign-asset-to-customer": "Assign Asset(s) To Customer",
- "assign-asset-to-customer-text": "Please select the assets to assign to the customer",
- "no-assets-text": "No assets found",
- "assign-to-customer-text": "Please select the customer to assign the asset(s)",
- "public": "Public",
- "assignedToCustomer": "Assigned to customer",
- "make-public": "Make asset public",
- "make-private": "Make asset private",
- "unassign-from-customer": "Unassign from customer",
- "delete": "Delete asset",
- "asset-public": "Asset is public",
- "asset-type": "Asset type",
- "asset-type-required": "Asset type is required.",
- "select-asset-type": "Select asset type",
- "enter-asset-type": "Enter asset type",
- "any-asset": "Any asset",
- "no-asset-types-matching": "No asset types matching '{{entitySubtype}}' were found.",
- "asset-type-list-empty": "No asset types selected.",
- "asset-types": "Asset types",
- "name": "Name",
- "name-required": "Name is required.",
- "description": "Description",
- "type": "Type",
- "type-required": "Type is required.",
- "details": "Details",
- "events": "Events",
- "add-asset-text": "Add new asset",
- "asset-details": "Asset details",
- "assign-assets": "Assign assets",
- "assign-assets-text": "Assign { count, plural, 1 {1 asset} other {# assets} } to customer",
- "delete-assets": "Delete assets",
- "unassign-assets": "Unassign assets",
- "unassign-assets-action-title": "Unassign { count, plural, 1 {1 asset} other {# assets} } from customer",
- "assign-new-asset": "Assign new asset",
- "delete-asset-title": "Are you sure you want to delete the asset '{{assetName}}'?",
- "delete-asset-text": "Be careful, after the confirmation the asset and all related data will become unrecoverable.",
- "delete-assets-title": "Are you sure you want to delete { count, plural, 1 {1 asset} other {# assets} }?",
- "delete-assets-action-title": "Delete { count, plural, 1 {1 asset} other {# assets} }",
- "delete-assets-text": "Be careful, after the confirmation all selected assets will be removed and all related data will become unrecoverable.",
- "make-public-asset-title": "Are you sure you want to make the asset '{{assetName}}' public?",
- "make-public-asset-text": "After the confirmation the asset and all its data will be made public and accessible by others.",
- "make-private-asset-title": "Are you sure you want to make the asset '{{assetName}}' private?",
- "make-private-asset-text": "After the confirmation the asset and all its data will be made private and won't be accessible by others.",
- "unassign-asset-title": "Are you sure you want to unassign the asset '{{assetName}}'?",
- "unassign-asset-text": "After the confirmation the asset will be unassigned and won't be accessible by the customer.",
- "unassign-asset": "Unassign asset",
- "unassign-assets-title": "Are you sure you want to unassign { count, plural, 1 {1 asset} other {# assets} }?",
- "unassign-assets-text": "After the confirmation all selected assets will be unassigned and won't be accessible by the customer.",
- "copyId": "Copy asset Id",
- "idCopiedMessage": "Asset Id has been copied to clipboard",
- "select-asset": "Select asset",
- "no-assets-matching": "No assets matching '{{entity}}' were found.",
- "asset-required": "Asset is required",
- "name-starts-with": "Asset name starts with"
- },
- "attribute": {
- "attributes": "속성",
- "latest-telemetry": "최근 데이터",
- "attributes-scope": "디바이스 속성 범위",
- "scope-latest-telemetry": "최근 데이터",
- "scope-client": "클라이언트 속성",
- "scope-server": "서버 속성",
- "scope-shared": "공유 속성",
- "add": "속성 추가",
- "key": "Key",
- "key-required": "속성 key를 입력하세요.",
- "value": "Value",
- "value-required": "속성 value를 입력하세요.",
- "delete-attributes-title": "{ count, plural, 1 {속성} other {여러 속성들을} } 삭제하시겠습니까??",
- "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개} other {속성 #개} } 선택됨",
- "selected-telemetry": "{ count, plural, 1 {최근 데이터 1개} other {최근 데이터 #개} } 선택됨"
- },
- "audit-log": {
- "audit": "Audit",
- "audit-logs": "Audit Logs",
- "timestamp": "Timestamp",
- "entity-type": "Entity Type",
- "entity-name": "Entity Name",
- "user": "User",
- "type": "Type",
- "status": "Status",
- "details": "Details",
- "type-added": "Added",
- "type-deleted": "Deleted",
- "type-updated": "Updated",
- "type-attributes-updated": "Attributes updated",
- "type-attributes-deleted": "Attributes deleted",
- "type-rpc-call": "RPC call",
- "type-credentials-updated": "Credentials updated",
- "type-assigned-to-customer": "Assigned to Customer",
- "type-unassigned-from-customer": "Unassigned from Customer",
- "type-activated": "Activated",
- "type-suspended": "Suspended",
- "type-credentials-read": "Credentials read",
- "type-attributes-read": "Attributes read",
- "status-success": "Success",
- "status-failure": "Failure",
- "audit-log-details": "Audit log details",
- "no-audit-logs-prompt": "No logs found",
- "action-data": "Action data",
- "failure-details": "Failure details",
- "search": "Search audit logs",
- "clear-search": "Clear search"
- },
- "confirm-on-exit": {
- "message": "변경 사항을 저장하지 않았습니다. 이 페이지를 나가시겠습니까?",
- "html-message": "변경 사항을 저장하지 않았습니다.
이 페이지를 나가시겠습니까?",
- "title": "저장되지 않은 변경사항"
- },
- "contact": {
- "country": "국가",
- "city": "시",
- "state": "도",
- "postal-code": "우편 번호",
- "postal-code-invalid": "숫자만 입력하세요.",
- "address": "주소",
- "address2": "상세주소",
- "phone": "전화번호",
- "email": "Email",
- "no-address": "주소 정보 없음"
- },
- "common": {
- "username": "사용자명",
- "password": "비밀번호",
- "enter-username": "사용자명을 입력하세요.",
- "enter-password": "비밀번호를 입력하세요.",
- "enter-search": "검색어 입력"
- },
- "content-type": {
- "json": "Json",
- "text": "Text",
- "binary": "Binary (Base64)"
- },
- "customer": {
- "customers": "커스터머",
- "management": "커스터머 관리",
- "dashboard": "커스터머 대시보드",
- "dashboards": "커스터머 대시보드",
- "devices": "커스터머 디바이스",
- "add": "커스터머 추가",
- "delete": "커스터머 삭제",
- "manage-customer-users": "커스터머 사용자 관리",
- "manage-customer-devices": "커스터머 디바이스 관리",
- "manage-customer-dashboards": "커스터머 대시보드 관리",
- "manage-public-devices": "Manage public devices",
- "manage-public-dashboards": "Manage public dashboards",
- "manage-customer-assets": "Manage customer assets",
- "manage-public-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개} other {커스터머 #개} }를 삭제하시겠습니까?",
- "delete-customers-action-title": "{ count, plural, 1 {커스터머 1개} other {커스터머 #개} } 삭제",
- "delete-customers-text": "선택된 커스터머는 삭제되고 관련된 모든 데이터를 복구할 수 없으므로 주의하십시오.",
- "manage-users": "사용자 관리",
- "manage-devices": "디바이스 관리",
- "manage-dashboards": "대시보드 관리",
- "title": "타이틀",
- "title-required": "타이틀을 입력하세요.",
- "description": "설명",
- "details": "Details",
- "events": "Events",
- "copyId": "Copy customer Id",
- "idCopiedMessage": "Customer Id has been copied to clipboard",
- "select-customer": "Select customer",
- "no-customers-matching": "No customers matching '{{entity}}' were found.",
- "customer-required": "Customer is required",
- "select-default-customer": "Select default customer",
- "default-customer": "Default customer",
- "default-customer-required": "Default customer is required in order to debug dashboard on Tenant level"
- },
- "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": "커스터머 해제",
- "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 {대시보드 #개} }를 커스터머 할당",
- "delete-dashboards": "대시보드 삭제",
- "unassign-dashboards": "대시보드 할당 취소",
- "unassign-dashboards-action-title": "{ count, plural, 1 {대시보드 1개} other {대시보드 #개} }를 커스터머 할당 취소",
- "delete-dashboard-title": "'{{dashboardTitle}}' 대시보드를 삭제하시겠습니까?",
- "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": "'{{dashboardTitle}}' 대시보드 할당을 해제하시겠습니까?",
- "unassign-dashboard-text": "대시보드가 할당 해제되고 커스터머는 액세스 할 수 없게됩니다.",
- "unassign-dashboard": "대시보드 할달 취소",
- "unassign-dashboards-title": "{ count, plural, 1 {대시보드 1개} other {대시보드 #개} }의 할당을 취소하시겠습니까?",
- "unassign-dashboards-text": "선택된 대시보드가 할당 해제되고 커스터머는 액세스 할 수 없게됩니다.",
- "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": "열 개수를 최대 100 이하로 입력하세요.",
- "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 이하로 입력하세요.",
- "display-title": "대시보드 타이틀 표시",
- "title-color": "타이틀 색상",
- "import": "대시보드 가져오기",
- "export": "대시보드 내보내기",
- "export-failed-error": "대시보드 내보내기를 할 수 없습니다.: {error}",
- "create-new-dashboard": "대시보드 생성",
- "dashboard-file": "대시보드 파일",
- "invalid-dashboard-file-error": "대시보드 가져오기를 할 수 없습니다.: 대시보드 데이터 구조가 잘못되었습니다.",
- "dashboard-import-missing-aliases-title": "대시보드 앨리어스를 위해 누락 된 디바이스 선택",
- "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": "커스터머에 할당됨"
- },
- "datakey": {
- "settings": "설정",
- "advanced": "고급",
- "label": "Label",
- "color": "색상",
- "data-generation-func": "데이터 생성 기능",
- "use-data-post-processing-func": "데이터 후처리 기능 사용",
- "configuration": "데이터 key 구성",
- "timeseries": "Timeseries",
- "attributes": "Attributes",
- "timeseries-required": "디바이스 timeseries 를 입력하세요.",
- "timeseries-or-attributes-required": "디바이스 timeseries/attributes 를 입력하세요.",
- "maximum-timeseries-or-attributes": "Maximum { count, plural, 1 {1 timeseries/attribute is allowed.} other {# timeseries/attributes are allowed} }",
- "alarm-fields-required": "Alarm fields are required.",
- "function-types": "함수 유형",
- "function-types-required": "함수 유형을 입력하세요.",
- "maximum-function-types": "Maximum { count, plural, 1 {1 function type is allowed.} other {# function types are allowed} }"
- },
- "datasource": {
- "type": "데이터소스 유형",
- "name": "Name",
- "add-datasource-prompt": "데이터소스를 추가하세요."
- },
- "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": "Key가 없습니다.",
- "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": "고객에게 할당할 디바이스를 선택하십시오.",
- "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": "새로운 디바이스 할당",
- "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 public key",
- "rsa-key-required": "RSA public key 를 입력하세요.",
- "secret": "시크릿",
- "secret-required": "시크릿을 입력하세요.",
- "name": "이름",
- "name-required": "이름을 입력하세요.",
- "description": "설명",
- "events": "이벤트",
- "details": "상세",
- "copyId": "디바이스 아이디 복사",
- "copyAccessToken": "억세스 토큰 복사",
- "idCopiedMessage": "디바이스 아이디가 클립보드에 복사되었습니다.",
- "accessTokenCopiedMessage": "디바이스 억세스 토큰이 클립보드에 복사되었습니다.",
- "assignedToCustomer": "커스터머에 할당됨",
- "unable-delete-device-alias-title": "디바이스 앨리어스를 삭제할 수 없습니다.",
- "unable-delete-device-alias-text": "'{{deviceAlias}}' 디바이스 앨리어스를 삭제할 수 없습니다. 다음 위젯에서 사용하고 있습니다.
{{widgetsList}}",
- "is-gateway": "게이트웨이 여부"
- },
- "dialog": {
- "close": "다이얼로그 닫기"
- },
- "error": {
- "unable-to-connect": "서버에 연결할 수 없습니다! 인터넷 연결을 확인하십시오.",
- "unhandled-error-code": "처리되지 않은 오류 코드: {{errorCode}}",
- "unknown-error": "알 수 없는 오류"
- },
- "entity": {
- "entity": "Entity",
- "entities": "Entities",
- "aliases": "Entity aliases",
- "entity-alias": "Entity alias",
- "unable-delete-entity-alias-title": "Unable to delete entity alias",
- "unable-delete-entity-alias-text": "Entity alias '{{entityAlias}}' can't be deleted as it used by the following widget(s):
{{widgetsList}}",
- "duplicate-alias-error": "Duplicate alias found '{{alias}}'.
Entity aliases must be unique whithin the dashboard.",
- "missing-entity-filter-error": "Filter is missing for alias '{{alias}}'.",
- "configure-alias": "Configure '{{alias}}' alias",
- "alias": "Alias",
- "alias-required": "Entity alias is required.",
- "remove-alias": "Remove entity alias",
- "add-alias": "Add entity alias",
- "entity-list": "Entity list",
- "entity-type": "Entity type",
- "entity-types": "Entity types",
- "entity-type-list": "Entity type list",
- "any-entity": "Any entity",
- "enter-entity-type": "Enter entity type",
- "no-entities-matching": "No entities matching '{{entity}}' were found.",
- "no-entity-types-matching": "No entity types matching '{{entityType}}' were found.",
- "name-starts-with": "Name starts with",
- "use-entity-name-filter": "Use filter",
- "entity-list-empty": "No entities selected.",
- "entity-type-list-empty": "No entity types selected.",
- "entity-name-filter-required": "Entity name filter is required.",
- "entity-name-filter-no-entity-matched": "No entities starting with '{{entity}}' were found.",
- "all-subtypes": "All",
- "select-entities": "Select entities",
- "no-aliases-found": "No aliases found.",
- "no-alias-matching": "'{{alias}}' not found.",
- "create-new-alias": "Create a new one!",
- "key": "Key",
- "key-name": "Key name",
- "no-keys-found": "No keys found.",
- "no-key-matching": "'{{key}}' not found.",
- "create-new-key": "Create a new one!",
- "type": "Type",
- "type-required": "Entity type is required.",
- "type-device": "Device",
- "type-devices": "Devices",
- "list-of-devices": "{ count, plural, 1 {One device} other {List of # devices} }",
- "device-name-starts-with": "Devices whose names start with '{{prefix}}'",
- "type-asset": "Asset",
- "type-assets": "Assets",
- "list-of-assets": "{ count, plural, 1 {One asset} other {List of # assets} }",
- "asset-name-starts-with": "Assets whose names start with '{{prefix}}'",
- "type-rule": "Rule",
- "type-rules": "Rules",
- "list-of-rules": "{ count, plural, 1 {One rule} other {List of # rules} }",
- "rule-name-starts-with": "Rules whose names start with '{{prefix}}'",
- "type-plugin": "Plugin",
- "type-plugins": "Plugins",
- "list-of-plugins": "{ count, plural, 1 {One plugin} other {List of # plugins} }",
- "plugin-name-starts-with": "Plugins whose names start with '{{prefix}}'",
- "type-tenant": "Tenant",
- "type-tenants": "Tenants",
- "list-of-tenants": "{ count, plural, 1 {One tenant} other {List of # tenants} }",
- "tenant-name-starts-with": "Tenants whose names start with '{{prefix}}'",
- "type-customer": "Customer",
- "type-customers": "Customers",
- "list-of-customers": "{ count, plural, 1 {One customer} other {List of # customers} }",
- "customer-name-starts-with": "Customers whose names start with '{{prefix}}'",
- "type-user": "User",
- "type-users": "Users",
- "list-of-users": "{ count, plural, 1 {One user} other {List of # users} }",
- "user-name-starts-with": "Users whose names start with '{{prefix}}'",
- "type-dashboard": "Dashboard",
- "type-dashboards": "Dashboards",
- "list-of-dashboards": "{ count, plural, 1 {One dashboard} other {List of # dashboards} }",
- "dashboard-name-starts-with": "Dashboards whose names start with '{{prefix}}'",
- "type-alarm": "Alarm",
- "type-alarms": "Alarms",
- "list-of-alarms": "{ count, plural, 1 {One alarms} other {List of # alarms} }",
- "alarm-name-starts-with": "Alarms whose names start with '{{prefix}}'",
- "type-rulechain": "Rule chain",
- "type-rulechains": "Rule chains",
- "list-of-rulechains": "{ count, plural, 1 {One rule chain} other {List of # rule chains} }",
- "rulechain-name-starts-with": "Rule chains whose names start with '{{prefix}}'",
- "type-current-customer": "Current Customer",
- "search": "Search entities",
- "selected-entities": "{ count, plural, 1 {1 entity} other {# entities} } selected",
- "entity-name": "Entity name",
- "details": "Entity details",
- "no-entities-prompt": "No entities found",
- "no-data": "No data to display"
- },
- "event": {
- "event-type": "이벤트 타입",
- "type-error": "에러",
- "type-lc-event": "주기적 이벤트",
- "type-stats": "통계",
- "type-debug-rule-node": "Debug",
- "type-debug-rule-chain": "Debug",
- "no-events-prompt": "이벤트 없음",
- "error": "에러",
- "alarm": "알람",
- "event-time": "이벤트 발생 시간",
- "server": "서버",
- "body": "Body",
- "method": "Method",
- "type": "Type",
- "entity": "Entity",
- "message-id": "Message Id",
- "message-type": "Message Type",
- "data-type": "Data Type",
- "relation-type": "Relation Type",
- "metadata": "Metadata",
- "data": "Data",
- "event": "이벤트",
- "status": "상태",
- "success": "성공",
- "failed": "실패",
- "messages-processed": "처리된 메시지",
- "errors-occurred": "오류가 발생했습니다"
- },
- "extension": {
- "extensions": "Extensions",
- "selected-extensions": "{ count, plural, 1 {1 extension} other {# extensions} } selected",
- "type": "Type",
- "key": "Key",
- "value": "Value",
- "id": "Id",
- "extension-id": "Extension id",
- "extension-type": "Extension type",
- "transformer-json": "JSON *",
- "unique-id-required": "Current extension id already exists.",
- "delete": "Delete extension",
- "add": "Add extension",
- "edit": "Edit extension",
- "delete-extension-title": "Are you sure you want to delete the extension '{{extensionId}}'?",
- "delete-extension-text": "Be careful, after the confirmation the extension and all related data will become unrecoverable.",
- "delete-extensions-title": "Are you sure you want to delete { count, plural, 1 {1 extension} other {# extensions} }?",
- "delete-extensions-text": "Be careful, after the confirmation all selected extensions will be removed.",
- "converters": "Converters",
- "converter-id": "Converter id",
- "configuration": "Configuration",
- "converter-configurations": "Converter configurations",
- "token": "Security token",
- "add-converter": "Add converter",
- "add-config": "Add converter configuration",
- "device-name-expression": "Device name expression",
- "device-type-expression": "Device type expression",
- "custom": "Custom",
- "to-double": "To Double",
- "transformer": "Transformer",
- "json-required": "Transformer json is required.",
- "json-parse": "Unable to parse transformer json.",
- "attributes": "Attributes",
- "add-attribute": "Add attribute",
- "add-map": "Add mapping element",
- "timeseries": "Timeseries",
- "add-timeseries": "Add timeseries",
- "field-required": "Field is required",
- "brokers": "Brokers",
- "add-broker": "Add broker",
- "host": "Host",
- "port": "Port",
- "port-range": "Port should be in a range from 1 to 65535.",
- "ssl": "Ssl",
- "credentials": "Credentials",
- "username": "Username",
- "password": "Password",
- "retry-interval": "Retry interval in milliseconds",
- "anonymous": "Anonymous",
- "basic": "Basic",
- "pem": "PEM",
- "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.",
- "mapping": "Mapping",
- "topic-filter": "Topic filter",
- "converter-type": "Converter type",
- "converter-json": "Json",
- "json-name-expression": "Device name json expression",
- "topic-name-expression": "Device name topic expression",
- "json-type-expression": "Device type json expression",
- "topic-type-expression": "Device type topic expression",
- "attribute-key-expression": "Attribute key expression",
- "attr-json-key-expression": "Attribute key json expression",
- "attr-topic-key-expression": "Attribute key topic expression",
- "request-id-expression": "Request id expression",
- "request-id-json-expression": "Request id json expression",
- "request-id-topic-expression": "Request id topic expression",
- "response-topic-expression": "Response topic expression",
- "value-expression": "Value expression",
- "topic": "Topic",
- "timeout": "Timeout in milliseconds",
- "converter-json-required": "Converter json is required.",
- "converter-json-parse": "Unable to parse converter json.",
- "filter-expression": "Filter expression",
- "connect-requests": "Connect requests",
- "add-connect-request": "Add connect request",
- "disconnect-requests": "Disconnect requests",
- "add-disconnect-request": "Add disconnect request",
- "attribute-requests": "Attribute requests",
- "add-attribute-request": "Add attribute request",
- "attribute-updates": "Attribute updates",
- "add-attribute-update": "Add attribute update",
- "server-side-rpc": "Server side RPC",
- "add-server-side-rpc-request": "Add server-side RPC request",
- "device-name-filter": "Device name filter",
- "attribute-filter": "Attribute filter",
- "method-filter": "Method filter",
- "request-topic-expression": "Request topic expression",
- "response-timeout": "Response timeout in milliseconds",
- "topic-expression": "Topic expression",
- "client-scope": "Client scope",
- "add-device": "Add device",
- "opc-server": "Servers",
- "opc-add-server": "Add server",
- "opc-add-server-prompt": "Please add server",
- "opc-application-name": "Application name",
- "opc-application-uri": "Application uri",
- "opc-scan-period-in-seconds": "Scan period in seconds",
- "opc-security": "Security",
- "opc-identity": "Identity",
- "opc-keystore": "Keystore",
- "opc-type": "Type",
- "opc-keystore-type": "Type",
- "opc-keystore-location": "Location *",
- "opc-keystore-password": "Password",
- "opc-keystore-alias": "Alias",
- "opc-keystore-key-password": "Key password",
- "opc-device-node-pattern": "Device node pattern",
- "opc-device-name-pattern": "Device name pattern",
- "modbus-server": "Servers/slaves",
- "modbus-add-server": "Add server/slave",
- "modbus-add-server-prompt": "Please add server/slave",
- "modbus-transport": "Transport",
- "modbus-port-name": "Serial port name",
- "modbus-encoding": "Encoding",
- "modbus-parity": "Parity",
- "modbus-baudrate": "Baud rate",
- "modbus-databits": "Data bits",
- "modbus-stopbits": "Stop bits",
- "modbus-databits-range": "Data bits should be in a range from 7 to 8.",
- "modbus-stopbits-range": "Stop bits should be in a range from 1 to 2.",
- "modbus-unit-id": "Unit ID",
- "modbus-unit-id-range": "Unit ID should be in a range from 1 to 247.",
- "modbus-device-name": "Device name",
- "modbus-poll-period": "Poll period (ms)",
- "modbus-attributes-poll-period": "Attributes poll period (ms)",
- "modbus-timeseries-poll-period": "Timeseries poll period (ms)",
- "modbus-poll-period-range": "Poll period should be positive value.",
- "modbus-tag": "Tag",
- "modbus-function": "Function",
- "modbus-register-address": "Register address",
- "modbus-register-address-range": "Register address should be in a range from 0 to 65535.",
- "modbus-register-bit-index": "Bit index",
- "modbus-register-bit-index-range": "Bit index should be in a range from 0 to 15.",
- "modbus-register-count": "Register count",
- "modbus-register-count-range": "Register count should be a positive value.",
- "modbus-byte-order": "Byte order",
- "sync": {
- "status": "Status",
- "sync": "Sync",
- "not-sync": "Not sync",
- "last-sync-time": "Last sync time",
- "not-available": "Not available"
- },
- "export-extensions-configuration": "Export extensions configuration",
- "import-extensions-configuration": "Import extensions configuration",
- "import-extensions": "Import extensions",
- "import-extension": "Import extension",
- "export-extension": "Export extension",
- "file": "Extensions file",
- "invalid-file-error": "Invalid extension file"
- },
- "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": "아이템 삭제",
- "delete-items": "아이템 삭제",
- "scroll-to-top": "스크롤 맨 위로"
- },
- "help": {
- "goto-help-page": "도움"
- },
- "home": {
- "home": "홈",
- "profile": "프로파일",
- "logout": "로그아웃",
- "menu": "메뉴",
- "avatar": "Avatar",
- "open-user-menu": "사용자 메뉴 열기"
- },
- "import": {
- "no-file": "선택된 파일이 없습니다.",
- "drop-file": "JSON 파일을 끌어다 놓거나 클릭하여 업로드 할 파일을 선택하십시오."
- },
- "item": {
- "selected": "선택됨"
- },
- "js-func": {
- "no-return-error": "함수는 값을 반환해야 합니다!",
- "return-type-mismatch": "함수는 '{{type}}' 유형의 값을 반환해야 합니다!",
- "tidy": "Tidy"
- },
- "key-val": {
- "key": "Key",
- "value": "Value",
- "remove-entry": "Remove entry",
- "add-entry": "Add entry",
- "no-data": "No entries"
- },
- "layout": {
- "layout": "Layout",
- "manage": "Manage layouts",
- "settings": "Layout settings",
- "color": "Color",
- "main": "Main",
- "right": "Right",
- "select": "Select target layout"
- },
- "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": "이메일",
- "login-with": "{{name}}으로 로그인",
- "or": "또는"
- },
- "position": {
- "top": "상단",
- "bottom": "하단",
- "left": "왼쪽",
- "right": "오른쪽"
- },
- "profile": {
- "profile": "프로파일",
- "change-password": "비밀번호 변경",
- "current-password": "현재 비밀번호"
- },
- "relation": {
- "relations": "Relations",
- "direction": "Direction",
- "search-direction": {
- "FROM": "From",
- "TO": "To"
- },
- "direction-type": {
- "FROM": "from",
- "TO": "to"
- },
- "from-relations": "Outbound relations",
- "to-relations": "Inbound relations",
- "selected-relations": "{ count, plural, 1 {1 relation} other {# relations} } selected",
- "type": "Type",
- "to-entity-type": "To entity type",
- "to-entity-name": "To entity name",
- "from-entity-type": "From entity type",
- "from-entity-name": "From entity name",
- "to-entity": "To entity",
- "from-entity": "From entity",
- "delete": "Delete relation",
- "relation-type": "Relation type",
- "relation-type-required": "Relation type is required.",
- "any-relation-type": "Any type",
- "add": "Add relation",
- "edit": "Edit relation",
- "delete-to-relation-title": "Are you sure you want to delete relation to the entity '{{entityName}}'?",
- "delete-to-relation-text": "Be careful, after the confirmation the entity '{{entityName}}' will be unrelated from the current entity.",
- "delete-to-relations-title": "Are you sure you want to delete { count, plural, 1 {1 relation} other {# relations} }?",
- "delete-to-relations-text": "Be careful, after the confirmation all selected relations will be removed and corresponding entities will be unrelated from the current entity.",
- "delete-from-relation-title": "Are you sure you want to delete relation from the entity '{{entityName}}'?",
- "delete-from-relation-text": "Be careful, after the confirmation current entity will be unrelated from the entity '{{entityName}}'.",
- "delete-from-relations-title": "Are you sure you want to delete { count, plural, 1 {1 relation} other {# relations} }?",
- "delete-from-relations-text": "Be careful, after the confirmation all selected relations will be removed and current entity will be unrelated from the corresponding entities.",
- "remove-relation-filter": "Remove relation filter",
- "add-relation-filter": "Add relation filter",
- "any-relation": "Any relation",
- "relation-filters": "Relation filters",
- "additional-info": "Additional info (JSON)",
- "invalid-additional-info": "Unable to parse additional info json."
- },
- "rulechain": {
- "rulechain": "Rule chain",
- "rulechains": "Rule chains",
- "root": "Root",
- "delete": "Delete rule chain",
- "name": "Name",
- "name-required": "Name is required.",
- "description": "Description",
- "add": "Add Rule Chain",
- "set-root": "Make rule chain root",
- "set-root-rulechain-title": "Are you sure you want to make the rule chain '{{ruleChainName}}' root?",
- "set-root-rulechain-text": "After the confirmation the rule chain will become root and will handle all incoming transport messages.",
- "delete-rulechain-title": "Are you sure you want to delete the rule chain '{{ruleChainName}}'?",
- "delete-rulechain-text": "Be careful, after the confirmation the rule chain and all related data will become unrecoverable.",
- "delete-rulechains-title": "Are you sure you want to delete { count, plural, 1 {1 rule chain} other {# rule chains} }?",
- "delete-rulechains-action-title": "Delete { count, plural, 1 {1 rule chain} other {# rule chains} }",
- "delete-rulechains-text": "Be careful, after the confirmation all selected rule chains will be removed and all related data will become unrecoverable.",
- "add-rulechain-text": "Add new rule chain",
- "no-rulechains-text": "No rule chains found",
- "rulechain-details": "Rule chain details",
- "details": "Details",
- "events": "Events",
- "system": "System",
- "import": "Import rule chain",
- "export": "Export rule chain",
- "export-failed-error": "Unable to export rule chain: {{error}}",
- "create-new-rulechain": "Create new rule chain",
- "rulechain-file": "Rule chain file",
- "invalid-rulechain-file-error": "Unable to import rule chain: Invalid rule chain data structure.",
- "copyId": "Copy rule chain Id",
- "idCopiedMessage": "Rule chain Id has been copied to clipboard",
- "select-rulechain": "Select rule chain",
- "no-rulechains-matching": "No rule chains matching '{{entity}}' were found.",
- "rulechain-required": "Rule chain is required",
- "management": "Rules management",
- "debug-mode": "Debug mode"
- },
- "rulenode": {
- "details": "Details",
- "events": "Events",
- "search": "Search nodes",
- "open-node-library": "Open node library",
- "add": "Add rule node",
- "name": "Name",
- "name-required": "Name is required.",
- "type": "Type",
- "description": "Description",
- "delete": "Delete rule node",
- "select-all-objects": "Select all nodes and connections",
- "deselect-all-objects": "Deselect all nodes and connections",
- "delete-selected-objects": "Delete selected nodes and connections",
- "delete-selected": "Delete selected",
- "select-all": "Select all",
- "copy-selected": "Copy selected",
- "deselect-all": "Deselect all",
- "rulenode-details": "Rule node details",
- "debug-mode": "Debug mode",
- "configuration": "Configuration",
- "link": "Link",
- "link-details": "Rule node link details",
- "add-link": "Add link",
- "link-label": "Link label",
- "link-label-required": "Link label is required.",
- "custom-link-label": "Custom link label",
- "custom-link-label-required": "Custom link label is required.",
- "type-filter": "Filter",
- "type-filter-details": "Filter incoming messages with configured conditions",
- "type-enrichment": "Enrichment",
- "type-enrichment-details": "Add additional information into Message Metadata",
- "type-transformation": "Transformation",
- "type-transformation-details": "Change Message payload and Metadata",
- "type-action": "Action",
- "type-action-details": "Perform special action",
- "type-external": "External",
- "type-external-details": "Interacts with external system",
- "type-rule-chain": "Rule Chain",
- "type-rule-chain-details": "Forwards incoming messages to specified Rule Chain",
- "type-input": "Input",
- "type-input-details": "Logical input of Rule Chain, forwards incoming messages to next related Rule Node",
- "directive-is-not-loaded": "Defined configuration directive '{{directiveName}}' is not available.",
- "ui-resources-load-error": "Failed to load configuration ui resources.",
- "invalid-target-rulechain": "Unable to resolve target rule chain!",
- "test-script-function": "Test script function",
- "message": "Message",
- "message-type": "Message type",
- "message-type-required": "Message type is required",
- "metadata": "Metadata",
- "metadata-required": "Metadata entries can't be empty.",
- "output": "Output",
- "test": "Test",
- "help": "Help"
- },
- "tenant": {
- "tenants": "테넌트",
- "management": "테넌트 관리",
- "add": "테넌트 추가",
- "admins": "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": "Details",
- "events": "Events",
- "copyId": "Copy tenant Id",
- "idCopiedMessage": "Tenant Id has been copied to clipboard",
- "select-tenant": "Select tenant",
- "no-tenants-matching": "No tenants matching '{{entity}}' were found.",
- "tenant-required": "Tenant is required"
- },
- "timeinterval": {
- "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": "Days",
- "hours": "Hours",
- "minutes": "Minutes",
- "seconds": "Seconds",
- "advanced": "고급"
- },
- "timewindow": {
- "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": "Realtime",
- "history": "History",
- "last-prefix": "last",
- "period": "from {{ startTime }} to {{ endTime }}",
- "edit": "타임윈도우 편집",
- "date-range": "날짜 범위",
- "last": "Last",
- "time-period": "기간"
- },
- "user": {
- "users": "사용자",
- "customer-users": "커스터머 사용자",
- "tenant-admins": "테넌트 관리자",
- "sys-admin": "시스템 관리자",
- "tenant-admin": "테넌트 관리자",
- "customer": "커스터머",
- "anonymous": "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",
- "email-required": "Email을 입력하세요.",
- "first-name": "이름",
- "last-name": "성",
- "description": "설명",
- "default-dashboard": "기본 대시보드",
- "always-fullscreen": "항상 전체화면",
- "select-user": "Select user",
- "no-users-matching": "No users matching '{{entity}}' were found.",
- "user-required": "User is required",
- "activation-method": "Activation method",
- "display-activation-link": "Display activation link",
- "send-activation-mail": "Send activation mail",
- "activation-link": "User activation link",
- "activation-link-text": "In order to activate user use the following activation link :",
- "copy-activation-link": "Copy activation link",
- "activation-link-copied-message": "User activation link has been copied to clipboard",
- "details": "Details"
- },
- "value": {
- "type": "Value type",
- "string": "String",
- "string-value": "String value",
- "integer": "Integer",
- "integer-value": "Integer value",
- "invalid-integer-value": "Invalid integer value",
- "double": "Double",
- "double-value": "Double value",
- "boolean": "Boolean",
- "boolean-value": "Boolean value",
- "false": "False",
- "true": "True"
- },
- "widget": {
- "widget-library": "위젯 저장소",
- "widget-bundle": "위젯 번들",
- "select-widgets-bundle": "위젯 번들 선택",
- "management": "위젯 관리",
- "editor": "위젯 편집기",
- "widget-type-not-found": "위젯 구성을 로드하는 중 문제가 발생했습니다.
연결된 위젯 타입이 삭제되었습니다.",
- "widget-type-load-error": "다음과 같은 오류로 인해 위젯이로드되지 않았습니다:",
- "remove": "위젯 삭제",
- "edit": "위젯 수정",
- "remove-widget-title": "'{{widgetTitle}}' 위젯을 삭제하시겠습니까?",
- "remove-widget-text": "위젯과 관련된 모든 데이터를 복구할 수 없으므로 주의하십시오.",
- "timeseries": "Time series",
- "latest-values": "Latest values",
- "rpc": "Control 위젯",
- "static": "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 URI",
- "remove-resource": "리소스 삭제",
- "add-resource": "리소스 추가",
- "html": "HTML",
- "tidy": "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": "위젯 내보내기"
- },
- "widget-action": {
- "header-button": "Widget header button",
- "open-dashboard-state": "Navigate to new dashboard state",
- "update-dashboard-state": "Update current dashboard state",
- "open-dashboard": "Navigate to other dashboard",
- "custom": "Custom action",
- "target-dashboard-state": "Target dashboard state",
- "target-dashboard-state-required": "Target dashboard state is required",
- "set-entity-from-widget": "Set entity from widget",
- "target-dashboard": "Target dashboard",
- "open-right-layout": "Open right dashboard layout (mobile view)"
- },
- "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 {위젯 번들 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": "전체화면 사용 ",
- "background-color": "배경 색",
- "text-color": "글자 색",
- "padding": "패딩",
- "title-style": "타이틀 스타일",
- "mobile-mode-settings": "모바일 모드 설정",
- "order": "순서",
- "height": "높이",
- "units": "값 옆에 표시할 특수 기호",
- "decimals": "소수점 이하 자릿수",
- "timewindow": "타임윈도우",
- "use-dashboard-timewindow": "대시보드 타임윈도우",
- "display-legend": "범례 표시",
- "datasources": "데이터소스",
- "datasource-type": "유형",
- "datasource-parameters": "파라미터",
- "remove-datasource": "데이터소스 삭제",
- "add-datasource": "데이터소스 추가",
- "target-device": "대상 디바이스"
- },
- "widget-type": {
- "import": "위젯 타입 가져오기",
- "export": "위젯 타입 내보내기",
- "export-failed-error": "위젯 타입을 내보내기 할 수 없습니다.: {{error}}",
- "create-new-widget-type": "새로운 위젯 타입 생성",
- "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",
- "material-icons": "Material icons",
- "show-all": "Show all icons"
- },
- "custom": {
- "widget-action": {
- "action-cell-button": "Action cell button",
- "row-click": "On row click",
- "polygon-click": "On polygon click",
- "marker-click": "On marker click",
- "tooltip-tag-action": "Tooltip tag action"
- }
- },
- "language": {
- "language": "언어"
- }
-}
diff --git a/ui/src/app/locale/locale.constant-lv_LV.json b/ui/src/app/locale/locale.constant-lv_LV.json
deleted file mode 100644
index 7fafb97af2..0000000000
--- a/ui/src/app/locale/locale.constant-lv_LV.json
+++ /dev/null
@@ -1,1682 +0,0 @@
-{
- "access": {
- "unauthorized": "Neatļauta",
- "unauthorized-access": "Neatļauta piekļuve",
- "unauthorized-access-text": "Lai piekļūtu šim resursam, jums jāpierakstās!",
- "access-forbidden": "Piekļuve aizliegta",
- "access-forbidden-text": "Jums nav piekļuves tiesību!
Mēģiniet pierakstīties ar citu lietotājvārdu.",
- "refresh-token-expired": "Sesija ir beigusies",
- "refresh-token-failed": "Nevar atjaunot sesiju"
- },
- "action": {
- "activate": "Aktivizēt",
- "suspend": "Apturēt",
- "save": "Saglabāt",
- "saveAs": "Saglabāt kā",
- "cancel": "Atcelt",
- "ok": "OK",
- "delete": "Dzēst",
- "add": "Pievienot",
- "yes": "Jā",
- "no": "Nē",
- "update": "Atjaunināt",
- "remove": "Noņemt",
- "search": "Meklēt",
- "clear-search": "Notīrīt meklēšanu",
- "assign": "Piešķirt",
- "unassign": "Noņemt",
- "share": "Dalīties",
- "make-private": "Padarīt privātu",
- "apply": "Pielietot",
- "apply-changes": "Pielietot izmaiņas",
- "edit-mode": "Rediģēšanas režīms",
- "enter-edit-mode": "Ievadiet rediģēšanas režīmu",
- "decline-changes": "Noraidīt izmaiņas",
- "close": "Aizvērt",
- "back": "Atpakaļ",
- "run": "Uz priekšu",
- "sign-in": "Pierakstīties!",
- "edit": "Rediģēt",
- "view": "Skatīt",
- "create": "Radīt",
- "drag": "Velciet",
- "refresh": "Atjaunot",
- "undo": "Atsaukt",
- "copy": "Kopēt",
- "paste": "Ielīmēt",
- "copy-reference": "Kopija atsauce",
- "paste-reference": "Ielīmēt atsauce",
- "import": "Importēt",
- "export": "Eksportēt",
- "share-via": "Dalīties caur {{pakalpojuma sniedzējs}}",
- "continue": "Turpināt"
- },
- "aggregation": {
- "aggregation": "Sakopojums",
- "function": "Datu sakopojuma funkcija",
- "limit": "Limits",
- "group-interval": "Grupas intervāls",
- "min": "Min",
- "max": "Max",
- "avg": "Vidējais",
- "sum": "Sum",
- "count": "Skaits",
- "none": "Neviena"
- },
- "admin": {
- "general": "Vispārīgi",
- "general-settings": "Vispārīgie iestatījumi",
- "outgoing-mail": "Pasta serveris",
- "outgoing-mail-settings": "Izejošā pasta servera iestatījumi",
- "system-settings": "Sistēmas iestatījumi",
- "test-mail-sent": "Testa pasts sekmīgi nosūtīts!",
- "base-url": "pamata URL",
- "base-url-required": "Pamata URL ir nepieciešams.",
- "mail-from": "Pasts no",
- "mail-from-required": "Pasts no ir nepieciešams.",
- "smtp-protocol": "SMTP protokols",
- "smtp-host": "SMTP saimnieks",
- "smtp-host-required": "SMTP saimnieks ir nepieciešams.",
- "smtp-port": "SMTP ports",
- "smtp-port-required": "Jums vajag nodrošināt SMTP portu.",
- "smtp-port-invalid": "Tas neizskatās pēc atļauta SMTP porta.",
- "timeout-msec": "Pārtraukums (msec)",
- "timeout-required": "Pārtraukums ir nepieciešams.",
- "timeout-invalid": "Tas neizskatās pēc atļauta pārtraukuma.",
- "enable-tls": "Iespējot TLS",
- "send-test-mail": "Nosūtīt testa pastu"
- },
- "alarm": {
- "alarm": "Trauksme",
- "alarms": "Trauksmes",
- "select-alarm": "Atlasīt trauksmi",
- "no-alarms-matching": "Nav atbilstošu trauksmju '{{entity}}' .",
- "alarm-required": "Trauksme ir nepieciešama",
- "alarm-status": "Trauksmes statuss",
- "search-status": {
- "ANY": "Jebkura",
- "ACTIVE": "Aktīvs",
- "CLEARED": "Dzēsts",
- "ACK": "Apstiprināts",
- "UNACK": "Neapstiprināts"
- },
- "display-status": {
- "ACTIVE_UNACK": "Aktīvs Neapstiprināts",
- "ACTIVE_ACK": "Aktīvs Apstiprināts",
- "CLEARED_UNACK": "Dzēsts Neapstiprināts",
- "CLEARED_ACK": "Dzēsts Apstiprināts"
- },
- "no-alarms-prompt": "Trauksmes nav atrastas",
- "created-time": "Izveidošanas laiks",
- "type": "Tips",
- "severity": "Smaguma pakāpe",
- "originator": "Iniciātors",
- "originator-type": "Iniciātora tips",
- "details": "Detaļas",
- "status": "Statuss",
- "alarm-details": "Trauksmes detaļas",
- "start-time": "Sākuma laiks",
- "end-time": "Beigu laiks",
- "ack-time": "Apstiprinājuma laiks",
- "clear-time": "Notīrīšanas laiks",
- "severity-critical": "Smaguma pakāpe - kritiska",
- "severity-major": "Būtiska",
- "severity-minor": "Minora",
- "severity-warning": "Brīdinājums",
- "severity-indeterminate": "Nenoteikts",
- "acknowledge": "Apstiprināt",
- "clear": "Notīrīt",
- "search": "Meklēt trauksmes",
- "selected-alarms": "{ count, plural, 1 {1 alarm} other {# trauksmes} } selected",
- "no-data": "Nav datu ko attēlot",
- "polling-interval": "Trauksmju pārbaužu intervāls (sec)",
- "polling-interval-required": "Trauksmju pārbaužu intervāls ir nepieciešams.",
- "min-polling-interval-message": "Vismaz 1 sekundes pārbaužu intervāls ir atļauts.",
- "aknowledge-alarms-title": "Apstiprināt { count, plural, 1 {1 alarm} other {# trauksmes} }",
- "aknowledge-alarms-text": "Vai Jūs tiešām vēlaties apstirpināt { count, plural, 1 {1 alarm} other {# trauksmes} }?",
- "aknowledge-alarm-title": "Apstiprināt trauksmi",
- "aknowledge-alarm-text": "Vai Jūs tiešām vēlaties apstiprināt trauksmi?",
- "clear-alarms-title": "Dzēst { count, plural, 1 {1 alarm} other {# trauksmes} }",
- "clear-alarms-text": "Vai Jūs tiešām vēlaties dzēst { count, plural, 1 {1 alarm} other {# trauksmes} }?",
- "clear-alarm-title": "Dzēst trauksmi",
- "clear-alarm-text": "Vai Jūs tiešām vēlaties dzēst trauksmi?",
- "alarm-status-filter": "Trauksmes statusa filtrs"
- },
- "alias": {
- "add": "Pievienot segvārdu",
- "edit": "Rediģēt segvārdu",
- "name": "Segvārda nosaukums",
- "name-required": "Segvārda nosaukums vārds ir nepieciešams",
- "duplicate-alias": "Segvārds ar tādu pašu nosaukumu jau eksistē.",
- "filter-type-single-entity": "Viena vienība",
- "filter-type-entity-list": "Vienību saraksts",
- "filter-type-entity-name": "Vienības vārds",
- "filter-type-state-entity": "Vienība no paneļa stāvokļa",
- "filter-type-state-entity-description": "Vienība ņemta no paneļa stāvokļa parametriem",
- "filter-type-asset-type": "Aktīvu tips",
- "filter-type-asset-type-description": "Aktīvu tipi '{{assetType}}'",
- "filter-type-asset-type-and-name-description": "Aktīvu tips '{{assetType}}' un ar vārdu sākot ar '{{prefix}}'",
- "filter-type-device-type": "Iekārtas tips",
- "filter-type-device-type-description": "Iekārtas tipi '{{deviceType}}'",
- "filter-type-device-type-and-name-description": "Iekārtas tipi '{{deviceType}}' un ar vārdu sākot ar '{{prefix}}'",
- "filter-type-entity-view-type": "Vienības skata tips",
- "filter-type-entity-view-type-description": "Vienības skats tipam '{{entityView}}'",
- "filter-type-entity-view-type-and-name-description": "Vienības skats tipam '{{entityView}}' un ar vārdu sākot ar '{{prefix}}'",
- "filter-type-relations-query": "Attiecību vaicājums",
- "filter-type-relations-query-description": "{{entities}} kam ir {{relationType}} attiecība {{direction}} {{rootEntity}}",
- "filter-type-asset-search-query": "Aktīvu meklēšanas vaicājums",
- "filter-type-asset-search-query-description": "Aktīvi ar tipu {{assetTypes}} kam ir {{relationType}} attiecība {{direction}} {{rootEntity}}",
- "filter-type-device-search-query": "Iekārtu meklēšanas vaicājums",
- "filter-type-device-search-query-description": "Iekārtas ar tipu {{deviceTypes}} kam ir {{relationType}} attiecība {{direction}} {{rootEntity}}",
- "filter-type-entity-view-search-query": "Vienības skata meklēšanas vaicājuma",
- "filter-type-entity-view-search-query-description": "Vienību skats ar tipu {{entityViewTypes}} kam ir {{relationType}} attiecība {{direction}} {{rootEntity}}",
- "entity-filter": "Vienību filtrs",
- "resolve-multiple": "Atrisināt kā daudzas vienības",
- "filter-type": "Filtra tips",
- "filter-type-required": "Filtra tips ir nepieciešams.",
- "entity-filter-no-entity-matched": "Nav atrastas vienības kam atbilst filtru iestatījumi.",
- "no-entity-filter-specified": "Nav vienību filtrs specificēts",
- "root-state-entity": "Lieto paneļa statusa vienību kā sakni ",
- "root-entity": "Saknes vienības",
- "state-entity-parameter-name": "Statusa vienības parametra vārds",
- "default-state-entity": "Noklusējuma statusa vienība",
- "default-entity-parameter-name": "Pēc noklusējuma",
- "max-relation-level": "Maksimālais attiecību līmenis",
- "unlimited-level": "Nelimitēts līmenis",
- "state-entity": "Paneļa statusa vienība",
- "all-entities": "Visas vienības",
- "any-relation": "Jebkura"
- },
- "asset": {
- "asset": "Aktīvs",
- "assets": "Aktīvi",
- "management": "Aktīvu pārvaldība",
- "view-assets": "Skatīt aktīvus",
- "add": "Pievienot aktīvu",
- "assign-to-customer": "Pieškirt klientam",
- "assign-asset-to-customer": "Piešķirt aktīvu klientam",
- "assign-asset-to-customer-text": "Lūdzu izvēlēties aktīvu lai pieškirtu klientam",
- "no-assets-text": "Aktīvi nav atrasti",
- "assign-to-customer-text": "Lūdzu izvēlēties klientu lai pieškirtu aktīvu",
- "public": "Publisks",
- "assignedToCustomer": "Pieškirts klientam",
- "make-public": "Veidot aktīvu publisku",
- "make-private": "Veidot aktīvu privātu",
- "unassign-from-customer": "Noņemt klientam",
- "delete": "Dzēst aktīvu",
- "asset-public": "Aktīvs ir publisks",
- "asset-type": "Aktīva tips",
- "asset-type-required": "Aktīva tips ir nepieciešams.",
- "select-asset-type": "Izvēlies aktīva tipu",
- "enter-asset-type": "Ievadi aktīva tipu",
- "any-asset": "Jebkurš aktīvs",
- "no-asset-types-matching": "Nav atbilstošs aktīvu tips '{{entitySubtype}}' atrasts.",
- "asset-type-list-empty": "Nav aktīvu tipi izvēlēti.",
- "asset-types": "Aktīvu tipi",
- "name": "Vārds",
- "name-required": "Vārds ir nepieciešams.",
- "description": "Apraksts",
- "type": "Tips",
- "type-required": "Tips ir nepieciešams.",
- "details": "Detaļas",
- "events": "Notikumi",
- "add-asset-text": "Pievieno jaunu aktīvu",
- "asset-details": "Aktīvu detaļas",
- "assign-assets": "Piešķirt aktīvus",
- "assign-assets-text": "Piešķirt { count, plural, 1 {1 asset} other {# aktīvus} } klientam",
- "delete-assets": "Dzēst aktīvus",
- "unassign-assets": "Noņemt aktīvus",
- "unassign-assets-action-title": "Noņemt { count, plural, 1 {1 asset} other {# aktīvus} } no klienta",
- "assign-new-asset": "Pieškirt jaunu aktīvu",
- "delete-asset-title": "Vai esat pārliecināts,ka vēlaties dzēst aktīvu '{{assetName}}'?",
- "delete-asset-text": "Esiet uzmanīgs, pēc apstiprināšanas aktīvs un saistītie dati nebūs atjaunojami.",
- "delete-assets-title": "Vai esat pārliecināts ka vēlaties dzēst { count, plural, 1 {1 asset} other {# aktīvus} }?",
- "delete-assets-action-title": "Dzēst { count, plural, 1 {1 asset} citu {# aktīvus} }",
- "delete-assets-text": "Esiet uzmanīgs, pēc apstiprinājuma visi izvēlētie aktīvi tiks dzēsti un saistītā informācija nebūs atjaunojama.",
- "make-public-asset-title": "Vai esat pārliecināts ka vēlaties aktīvu '{{assetName}}' veidot publisku?",
- "make-public-asset-text": "Pēc apstiprinājuma aktīvs un tā dati tiks publiski pieejami.",
- "make-private-asset-title": "Vai esat pārliecināts ka vēlaties aktīvu '{{assetName}}' veidot privātu?",
- "make-private-asset-text": "Pēc apstiprinājums aktīvs un tā saistītie dati būs privāti un nebūs pieejami citiem.",
- "unassign-asset-title": "Vai esat pārliecināts ka vēlaties noņemt aktīvu '{{assetName}}'?",
- "unassign-asset-text": "Pēc apstiprināšanas aktīvs tiks noņemts un nebūs pieejams klientiem.",
- "unassign-asset": "Noņemt aktīvu",
- "unassign-assets-title": "Vai esat pārliecināts ka vēlaties noņemt { count, plural, 1 {1 asset} citu {# aktīvus} }?",
- "unassign-assets-text": "Pēc apstiprināšanas visi izvēlētie aktīvi būs noņemti un nebūs pieejami klientiem.",
- "copyId": "Kopēt aktīva Id",
- "idCopiedMessage": "Aktīva Id ir kopēts uz starpliktuvi",
- "select-asset": "Atlasīt aktīvu",
- "no-assets-matching": "Nav atbilstošs aktīvs '{{entity}}' atrasts.",
- "asset-required": "Aktīvs ir nepieciešams",
- "name-starts-with": "Aktīva vārds sākas ar",
- "import": "Importēt aktīvus",
- "asset-file": "Aktīvu fails"
- },
- "attribute": {
- "attributes": "Attribūti",
- "latest-telemetry": "Jaunākā telemetrija",
- "attributes-scope": "Vienības atribūtu darbības joma",
- "scope-latest-telemetry": "Jaunākā telemetrija",
- "scope-client": "Klientu atribūti",
- "scope-server": "Servera atribūti",
- "scope-shared": "Dalītie atribūti",
- "add": "Pievieno atribūtu",
- "key": "Atslēga",
- "last-update-time": "Pēdēja atjaunojuma laiks",
- "key-required": "Atribūta atslēga ir nepieciešama.",
- "value": "Vērtība",
- "value-required": "Atribūta vērtība ir nepieciešama.",
- "delete-attributes-title": "Vai esat pārliecināts ka vēlaties dzēst { count, plural, 1 {1 attribute} other {# attribūtus} }?",
- "delete-attributes-text": "Esiet uzmanīgs, pēc apstiprinājuma visi izvēlētie atribūti tiks dzēsti.",
- "delete-attributes": "Dzēst atribūtu",
- "enter-attribute-value": "Ievadiet atribūta vērtību",
- "show-on-widget": "Parādīt logrīkā",
- "widget-mode": "Logrīka režīms",
- "next-widget": "Nākamais logrīks",
- "prev-widget": "Iepriekšējais logrīks",
- "add-to-dashboard": "Pievienot panelim",
- "add-widget-to-dashboard": "Pievienot logrīku panelim",
- "selected-attributes": "{ count, plural, 1 {1 attribute} other {# atribūtus} } izvēlētajam",
- "selected-telemetry": "{ count, plural, 1 {1 telemetry unit} other {# telemetrijas vienības} } izvēlētas"
- },
- "audit-log": {
- "audit": "Audits",
- "audit-logs": "Audita logs",
- "timestamp": "Laika zīmogs",
- "entity-type": "Vienības tips",
- "entity-name": "Vienības vārds",
- "user": "Lietotājs",
- "type": "Tips",
- "status": "Statuss",
- "details": "Detaļas",
- "type-added": "Pievienots",
- "type-deleted": "Dzēsts",
- "type-updated": "Atjaunots",
- "type-attributes-updated": "Atribūti atjaunoti",
- "type-attributes-deleted": "Atribūti dzēsti",
- "type-rpc-call": "RPC izsaukumi",
- "type-credentials-updated": "Akreditācijas dati atjaunoti",
- "type-assigned-to-customer": "Pieškirts klientam",
- "type-unassigned-from-customer": "Noņemts no klienta",
- "type-activated": "Aktivizēts",
- "type-suspended": "Apturēts",
- "type-credentials-read": "Akreditācijas datu nolasījums",
- "type-attributes-read": "Atribūtu nolasījums",
- "type-relation-add-or-update": "Attiecība atjaunota",
- "type-relation-delete": "Atiecība dzēsta",
- "type-relations-delete": "Visas attiecības dzēstas",
- "type-alarm-ack": "Apstiprinājums",
- "type-alarm-clear": "Notīrīts",
- "status-success": "Sekmīgi",
- "status-failure": "Neveiksme",
- "audit-log-details": "Audita loga detaļas",
- "no-audit-logs-prompt": "Nav logu atrastu",
- "action-data": "Aktivitāšu dati",
- "failure-details": "Neveiksmju detaļas",
- "search": "Meklēt audita logus",
- "clear-search": "Notīrīt meklēšanu"
- },
- "confirm-on-exit": {
- "message": "Jums ir nesaglabātas izmaiņas. Vai tiešām vēlaties pamest šo lapu?",
- "html-message": "Jums ir nesaglabātas izmaiņas.
Vai tiešām vēlaties pamest šo lapu?",
- "title": "Nesaglabātas izmaiņas"
- },
- "contact": {
- "country": "Valsts",
- "city": "Pilsēta",
- "state": "Štats/Province",
- "postal-code": "Zip / Pasta kods",
- "postal-code-invalid": "Invalīds Zip / Pasta koda formāts.",
- "address": "Adrese",
- "address2": "Adrese 2",
- "phone": "Telefons",
- "email": "Email",
- "no-address": "Nav adreses"
- },
- "common": {
- "username": "Lietotājvārdse",
- "password": "Parole",
- "enter-username": "Ievadiet lietotājvārdu",
- "enter-password": "Ievadiet paroli",
- "enter-search": "Ievadiet meklēt"
- },
- "content-type": {
- "json": "Json",
- "text": "Teksts",
- "binary": "Bināri (Base64)"
- },
- "customer": {
- "customer": "Klients",
- "customers": "Klienti",
- "management": "Klientu pārvaldība",
- "dashboard": "Klientu panelis",
- "dashboards": "Klientu paneļi",
- "devices": "Klienta iekārtas",
- "entity-views": "Klienta vienību skati",
- "assets": "Klienta aktīvi",
- "public-dashboards": "Publiskie paneļi",
- "public-devices": "Publiskās iekārtas",
- "public-assets": "Publiskie aktīvi",
- "public-entity-views": "Publisko vienību skati",
- "add": "Pievienot klientu",
- "delete": "Dzēst klientu",
- "manage-customer-users": "Pārvaldīt klienta lietotājus",
- "manage-customer-devices": "Pārvaldīt klienta iekārtas",
- "manage-customer-dashboards": "Pārvaldīt klienta paneļus",
- "manage-public-devices": "Pārvaldīt publiskās iekārtas",
- "manage-public-dashboards": "Pārvaldīt publiskos paneļus",
- "manage-customer-assets": "Pārvaldīt klienta aktīvus",
- "manage-public-assets": "Pārvaldīt publiskos aktīvus",
- "add-customer-text": "Pievienot jaunu klientu",
- "no-customers-text": "Nav klienti atrasti",
- "customer-details": "Klienta detaļas",
- "delete-customer-title": "Vai esat pārliecināts, ka vēlaties dzēst klientu '{{customerTitle}}'?",
- "delete-customer-text": "Esiet uzmanīgs, pēc apstiprinājuma klients un tā saistītie dati nebūs atjaunojami.",
- "delete-customers-title": "Vai esat pārliecināts, ka vēlaties dzēst { count, plural, 1 {1 customer} other {# klientus} }?",
- "delete-customers-action-title": "Dzēst { count, plural, 1 {1 customer} other {# klientus} }",
- "delete-customers-text": "Esiet uzmanīgs, pēc apstiprinājuma visi izvēlētie klienti tisk dzēsti un to saistītie dati nebūs atjaunojami.",
- "manage-users": "Pārvaldīt lietotājus",
- "manage-assets": "Pārvaldīt aktīvus",
- "manage-devices": "Pārvaldīt iekārtas",
- "manage-dashboards": "Pārvaldīt paneļus",
- "title": "Virsraksts",
- "title-required": "Virsraksts ir nepieciešams.",
- "description": "Apraksts",
- "details": "Detaļas",
- "events": "Notikumi",
- "copyId": "Kopēt klienta Id",
- "idCopiedMessage": "Klienta Id ir kopēts uz starpliktuvi",
- "select-customer": "Atlasīt klientu",
- "no-customers-matching": "Nav atbilstoši klienti '{{entity}}' atrasti.",
- "customer-required": "Klients ir nepieciešams",
- "select-default-customer": "Atlasīt pamata klientu",
- "default-customer": "Pamata klients",
- "default-customer-required": "Pamata klients ir nepieciešams lai atkļūdotu paneli īrnieka līmenī"
- },
- "datetime": {
- "date-from": "Datums no",
- "time-from": "Laiks no",
- "date-to": "Datums līdz",
- "time-to": "Laiks līdz"
- },
- "dashboard": {
- "dashboard": "Panelis",
- "dashboards": "Paneļi",
- "management": "Paneļu pārvaldība",
- "view-dashboards": "Skatīt paneļus",
- "add": "Pievienot paneļus",
- "assign-dashboard-to-customer": "Piešķirt paneļus klientam",
- "assign-dashboard-to-customer-text": "Lūdzu izvēlēties paneļus lai piešķirtu tos klientam",
- "assign-to-customer-text": "Lūdzu izvēlēties klientu, kuram piešķirt paneļus",
- "assign-to-customer": "Piešķirt klientam",
- "unassign-from-customer": "Noņemt no klienta",
- "make-public": "Veidot paneli publisku",
- "make-private": "Veidot paneli privātu",
- "manage-assigned-customers": "Pārvaldīt piešķirtos klientus",
- "assigned-customers": "Piešķirtie klienti",
- "assign-to-customers": "Piešķirt paneļus klientiem",
- "assign-to-customers-text": "Lūdzu atlasīt klientus lai pieškirtu paneļus",
- "unassign-from-customers": "Noņemt no klientiem paneļus",
- "unassign-from-customers-text": "Lūdzu atlasīt klientus kuriem noņemt paneļus",
- "no-dashboards-text": "Nav paneļi atrasti",
- "no-widgets": "Nav logrīki konfigurēti",
- "add-widget": "Pievienot jaunu logrīku",
- "title": "Virsraksts",
- "select-widget-title": "Atlasīt logrīku",
- "select-widget-subtitle": "Pieejamo logrīku tipu saraksts",
- "delete": "Dzēst paneli",
- "title-required": "Virsraksts ir nepieciešams.",
- "description": "Apraksts",
- "details": "Detaļas",
- "dashboard-details": "Paneļa detaļas",
- "add-dashboard-text": "Pievienot jaunu paneli",
- "assign-dashboards": "Pieškirt paneļus",
- "assign-new-dashboard": "Pieškirt jaunu paneli",
- "assign-dashboards-text": "Pieškirt { count, plural, 1 {1 dashboard} other {# paneļus} } klientiem",
- "unassign-dashboards-action-text": "Noņemt { count, plural, 1 {1 dashboard} other {# paneļus} } no klientiem",
- "delete-dashboards": "Dzēst paneļus",
- "unassign-dashboards": "Noņemt paneļus",
- "unassign-dashboards-action-title": "Noņemt { count, plural, 1 {1 dashboard} other {# paneļus} } no klienta",
- "delete-dashboard-title": "Vai esat pārliecināts ka vēlaties dzēst paneli '{{dashboardTitle}}'?",
- "delete-dashboard-text": "Esiet uzmanīgs, pēc apstiprinājuma panelis un visi tā saistītie dati nebūs atjaunojami.",
- "delete-dashboards-title": "Vai esat pārliecināts ka vēlaties dzēst { count, plural, 1 {1 dashboard} other {# paneļus} }?",
- "delete-dashboards-action-title": "Dzēst { count, plural, 1 {1 dashboard} other {# paneļus} }",
- "delete-dashboards-text": "Esiet uzmanīgs, pēc apstiprinājuma visi izvēlētie paneļi būs noņemti un visi saistitie dati nebūs atjaunojami.",
- "unassign-dashboard-title": "Vai esat pārliecināts, ka vēlaties noņemt paneli '{{dashboardTitle}}'?",
- "unassign-dashboard-text": "Pēc apstiprinājuma panelis tiks noņemts un nebūs pieejams klientam.",
- "unassign-dashboard": "Noņemt paneli",
- "unassign-dashboards-title": "Vai esat pārliecināts ka vēlaties noņemt { count, plural, 1 {1 dashboard} other {# paneļus} }?",
- "unassign-dashboards-text": "Pēc apstiprinājuma visi izvēlētie paneļi būs noņemti un nebūs pieejami klientam.",
- "public-dashboard-title": "Panelis tagad ir publisks",
- "public-dashboard-text": "Jūsu panelis {{dashboardTitle}} tagad ir publisks un pieejams pēc saites link:",
- "public-dashboard-notice": "Note: Neaizmirstie veidot attiecīgās iekārtas publiski pieejamas lai piekļutu to datiem.",
- "make-private-dashboard-title": "Vai esat pārliecināts, ka vēlaties veidot paneli '{{dashboardTitle}}' privātu?",
- "make-private-dashboard-text": "Pēc apstiprinājuma panelis būs privāts un nebūs pieejams citiem.",
- "make-private-dashboard": "Veidot paneli privātu",
- "socialshare-text": "'{{dashboardTitle}}' atbalsts no TeT",
- "socialshare-title": "'{{dashboardTitle}}' atbalsts no TeT",
- "select-dashboard": "Atlasīt paneli",
- "no-dashboards-matching": "Nav atbilstoši paneļi '{{entity}}' atrasti.",
- "dashboard-required": "Penelis ir nepieciešams.",
- "select-existing": "Atlasīt paneli",
- "create-new": "Radīt jaunu paneli",
- "new-dashboard-title": "Jauns paneļa Virsraksts",
- "open-dashboard": "Atvērt paneli",
- "set-background": "Iestatīt fonu",
- "background-color": "Fona krāsa",
- "background-image": "Fona attēls",
- "background-size-mode": "Fona lieluma mode",
- "no-image": "Nav izvēlēts attēls",
- "drop-image": "Nomest attēlu vai noklikšķiniet lai atlasītu failu augšupielādei.",
- "settings": "Iestatījumi",
- "columns-count": "Kolonu skaitīšana",
- "columns-count-required": "Kolonu skaitīšana ir nepieciešams.",
- "min-columns-count-message": "Tikai minimums 10 kolonu skaitīšana ir atļauta.",
- "max-columns-count-message": "Tikai maksimums 100 kolonu skaitīšana ir atļauta.",
- "widgets-margins": "Robeža starp logrīkiem",
- "horizontal-margin": "Horizontālā robeža",
- "horizontal-margin-required": "Horizontālās robežas vērtība ir nepieciešama.",
- "min-horizontal-margin-message": "Tikai 0 ir atļauta kā minimālā horizontālās robežas vērtība.",
- "max-horizontal-margin-message": "Tikai 50 ir atļauta kā maksimālā horizontālās robežas vērtība.",
- "vertical-margin": "Vertikālā robeža",
- "vertical-margin-required": "Vertikālās robežas vērtība ir nepieciešama.",
- "min-vertical-margin-message": "Tikai 0 ir atļauta kā minimālā vertikālās robežas vērtība.",
- "max-vertical-margin-message": "Tikai 50 ir atļauta kā maksimālā vertikālās robežas vērtība.",
- "autofill-height": "Automātiskās aizpildīšanas izkārtojuma augstums",
- "mobile-layout": "Mobilā izkārtojuma iestatījumi",
- "mobile-row-height": "Mobilās rindas augstums, px",
- "mobile-row-height-required": "Mobile row height value is required.",
- "min-mobile-row-height-message": "Tikai 5 pikseļi ir atļauti kā minimālās mobilās rindas augstuma vērtības.",
- "max-mobile-row-height-message": "Tikai 200 pikseļi ir atļauti kā maksimālās mobilās rindas augstuma vērtības.",
- "display-title": "Parādīt paneļa virsrakstu",
- "toolbar-always-open": "Turēt rīkjoslu atvērtu",
- "title-color": "Virsraksta krāsa",
- "display-dashboards-selection": "Parādīt paneļa izvēli",
- "display-entities-selection": "Parādīt vienību izvēli",
- "display-dashboard-timewindow": "Parādīt laika logu",
- "display-dashboard-export": "Parādīt eksportu",
- "import": "Importēt paneli",
- "export": "Eksportēt panelis",
- "export-failed-error": "Nav iespējams eksportēt paneli: {{error}}",
- "create-new-dashboard": "Radīt jaunu paneli",
- "dashboard-file": "Paneļa fails",
- "invalid-dashboard-file-error": "Nav iespējams importēt paneli: Invalīda paneļa datu struktūra.",
- "dashboard-import-missing-aliases-title": "Jānokonfigurē segvārdi kas lietoti importētajā panelī",
- "create-new-widget": "Radīt jaunu logrīku",
- "import-widget": "Importēt logrīku",
- "widget-file": "Logrīka fails",
- "invalid-widget-file-error": "Nav iespējams importēt logrīku: Invalīda logrīka datu struktūra.",
- "widget-import-missing-aliases-title": "Jānokonfigurē segvārdi kas lietoti importētajā logrīkā",
- "open-toolbar": "Atvērt paneļa rīkjoslu",
- "close-toolbar": "Aizvērt rīkjoslu",
- "configuration-error": "Konfigurācijas kļūda",
- "alias-resolution-error-title": "Paneļa segvārdu konfigurācijas kļūda",
- "invalid-aliases-config": "Nav iespējams atrast nevienu iekārtu kam atbilst kāds no segvārdu filtriem.
Lūdzu sazinieties ar savu administrātoru.",
- "select-devices": "Atlasīt iekārtas",
- "assignedToCustomer": "Pišķirtas klientam",
- "assignedToCustomers": "Piešķirtas klientiem",
- "public": "Publisks",
- "public-link": "Publiska saite",
- "copy-public-link": "Kopēt publisku saiti",
- "public-link-copied-message": "Paneļa publiskā saite ir kopēta starpliktuvē",
- "manage-states": "Pārvaldīt paneļa stāvokļus",
- "states": "Paneļa stāvokļi",
- "search-states": "Meklēt paneļa stāvokļus",
- "selected-states": "{ count, plural, 1 {1 dashboard state} other {# paneļu statusus} } atlasītos",
- "edit-state": "Rediģēt paneļa stāvokli",
- "delete-state": "Dzēst paneļa stāvokli",
- "add-state": "Pievienot paneļa stāvokli",
- "state": "Paneļa stāvoklis",
- "state-name": "Nosaukums",
- "state-name-required": "Paneļa stāvokļa nosaukums ir nepieciešams.",
- "state-id": "Stāvokļa Id",
- "state-id-required": "Paneļa stāvokļa Id ir nepieciešams.",
- "state-id-exists": "Paneļa stāvoklis ar šādu Id jau eksistē.",
- "is-root-state": "Saknes stāvoklis",
- "delete-state-title": "Dzēst paneļa stāvokli",
- "delete-state-text": "Vai esat pārliecināts ka vēlaties dzēst paneļa stāvokli ar nosaukumu '{{stateName}}'?",
- "show-details": "Rādīt detaļas",
- "hide-details": "Noslēpt detaļas",
- "select-state": "Atlasīt mērķa stāvokli",
- "state-controller": "Stavokļa kontrolieris"
- },
- "datakey": {
- "settings": "Iestatījumi",
- "advanced": "Pieredzējis lietotājs",
- "label": "Etiķete",
- "color": "Krāsa",
- "units": "Speciāls simbols, ko parādīt pēc vērtība",
- "decimals": "Ciparu skaits aiz komata",
- "data-generation-func": "Datu ģenerācijas funkcija",
- "use-data-post-processing-func": "Lietot datu pēcapstrādes funkciju",
- "configuration": "Datu atslēgu konfigurācija",
- "timeseries": "Laika periodi",
- "attributes": "Atribūti",
- "alarm": "Trauksme",
- "timeseries-required": "Vienības laika periodi ir nepieciešami.",
- "timeseries-or-attributes-required": "Vienības laika periodi/atribūti ir nepieciešami.",
- "maximum-timeseries-or-attributes": "Maksimums { count, plural, 1 {1 timeseries/attribute is allowed.} other {# laika sērijas/atribūti ir atļauti} }",
- "alarm-fields-required": "Trauksmes lauki ir nepieciešami.",
- "function-types": "Funkciju tipi",
- "function-types-required": "Funkciju tipi ir nepieciešami.",
- "maximum-function-types": "Maksimums { count, plural, 1 {1 function type is allowed.} other {# funkciju tipi ir atļauti} }",
- "time-description": "Laika zīmogs patreizējai vērtībai;",
- "value-description": "patreizējā vērtība;",
- "prev-value-description": "rezultāts no iepriekšējā funkciju pieprasījuma;",
- "time-prev-description": "Laika zīmogs no iepriekšējās vērtības;",
- "prev-orig-value-description": "Oriģinālā iepriekšējā vērtība;"
- },
- "datasource": {
- "type": "Datu avota tips",
- "name": "Nosaukums",
- "add-datasource-prompt": "Lūdzu pievienot datu avotu"
- },
- "details": {
- "edit-mode": "Rediģēšanas mode",
- "toggle-edit-mode": "Pārslēgt rediģēšanas modi"
- },
- "device": {
- "device": "Iekārta",
- "device-required": "Iekārta ir nepieciešama.",
- "devices": "Iekārtas",
- "management": "Iekārtu pārvaldība",
- "view-devices": "Skatīt iekārtas",
- "device-alias": "Iekārtu segvārdi",
- "aliases": "Iekārtas segvārdi",
- "no-alias-matching": "'{{alias}}' nav atrasti.",
- "no-aliases-found": "Nav segvārdi atrasti.",
- "no-key-matching": "'{{key}}' nav atrasti.",
- "no-keys-found": "Nav atslēgas atrastas.",
- "create-new-alias": "Radīt jaunu!",
- "create-new-key": "Radīt jaunu!",
- "duplicate-alias-error": "Dublēti segvārdi atrasti '{{alias}}'.
Iekārtas segvārdiem ir jābūt unikāliem panelī.",
- "configure-alias": "Konfigurēt '{{alias}}' segvārdus",
- "no-devices-matching": "Nav iekārtu atbilstības '{{entity}}' atrastas.",
- "alias": "Segvārdi",
- "alias-required": "Iekārtu segvārdi ir nepieciešami.",
- "remove-alias": "Noņemt iekārtas segvārdus",
- "add-alias": "Pievienot iekārtas segvārdus",
- "name-starts-with": "Iekārtas nosaukums sākas ar",
- "device-list": "Iekārtu saraksts",
- "use-device-name-filter": "Lietot filtru",
- "device-list-empty": "Nav iekārtas atlasītas.",
- "device-name-filter-required": "Iekārtas nosaukuma filtrs ir nepieciešams.",
- "device-name-filter-no-device-matched": "Nav iekārtas kas sākas ar '{{device}}' atrastas.",
- "add": "Pievienot iekārtu",
- "assign-to-customer": "Piešķirt klientam",
- "assign-device-to-customer": "Piešķirt iekārtas klientam",
- "assign-device-to-customer-text": "Lūdzu atlasīt iekārtas lai pieškirtu klientam",
- "make-public": "Veidot iekārtu publisku",
- "make-private": "Veidot iekārtu privātu",
- "no-devices-text": "Nav iekārtas atrastas",
- "assign-to-customer-text": "Lūdzu atlasīt klientu lai pieškirtu iekārtas",
- "device-details": "iekārtas detaļas",
- "add-device-text": "Pievienot jaunu iekārtu",
- "credentials": "Akreditācijas dati",
- "manage-credentials": "Pārvaldīt akreditācijas datus",
- "delete": "Dzēst iekārtu",
- "assign-devices": "Pieškirt iekārtas",
- "assign-devices-text": "Piešķirt { count, plural, 1 {1 device} other {# iekārtas} } klientam",
- "delete-devices": "Dzēst iekārtas",
- "unassign-from-customer": "Noņemt no klienta",
- "unassign-devices": "Noņemt iekārtas",
- "unassign-devices-action-title": "Noņemt { count, plural, 1 {1 device} other {# iekārtas} } no klienta",
- "assign-new-device": "Pieškirt jaunu iekārtu",
- "make-public-device-title": "Vai esat pārliecināts ka vēlaties veidot iekārtu '{{deviceName}}' publisku?",
- "make-public-device-text": "Pēc apstiprinājuma iekārta un tās saistītie dati būs pieejami publiski un pieejami citiem.",
- "make-private-device-title": "vai esat pārliecināts ka vēlaties veidot iekārtu '{{deviceName}}' privāti?",
- "make-private-device-text": "Pēc apstiprinājuma iekārta un tās saistītie dati būs pieejami privāti un nebūs pieejami citiem.",
- "view-credentials": "Skatīt akreditācijas datus",
- "delete-device-title": "Vai esat pārliecināts, ka vēlaties dzēst iekārtu '{{deviceName}}'?",
- "delete-device-text": "Esat uzmanīgs, pēc apstiprinājuma iekārta un tās saistītie dati nebūs atjaunojami.",
- "delete-devices-title": "Vai esat pārliecināts, ka vēlaties dzēst { count, plural, 1 {1 device} other {# iekārtas} }?",
- "delete-devices-action-title": "Dzēst { count, plural, 1 {1 device} other {# iekārtas} }",
- "delete-devices-text": "Esat uzmanīgs, pēc apstiprinājuma iekārtas un to saistītie dati tiks noņemti un nebūs atjaunojami.",
- "unassign-device-title": "Vai esat pārliecināts, ka vēlaties noņemt iekārtu '{{deviceName}}'?",
- "unassign-device-text": "Pēc apstiprinājuma iekārta tiks noņemta un nebūs pieejama klientam.",
- "unassign-device": "Noņemt iekārtu",
- "unassign-devices-title": "Vai esat pārliecināts, ka vēlaties noņemt { count, plural, 1 {1 device} other {# iekārtas} }?",
- "unassign-devices-text": "Pēc apstipinājuma visas atlasītās iekārtas būs noņemtas un nebūs pieejamas klientam.",
- "device-credentials": "iekārtas akreditācijas dati",
- "credentials-type": "Akreditācijas datu tips",
- "access-token": "Piekļuves tokens",
- "access-token-required": "Piekļuves tokens ir nepieciešams.",
- "access-token-invalid": "Piekļuves tokena garumam ir jābūt no 1 līdz 20 rakstzīmēm.",
- "rsa-key": "RSA publiskā atslēga",
- "rsa-key-required": "RSA publiskā atslēga ir nepieciešama.",
- "secret": "Noslēpums",
- "secret-required": "Noslēpums ir nepieciešams.",
- "device-type": "Iekārtas tips",
- "device-type-required": "Iekārtas tips ir nepieciešams.",
- "select-device-type": "Atlasīt iekārtas tipu",
- "enter-device-type": "Ievadīt iekārtas tipu",
- "any-device": "Jebkura iekārta",
- "no-device-types-matching": "Nav iekārtas tipa saderības '{{entitySubtype}}' atrastas.",
- "device-type-list-empty": "Nav iekārtas tipi izvēlēti.",
- "device-types": "Iekārtas tipi",
- "name": "Nosaukums",
- "name-required": "Nosaukums ir nepieciešams.",
- "description": "Apraksts",
- "label": "Etiķete",
- "events": "Notikumi",
- "details": "Detaļas",
- "copyId": "Kopēt iekārtas Id",
- "copyAccessToken": "Kopēt piekļuves tokenu",
- "idCopiedMessage": "iekārtas Id ir kopēts uz starpliktuvi",
- "accessTokenCopiedMessage": "Iekārtas piekļuves tokens ir kopēts uz starpliktuvi",
- "assignedToCustomer": "Piešķirts klientam",
- "unable-delete-device-alias-title": "Nav iespējas dzēst iekārtas segvārdus",
- "unable-delete-device-alias-text": "Iekārtas segvārdi '{{deviceAlias}}' nevar būt dzēsti, jo tie lietoti sekojošajos logrīkos:
{{widgetsList}}",
- "is-gateway": "Tā ir vārteja",
- "public": "Publisks",
- "device-public": "Iekārta ir publiska",
- "select-device": "Atlasīt iekārtu",
- "import": "Importēt iekārtu",
- "device-file": "Iekārtas fails"
- },
- "dialog": {
- "close": "Aizvērt dialogu"
- },
- "direction": {
- "column": "Kolona",
- "row": "Rinda"
- },
- "error": {
- "unable-to-connect": "Nav iespējams pievienoties serverim! Lūdzu pārbaudīt interneta savienojumu.",
- "unhandled-error-code": "Neapstrādāta kļūda: {{errorCode}}",
- "unknown-error": "Nezināma kļūda"
- },
- "entity": {
- "entity": "Vienība",
- "entities": "Vienības",
- "aliases": "Vienību segvārdi",
- "entity-alias": "Vienību segvārdi",
- "unable-delete-entity-alias-title": "Nav iespējams dzēst vienību segvārdus",
- "unable-delete-entity-alias-text": "Vienību segvārdi '{{entityAlias}}' nevar tikt dzēsti, jo tos izmanto sekojošie logrīki:
{{widgetsList}}",
- "duplicate-alias-error": "Dublikāti segvārdi atrasti '{{alias}}'.
Vienību segvārdiem ir jābūt unikāliem paneļos.",
- "missing-entity-filter-error": "Filtrs trūkst priekš segvārda '{{alias}}'.",
- "configure-alias": "Konfigurēt '{{alias}}' segvārdus",
- "alias": "Segvārds",
- "alias-required": "Vienību segvārds ir nepieciešams.",
- "remove-alias": "Noņemt vienību segvārdu",
- "add-alias": "Pievienot vienību segvārdu",
- "entity-list": "Vienību saraksts",
- "entity-type": "Vienības tips",
- "entity-types": "Vienības tipi",
- "entity-type-list": "Vienības tipu saraksts",
- "any-entity": "Jebkura vienība",
- "enter-entity-type": "Ievadīt vienības tipu",
- "no-entities-matching": "Nav vienības saderības '{{entity}}' atrastas.",
- "no-entity-types-matching": "Nav vienības tipu saderības '{{entityType}}' atrastas.",
- "name-starts-with": "Nosaukums sākas ar",
- "use-entity-name-filter": "Lietot filtru",
- "entity-list-empty": "Nav vienības atlasītas.",
- "entity-type-list-empty": "Nav vienības tipi atlasīti.",
- "entity-name-filter-required": "Vienību nosaukuma filtri ir vajadzīgi.",
- "entity-name-filter-no-entity-matched": "Nav vienības kas sākas ar '{{entity}}' atrastas.",
- "all-subtypes": "Visi",
- "select-entities": "Atlasīt vienības",
- "no-aliases-found": "Nav segvārdi atrasti.",
- "no-alias-matching": "'{{alias}}' nav atrasts.",
- "create-new-alias": "Radīt jaunu!",
- "key": "Atslēga",
- "key-name": "Atslēgas nosaukums",
- "no-keys-found": "Nav atslēgas atrastas.",
- "no-key-matching": "'{{key}}' nav atrasta.",
- "create-new-key": "Radīt jaunu!",
- "type": "Tips",
- "type-required": "Vienības tips ir nepieciešams.",
- "type-device": "Iekārta",
- "type-devices": "Iekārtas",
- "list-of-devices": "{ count, plural, 1 {One device} other {List of # iekārtas} }",
- "device-name-starts-with": "Iekārtas, kuras nosaukumi sākas ar '{{prefix}}'",
- "type-asset": "Aktīvs",
- "type-assets": "Aktīvi",
- "list-of-assets": "{ count, plural, 1 {One asset} other {List of # aktīvi} }",
- "asset-name-starts-with": "Aktīvi, kuru nosaukumi sākas ar '{{prefix}}'",
- "type-entity-view": "Vienības skats View",
- "type-entity-views": "Vienības skati",
- "list-of-entity-views": "{ count, plural, 1 {One entity view} other {List of # vienību skati} }",
- "entity-view-name-starts-with": "Vienibas skati, kuru nosaukumi sākas ar '{{prefix}}'",
- "type-rule": "Noteikums",
- "type-rules": "Noteikumi",
- "list-of-rules": "{ count, plural, 1 {One rule} other {List of # noteikumi} }",
- "rule-name-starts-with": "Noteikumi, kuru nosaukumi sākas ar '{{prefix}}'",
- "type-plugin": "Spraudnis",
- "type-plugins": "Spraudņi",
- "list-of-plugins": "{ count, plural, 1 {One plugin} other {List of # spraudņi} }",
- "plugin-name-starts-with": "Spraudņi, kuru vārds sākas ar '{{prefix}}'",
- "type-tenant": "Īrnieks",
- "type-tenants": "Īrnieki",
- "list-of-tenants": "{ count, plural, 1 {One tenant} other {List of # īrnieki} }",
- "tenant-name-starts-with": "Īrnieki, kuru nosaukumi sākas ar '{{prefix}}'",
- "type-customer": "Klients",
- "type-customers": "Klienti",
- "list-of-customers": "{ count, plural, 1 {One customer} other {List of # klienti} }",
- "customer-name-starts-with": "Klienti, kuru nosaukumi sākas ar '{{prefix}}'",
- "type-user": "Lietotājs",
- "type-users": "Lietotāji",
- "list-of-users": "{ count, plural, 1 {One user} other {List of # lietotāji} }",
- "user-name-starts-with": "Lietotāji, kuru nosaukums sākas ar '{{prefix}}'",
- "type-dashboard": "Panelis",
- "type-dashboards": "Paneļi",
- "list-of-dashboards": "{ count, plural, 1 {One dashboard} other {List of # paneļi} }",
- "dashboard-name-starts-with": "Paneļi, kuru nosaukums sākas ar '{{prefix}}'",
- "type-alarm": "Trauksme",
- "type-alarms": "Trauksmes",
- "list-of-alarms": "{ count, plural, 1 {One alarms} other {List of # trauksmes} }",
- "alarm-name-starts-with": "Trauksmes, kuru nosaukumi sākas ar '{{prefix}}'",
- "type-rulechain": "Noteikumu ķēde",
- "type-rulechains": "Noteikumu ķēdes",
- "list-of-rulechains": "{ count, plural, 1 {One rule chain} other {List of # noteikumu ķēdes} }",
- "rulechain-name-starts-with": "Noteikumu ķēdes, kuru nosaukumi sākas ar '{{prefix}}'",
- "type-rulenode": "Noteikumu node",
- "type-rulenodes": "Noteikumu nodes",
- "list-of-rulenodes": "{ count, plural, 1 {One rule node} other {List of # noteikumu nodes} }",
- "rulenode-name-starts-with": "Noteikumu nodes, juru nosaukumi sākas ar '{{prefix}}'",
- "type-current-customer": "Pašreizējais klients",
- "search": "Meklēšanas vienības",
- "selected-entities": "{ count, plural, 1 {1 entity} other {# vienības} } atlasītas",
- "entity-name": "Vienības nosaukums",
- "details": "Vienības detaļas",
- "no-entities-prompt": "Nav vienības atrastas",
- "no-data": "Nav datu ko attēlot",
- "columns-to-display": "Kolonas ko attēlot"
- },
- "entity-view": {
- "entity-view": "Vienības skats",
- "entity-view-required": "Vienības skats ir nepieciešams.",
- "entity-views": "Vienības skati",
- "management": "Vienības skatu pārvaldība",
- "view-entity-views": "Skatīt vienību skatus",
- "entity-view-alias": "Vienību skatu segvārdi",
- "aliases": "Vienību skatu segvārdi",
- "no-alias-matching": "'{{alias}}' nav atrasts.",
- "no-aliases-found": "Nav segvārds atrasts.",
- "no-key-matching": "'{{key}}' nav atrasts.",
- "no-keys-found": "Nav atslēgas atrastas.",
- "create-new-alias": "Radīt jaunu!",
- "create-new-key": "Radīt jaunu!",
- "duplicate-alias-error": "Dublēti segvārdi atrasti '{{alias}}'.
Vienību skatu segvārdiem ir jābūt unikāliem paneļa ietvaros.",
- "configure-alias": "Konfigurēt '{{alias}}' segvārdu",
- "no-entity-views-matching": "Nav vienību skata atbilstības '{{entity}}' atrastas.",
- "alias": "Segvārds",
- "alias-required": "Vienību skatu segvārdi ir nepieciešami.",
- "remove-alias": "Noņemt vienību skatu segvārdu",
- "add-alias": "Pievienot vienību skatu segvārdu",
- "name-starts-with": "Vienību skata nosaukums sākas ar",
- "entity-view-list": "Vienību skata saraksts",
- "use-entity-view-name-filter": "Lietot filtru",
- "entity-view-list-empty": "Nav vienību skati atlasīti.",
- "entity-view-name-filter-required": "Vienību skatu nosaukumu filtri ir nepieciešami.",
- "entity-view-name-filter-no-entity-view-matched": "Nav vienību skati kas sākas ar '{{entityView}}' atrasti.",
- "add": "Pievienot vienību skatu",
- "assign-to-customer": "Pieškirt klientam",
- "assign-entity-view-to-customer": "Piešķirt vienību skatus klientam",
- "assign-entity-view-to-customer-text": "Lūdzu izvēlēties vienību skatus ko pieškirt klientam",
- "no-entity-views-text": "Nav vienību skati atrasti",
- "assign-to-customer-text": "Lūdzu izvēlēties klientu lai pieškirtu vienības skatus",
- "entity-view-details": "Vienību skata detaļas",
- "add-entity-view-text": "Pievienot jaunu vienību skatu",
- "delete": "Dzēsts vienību skatu",
- "assign-entity-views": "Piešķirt vienību skatus",
- "assign-entity-views-text": "Piešķirt { count, plural, 1 {1 entityView} other {# vienību skati} } klientam",
- "delete-entity-views": "Dzēst vienību skatus",
- "unassign-from-customer": "Noņemt no klienta",
- "unassign-entity-views": "Noņemt vienību skatus",
- "unassign-entity-views-action-title": "Noņemt { count, plural, 1 {1 entityView} other {# vienību skati} } no klienta",
- "assign-new-entity-view": "Piešķirt jaunu vienību skatu",
- "delete-entity-view-title": "Vai esat pārliecināts,ka vēlaties dzēst vienību skatu '{{entityViewName}}'?",
- "delete-entity-view-text": "Esiet uzmanīgs, pēc apstiprinājuma vienību skats un tā sasitītie dati nebūs atjaunojami.",
- "delete-entity-views-title": "Vai esat pārliecināts, ka vēlaties vienību skatu { count, plural, 1 {1 entityView} other {# vienību skati} }?",
- "delete-entity-views-action-title": "Dzēst { count, plural, 1 {1 entityView} other {# vienību skati} }",
- "delete-entity-views-text": "Esiet uzmanīgs, pēc apstiprinājuma visir atlasītie vienības skati tiks noņemti un to saistītie dati nebūs atjaunojami.",
- "unassign-entity-view-title": "Vai esat pārliecināts, ka vēlaties atspējot vienību skatu '{{entityViewName}}'?",
- "unassign-entity-view-text": "Pēc apstiprinājuma vienību skats tiks atspējots un nebūs pieejams klientam.",
- "unassign-entity-view": "Atspējot vienību skatu",
- "unassign-entity-views-title": "Vai esat pārliecināts, ka vēlaties atspējot { count, plural, 1 {1 entityView} other {# vienību skatus} }?",
- "unassign-entity-views-text": "Pēc apstiprinājuma visi atlasītie vienību skati būs atspējoti un nebūs pieejami klientiem.",
- "entity-view-type": "Vienību skata tips",
- "entity-view-type-required": "Vienību skata tips ir nepieciešams.",
- "select-entity-view-type": "Atlasīt vienību skata tipu",
- "enter-entity-view-type": "Ievadīt vienību skata tipu",
- "any-entity-view": "Jebkurš vienību skats",
- "no-entity-view-types-matching": "Nav vienību skata atbilstības '{{entitySubtype}}' atrastas.",
- "entity-view-type-list-empty": "Nav vienību skatu tipi atlasīti.",
- "entity-view-types": "Vienību skatu tipi",
- "name": "Nosaukums",
- "name-required": "Nosaukums ir nepieciešams.",
- "description": "Apraksts",
- "events": "Notikumi",
- "details": "Detaļas",
- "copyId": "Kopēt vienību skata Id",
- "assignedToCustomer": "Piešķirta klientam",
- "unable-entity-view-device-alias-title": "Nav iespējas dzēst vienību skata segvārdu",
- "unable-entity-view-device-alias-text": "Iekārtas segvārds '{{entityViewAlias}}' nevar tikt dzēsts, jo to izmanto sekojošs logrīks:
{{widgetsList}}",
- "select-entity-view": "Atlasīt vienību skatu",
- "make-public": "Veidot vienību skatu publisku",
- "make-private": "Veidot vienību skatu privātu",
- "start-date": "Starta datums",
- "start-ts": "Starta laiks",
- "end-date": "Beigu datums",
- "end-ts": "Beigu laiks",
- "date-limits": "Datuma limits",
- "client-attributes": "Klienta atribūti",
- "shared-attributes": "Dalītie atribūti",
- "server-attributes": "Servera atribūti",
- "timeseries": "Laika sērijas",
- "client-attributes-placeholder": "Klienta atribūti",
- "shared-attributes-placeholder": "Dalītie atribūti",
- "server-attributes-placeholder": "Servera atribūti",
- "timeseries-placeholder": "Laika sērijas",
- "target-entity": "Mērķa vienība",
- "attributes-propagation": "Atribūtu izplatīšana",
- "attributes-propagation-hint": "Vienību skats automātiski kopē specificētos atribūtus no mērķa vienības katru reizi kad jūs saglabājat vai atjaunojat vienību skatu.",
- "timeseries-data": "Laika sērijas dati",
- "timeseries-data-hint": "Configure timeseries data keys of the target entity that will be accessible to the entity view. This timeseries data is read-only.",
- "make-public-entity-view-title": "Vai esat pārliecināts, ka vēlaties veidot vienību skatu '{{entityViewName}}' publisku?",
- "make-public-entity-view-text": "Pēc apstiprinājuma vienību skats un tā saistītie dati būs publiski un pieejami citiem.",
- "make-private-entity-view-title": "Vai esat pārliecināts, ka vēlaties veidot vienību skatu '{{entityViewName}}' privātu?",
- "make-private-entity-view-text": "Pēc apstiprinājuma vienību skats un tā saistītie dati būs privāti un nebūs pieejami citiem."
- },
- "event": {
- "event-type": "Notikuma tips",
- "type-error": "Kļūda",
- "type-lc-event": "Dzīves cikla notikums",
- "type-stats": "Statistika",
- "type-debug-rule-node": "Atkļūdot",
- "type-debug-rule-chain": "Atkļūdot",
- "no-events-prompt": "Nav notikumi atrasti",
- "error": "Kļūda",
- "alarm": "Trauksme",
- "event-time": "Notikuma laiks",
- "server": "Serveris",
- "body": "Galvenā daļa",
- "method": "Metode",
- "type": "Tips",
- "entity": "Vienība",
- "message-id": "Ziņojuma Id",
- "message-type": "Ziņojuma tips",
- "data-type": "Datu tips",
- "relation-type": "Attiecību tips",
- "metadata": "Metadata",
- "data": "Dati",
- "event": "Notikumi",
- "status": "Statuss",
- "success": "Sekmīgi",
- "failed": "Kļūda",
- "messages-processed": "Ziņojumi apstrādāti",
- "errors-occurred": "Kļūdas konstatētas"
- },
- "extension": {
- "extensions": "Paplašinājumi",
- "selected-extensions": "{ count, plural, 1 {1 extension} other {# paplašinājumi} } atlasītie",
- "type": "Tips",
- "key": "Atslēga",
- "value": "Vērtība",
- "id": "Id",
- "extension-id": "Paplašinājuma id",
- "extension-type": "Paplašinājuma tips",
- "transformer-json": "JSON *",
- "unique-id-required": "Patreizējā paplašinājuma id jau eksistē.",
- "delete": "Dzēst paplašinājumu",
- "add": "Pievienot paplašinājumu",
- "edit": "Rediģēt paplašinājumu",
- "delete-extension-title": "Vai esat pārliecināts, ka vēlaties dzēst paplašinājumu '{{extensionId}}'?",
- "delete-extension-text": "Esiet uzmanīgs, pēc apstiprinājuma paplašinājums un visi tā saistītie dati nebūs atjaunojami.",
- "delete-extensions-title": "Vai esat pārliecināts, ka vēlaties dzēst { count, plural, 1 {1 extension} other {# paplašinājumus} }?",
- "delete-extensions-text": "Esiet uzmanīgs, pēc apstiprinājuma visi atlasītie paplašinājumi tiks dzēsti.",
- "converters": "Pārveidotāji",
- "converter-id": "Pārveidotāja id",
- "configuration": "Konfigurācija",
- "converter-configurations": "Pārveidotāja konfigurācija",
- "token": "Drošības tokens",
- "add-converter": "Pievienot pārveidotāju",
- "add-config": "Pievienot pārveidotāja konfigurāciju",
- "device-name-expression": "Iekārtas nosaukuma izteiksme",
- "device-type-expression": "Iekārtas tipa izteiksme",
- "custom": "Pielāgot",
- "to-double": "Dubutot",
- "transformer": "Pārveidotājs",
- "json-required": "json pārveidotājs ir nepieciešams.",
- "json-parse": "Nav iespējams parsēt json pārveidotāju.",
- "attributes": "Atribūti",
- "add-attribute": "Pievienot atribūtus",
- "add-map": "Pievienot kartēšanas elementu",
- "timeseries": "Laika sērijas",
- "add-timeseries": "Pievienot laika sērijas",
- "field-required": "Lauks ir nepieciešams",
- "brokers": "Brokeris",
- "add-broker": "Pievienot brokeri",
- "host": "Saimnieks",
- "port": "Ports",
- "port-range": "Portam jābūt robežās no 1 līdz 65535.",
- "ssl": "Ssl",
- "credentials": "Akreditācijas dati",
- "username": "Lietotājvārds",
- "password": "Parole",
- "retry-interval": "Mēģināt vēlreiz intervāls milisekundēs",
- "anonymous": "Anonīmi",
- "basic": "Pamata",
- "pem": "PEM",
- "ca-cert": "CA sertifikācijas fails *",
- "private-key": "Privātās atslēgas fails *",
- "cert": "Srtifikāta fails *",
- "no-file": "Nav fails izvēlēts.",
- "drop-file": "Nosviest failu vai klikšķināt izvēlēto failu augšupielādei.",
- "mapping": "Kartēšana",
- "topic-filter": "Temata filtrs",
- "converter-type": "Pārveidotāja tips",
- "converter-json": "Json",
- "json-name-expression": "Iekārtas nosaukuma json izteiksme",
- "topic-name-expression": "Iekārtas nosaukuma temata izteiksme",
- "json-type-expression": "Iekārtas tipa json izteiksme",
- "topic-type-expression": "Iekārtas tipa temata izteiksme",
- "attribute-key-expression": "Atribūtu atslēgas izteiksme",
- "attr-json-key-expression": "Atribūtu atslēgas json izteiksme",
- "attr-topic-key-expression": "Attribūtu atslēgas temata izteiksme",
- "request-id-expression": "Pieprasīt id izteiksmi",
- "request-id-json-expression": "Pieprasīt id json izteiksmi",
- "request-id-topic-expression": "Pieprasīt id temata izteiksmi",
- "response-topic-expression": "Atbildēt temata izteiksmi",
- "value-expression": "Vērtības izteiksme",
- "topic": "Temats",
- "timeout": "Pārtraukums milisekundēs",
- "converter-json-required": "json pārveidotājs ir nepieciešams.",
- "converter-json-parse": "Nav iespējams parsēt pārveidotāju json.",
- "filter-expression": "Filtra izteiksme",
- "connect-requests": "Savienot pieprasījumus",
- "add-connect-request": "Pievienot savienojuma pieprasījumus",
- "disconnect-requests": "Atvienot pieprasījumus",
- "add-disconnect-request": "Pievienot atvienot pieprasījumus",
- "attribute-requests": "Attribūtu pieprasījumus",
- "add-attribute-request": "Pievienot atribūtu pieprasījumu",
- "attribute-updates": "Atribūtu atjaunojumi",
- "add-attribute-update": "Pievienot atribūtu atjaunojumus",
- "server-side-rpc": "Servera puses RPC",
- "add-server-side-rpc-request": "Pievienot servera puses RPC pieprasījumus",
- "device-name-filter": "Iekārtas nosaukuma filtrs",
- "attribute-filter": "Atribūtu filtrs",
- "method-filter": "Metodes filtrs",
- "request-topic-expression": "Pieprasīt temata izteiksmi",
- "response-timeout": "Atbildes pārtraukums milisekundēs",
- "topic-expression": "Temata izteiksme",
- "client-scope": "Klienta darbības joma",
- "add-device": "Pievienot iekārtu",
- "opc-server": "Serveris",
- "opc-add-server": "Pievienot serveri",
- "opc-add-server-prompt": "Lūdzu pievienot serveri",
- "opc-application-name": "Aplikācijas nosaukums",
- "opc-application-uri": "Aplikācijas uri",
- "opc-scan-period-in-seconds": "Skanēt periodu sekundēs",
- "opc-security": "Drošība",
- "opc-identity": "Identitāte",
- "opc-keystore": "Atslēgu veikals",
- "opc-type": "Tips",
- "opc-keystore-type": "Tips",
- "opc-keystore-location": "Vieta *",
- "opc-keystore-password": "Parole",
- "opc-keystore-alias": "Segvārds",
- "opc-keystore-key-password": "Atslēgas parole",
- "opc-device-node-pattern": "Iekārtas nodes veids",
- "opc-device-name-pattern": "Iekārtas nosaukuma veids",
- "modbus-server": "Serveris/vergs",
- "modbus-add-server": "Pievienot serveri/vergi",
- "modbus-add-server-prompt": "Lūdzu pievienot serveri/vergu",
- "modbus-transport": "Transports",
- "modbus-tcp-reconnect": "Automātiski atkārtoti savienot",
- "modbus-rtu-over-tcp": "RTU pa TCP",
- "modbus-port-name": "Seriālā porta nosaukums",
- "modbus-encoding": "Kodēšana",
- "modbus-parity": "Paritāte",
- "modbus-baudrate": "Pārraides ātrums",
- "modbus-databits": "Datu bits",
- "modbus-stopbits": "Stop bits",
- "modbus-databits-range": "Datu bitiem jābūt no 7 līdz 8.",
- "modbus-stopbits-range": "Stop bitiem jābūt no 1 līdz 2.",
- "modbus-unit-id": "Iekārtas ID",
- "modbus-unit-id-range": "Iekārtas ID jābūt no 1 līdz 247.",
- "modbus-device-name": "Iekārtas nosaukums",
- "modbus-poll-period": "Aptaujas periods (ms)",
- "modbus-attributes-poll-period": "Atribūtu aptaujas periods (ms)",
- "modbus-timeseries-poll-period": "Laika sērijas aptaujas periods (ms)",
- "modbus-poll-period-range": "Aptaujas periodam jābūt pzitīvai vērtībai.",
- "modbus-tag": "Etiķete",
- "modbus-function": "Funkcija",
- "modbus-register-address": "Reģistra adrese",
- "modbus-register-address-range": "Reģistra adresei jābūt no 0 līdz 65535.",
- "modbus-register-bit-index": "Bita indekss",
- "modbus-register-bit-index-range": "Bita indeksam jābūt no 0 līdz 15.",
- "modbus-register-count": "Reģistra skaitītājs",
- "modbus-register-count-range": "Reģistra skaitītājam jābūt pzitīvai vērtībai.",
- "modbus-byte-order": "Baitu kārtība",
- "sync": {
- "status": "Statuss",
- "sync": "Sync",
- "not-sync": "Nav sync",
- "last-sync-time": "Pēdējais sync laiks",
- "not-available": "Nav pieejams"
- },
- "export-extensions-configuration": "Eksportēt paplašinājuma konfigurāciju",
- "import-extensions-configuration": "Importēt paplašinājuma konfigurāciju",
- "import-extensions": "Importēt paplašinājumus",
- "import-extension": "Importēt paplašinājumu",
- "export-extension": "Eksportēt paplašinājumu",
- "file": "Paplašinājuma fails",
- "invalid-file-error": "Invalīds paplašinājuma fails"
- },
- "fullscreen": {
- "expand": "Paplašināt uz pilnu ekrānu",
- "exit": "Iziet no pilna ekrāna",
- "toggle": "Pārslēgties uz pilna ekrāna režīmu",
- "fullscreen": "Pilns ekrāns"
- },
- "function": {
- "function": "Funkcija"
- },
- "grid": {
- "delete-item-title": "Vai esat pārliecināts, ka vēlaties dzēst šo priekšmetu?",
- "delete-item-text": "Esiet uzmanīgs, pēc apstiprinājuma šī priekšmeta dati nebūs atjaunojami.",
- "delete-items-title": "Vai esat pārliecināts, ka vēlaties dzēst { count, plural, 1 {1 item} other {# priekšmetus} }?",
- "delete-items-action-title": "Dzēst { count, plural, 1 {1 item} other {# priekšmeti} }",
- "delete-items-text": "Esiet uzmanīgs, pēc apstiprinājuma visi atlasītie priekšmeti tiks noņemti un to saistītie dati nebūs atjaunojami.",
- "add-item-text": "Pievienot jaunu priekšmetu",
- "no-items-text": "Nav priekšmeti atrasti",
- "item-details": "Priekšmetu detaļas",
- "delete-item": "Dzēst priekšmetu",
- "delete-items": "Dzēst priekšmetus",
- "scroll-to-top": "Iet uz sākumu"
- },
- "help": {
- "goto-help-page": "Ejiet uz palīdzības lapu"
- },
- "home": {
- "home": "Sākums",
- "profile": "Profils",
- "logout": "Izlogoties",
- "menu": "Izvēlne",
- "avatar": "Avatars",
- "open-user-menu": "Atvērt lietotāja izvēlni"
- },
- "import": {
- "no-file": "Nav fails izvēlēts",
- "drop-file": "Nosviest JSON failu vai klikšķināt uz atlasīto failu augšupielādei.",
- "drop-file-csv": "Nosviest CSV failu vai klikšķināt uz atlasīto failu augšupielādei.",
- "column-value": "Vērtība",
- "column-title": "Virsraksts",
- "column-example": "Piemēra vērtību dati",
- "column-key": "Atribūts/telemetrijas atslēga key",
- "csv-delimiter": "CSV kolonu atdalītājs",
- "csv-first-line-header": "Pirmā līnija satur kolonu nosaukumus",
- "csv-update-data": "Atjaunot atribūtu/telemetrija",
- "import-csv-number-columns-error": "Failā jābūt vismaz divām kolonām",
- "import-csv-invalid-format-error": "Invalīds faila formāts. Līnija: '{{line}}'",
- "column-type": {
- "name": "Nosaukums",
- "type": "Tips",
- "column-type": "Kolonas tips",
- "client-attribute": "Klienta atribūts",
- "shared-attribute": "Dalītais atribūts",
- "server-attribute": "Servera atribūts",
- "timeseries": "Laika sērijas",
- "entity-field": "Vienības lauks",
- "access-token": "Piekļuves tokens"
- },
- "stepper-text": {
- "select-file": "Atlasīt failu",
- "configuration": "Importēt konfigurāciju",
- "column-type": "Atlasīt kolonas tipu",
- "creat-entities": "Radīt jaunas vienības",
- "done": "Darīts"
- },
- "message": {
- "create-entities": "{{count}} jaunas vienības sekmīgi radītas.",
- "update-entities": "{{count}} vienības sekmīgi atjaunotas.",
- "error-entities": "Te ir kļūda radot {{count}} vienības."
- }
- },
- "item": {
- "selected": "Atlasīts"
- },
- "js-func": {
- "no-return-error": "Funkcijai vajag atgriezt rezultātu!",
- "return-type-mismatch": "Funkcijai vajag atgriezt rezultātu '{{type}}' !",
- "tidy": "Sakopt"
- },
- "key-val": {
- "key": "Atslēga",
- "value": "Vērtība",
- "remove-entry": "Noņemt ierakstu",
- "add-entry": "Pievienot ierakstu",
- "no-data": "Nav ierakstu"
- },
- "layout": {
- "layout": "Izkārtojums",
- "manage": "Pārvaldīt izkārtojumu",
- "settings": "Izkārtojuma iestatījumi",
- "color": "Krāsa",
- "main": "Galvenais",
- "right": "Pa labi",
- "select": "Atlasīt mērķa izkārtojumu"
- },
- "legend": {
- "direction": "Leģendas virziens",
- "position": "Leģendas pozīcija",
- "show-max": "Rādīt max vērtību",
- "show-min": "Rādīt min vērtību",
- "show-avg": "Rādīt vidējo vērtību",
- "show-total": "Rādīt kopējo vērtību",
- "settings": "Leģendas iestatījumi",
- "min": "min",
- "max": "max",
- "avg": "vidējais",
- "total": "total"
- },
- "login": {
- "login": "Login",
- "request-password-reset": "Pieprasīt atiestatīt paroli",
- "reset-password": "Atiestatīt paroli",
- "create-password": "Radīt paroli",
- "passwords-mismatch-error": "Ievadītajai parolei ir jāsakrīt!",
- "password-again": "Atkārtot paroli",
- "sign-in": "Lūdzu pierakstīties",
- "username": "Lietotājvārds (email)",
- "remember-me": "Atcerēties mani",
- "forgot-password": "Aizmirsu paroli?",
- "password-reset": "Paroli atiestatīt",
- "new-password": "Jaunā parole",
- "new-password-again": "Atkārtot jauno paroli",
- "password-link-sent-message": "paroles atiestatīšanas saite sekmīgi nosūtīta!",
- "email": "Email"
- },
- "position": {
- "top": "Sākums",
- "bottom": "Beigas",
- "left": "Pa kreisi",
- "right": "Pa labi"
- },
- "profile": {
- "profile": "Profils",
- "change-password": "Mainīt paroli",
- "current-password": "Patreizējā parole"
- },
- "relation": {
- "relations": "Attiecības",
- "direction": "Virziens",
- "search-direction": {
- "FROM": "No",
- "TO": "Uz"
- },
- "direction-type": {
- "FROM": "No",
- "TO": "Uz"
- },
- "from-relations": "Izejošāsa attiecības",
- "to-relations": "Ienākošās attiecības",
- "selected-relations": "{ count, plural, 1 {1 relation} other {# attiecības} } atlasītas",
- "type": "Tips",
- "to-entity-type": "Uz vienību tipu",
- "to-entity-name": "Uz vienību nosaukumu",
- "from-entity-type": "No vienību tipa",
- "from-entity-name": "No vienību nosaukuma",
- "to-entity": "Uz vienību",
- "from-entity": "No vienības",
- "delete": "Dzēst attiecību",
- "relation-type": "Attiecības tips",
- "relation-type-required": "Attiecību tips ir nepieciešams.",
- "any-relation-type": "Jebkura tipa",
- "add": "Pievienot attiecību",
- "edit": "Rediģēt attiecību",
- "delete-to-relation-title": "Vai esat pārliecināts, ka vēlaties dzēst attiecību uz vienību '{{entityName}}'?",
- "delete-to-relation-text": "Esiet uzmanīgs, pēc apstiprinājuma vienība '{{entityName}}' būs atsaistīta no patreizējās vienības.",
- "delete-to-relations-title": "Vai esat pārliecināts, ka vēlaties dzēst { count, plural, 1 {1 relation} other {# attiecības} }?",
- "delete-to-relations-text": "Esiet uzmanīgs, pēc apstiprināšanas visas atlasītās attiecības būs noņemtas un attiecīgās vienības būs atsaistītas no patreizējās vienības.",
- "delete-from-relation-title": "Vai esat pārliecināts, ka vēlaties dzēst attiecību no vienības '{{entityName}}'?",
- "delete-from-relation-text": "Esiet uzmanīgs, pēc apstiprinājuma patreizējā vienība būs atsaistīta no vienības '{{entityName}}'.",
- "delete-from-relations-title": "Vai esat pārliecināts, ka vēlaties dzēst { count, plural, 1 {1 relation} other {# attiecības} }?",
- "delete-from-relations-text": "Esiet uzmanīgs, pēc apstiprinājuma visas atlasītās attiecības būs noņemtas un patreizējā vienība tiks atsaistīta no attiecīgās vienības.",
- "remove-relation-filter": "Noņemt attiecību filtru",
- "add-relation-filter": "Pievienot attiecību filtru",
- "any-relation": "Jebkura attiecība",
- "relation-filters": "Attiecību filtrs",
- "additional-info": "Papildus info (JSON)",
- "invalid-additional-info": "Nav iespēja parsēt papildus info json."
- },
- "rulechain": {
- "rulechain": "Noteikumu ķēde",
- "rulechains": "Noteikumu ķēdes",
- "root": "Sakne",
- "delete": "Dzēsts noteikumu ķēdi",
- "name": "Nosaukums",
- "name-required": "Nosaukums ir nepieciešams.",
- "description": "Nosaukums ir nepieciešams",
- "add": "Pievienot noteikumu ķēdi",
- "set-root": "Veidot noteikumu ķēdi kā sakni",
- "set-root-rulechain-title": "Vai esat pārliecināts, ka vēlaties veidot noteikumu ķēdi '{{ruleChainName}}' kā sakni?",
- "set-root-rulechain-text": "Pēc apstiprinājuma noteikuma ķēde tiks veidota kā sakne un apstrādās visu ienākošo informāciju.",
- "delete-rulechain-title": "Vai esat pārliecināts, ka vēlaties dzēst noteikumu ķēdi '{{ruleChainName}}'?",
- "delete-rulechain-text": "Esiet uzmanīgs, pēc apstiprinājuma noteikumu ķēde un saistītā informācija nebūs atjaunojama.",
- "delete-rulechains-title": "Vai esat pārliecināts, ka vēlaties dzēst { count, plural, 1 {1 rule chain} other {# noteikumu ķēdes} }?",
- "delete-rulechains-action-title": "Dzēst { count, plural, 1 {1 rule chain} other {# noteikumu ķēdes} }",
- "delete-rulechains-text": "Esiet uzmanīgs, pēc apstiprinājuma visas atlasītās noteikumu ķēdes tiks noņemtas un to saistītos datus nevarēs atjaunot.",
- "add-rulechain-text": "Pievienot jaunu noteikumu ķēdi",
- "no-rulechains-text": "Nav noteikumu ķēdes atrastas",
- "rulechain-details": "Noteikumu ķēdes detaļas",
- "details": "Detaļas",
- "events": "Notikumi",
- "system": "Sistēma",
- "import": "Importēt noteikumu ķēdi",
- "export": "Eksportēt noteikumu ķēdi",
- "export-failed-error": "Nav iespējams eksportēt noteikumu ķēdi: {{error}}",
- "create-new-rulechain": "Radīt jaunu noteikumu ķēdi",
- "rulechain-file": "Noteikumu ķēdes fails",
- "invalid-rulechain-file-error": "Nav iespējams importēt noteikumu ķēdi: Invalīda noteikumu ķēdes datu struktūra.",
- "copyId": "Kopēt noteikumu ķēdes Id",
- "idCopiedMessage": "Noteikumu ķēdes Id ir kopēta uz starpliktuves",
- "select-rulechain": "Atlasīt noteikumu ķēdi",
- "no-rulechains-matching": "Nav noteikumu ķēdes atbilstības '{{entity}}' atrastas.",
- "rulechain-required": "Noteikumu ķēde ir nepieciešama",
- "management": "Noteikumu pārvaldība",
- "debug-mode": "Atkļūdošanas režīms"
- },
- "rulenode": {
- "details": "Detaļas",
- "events": "Notikumi",
- "search": "Meklēt nodes",
- "open-node-library": "Atvērt node bibliotēku",
- "add": "Pievienot noteikumu nodi",
- "name": "Nosaukums",
- "name-required": "Nosaukums ir nepieciešams.",
- "type": "Tips",
- "description": "Apraksts",
- "delete": "Dzēst noteikumu nodi",
- "select-all-objects": "Atlasīt visas nodes un savienojumus",
- "deselect-all-objects": "Noņemt visas nodes un savienojumus",
- "delete-selected-objects": "Dzēst atlasītās nodes un savienojumus",
- "delete-selected": "Dzēst atlasītos",
- "select-all": "Atlasīt visu",
- "copy-selected": "Kopēt atlasīto",
- "deselect-all": "Noņemt visu",
- "rulenode-details": "Noteikumu nodes detaļas",
- "debug-mode": "Atkļūdošanas mode",
- "configuration": "Konfigurācija",
- "link": "Saite",
- "link-details": "Noteikumu nodes saites detaļas",
- "add-link": "Pievienot saiti",
- "link-label": "Saites etiķete",
- "link-label-required": "Saites etiķete ir nepieciešama.",
- "custom-link-label": "Klienta saites etiķete",
- "custom-link-label-required": "Klienta saites etiķete ir nepieciešama.",
- "link-labels": "Saites etiķetes",
- "link-labels-required": "Saites etiķetes ir nepieciešamas.",
- "no-link-labels-found":"Nav saites etiķetes atrastas",
- "no-link-label-matching": "'{{label}}' nav atrasta.",
- "create-new-link-label": "Radīt jaunu!",
- "type-filter": "Filtrs",
- "type-filter-details": "Filtrēt ienākošos ziņojumus ar konfigurētajiem stāvokļiem",
- "type-enrichment": "Bagātināšana",
- "type-enrichment-details": "Pievieno papildus informāciju ziņas metadatiem",
- "type-transformation": "Transformācija",
- "type-transformation-details": "Mainīt ziņas datu lauku un metatdatus",
- "type-action": "Aktivitāte",
- "type-action-details": "Veikt specifisku aktivitāti",
- "type-external": "Ārējs",
- "type-external-details": "Sadarboties ar ārējām sistēmām",
- "type-rule-chain": "Noteikumu ķēde",
- "type-rule-chain-details": "Pārsūta ienākošo ziņu uz specifisku noteikumu ķēdi ",
- "type-input": "Ievads",
- "type-input-details": "Loģiskais ievads noteikumu ķēdei, pārsūta ienākošās ziņas uz nākamo attiecināto noteikumu nodi",
- "type-unknown": "Nezināms",
- "type-unknown-details": "Neatrisināta noteikumu node",
- "directive-is-not-loaded": "Noteikta konfigurācijas direktīva '{{directiveName}}' nav pieejama.",
- "ui-resources-load-error": "Nesekmīgs mēģinājums ielādēt konfigurācijas ui resursus.",
- "invalid-target-rulechain": "Nav iespējams atrisināt mērķa noteikumu ķēdi!",
- "test-script-function": "Testēt skripta funkciju",
- "message": "Ziņa",
- "message-type": "Ziņas tips",
- "select-message-type": "Atlasīt ziņas tipu",
- "message-type-required": "Ziņas tips ir nepieciešams",
- "metadata": "Metadati",
- "metadata-required": "Metadatu ievadi nevar būt tukši.",
- "output": "Izeja",
- "test": "Tests",
- "help": "Palīdzība",
- "reset-debug-mode": "Atiestatīt atkļūdošanu visās nodēs"
- },
- "tenant": {
- "tenant": "Īrnieks",
- "tenants": "Īrnieki",
- "management": "Īrnieku pārvaldība",
- "add": "Pievienot īrnieku",
- "admins": "Administrātori",
- "manage-tenant-admins": "Pārvaldīt īrnieku administrātorus",
- "delete": "Dzēst īrnieku",
- "add-tenant-text": "Pievienot jaunu īrnieku",
- "no-tenants-text": "Nav īrnieki atrasti",
- "tenant-details": "Īrnieka detaļas",
- "delete-tenant-title": "Vai esat pārliecināts, ka vēlaties dzēst īrnieku '{{tenantTitle}}'?",
- "delete-tenant-text": "Esiet uzmanīgs, pēc apstiprinājuma īrnieks un tā saistītie dati nebūs atjaunojami.",
- "delete-tenants-title": "Vai esat pārliecināts, ka vēlaties dzēst { count, plural, 1 {1 tenant} other {# īrniekus} }?",
- "delete-tenants-action-title": "Dzēst { count, plural, 1 {1 tenant} other {# īrniekus} }",
- "delete-tenants-text": "Esiet uzmanīgs, pēc apstiprinājuma visi atlasītie īrnieki tiks noņemti un saistītie dati nebūs atjaunojami.",
- "title": "Virsraksts",
- "title-required": "Virsraksts ir nepieciešams.",
- "description": "Apraksts",
- "details": "Detaļas",
- "events": "Notikumi",
- "copyId": "Kopēt īrnieka Id",
- "idCopiedMessage": "Īrnieka Id ir kopēta uz starpliktuvi",
- "select-tenant": "Atlasīt īrnieku",
- "no-tenants-matching": "Nav īrnieku saderības '{{entity}}' atrastas.",
- "tenant-required": "Īrnieks ir nepieciešams"
- },
- "timeinterval": {
- "seconds-interval": "{ seconds, plural, 1 {1 second} other {# sekundes} }",
- "minutes-interval": "{ minutes, plural, 1 {1 minute} other {# minūtes} }",
- "hours-interval": "{ hours, plural, 1 {1 hour} other {# stundas} }",
- "days-interval": "{ days, plural, 1 {1 day} other {# dienas} }",
- "days": "Dienas",
- "hours": "Stundas",
- "minutes": "Minūtes",
- "seconds": "Sekundes",
- "advanced": "Pieredzējis lietotājs"
- },
- "timewindow": {
- "days": "{ days, plural, 1 { day } other {# dienas } }",
- "hours": "{ hours, plural, 0 { hour } 1 {1 hour } other {# stundas } }",
- "minutes": "{ minutes, plural, 0 { minute } 1 {1 minute } other {# minūtes } }",
- "seconds": "{ seconds, plural, 0 { second } 1 {1 second } other {# sekundes } }",
- "realtime": "Reālajā laikā",
- "history": "Vēsture",
- "last-prefix": "Pēdējās",
- "period": "No {{ startTime }} to {{ endTime }}",
- "edit": "Rediģēt laika logu",
- "date-range": "Datumu diapazons",
- "last": "Pēdējās",
- "time-period": "Laika periods"
- },
- "user": {
- "user": "Lietotājs",
- "users": "Lietotāji",
- "customer-users": "Klienta lietotāji",
- "tenant-admins": "Īrnieka administrātori",
- "sys-admin": "Sistēmas administrātori",
- "tenant-admin": "Īrnieka administrātors",
- "customer": "Klients",
- "anonymous": "Anonīmi",
- "add": "Pievienot lietotāju",
- "delete": "Dzēst lietotāju",
- "add-user-text": "Pievienot jaunu lietotāju",
- "no-users-text": "Nav lietotāji atrasti",
- "user-details": "Lietotāja detaļas",
- "delete-user-title": "Vai esat pārliecināts, ka vēlaties dzēst lietotāju '{{userEmail}}'?",
- "delete-user-text": "Esiet uzmanīgs, pēc apstiprinājuma lietotājs un tā saistītie dati nebūs atjaunojami.",
- "delete-users-title": "Vai esat pārliecināts, ka vēlaties dzēst { count, plural, 1 {1 user} other {# lietotājus} }?",
- "delete-users-action-title": "Dzēst { count, plural, 1 {1 user} other {# lietotājus} }",
- "delete-users-text": "Esiet uzmanīgs, pēc apstiprinājuma visi atlasītie lietotāji tiks noņemti un to saistītie dati nebūs atjaunojami.",
- "activation-email-sent-message": "Aktivizācijas email ir sekmīgi nosūtīts!",
- "resend-activation": "Atkārtoti nosūtīt aktivizāciju",
- "email": "Email",
- "email-required": "Email ir nepieciešams.",
- "invalid-email-format": "Invalīds email formāts.",
- "first-name": "Vārds",
- "last-name": "Uzvārds",
- "description": "Apraksts",
- "default-dashboard": "Defaultais panelis",
- "always-fullscreen": "Vienmēr pilnekrāna",
- "select-user": "Izvēlēties lietotāju",
- "no-users-matching": "Nav lietotāju atbilstības '{{entity}}' atrastas.",
- "user-required": "Lietotājs ir nepieciešams",
- "activation-method": "Aktivizācijas veids",
- "display-activation-link": "Parādīt aktivizācijas saiti",
- "send-activation-mail": "Nosūtīt aktivizācijas email",
- "activation-link": "Lietotāja aktivizācijas saite",
- "activation-link-text": "Lai aktivizētu lietotāju, lieto sekojošo aktivizācijas saiti :",
- "copy-activation-link": "Kopēt aktivizācijas saiti",
- "activation-link-copied-message": "Lietotāja aktivizācijas saite ir kopēta uz starpliktuvi",
- "details": "Detaļas",
- "login-as-tenant-admin": "Login kā īrnieka administrātors",
- "login-as-customer-user": "Login kā klienta lietotājs"
- },
- "value": {
- "type": "Vērtības tips",
- "string": "Teksts",
- "string-value": "Teksta informācija",
- "integer": "Skaitlis",
- "integer-value": "Skaitļa vērtība",
- "invalid-integer-value": "Invalīda skaitļa vērtība",
- "double": "Skaitlis ar cipariem aiz komata",
- "double-value": "Skaitļa ar cipariem aiz komata vērtība",
- "boolean": "ir/nav",
- "boolean-value": "ir/nav vērtības",
- "false": "Nepareizi",
- "true": "Patiesi",
- "long": "Ilgāk"
- },
- "widget": {
- "widget-library": "Logrīku bibliotēka",
- "widget-bundle": "Logrīku apkopojums",
- "select-widgets-bundle": "Atlasīt logrīku apkopojumu",
- "management": "Logrīku pārvaldība",
- "editor": "Logrīku rediģētājs",
- "widget-type-not-found": "Problēma ielādēt logrīka konfigurāciju.
Iespējams, ka attiecīgais logrīka tips ir noņemts.",
- "widget-type-load-error": "Logrīks nav ielādēts dēl sekojošajām kļūdām:",
- "remove": "Noņemt logrīku",
- "edit": "rediģēt logrīku",
- "remove-widget-title": "Vai esat pārliecināts, ka vēlaties noņemt logrīku '{{widgetTitle}}'?",
- "remove-widget-text": "Pēc apstiprinājuma logrīks un tā saistītā informācija nebūs atjaunojama.",
- "timeseries": "Laika sērijas",
- "search-data": "Meklēt datus",
- "no-data-found": "Nav datu atrasti",
- "latest-values": "Pedējās vērtības",
- "rpc": "Kontroles logrīks",
- "alarm": "Trauksmes logrīks",
- "static": "Statiskais logrīks",
- "select-widget-type": "Atlasīt logrīka tipu",
- "missing-widget-title-error": "Logrīka virsrakstam vajag būt norādītam!",
- "widget-saved": "Logrīks saglabāts",
- "unable-to-save-widget-error": "Nav iespēja saglabāt logrīku! Logrīkam ir kļūdas!",
- "save": "Saglabāt logrīku",
- "saveAs": "Saglabāt logrīku kā",
- "save-widget-type-as": "Saglabāt logrīka tipu kā",
- "save-widget-type-as-text": "Lūdzu ievadīt jaunu logrīka virsrakstu un/vai atlasīt mērķa logrīku apkopojumu",
- "toggle-fullscreen": "Parslēgt pilnekrānu",
- "run": "Palaist logrīku",
- "title": "Logrīka virsraksts",
- "title-required": "Logrīka virsraksts ir nepieciešams.",
- "type": "Logrīka tips",
- "resources": "Resursi",
- "resource-url": "JavaScript/CSS URL",
- "remove-resource": "Noņemt resursus",
- "add-resource": "Pievienot resursus",
- "html": "HTML",
- "tidy": "Tidy",
- "css": "CSS",
- "settings-schema": "Iestatījumu shēma",
- "datakey-settings-schema": "Datu atslēgas iestatījumu shēma",
- "javascript": "Javascript",
- "remove-widget-type-title": "Vai esat pārliecināts, ka vēlaties noņemt logrīka tipu '{{widgetName}}'?",
- "remove-widget-type-text": "Pēc apstiprinājuma logrīka tips un tā saistītie dati nebūs atjaunojami.",
- "remove-widget-type": "Noņemt logrīka tipu",
- "add-widget-type": "Pievienot jaunu logrīka tipu",
- "widget-type-load-failed-error": "Neveiksme ielādēt logrīka tipu!",
- "widget-template-load-failed-error": "Neveiksme ielādēt logrīka paraugu!",
- "add": "Pievienot logrīku",
- "undo": "Atcelt logrīka izmaiņas",
- "export": "Eksportēt logrīku"
- },
- "widget-action": {
- "header-button": "Logrīka galvenes poga",
- "open-dashboard-state": "Navigēt uz jaunu paneļa stāvokli",
- "update-dashboard-state": "Atjaunot patreizējo paneļa stāvokli",
- "open-dashboard": "Navigēt uz citu paneli",
- "custom": "Klienta aktivitāte",
- "target-dashboard-state": "Mērķa paneļa stāvoklis",
- "target-dashboard-state-required": "Mērķa paneļa stāvoklis ir nepieciešams",
- "set-entity-from-widget": "Uzstādīt vienību no logrīka",
- "target-dashboard": "Mērķa panelis",
- "open-right-layout": "Atvērt pareizo paneļa izkārtojumu (mobilais skats)"
- },
- "widgets-bundle": {
- "current": "Patreizējais apkopojums",
- "widgets-bundles": "Logrīku apkopojuma",
- "add": "Pievienot logrīku apkopojumu",
- "delete": "Dzēst logrīku apkopojumu",
- "title": "Virsraksts",
- "title-required": "Virsraksts ir nepieciešams.",
- "add-widgets-bundle-text": "Pievienot jaunu logrīku apkopojumu",
- "no-widgets-bundles-text": "Nav logrīku apkopojumi atrasti",
- "empty": "Logrīku apkopojums ir tukšs",
- "details": "Detaļas",
- "widgets-bundle-details": "Logrīku apkopojumu detaļas",
- "delete-widgets-bundle-title": "Vai esat pārliecināts, ka vēlaties dzēst logrīku apkopojumu '{{widgetsBundleTitle}}'?",
- "delete-widgets-bundle-text": "Esiet uzmanīgs, pēc apstiprinājuma logrīka apkopojums un tā saistītie dati nebūs atjaunojami.",
- "delete-widgets-bundles-title": "vai esat pārliecināts, ka vēlaties dzēst { count, plural, 1 {1 widgets bundle} other {# logrīku apkopojumus} }?",
- "delete-widgets-bundles-action-title": "Dzēst { count, plural, 1 {1 widgets bundle} other {# logrīku apkopojumus} }",
- "delete-widgets-bundles-text": "Esiet uzmanīgs, pēc apstiprinājuma visi atlasītie logrīku apkopojumi tiks noņemti un to saistītie dati nebūs atjaunojami.",
- "no-widgets-bundles-matching": "Nav logrīku apkopojumu saderības '{{widgetsBundle}}' atrastas.",
- "widgets-bundle-required": "Logrīku apkopojums ir nepieciešams.",
- "system": "Sistēma",
- "import": "Importēt logrīku apkopojumu",
- "export": "Eksportēt logrīku apkopojumu",
- "export-failed-error": "Nav iespējams eksportēt logrīku apkopojumu: {{error}}",
- "create-new-widgets-bundle": "Radīt jaunu logrīku apkopojumu",
- "widgets-bundle-file": "Logrīku apkopojumu fails",
- "invalid-widgets-bundle-file-error": "Nav iespējams importēt logrīku apkopojumu: Invalīda logrīku apkopojuma datu struktūra."
- },
- "widget-config": {
- "data": "Dati",
- "settings": "Iestatījumi",
- "advanced": "Paaugstināta līmeņa",
- "title": "Virsraksts",
- "general-settings": "Pamata iestatījumi",
- "display-title": "Rādīt virsrakstu",
- "drop-shadow": "Nomest ēnas",
- "enable-fullscreen": "Iespējot pilnekrānu",
- "background-color": "Fona krāsa",
- "text-color": "Teksta krāsa",
- "padding": "Polsterējums",
- "margin": "Robežas",
- "widget-style": "Logrīka stils",
- "title-style": "Virsraksta stils",
- "mobile-mode-settings": "Mobilās modes iestatījumi",
- "order": "Pasūtīt",
- "height": "Augstums",
- "units": "Papildus simbols vērtības atrādīšanai",
- "decimals": "Ciparu skaits pēc komata",
- "timewindow": "Laika logs",
- "use-dashboard-timewindow": "Lietot paneļa laika logu",
- "display-timewindow": "Rādīt laika logu",
- "display-legend": "Rādīt leģendu",
- "datasources": "Datu avoti",
- "maximum-datasources": "Maksimums { count, plural, 1 {1 datasource is allowed.} other {# datu avoti atļautie} }",
- "datasource-type": "Tips",
- "datasource-parameters": "Parametri",
- "remove-datasource": "Noņemt datu avotu",
- "add-datasource": "Pievienot datu avotu",
- "target-device": "Mērķa iekārta",
- "alarm-source": "Trauksmes avots",
- "actions": "Aktivitātes",
- "action": "Aktivitātes",
- "add-action": "Pievienot aktivitāti",
- "search-actions": "Meklēt aktivitātes",
- "action-source": "Aktivitāšu avots",
- "action-source-required": "Aktivitāšu avoti ir nepieciešami.",
- "action-name": "Nosaukums",
- "action-name-required": "Aktitiāšu nosaukums ir nepieciešams.",
- "action-name-not-unique": "Cita aktivitāte ar tādu pašu nosaukumu jau eksistē.
Aktitivātes nosaukumam ir jābūt unikālam vienā aktivitātes avotā.",
- "action-icon": "Ikona",
- "action-type": "Tips",
- "action-type-required": "Aktivitātes tips ir nepieciešams.",
- "edit-action": "Rediģēt aktivitāti",
- "delete-action": "Dzēst aktivitāti",
- "delete-action-title": "Dzēst logrīka aktivitāti",
- "delete-action-text": "Vai esat pārliecināts, ka vēlaties dzēst logrīka aktivitāti ar nosaukumu '{{actionName}}'?"
- },
- "widget-type": {
- "import": "Importēt logrīka tipu",
- "export": "Eksportēt logrīka tipu",
- "export-failed-error": "Nav iespējams eksportēt logrīka tipu: {{error}}",
- "create-new-widget-type": "Radīt jaunu logrīka tipu",
- "widget-type-file": "Logrīka tipa fails",
- "invalid-widget-type-file-error": "Nav iespējams importēt logrīka tipu: Invalīda logrīka tipa datu struktūra."
- },
- "widgets": {
- "date-range-navigator": {
- "localizationMap": {
- "Sun": "Svētdiena",
- "Mon": "Pirmdiena",
- "Tue": "Otrdiena",
- "Wed": "Trešdiena",
- "Thu": "Ceturdiena",
- "Fri": "Piekdiena",
- "Sat": "Sestdiena",
- "Jan": "Janvāris",
- "Feb": "Februāris",
- "Mar": "Marts",
- "Apr": "Aprīlis",
- "May": "Maijs",
- "Jun": "Jūnijs",
- "Jul": "Jūlijs",
- "Aug": "Augusts",
- "Sep": "Septembris",
- "Oct": "Oktobris",
- "Nov": "Novembris",
- "Dec": "Decembris",
- "January": "Janvāris",
- "February": "Februāris",
- "March": "Marts",
- "April": "Aprīlis",
- "June": "Jūnijs",
- "July": "Jūlijs",
- "August": "Augusts",
- "September": "Septembris",
- "October": "Oktobris",
- "November": "Novembris",
- "December": "Decembris",
- "Custom Date Range": "Lietotāja datu diapazons",
- "Date Range Template": "Datu diapazona templeits",
- "Today": "Šodien",
- "Yesterday": "Vakardien",
- "This Week": "Šī nedēļa",
- "Last Week": "Pēdējā nedēļa",
- "This Month": "Šis mēnesis",
- "Last Month": "Pēdējais mēnesis",
- "Year": "Gads",
- "This Year": "Šis gads",
- "Last Year": "Pagājušais gads",
- "Date picker": "Datu atlasītājs",
- "Hour": "Stunda",
- "Day": "Diena",
- "Week": "Nedēļa",
- "2 weeks": "2 Nedēļas",
- "Month": "Mēnesis",
- "3 months": "3 Mēneši",
- "6 months": "6 Mēneši",
- "Custom interval": "Klienta intervāls",
- "Interval": "Intervāls",
- "Step size": "Soļa lielums",
- "Ok": "Ok"
- }
- }
- },
- "icon": {
- "icon": "Ikona",
- "select-icon": "Atlasīt ikonas",
- "material-icons": "Materiālu ikonas",
- "show-all": "Rādīt visas ikonas"
- },
- "custom": {
- "widget-action": {
- "action-cell-button": "Aktivitātes šunas poga",
- "row-click": "Uz rindas klikšķis",
- "polygon-click": "Uz daudzstūra klikšķis",
- "marker-click": "Uz marķiera klikšķis",
- "tooltip-tag-action": "Rīku padomu darbība",
- "node-selected": "Uz atlasīto nodi",
- "element-click": "HTML elementa klikšķis"
- }
- },
- "language": {
- "language": "Valodas"
- }
-}
diff --git a/ui/src/app/locale/locale.constant-ro_RO.json b/ui/src/app/locale/locale.constant-ro_RO.json
deleted file mode 100644
index 0ec2c81794..0000000000
--- a/ui/src/app/locale/locale.constant-ro_RO.json
+++ /dev/null
@@ -1,1798 +0,0 @@
-{
- "access": {
- "unauthorized": "Neautorizat",
- "unauthorized-access": "Acces Neautorizat",
- "unauthorized-access-text": "Pentru a accesa această resursă, utilizatorul trebuie să fie identificat",
- "access-forbidden": "Acces Interzis",
- "access-forbidden-text": "Nu ai drept de acces la această resursă!
Pentru a obţine accesul, identifică-te cu alt nume de utilizator",
- "refresh-token-expired": "Sesiunea a expirat",
- "refresh-token-failed": "Sesiunea nu poate fi reîncărcată"
- },
- "action": {
- "activate": "Activează",
- "suspend": "Suspendă",
- "save": "Salvează",
- "saveAs": "Salvează Cu Alt Nume",
- "cancel": "Renunţă",
- "ok": "OK",
- "delete": "Şterge",
- "add": "Adaugă",
- "yes": "Da",
- "no": "Nu",
- "update": "Actualizează",
- "remove": "Elimină",
- "search": "Caută",
- "clear-search": "Resetează Căutarea",
- "assign": "Repartizează",
- "unassign": "Şterge Repartizarea",
- "share": "Partajare",
- "make-private": "Declară Privat",
- "apply": "Aplică",
- "apply-changes": "Aplică Schimbările",
- "edit-mode": "Mod Editare",
- "enter-edit-mode": "Mod Editare",
- "decline-changes": "Refuză Schimbările",
- "close": "Închide",
- "back": "Înapoi",
- "run": "Execută-Rulează",
- "sign-in": "Înregistrează Cont Nou",
- "edit": "Editează",
- "view": "Vizualizează",
- "create": "Creează",
- "drag": "Trage",
- "refresh": "Reactualizează",
- "undo": "Anulează Ultima Comandă",
- "copy": "Copiere",
- "paste": "Lipire",
- "copy-reference": "Copiere Referință",
- "paste-reference": "Lipire Referință",
- "import": "Import",
- "export": "Export",
- "share-via": "Distribuie prin {{provider}}",
- "continue": "Continuă",
- "discard-changes": "Anulează Schimbări"
- },
- "aggregation": {
- "aggregation": "Agregare",
- "function": "Funcţie Agregare Date",
- "limit": "Valori Maxime",
- "group-interval": "Interval Grupare",
- "min": "Minim",
- "max": "Maxim",
- "avg": "Medie",
- "sum": "Sumă",
- "count": "Numără",
- "none": "Nimic"
- },
- "admin": {
- "general": "General",
- "general-settings": "Setări Generale",
- "outgoing-mail": " Server eMail",
- "outgoing-mail-settings": "Setări Pentru : Outgoing Mail Server",
- "system-settings": "Setări Sistem",
- "test-mail-sent": "Mesajul de test setări pentru email a fost trimis cu succes",
- "base-url": "Adresa De Bază URL",
- "base-url-required": "Adresa de bază URL este obligatorie",
- "mail-from": "Mesaj eMail de la expeditor",
- "mail-from-required": "Adresa eMail a expeditorului este obligatorie",
- "smtp-protocol": "Setări Protocol SMTP",
- "smtp-host": "Adresă SMTP",
- "smtp-host-required": "Adresa SMTP este obligatorie",
- "smtp-port": "Port SMTP",
- "smtp-port-required": "Trebuie să precizaţi un port SMTP",
- "smtp-port-invalid": "Textul introdus nu pare să fie al unui port SMTP",
- "timeout-msec": "Timp expirare (milisecunde)",
- "timeout-required": "Timpul de expirare este obligatoriu",
- "timeout-invalid": "Timpul de expirare nu pare să fie valid",
- "enable-tls": "Permite TLS",
- "send-test-mail": "Trimite mesaj eMail test",
- "security-settings": "Setări Securitate",
- "password-policy": "Reguli Pentru Definirea Parolei",
- "minimum-password-length": "Numărul Minim De Caractere Al Parolei",
- "minimum-password-length-required": "Numărul minim de caractere al parolei este obligatoriu",
- "minimum-password-length-range": "Numărul minim de caractere al parolei trebuie să fie între 5 - 50",
- "minimum-uppercase-letters": "Numărul Minim De Caractere Scrise Cu MAJUSCULĂ Din Parolă",
- "minimum-uppercase-letters-range": "Numărul minim de caractere scrise cu majusculă din parolă nu poate fi negativ",
- "minimum-lowercase-letters": "Numărul Minim De Caractere Scrise Cu Literă mică Din Parolă",
- "minimum-lowercase-letters-range": "Numărul minim de caractere scrise cu literă mică din parolă nu poate fi negativ",
- "minimum-digits": "Numărul Minim De Cifre Din Parolă",
- "minimum-digits-range": "Numărul minim de cifre din parolă nu poate fi negativ",
- "minimum-special-characters": "Numărul Minim De Caractere Speciale Din Parolă",
- "minimum-special-characters-range": "Numărul minim de caractere speciale din parolă nu poate fi negativ",
- "password-expiration-period-days": "Perioada de expirare a parolei (zile)",
- "password-expiration-period-days-range": "Perioada de expirare a parolei (zile) nu poate fi negativă",
- "password-reuse-frequency-days": "Frecvenţa de refolosire a parolei (zile)",
- "password-reuse-frequency-days-range": "Frecvenţa de refolosire a parolei(zile) nu poate fi negativă",
- "general-policy": "Reguli Generale",
- "max-failed-login-attempts": "Numărul maxim de încercări eşuate de accesare a paginii înainte de blocarea contului",
- "minimum-max-failed-login-attempts-range": "Numărul maxim de încercări eşuate de accesare a paginii nu poate fi negativ",
- "user-lockout-notification-email": "În Cazul Blocării Contului, Trimite eMail De Notificare"
- },
- "alarm": {
- "alarm": "Alarmă",
- "alarms": "Alarme",
- "select-alarm": "Selectează Alarmă",
- "no-alarms-matching": "Nu au fost găsite alarme pentru '{{entity}}'",
- "alarm-required": "Alarma este obligatorie",
- "alarm-status": "Stare Alarmă",
- "search-status": {
- "ANY": "Oricare",
- "ACTIVE": "Activă",
- "CLEARED": "Ştearsă",
- "ACK": "Observată",
- "UNACK": "Neobservată"
- },
- "display-status": {
- "ACTIVE_UNACK": "Activă Neobservată",
- "ACTIVE_ACK": "Activă Observată",
- "CLEARED_UNACK": "Ștearsă Neobservată",
- "CLEARED_ACK": "Ștearsă Observată"
- },
- "no-alarms-prompt": "NiciO Alarmă Găsită",
- "created-time": "Data Creării",
- "type": "Tipul",
- "severity": "Urgenţa",
- "originator": "Iniţiator",
- "originator-type": "Tip Iniţiator",
- "details": "Detalii",
- "status": "Stare",
- "alarm-details": "Detalii Alarmă",
- "start-time": "Început",
- "end-time": "Sfârşit",
- "ack-time": "Data Observării",
- "clear-time": "Data Ştergerii",
- "severity-critical": "Critică",
- "severity-major": "Majoră",
- "severity-minor": "Minoră",
- "severity-warning": "Avertizare",
- "severity-indeterminate": "Nedeterminată",
- "acknowledge": "Marchează Observat",
- "clear": "Şterge",
- "search": "Caută Alarme",
- "selected-alarms": "{ count, plural, 1 {o alarmă} other {# alarme} } selectate",
- "no-data": "Nu există date de afişat",
- "polling-interval": "Interval actualizare alarme (secunde)",
- "polling-interval-required": "Intervalul pentru actualizarea alarmelor este obligatoriu",
- "min-polling-interval-message": "Valoarea minimă permisă pentru interval actualizare alarme este o secundă",
- "aknowledge-alarms-title": "Ai selectat { count, plural, 1 {o alarmă} other {# alarme} }",
- "aknowledge-alarms-text": "Sigur vrei să marchezi ca 'Observat' { count, plural, 1 {o alarmă} other {# alarme} }?",
- "aknowledge-alarm-title": "Alarmă Observată",
- "aknowledge-alarm-text": "Sigur vrei să marchezi alarma ca 'Observat'?",
- "clear-alarms-title": "Şterge { count, plural, 1 {o alarmă} other {# alarme} }",
- "clear-alarms-text": "Sigur vrei să ștergi { count, plural, 1 {o alarmă} other {# alarme} }?",
- "clear-alarm-title": "Şterge Alarma",
- "clear-alarm-text": "Sigur vrei să ștergi alarma?",
- "alarm-status-filter": "Stare Filtre Alarmă",
- "max-count-load": "Număr maxim de alarme înregistrate (0=nelimitat)",
- "max-count-load-required": "Numărul maxim de alarme înregistrate este obligatoriu",
- "max-count-load-error-min": "Numărul maxim de alarme este 0",
- "fetch-size": "Număr alarme afişate",
- "fetch-size-required": "Numărul alarmelor afişate este obligatoriu",
- "fetch-size-error-min": "Valoarea minimă este 10"
- },
- "alias": {
- "add": "Adaugă Pseudonim",
- "edit": "Editează Pseudonim",
- "name": "Denumire Pseudonim",
- "name-required": "Denumirea pseudonimului este obligatorie",
- "duplicate-alias": "Există deja un pseudonim cu aceeaşi denumire",
- "filter-type-single-entity": "O Singură Entitate",
- "filter-type-entity-list": "Listă Entităţi",
- "filter-type-entity-name": "Nume Entitate",
- "filter-type-state-entity": "Entitate din starea panoului",
- "filter-type-state-entity-description": "Entitate luată din parametrii stării panoului",
- "filter-type-asset-type": "Tip Proprietate",
- "filter-type-asset-type-description": "Proprietăţi de tip: '{{assetType}}'",
- "filter-type-asset-type-and-name-description": "proprietăţi de tipul: '{{assetType}}' a căror denumire începe cu: '{{prefix}}'",
- "filter-type-device-type": "Tip Dispozitiv",
- "filter-type-device-type-description": "Dispozitive tip: '{{deviceType}}'",
- "filter-type-device-type-and-name-description": "Dispozitive Tip: '{{deviceType}}' a căror denumire începe cu: '{{prefix}}'",
- "filter-type-entity-view-type": "Tip entitate definită",
- "filter-type-entity-view-type-description": "Tip entități definite: '{{entityView}}'",
- "filter-type-entity-view-type-and-name-description": "Entități definite de tip: '{{entityView}}' a căror denumire începe cu : '{{prefix}}'",
- "filter-type-relations-query": "Relaţii Interogare",
- "filter-type-relations-query-description": "{{entities}} care au relații tip {{relationType}} în direcția {{direction}} {{rootEntity}}",
- "filter-type-asset-search-query": "Proprietate Asset search query",
- "filter-type-asset-search-query-description": "Proprietăţi de tip {{assetTypes}} care au relații tip {{relationType}} în direcția {{direction}} {{rootEntity}}",
- "filter-type-device-search-query": "Criteriu Căutare Dispozitiv",
- "filter-type-device-search-query-description": "Dispozitive de tip {{deviceTypes}} care au relații tip {{relationType}} în direcția {{direction}} {{rootEntity}}",
- "filter-type-entity-view-search-query": "Criteriu căutare entitate definită",
- "filter-type-entity-view-search-query-description": "Entități definite de tip {{entityViewTypes}} care au relații tip {{relationType}} în direcția {{direction}} {{rootEntity}}",
- "entity-filter": "Filtru Entitate",
- "resolve-multiple": "Rezolvă Ca Entităţi Multiple",
- "filter-type": "Tip Filtru",
- "filter-type-required": "Tipul filtrului este obligatoriu",
- "entity-filter-no-entity-matched": "Nu au fost găsite entităţi corespunzătoare filtrului specificat",
- "no-entity-filter-specified": "Nu a fost specificat filtru pentru entitate",
- "root-state-entity": "Foloseşte Entitatea Stare Panou Ca Origine",
- "root-entity": "Entitate Rădăcină",
- "state-entity-parameter-name": "Nume Parametru Stare Entitate",
- "default-state-entity": "Stare Entitate Implicită",
- "default-entity-parameter-name": "Implicită",
- "max-relation-level": "Nivel Maxim Relaţie",
- "unlimited-level": "Nivel Nelimitat",
- "state-entity": "Entitate Stare Panou",
- "all-entities": "Toate Entităţile",
- "any-relation": "Oricare"
- },
- "asset": {
- "asset": "Proprietate",
- "assets": "Proprietăţi",
- "management": "Administrare Proprietăți",
- "view-assets": "Vezi Proprietăţi",
- "add": "Adaugă Proprietate",
- "assign-to-customer": "Repartizează Proprietate",
- "assign-asset-to-customer": "Repartizează proprietăţi clientului",
- "assign-asset-to-customer-text": "Selectează proprietăţile care vor fi repartizate clientului",
- "no-assets-text": "Nu au fost găsite proprietăţi",
- "assign-to-customer-text": "Selectează clientul căruia îi vor fi repartizate proprietăţile",
- "public": "Publică",
- "assignedToCustomer": "Repartizată clientului",
- "make-public": "Declară proprietate publică",
- "make-private": "Declară proprietate privată",
- "unassign-from-customer": "Şterge repartizare client",
- "delete": "Şterge proprietate",
- "asset-public": "Proprietate publică",
- "asset-type": "Tip Proprietate",
- "asset-type-required": "Tipul proprietății este obligatoriu",
- "select-asset-type": "Alege tipul proprietății",
- "enter-asset-type": "Introdu tipul proprietății",
- "any-asset": "Orice Proprietate",
- "no-asset-types-matching": "Nu a fost găsită nicio proprietate conținând '{{entitySubtype}}'",
- "asset-type-list-empty": "Nu a fost selectat niciun tip de proprietate",
- "asset-types": "Tipuri Proprietate",
- "name": "Nume Proprietate",
- "name-required": "Numele este obligatoriu",
- "description": "Descriere Proprietate",
- "type": "Tip Proprietate",
- "type-required": "Tipul proprietății este obligatoriu",
- "details": "Detalii Proprietate",
- "events": "Evenimente",
- "add-asset-text": "Adaugă proprietate",
- "asset-details": "Detalii proprietate",
- "assign-assets": "Repartizează proprietăţi",
- "assign-assets-text": "Repartizează { count, plural, 1 {o proprietate} other {# proprietăţi} } clientului",
- "delete-assets": "Şterge proprietăţi",
- "unassign-assets": "Şterge repartizare proprietăţi",
- "unassign-assets-action-title": "Şterge repartizare { count, plural, 1 {o proprietate} other {# proprietăţi} } clientului",
- "assign-new-asset": "Repartizează proprietate nouă",
- "delete-asset-title": "Sigur vrei să ștergi '{{assetName}}'?",
- "delete-asset-text": "ATENŢIE! După confirmare, proprietatea şi toate datele referitoare la aceasta, vor fi șterse IREVERSIBIL!",
- "delete-assets-title": "Sigur vrei să ștergi { count, plural, 1 {o proprietate} other {# proprietăţi} }?",
- "delete-assets-action-title": "Ştergi { count, plural, 1 {o proprietate} other {# proprietăţi} }",
- "delete-assets-text": "ATENŢIE! După confirmare, toate proprietăţile selectate şi toate datele referitoare la aceastea, vor fi șterse IREVERSIBIL!",
- "make-public-asset-title": "Sigur vrei ca proprietatea '{{assetName}}' să devină publică ",
- "make-public-asset-text": "ATENŢIE! După confirmare, proprietatea selectată şi toate datele referitoare la aceasta vor putea fi accesate de către oricine",
- "make-private-asset-title": "Sigur vrei ca proprietatea '{{assetName}}' să devină privată?",
- "make-private-asset-text": "ATENŢIE! După confirmare, proprietatea selectată şi toate datele referitoare la aceasta vor putea fi accesate doar de către proprietar",
- "unassign-asset-title": "Sigur vrei să ştergi repartizarea pentru proprietatea '{{assetName}}'?",
- "unassign-asset-text": "ATENŢIE! După confirmare, repartizarea proprietăţii nu va mai putea fi accesată de către client",
- "unassign-asset": "Şterge repartizare proprietate",
- "unassign-assets-title": "Sigur vrei să ştergi repartizarea pentru { count, plural, 1 {o proprietate} other {# proprietăţi} }?",
- "unassign-assets-text": "ATENŢIE! După confirmare, repartizările proprietăţilor selectate nu vor mai putea fi accesate de către client",
- "copyId": "Copiază ID proprietate",
- "idCopiedMessage": "ID-ul proprietăţii a fost copiat în clipboard",
- "select-asset": "Selectează proprietate",
- "no-assets-matching": "Nu au fost găsite proprietăţi al căror nume conține '{{entity}}'",
- "asset-required": "Proprietatea este obligatorie",
- "name-starts-with": "Numele proprietăţii începe cu",
- "import": "Importă proprietăţi",
- "asset-file": "Fişier Proprietăţi",
- "label": "Eticheta"
- },
- "attribute": {
- "attributes": "Atribute",
- "latest-telemetry": "Ultimele Date Telemetrice",
- "attributes-scope": "Scop Atribute Entitate",
- "scope-latest-telemetry": "Ultimele Date Telemetrice",
- "scope-client": "Atribute Client",
- "scope-server": "Atribute Server",
- "scope-shared": "Atribute Partajate",
- "add": "Adaugă Atribut",
- "key": "Cheie",
- "last-update-time": "Ultima Actualizare",
- "key-required": "Cheia atributului este obligatorie",
- "value": "Valoare",
- "value-required": "Valoarea atributului este obligatorie",
- "delete-attributes-title": "Sigur vrei să ștergi { count, plural, 1 {un atribut} other {# atribute} }?",
- "delete-attributes-text": "ATENŢIE! După confirmare, toate atributele selectate vor fi şterse",
- "delete-attributes": "Şterge Atribute",
- "enter-attribute-value": "Specifică Valoarea Atributului",
- "show-on-widget": "Afişează În Widget",
- "widget-mode": "Modul Widget",
- "next-widget": "Widget Următor ",
- "prev-widget": "Widget Precedent",
- "add-to-dashboard": "Adaugă în panou",
- "add-widget-to-dashboard": "Adaugă Widget În Panou",
- "selected-attributes": "{ count, plural, 1 {un atribut} other {# atribute} } selectate",
- "selected-telemetry": "{ count, plural, 1 {o unitate telemetrică} other {# unităţi telemetrice} } selectate"
- },
- "audit-log": {
- "audit": "Audit",
- "audit-logs": "Jurnale Audit",
- "timestamp": "Cronologie",
- "entity-type": "Tip Entitate",
- "entity-name": "Denumire Entitate",
- "user": "Utilizator",
- "type": "Tip",
- "status": "Stare",
- "details": "Detalii",
- "type-added": "Adăugat",
- "type-deleted": "Şters",
- "type-updated": "Actualizat",
- "type-attributes-updated": "Atribute actualizate",
- "type-attributes-deleted": "Atribute şterse",
- "type-rpc-call": "RPC call",
- "type-credentials-updated": "Acreditări actualizate",
- "type-assigned-to-customer": "Repartizat către client",
- "type-unassigned-from-customer": "Anulează Repartizarea Către Client",
- "type-activated": "Activat",
- "type-suspended": "Suspendat",
- "type-credentials-read": "Acreditări citite",
- "type-attributes-read": "Atribute citite",
- "type-relation-add-or-update": "Relaţie actualizată",
- "type-relation-delete": "Relaţie ștearsă",
- "type-relations-delete": "Toate relaţiile șterse",
- "type-alarm-ack": "Confirmat",
- "type-alarm-clear": "Şters",
- "type-login": "Intră În Cont",
- "type-logout": "Parăseşte Contul",
- "type-lockout": "Blocat",
- "status-success": "Succes",
- "status-failure": "Eșec",
- "audit-log-details": "Detalii Jurnale Audit",
- "no-audit-logs-prompt": "Nu Au Fost Găsite Jurnale",
- "action-data": "Detalii Acțiune",
- "failure-details": "Detalii Eșec",
- "search": "Caută Jurnale Audit",
- "clear-search": "Resetează Căutarea"
- },
- "confirm-on-exit": {
- "message": "Au rămas modificări nesalvate. Doriţi să părăsiţi această pagină fară a salva modificările?",
- "html-message": "Au rămas modificări nesalvate.
Doriţi să părăsiţi această pagină fară a salva modificările?",
- "title": "Modificări Nesalvate"
- },
- "contact": {
- "country": "Ţară",
- "city": "Oraş",
- "state": "Judeţ",
- "postal-code": "Cod Poştal",
- "postal-code-invalid": "Cod poștal incorect",
- "address": "Adresă 1",
- "address2": "Adresă 2",
- "phone": "Telefon",
- "email": "eMail",
- "no-address": "Fără Adresă"
- },
- "common": {
- "username": "Nume Utilizator",
- "password": "Parola",
- "enter-username": "Introdu nume utilizator",
- "enter-password": "Introdu parola",
- "enter-search": "Definește căutarea"
- },
- "content-type": {
- "json": "Json",
- "text": "Text",
- "binary": "Binary (Base64)"
- },
- "customer": {
- "customer": "Client",
- "customers": "Clienţi",
- "management": "Administrare Clienţi",
- "dashboard": "Panou Control Client",
- "dashboards": "Panouri Control Clienţi",
- "devices": "Dispozitive Client",
- "entity-views": "Entități Definite Client",
- "assets": "Proprietăţi Client",
- "public-dashboards": "Panouri Control Publice",
- "public-devices": "Dispozitive Publice",
- "public-assets": "Proprietăţi Publice",
- "public-entity-views": "Definiții Entități Publice Client",
- "add": "Adaugă Client",
- "delete": "Şterge Client",
- "manage-customer-users": "Administrare Utilizatori Client",
- "manage-customer-devices": "Administrare Dispozitive Client",
- "manage-customer-dashboards": "Administrare Panouri Control Client",
- "manage-public-devices": "Administrare Dispozitive Publice",
- "manage-public-dashboards": "Administrare Panouri Control Publice",
- "manage-customer-assets": "Administrare Proprietăţi Client",
- "manage-public-assets": "Administrare Proprietăţi Publice",
- "add-customer-text": "Adăugare Client Nou",
- "no-customers-text": "Nu au fost găsiţi clienţi",
- "customer-details": "Detalii Client",
- "delete-customer-title": "Vrei să ștergi clientul '{{customerTitle}}'?",
- "delete-customer-text": "ATENŢIE! După confirmare, clientul şi toate datele referitoare la acesta vor fi șterse IREVERSIBIL!",
- "delete-customers-title": "Vrei să ștergi { count, plural, 1 {un client} other {# clienţi} }?",
- "delete-customers-action-title": "Şterge { count, plural, 1 {un client} other {# clienţi} }",
- "delete-customers-text": "ATENŢIE! După confirmare, toaţi clienţii selectate şi toate datele referitoare la aceaştia, vor fi șterse IREVERSIBIL!",
- "manage-users": "Administrare Utilizatori",
- "manage-assets": "Administrare Proprietăţi",
- "manage-devices": "Administrare Dispozitive",
- "manage-dashboards": "Administrare Panouri Control Publice",
- "title": "Titlu",
- "title-required": "Titlul este obligatoriu",
- "description": "Descriere",
- "details": "Detalii",
- "events": "Evenimente",
- "copyId": "Copie ID Client",
- "idCopiedMessage": "ID Client A Fost Copiat In Clipboard",
- "select-customer": "Selectează Client",
- "no-customers-matching": "Niciun client nu se potrivește cu:'{{entity}}'",
- "customer-required": "Clientul este obligatoriu",
- "select-default-customer": "Selecteaza Client Implicit",
- "default-customer": "Client Implicit",
- "default-customer-required": "Clientul implicit este obligatoriu pentru a putea depana panoul de control la nivel de PROPRIETAR"
- },
- "datetime": {
- "date-from": "Dată început:",
- "time-from": "Oră început:",
- "date-to": "Dată sfârșit:",
- "time-to": "Oră sfârșit:"
- },
- "dashboard": {
- "dashboard": "Panou",
- "dashboards": "Panouri",
- "management": "Administrare Panouri",
- "view-dashboards": "Afişează Panouri",
- "add": "Adaugă Panou",
- "assign-dashboard-to-customer": "Repartizează Panou/Panouri Clientului",
- "assign-dashboard-to-customer-text": "Selectează panourile care vor fi repartizate clientului",
- "assign-to-customer-text": "Alege Clientul Căruia îi vor fi repartizate Panourile",
- "assign-to-customer": "Repartizează Clientului",
- "unassign-from-customer": "Şterge Repartizarea Către Client",
- "make-public": "Declară Panou Public",
- "make-private": "Declară Panou Privat",
- "manage-assigned-customers": "Administrare Clienţi Repartizaţi",
- "assigned-customers": "Clienţi Repartizaţi",
- "assign-to-customers": "Repartizează Panouri Către Clienţi",
- "assign-to-customers-text": "Alege clienţii cărora le vor fi repartizate panourile",
- "unassign-from-customers": "Şterge repartizarea panourilor către clienţi",
- "unassign-from-customers-text": "Alege clienţii cărora le va fi ștearsă repartizarea panourilor",
- "no-dashboards-text": "Nu au fost găsite panouri",
- "no-widgets": "Nu sunt widgeturi configurate",
- "add-widget": "Adăugare Widget Nou",
- "title": "Titlu Widget",
- "select-widget-title": "Alege Widget",
- "select-widget-subtitle": "Listă Tipuri Widget",
- "delete": "Şterge Panou",
- "title-required": "Titlul este obligatoriu",
- "description": "Descriere",
- "details": "Detalii",
- "dashboard-details": "Detalii Panou",
- "add-dashboard-text": "Adăugare Panou Nou",
- "assign-dashboards": "Repartizare Panouri",
- "assign-new-dashboard": "Repartizare Panou Nou",
- "assign-dashboards-text": "Repartizează { count, plural, 1 {un panou} other {# panouri} } clienţilor",
- "unassign-dashboards-action-text": "Şterge repartizare { count, plural, 1 {un panou} other {# panouri} } către clienți",
- "delete-dashboards": "Şterge Panouri",
- "unassign-dashboards": "Şterge Repartizare Panouri",
- "unassign-dashboards-action-title": "Şterge Repartizare { count, plural, 1 {un panou} other {# panouri} } către client",
- "delete-dashboard-title": "Vrei să ștergi panoul '{{dashboardTitle}}'?",
- "delete-dashboard-text": "ATENŢIE! După confirmare, panoul și datele aferente acestuia vor fi șterse IREVERSIBIL!",
- "delete-dashboards-title": "Vrei să ștergi { count, plural, 1 {un panou} other {# panouri} }?",
- "delete-dashboards-action-title": "Ştergere { count, plural, 1 {un panou} other {# panouri} }",
- "delete-dashboards-text": "ATENŢIE! După confirmare, panourile selectate şi datele aferente acestora vor fi șterse IREVERSIBIL!",
- "unassign-dashboard-title": "Vrei să ştergi repartizarea panoului '{{dashboardTitle}}'?",
- "unassign-dashboard-text": "ATENŢIE! După confirmare, panoul nu va mai putea fi accesat de către client",
- "unassign-dashboard": "Şterge Repartizare Panou",
- "unassign-dashboards-title": "Vrei să ştergi repartizarea a { count, plural, 1 {un panou} other {# panouri} }?",
- "unassign-dashboards-text": "ATENŢIE! După confirmare, panoul nu va mai putea fi accesat de către client",
- "public-dashboard-title": "Panoul a devenit public",
- "public-dashboard-text": "Panoul tău {{dashboardTitle}} a devenit public şi este accesibil la link:",
- "public-dashboard-notice": "Notă: Nu uitaţi să definiţi ca publice şi dispozitivele aferente acestui panou, pentru a le face vizibile",
- "make-private-dashboard-title": "Doriţi să definiţi panoul '{{dashboardTitle}}' ca privat?",
- "make-private-dashboard-text": "ATENŢIE! După confirmare, panoul va putea fi accesat doar de către proprietar",
- "make-private-dashboard": "Declară Panou Privat",
- "socialshare-text": "'{{dashboardTitle}}' powered by ThingsBoard",
- "socialshare-title": "'{{dashboardTitle}}' powered by ThingsBoard",
- "select-dashboard": "Selectează Panou",
- "no-dashboards-matching": "Nu au fost găsite panouri al căror nume conține '{{entity}}'",
- "dashboard-required": "Panoul este obligatoriu",
- "select-existing": "Selectează Un Panou Existent",
- "create-new": "Creează Panou Nou",
- "new-dashboard-title": "Denumire Panou Nou",
- "open-dashboard": "Deschide Panou",
- "set-background": "Setează Culoarea De Fundal (Background)",
- "background-color": "Culoarea (Background)",
- "background-image": "Imaginea (Background)",
- "background-size-mode": "Mod Mărime (Background)",
- "no-image": "Nicio imagine selectată",
- "drop-image": "Trage o imagine sau alege un fişier",
- "settings": "Setări",
- "columns-count": "Număr Coloane",
- "columns-count-required": "Numărul coloanelor este obligatoriu",
- "min-columns-count-message": "Numărul minim permis de coloane este 10",
- "max-columns-count-message": "Numărul maxim permis de coloane este 1000",
- "widgets-margins": "Spaţiu vertical între widgeturi",
- "horizontal-margin": "Spaţiu orizontal între widget-uri",
- "horizontal-margin-required": "Valoarea spaţiului orizontal este obligatorie",
- "min-horizontal-margin-message": "Valoarea minimă permisă pentru spaţiul orizontal între widgeturi este 0",
- "max-horizontal-margin-message": "Valoarea maximă permisă pentru spaţiul orizontal între widgeturi este 0",
- "vertical-margin": "Spaţiu vertical între widgeturi",
- "vertical-margin-required": "Valoarea spaţiului vertical este obligatorie",
- "min-vertical-margin-message": "Valoarea minimă permisă pentru spaţiul vertical între widgeturi este 0",
- "max-vertical-margin-message": "Valoarea maximă permisă pentru spaţiul vertical între widgeturi este 50",
- "autofill-height": "Auto Umplere Pe Înălţime",
- "mobile-layout": "Setări Pagină Pentru Dispozitive Mobile",
- "mobile-row-height": "Înălţimea liniei în pagina pentru dispozitive mobile (pixeli)",
- "mobile-row-height-required": "Valoarea pentru înălţimea liniei este obligatorie",
- "min-mobile-row-height-message": "Valoarea minimă permisă pentru înălţimea liniei în pagina pentru dispozitive mobile este 5 pixeli",
- "max-mobile-row-height-message": "Valoarea maximă permisă pentru înălţimea liniei în pagina pentru dispozitive mobile este 200 pixeli",
- "display-title": "Afişează Titlul Panoului",
- "toolbar-always-open": "Menţine Deschisă Bara De Instrumente",
- "title-color": "Culoare Titlu",
- "display-dashboards-selection": "Afişează Selecţie Panouri",
- "display-entities-selection": "Afişează Selecţie Entităţi",
- "display-dashboard-timewindow": "Afişează Interval",
- "display-dashboard-export": "Afişează Exportul",
- "import": "Importă Panou",
- "export": "Exportă Panou",
- "export-failed-error": "Panoul nu poate fi exportat: {{error}}",
- "create-new-dashboard": "Creează Panou Nou",
- "dashboard-file": "Fişier Pentru Panou",
- "invalid-dashboard-file-error": "Panoul nu poate fi importat; structură de date invalidă",
- "dashboard-import-missing-aliases-title": "Configurează pseudonim pentru panoul importat",
- "create-new-widget": "Creează Widget Nou",
- "import-widget": "Importă Widget",
- "widget-file": "Fişier Pentru Widget",
- "invalid-widget-file-error": "Widgetul nu poate fi importat; structură de date invalidă",
- "widget-import-missing-aliases-title": "Configurează pseudonim pentru widgetul importat",
- "open-toolbar": "Deschide Bara De Instrumente Pentru Panou",
- "close-toolbar": "Închide Bara De Instrumente",
- "configuration-error": "Eroare De Configurare",
- "alias-resolution-error-title": "Eroare configurare pseudonim panou",
- "invalid-aliases-config": "Nu există nici un dispozitiv corespunzător filtrului de pseudonime.
Pentru a rezolva această problemă, contactează administratorul",
- "select-devices": "Selectează Dispozitiv",
- "assignedToCustomer": "Repartizat Clientului",
- "assignedToCustomers": "Repartizate Clienților",
- "public": "Publice",
- "public-link": "Adresă Pagină Publică",
- "copy-public-link": "Copiază Adresa Paginii Publice",
- "public-link-copied-message": "Adresa paginii publice a panoului a fost copiată în clipboard",
- "manage-states": "Administrare Stări Panou",
- "states": "Stări Panou",
- "search-states": "Caută Stări Panou",
- "selected-states": "{ count, plural, 1 {o stare panou} other {# stări panou}} selectate",
- "edit-state": "Editează Stare Panou",
- "delete-state": "Şterge Stare Panou",
- "add-state": "Adaugă Stare Panou",
- "state": "Stare Panou",
- "state-name": "Denumire",
- "state-name-required": "Denumirea stării panoului este obligatorie",
- "state-id": "ID Stare Panou",
- "state-id-required": "IDul Stării panoului este obligatoriu",
- "state-id-exists": "O stare panou având acest ID este deja înregistrată",
- "is-root-state": "Stare Rădăcină",
- "delete-state-title": "Şterge Stare Panou",
- "delete-state-text": "Sigur vrei să ștergi starea panou '{{stateName}}'?",
- "show-details": "Afişează Detalii",
- "hide-details": "Ascunde Detalii",
- "select-state": "Selectează Stare Destinaţie",
- "state-controller": "Controler Stări"
- },
- "datakey": {
- "settings": "Setări",
- "advanced": "Avansat",
- "label": "Etichetă",
- "color": "Culoare",
- "units": "Simbol special atașat valorii afişate",
- "decimals": "Număr zecimale",
- "data-generation-func": "Funcţie Generare Date",
- "use-data-post-processing-func": "Utilizare Funcţie Post Procesare",
- "configuration": "Configurare Chei Date",
- "timeseries": "Serii Temporale",
- "attributes": "Atribute",
- "entity-field": "Câmp Entitate",
- "alarm": "Câmpuri Alarmă",
- "timeseries-required": "Seriile temporale pentru entitate sunt obligatorii",
- "timeseries-or-attributes-required": "Seriile temporale sau atributele pentru entitate sunt obligatorii",
- "maximum-timeseries-or-attributes": "{ count, plural, 1 { Este permisă maximum o serie temporală sau atribut} other {Sunt permise maximum # serii temporale sau atribute}}",
- "alarm-fields-required": "Câmpurile pentru alarmă sunt obligatorii",
- "function-types": "Tipuri Funcţie",
- "function-types-required": "Tipurile de funcţie sunt obligatorii",
- "maximum-function-types": "Maximum { count, plural, 1 {Este permis doar un tip de funcţie} other {Sunt permise doar # tipuri de funcţie} }",
- "time-description": "Cronologie valoare curentă;",
- "value-description": "valoare curentă;",
- "prev-value-description": "Rezultat execuție funcţie precedentă;",
- "time-prev-description": "Cronologie valoare precedentă;",
- "prev-orig-value-description": "Valoare precedentă originală;"
- },
- "datasource": {
- "type": "Tip Sursă Date",
- "name": "Denumire",
- "add-datasource-prompt": "Adaugă Sursă Date"
- },
- "details": {
- "edit-mode": "Mod Editare",
- "toggle-edit-mode": "Schimbă Mod Editare"
- },
- "device": {
- "device": "Dispozitiv",
- "device-required": "Dispozitivul este obligatoriu",
- "devices": "Dispozitive",
- "management": "Administrare Dispozitive",
- "view-devices": "Vizualizare Dispozitive",
- "device-alias": "Pseudonim Dispozitiv",
- "aliases": "Pseudonime Dispozitiv",
- "no-alias-matching": "'{{alias}}' nu a fost găsit",
- "no-aliases-found": "Nu au fost găsite pseudonime",
- "no-key-matching": "'{{key}}' nu a fost găsită",
- "no-keys-found": "Nu a fost găsită nicio cheie",
- "create-new-alias": "Creează Pseudonim Nou",
- "create-new-key": "Creează Cheie Nouă",
- "duplicate-alias-error": "Pseudonimul ales este deja înregistrat : '{{alias}}'.
Pseudonimele dispozitivelor trebuie să fie unice în acelaşi panou",
- "configure-alias": "Configurează Pseudonim: '{{alias}}'",
- "no-devices-matching": "Nu au fost găsite dispozitive al căror nume conține: '{{entity}}'",
- "alias": "Pseudonim",
- "alias-required": "Pseudonimul pentru dispozitiv este obligatoriu",
- "remove-alias": "Şterge Pseudonim Dispozitiv",
- "add-alias": "Adaugă Pseudonim Dispozitiv",
- "name-starts-with": "Denumirea dispozitivului începe cu: ",
- "device-list": "Listă Dispozitive",
- "use-device-name-filter": "Utilizează Filtru Căutare",
- "device-list-empty": "Nu este selectat niciun dispozitiv",
- "device-name-filter-required": "Filtrul de căutare pentru nume dispozitiv este obligatoriu",
- "device-name-filter-no-device-matched": "Nu au fost găsite dispozitive al căror nume începe cu '{{device}}'",
- "add": "Adaugă Dispozitiv",
- "assign-to-customer": "Repartizează Clientului",
- "assign-device-to-customer": "Repartizează Dispozitiv(e) Clientului",
- "assign-device-to-customer-text": "Selectează dispozitivele de repartizat clientului ",
- "make-public": "Configurează Ca Dispozitiv Public",
- "make-private": "Configurează Ca Dispozitiv Privat",
- "no-devices-text": "Nu există dispozitive",
- "assign-to-customer-text": "Selectrază clientul căruia să-i fie repartizat(e) dispozitiv(ele)",
- "device-details": "Detalii Dispozitiv",
- "add-device-text": "Adaugă Dispozitiv Nou",
- "credentials": "Acreditări",
- "manage-credentials": "Administrare Acreditări",
- "delete": "Şterge Dispozitiv",
- "assign-devices": "Repartizeză Dispozitive",
- "assign-devices-text": "Repartizeză { count, plural, 1 {un dispozitiv} other {# dispozitive} } Clientului",
- "delete-devices": "Şterge Dispozitive",
- "unassign-from-customer": "Şterge repartizarea către client",
- "unassign-devices": "Şterge repartizarea dispozitivelor",
- "unassign-devices-action-title": "Şterge repartizarea a { count, plural, 1 {un dispozitiv} other {# dispozitive} } de la client",
- "assign-new-device": "Repartizare Dispozitiv Nou",
- "make-public-device-title": "Sigur vrei să faci dispozitivul '{{deviceName}}' public?",
- "make-public-device-text": "După confirmare, dispozitivul și toate datele aferente acestuia vor fi făcute publice, fiind deci accesibile oricui",
- "make-private-device-title": "Sigur vrei să faci dispozitivul '{{deviceName}}' privat?",
- "make-private-device-text": "După confirmare, dispozitivul și toate datele aferente acestuia vor fi private, deci accesibile doar proprietarului",
- "view-credentials": "Vezi Credențiale",
- "delete-device-title": "Sigur vrei să ștergi dispozitivul '{{deviceName}}'?",
- "delete-device-text": "ATENȚIE! După confirmare, dispozitivul împreună cu datele aferente acestuia vor fi șterse IREVERSIBIL!",
- "delete-devices-title": "Sigur vrei să ștergi { count, plural, 1 {un dispozitiv} other {# dispozitive} }?",
- "delete-devices-action-title": "Delete { count, plural, 1 {un dispozitiv} other {# dispozitive} }",
- "delete-devices-text": "ATENȚIE! După confirmare, toate dispozitivele selectate, împreună cu datele aferente acestora, vor fi șterse IREVERSIBIL!",
- "unassign-device-title": "Sigur vrei să ștergi repartizarea dispozitivului '{{deviceName}}'?",
- "unassign-device-text": "ATENȚIE! După confirrmare, dispozitivul nu va mai fi accesibil clientului",
- "unassign-device": "Șterge repartizare dispozitiv",
- "unassign-devices-title": "Sigur vrei să ștergi repartizarea pentru { count, plural, 1 {un dispozitiv} other {# devices} }?",
- "unassign-devices-text": "ATENȚIE! După confirmare, repartizarea dispozitivelor va fi ștearsă, acestea nemaifiind accesibile clientului",
- "device-credentials": "Credențiale Dispozitiv",
- "credentials-type": "Tip Credențiale",
- "access-token": "Token Acces",
- "access-token-required": "Tokenul de acces este necesar",
- "access-token-invalid": "Dimensiunea tokenului de acces trebuie să fie de 1-20 caractere",
- "rsa-key": "Cheie RSA publică",
- "rsa-key-required": "Cheia RSA publică key este necesară",
- "secret": "Cod Secret",
- "secret-required": "Codul secret este necesar",
- "device-type": "Tip Dispozitiv",
- "device-type-required": "Tipul dispozitivului este obligatoriu",
- "select-device-type": "Alege tipul dispozitivului",
- "enter-device-type": "Introdu tipul dispozitivului",
- "any-device": "Orice Dispozitiv",
- "no-device-types-matching": "Nu au fost găsite dispozitive de tip '{{entitySubtype}}' ",
- "device-type-list-empty": "Nu au fost selectate tipuri dispozitiv",
- "device-types": "Tipuri dispozitiv",
- "name": "Nume",
- "name-required": "Numele este obligatoriu",
- "description": "Descriere",
- "label": "Etichetă",
- "events": "Evenimente",
- "details": "Detalii",
- "copyId": "Copie ID Dispozitiv",
- "copyAccessToken": "Copiază Token Acces",
- "idCopiedMessage": "ID dispozitiv copiat în clipboard",
- "accessTokenCopiedMessage": "Token acces dispozitiv copiat în clipboard",
- "assignedToCustomer": "Repartizat clientului",
- "unable-delete-device-alias-title": "Pseudonimul dispozitivului nu poate fi șters",
- "unable-delete-device-alias-text": "Pseudonimul dispozitivului '{{deviceAlias}}' nu poate fi șters, întrucât este folosit de widget(urile):
{{widgetsList}}",
- "is-gateway": "Este gateway",
- "public": "Public",
- "device-public": "Dispozitivul este public",
- "select-device": "Selectează Dispozitiv",
- "import": "Importă Dispozitiv",
- "device-file": "Fișier dispozitiv"
- },
- "dialog": {
- "close": "Închide Casetă Dialog"
- },
- "direction": {
- "column": "Coloană",
- "row": "Linie"
- },
- "error": {
- "unable-to-connect": "Conexiunea cu serverul imposibilă! Ești conectat la Internet?",
- "unhandled-error-code": "Cod eroare negestionată: {{errorCode}}",
- "unknown-error": "Eroare necunoscută"
- },
- "entity": {
- "entity": "Entitate",
- "entities": "Entități",
- "aliases": "Pseudonime Entități",
- "entity-alias": "Pseudonim Entitate",
- "unable-delete-entity-alias-title": "Ștergerea pseudonimului entității este imposibilă",
- "unable-delete-entity-alias-text": "Pseudonimul entității '{{entityAlias}}', fiind folosit de widgetul/widgeturile:
{{widgetsList}}",
- "duplicate-alias-error": "Pseudonimul entității este duplicat
Pseudonimele entităților trebuie să fie unice, în același panou",
- "missing-entity-filter-error": "Lipsă filtru pentru pseudonimul '{{alias}}'",
- "configure-alias": "Configurează pseudonimul '{{alias}}'",
- "alias": "Pseudonim",
- "alias-required": "Pseudonimul entității este necesar",
- "remove-alias": "șterge Alias Entitate",
- "add-alias": "Adaugă Alias Entitate",
- "entity-list": "Listă Entități",
- "entity-type": "Tip Entitate",
- "entity-types": "Tipuri Entități",
- "entity-type-list": "Listă Tipuri Entități",
- "any-entity": "Orice Entitate",
- "enter-entity-type": "Introdu Tip Entitate",
- "no-entities-matching": "Nu a fost găsită nicio entitate conținând '{{entity}}' ",
- "no-entity-types-matching": "Nu au fost găsite tipuri de entități conținând '{{entityType}}'",
- "name-starts-with": "Numele începe cu",
- "use-entity-name-filter": "Folosește filtru",
- "entity-list-empty": "Nicio entitate selectată",
- "entity-type-list-empty": "Niciun tip entitate selectat",
- "entity-name-filter-required": "Filtrul pentru nume entitate este necesar",
- "entity-name-filter-no-entity-matched": "Nu a fost găsită nicio entitate al cărei nume începe cu '{{entity}}'",
- "all-subtypes": "Toate",
- "select-entities": "Selectează entități",
- "no-aliases-found": "Niciun pseudonim găsit",
- "no-alias-matching": "Nu am găsit pseudonimul '{{alias}}'",
- "create-new-alias": "Creează unul nou!",
- "key": "Cheie",
- "key-name": "Nume Cheie",
- "no-keys-found": "Nicio cheie găsită",
- "no-key-matching": "Nu am găsit cheia '{{key}}'",
- "create-new-key": "Creează una nouă!",
- "type": "Tip",
- "type-required": "Tipul entității este necesar",
- "type-device": "Dispozitiv",
- "type-devices": "Dispozitive",
- "list-of-devices": "{ count, plural, 1 {un dispozitiv} other {Listă # dispozitive} }",
- "device-name-starts-with": "Dispozitive a căror nume începe cu '{{prefix}}'",
- "type-asset": "Proprietate",
- "type-assets": "Proprietăți",
- "list-of-assets": "{ count, plural, 1 {o proprietate} other {Listă # proprietăți} }",
- "asset-name-starts-with": "Proprietate a cărei nume începe cu '{{prefix}}'",
- "type-entity-view": "Entitate Definită",
- "type-entity-views": "Entități Definite",
- "list-of-entity-views": "{ count, plural, 1 {o entitate definită} other {Listă # entități definite} }",
- "entity-view-name-starts-with": "Entități definite al căror nume începe cu '{{prefix}}'",
- "type-rule": "Regulă",
- "type-rules": "Reguli",
- "list-of-rules": "{ count, plural, 1 {o regulă} other {Listă # reguli} }",
- "rule-name-starts-with": "Reguli al căror nume începe cu '{{prefix}}'",
- "type-plugin": "Plugin",
- "type-plugins": "Plugin-uri",
- "list-of-plugins": "{ count, plural, 1 {un plugin} other {Listă # plugin-uri} }",
- "plugin-name-starts-with": "Plugin-uri al căror nume începe cu '{{prefix}}'",
- "type-tenant": "Locatar",
- "type-tenants": "Locatari",
- "list-of-tenants": "{ count, plural, 1 {un locatar} other {Listă # locatari} }",
- "tenant-name-starts-with": "Locatari al căror nume începe cu '{{prefix}}'",
- "type-customer": "Client",
- "type-customers": "Clienţi",
- "list-of-customers": "{ count, plural, 1 {un client} other {Listă # Clienţi} }",
- "customer-name-starts-with": "Clienţi al căror nume începe cu '{{prefix}}'",
- "type-user": "Utilizator",
- "type-users": "Utilizatori",
- "list-of-users": "{ count, plural, 1 {un utilizator} other {Listă # utilizatori} }",
- "user-name-starts-with": "Utilizatori al căror nume începe cu '{{prefix}}'",
- "type-dashboard": "Panou Control",
- "type-dashboards": "Panouri Control",
- "list-of-dashboards": "{ count, plural, 1 {un panou control} other {Listă # panouri control} }",
- "dashboard-name-starts-with": "Panouri control al căror nume începe cu '{{prefix}}'",
- "type-alarm": "Alarmă",
- "type-alarms": "Alarme",
- "list-of-alarms": "{ count, plural, 1 {o alarmă} other {Listă # alarme} }",
- "alarm-name-starts-with": "Alarme al căror nume începe cu '{{prefix}}'",
- "type-rulechain": "Flux",
- "type-rulechains": "Fluxuri",
- "list-of-rulechains": "{ count, plural, 1 {un flux} other {Listă # fluxuri} }",
- "rulechain-name-starts-with": "Fluxuri al căror nume începe cu '{{prefix}}'",
- "type-rulenode": "Nod flux",
- "type-rulenodes": "Noduri flux",
- "list-of-rulenodes": "{ count, plural, 1 {un nod flux} other {Listă # noduri flux} }",
- "rulenode-name-starts-with": "Noduri flux al căror nume începe cu '{{prefix}}'",
- "type-current-customer": "Client Curent",
- "search": "Caută Entități",
- "selected-entities": "{ count, plural, 1 {o entitate} other {# entități} } selectate",
- "entity-name": "Nume Entitate",
- "entity-label": "Etichetă Entitate",
- "details": "Detalii Entitate",
- "no-entities-prompt": "Nu au fost găsite entități",
- "no-data": "Nu există date de afișat",
- "columns-to-display": "Coloane Afișate"
- },
- "entity-field": {
- "created-time": "Momentul Creării",
- "name": "Denumire",
- "type": "Tip",
- "first-name": "Prenume",
- "last-name": "Nume",
- "email": "eMail",
- "title": "Formula De Adresare",
- "country": "Ţara",
- "state": "Judeţ",
- "city": "Oraş",
- "address": "Adresa 1",
- "address2": "Adresa 2",
- "zip": "Cod Poştal",
- "phone": "Telefon",
- "label": "Etichetă"
- },
- "entity-view": {
- "entity-view": "Entitate Definită",
- "entity-view-required": "Entitatea definită este obligatorie",
- "entity-views": "Entități Definite",
- "management": "Administrare Entități Definite",
- "view-entity-views": "Afişează Entități Definite",
- "entity-view-alias": "Pseudonim Entitate Definită",
- "aliases": "Pseudonime Entități Definite",
- "no-alias-matching": "'{{alias}}' Pseudonimul nu a fost găsit",
- "no-aliases-found": "Nu au fost găsite pseudonime",
- "no-key-matching": "Cheia '{{key}}' nu a fost găsită",
- "no-keys-found": "Nu a fost găsită nicio cheie",
- "create-new-alias": "Creează Alias Nou",
- "create-new-key": "Creează Cheie Nouă",
- "duplicate-alias-error": "Pseudonimul: '{{alias}}' este deja înregistrat
Pseudonimele pentru entităţi trebuie să fie unice în acelaşi panou",
- "configure-alias": "Configurează pseudonim'{{alias}}'",
- "no-entity-views-matching": "Nu au fost găsite entități definite după criteriul: '{{entity}}'",
- "alias": "Pseudonim",
- "alias-required": "Pseudonimul entității definite este obligatoriu",
- "remove-alias": "Şterge pseudonim entitate definită",
- "add-alias": "Adaugă pseudonim entitate definită",
- "name-starts-with": "Numele entității definite începe cu ",
- "entity-view-list": "Listă Entități Definite",
- "use-entity-view-name-filter": "Filtrează",
- "entity-view-list-empty": "Nu au fost selectate entități definite",
- "entity-view-name-filter-required": "Filtrul pentru numele entității definite este obligatoriu",
- "entity-view-name-filter-no-entity-view-matched": "Nu au fost găsite entități definite al căror nume conține: '{{entityView}}'",
- "add": "Adaugă Entitate Definită",
- "assign-to-customer": "Repartizare către client",
- "assign-entity-view-to-customer": "Repartizare Entități Definite Clientului",
- "assign-entity-view-to-customer-text": "Selectează entitățile definite ce vor fi repartizate clientului",
- "no-entity-views-text": "Nu există entități definite",
- "assign-to-customer-text": "Selectează clientul căruia îi vor fi repartizate entitățile definite",
- "entity-view-details": "Detalii Entitate Definită",
- "add-entity-view-text": "Adaugă Entitate Definită",
- "delete": "ßterge Entitate Definită",
- "assign-entity-views": "Repartizează Entitate Definită",
- "assign-entity-views-text": "Repartizează { count, plural, 1 {o entitate definită} other {# entități definite} } clientului",
- "delete-entity-views": "Şterge Entități Definite",
- "unassign-from-customer": "Ştergere Repartizare Către Client",
- "unassign-entity-views": "Ştergere Repartizare Entități Definite",
- "unassign-entity-views-action-title": "Şterge repartizare { count, plural, 1 {o entitate definită} other {# entități definite} } de la client ",
- "assign-new-entity-view": "Repartizează Entitate Definită Nouă",
- "delete-entity-view-title": "Sigur vrei să ștergi entitatea definită : '{{entityViewName}}'?",
- "delete-entity-view-text": "ATENŢIE! După confirmare, entitatea definită şi toate datele asociate cu aceasta vor fi șterse IREVERSIBIL!",
- "delete-entity-views-title": "Sigur vrei să ștergi{ count, plural, 1 {o entitate definită} other {# entități definite} }?",
- "delete-entity-views-action-title": "Şterge { count, plural, 1 {o entitate definită} other {# entități definite} }",
- "delete-entity-views-text": "ATENŢIE! După confirmare, toate entitățile definite și datele asociate acestora vor fi șterse IREVERSIBIL!",
- "unassign-entity-view-title": "Sigur vrei să ștergi repartizarea entității definite : '{{entityViewName}}'?",
- "unassign-entity-view-text": "ATENŢIE! După confirmare, clientul nu va mai putea accesa entitatea definită selectată",
- "unassign-entity-view": "Şterge Repartizare Entitate Definită",
- "unassign-entity-views-title": "Sigur vrei să ștergi repartizarea a { count, plural, 1 {o entitate definită} other {# entități definite} }?",
- "unassign-entity-views-text": "ATENŢIE! După confirmare, clientul nu va mai putea accesa entitățile definite selectate",
- "entity-view-type": "Tip Entitate Definită",
- "entity-view-type-required": "Tipul ecranului pentru entitate este obligatoriu",
- "select-entity-view-type": "Selectaţi Tipul Ecranului Pentru Entitate",
- "enter-entity-view-type": "Introduceţi Tipul Ecranului Pentru Entitate",
- "any-entity-view": "Orice Entitate Definită",
- "no-entity-view-types-matching": "Nu au fost găsite tipuri de entitate definită care să corespundă criteriului '{{entitySubtype}}'",
- "entity-view-type-list-empty": "Nu au fost selectate tipuri de entitate definită",
- "entity-view-types": "Tipuri Entitate Definită",
- "name": "Denumire",
- "name-required": "Denumirea este obligatorie",
- "description": "Descriere",
- "events": "Evenimente",
- "details": "Detalii",
- "copyId": "Copie ID Entitate Definită",
- "assignedToCustomer": "Repartizat Clientului",
- "unable-entity-view-device-alias-title": "Pseudonimul entității definite nu poate fi şters",
- "unable-entity-view-device-alias-text": "Pseudonimul dispozitivului : '{{entityViewAlias}}' nu poate fi șters, fiind folosit de widgetul/widgeturile :
{{widgetsList}}",
- "select-entity-view": "Selectează Entitate Definită",
- "make-public": "Declară Entitate Definită Publică",
- "make-private": "Declară Entitate Definită Privată",
- "start-date": "Dată Început",
- "start-ts": "Oră Început",
- "end-date": "Dată Sfârșit",
- "end-ts": "Oră Sfârșit",
- "date-limits": "Limite Dată",
- "client-attributes": "Atribute Client",
- "shared-attributes": "Atribute Partajate",
- "server-attributes": "Atribute Server",
- "timeseries": "Serii Temporale",
- "client-attributes-placeholder": "Atribute Client",
- "shared-attributes-placeholder": "Atribute Partajate",
- "server-attributes-placeholder": "Atribute Server",
- "timeseries-placeholder": "Serii Temporale",
- "target-entity": "Entitate Destinaţie",
- "attributes-propagation": "Propagare Atribute",
- "attributes-propagation-hint": "Entitatea definită va copia automat atributele specificate de la entitatea destinaţie, de fiecare dată când este salvată sau actualizată. Din motive de performanţă, atributele entităţii de destinaţie nu sunt propagate către entitatea definită la fiecare modificare de atribut. Poți activa propagarea automată a atributelor prin configurarea nodului în mod \"copiază pentru a vedea\" în fluxul tău și conectarea mesajelor \"Post Atribute\" și \"Atribute Actualizate\" la noul nod",
- "timeseries-data": "Date Serii Temporale",
- "timeseries-data-hint": "Configurează intervale timp pentru seriile temporale ale entităţii destinaţie, care vor fi accesibile prin entitatea definită. Acestea nu vor putea fi modificate",
- "make-public-entity-view-title": "Sigur vrei să faci publică entitatea definită: '{{entityViewName}}'?",
- "make-public-entity-view-text": "ATENŢIE! După confirmare, entitatea definită și datele aferente acesteia vor deveni publice, deci accesibile oricui",
- "make-private-entity-view-title": "Sigur vrei să faci privată entitatea definită: '{{entityViewName}}'?",
- "make-private-entity-view-text": "ATENŢIE! După confirmare, entitatea definită şi toate datele aferente acesteia, vor deveni private, la ele având acces doar proprietarul"
- },
- "event": {
- "event-type": "Tip Eveniment",
- "type-error": "Eroare",
- "type-lc-event": "Durată Eveniment",
- "type-stats": "Statistică",
- "type-debug-rule-node": "Depanare",
- "type-debug-rule-chain": "Depanare",
- "no-events-prompt": "Nu au fost găsite evenimente",
- "error": "Eroare",
- "alarm": "Alarmă",
- "event-time": "Oră Eveniment",
- "server": "Server",
- "body": "Corp",
- "method": "Metodă",
- "type": "Tip",
- "entity": "Entitate",
- "message-id": "ID Mesaj",
- "message-type": "Tip Mesaj",
- "data-type": "Tip Date",
- "relation-type": "Tip Relaţie",
- "metadata": "Metadata",
- "data": "Date",
- "event": "Eveniment",
- "status": "Stare",
- "success": "Succes",
- "failed": "Eşuat",
- "messages-processed": "Mesaje procesate",
- "errors-occurred": "Au apărut erori"
- },
- "extension": {
- "extensions": "Extensii",
- "selected-extensions": "{ count, plural, 1 {o extensie selectată} other {# extensii selectate} }",
- "type": "Tip",
- "key": "Cheie",
- "value": "Valoare",
- "id": "ID",
- "extension-id": "ID Extensie",
- "extension-type": "Tip Extensie",
- "transformer-json": "JSON *",
- "unique-id-required": "ID-ul curent pentru extensie este deja înregistrat",
- "delete": "Şterge Extensie",
- "add": "Adaugă Extensie",
- "edit": "Editează Extensie",
- "delete-extension-title": "Sigur vrei să ștergi extensia: '{{extensionId}}'?",
- "delete-extension-text": "ATENŢIE! După confirmare, extensia şi toate datele asociate acesteia, vor fi șterse IREVERSIBIL!",
- "delete-extensions-title": "Sigur vrei să ștergi { count, plural, 1 {o extensie} other {# extensii} }?",
- "delete-extensions-text": "ATENŢIE! După confirmare, toate extensiile selectate vor fi șterse IREVERSIBIL!",
- "converters": "Convertoare",
- "converter-id": "ID Convertoare",
- "configuration": "Configurare",
- "converter-configurations": "Configurator Convertoare",
- "token": "Token De Securitate",
- "add-converter": "Adaugă Convertor",
- "add-config": "Adaugă Configurator Convertoare",
- "device-name-expression": "Expresie Denumire Dispozitiv",
- "device-type-expression": "Expresie Tip Dispozitiv",
- "custom": "Definit De Utilizator",
- "to-double": "To Double",
- "transformer": "Transformare",
- "json-required": "Este necesar transformer json",
- "json-parse": "Analiză transformer json imposibilă",
- "attributes": "Atribute",
- "add-attribute": "Adaugă Atribut",
- "add-map": "Adaugă Mapare",
- "timeseries": "Date Cronologice",
- "add-timeseries": "Adaugă Set Date Cronologice",
- "field-required": "Câmpul Este Obligatoriu",
- "brokers": "Brokeri",
- "add-broker": "Adaugă Broker",
- "host": "Gazdă",
- "port": "Port",
- "port-range": "Valoarea portului trebuie să fie în intervalul 1 - 65535",
- "ssl": "SSL",
- "credentials": "Acreditări",
- "username": "Nume Utilizator",
- "password": "Parolă",
- "retry-interval": "Interval Reîncercare (milisecunde)",
- "anonymous": "Anonim",
- "basic": "Bazic",
- "pem": "PEM",
- "ca-cert": "Fişier Certificat CA",
- "private-key": "Fişier Cheie Privată *",
- "cert": "Fişier Certificat *",
- "no-file": "Niciun fișier selectat",
- "drop-file": "Trageţi un fişier sau selectaţi cu mouseul un fişier pentru a fi încărcat",
- "mapping": "Mapare",
- "topic-filter": "Filtru Topic",
- "converter-type": "Tipul Convertor",
- "converter-json": "Json",
- "json-name-expression": "Expresie JSON Pentru Nume Dispozitiv",
- "topic-name-expression": "Expresie TOPIC Pentru Nume Dispozitiv",
- "json-type-expression": "Expresie JSON Pentru Tip Dispozitiv",
- "topic-type-expression": "Expresie TOPIC Pentru Tip Dispozitiv",
- "attribute-key-expression": "Expresie Cheie Atribut",
- "attr-json-key-expression": "Expresie JSON Cheie Atribut",
- "attr-topic-key-expression": "Expresie Topic Cheie Atribut",
- "request-id-expression": "Expresie Cerere ID",
- "request-id-json-expression": "Expresie JSON Cerere ID",
- "request-id-topic-expression": "Expresie TOPIC Cerere ID",
- "response-topic-expression": "Expresie Răspuns Topic",
- "value-expression": "Valoare Expresie",
- "topic": "Topic",
- "timeout": "Timp De Expirare (milisecunde)",
- "converter-json-required": "Convertorul JSON este obligatoriu",
- "converter-json-parse": "Analiză converter JSON imposibilă",
- "filter-expression": "Filtrează expresie",
- "connect-requests": "Solicitări Conectare",
- "add-connect-request": "Adaugă Solicitare Conectare",
- "disconnect-requests": "Solicitări Deconectare",
- "add-disconnect-request": "Adaugă Solicitare Deconectare",
- "attribute-requests": "Solicitări Atribut",
- "add-attribute-request": "Adaugă Solicitare Atribut",
- "attribute-updates": "Actualizări Atribut",
- "add-attribute-update": "Adaugă Actualizare Atribut",
- "server-side-rpc": "Server RPC",
- "add-server-side-rpc-request": "Adaugă Solicitare RPC Server-Side",
- "device-name-filter": "Filtru Nume Dispozitiv",
- "attribute-filter": "Filtru Atribut",
- "method-filter": "Filtru Metodă",
- "request-topic-expression": "Solicită expresie topic",
- "response-timeout": "Timp răspuns în milisecunde",
- "topic-expression": "Expresie Topic",
- "client-scope": "Scop Client",
- "add-device": "Adaugă Dispozitiv",
- "opc-server": "Servere",
- "opc-add-server": "Adaugă Server",
- "opc-add-server-prompt": "Te rog, adaugă server ",
- "opc-application-name": "Nume Aplicație",
- "opc-application-uri": "URI Aplicație",
- "opc-scan-period-in-seconds": "Perioadă Scanare (secunde)",
- "opc-security": "Securitate",
- "opc-identity": "Identitate",
- "opc-keystore": "Keystore",
- "opc-type": "Tip OPC",
- "opc-keystore-type": "Tip Keystore",
- "opc-keystore-location": "Localizare *",
- "opc-keystore-password": "Parolă",
- "opc-keystore-alias": "Pseudonim",
- "opc-keystore-key-password": "Cheie Parolă",
- "opc-device-node-pattern": "Structură Nod Dispozitiv",
- "opc-device-name-pattern": "Structură Nume Dispozitiv",
- "modbus-server": "Servere/sclavi",
- "modbus-add-server": "Adaugă server/sclav",
- "modbus-add-server-prompt": "Te rog adaugă server/sclav",
- "modbus-transport": "Transport",
- "modbus-tcp-reconnect": "Reconectare Automată",
- "modbus-rtu-over-tcp": "RTU peste TCP",
- "modbus-port-name": "Nume Port Serial",
- "modbus-encoding": "Codificare",
- "modbus-parity": "Paritate",
- "modbus-baudrate": "Rată Baud",
- "modbus-databits": "Biți Date",
- "modbus-stopbits": "Biți Stop",
- "modbus-databits-range": "Bitii de date trebuie să fie în intervalul 7-8",
- "modbus-stopbits-range": "Bitii de stop trebuie să fie în intervalul 1-2",
- "modbus-unit-id": "ID Unitate",
- "modbus-unit-id-range": "ID-ul unității trebuie să fie în intervalul 1-247",
- "modbus-device-name": "Nume Dispozitiv",
- "modbus-poll-period": "Perioadă Interogare (ms)",
- "modbus-attributes-poll-period": "Perioadă Interogare Atribute (ms)",
- "modbus-timeseries-poll-period": "Perioadă Interogare serii temporale (ms)",
- "modbus-poll-period-range": "Perioada de interogare trebuie să fie pozitivă",
- "modbus-tag": "Tag",
- "modbus-function": "Funcție",
- "modbus-register-address": "Adresă Registru",
- "modbus-register-address-range": "Adresa registrului trebuie să fie în intervalul 0-65535",
- "modbus-register-bit-index": "Index biți",
- "modbus-register-bit-index-range": "Indexul biților trebuie să fie în intervalul 0-15",
- "modbus-register-count": "Număr Regiștri",
- "modbus-register-count-range": "Numărul regiștrilor trebuie să fie pozitiv",
- "modbus-byte-order": "Ordine Bytes",
- "sync": {
- "status": "Stare",
- "sync": "Sincronizat",
- "not-sync": "Nesincronizat",
- "last-sync-time": "Ultima Sincronizare",
- "not-available": "Indisponibil"
- },
- "export-extensions-configuration": "Exportă configuraţie extensii",
- "import-extensions-configuration": "Importă configuraţie extensii",
- "import-extensions": "Importă Extensii",
- "import-extension": "Importă Extensie",
- "export-extension": "Exportă Extensie",
- "file": "Fişier Extensii",
- "invalid-file-error": "Fişier extensie invalid"
- },
- "fullscreen": {
- "expand": "Extinde Către Ecran Complet",
- "exit": "Ieşire Din Ecran Complet",
- "toggle": "Comutare Ecran Complet",
- "fullscreen": "Ecran Complet"
- },
- "function": {
- "function": "Funcţie"
- },
- "grid": {
- "delete-item-title": "Sigur vrei să ștergi elementul?",
- "delete-item-text": "ATENŢIE! După confirmare, elementul şi toate datele referitoare la acesta, vor fi șterse IREVERSIBIL!",
- "delete-items-title": "Sigur vrei să ștergi { count, plural, 1 {un element} other {# elemente} }?",
- "delete-items-action-title": "Şterge { count, plural, 1 {un element} other {# elemente} }",
- "delete-items-text": "ATENŢIE! După confirmare, toate elementele selectate şi toate datele referitoare la acestea, vor fi șterse IREVERSIBIL!",
- "add-item-text": "Adaugă Element Nou",
- "no-items-text": "Nu Au Fost Găsite Elemente",
- "item-details": "Detalii Element",
- "delete-item": "Şterge Element",
- "delete-items": "Şterge Elemente",
- "scroll-to-top": "Derulare la începutul listei"
- },
- "help": {
- "goto-help-page": "Mergi la pagina de ajutor"
- },
- "home": {
- "home": "Acasă",
- "profile": "Profil",
- "logout": "Deconectare",
- "menu": "Meniu",
- "avatar": "Avatar",
- "open-user-menu": "Deschide Meniu Utilizator"
- },
- "import": {
- "no-file": "Niciun fișier selectat",
- "drop-file": "Trage un fişier de tip JSON sau selectează cu mausul un fişier de tip JSON pentru a fi încărcat",
- "drop-file-csv": "Trage un fişier de tip CSV sau selectează cu mouse-ul un fişier de tip csv pentru a fi încărcat",
- "column-value": "Valoare",
- "column-title": "Denumire",
- "column-example": "Exemplu valori date",
- "column-key": "Cheie Atribut/Telemetrie",
- "csv-delimiter": "Delimitator CSV",
- "csv-first-line-header": "Prima linie conţine denumiri de coloane",
- "csv-update-data": "Actualizare atribute/telemetrie",
- "import-csv-number-columns-error": "Un fișier trebuie să conțină cel puțin două coloane",
- "import-csv-invalid-format-error": "Format fișier incorect, linia: '{{line}}'",
- "column-type": {
- "name": "Denumire",
- "type": "Tip",
- "label": "Etichetă",
- "column-type": "Tipul Coloanei",
- "client-attribute": "Atribut Client",
- "shared-attribute": "Atribut Partajat",
- "server-attribute": "Atribut Server",
- "timeseries": "Date Cronologice",
- "entity-field": "Câmp Entitate",
- "access-token": "Token De Acces"
- },
- "stepper-text":{
- "select-file": "Selectează un fişier",
- "configuration": "Importă configurație",
- "column-type": "Selectează tipul de coloane",
- "creat-entities": "Creează entităţi noi",
- "done": "Terminat"
- },
- "message": {
- "create-entities": "{{count}} entităţi noi au fost create cu succes",
- "update-entities": "{{count}} entităţi noi au fost actualizate cu succes",
- "error-entities": "A intervenit o eroare la crearea a {{count}} entităţi"
- }
- },
- "item": {
- "selected": "Selectat"
- },
- "js-func": {
- "no-return-error": "Funcţia trebuie să returneze o valoare",
- "return-type-mismatch": "Funcţia trebuie să returneze o valoare de tip: '{{type}}'",
- "tidy": "Tidy"
- },
- "key-val": {
- "key": "Cheie",
- "value": "Valoare",
- "remove-entry": "Șterge Intrare",
- "add-entry": "Adaugă Intrare",
- "no-data": "Nu sunt intrări"
- },
- "layout": {
- "layout": "Amplasament",
- "manage": "Modifică Amplasamente",
- "settings": "Configurare Amplasamente",
- "color": "Culoare",
- "main": "Principal",
- "right": "Dreapta",
- "select": "Alege Amplasament Țintă"
- },
- "legend": {
- "direction": "Direcţie Legendă",
- "position": "Poziţie Legendă",
- "show-max": "Afişează Valoare Maximă",
- "show-min": "Afişează Valoare Minimă",
- "show-avg": "Afişează Valoare Medie",
- "show-total": "Afişează Valoare Totală",
- "settings": "Setări Legendă",
- "min": "Minim",
- "max": "Maxim",
- "avg": "Medie",
- "total": "Total",
- "comparison-time-ago": {
- "days": "(Ziua Trecută (Ieri))",
- "weeks": "(Săptamâna Trecută)",
- "months": "(Luna Trecută)",
- "years": "(Anul Trecut)"
- }
- },
- "login": {
- "login": "Conectare",
- "request-password-reset": "Solicită Resetarea Parolei",
- "reset-password": "Resetează Parolă",
- "create-password": "Creează Parolă",
- "passwords-mismatch-error": "Parola reintrodusă trebuie să fie identică!",
- "password-again": "Rescrie Parola",
- "sign-in": "Intră în Cont",
- "username": "Nume Utilizator (Adresa De eMail)",
- "remember-me": "Ține-mă minte!",
- "forgot-password": "Ai Uitat Parola?",
- "password-reset": "Resetează Parola",
- "expired-password-reset-message": "Parola ta a expirat! Este necesară schimbarea acesteia",
- "new-password": "Parolă nouă",
- "new-password-again": "Verificare parolă nouă",
- "password-link-sent-message": "Ți-am trimis pe eMail un link pentru resetarea parolei",
- "email": "eMail",
- "login-with": "Conectare cu {{name}}",
- "or": "sau"
- },
- "position": {
- "top": "Sus",
- "bottom": "Jos",
- "left": "Stânga",
- "right": "Dreapta"
- },
- "profile": {
- "profile": "Profil",
- "last-login-time": "Ultima Accesare",
- "change-password": "Schimbă Parola",
- "current-password": "Parola Actuală"
- },
- "relation": {
- "relations": "Relaţii",
- "direction": "Direcţie",
- "search-direction": {
- "FROM": "Dinspre",
- "TO": "Înspre"
- },
- "direction-type": {
- "FROM": "Dinspre",
- "TO": "Către"
- },
- "from-relations": "Ieșire",
- "to-relations": "Intrare",
- "selected-relations": "{ count, plural, 1 {o relaţie selectată } other {# relaţii selectate } }",
- "type": "Tip",
- "to-entity-type": "Către Tip Entitate",
- "to-entity-name": "Către Nume Entitate",
- "from-entity-type": "Dinspre Tip Entitate",
- "from-entity-name": "Dinspre Nume Entitate",
- "to-entity": "Către Entitate",
- "from-entity": "Dinspre Entitate",
- "delete": "Şterge Relaţie",
- "relation-type": "Tip Relaţie",
- "relation-type-required": "Tipul relației este obligatoriu",
- "any-relation-type": "Orice Tip",
- "add": "Adaugă Relaţie",
- "edit": "Şterge Relaţie",
- "delete-to-relation-title": "Sigur vrei să ștergi relația către entitatea '{{entityName}}'?",
- "delete-to-relation-text": "ATENŢIE! După confirmare,relaţia către entitatea '{{entityName}}' va fi ştearsă",
- "delete-to-relations-title": "Sigur vrei să ștergi { count, plural, 1 {o relaţie} other {# relaţii} }?",
- "delete-to-relations-text": "ATENŢIE! După confirmare, relaţiile selectate către entităţile corespondente și toate referirile la acestea, vor fi șterse IREVERSIBIL!",
- "delete-from-relation-title": "Sigur vrei să ștergi relația dinspre entitatea '{{entityName}}'?",
- "delete-from-relation-text": "ATENŢIE! După confirmare,relaţia dinspre entitatea '{{entityName}}' va fi ștearsă",
- "delete-from-relations-title": "Sigur vrei să ștergi { count, plural, 1 {o relaţie} other {# relaţii} }?",
- "delete-from-relations-text": "ATENŢIE! După confirmare, relaţiile selectate către entităţile corespondente și toate referirile la acestea, vor fi șterse IREVERSIBIL!",
- "remove-relation-filter": "Elimină Filtru Relaţie",
- "add-relation-filter": "Adaugă Filtru Relaţie",
- "any-relation": "Orice Relaţie",
- "relation-filters": "Filtre Relaţie",
- "additional-info": "Informaţii Adiţionale (JSON)",
- "invalid-additional-info": "Informaţiile adiţionale (JSON) nu au putut fi analizate"
- },
- "rulechain": {
- "rulechain": "Flux",
- "rulechains": "Fluxuri",
- "root": "Origine",
- "delete": "Şterge Fluxuri",
- "name": "Denumire",
- "name-required": "Denumirea este obligatorie",
- "description": "Descriere",
- "add": "Adaugă Fluxuri",
- "set-root": "Stabileşte Originea Fluxurilor",
- "set-root-rulechain-title": "Sigur vrei să setezi '{{ruleChainName}}' ca rădăcină?",
- "set-root-rulechain-text": "ATENŢIE! După confirmare, fluxul va deveni rădăcină şi va gestiona toate mesajele de intrare",
- "delete-rulechain-title": "Sigur vrei să ștergi fluxul '{{ruleChainName}}'?",
- "delete-rulechain-text": "ATENŢIE! După confirmare, fluxul şi toate datele referitoare la acesta, vor fi șterse IREVERSIBIL!",
- "delete-rulechains-title": "Sigur vrei să ștergi { count, plural, 1 {un flux} other {# fluxuri} }?",
- "delete-rulechains-action-title": "Ştergi { count, plural, 1 {un flux} other {# fluxuri} }",
- "delete-rulechains-text": "ATENŢIE! După confirmare, fluxul şi toate datele referitoare la acesta, vor fi șterse IREVERSIBIL!",
- "add-rulechain-text": "Adaugă Flux Nou",
- "no-rulechains-text": "Nu au fost găsite fluxuri",
- "rulechain-details": "Detalii Flux",
- "details": "Detalii",
- "events": "Evenimente",
- "system": "Sistem",
- "import": "Importă Flux",
- "export": "Exportă Flux",
- "export-failed-error": "Fluxul nu poate fi exportat; {{error}}",
- "create-new-rulechain": "Creează Flux Nou",
- "rulechain-file": "Fişierul Flux",
- "invalid-rulechain-file-error": "Fluxul nu poate fi importat; structură date invalidă",
- "copyId": "Copiază ID Flux",
- "idCopiedMessage": "ID Flux copiat în clipboard",
- "select-rulechain": "Selectează Flux",
- "no-rulechains-matching": "Nu au fost găsite fluxuri după criteriul: '{{entity}}'",
- "rulechain-required": "Fluxul este obligatoriu",
- "management": "Administrare Fluxuri",
- "debug-mode": "Mod Depanare"
- },
- "rulenode": {
- "details": "Detalii",
- "events": "Evenimente",
- "search": "Noduri Căutare",
- "open-node-library": "Bibliotecă Noduri",
- "add": "Adaugă Regulă Nod",
- "name": "Denumire",
- "name-required": "Denumirea este obligatorie",
- "type": "Tip",
- "description": "Descriere",
- "delete": "Şterge Regulă Nod",
- "select-all-objects": "Selectează Toate Nodurile Şi Conexiunile",
- "deselect-all-objects": "Deselectează Toate Nodurile Şi Conexiunile",
- "delete-selected-objects": "Şterge Toate Nodurile Şi Conexiunile",
- "delete-selected": "Şterge Selecţia",
- "select-all": "Selectează Tot",
- "copy-selected": "Copiază Selecţia",
- "deselect-all": "Deselectează Tot",
- "rulenode-details": "Detalii Regulă Nod",
- "debug-mode": "Mod Depanare",
- "configuration": "Configurare",
- "link": "Link",
- "link-details": "Detalii Link Regulă Nod",
- "add-link": "Adaugă Link",
- "link-label": "Etichetă Link",
- "link-label-required": "Eticheta link-ului este obligatorie",
- "custom-link-label": "Etichetă Link Definit de Utilizator",
- "custom-link-label-required": "Eticheta pentru link, definită de către utilizator, este obligatorie",
- "link-labels": "Etichete Link-uri)",
- "link-labels-required": "Etichetele link-urilor sunt obligatorii",
- "no-link-labels-found": "Nu au fost găsite etichete pentru link",
- "no-link-label-matching": "Eticheta : '{{label}}' nu a fost găsită",
- "create-new-link-label": "Creează Etichetă Nouă",
- "type-filter": "Filtrează",
- "type-filter-details": "Filtrează mesajele de intrare după condiţiile configurate",
- "type-enrichment": "Îmbogățire",
- "type-enrichment-details": "Adaugă informaţii adiţionale in metadata mesajului",
- "type-transformation": "Transformare",
- "type-transformation-details": "Schimbă payload şi metadata mesajului",
- "type-action": "Acţiune",
- "type-action-details": "Execută o acţiune specială",
- "type-external": "Extern",
- "type-external-details": "Interacţiuni cu sisteme externe",
- "type-rule-chain": "Flux",
- "type-rule-chain-details": "Transmite mesajele de intrare către fluxul specificat",
- "type-input": "Intrare",
- "type-input-details": "Intrarea logică pentru flux, transmite mesajele de intrare către următoarea regulă de nod înrudită",
- "type-unknown": "Necunoscut",
- "type-unknown-details": "Detalii regulă nod necunoscute",
- "directive-is-not-loaded": "Configurarea definită pentru directiva : '{{directiveName}}' nu este disponibilă",
- "ui-resources-load-error": "Eroare la încărcarea configurării resurselor UI",
- "invalid-target-rulechain": "Fluxul Destinaţie nu a fost găsit",
- "test-script-function": "Funcţie Test Script",
- "message": "Mesaj",
- "message-type": "Tip Mesaj",
- "select-message-type": "Selectează Tipul Mesajului",
- "message-type-required": "Tipul mesajului este obligatoriu",
- "metadata": "Metadata",
- "metadata-required": "Intrările metadata nu pot fi vide",
- "output": "Ieşire",
- "test": "Test",
- "help": "Ajutor",
- "reset-debug-mode": "Dezactivează modul depanare în toate nodurile"
- },
- "tenant": {
- "tenant": "Locatar",
- "tenants": "Locatari",
- "management": "Administrare Locatar",
- "add": "Adaugă Locatar",
- "admins": "Administratori",
- "manage-tenant-admins": "Gestionare Administratori Locatar",
- "delete": "Şterge Locatar",
- "add-tenant-text": "Adaugă Locatar Nou",
- "no-tenants-text": "Nu au fost găsiţi locatari",
- "tenant-details": "Detalii Locatar",
- "delete-tenant-title": "Sigur vrei să ștergi locatarul: '{{tenantTitle}}'?",
- "delete-tenant-text": "ATENŢIE! După confirmare, locatarul şi toate datele referitoare la acesta, vor fi șterse IREVERSIBIL!",
- "delete-tenants-title": "Sigur vrei să ștergi { count, plural, 1 {un locatar} other {# locatari} } ?",
- "delete-tenants-action-title": "Şterge { count, plural, 1 {un locatar} other {# locatari} }",
- "delete-tenants-text": "ATENŢIE! După confirmare, locatarii selectaţi şi datele aferente acestora, vor fi șterse IREVERSIBIL!",
- "title": "Titlu",
- "title-required": "Titlul este obligatoriu",
- "description": "Descriere",
- "details": "Detalii",
- "events": "Evenimente",
- "copyId": "Copiază ID Locatar",
- "idCopiedMessage": "ID Locatar a fost copiat în clipboard",
- "select-tenant": "Selectează locatar",
- "no-tenants-matching": "Nu au fost găsiţi locatari după criteriul: '{{entity}}'",
- "tenant-required": "Locatarul este obligatoriu"
- },
- "timeinterval": {
- "seconds-interval": "{ seconds, plural, 1 {o secundă} other {# secunde} }",
- "minutes-interval": "{ minutes, plural, 1 {un minut} other {# minute} }",
- "hours-interval": "{ hours, plural, 1 {o oră} other {# ore} }",
- "days-interval": "{ days, plural, 1 {o zi} other {# zile} }",
- "days": "Zile",
- "hours": "Ore",
- "minutes": "Minute",
- "seconds": "Secunde",
- "advanced": "Personalizat"
- },
- "timewindow": {
- "days": "{ days, plural, 1 {o zi} other {# zile} }",
- "hours": "{ hours, plural, 1 {o oră} other {# ore} }",
- "minutes": "{ minutes, plural, 1 {un minut} other {# minute} }",
- "seconds": "{ seconds, plural, 1 {o secundă} other {# secunde} }",
- "realtime": "Timp Real",
- "history": "Istoric",
- "last-prefix": "Interval:",
- "period": "Început {{ startTime}} Sfârșit {{endTime}}",
- "edit": "Editează Interval",
- "date-range": "Interval Date",
- "last": "Ultima/Ultimele",
- "time-period": "Interval:",
- "hide": "Ascunde"
- },
- "user": {
- "user": "Utilizator",
- "users": "Utilizatori",
- "customer-users": "Utilizatori Client",
- "tenant-admins": "Administratori Locatar",
- "sys-admin": "Administratori Sistem",
- "tenant-admin": "Administrator Locatar",
- "customer": "Clienţi",
- "anonymous": "Anonim",
- "add": "Adaugă Utilizator",
- "delete": "Şterge Utilizator",
- "add-user-text": "Adaugă Utilizator Nou",
- "no-users-text": "Nu Există Utilizatori",
- "user-details": "Detalii Utilizator",
- "delete-user-title": "Sigur vrei să ștergi utilizatorul '{{userEmail}}'?",
- "delete-user-text": "ATENŢIE! După confirmare, utilizatorul şi toate datele aferente acestuia, vor fi șterse IREVERSIBIL!",
- "delete-users-title": "Sigur vrei să ștergi { count, plural, 1 {un utilizator} other {# utilizatori} }?",
- "delete-users-action-title": "Ştergere { count, plural, 1 {un utilizator} other {# utilizatori} }",
- "delete-users-text": "ATENŢIE! După confirmare, toţi utilizatorii selectaţi împreună cu datele aferente acestora, vor fi șterse IREVERSIBIL!",
- "activation-email-sent-message": "Mesajul eMail pentru activare a fost trimis cu succes!",
- "resend-activation": "Retrimite mesaj eMail de activare",
- "email": "Adresă eMail",
- "email-required": "Adresa eMail este obligatorie",
- "invalid-email-format": "Adresa eMail este incorectă",
- "first-name": "Prenume",
- "last-name": "Nume",
- "description": "Descriere",
- "default-dashboard": "Panou Implicit",
- "always-fullscreen": "Permanent Ecran Complet",
- "select-user": "Selectează Utilizator",
- "no-users-matching": "Nu există utilizatori care corespund criteriului: '{{entity}}'",
- "user-required": "Utilizatorul este obligatoriu",
- "activation-method": "Metoda De Activare",
- "display-activation-link": "Afişează link activare",
- "send-activation-mail": "Trimite mesaj eMail pentru activare",
- "activation-link": "Link activare utilizator:",
- "activation-link-text": "Pentru activarea contului, folosiți link: ",
- "copy-activation-link": "Copiază link activare",
- "activation-link-copied-message": "Link-ul de activare utilizator a fost copiat în clipboard",
- "details": "Detalii",
- "login-as-tenant-admin": "Acces ca locatar administrator",
- "login-as-customer-user": "Acces ca utilizator client",
- "disable-account": "Dezactivează cont utilizator",
- "enable-account": "Activează cont utilizator",
- "enable-account-message": "Cont utilizator activat!",
- "disable-account-message": "Cont utilizator dezactivat!"
- },
- "value": {
- "type": "Tip Valoare",
- "string": "Şir Caractere",
- "string-value": "Valoare Şir Caractere",
- "integer": "Număr Întreg",
- "integer-value": "Valoare Număr Întreg",
- "invalid-integer-value": "Valoare număr întreg incorectă",
- "double": "Tip Double",
- "double-value": "Valoare Tip Double",
- "boolean": "Tip Bool: ",
- "boolean-value": "Valoare Bool",
- "false": "Fals",
- "true": "Adevărat",
- "long": "Tip Long"
- },
- "widget": {
- "widget-library": "Biblioteci Widgets",
- "widget-bundle": "Pachete Widgets",
- "select-widgets-bundle": "Selectează Pachete Widgets",
- "management": "Administrare Widgets",
- "editor": "Editor Widget",
- "widget-type-not-found": "Eroare la încărcarea configuraţiei widgetului.
Probabil Asocierea \n cu tipul de widget a fost eliminată",
- "widget-type-load-error": "Widgetul nu a fost încărcat din cauza următoarelor erori:",
- "remove": "Elimină Widget",
- "edit": "Editează Widget",
- "remove-widget-title": "Sigur vrei să ștergi widgetul '{{widgetTitle}}'?",
- "remove-widget-text": "ATENŢIE! După confirmare, widgetul şi toate datele aferente acestuia, vor fi șterse IREVERSIBIL!",
- "timeseries": "Serii Temporale",
- "search-data": "Caută Date",
- "no-data-found": "Nu Au Fost Găsite Date",
- "latest-values": "Ultimele Valori",
- "rpc": "Widget Control ",
- "alarm": "Widget Alarmă",
- "static": "Widget Static",
- "select-widget-type": "Selectaţi Tip Widget",
- "missing-widget-title-error": "Titlul widgetului trebuie specificat!",
- "widget-saved": "Widget Salvat",
- "unable-to-save-widget-error": "Widgetul conține erori și nu poate fi salvat!",
- "save": "Salvează Widget",
- "saveAs": "Salvează Widget Ca...",
- "save-widget-type-as": "Salvează Tip Widget Ca...",
- "save-widget-type-as-text": "Introduceţi titlu nou widget şi/sau selectați pachet widget destinație",
- "toggle-fullscreen": "Comută Ecran Complet",
- "run": "Execută Widget",
- "title": "Titlu Widget",
- "title-required": "Titlul widgetului este obligatoriu",
- "type": "Tip Widget",
- "resources": "Resurse",
- "resource-url": "JavaScript/CSS URL",
- "remove-resource": "Şterge Resursă",
- "add-resource": "Adaugă Resursă",
- "html": "HTML",
- "tidy": "Tidy",
- "css": "CSS",
- "settings-schema": "Schemă setări",
- "datakey-settings-schema": "Schemă setări chei date",
- "javascript": "Javascript",
- "js": "JS",
- "remove-widget-type-title": "Sigur vrei să ștergi tip widget '{{widgetName}}'?",
- "remove-widget-type-text": "ATENŢIE! După confirmare, tipul de widget şi toate datele aferente acestuia, vor fi șterse IREVERSIBIL!",
- "remove-widget-type": "Şterge Tip Widget",
- "add-widget-type": "Adaugă Tip Nou Widget",
- "widget-type-load-failed-error": "Eroare încărcare tip widget!",
- "widget-template-load-failed-error": "Eroare încarcare şablon widget!",
- "add": "Adaugă Widget Nou",
- "undo": "Anulează Modificări Widget",
- "export": "Exportă Widget"
- },
- "widget-action": {
- "header-button": "Buton Principal Widget",
- "open-dashboard-state": "Deschide Altă Stare a Panoului",
- "update-dashboard-state": "Actualizează Starea Curentă A Panoului",
- "open-dashboard": "Comută Către Alt Panou",
- "custom": "Acţiuni Utilizator",
- "custom-pretty": "Acţiuni Utilizator (cu şablon HTML)",
- "target-dashboard-state": "Stare Panou Destinaţie",
- "target-dashboard-state-required": "Starea panoului de destinaţie este obligatorie!",
- "set-entity-from-widget": "Setează Entitate din Widget",
- "target-dashboard": "Panou Destinaţie",
- "open-right-layout": "Deschide Aspect Corect Al Panoului (accesare de pe mobil)"
- },
- "widgets-bundle": {
- "current": "Pachet Curent Widgeturi",
- "widgets-bundles": "Pachete Widgeturi",
- "add": "Adăugare Pachete Widgeturi",
- "delete": "Ştergere Pachete Widgeturi",
- "title": "Titlu",
- "title-required": "Titlul este obligatoriu",
- "add-widgets-bundle-text": "Adaugă pachet nou widgeturi",
- "no-widgets-bundles-text": "Nu există pachete widgeturi",
- "empty": "Pachetul de widgeturi este gol",
- "details": "Detalii",
- "widgets-bundle-details": "Detalii Pachet Widgeturi",
- "delete-widgets-bundle-title": "Sigur vrei să ștergi pachetul de widgeturi '{{widgetsBundleTitle}}'?",
- "delete-widgets-bundle-text": "ATENŢIE! După Confirmare, pachetul de widgeturi şi toate datele aferente acestuia, vor fi șterse IREVERSIBIL!",
- "delete-widgets-bundles-title": "Sigur vrei să ștergi { count, plural, 1 {un pachet widgeturi} other {# pachete widgeturi} }?",
- "delete-widgets-bundles-action-title": "Şterge { count, plural, 1 {un packet widgeturi} other {# pachete widgeturi} }",
- "delete-widgets-bundles-text": "ATENŢIE! După confirmare, toate pachetele selectate de widget-uri şi datele aferente acestuia, vor fi șterse IREVERSIBIL!",
- "no-widgets-bundles-matching": "Nu au fost găsite pachete de widgeturi conținând textul '{{widgetsBundle}}' ",
- "widgets-bundle-required": "Denumirea pachetelor de widgeturi este obligatorie",
- "system": "Sistem",
- "import": "Importă Pachet Widgeturi",
- "export": "Exportă Pachet Widgeturi",
- "export-failed-error": "Export pachet widgeturi imposibil: {{error}}",
- "create-new-widgets-bundle": "Definire Pachet Widgeturi Nou",
- "widgets-bundle-file": "Alege fișier pachet widgeturi",
- "invalid-widgets-bundle-file-error": "Export pachet widgeturi imposibil; Structură date invalidă"
- },
- "widget-config": {
- "data": "Date",
- "settings": "Setări",
- "advanced": "Setări Avansate",
- "title": "Titlu",
- "title-tooltip": "Mesaj Detalii Titlu",
- "general-settings": "Setări Generale",
- "display-title": "Titlu Afişat",
- "drop-shadow": "Cu Umbră",
- "enable-fullscreen": "Permite Ecran Complet",
- "background-color": "Culoare Fundal",
- "text-color": "Culoare Text",
- "padding": "Margine Interioară",
- "margin": "Margine Exterioară",
- "widget-style": "Stil Widget",
- "title-style": "Stil Titlu",
- "mobile-mode-settings": "Setări Afișare Mobil",
- "order": "Ordine",
- "height": "Înăltime",
- "units": "Unitate măsură",
- "decimals": "Număr Zecimale",
- "timewindow": "Interval Timp",
- "use-dashboard-timewindow": "Folosire Interval Timp Panou",
- "display-timewindow": "Afişare Interval Timp",
- "display-legend": "Afişare Legendă",
- "datasources": "Surse Date",
- "maximum-datasources": "Maximum { count, plural, 1 {o sursă date permisă} other {# surse date permise} }",
- "datasource-type": "Tip",
- "datasource-parameters": "Parametri",
- "remove-datasource": "Elimină Sursă Date",
- "add-datasource": "Adaugă Sursă Date",
- "target-device": "Dispozitiv Destinaţie",
- "alarm-source": "Sursă Alarmă",
- "actions": "Acţiuni",
- "action": "Acţiune",
- "add-action": "Adaugă Acţiune",
- "search-actions": "Caută Acţiuni",
- "action-source": "Sursa Acțiunii",
- "action-source-required": "Sursa acțiunii este obligatorie",
- "action-name": "Numele Acțiunii",
- "action-name-required": "Numele acțiunii este obligatoriu",
- "action-name-not-unique": "O acţiune cu acelaşi nume este deja definită
Numele definit al acțiunii trebuie să fie unic in aceeaşi sursă de date",
- "action-icon": "Pictogramă",
- "action-type": "Tipul",
- "action-type-required": "Tipul acțiunii este obligatoriu",
- "edit-action": "Editare Acţiune",
- "delete-action": "Ştergere Acţiune",
- "delete-action-title": "Şterge acţiunea ",
- "delete-action-text": "Ești sigur că vrei să ștergi acţiunea '{{actionName}}'?",
- "display-icon": "Afişează Pictograma Titlului",
- "icon-color": "Culoare Pictogramă",
- "icon-size": "Mărime Pictogramă"
- },
- "widget-type": {
- "import": "Import Tip Widget",
- "export": "Export Tip Widget",
- "export-failed-error": "Eroare! Export imposibil pentru tip widget: {{error}}",
- "create-new-widget-type": "Defineşte tip widget nou",
- "widget-type-file": "Alege fişier pentru tip widget",
- "invalid-widget-type-file-error": "Eroare! Tip widget nu poate fi importat; structură de date invalidă"
- },
- "widgets": {
- "date-range-navigator": {
- "localizationMap": {
- "Sun": "D",
- "Mon": "L",
- "Tue": "M",
- "Wed": "M",
- "Thu": "J",
- "Fri": "V",
- "Sat": "S",
- "Jan": "Ian",
- "Feb": "Feb",
- "Mar": "Mar",
- "Apr": "Apr",
- "May": "Mai",
- "Jun": "Iun",
- "Jul": "Iul",
- "Aug": "Aug",
- "Sep": "Sep",
- "Oct": "Oct",
- "Nov": "Nov",
- "Dec": "Dec",
- "January": "Ianuarie",
- "February": "Februarie",
- "March": "Martie",
- "April": "Aprilie",
- "Maz": "Mai",
- "June": "Iunie",
- "July": "Iulie",
- "August": "August",
- "September": "Septembrie",
- "October": "Octombrie",
- "November": "Noiembrie",
- "December": "Decembrie",
- "Custom Date Range": "Interval Date Personalizat",
- "Date Range Template": "Șablon Interval Date",
- "Today": "Astăzi",
- "Yesterday": "Ieri",
- "This Week": "Săptămâna Aceasta",
- "Last Week": "Săptămâna Trecută",
- "This Month": "Luna Aceasta",
- "Last Month": "Luna Trecută",
- "Year": "Anul",
- "This Year": "Anul Acesta",
- "Last Year": "Anul Trecut",
- "Date picker": "Alege Data",
- "Hour": "Oră",
- "Day": "Zi",
- "Week": "Săptămână",
- "2 weeks": "2 săptămâni",
- "Month": "Lună",
- "3 months": "3 luni",
- "6 months": "6 luni",
- "Custom interval": "Interval Personalizat",
- "Interval": "Interval:",
- "Step size": "Pas",
- "Ok": "Ok"
- }
- },
- "input-widgets": {
- "attribute-not-allowed": "Acest widget nu poate folosi atributul specificat",
- "blocked-location": "Acest browser blochează localizarea",
- "claim-device": "Revendică Dispozitiv",
- "claim-failed": "Încercarea revendicare dispozitiv eșuată",
- "claim-not-found": "Dispozitivul nu a fost găsit",
- "claim-successful": "Dispozitivul a fost revendicat cu succes",
- "date": "Data",
- "device-name": "Nume Dispozitiv",
- "device-name-required": "Numele dispozitivului este obligatoriu",
- "discard-changes": "Anulare Modificări",
- "entity-attribute-required": "Atributul entităţii este obligatoriu",
- "entity-coordinate-required": "Atât latitudinea Şi longitudinea sunt obligatorii",
- "entity-timeseries-required": "Seriile temporale pentru entitate sînt obligatorii",
- "get-location": "Află locaţia GPS actuală",
- "latitude": "Latitudine",
- "longitude": "Longitudine",
- "not-allowed-entity": "Entitatea selectată nu poate avea atribute partajate",
- "no-attribute-selected": "Niciun Atribut Selectat",
- "no-datakey-selected": "Nicio cheie selectată",
- "no-coordinate-specified": "Cheie date latitude/longitude nespecificată",
- "no-entity-selected": "Nicio entitate selectată",
- "no-image": "Lipsă Imagine",
- "no-support-geolocation": "Acest browser nu permite geolocalizarea",
- "no-support-web-camera": "Cameră Web nesuportată",
- "no-timeseries-selected": "Serii temporale nespecificate",
- "secret-key": "Cheie Secretă",
- "secret-key-required": "Cheia secretă este obligatorie",
- "switch-attribute-value": "Schimbă valoare atribut entitate",
- "switch-camera": "Schimbă Camera",
- "switch-timeseries-value": "Schimbă valori serii temporale entitate",
- "take-photo": "Captură Imagine",
- "time": "Timp",
- "timeseries-not-allowed": "Parametrul nu este compatibil cu acest widget",
- "update-failed": "Actualizare eșuată",
- "update-successful": "Actualizare reușită",
- "update-attribute": "Actualizare Atribut",
- "update-timeseries": "Actualizare Serii Temporale",
- "value": "Valoare"
- }
- },
- "icon": {
- "icon": "Pictogramă",
- "select-icon": "Selectează Pictogramă",
- "material-icons": "Material Pictogramă",
- "show-all": "Afişează Toate Pictogramele"
- },
- "custom": {
- "widget-action": {
- "action-cell-button": "Acțiune buton celulă",
- "row-click": "Eveniment : Click pe linie tabel",
- "polygon-click": "Eveniment : Click pe poligon",
- "marker-click": "Eveniment : Click pe marker",
- "tooltip-tag-action": "Acţiune marcaj detalii mesaj ",
- "node-selected": "Eveniment : Nod Selectat",
- "element-click": "eveniment : click Pe element HTML",
- "pie-slice-click": "Eveniment : Click pe sector cerc",
- "row-double-click": "Eveniment : Dublu click pe linia tabelului"
- }
- },
- "language": {
- "language": "Limba"
- }
-}
diff --git a/ui/src/app/locale/locale.constant-ru_RU.json b/ui/src/app/locale/locale.constant-ru_RU.json
deleted file mode 100644
index 473698a091..0000000000
--- a/ui/src/app/locale/locale.constant-ru_RU.json
+++ /dev/null
@@ -1,1802 +0,0 @@
-{
- "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": "ОК",
- "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}}",
- "continue": "Продолжить",
- "discard-changes": "Отменить изменения"
- },
- "aggregation": {
- "aggregation": "Агрегация",
- "function": "Тип агрегации данных",
- "limit": "Максимальное значение",
- "group-interval": "Интервал группировки",
- "min": "Мин",
- "max": "Maкс",
- "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": "Таймаут (мс)",
- "timeout-required": "Таймаут обязателен.",
- "timeout-invalid": "Недействительный таймаут.",
- "enable-tls": "Включить TLS",
- "tls-version" : "Версия TLS",
- "send-test-mail": "Отправить пробное письмо",
- "security-settings": "Настройки безопасности",
- "password-policy": "Политика паролей",
- "minimum-password-length": "Минимальная длина пароля",
- "minimum-password-length-required": "Требуется минимальная длина пароля",
- "minimum-password-length-range": "Минимальная длина пароля должна быть в диапазоне от 5 до 50",
- "minimum-uppercase-letters": "Минимальное количество прописных букв",
- "minimum-uppercase-letters-range": "Минимальное количество прописных букв не может быть отрицательным",
- "minimum-lowercase-letters": "Минимальное количество строчных букв",
- "minimum-lowercase-letters-range": "Минимальное количество строчных букв не может быть отрицательным",
- "minimum-digits": "Минимальное количество цифр",
- "minimum-digits-range": "Минимальное количество цифр не может быть отрицательным",
- "minimum-special-characters": "Минимальное количество специальных символов",
- "minimum-special-characters-range": "Минимальное количество специальных символов не может быть отрицательным",
- "password-expiration-period-days": "Срок действия пароля в днях",
- "password-expiration-period-days-range": "Срок действия пароля в днях не может быть отрицательным",
- "password-reuse-frequency-days": "Частота повторного использования пароля в днях",
- "password-reuse-frequency-days-range": "Частота повторного использования пароля в днях не может быть отрицательной",
- "general-policy": "Общая политика",
- "max-failed-login-attempts": "Максимальное количество неудачных попыток входа в систему, прежде чем учетная запись заблокирована",
- "minimum-max-failed-login-attempts-range": "Максимальное количество неудачных попыток входа в систему не может быть отрицательным",
- "user-lockout-notification-email": "В случае блокировки учетной записи пользователя отправьте уведомление на электронную почту"
- },
- "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 оповещение} few {# оповещения} 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": "Фильтр оповещений",
- "max-count-load": "Максимальное количество оповещений для загрузки (0 - неограниченно)",
- "max-count-load-required": "Максимальное количество оповещений для загрузки обязателен.",
- "max-count-load-error-min": "Минимальное значение 0.",
- "fetch-size": "Размер пакета для загрузки",
- "fetch-size-required": "Размер пакета для загрузки обязателен.",
- "fetch-size-error-min": "Минимальное значение 10."
- },
- "alias": {
- "add": "Добавить псевдоним",
- "edit": "Редактировать псевдоним",
- "name": "Псевдоним",
- "name-required": "Псевдоним обязателен",
- "duplicate-alias": "Такой псевдоним уже существует.",
- "filter-type-single-entity": "Отдельный объект",
- "filter-type-entity-list": "Список объектов",
- "filter-type-entity-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": "Не указан фильтр объектов",
- "root-state-entity": "Использовать объект, полученный из дашборда, как корневой",
- "last-level-relation": "Использовать только отношения последнего уровня",
- "root-entity": "Корневой объект",
- "state-entity-parameter-name": "Название объекта состояния",
- "default-state-entity": "Объект состояния по умолчанию",
- "default-entity-parameter-name": "По умолчанию",
- "max-relation-level": "Максимальная глубина отношений",
- "unlimited-level": "Неограниченная глубина",
- "state-entity": "Объект состояния дашборда",
- "all-entities": "Все объекты",
- "any-relation": "не указано"
- },
- "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 актив} few {# актива} other {# активов} } клиенту",
- "delete-assets": "Удалить активы",
- "unassign-assets": "Отозвать активы",
- "unassign-assets-action-title": "Отозвать { count, plural, 1 {1 актив} few {# актива} other {# активов} } у клиента",
- "assign-new-asset": "Присвоить новый актив",
- "delete-asset-title": "Вы точно хотите удалить '{{assetName}}'?",
- "delete-asset-text": "Внимание, после подтверждения актив и все связанные с ним данные будут безвозвратно удалены.",
- "delete-assets-title": "Вы точно хотите удалить { count, plural, 1 {1 актив} few {# актива} other {# активов} }",
- "delete-assets-action-title": "Удалить { count, plural, 1 {1 актив} few {# актива} 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 актив} few {# актива} other {# активов} }?",
- "unassign-assets-text": "После подтверждения активы будут отозваны, и клиент потеряет к ним доступ.",
- "copyId": "Копировать ИД актива",
- "idCopiedMessage": "ИД актива скопировано в буфер обмена",
- "select-asset": "Выбрать активы",
- "no-assets-matching": "Активы, соответствующие '{{entity}}', не найдены.",
- "asset-required": "Актив обязателен",
- "name-starts-with": "Название актива, начинающееся с",
- "import": "Импортировать активы",
- "asset-file": "Файл с активами",
- "label": "Метка"
- },
- "attribute": {
- "attributes": "Атрибуты",
- "latest-telemetry": "Последняя телеметрия",
- "attributes-scope": "Контекст атрибутов объекта",
- "scope-latest-telemetry": "Последняя телеметрия",
- "scope-client": "Клиентские атрибуты",
- "scope-server": "Серверные атрибуты",
- "scope-shared": "Общие атрибуты",
- "add": "Добавить атрибут",
- "key": "Ключ",
- "last-update-time": "Последнее обновление",
- "key-required": "Ключ атрибута обязателен.",
- "value": "Значение",
- "value-required": "Значение атрибута обязательно.",
- "delete-attributes-title": "Вы уверенны, что хотите удалить { count, plural, one {1 атрибут} few {# атрибута} other {# атрибутов} }? ",
- "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 {Выбран} other {Выбраны} } { count, plural, one {1 атрибут} few {# атрибута} other {# атрибутов} }",
- "selected-telemetry": "{ count, plural, 1 {Выбран} other {Выбраны} } { count, plural, 1 {1 параметр} few {# параметра} other {# параметров} } телеметрии"
- },
- "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-relation-add-or-update": "Обновлены отношения",
- "type-relation-delete": "Удалены отношения",
- "type-relations-delete": "Удалены все отношения",
- "type-alarm-ack": "Подтвержден",
- "type-alarm-clear": "Сброшен",
- "type-login": "Вход",
- "type-logout": "Выход",
- "type-lockout": "Заблокирован",
- "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": "Введите условие поиска"
- },
- "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": "Общедоступные представления объектов",
- "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 клиент} few {# клиента} other {# клиентов} }?",
- "delete-customers-action-title": "Удалить { count, plural, 1 {1 клиент} few {# клиента} other {# клиентов} }",
- "delete-customers-text": "Внимание, после подтверждения выбранные клиенты и все связанные с ними данные будут безвозвратно удалены.",
- "manage-users": "Управление пользователями",
- "manage-assets": "Управление активами",
- "manage-devices": "Управление устройствами",
- "manage-dashboards": "Управление дашбордами",
- "title": "Имя",
- "title-required": "Название обязательно.",
- "description": "Описание",
- "details": "Подробности",
- "events": "События",
- "copyId": "Копировать ИД клиента",
- "idCopiedMessage": "ИД клиента скопирован в буфер обмена",
- "select-customer": "Выбрать клиента",
- "no-customers-matching": "Клиенты, соответствующие '{{entity}}', не найдены.",
- "customer-required": "Клиент обязателен",
- "select-default-customer": "Выбрать клиента по умолчанию",
- "default-customer": "Клиент по умолчанию",
- "default-customer-required": "Клиент по умолчанию обязателен для отладки дашборда на уровне на уровне Владельца"
- },
- "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 дашборд} few {# дашборда} other {# дашбордов} } к клиенту",
- "unassign-dashboards-action-text": "Отозвать { count, plural, 1 {1 дашборд} few {# дашборда} other {# дашбордов} } у клиента",
- "delete-dashboards": "Удалить дашборды",
- "unassign-dashboards": "Отозвать дашборды",
- "unassign-dashboards-action-title": "Отозвать { count, plural, one {1 дашборд} few {# дашборда} other {# дашбордов} } у клиента",
- "delete-dashboard-title": "Вы точно хотите удалить дашборд '{{dashboardTitle}}'?",
- "delete-dashboard-text": "Внимание, после подтверждения дашборд и все связанные с ним данные будут безвозвратно утеряны.",
- "delete-dashboards-title": "Вы точно хотите удалить { count, plural, one {1 дашборд} few {# дашборда} other {# дашбордов} }?",
- "delete-dashboards-action-title": "Удалить { count, plural, one {1 дашборд} few {# дашборда} other {# дашбордов} }",
- "delete-dashboards-text": "Внимание, после подтверждения дашборды и все связанные с ними данные будут безвозвратно утеряны.",
- "unassign-dashboard-title": "Вы точно хотите отозвать дашборд '{{dashboardTitle}}'?",
- "unassign-dashboard-text": "После подтверждения дашборд не будет доступен клиенту.",
- "unassign-dashboard": "Отозвать дашборд",
- "unassign-dashboards-title": "Вы точно хотите отозвать { count, plural, one {1 дашборд} few {# дашборда} other {# дашбордов} }?",
- "unassign-dashboards-text": "После подтверждения выбранные дашборды не будут доступны клиенту.",
- "public-dashboard-title": "Теперь дашборд общедоступный",
- "public-dashboard-text": "Теперь ваш дашборд {{dashboardTitle}} доступен всем по ссылке:",
- "public-dashboard-notice": "Примечание: Для получения доступа к данным устройства нужно открыть общий доступ к этому устройству.",
- "make-private-dashboard-title": "Вы точно хотите закрыть общий доступ к дашборду '{{dashboardTitle}}'?",
- "make-private-dashboard-text": "После подтверждения дашборд будет закрыт для общего доступа.",
- "make-private-dashboard": "Закрыть дашборд для общего доступа",
- "socialshare-text": "'{{dashboardTitle}}' сделано ThingsBoard",
- "socialshare-title": "'{{dashboardTitle}}' сделано 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 px.",
- "max-mobile-row-height-message": "Максимальная высота строки в мобильном режиме составляет 200 px.",
- "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}}",
- "create-new-dashboard": "Создать новый дашборд",
- "dashboard-file": "Файл дашборда",
- "invalid-dashboard-file-error": "Не удалось импортировать дашборд: неизвестная схема данных дашборда.",
- "dashboard-import-missing-aliases-title": "Настроить псевдонимы импортированного дашборда",
- "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 состояние} few {# состояния} other {# состояний} } дашборда",
- "edit-state": "Изменить состояние дашборда",
- "delete-state": "Удалить состояние дашборда",
- "add-state": "Добавить состояние дашборда",
- "state": "Состояние дашборда",
- "state-name": "Название",
- "state-name-required": "Название состояния дашборда обязательно.",
- "state-id": "ИД состояния",
- "state-id-required": "ИД состояния дашборда обязателен.",
- "state-id-exists": "Состояния дашборда с таким именем уже существует.",
- "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": "Атрибуты",
- "entity-field": "Поле объекта",
- "alarm": "Параметры оповещения",
- "timeseries-required": "Телеметрия объекта обязательна.",
- "timeseries-or-attributes-required": "Телеметрия/атрибуты обязательны.",
- "maximum-timeseries-or-attributes": "Максимальное количество параметров телеметрии или атрибутов равно {{count}}",
- "alarm-fields-required": "Параметры оповещения обязательны.",
- "function-types": "Тип функции",
- "function-types-required": "Тип функции обязателен.",
- "maximum-function-types": "Максимальное количество типов функции равно {{count}}",
- "time-description": "время текущего значения;",
- "value-description": "текущее значение;",
- "prev-value-description": "результат предыдущего вызова функции;",
- "time-prev-description": "время предыдущего значения;",
- "prev-orig-value-description": "исходное предыдущее значение;"
- },
- "datasource": {
- "type": "Тип источника данных",
- "name": "Название",
- "add-datasource-prompt": "Пожалуйста, добавьте источник данных"
- },
- "details": {
- "edit-mode": "Режим редактирования",
- "edit-json": "Редактировать JSON",
- "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, one {1 устройство} few {# устройства} other {# устройств} } клиенту",
- "delete-devices": "Удалить устройства",
- "unassign-from-customer": "Отозвать у клиенту",
- "unassign-devices": "Отозвать устройства",
- "unassign-devices-action-title": "Отозвать у клиента { count, plural, one {1 устройство} few {# устройства} 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, one {1 устройство} few {# устройства} other {# устройств} }?",
- "delete-devices-action-title": "Удалить { count, plural, one {1 устройство} few {# устройства} other {# устройств} }",
- "delete-devices-text": "Внимание, после подтверждения выбранные устройства и все связанные с ними данные будут безвозвратно утеряны..",
- "unassign-device-title": "Вы точно хотите отозвать устройство '{{deviceName}}'?",
- "unassign-device-text": "После подтверждения устройство будет недоступно клиенту.",
- "unassign-device": "Отозвать устройство",
- "unassign-devices-title": "Вы точно хотите отозвать { count, plural, one {1 устройство} few {# устройства} 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": "Копировать идентификатор устройства",
- "copyAccessToken": "Копировать токен",
- "idCopiedMessage": "Идентификатор устройства скопирован в буфер обмена",
- "accessTokenCopiedMessage": "Токен устройства скопирован в буфер обмена",
- "assignedToCustomer": "Присвоен клиенту",
- "unable-delete-device-alias-title": "Не удалось удалить псевдоним устройства",
- "unable-delete-device-alias-text": "Не удалось удалить псевдоним '{{deviceAlias}}' устройства, т.к. он используется следующими виджетами:
{{widgetsList}}",
- "is-gateway": "Гейтвей",
- "public": "Общедоступный",
- "device-public": "Устройство общедоступно",
- "select-device": "Выбрать устройство",
- "import": "Импортировать устройства",
- "device-file": "Файл с устройствами"
- },
- "dialog": {
- "close": "Закрыть диалог"
- },
- "direction": {
- "column": "Колонка",
- "row": "Строка"
- },
- "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}}' не может быть удален, так как используется следующим(и) виджетом(ами):
{{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-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-rulenode": "Правило",
- "type-rulenodes": "Правила",
- "list-of-rulenodes": "{ count, plural, 1 {Одно правило} other {Список из # правил} }",
- "rulenode-name-starts-with": "Правила, чьи названия начинаются с '{{prefix}}'",
- "type-current-customer": "Текущий клиент",
- "type-current-tenant": "Текущий владелец",
- "search": "Поиск объектов",
- "selected-entities": "Выбран(ы) { count, plural, 1 {1 объект} few {# объекта} other {# объектов} }",
- "entity-name": "Название объекта",
- "entity-label": "Метка объекта",
- "details": "Подробности об объекте",
- "no-entities-prompt": "Объекты не найдены",
- "no-data": "Нет данных для отображения",
- "columns-to-display": "Отобразить следующие колонки"
- },
- "entity-field": {
- "created-time": "Время создания",
- "name": "Название",
- "type": "Тип",
- "first-name": "Имя",
- "last-name": "Фамилия",
- "email": "Электронная почта",
- "title": "Название",
- "country": "Страна",
- "state": "Штат/Область",
- "city": "Город",
- "address": "Адрес",
- "address2": "Адрес 2",
- "zip": "Индекс",
- "phone": "Телефон",
- "label": "Метка"
- },
- "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 представление объекта} few {# представления объектов} other {# представлений объектов} }",
- "delete-entity-views": "Удалить представления объектов",
- "unassign-from-customer": "Отозвать у клиента",
- "unassign-entity-views": "Отозвать представления объектов",
- "unassign-entity-views-action-title": "Отозвать у клиента { count, plural, 1 {1 представление объекта} few {# представления объектов} other {# представлений объектов} }",
- "assign-new-entity-view": "Назначит новое представление объекта",
- "delete-entity-view-title": "Вы точно хотите удалить представление объекта '{{entityViewName}}'?",
- "delete-entity-view-text": "Внимание, после подтверждения представление объекта и все связанные с ним данные будут безвозвратно удалены.",
- "delete-entity-views-title": "Вы точно хотите удалить { count, plural, 1 {1 представление объекта} few {# представления объектов} other {# представлений объектов} }?",
- "delete-entity-views-action-title": "Удалить { count, plural, 1 {1 представление объекта} few {# представления объектов} 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 представление объекта} few {# представления объектов} 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": "Копировать ИД представление объекта",
- "assignedToCustomer": "Назначено клиенту",
- "unable-entity-view-device-alias-title": "Не удалось удалить псевдоним представления объекта",
- "unable-entity-view-device-alias-text": "Не удалось удалить псевдоним устройства '{{entityViewAlias}}', т.к. он используется следующими виджетами:
{{widgetsList}}",
- "select-entity-view": "Выбрать представление объекта",
- "make-public": "Открыть общий доступ к представлению объекта",
- "make-private": "Закрыть общий доступ к представлению объекта",
- "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": "Настроить ключи данных телеметрии целевого объекта, которые будут доступны представлению объекта. Эти данные только для чтения.",
- "make-public-entity-view-title": "Вы уверенны, что хотите открыть общий доступ к представленю объекта '{{entityViewName}}'?",
- "make-public-entity-view-text": "После подтверждения представление объекта и все связанные с ним данные станут публичными и доступными для других пользователей.",
- "make-private-entity-view-title": "Вы уверенны, что хотите закрыть общий доступ к представлению объекта '{{entityViewName}}'?",
- "make-private-entity-view-text": "После подтверждения представление объекта и все звязанные с ним данные станут приватными и не будут доступны для других пользователей."
- },
- "event": {
- "event-type": "Тип события",
- "type-error": "Ошибка",
- "type-lc-event": "Событие жизненного цикла",
- "type-stats": "Статистика",
- "type-debug-rule-node": "Отладка",
- "type-debug-rule-chain": "Отладка",
- "no-events-prompt": "События не найдены",
- "error": "Ошибка",
- "alarm": "Аварийное оповещение",
- "event-time": "Время возникновения события",
- "server": "Сервер",
- "body": "Тело",
- "method": "Метод",
- "type": "Тип",
- "entity": "Объект",
- "message-id": "ИД сообщения",
- "message-type": "Тип сообщения",
- "data-type": "Тип данных",
- "relation-type": "Тип отношения",
- "metadata": "Метаданные",
- "data": "Данные",
- "event": "Событие",
- "status": "Статус",
- "success": "Успех",
- "failed": "Неудача",
- "messages-processed": "Сообщения обработаны",
- "errors-occurred": "Возникли ошибки"
- },
- "extension": {
- "extensions": "Расширение",
- "selected-extensions": "Выбрано { count, plural, 1 {1 расширение} few {# расширения} other {# расширений} }",
- "type": "Тип",
- "key": "Ключ",
- "value": "Значение",
- "id": "ИД",
- "extension-id": "ИД расширения",
- "extension-type": "Тип расширения",
- "transformer-json": "JSON *",
- "unique-id-required": "Такое ИД расширения уже существует.",
- "delete": "Удалить расширение",
- "add": "Добавить расширение",
- "edit": "Редактировать расширение",
- "delete-extension-title": "Вы точно хотите удалить расширение '{{extensionId}}'?",
- "delete-extension-text": "Внимание, после подтверждения расширение и все связанные с ним данные будут безвозвратно удалены.",
- "delete-extensions-title": "Вы точно хотите удалить { count, plural, 1 {1 расширение} few {# расширения} other {# расширений} }?",
- "delete-extensions-text": "Внимание, после подтверждения выбранные расширения будут удалены.",
- "converters": "Конвертеры",
- "converter-id": "ИД конвертера",
- "configuration": "Конфигурация",
- "converter-configurations": "Конфигурация конвертера",
- "token": "Токен безопасности",
- "add-converter": "Добавить конвертер",
- "add-config": "Добавить конфигурацию конвертера",
- "device-name-expression": "Маска названия устройства",
- "device-type-expression": "Маска типа устройства",
- "custom": "Пользовательский",
- "to-double": "To Double",
- "transformer": "Преобразователь",
- "json-required": "JSON преобразователя обязателен.",
- "json-parse": "Не удалось распознать JSON преобразователя.",
- "attributes": "Атрибуты",
- "add-attribute": "Добавить атрибут",
- "add-map": "Добавить элемент сопоставления",
- "timeseries": "Телеметрия",
- "add-timeseries": "Добавить параметр телеметрии",
- "field-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": "Выражение для ИД запроса",
- "request-id-json-expression": "JSON выражение для ИД запроса",
- "request-id-topic-expression": "Выражение для ИД запроса в названии темы",
- "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-tcp-reconnect": "Переподключатсься автоматически",
- "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": "ИД устройства",
- "modbus-unit-id-range": "ИД устройства должен быть в диапазоне от 1 до 247.",
- "modbus-device-name": "Название устройства",
- "modbus-poll-period": "Частота опроса (в миллисекундах)",
- "modbus-attributes-poll-period": "Частота опроса для атрибутов (в миллисекундах)",
- "modbus-timeseries-poll-period": "Частота опроса для телеметрии (в миллисекундах)",
- "modbus-poll-period-range": "Значение параметра \"Частота опроса\" должно быть больше ноля.",
- "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": "Количество регистров должно быть больше ноля.",
- "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, one {1 объект} few {# объекта} other {# объектов} }?",
- "delete-items-action-title": "Удалить { count, plural, one {1 объект} few {# объекта} other {# объектов}",
- "delete-items-text": "Внимание, после подтверждения выбранные объекты и все связанные с ними данные будут безвозвратно утеряны.",
- "add-item-text": "Добавить новый объект",
- "no-items-text": "Объекты не найдены",
- "item-details": "Подробности об объекте",
- "delete-item": "Удалить объект",
- "delete-items": "Удалить объекты",
- "scroll-to-top": "Прокрутка к началу"
- },
- "help": {
- "goto-help-page": "Перейти к справке"
- },
- "home": {
- "home": "Главная",
- "profile": "Профиль",
- "logout": "Выйти из системы",
- "menu": "Меню",
- "avatar": "Аватар",
- "open-user-menu": "Открыть меню пользователя"
- },
- "import": {
- "no-file": "Файл не выбран",
- "drop-file": "Перетащите JSON файл или кликните для выбора файла.",
- "drop-file-csv": "Перетащите CSV файл или кликните для выбора файла.",
- "column-value": "Значение",
- "column-title": "Название",
- "column-example": "Пример значений данных",
- "column-key": "Ключ атрибута/телеметрии",
- "csv-delimiter": "Разделитель в CSV файле",
- "csv-first-line-header": "Первая строка содержит названия колонок",
- "csv-update-data": "Обновить атрибут/телеметрию",
- "import-csv-number-columns-error": "Файл должен содержать как минимум две колонки",
- "import-csv-invalid-format-error": "Неверный формат данных. Строка: '{{line}}'",
- "column-type": {
- "name": "Название",
- "type": "Тип",
- "label": "Метка",
- "column-type": "Тип колонки",
- "client-attribute": "Клиентский атрибут",
- "shared-attribute": "Общий атрибут",
- "server-attribute": "Серверный атрибут",
- "timeseries": "Телеметрия",
- "entity-field": "Entity field",
- "access-token": "Токен"
- },
- "stepper-text": {
- "select-file": "Выберите файл",
- "configuration": "Конфигурация импорта",
- "column-type": "Выберите тип колонок",
- "creat-entities": "Создание новых объектов",
- "done": "Завершено"
- },
- "message": {
- "create-entities": "{{count}} новый(х) объект(ов) было успешно создано.",
- "update-entities": "{{count}} объект(ов) успешно обновлено.",
- "error-entities": "Возникла ошибка при создании {{count}} объекта(ов)."
- }
- },
- "item": {
- "selected": "Выбранные"
- },
- "js-func": {
- "no-return-error": "Функция должна возвращать значение!",
- "return-type-mismatch": "Функция должна возвращать значение типа '{{type}}'!"
- },
- "key-val": {
- "key": "Ключ",
- "value": "Значение",
- "remove-entry": "Удалить элемент",
- "add-entry": "Добавить элемент",
- "no-data": "Элементы отсутствуют"
- },
- "layout": {
- "layout": "Макет",
- "manage": "Управление макетами",
- "settings": "Настройки макета",
- "color": "Цвет",
- "main": "Основной",
- "right": "Правый",
- "select": "Выбрать макет"
- },
- "legend": {
- "direction": "Расположение элементов легенды",
- "position": "Расположение легенды",
- "show-max": "Показать максимальное значение",
- "show-min": "Показать минимальное значение",
- "show-avg": "Показать среднее значение",
- "show-total": "Показать сумму",
- "settings": "Настройки легенды",
- "min": "Мин",
- "max": "Макс",
- "avg": "Среднее",
- "total": "Сумма",
- "comparison-time-ago": {
- "days": "(день назад)",
- "weeks": "(неделю назад)",
- "months": "(месяц назад)",
- "years": "(год назад)"
- }
- },
- "login": {
- "login": "Войти",
- "request-password-reset": "Запрос на сброс пароля",
- "reset-password": "Сбросить пароль",
- "create-password": "Создать пароль",
- "passwords-mismatch-error": "Введенные пароли должны быть одинаковыми!",
- "password-again": "Введите пароль еще раз",
- "sign-in": "Пожалуйста, войдите в систему",
- "username": "Имя пользователя (эл. адрес)",
- "remember-me": "Запомнить меня",
- "forgot-password": "Забыли пароль?",
- "password-reset": "Пароль сброшен",
- "expired-password-reset-message": "Срок действия Вашего пароля закончился! Пожалуйста, создайте новый пароль.",
- "new-password": "Новый пароль",
- "new-password-again": "Повторите новый пароль",
- "password-link-sent-message": "Ссылка для сброса пароля была успешно отправлена!",
- "email": "Эл. адрес",
- "login-with": "Войти через {{name}}",
- "or": "или"
- },
- "position": {
- "top": "Верх",
- "bottom": "Низ",
- "left": "Левый край",
- "right": "Правый край"
- },
- "profile": {
- "profile": "Профиль",
- "last-login-time": "Время последнего входа в систему",
- "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 отношение} few {# отношения} 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 отношение} few {# отношения} other {# отношений} }?",
- "delete-to-relations-text": "Внимание, после подтверждения выбранные объекты будут отвязаны от текущего объекта.",
- "delete-from-relation-title": "Вы точно хотите удалить отношение, идущее от объекта '{{entityName}}'?",
- "delete-from-relation-text": "Внимание, после подтверждения текущий объект будет отвязан от объекта '{{entityName}}'.",
- "delete-from-relations-title": "Вы точно хотите удалить { count, plural, 1 {1 отношение} few {# отношения} 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 цепочку правил} few {# цепочки правил} other {# цепочек правил} }?",
- "delete-rulechains-action-title": "Удалить { count, plural, 1 {1 цепочку правил} few {# цепочки правил} 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": "Копировать ИД цепочки правил",
- "idCopiedMessage": "ИД цепочки правил скопирован в буфер обмена",
- "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": "Фильтр",
- "type-filter-details": "Фильтр входящих сообщений с заданными условиями",
- "type-enrichment": "Насыщение",
- "type-enrichment-details": "Добавить данные в метадату сообщения",
- "type-transformation": "Преобразование",
- "type-transformation-details": "Изменить содержимое сообщение и его метадату",
- "type-action": "Действие",
- "type-action-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": "Помощь",
- "reset-debug-mode": "Сбросить режим отладки во всех правилах"
- },
- "queue": {
- "select_name": "Выберите имя для Queue",
- "name": "Имя для Queue",
- "name_required": "Поле 'Имя для Queue' обязательно к заполнению!"
-
- },
- "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, one {1 владельца} other {# владельцев} }?",
- "delete-tenants-action-title": "Удалить { count, plural, one {1 владельца} other {# владельцев} }",
- "delete-tenants-text": "Внимание, после подтверждения выбранные Владельцы и все связанные с ними данные будут безвозвратно утеряны.",
- "title": "Имя",
- "title-required": "Имя обязательно.",
- "description": "Описание",
- "details": "Подробности",
- "events": "События",
- "copyId": "Копировать ИД владельца",
- "idCopiedMessage": "ИД владельца скопирован в буфер обмена",
- "select-tenant": "Выбрать владельца",
- "no-tenants-matching": "Владельцы, соответствующие '{{entity}}', не найдены.",
- "tenant-required": "Владелец обязателен"
- },
- "timeinterval": {
- "seconds-interval": "{ seconds, plural, one {1 секунда} few {# секунды} other {# секунд} }",
- "minutes-interval": "{ minutes, plural, one {1 минута} few {# минуты} other {# минут} }",
- "hours-interval": "{ hours, plural, one {1 час} few {# часа} other {# часов} }",
- "days-interval": "{ days, plural, one {1 день} few {# дня} other {# дней} }",
- "days": "Дни",
- "hours": "Часы",
- "minutes": "Минуты",
- "seconds": "Секунды",
- "advanced": "Дополнительно"
- },
- "timewindow": {
- "days": "{ days, plural, one {1 день} few {# дня} other {# дней} }",
- "hours": "{ hours, plural, one {1 час} few {# часа} other {# часов} }",
- "minutes": "{ minutes, plural, one {1 минута} few {# минуты} other {# минут} }",
- "seconds": "{ seconds, plural, one {1 секунда} few {# секунды} other {# секунд} }",
- "realtime": "Режим реального времени",
- "history": "История",
- "last-prefix": "Последние",
- "period": "с {{ startTime }} до {{ endTime }}",
- "edit": "Изменить временное окно",
- "date-range": "Диапазон дат",
- "last": "Последние",
- "time-period": "Период времени",
- "hide": "Скрыть"
- },
- "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, one {1 пользователя} other {# пользователей} }?",
- "delete-users-action-title": "Удалить { count, plural, one {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": "Для активации пользователя используйте ссылку :",
- "copy-activation-link": "Копировать активационную ссылку",
- "activation-link-copied-message": "Ссылка для активации пользователя скопировано в буфер обмена",
- "details": "Подробности",
- "login-as-tenant-admin": "Войти как администратор владельца",
- "login-as-customer-user": "Войти как пользователь клиента",
- "disable-account": "Отключить учетную запись пользователя",
- "enable-account": "Включить учетную запись пользователя",
- "enable-account-message": "Учетная запись пользователя была успешно включена!",
- "disable-account-message": "Учетная запись пользователя была успешно отключена!"
- },
- "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": "Экспортировать виджет"
- },
- "widget-action": {
- "header-button": "Кнопка заголовка виджета",
- "open-dashboard-state": "Перейти к новомум состоянию дашборда",
- "update-dashboard-state": "Обновить текущее состояние дашборда",
- "open-dashboard": "Перейти к другому дашборду",
- "custom": "Пользовательское действие",
- "custom-pretty": "Пользовательское действие (с HTML шаблоном)",
- "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, one {1 набор виджетов} few {# набора виджетов} other {# наборов виджетов} }?",
- "delete-widgets-bundles-action-title": "Удалить { count, plural, one {1 набор виджетов} few {# набора виджетов} 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": "Во весь экран",
- "background-color": "Цвет фона",
- "text-color": "Цвет текста",
- "padding": "Отступ",
- "margin": "Margin",
- "widget-style": "Стиль виджета",
- "title-style": "Стиль названия",
- "mobile-mode-settings": "Настройки мобильного режима",
- "order": "Порядок",
- "height": "Высота",
- "units": "Специальный символ после значения",
- "decimals": "Количество цифр после запятой",
- "timewindow": "Временное окно",
- "use-dashboard-timewindow": "Использовать временное окно дашборда",
- "display-timewindow": "Показывать временное окно",
- "display-legend": "Показать легенду",
- "datasources": "Источники данных",
- "maximum-datasources": "Максимальной количество источников данных равно {{count}}",
- "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}}'?",
- "display-icon": "Показывать иконку в названии",
- "icon-color": "Цвет иконки",
- "icon-size": "Размер иконки"
- },
- "widget-type": {
- "import": "Импортировать тип виджета",
- "export": "Экспортировать тип виджета",
- "export-failed-error": "Не удалось экспортировать тип виджета: {{error}}",
- "create-new-widget-type": "Создать новый тип виджета",
- "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"
- }
- },
- "input-widgets": {
- "attribute-not-allowed": "Атрибут не может быть выбран в этом виджете",
- "date": "Дата",
- "blocked-location": "Геолокация заблокирована в вашем браузере",
- "claim-device": "Подтвердить устройство",
- "claim-failed": "Не удалось подтвердить устройство!",
- "claim-not-found": "Устройство не найдено!",
- "claim-successful": "Устройство успешно подтверждено!",
- "discard-changes": "Отменить изменения",
- "device-name": "Название устройства",
- "device-name-required": "Необходимо указать название устройства",
- "entity-attribute-required": "Значение атрибута обязателено",
- "entity-coordinate-required": "Необходимо указать широту и долготу",
- "entity-timeseries-required": "Значение телеметрии обязательно",
- "get-location": "Получить текущее местоположение",
- "latitude": "Широта",
- "longitude": "Долгота",
- "not-allowed-entity": "Выбраный объект не имеет общих атрибутов",
- "no-attribute-selected": "Атрибут не выбран",
- "no-datakey-selected": "Ни один datakey не выбран",
- "no-entity-selected": "Объект не выбран",
- "no-coordinate-specified": "Ключ для широты/долготы не указан",
- "no-support-geolocation": "Ваш браузер не поддерживает геолокацию",
- "no-image": "Нет изображения",
- "no-support-web-camera": "Нет поддерживаемой веб-камеры",
- "no-timeseries-selected": "Параметр телеметрии не выбран",
- "secret-key": "Секретный ключ",
- "secret-key-required": "Необходимо указать секретный ключ",
- "switch-attribute-value": "Изменить значение атрибута",
- "switch-camera": "Изменить камеру",
- "switch-timeseries-value": "Изменить значение телеметрии",
- "take-photo": "Сделать фото",
- "time": "Время",
- "timeseries-not-allowed": "Телеметрия не может быть выбрана в этом виджете",
- "update-failed": "Не удалось обновить",
- "update-successful": "Успешно обновлено",
- "update-attribute": "Обновить атрибут",
- "update-timeseries": "Обновить телеметрию",
- "value": "Значение"
- }
- },
- "icon": {
- "icon": "Иконка",
- "select-icon": "Выбрать иконку",
- "material-icons": "Иконки в стиле Material",
- "show-all": "Показать все иконки"
- },
- "custom": {
- "widget-action": {
- "action-cell-button": "Кнопка действия в ячейке таблицы",
- "row-click": "Действий при щелчке на строку",
- "marker-click": "Действия при щелчке на маркер",
- "polygon-click": "Действия при щелчке на полигон",
- "tooltip-tag-action": "Действие при нажатии на ссылку в подсказке",
- "node-selected": "Действий при выборе ноды",
- "element-click": "Действий при щелчке на HTML элементе",
- "pie-slice-click": "Действий при щелчке на секции круговой диаграммы",
- "row-double-click": "Действий при двойном щелчке на строку"
- }
- },
- "language": {
- "language": "Язык"
- }
-}
diff --git a/ui/src/app/locale/locale.constant-tr_TR.json b/ui/src/app/locale/locale.constant-tr_TR.json
deleted file mode 100644
index 3f4441f79e..0000000000
--- a/ui/src/app/locale/locale.constant-tr_TR.json
+++ /dev/null
@@ -1,1598 +0,0 @@
-{
- "access": {
- "unauthorized": "Yetkisiz",
- "unauthorized-access": "Yetkisiz Erişim",
- "unauthorized-access-text": "Bu kaynağa erişmek için giriş yapmalısınız!",
- "access-forbidden": "Erişim Yasaklandı",
- "access-forbidden-text": "Bu konuma erişim haklarınız yok!
Bu yere hala erişmek istiyorsanız farklı kullanıcılarla oturum açmayı deneyin.",
- "refresh-token-expired": "Oturum süresi doldu",
- "refresh-token-failed": "Oturum yenilenemiyor"
- },
- "action": {
- "activate": "Etkinleştir",
- "suspend": "Askıya al",
- "save": "Kaydet",
- "saveAs": "Farklı Kaydet",
- "cancel": "İptal",
- "ok": "Tamam",
- "delete": "Sil",
- "add": "Ekle",
- "yes": "Evet",
- "no": "Hayır",
- "update": "Güncelle",
- "remove": "Kaldır",
- "search": "Ara",
- "clear-search": "Aramayı Temizle",
- "assign": "Ata",
- "unassign": "Atamayı kaldır",
- "share": "Paylaş",
- "make-private": "Özel yap",
- "apply": "Uygula",
- "apply-changes": "Değişiklikleri Uygula",
- "edit-mode": "Düzenleme Modu",
- "enter-edit-mode": "Düzenleme moduna gir",
- "decline-changes": "Değişiklikleri reddet",
- "close": "Kapat",
- "back": "Geri",
- "run": "Çalıştır",
- "sign-in": "Giriş yap!",
- "edit": "Düzenle",
- "view": "Görüntüle",
- "create": "Oluştur",
- "drag": "Sürükle",
- "refresh": "Yenile",
- "undo": "Geri al",
- "copy": "Kopyala",
- "paste": "Yapıştır",
- "copy-reference": "Referansı kopyala",
- "paste-reference": "Referansı yapıştır",
- "import": "İçe aktar",
- "export": "Dışa aktar",
- "share-via": "{{provider}} ile paylaş"
- },
- "aggregation": {
- "aggregation": "Toplama",
- "function": "Veri toplama işlevi",
- "limit": "Maksimum değerler",
- "group-interval": "Gruplama aralığı",
- "min": "Min",
- "max": "Maks",
- "avg": "Ortalama",
- "sum": "Toplam",
- "count": "Sayı",
- "none": "Yok"
- },
- "admin": {
- "general": "Genel",
- "general-settings": "Genel Ayarlar",
- "outgoing-mail": "Giden Posta",
- "outgoing-mail-settings": "Giden Posta Ayarları",
- "system-settings": "Sistem Ayarları",
- "test-mail-sent": "Test e-postası başarıyla gönderildi!",
- "base-url": "Temel URL",
- "base-url-required": "Temel URL gerekli.",
- "mail-from": "Gönderen Kişi",
- "mail-from-required": "Gönderen Kişi gerekli.",
- "smtp-protocol": "SMTP protokolü",
- "smtp-host": "SMTP sunucusu",
- "smtp-host-required": "SMTP sunucusu gerekli.",
- "smtp-port": "SMTP portu",
- "smtp-port-required": "Bir SMTP portu sağlamalısınız.",
- "smtp-port-invalid": "Bu geçerli bir smtp portu gibi görünmüyor.",
- "timeout-msec": "Zaman aşımı (milisaniye)",
- "timeout-required": "Zaman aşımı değeri gerekli.",
- "timeout-invalid": "Bu geçerli bir zaman aşımı gibi görünmüyor.",
- "enable-tls": "TLS'i etkinleştir.",
- "tls-version" : "TLS sürümü",
- "send-test-mail": "Test e-postası gönder"
- },
- "alarm": {
- "alarm": "Alarm",
- "alarms": "Alarmlar",
- "select-alarm": "Alarm seç",
- "no-alarms-matching": "'{{entity}}' ile eşleşen alarm bulunamadı.",
- "alarm-required": "Alarm gerekli",
- "alarm-status": "Alarm durumu",
- "search-status": {
- "ANY": "Herhangi biri",
- "ACTIVE": "Aktif",
- "CLEARED": "Temizlendi",
- "ACK": "Onaylandı",
- "UNACK": "Onaylanmadı"
- },
- "display-status": {
- "ACTIVE_UNACK": "Aktif Onaylanmadı",
- "ACTIVE_ACK": "Aktif Onaylandı",
- "CLEARED_UNACK": "Temizlendi Onaylanmadı",
- "CLEARED_ACK": "Temizlendi Onaylandı"
- },
- "no-alarms-prompt": "Alarm bulunamadı",
- "created-time": "Oluşma zamanı",
- "type": "Tip",
- "severity": "Şiddet",
- "originator": "Kaynak",
- "originator-type": "Kaynak tipi",
- "details": "Detaylar",
- "status": "Durum",
- "alarm-details": "Alarm detayları",
- "start-time": "Başlangıç zamanı",
- "end-time": "Bitiş zamanı",
- "ack-time": "Onaylanma zamanı",
- "clear-time": "Temizlenme zamanı",
- "severity-critical": "Kritik",
- "severity-major": "Birincil",
- "severity-minor": "İkincil",
- "severity-warning": "Uyarı",
- "severity-indeterminate": "Belirsiz",
- "acknowledge": "Onayla",
- "clear": "Temizle",
- "search": "Alarm ara",
- "selected-alarms": "{ count, plural, 1 {1 alarm} other {# alarm} } seçildi",
- "no-data": "Görüntülenecek veri bulunmuyor",
- "polling-interval": "Alarm yoklama aralığı (saniye)",
- "polling-interval-required": "Alarm yoklama aralığı gerekli.",
- "min-polling-interval-message": "Alarm yoklama aralığı en az 1 saniye olmalıdır.",
- "aknowledge-alarms-title": "{ count, plural, 1 {1 alarmı} other {# alarmı} } onayla",
- "aknowledge-alarms-text": "{ count, plural, 1 {1 alarmı} other {# alarmı} } onaylamak istediğinize emin misiniz?",
- "clear-alarms-title": "{ count, plural, 1 {1 alarmı} other {# alarmı} } temizle",
- "clear-alarms-text": "{ count, plural, 1 {1 alarmı} other {# alarmı} } temizlemek istediğinize emin misiniz?"
- },
- "alias": {
- "add": "Kısa ad ekle",
- "edit": "Kısa ad düzenle",
- "name": "Kısa ad",
- "name-required": "Kısa ad gerekli",
- "duplicate-alias": "Aynı kısa ad daha önce kullanılmış.",
- "filter-type-single-entity": "Tek öğe",
- "filter-type-entity-list": "Öğe listesi",
- "filter-type-entity-name": "Öğe adı",
- "filter-type-state-entity": "Kontrol panelinden öğe",
- "filter-type-state-entity-description": "Kontrol tablosu durum parametrelerinden alınan öğeler",
- "filter-type-asset-type": "Varlık türü",
- "filter-type-asset-type-description": "'{{assetType}}' türünde varlıklar",
- "filter-type-asset-type-and-name-description": "Adı '{{prefix}}' ile başlayan '{{assetType}}' türünde varlıklar",
- "filter-type-device-type": "Aygıt türü",
- "filter-type-device-type-description": "'{{deviceType}}' türünde aygıtlar",
- "filter-type-device-type-and-name-description": "Adı '{{prefix}}' ile başlayan'{{deviceType}}' türünde aygıtlar",
- "filter-type-relations-query": "İlişkiler sorgusu",
- "filter-type-relations-query-description": "{{relationType}} türünde ilişkili olan varlıklar: {{entities}}. {{direction}}: {{rootEntity}}",
- "filter-type-asset-search-query": "Varlık arama sorgusu",
- "filter-type-asset-search-query-description": "{{relationType}} türünde ilişkisi olan varlıklar {{assetTypes}}. {{direction}}: {{rootEntity}}",
- "filter-type-device-search-query": "Aygıt arama sorgusu",
- "filter-type-device-search-query-description": "{{relationType}} türünde ilişkisi olan aygıt tipleri {{deviceTypes}}. {{direction}}: {{rootEntity}}",
- "entity-filter": "Öğe filtresi",
- "resolve-multiple": "Çoklu öğe olarak çözümle",
- "filter-type": "Filtre tipi",
- "filter-type-required": "Filtre tipi gerekli.",
- "entity-filter-no-entity-matched": "Belirlenen filtre ile eşleşen bir öğe bulunamadı.",
- "no-entity-filter-specified": "Hiçbir öğe filtresi belirtilmedi",
- "root-state-entity": "Kontrol panelini kök olarak kullan",
- "root-entity": "Kök öğe",
- "state-entity-parameter-name": "Durum varlığı parametre adı",
- "default-state-entity": "Varsayılan durum öğesi",
- "default-entity-parameter-name": "Varsayılan",
- "max-relation-level": "Maksimum ilişki düzeyi",
- "unlimited-level": "Sınırsız seviye",
- "state-entity": "Kontrol paneli öğesi",
- "all-entities": "Tüm öğeler",
- "any-relation": "Herhangi biri"
- },
- "asset": {
- "asset": "Varlık",
- "assets": "Varlıklar",
- "management": "Varlık Yönetimi",
- "view-assets": "Varlıkları Görüntüle",
- "add": "Varlık ekle",
- "assign-to-customer": "Kullanıcı grubuna ata",
- "assign-asset-to-customer": "Varlıkları Kullanıcı Grubuna Ata",
- "assign-asset-to-customer-text": "Lütfen kullanıcı grubuna atanacak varlıkları seçin",
- "no-assets-text": "Varlık bulunamadı",
- "assign-to-customer-text": "Lütfen varlıkları atamak için kullanıcı grubu seçin",
- "public": "Açık",
- "assignedToCustomer": "Kullanıcı grubuna atandı",
- "make-public": "Varlığı açık hale getir",
- "make-private": "Varlığı özel hale getir",
- "unassign-from-customer": "Kullanıcı grubundan atamayı kaldır",
- "delete": "Varlığı sil",
- "asset-public": "Varlık açık halde",
- "asset-type": "Varlık türü",
- "asset-type-required": "Varlık türü gerekli.",
- "select-asset-type": "Varlık türü seçin",
- "enter-asset-type": "Varlık türü girin",
- "any-asset": "Herhangi bir varlık",
- "no-asset-types-matching": "'{{entitySubtype}}' ile eşleşen varlık bulunamadı.",
- "asset-type-list-empty": "Herhangi bir varlık türü bulunamadı.",
- "asset-types": "Varlık türleri",
- "name": "İsim",
- "name-required": "İsim gerekli.",
- "description": "Açıklama",
- "type": "Tür",
- "type-required": "Tür gerekli.",
- "details": "Detaylar",
- "events": "Olaylar",
- "add-asset-text": "Yeni varlık ekle",
- "asset-details": "Varlık detayları",
- "assign-assets": "Varlıkları ata",
- "assign-assets-text": "{ count, plural, 1 {1 varlığı} other {# varlığı} } kullanıcı grubuna ata",
- "delete-assets": "Varlıkları sil",
- "unassign-assets": "Varlıkların atamalarını kaldır",
- "unassign-assets-action-title": "{ count, plural, 1 {1 varlığın} other {# varlığın} } atamalarını kullanıcı grubundan kaldır",
- "assign-new-asset": "Yeni varlık ata",
- "delete-asset-title": "'{{assetName}}' isimli varlığı silmek istediğinize emin misiniz?",
- "delete-asset-text": "UYARI: Onaylandıktan sonra varlık ve ilgili tüm veriler geri yüklenemeyecek şekilde silinecek.",
- "delete-assets-title": "{ count, plural, 1 {1 varlığı} other {# varlığı} } silmek istediğinize emin misiniz?",
- "delete-assets-action-title": "{ count, plural, 1 {1 varlığı} other {# varlığı} } sil",
- "delete-assets-text": "UYARI: Onaylandıktan sonra tüm seçili varlıklar ver ilgili tüm veriler geri yüklenemyeck şekilde silinecek.",
- "make-public-asset-title": "'{{assetName}}' isimli varlığı açık hale getirmek istediğinize emin misiniz?",
- "make-public-asset-text": "Onaylandıktan sonra varlık ve ilgili veriler açık hale gelecek ve başkaları tarafından erişilebilir olacaktır.",
- "make-private-asset-title": "'{{assetName}}' isimli varlığı özel hale getirmek istediğinize emin misiniz?",
- "make-private-asset-text": "Onaylandıktan sonra varlık ve ilgili veriler özel hale gelecek ve başkaları tarafından erişilemez olacaktır.",
- "unassign-asset-title": "'{{assetName}}' isimli varlığın atamasını kaldırmak istediğinize emin misiniz?",
- "unassign-asset-text": "Onaylandıktan sonra varlığın ataması kaldırılacak ve kullanıcı grubu tarafından erişilemez olacaktır.",
- "unassign-asset": "Varlık atamasını kaldır",
- "unassign-assets-title": " { count, plural, 1 {1 varlık} other {# varlık} } atamasını kaldırmak istediğinize emin misiniz?",
- "unassign-assets-text": "Onaylandıktan sonra tüm seçili varlıkların ataması kaldırılacak ve kullanıcı grubu tarafından erişilemez olacaktır.",
- "copyId": "Varlık kimliğini kopyala",
- "idCopiedMessage": "Varlık kimliği panoya kopyalandı",
- "select-asset": "Varlık seç",
- "no-assets-matching": "'{{entity}}' isimli varlık bulunamadı.",
- "asset-required": "Varlık gerekli",
- "name-starts-with": "... ile başlayan varlık adı",
- "label": "Etiket"
- },
- "attribute": {
- "attributes": "Öznitelikler",
- "latest-telemetry": "Son telemetri",
- "attributes-scope": "Varlık öznitelik kapsamı",
- "scope-latest-telemetry": "Son telemetri",
- "scope-client": "İstemci öznitelikler",
- "scope-server": "Sunucu öznitelikler",
- "scope-shared": "Paylaşılan öznitelikler",
- "add": "Öznitelik ekle",
- "key": "Anahtar",
- "last-update-time": "Son güncelleme zamanı",
- "key-required": "Öznitelik anahtarı gerekli.",
- "value": "Değer",
- "value-required": "Öznitelik değeri gerekli.",
- "delete-attributes-title": "Silmek istediğinize emin misiniz { count, plural, 1 {1 öznitelik} other {# öznitelik} }?",
- "delete-attributes-text": "UYARI: Onaylandıktan sonra tüm seçili öznitelikler kaldırılacak.",
- "delete-attributes": "Öznitelikleri sil",
- "enter-attribute-value": "Öznitelik değeri gir",
- "show-on-widget": "Göstergede göster",
- "widget-mode": "Gösterge modu",
- "next-widget": "Sonraki gösterge",
- "prev-widget": "Önceki gösterge",
- "add-to-dashboard": "Kontrol paneline ekle",
- "add-widget-to-dashboard": "Göstergeyi kontrol paneline ekle",
- "selected-attributes": "{ count, plural, 1 {1 öznitelik} other {# öznitelik} } seçildi",
- "selected-telemetry": "{ count, plural, 1 {1 telemetri birimi} other {# telemetri birimi} } seçildi"
- },
- "audit-log": {
- "audit": "Log ve Hata Yönetimi",
- "audit-logs": "Loglar ve Hatalar",
- "timestamp": "Zaman",
- "entity-type": "Kaynak",
- "entity-name": "İsim",
- "user": "Kullanıcı",
- "type": "Tür",
- "status": "Durum",
- "details": "Detaylar",
- "type-added": "Eklendi",
- "type-deleted": "Silindi",
- "type-updated": "Güncellendi",
- "type-attributes-updated": "Özellikler güncellendi",
- "type-attributes-deleted": "Özellikler silindi",
- "type-rpc-call": "Uzaktan işlem çağrısı",
- "type-credentials-updated": "Kimlik bilgileri güncellendi",
- "type-assigned-to-customer": "Kullanıcı grubuna atandı",
- "type-unassigned-from-customer": "Kullanıcı grubundan atama kaldırıldı",
- "type-activated": "Etkinleştirildi",
- "type-suspended": "Askıya alındı",
- "type-credentials-read": "Kimlik bilgileri okundu",
- "type-attributes-read": "Özellikler okundu",
- "type-relation-add-or-update": "İlişki güncellendi",
- "type-relation-delete": "İlişki silindi",
- "type-relations-delete": "Tüm ilişki silindi",
- "type-alarm-ack": "Kabul edilen",
- "type-alarm-clear": "Temizlendi",
- "status-success": "Başarılı",
- "status-failure": "Başarısız",
- "audit-log-details": "Log ve hata detayları",
- "no-audit-logs-prompt": "Log ve hata bulunamadı",
- "action-data": "Eylem verisi",
- "failure-details": "Başarısız işlem detayları",
- "search": "Hata ve Log Geçmişinde Ara",
- "clear-search": "Aramayı temizle"
- },
- "confirm-on-exit": {
- "message": "Kaydedilmemiş değişiklikler var. Sayfadan ayrılmak istediğinize emin misiniz?",
- "html-message": "Kaydedilmemiş değişiklikler var.
Sayfadan ayrılmak istediğinize emin misiniz?",
- "title": "Kaydedilmemiş Değişiklikler"
- },
- "contact": {
- "country": "Ülke",
- "city": "Şehir",
- "state": "Eyalet / İl",
- "postal-code": "Posta Kodu",
- "postal-code-invalid": "Geçersiz Posta Kodu.",
- "address": "Addres",
- "address2": "Addres 2",
- "phone": "Telefon",
- "email": "E-posta",
- "no-address": "Adres yok"
- },
- "common": {
- "username": "Kullanıcı adı",
- "password": "Parola",
- "enter-username": "Kullanıcı adı gir",
- "enter-password": "Parola gir",
- "enter-search": "Arama gir"
- },
- "content-type": {
- "json": "Json",
- "text": "Metin",
- "binary": "İkili (Base64)"
- },
- "customer": {
- "customer": "Kullanıcı Grubu",
- "customers": "Kullanıcı Grupları",
- "management": "Kullanıcı Grubu Yönetimi",
- "dashboard": "Kullanıcı Grubu Kontrol Paneli",
- "dashboards": "Kullanıcı Grubu Kontrol Panellleri",
- "devices": "Kullanıcı Grubu Aygıtları",
- "entity-views": "Müşteri Varlığı Görüntüleme Sayısı",
- "assets": "Kullanıcı Grubu Varlıkları",
- "public-dashboards": "Açık Kontrol Panelleri",
- "public-devices": "Açık Aygıtlar",
- "public-assets": "Açık Varlıklar",
- "public-entity-views": "Kamu Varlık Görüntüleme Sayısı",
- "add": "Kullanıcı grubu ekle",
- "delete": "Kullanıcı grubunu sil",
- "manage-customer-users": "Kullanıcı grubu kullanıcılarını yönet",
- "manage-customer-devices": "Kullanıcı grubu aygıtlarını yönet",
- "manage-customer-dashboards": "Kullanıcı grubu kontrol panellerini yönet",
- "manage-public-devices": "Açık aygıtları yönet",
- "manage-public-dashboards": "Açık kontrol panellerini yönet",
- "manage-customer-assets": "Kullanıcı Grubu varlıklarını yönet",
- "manage-public-assets": "Açık varlıkları yönet",
- "add-customer-text": "Yeni Kullanıcı Grubu ekle",
- "no-customers-text": "Kullanıcı Grubu bulunamadı",
- "customer-details": "Kullanıcı Grubu detayları",
- "delete-customer-title": "'{{customerTitle}}' isimli kullanıcı grubunu silmek istediğinize emin misiniz?",
- "delete-customer-text": "UYARI: Onaylandıktan sonra kullanıcı grubu ve tüm ilişkili veriler geri yüklenemeyecek şekilde silinecek.",
- "delete-customers-title": "{ count, plural, 1 {1 kullanıcı grubunu} other {# kullanıcı grubunu} } silmek istediğinize emin misiniz?",
- "delete-customers-action-title": "{ count, plural, 1 {1 kullanıcı grubunu} other {# kullanıcı grubunu} } sil",
- "delete-customers-text": "UYARI: Onaylandıktan sonra tüm seçili kullanıcı grupları ve ilişkili veriler geri yüklenemez şekilde silinecek.",
- "manage-users": "Kullanıcıları yönet",
- "manage-assets": "Varlıkları yönet",
- "manage-devices": "Aygıtları yönet",
- "manage-dashboards": "Kontrol panellerini yönet",
- "title": "Başlık",
- "title-required": "Başlık gerekli.",
- "description": "Açıklama",
- "details": "Detaylar",
- "events": "Olaylar",
- "copyId": "Kullanıcı kimliğini kopyala",
- "idCopiedMessage": "Kullanıcı kimliği panoya kopyalandı",
- "select-customer": "Kullanıcı grubunu seç",
- "no-customers-matching": "'{{entity}}' ile eşleşen kullanıcı grubu bulunamadı.",
- "customer-required": "Kullanıcı grubu gerekli",
- "select-default-customer": "Varsayılan müşteriyi seç",
- "default-customer": "Varsayılan müşteri",
- "default-customer-required": "Kiracı düzeyinde gösterge tablosunda hata ayıklamak için varsayılan müşteri gerekiyor"
- },
- "datetime": {
- "date-from": "Tarihinden",
- "time-from": "Saatinden",
- "date-to": "Tarihine",
- "time-to": "Saatine"
- },
- "dashboard": {
- "dashboard": "Kontrol Paneli",
- "dashboards": "Kontrol Panelleri",
- "management": "Kontrol Paneli Yönetimi",
- "view-dashboards": "Kontrol Panellerini Görüntüle",
- "add": "Kontrol Paneli Ekle",
- "assign-dashboard-to-customer": "Kullanıcı Grubuna Kontrol Panel(ler)i Ata",
- "assign-dashboard-to-customer-text": "Lütfen kullanıcı grubuna atanacak kontrol panellerini seçin",
- "assign-to-customer-text": "Lütfen kontrol panel(ler)ini atayacak kullanıcı grubu seçin",
- "assign-to-customer": "Kullanıcı grubuna ata",
- "unassign-from-customer": "Kullanıcı grubundan atamayı kaldır",
- "make-public": "Kontrol panelini açık hale getir",
- "make-private": "Kontrol panelini özel hale getir",
- "manage-assigned-customers": "Atanan müşterileri yönet",
- "assigned-customers": "Atanan müşteriler",
- "assign-to-customers": "Gösterge Tablosunu / Müşterilerini Müşterilere Atama",
- "assign-to-customers-text": "Lütfen gösterge panosunu atamak için müşterileri seçin",
- "unassign-from-customers": "Müşterilerden Gösterge Tablosunu (Notlarını) Atama",
- "unassign-from-customers-text": "Lütfen gösterge tablosundan atamak için müşterileri seçin",
- "no-dashboards-text": "Kontrol paneli bulunamadı",
- "no-widgets": "Hiçbir gösterge yapılandırılmadı",
- "add-widget": "Yeni gösterge ekle",
- "title": "Başlık",
- "select-widget-title": "Gösterge seç",
- "select-widget-subtitle": "Kullanılabilir gösterge türleri listesi",
- "delete": "Kontrol paneli sil",
- "title-required": "Başlık gerekli.",
- "description": "Açıklama",
- "details": "Detaylar",
- "dashboard-details": "Kontrol paneli detayları",
- "add-dashboard-text": "Yeni kontrol paneli ekle",
- "assign-dashboards": "Kontrol panelleri ata",
- "assign-new-dashboard": "Yeni kontrol paneli ata",
- "assign-dashboards-text": "{ count, plural, 1 {1 kontrol panelini} other {# kontrol panelini} } kullanıcı grubuna ata",
- "unassign-dashboards-action-text": "Müşterilerden atama { count, plural, 1 {1 gösterge tablosu} other {# panolar}}",
- "delete-dashboards": "Kontrol panellerini sil",
- "unassign-dashboards": "Kontrol panellerinden atamayı kaldır",
- "unassign-dashboards-action-title": "{ count, plural, 1 {1 kontrol panelinin} other {# kontrol panelinin} } atamaları kullanıcı grubundan kaldır",
- "delete-dashboard-title": "'{{dashboardTitle}}' isimli kontrol panelini silmek istediğinize emin misiniz?",
- "delete-dashboard-text": "UYARI: Onaylandıktan sonra kontrol paneli ve ilişkili verileri geri yüklenemez şekilde silinecek.",
- "delete-dashboards-title": "{ count, plural, 1 {1 kontrol panelini} other {# kontrol panelini} } silmek istediğinize emin misiniz?",
- "delete-dashboards-action-title": "{ count, plural, 1 {1 kontrol panelini} other {# kontrol panelini} } sil",
- "delete-dashboards-text": "UYARI: Onaylandıktan sonra tüm seçili kontrol panelleri ve ilişkili verileri geri yüklenemez şekilde silinecek.",
- "unassign-dashboard-title": "'{{dashboardTitle}}' isimli kontrol panelindeki atamayı kaldırmak istediğinize emin misiniz?",
- "unassign-dashboard-text": "Onaylandıktan sonra kontrol panelinin ataması kaldırılacak ve kullanıcı grubu tarafından erişilemez hale gelecektir.",
- "unassign-dashboard": "Kontrol panelinin ataması kaldır",
- "unassign-dashboards-title": "{count, plural, 1 {1 kontrol panelindeki} other {# kontrol panelindeki} } atamayı kaldırmak istediğinize emin misiniz?",
- "unassign-dashboards-text": "Onaylandıktan {{dashboardTitle}} açık hale getirildi ve bu bağlantıdan erişilebilir durumda",
- "public-dashboard-notice": "Not: Kontrol panelinden tüm verilere erişebilmek adına ilişkili aygıtları da açık hale getirmeniz gerekmektedir.",
- "make-private-dashboard-title": "'{{dashboardTitle}}' isimli kontrol panelini özel hale getirmek istediğinize emin misiniz?",
- "make-private-dashboard-text": "Onaylandıktan sonra kontrol paneli özel hale getirilecek ve başkaları tarafından erişilemez olacak.",
- "make-private-dashboard": "Kontrol panelini özel hale getir",
- "socialshare-text": "'{{dashboardTitle}}'",
- "socialshare-title": "'{{dashboardTitle}}'",
- "select-dashboard": "Kontrol paneli seç",
- "no-dashboards-matching": "'{{entity}}' ile eşleşen kontrol paneli bulunamadı.",
- "dashboard-required": "Kontrol paneli gerekli.",
- "select-existing": "Var olan bir kontrol paneli seç",
- "create-new": "Yeni bir kontrol paneli oluştur",
- "new-dashboard-title": "Yeni kontrol paneli başlığı",
- "open-dashboard": "Kontrol panelini aç",
- "set-background": "Arka plan belirle",
- "background-color": "Arka plan rengi",
- "background-image": "Arka plan resmi",
- "background-size-mode": "Arka plan boyutu modu",
- "no-image": "Hiçbir resim seçilmedi",
- "drop-image": "Bir resim bırakın veya yüklenecek dosyayı seçmek için tıklayın.",
- "settings": "Ayarlar",
- "columns-count": "Kolon sayısı",
- "columns-count-required": "Kolon sayısı gerekli.",
- "min-columns-count-message": "Kolon sayısı en az 10 olabilir.",
- "max-columns-count-message": "Kolon sayısı en fazla 1000 olabilir.",
- "widgets-margins": "Göstergeler arasındaki aralık",
- "horizontal-margin": "Yatay aralık",
- "horizontal-margin-required": "Yatay aralık değeri gerekli.",
- "min-horizontal-margin-message": "Yatay aralık değeri en az 0 olabilir.",
- "max-horizontal-margin-message": "Yatay aralık değeri en fazla 50 olabilir.",
- "vertical-margin": "Dikey aralık",
- "vertical-margin-required": "Dikey aralık değeri gerekli.",
- "min-vertical-margin-message": "Dikey aralık değeri en az 0 olabilir.",
- "max-vertical-margin-message": "Dikey aralık değeri en fazla 50 olabilir.",
- "autofill-height": "Otomatik doldurma düzeni yüksekliği",
- "mobile-layout": "Mobil düzen ayarları",
- "mobile-row-height": "Mobil satır yüksekliği, px",
- "mobile-row-height-required": "Mobil satır yüksekliği değeri gerekli.",
- "min-mobile-row-height-message": "Mobil satır yükseliği değeri en az 5 px olabilir.",
- "max-mobile-row-height-message": "Mobil satır yükseliği değeri en çok 200 px olabilir.",
- "display-title": "Kontrol paneli başlığını göster",
- "toolbar-always-open": "Araç çubuğunu her zaman açık tut",
- "title-color": "Başlık rengi",
- "display-dashboards-selection": "Kontrol paneli seçimlerinş göster",
- "display-entities-selection": "Varlık seçimlerini göster",
- "display-dashboard-timewindow": "Zaman aralığını göster",
- "display-dashboard-export": "Dışa aktar seçeneğini göster",
- "import": "Kontrol panelini içe aktar",
- "export": "Kontrol panelini dışa aktar",
- "export-failed-error": "Kontrol paneli dışa aktarılamıyor: {{error}}",
- "create-new-dashboard": "Yeni kontrol paneli oluştur",
- "dashboard-file": "Kontrol paneli dosyası",
- "invalid-dashboard-file-error": "Kontrol paneli içe aktarılamadı: Geçersiz kontrol paneli veri yapısı.",
- "dashboard-import-missing-aliases-title": "İçe aktarılan kontrol paneli tarafından kullanılan aygıt kısa adlarını yapılandırın",
- "create-new-widget": "Yeni gösterge oluştur",
- "import-widget": "Göstergeyi içe aktar",
- "widget-file": "Gösterge dosyası",
- "invalid-widget-file-error": "Gösterge içe aktarılamadı: Geçersiz gösterge veri yapısı.",
- "widget-import-missing-aliases-title": "İçe aktarılan gösterge tarafından kullanılan aygıt kısa adlarını yapılandırın",
- "open-toolbar": "Kontrol paneli araç çubuğunu aç",
- "close-toolbar": "Araç çubuğunu kapat",
- "configuration-error": "Yapılandırma hatası",
- "alias-resolution-error-title": "Kontro paneli kısa adları yapılandırma hatası",
- "invalid-aliases-config": "Kısa ad filtresiyle eşleşen aygıt bulunamadı.
",
- "select-devices": "Aygıt seçin",
- "assignedToCustomer": "Kullanıcı grubuna atandı",
- "assignedToCustomers": "Kullanıcılara atandı",
- "public": "Açık",
- "public-link": "Açık bağlantı",
- "copy-public-link": "Açık bağlantıyı kopyala",
- "public-link-copied-message": "Kontrol paneli açık bağlantısı panoya kopyalandı",
- "manage-states": "Kontrol paneli durumlarını yönet",
- "states": "Kontrol paneli durumları",
- "search-states": "Kontrol paneli durumu ara",
- "selected-states": "{ count, plural, 1 {1 kontrol paneli durumu} other {# kontrol paneli durumu} } seçildi",
- "edit-state": "Kontrol paneli durumu düzenle",
- "delete-state": "Kontrol paneli durumunu sil",
- "add-state": "Kontrol paneli durumu ekle",
- "state": "Kontrol paneli durumu",
- "state-name": "İsim",
- "state-name-required": "Kontrol paneli durumu ismi gerekli.",
- "state-id": "Durum Kimliği",
- "state-id-required": "Kontrol paneli durum kimliği gerekli.",
- "state-id-exists": "Aynı kimlikte bir kontrol paneli durumu mevcut.",
- "is-root-state": "Kök durum",
- "delete-state-title": "Kontrol paneli durumunu sil",
- "delete-state-text": "'{{stateName}}' isimli kontrol paneli durumunu silmek istediğinize emin misiniz?",
- "show-details": "Detayları göster",
- "hide-details": "Detayları gizle",
- "select-state": "Hedef durumu seç",
- "state-controller": "Durum denetleyicisi"
- },
- "datakey": {
- "settings": "Ayarlar",
- "advanced": "İleri düzey",
- "label": "Etiket",
- "color": "Renk",
- "units": "Değerin yanında göstermek için özel simge",
- "decimals": "Noktadan sonraki basamak sayısı",
- "data-generation-func": "Veri oluşturma fonksiyonu",
- "use-data-post-processing-func": "Veri işleme sonrası fonksiyonunu kullanın",
- "configuration": "Veri anahtarı yapılandırması",
- "timeseries": "Zaman serisi",
- "attributes": "Öznitelikler",
- "alarm": "Alarm alanları",
- "timeseries-required": "Zaman serisi öğesi gerekli.",
- "timeseries-or-attributes-required": "Zaman serisi/öznitelikler öğesi gerekli.",
- "maximum-timeseries-or-attributes": "Maksimum { count, plural, 1 {1 zamanserisi/öznitelik kabul edilir.} other {# zamanserisi/öznitelik kabul edilir} }",
- "alarm-fields-required": "Alarm alanları gerekli.",
- "function-types": "Fonksiyon türleri",
- "function-types-required": "Fonksiyon türleri gerekli.",
- "maximum-function-types": "Maksimum { count, plural, 1 {1 fonksiyon türü kabul edilir.} other {# fonksiyon türü kabul edilir} }"
- },
- "datasource": {
- "type": "Veri kaynağı türü",
- "name": "İsim",
- "add-datasource-prompt": "Lütfen veri kaynağı ekleyin"
- },
- "details": {
- "edit-mode": "Düzenleme modu",
- "toggle-edit-mode": "Düzenleme modunu aç/kapat"
- },
- "device": {
- "device": "Aygıt",
- "device-required": "Aygıt gerekli.",
- "devices": "Aygıtlar",
- "management": "Aygıt Yönetimi",
- "view-devices": "Aygıtları görüntüle",
- "device-alias": "Aygıt kısa adı",
- "aliases": "Aygıt kısa adları",
- "no-alias-matching": "'{{alias}}' bulunamadı.",
- "no-aliases-found": "Hiçbir kısa ad bulunamadı.",
- "no-key-matching": "'{{key}}' bulunamadı.",
- "no-keys-found": "Hiçbir anahtar bulunamadı.",
- "create-new-alias": "Yeni bir tane oluştur!",
- "create-new-key": "Yeni bir tane oluştur!",
- "duplicate-alias-error": "'{{alias}}' daha önce kaydedilmiş.
Aygıt kısa adları kontrol paneli özelinde emsalsiz olmalıdır.",
- "configure-alias": "'{{alias}}' kısa adını yapılandırın",
- "no-devices-matching": "'{{entity}}' ile eşleşen aygıt bulunamadı.",
- "alias": "Kısa ad",
- "alias-required": "Aygıt kısa adı gerekli.",
- "remove-alias": "Aygıt kısa adını kaldır",
- "add-alias": "Aygıt kısa adı ekle",
- "name-starts-with": "... ile başlayan aygıt adı",
- "device-list": "Aygıt listesi",
- "use-device-name-filter": "Filtre kullan",
- "device-list-empty": "Hiçbir aygıt seçilmedi.",
- "device-name-filter-required": "Aygıt adı filtresi gerekli.",
- "device-name-filter-no-device-matched": "'{{device}}' ile başlayan herhangi bir aygıt bulunamadı.",
- "add": "Aygıt ekle",
- "assign-to-customer": "Kullanıcı grubuna ata",
- "assign-device-to-customer": "Aygıt(lar)ı Kullanıcı Grubuna Ata",
- "assign-device-to-customer-text": "Lütfen kullanıcı grubuna atanacak aygıtları seçin",
- "make-public": "Aygıtı açık hale getir",
- "make-private": "Aygıtı gizli hale getir",
- "no-devices-text": "Hiçbir aygıt bulunamadı",
- "assign-to-customer-text": "Lütfen aygıt(lar)ı atayacak kullanıcı grubu seçin",
- "device-details": "Aygıt detayları",
- "add-device-text": "Yeni aygıt ekle",
- "credentials": "Kimlik bilgileri",
- "manage-credentials": "Kimlik bilgilerini yönet",
- "delete": "Aygıt sil",
- "assign-devices": "Aygıt ata",
- "assign-devices-text": "{ count, plural, 1 {1 aygıtı} other {# aygıtı} } kullanıcı grubuna ata",
- "delete-devices": "Aygıtları sil",
- "unassign-from-customer": "Kullanıcı Grubundan atamayı kaldır",
- "unassign-devices": "Aygıtlardan atamayı kaldır",
- "unassign-devices-action-title": "{ count, plural, 1 {1 aygıtın} other {# aygıtın} } atamasını kullanıcı grubundan kaldır",
- "assign-new-device": "Yeni aygıt ata",
- "make-public-device-title": "'{{deviceName}}' isimli aygıtı açık hale getirmek istediğinizden emin misiniz?",
- "make-public-device-text": "Onaylandıktan sonra aygıt ve verileri açık hale getirilecek ve diğerleri tarafından erişilebilir olacak.",
- "make-private-device-title": "'{{deviceName}}' isimli aygıtı gizli hale getirmek istediğinizden emin misiniz?",
- "make-private-device-text": "Onaylandıktan sonra aygıt ve verileri gizli hale getirilecek ve diğerleri tarafından erişilemez olacak.",
- "view-credentials": "Kimlik bilgilerini görüntüle",
- "delete-device-title": "'{{deviceName}}' isimli aygıtı silmek istediğinize emin misiniz?",
- "delete-device-text": "UYARI: Onaylandıktan sonra aygıt ve ilişkili verileri geri yüklenemez şekilde silinecek.",
- "delete-devices-title": "{ count, plural, 1 {1 aygıtı} other {# aygıtı} } silmek istediğinize emin misiniz?",
- "delete-devices-action-title": "{ count, plural, 1 {1 aygıtı} other {# aygıtı} } sil",
- "delete-devices-text": "UYARI: Onaylandıktan sonra tüm seçili aygıtlar ve ilişkili verileri geri yüklenemez şekilde silinecek.",
- "unassign-device-title": "'{{deviceName}}' isimli aygıtın atamasını kaldırmak istediğinize emin misiniz?",
- "unassign-device-text": "Onaylandıktan sonra aygıtın ataması kaldırılacak ve kullanıcı grubu tarafından erişilemez olacak.",
- "unassign-device": "Aygıt atamasını kaldır",
- "unassign-devices-title": "{ count, plural, 1 {1 aygıtın} other {# aygıtın} } atamasını kaldırmak istediğinize emin misiniz?",
- "unassign-devices-text": "Onaylandıktan sonra seçili aygıtların atamaları kaldırılacak ve kullanıcı grubu tarafından erişilemez olacak.",
- "device-credentials": "Aygıt Kimlik Bilgileri",
- "credentials-type": "Kimlik Bilgi Türü",
- "access-token": "Erişim şifresi",
- "access-token-required": "Erişim şifresi gerekli.",
- "access-token-invalid": "Erişim şifresi uzunluğu 1 ile 20 karakter arasında olmalıdır.",
- "rsa-key": "RSA açık anahtarı",
- "rsa-key-required": "RSA açık anahtarı gerekli.",
- "secret": "Secret",
- "secret-required": "Secret gerekli.",
- "device-type": "Aygıt Türü",
- "device-type-required": "Aygıt türü gereli.",
- "select-device-type": "Aygıt türü seç",
- "enter-device-type": "Aygıt türü gir",
- "any-device": "Herhangi bir aygıt",
- "no-device-types-matching": "'{{entitySubtype}}' ile eşleşen aygıt türü bulunamadı.",
- "device-type-list-empty": "Hiçbir aygıt türü seçilmedi.",
- "device-types": "Aygıt türleri",
- "name": "İsim",
- "name-required": "İsim gerekli.",
- "description": "Açıklama",
- "events": "Olaylar",
- "details": "Detaylar",
- "copyId": "Aygıt kimliğini kopyala",
- "copyAccessToken": "Erişim şifresini kopyala",
- "idCopiedMessage": "Aygıt kimliği panoya kopyalandı.",
- "accessTokenCopiedMessage": "Aygıt erişim şifresi panoya kopyalandı",
- "assignedToCustomer": "Kullanıcı Grubuna atandı",
- "unable-delete-device-alias-title": "Aygıt kısa adı silinemedi",
- "unable-delete-device-alias-text": "Aygıt kısa adı('{{deviceAlias}}'), şu göstergeler tarafından kullanıldığı için silinemedi:
{{widgetsList}}",
- "is-gateway": "Ağ geçidi mi?",
- "public": "Açık",
- "device-public": "Aygıt açık",
- "select-device": "Aygıt seç"
- },
- "dialog": {
- "close": "Kapat"
- },
- "error": {
- "unable-to-connect": "Sunucuya bağlanamadı! Lütfen internet bağlantınızı kontrol edin.",
- "unhandled-error-code": "İşlenmeyen hata koud: {{errorCode}}",
- "unknown-error": "Bilinmeyen hata"
- },
- "entity": {
- "entity": "Öğe",
- "entities": "Öğeler",
- "aliases": "Öğe kısa adları",
- "entity-alias": "Öğe kısa adı",
- "unable-delete-entity-alias-title": "Öğe kısa adı silinemedi",
- "unable-delete-entity-alias-text": "Öğe kısa adı('{{entityAlias}}'), şu göstergeler tarafından kullanıldığı için silinemiyor:
{{widgetsList}}",
- "duplicate-alias-error": "'{{alias}}' daha önce kaydedilmiş.
Öğe kısa adları kontrol paneli özelinde emsalsiz olmalı.",
- "missing-entity-filter-error": "'{{alias}}' için filtre bulunmuyor.",
- "configure-alias": "'{{alias}}' kısa adını yapılandır",
- "alias": "Kısa ad",
- "alias-required": "Öğe kısa adı gerekli.",
- "remove-alias": "Öğe kısa adını kaldır",
- "add-alias": "Öğe kısa adı ekle",
- "entity-list": "Öğe listesi",
- "entity-type": "Öğe türü",
- "entity-types": "Öğe türleri",
- "entity-type-list": "Öğe türü listesi",
- "any-entity": "Herhangi bir öğe",
- "enter-entity-type": "Öğe türü girin",
- "no-entities-matching": "'{{entity}}' ile eşleşen öğe bulunamadı.",
- "no-entity-types-matching": "'{{entityType}}' ile eşleşen öğe türü bulunamadı.",
- "name-starts-with": "... ile başlayan isim",
- "use-entity-name-filter": "Filtre kullan",
- "entity-list-empty": "Hiçbir öğe seçilmedi.",
- "entity-type-list-empty": "Hiçbir öğe türü seçilmedi.",
- "entity-name-filter-required": "Öğe ismi filtresi gerekli.",
- "entity-name-filter-no-entity-matched": "'{{entity}}' ile başlayan hiçbir öğe bulunamadı.",
- "all-subtypes": "Tümü",
- "select-entities": "Öğeleri seç",
- "no-aliases-found": "Hiçbir kısa ad bulunamadı.",
- "no-alias-matching": "'{{alias}}' bulunamadı.",
- "create-new-alias": "Yeni bir tane oluştur!",
- "key": "Anahtar",
- "key-name": "Anahtar adı",
- "no-keys-found": "Hiçbir anahtar bulunamadı.",
- "no-key-matching": "'{{key}}' bulunamadı.",
- "create-new-key": "Yeni bir tane oluştur!",
- "type": "Tür",
- "type-required": "Öğe türü gerekli.",
- "type-device": "Aygıt",
- "type-devices": "Aygıtlar",
- "list-of-devices": "{ count, plural, 1 {Bir aygıt} other {# Aygıtın Listesi} }",
- "device-name-starts-with": "İsimleri '{{prefix}}' ile başlayan aygıtlar",
- "type-asset": "Varlık",
- "type-assets": "Varlıklar",
- "list-of-assets": "{ count, plural, 1 {Bir varlık} other {# Varlığın Listesi} }",
- "asset-name-starts-with": "İsmi '{{prefix}}' ile başlayan varlıklar",
- "type-entity-view": "Varlık Görünümü",
- "type-entity-views": "Varlık Görünümleri",
- "list-of-entity-views": "{ count, plural, 1 {Bir varlık görünümü} other {# varlık görüntüleme}} listesi",
- "entity-view-name-starts-with": "Adı {{önek}} ile başlayan varlık görünümleri",
- "type-rule": "Kural",
- "type-rules": "Kurallar",
- "list-of-rules": "{ count, plural, 1 {Bir kural} other {# Kuralın Listesi} }",
- "rule-name-starts-with": "İsmi '{{prefix}}' ile başlayan kurallar",
- "type-plugin": "Eklenti",
- "type-plugins": "Eklentiler",
- "list-of-plugins": "{ count, plural, 1 {Bir eklenti} other {# Eklentinin Listesi} }",
- "plugin-name-starts-with": "İsmi '{{prefix}}' ile başlayan eklentiler",
- "type-tenant": "Tenant",
- "type-tenants": "Tenantlar",
- "list-of-tenants": "{ count, plural, 1 {Bir tenant} other {# Tenantın Listesi} }",
- "tenant-name-starts-with": "İsmi '{{prefix}}' ile başlayan tenantlar",
- "type-customer": "Kullanıcı Grubu",
- "type-customers": "Kullanıcı Grupları",
- "list-of-customers": "{ count, plural, 1 {Bir Kullanıcı Grubu} other {# Kullanıcı Grupları} }",
- "customer-name-starts-with": "İsmi '{{prefix}}' ile başlayan Kullanıcı Grupları",
- "type-user": "Kullanıcı",
- "type-users": "Kullanıcılar",
- "list-of-users": "{ count, plural, 1 {Bir kullanıcı} other {# Kullanıcının Listesi} }",
- "user-name-starts-with": "İsmi '{{prefix}}' ile başlayan kullanıcılar",
- "type-dashboard": "Kontrol paneli",
- "type-dashboards": "Kontrol panelleri",
- "list-of-dashboards": "{ count, plural, 1 {Bir kontrol paneli} other {# Kontrol Panelinin Listesi} }",
- "dashboard-name-starts-with": "İsmi '{{prefix}}' ile başlayan kontrol panelleri",
- "type-alarm": "Alarm",
- "type-alarms": "Alarmlar",
- "list-of-alarms": "{ count, plural, 1 {Bir alarm} other {# Alarmın Listesi} }",
- "alarm-name-starts-with": "İsmi '{{prefix}}' ile başlayan alarmlar",
- "type-rulechain": "Kural zinciri",
- "type-rulechains": "Kural zincirleri",
- "list-of-rulechains": "{ count, plural, 1 {Bir kural zinciri} other {# kural zincirinin listesi}}",
- "rulechain-name-starts-with": "İsimleri {{prefix}} ile başlayan kural zincirleri",
- "type-rulenode": "Kural düğümü",
- "type-rulenodes": "Kural düğümleri",
- "list-of-rulenodes": "{ count, plural, 1 {Bir kural node} other {# kural düğümünün listesi}}",
- "rulenode-name-starts-with": "İsimleri '{{prefix}} ile başlayan kural düğümleri",
- "type-current-customer": "Mevcut Müşteri",
- "search": "Öğeleri ara",
- "selected-entities": "{ count, plural, 1 {1 öğe} other {# öğe} } seçildi",
- "entity-name": "Öğe adı",
- "details": "Öğe detayları",
- "no-entities-prompt": "Hiçbir öğe bulunamadı",
- "no-data": "Görüntülenecek veri yok"
- },
- "entity-view": {
- "entity-view": "Varlık Görünümü",
- "entity-views": "Varlık Görünümleri",
- "management": "Varlık Görünümü yönetimi",
- "view-entity-views": "Varlık Görünümlerini Görüntüle",
- "entity-view-alias": "Varlık Görünümü takma adı",
- "aliases": "Varlık Görünümü takma adları",
- "no-alias-matching": "'{{alias}} bulunamadı. ",
- "no-aliases-found": "Takma ad bulunamadı",
- "no-key-matching": "'{{anahtar bulunamadı.",
- "no-keys-found": "Anahtar bulunamadı.",
- "create-new-alias": "Yeni bir tane oluştur!",
- "create-new-key": "Yeni bir tane oluştur!",
- "duplicate-alias-error": "Yinelenen takma ad bulundu {{alias}} '.. Entity View diğer adlar, gösterge panosunda benzersiz olmalıdır. ",
- "configure-alias": "Yapılandırma {{alias}} takma ad",
- "no-entity-views-matching": "{{entity}} ile eşleşen hiçbir varlık yorumu bulunamadı. ",
- "alias": "Alias",
- "alias-required": "Varlık Görünümü takma adı gerekiyor.",
- "remove-alias": "Varlık görünümü takma adını kaldır",
- "add-alias": "Varlık görünümü takma adı ekle",
- "name-starts-with": "Varlık Görünümü adı ile başlıyor",
- "entity-view-list": "Varlık Görünümü listesi",
- "use-entity-view-name-filter": "Filtre kullan",
- "entity-view-list-empty": "Hiçbir varlık görüşü seçilmedi.",
- "entity-view-name-filter-required": "Varlık görünüm adı filtresi gerekli.",
- "entity-view-name-filter-no-entity-view-matched": "{{entityView}} ile başlayan hiçbir varlık sayısı bulunamadı.",
- "add": "Varlık Görünümü Ekle",
- "assign-to-customer": "Müşteriye atama",
- "assign-entity-view-to-customer": "Varlık Görünümlerini Müşteriye Atama",
- "assign-entity-view-to-customer-text": "Lütfen müşteriye atamak için varlık görünümlerini seçin",
- "no-entity-views-text": "Varlık görüşü bulunamadı",
- "assign-to-customer-text": "Lütfen varlık görünümlerini atamak için müşteriyi seçin",
- "entity-view-details": "Varlık görünümü ayrıntıları",
- "add-entity-view-text": "Yeni varlık görünümü ekle",
- "delete": "Varlık görünümünü sil",
- "assign-entity-views": "Varlık görünümleri atama",
- "assign-entity-views-text": "Müşteriye { count, plural, 1 {1 entityView} other {# entityViews}} atayın ",
- "delete-entity-views": "Varlık görünümlerini sil",
- "unassign-from-customer": "Müşteriden atama",
- "unassign-entity-views": "Varlık görünümlerini atama",
- "unassign-entity-views-action-title": "Müşteriden atama { count, plural, 1 {1 entityView} other {# entityViews}}",
- "assign-new-entity-view": "Yeni varlık görünümü atama",
- "delete-entity-view-title": "Varlık görünümünü silmek istediğinizden emin misiniz?, {{entityViewName}} '? ",
- "delete-entity-view-text": "Dikkatli olun, onaylandıktan sonra varlık görünümü ve ilgili tüm veriler kurtarılamayacak.",
- "delete-entity-views-title": "{ count, plural, 1 {1 entityView} other {# entityViews}} varlık görünümüne sahip olmak istediğinizden emin misiniz?",
- "delete-entity-views-action-title": "Sil { count, plural, 1 {1 entityView} other {# entityViews}}",
- "delete-entity-views-text": "Dikkatli olun, onaylandıktan sonra tüm seçilen görünümler kaldırılacak ve ilgili tüm veriler kurtarılamayacaktır.",
- "unassign-entity-view-title": "Varlık görünümünün atamasını kaldırmak istediğinizden emin misiniz? {{entityViewName}} '? ",
- "unassign-entity-view-text": "Onaydan sonra varlık görünümü atanmamış olacak ve müşteri tarafından erişilemeyecektir.",
- "unassign-entity-view": "Varlık görünümünün atamasını kaldır",
- "unassign-entity-views-title": "{ count, plural, 1 {1 entityView} other {# entityViews}} hesabının atamasını kaldırmak istediğinizden emin misiniz?",
- "unassign-entity-views-text": "Onaylandıktan sonra, seçilen tüm öğe görünümleri atamadan kaldırılacak ve müşteri tarafından erişilemeyecektir.",
- "entity-view-type": "Varlık Görünümü türü",
- "entity-view-type-required": "Varlık Görünümü türü gerekli.",
- "select-entity-view-type": "Varlık görüntüleme türünü seç",
- "enter-entity-view-type": "Varlık görüntüleme türünü girin",
- "any-entity-view": "Herhangi bir varlık görünümü",
- "no-entity-view-types-matching": "{{entitySubtype}} ile eşleşen hiçbir varlık görüntüleme türü bulunamadı. ",
- "entity-view-type-list-empty": "Hiçbir varlık görünümü türü seçilmemiş.",
- "entity-view-types": "Varlık Görünümü türleri",
- "name": "Ad",
- "name-required": "İsim gerekli.",
- "description": "Açıklama",
- "events": "Etkinlikler",
- "details": "Ayrıntılar",
- "copyId": "Varlık görüntüleme kimliğini kopyala",
- "assignedToCustomer": "Müşteriye atandı",
- "unable-entity-view-device-alias-title": "Varlık görünümü takma adı silinemiyor",
- "unable-entity-view-device-alias-text": "Cihaz takma adı {{entityViewAlias}} ', aşağıdaki widget (lar) tarafından kullanıldığı şekliyle silinemez:
{{widgetsList}} ",
- "select-entity-view": "Varlık görünümünü seç",
- "make-public": "Varlığı herkese görünür yap",
- "start-ts": "Ts",
- "end-ts": "End ts"
- },
- "event": {
- "event-type": "Olay türü",
- "type-error": "Hata",
- "type-lc-event": "Yaşam döngüsü olayı",
- "type-stats": "İstatistikler",
- "type-debug-rule-node": "Hata ayıklama",
- "type-debug-rule-chain": "Hata ayıklama",
- "no-events-prompt": "Hiçbir olay bulunamadı",
- "error": "Hata",
- "alarm": "Alarm",
- "event-time": "Olay zamanı",
- "server": "Sunucu",
- "body": "İçerik //(Body)",
- "method": "Yöntem",
- "type": "Tür",
- "entity": "Varlık",
- "message-id": "Mesaj Kimliği",
- "message-type": "Mesaj tipi",
- "data-type": "Veri tipi",
- "relation-type": "İlişki Türü",
- "metadata": "Meta veri",
- "data": "Veri",
- "event": "Olay",
- "status": "Durum",
- "success": "Başarı",
- "failed": "Başarısız oldu",
- "messages-processed": "Mesajlar işlendi",
- "errors-occurred": "Hatalar oluştu"
- },
- "extension": {
- "extensions": "Uzantılar",
- "selected-extensions": "{ count, plural, 1 {1 uzantı} other {# extensions}} seçildi",
- "type": "Tür",
- "key": "Anahtar",
- "value": "Değer",
- "id": "İD",
- "extension-id": "Uzantı kimliği",
- "extension-type": "Uzatma tipi",
- "transformer-json": "JSON *",
- "unique-id-required": "Mevcut uzantı kimliği zaten mevcut.",
- "delete": "Uzantıyı sil",
- "add": "Uzantı eklemek",
- "edit": "Uzantıyı düzenle",
- "delete-extension-title": "{{ExtensionId}} uzantısını silmek istediğinizden emin misiniz? ",
- "delete-extension-text": "Dikkatli olun, onaylamadan sonra uzantı ve ilgili tüm veriler kurtarılamaz.",
- "delete-extensions-title": "{ count, plural, 1 {1 uzantı} other {# extensions}} silmek istediğinizden emin misiniz?",
- "delete-extensions-text": "Dikkatli olun, onaylandıktan sonra tüm seçilen uzantılar kaldırılacak.",
- "converters": "Dönüştürücü",
- "converter-id": "Dönüştürücü kimliği",
- "configuration": "Yapılandırma",
- "converter-configurations": "Dönüştürücü yapılandırmaları",
- "token": "Güvenlik belirteci",
- "add-converter": "Dönüştürücü ekle",
- "add-config": "Dönüştürücü yapılandırması ekle",
- "device-name-expression": "Cihaz adı ifadesi",
- "device-type-expression": "Cihaz tipi ifadesi",
- "custom": "Özel",
- "to-double": "Çifte",
- "transformer": "Transformer",
- "json-required": "Trafo jsonu gerekli.",
- "json-parse": "Trafo json ayrıştırılamıyor.",
- "attributes": "Öznitellikler",
- "add-attribute": "Özellik ekle",
- "add-map": "Eşleme elemanı ekle",
- "timeseries": "Zaman serisi",
- "add-timeseries": "Zaman çizelgeleri ekle",
- "field-required": "Alan gereklidir",
- "brokers": "Komisyoncular",
- "add-broker": "Broker ekle",
- "host": "Host",
- "port": "Liman",
- "port-range": "Liman 1'den 65535'e kadar olmalıdır.",
- "ssl": "SSL",
- "credentials": "Kimlik bilgileri",
- "username": "Kullanıcı adı",
- "password": "Parola",
- "retry-interval": "Milisaniye cinsinden tekrar deneme aralığı",
- "anonymous": "Anonim",
- "basic": "Temel",
- "pem": "PEM",
- "ca-cert": "CA sertifika dosyası *",
- "private-key": "Özel anahtar dosya *",
- "cert": "Sertifika dosyası *",
- "no-file": "Dosya seçilmedi.",
- "drop-file": "Bir dosya bırakın veya yüklenecek bir dosya seçmek için tıklayın.",
- "mapping": "Mapping",
- "topic-filter": "Konu filtresi",
- "converter-type": "Dönüştürücü tipi",
- "converter-json": "Json",
- "json-name-expression": "Cihaz adı json ifadesi",
- "topic-name-expression": "Cihaz adı konu ifadesi",
- "json-type-expression": "Cihaz tipi json ifadesi",
- "topic-type-expression": "Cihaz tipi konu ifadesi",
- "attribute-key-expression": "Öznitelik anahtar ifadesi",
- "attr-json-key-expression": "Öznitelik anahtar json ifadesi",
- "attr-topic-key-expression": "Öznitelik anahtar konu ifadesi",
- "request-id-expression": "Kimlik ifadesi iste",
- "request-id-json-expression": "Kimlik json ifadesi iste",
- "request-id-topic-expression": "Kimlik konu ifadesini isteyin",
- "response-topic-expression": "Yanıt konusu ifadesi",
- "value-expression": "Değer ifadesi",
- "topic": "Konu",
- "timeout": "Zaman aşımı milisaniye cinsinden",
- "converter-json-required": "Dönüştürücü json gerekli.",
- "converter-json-parse": "Dönüştürücü json ayrıştırılamıyor.",
- "filter-expression": "Filtre ifadesi",
- "connect-requests": "İstekleri bağla",
- "add-connect-request": "Bağlantı talebi ekle",
- "disconnect-requests": "İstekleri kes",
- "add-disconnect-request": "Bağlantıyı kes isteği ekle",
- "attribute-requests": "Özellik istekleri",
- "add-attribute-request": "Özellik isteği ekle",
- "attribute-updates": "Öznitelik güncellemeleri",
- "add-attribute-update": "Özellik güncellemesi ekle",
- "server-side-rpc": "Sunucu tarafı RPC",
- "add-server-side-rpc-request": "Sunucu tarafı RPC isteği ekle",
- "device-name-filter": "Cihaz adı filtresi",
- "attribute-filter": "Özellik filtresi",
- "method-filter": "Yöntem filtresi",
- "request-topic-expression": "Konu ifadesi iste",
- "response-timeout": "Milisaniye cinsinden yanıt zaman aşımı",
- "topic-expression": "Konu ifadesi",
- "client-scope": "Müşteri kapsamı",
- "add-device": "Cihaz ekle",
- "opc-server": "Sunucular",
- "opc-add-server": "Sunucu ekle",
- "opc-add-server-prompt": "Lütfen sunucu ekle",
- "opc-application-name": "Uygulama Adı",
- "opc-application-uri": "Uygulama uri",
- "opc-scan-period-in-seconds": "Saniyeler içinde tarama süresi",
- "opc-security": "Güvenlik",
- "opc-identity": "Kimlik",
- "opc-keystore": "Keystore",
- "opc-type": "Tür",
- "opc-keystore-type": "Tür",
- "opc-keystore-location": "Yer *",
- "opc-keystore-password": "Parola",
- "opc-keystore-alias": "Alias",
- "opc-keystore-key-password": "Anahtar şifre",
- "opc-device-node-pattern": "Cihaz düğümü modeli",
- "opc-device-name-pattern": "Cihaz adı deseni",
- "modbus-server": "Sunucular / köle",
- "modbus-add-server": "Sunucu ekle / köle",
- "modbus-add-server-prompt": "Lütfen sunucu / slave ekle",
- "modbus-transport": "Taşıma",
- "modbus-port-name": "Seri port adı",
- "modbus-encoding": "Kodlama",
- "modbus-parity": "Parite",
- "modbus-baudrate": "Baud hızı",
- "modbus-databits": "Veri bitleri",
- "modbus-stopbits": "Bitleri durdur",
- "modbus-databits-range": "Veri bitleri 7 ila 8 arasında olmalıdır",
- "modbus-stopbits-range": "Durma bitleri 1'den 2'ye kadar olmalıdır.",
- "modbus-unit-id": "Birim Kimliği",
- "modbus-unit-id-range": "Birim numarası 1 ile 247 arasında olmalıdır.",
- "modbus-device-name": "Cihaz adı",
- "modbus-poll-period": "Anket dönemi (ms)",
- "modbus-attributes-poll-period": "Nitelikler yoklama süresi (ms)",
- "modbus-timeseries-poll-period": "Timeseries anket süresi (ms)",
- "modbus-poll-period-range": "Anket dönemi pozitif değer olmalı",
- "modbus-tag": "Etiket",
- "modbus-function": "İşlev",
- "modbus-register-address": "Kayıt adresi",
- "modbus-register-address-range": "Kayıt adresi 0 ile 65535 arasında olmalıdır.",
- "modbus-register-bit-index": "Bit endeksi",
- "modbus-register-bit-index-range": "Bit endeksi 0 ile 15 arasında olmalıdır",
- "modbus-register-count": "Kayıt sayısı",
- "modbus-register-count-range": "Kayıt sayısı pozitif bir değer olmalıdır.",
- "modbus-byte-order": "Bayt sırası",
- "sync": {
- "status": "Durum",
- "sync": "Senkronizasyon",
- "not-sync": "Eşitleme",
- "last-sync-time": "Son senkronizasyon zamanı",
- "not-available": "Müsait değil"
- },
- "export-extensions-configuration": "İhracat uzantıları yapılandırması",
- "import-extensions-configuration": "Uzantılarını içe aktarma yapılandırması",
- "import-extensions": "Uzantıları içe aktar",
- "import-extension": "Uzantı içe aktar",
- "export-extension": "İhracat uzantısı",
- "file": "Uzantılar dosyası",
- "invalid-file-error": "Geçersiz uzantı dosyası"
- },
- "fullscreen": {
- "expand": "Tam ekran yap",
- "exit": "Tam ekrandan çık",
- "toggle": "Tam ekran modu aç/kapat",
- "fullscreen": "Tam ekran"
- },
- "function": {
- "function": "Fonksiyon"
- },
- "grid": {
- "delete-item-title": "Bu öğeyi silmek istediğinizden emin misiniz?",
- "delete-item-text": "UYARI: Onayladıktan sonra bu öğe ve ilişkili tüm verileri geri yüklenemez şekilde silinecektir.",
- "delete-items-title": "{ count, plural, 1 {1 öğeyi} other {# öğeyi} } silmek istediğinizden emin misiniz?",
- "delete-items-action-title": "{ count, plural, 1 {1 öğeyi} other {# öğeyi} } sil",
- "delete-items-text": "UYARI: Onayladıktan sonra tüm seçili öğeler ve ilişkili tüm verileri geri yüklenemez şekilde silinecektir.",
- "add-item-text": "Yeni öğe ekle",
- "no-items-text": "Hiç bir öğe bulunamadı",
- "item-details": "Öğe detayları",
- "delete-item": "Öğeyi sil",
- "delete-items": "Öğeleri sil",
- "scroll-to-top": "Üste kaydır"
- },
- "help": {
- "goto-help-page": "Yardım sayfasına git"
- },
- "home": {
- "home": "Ana sayfa",
- "profile": "Profil",
- "logout": "Çıkış",
- "menu": "Menü",
- "avatar": "Avatar",
- "open-user-menu": "Kullanıcı menüsünü aç"
- },
- "import": {
- "no-file": "Hiçbir dosya seçilmedi",
- "drop-file": "Bir JSON dosyası bırakın veya yüklenecek bir dosyayı seçmek için tıklayın."
- },
- "item": {
- "selected": "Seçildi"
- },
- "js-func": {
- "no-return-error": "Fonksiyon bir değer dönmeli!",
- "return-type-mismatch": "Fonksiyon '{{type}}' türünde bir değer dönmeli!",
- "tidy": "Düzenli"
- },
- "key-val": {
- "key": "Anahtar",
- "value": "Değer",
- "remove-entry": "Girişi kaldır",
- "add-entry": "Giriş ekle",
- "no-data": "Giriş yok"
- },
- "layout": {
- "layout": "Arayüz Düzeni",
- "manage": "Arayüz düzenini yönet",
- "settings": "Arayüz düzeni ayarları",
- "color": "Renk",
- "main": "Ana",
- "right": "Sağ",
- "select": "Hedef düzen seç"
- },
- "legend": {
- "position": "Lejant konumu",
- "show-max": "Maksimum değeri göster",
- "show-min": "Minimum değeri göster",
- "show-avg": "Ortalama değeri göster",
- "show-total": "Toplam değeri göster",
- "settings": "Lejant ayarları",
- "min": "min",
- "max": "maks",
- "avg": "ort.",
- "total": "toplam"
- },
- "login": {
- "login": "Giriş Yap",
- "request-password-reset": "Parola Sıfırlama İsteği Gönder",
- "reset-password": "Parola Sıfırla",
- "create-password": "Parola Oluştur",
- "passwords-mismatch-error": "Girilen parolalar eşleşmeli!",
- "password-again": "Parola tekrarı",
- "sign-in": "Lütfen girişi yapın",
- "username": "Kullanıcı adı (e-posta)",
- "remember-me": "Beni hatırla",
- "forgot-password": "Parolamı unuttum",
- "password-reset": "Parola sıfırla",
- "new-password": "Yeni parola",
- "new-password-again": "Yeni parola tekrarı",
- "password-link-sent-message": "Parola sıfırlama e-postası başarıyla gönderildi!",
- "email": "E-posta",
- "login-with": "{{name}} ile Giriş Yap",
- "or": "ya da"
- },
- "position": {
- "top": "Üst",
- "bottom": "Alt",
- "left": "Sol",
- "right": "Sağ"
- },
- "profile": {
- "profile": "Profil",
- "change-password": "Şifre değiştir",
- "current-password": "Şimdiki şifre"
- },
- "relation": {
- "relations": "İlişkiler",
- "direction": "Yönelim",
- "search-direction": {
- "FROM": "KAYNAK",
- "TO": "HEDEF"
- },
- "direction-type": {
- "FROM": "kaynak",
- "TO": "hedef"
- },
- "from-relations": "Giden ilişkiler",
- "to-relations": "Gelen ilişkiler",
- "selected-relations": "{ count, plural, 1 {1 ilişki} other {# ilişki} } seçildi",
- "type": "Tür",
- "to-entity-type": "Hedef Öğe Türü",
- "to-entity-name": "Hedef Öğe Adı",
- "from-entity-type": "Kaynak Öğe Türü",
- "from-entity-name": "Kaynak Öğe Adı",
- "to-entity": "Hedef Öğe",
- "from-entity": "Kaynak Öğe",
- "delete": "İlişkiyi sil",
- "relation-type": "İlişki türü",
- "relation-type-required": "İlişki türü gerekli.",
- "any-relation-type": "Her hangi bir tür",
- "add": "İlişki ekle",
- "edit": "İlişki düzenle",
- "delete-to-relation-title": "'{{entityName}}' öğesine olan ilişkiyi silmek istediğinize emin misiniz?",
- "delete-to-relation-text": "UYARI: Onaylandıktan sonra '{{entityName}}' öğesinin şimdiki öğeyle olan ilişkisi sona erecektir.",
- "delete-to-relations-title": "{ count, plural, 1 {1 ilişkiyi} other {# ilişkiyi} } silmek istediğinize emin misiniz?",
- "delete-to-relations-text": "UYARI: Onaylandıktan sonra tüm seçili ilişkiler kaldırılacaktır ve ilgili öğelerin şimdiki öğeyle ilişkisi sona erecektir.",
- "delete-from-relation-title": "'{{entityName}}' öğesinden ilişkiyi silmek istediğinize emin misiniz?",
- "delete-from-relation-text": "UYARI: Onaylandıktan sonra şimdiki öğenin '{{entityName}}' öğesiyle ilişkisi sonlandırılacaktır.",
- "delete-from-relations-title": "{ count, plural, 1 {1 ilişkiyi} other {# ilişkiyi} } silmek istediğinize emin misiniz?",
- "delete-from-relations-text": "UYARI: Onaylandıktan sonra tüm seçili ilişkiler kaldırılacak ve şimdiki öğenin ilgili tüm öğelerle ilişkisi sona erecektir.",
- "remove-relation-filter": "İlişki filtresini kaldır",
- "add-relation-filter": "İlişkisi ekle",
- "any-relation": "Herhangi bir ilişki",
- "relation-filters": "İlişki filtreleri",
- "additional-info": "Ek bilgi (JSON)",
- "invalid-additional-info": "Ek bilgi JSON'ı parse edilip işlenemedi."
- },
- "rulechain": {
- "rulechain": "Kural",
- "rulechains": "Kurallar",
- "root": "Kök",
- "delete": "Kuralı sil",
- "name": "İsim",
- "name-required": "İsim gerekli.",
- "description": "Açıklama",
- "add": "Kural Ekle",
- "set-root": "Kural zincirinin kökü yap",
- "set-root-rulechain-title": "Kural zincirini {{ruleChainName}} root? Yapmak istediğinizden emin misiniz?",
- "set-root-rulechain-text": "Onaydan sonra kural zinciri kökleşecek ve gelen tüm iletilerle ilgilenecek.",
- "delete-rulechain-title": "'{{ruleName}}' isimli kuralı silmek istediğinize emin misiniz?",
- "delete-rulechain-text": "UYARI: Onaylandıktan sonra kural ve ilişkili tüm veriler geri yüklenemez şekilde silinecektir.",
- "delete-rulechains-title": "{ count, plural, 1 {1 kuralı} other {# kuralı} } sikmek istediğinize emin misiniz?",
- "delete-rulechains-action-title": "{ count, plural, 1 {1 kuralı} other {# kuralı} } sil",
- "delete-rulechains-text": "UYARI: Onaylandıktan sonra seçili tüm kurallar ve ilişkili tüm veriler geri yüklenemez şekilde silinecektir.",
- "add-rulechain-text": "Yeni kural ekle",
- "no-rulechains-text": "Hiçbir kural bulunamadı",
- "rulechain-details": "Kural detayları",
- "details": "Detaylar",
- "events": "Olaylar",
- "system": "Sistem",
- "import": "Kuralı içe aktar",
- "export": "Kuralı dışa aktar",
- "export-failed-error": "Kural dışa aktarılamadı: {{error}}",
- "create-new-rule": "Yeni kural oluştur",
- "rulechain-file": "Kural dosyası",
- "invalid-rulechain-file-error": "Kural içe aktarılamadı: Geçersiz kural veri yapısı.",
- "copyId": "Kural kimliğini kopyala",
- "idCopiedMessage": "Kural kimliği panoya kopyalandı",
- "select-rulechain": "Kural seç",
- "no-rulechains-matching": "'{{entity}}' ile eşleşen kural bulunamadı.",
- "rulechain-required": "Kural gerekli",
- "management": "Kural yönetimi",
- "debug-mode": "Hata ayıklama modu"
- },
- "rulenode": {
- "details": "Ayrıntılar",
- "events": "Etkinlikler",
- "search": "Arama düğümleri",
- "open-node-library": "Düğüm kütüphanesini aç",
- "add": "Kural düğümü ekle",
- "name": "Ad",
- "name-required": "İsim gerekli.",
- "type": "Tür",
- "description": "Açıklama",
- "delete": "Kural düğümünü sil",
- "select-all-objects": "Tüm düğümleri ve bağlantıları seç",
- "deselect-all-objects": "Tüm düğümlerin ve bağlantıların seçimini kaldırın",
- "delete-selected-objects": "Seçilen düğümleri ve bağlantıları sil",
- "delete-selected": "Silme seçildi",
- "select-all": "Hepsini seç",
- "copy-selected": "Seçilenleri kopyala",
- "deselect-all": "Hiçbirini seçme",
- "rulenode-details": "Kural düğümü ayrıntıları",
- "debug-mode": "Hata ayıklama modu",
- "configuration": "Yapılandırma",
- "link": "Bağlantı",
- "link-details": "Kural düğüm bağlantı detayları",
- "add-link": "Link ekle",
- "link-label": "Bağlantı etiketi",
- "link-label-required": "Bağlantı etiketi gerekli.",
- "custom-link-label": "Özel bağlantı etiketi",
- "custom-link-label-required": "Özel bağlantı etiketi gerekli.",
- "link-labels": "Link etiketleri",
- "link-labels-required": "Link etiketleri gerekli.",
- "no-link-labels-found": "Bağlantı etiketi bulunamadı",
- "no-link-label-matching": "{{label}} bulunamadı. ",
- "create-new-link-label": "Yeni bir tane oluştur!",
- "type-filter": "Filtre",
- "type-filter-details": "Gelen iletileri yapılandırılmış koşullara göre filtrele",
- "type-enrichment": "Zenginleştirme",
- "type-enrichment-details": "Mesaj Meta Verilerine ek bilgi",
- "type-transformation": "Dönüşüm",
- "type-transformation-details": "Mesaj yükünü ve Meta Verileri Değiştir",
- "type-action": "Aksiyon",
- "type-action-details": "Özel eylem gerçekleştir",
- "type-external": "Dış",
- "type-external-details": "Dış sistemle etkileşir",
- "type-rule-chain": "Kural Zinciri",
- "type-rule-chain-details": "Belirtilen Kural Zincirine gelen mesajları ilet",
- "type-input": "Giriş",
- "type-input-details": "Kural Zinciri'nin mantıksal girdisi, bir sonraki ilgili Kural Düğümüne gelen iletileri iletme",
- "type-unknown": "Bilinmeyen",
- "type-unknown-details": "Çözümlenmemiş Kural Düğümü",
- "directive-is-not-loaded": "Tanımlanmış yapılandırma yönergesi {{directiveName}} 'mevcut değil. ",
- "ui-resources-load-error": "Yapılandırma kullanıcı arayüzü kaynakları yüklenemedi.",
- "invalid-target-rulechain": "Hedef kural zinciri çözülemiyor!",
- "test-script-function": "Test komut dosyası işlevi",
- "message": "Mesaj",
- "message-type": "Mesaj tipi",
- "select-message-type": "Mesaj tipini seç",
- "message-type-required": "Mesaj türü gerekli",
- "metadata": "Meta veri",
- "metadata-required": "Meta veri girişleri boş bırakılamaz.",
- "output": "Çıktı",
- "test": "Ölçek",
- "help": "Yardım et"
- },
- "tenant": {
- "tenant": "Tenant",
- "tenants": "Tenantlar",
- "management": "Tenant yönetimi",
- "add": "Tenant Ekle",
- "admins": "Adminler",
- "manage-tenant-admins": "Tenant Adminlerini Yönet",
- "delete": "Tenant sil",
- "add-tenant-text": "Yeni tenant ekle",
- "no-tenants-text": "Hiçbir tenant bulunamadı",
- "tenant-details": "Tenant detayları",
- "delete-tenant-title": "'{{tenantTitle}}' isimli tenantı silmek istediğinize emin misiniz?",
- "delete-tenant-text": "UYARI: Onaylandıktan sonra tenant ve ilişkili tüm veriler geri yüklenemez şekilde silinecektir.",
- "delete-tenants-title": "{ count, plural, 1 {1 tenantı} other {# tenantı} } silmek istediğinize emin misiniz?",
- "delete-tenants-action-title": "{ count, plural, 1 {1 tenantı} other {# tenantı} } sil",
- "delete-tenants-text": "UYARI: Onaylandıktan sonra seçili tüm tenantlar ve ilişkili tüm veriler geri yüklenemez şekilde silinecektir",
- "title": "Başlık",
- "title-required": "Başlık gerekli.",
- "description": "Açıklama",
- "details": "Detaylar",
- "events": "Olaylar",
- "copyId": "Tenant kimliğini kopyala",
- "idCopiedMessage": "Tenant kimliği panoya kopyalandı",
- "select-tenant": "Tenant seç",
- "no-tenants-matching": "'{{entity}}' ile eşleşen tenant bulunamadı.",
- "tenant-required": "Tenant gerekli"
- },
- "timeinterval": {
- "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",
- "seconds": "Saniye",
- "advanced": "İleri düzey"
- },
- "timewindow": {
- "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",
- "period": "{{ startTime }}'dan {{ endTime }}'a kadar",
- "edit": "Zaman aralığını düzenle",
- "date-range": "Tarih aralığı",
- "last": "Son",
- "time-period": "Zaman periyodu"
- },
- "user": {
- "user": "Kullanıcı",
- "users": "Kullanıcılar",
- "customer-users": "Kullanıcılar",
- "tenant-admins": "Tenant Adminleri",
- "sys-admin": "Sistem yöneticisi",
- "tenant-admin": "Tenant yöneticisi",
- "customer": "Kullanıcı Grubu",
- "anonymous": "Anonim",
- "add": "Kullanıcı ekle",
- "delete": "Kullanıcı sil",
- "add-user-text": "Yeni kullanıcı ekle",
- "no-users-text": "Hiçbir kullanıcı bulunamadı",
- "user-details": "Kullanıcı detayları",
- "delete-user-title": "'{{userEmail}}' kullanıcısını silmek istediğinize emin misiniz?",
- "delete-user-text": "UYARI: Onaylandıktan sonra kullanıcı ve ilişkili tüm verileri geri yüklenemez şekilde silinecektir.",
- "delete-users-title": "{ count, plural, 1 {1 kullanıcıyı} other {# kullanıcıyı} } sikmek istediğinize emin misiniz?",
- "delete-users-action-title": "{ count, plural, 1 {1 kullancıyı} other {# kullanıcıyı} } sil",
- "delete-users-text": "UYARI: Onaylandıktan sonra kullanıcı ve ilişkili tüm verileri geri yüklenemez şekilde silinecektir.",
- "activation-email-sent-message": "Etkinleştirme e-postası başarılı bir şekilde gönderildi!",
- "resend-activation": "Etkinleştirme e-postasını yeniden gönder",
- "email": "E-posta",
- "email-required": "E-posta gerekli.",
- "invalid-email-format": "Geçersiz e-posta formatı.",
- "first-name": "Ad",
- "last-name": "Soyad",
- "description": "Açıklama",
- "default-dashboard": "Varsayılan kontrol paneli",
- "always-fullscreen": "Her zaman tam ekran",
- "select-user": "Kullanıcı se.",
- "no-users-matching": "'{{entity}}' ile eşleşen kullanıcı bulunamadı.",
- "user-required": "Kullanıcı gerekli",
- "activation-method": "Etkinleştirme yöntemi",
- "display-activation-link": "Etkinleştirme bağlantısını görüntüle",
- "send-activation-mail": "Etkinleştirme e-postası gönder",
- "activation-link": "Kullanıcı hesabını etkinleştirme bağlantısı",
- "activation-link-text": "Kullanıcı hesabını etkinleştirmek için bağlantıyı kullanın:",
- "copy-activation-link": "Etkinleştirme bağlantısını kopyala",
- "activation-link-copied-message": "Kullanıcı hesabı etkinleştirme bağlantısı panoya kopyalandı",
- "details": "Ayrıntılar",
- "login-as-tenant-admin": "Tenant Yönetici Girişi",
- "login-as-customer-user": "Kullanıcı olarak giriş yap"
- },
- "value": {
- "type": "Değer tğrğ",
- "string": "String",
- "string-value": "String değeri",
- "integer": "Integer",
- "integer-value": "Integer değeri",
- "invalid-integer-value": "Geçersiz integer değeri",
- "double": "Double",
- "double-value": "Double değeri",
- "boolean": "Boolean",
- "boolean-value": "Boolean değeri",
- "false": "Yanlış",
- "true": "Doğru",
- "long": "Uzun"
- },
- "widget": {
- "widget-library": "Gösterge Kütüphanesi",
- "widget-bundle": "Gösterge Demeti",
- "select-widgets-bundle": "Gösterge demeti seç",
- "management": "Gösterge yönetimi",
- "editor": "Gösterge düzenleyici",
- "widget-type-not-found": "Gösterge yapılandırması yüklenemedi.
Muhtemelen ilgili\n gösterge türü kaldırılmış.",
- "widget-type-load-error": "Gösterge şu sebeplerden dolayı yüklenemedi:",
- "remove": "Göstergeyi kaldır",
- "edit": "Göstergeyi düzenle",
- "remove-widget-title": "'{{widgetTitle}}' isimli göstermeyi kaldırmak istediğinizden emin misiniz?",
- "remove-widget-text": "UYARI: Onaylandıktan sonra gösterge ve tüm ilişkili verileri geri yüklenemez şekilde silinecek.",
- "timeseries": "Zaman serisi",
- "search-data": "Arama verileri",
- "no-data-found": "Veri bulunamadı",
- "latest-values": "Son değerler",
- "rpc": "Kontrol göstergesi",
- "alarm": "Alarm göstergesi",
- "static": "Statik gösterge",
- "select-widget-type": "Gösterge türü seç",
- "missing-widget-title-error": "Gösterge başlığı belirtilmelidir!",
- "widget-saved": "Gösterge kaydedildi",
- "unable-to-save-widget-error": "Gösterge kaydedilemedi! Göstergede hatalar mevcut!",
- "save": "Göstergeyi kaydet",
- "saveAs": "Göstergeyi farklı kaydet",
- "save-widget-type-as": "Gösterge türünü farklı kaydet",
- "save-widget-type-as-text": "Lütfen gösterge başlığı girin veya hedef gösterge demeti seçin",
- "toggle-fullscreen": "Tam ekran aç/kapat",
- "run": "Göstergeyi çalıştır",
- "title": "Gösterge başlığı",
- "title-required": "Gösterge başlığı gerekli.",
- "type": "Gösterge türü",
- "resources": "Kaynaklar",
- "resource-url": "JavaScript / CSS URL",
- "remove-resource": "Kaynağı kaldır",
- "add-resource": "Kaynak ekle",
- "html": "HTML",
- "tidy": "Tertiple",
- "css": "CSS",
- "settings-schema": "Ayarlar şeması",
- "datakey-settings-schema": "Veri anahtarı ayarları şeması",
- "javascript": "Javascript",
- "remove-widget-type-title": "'{{widgetName}}' isimli gösterge türünü kaldırmak istediğinizden emin misiniz?",
- "remove-widget-type-text": "UYARI: Onaylandıktan sonra, gösterge türü ve ilgili tüm veriler geri yüklenemez şekilde silinecektir.",
- "remove-widget-type": "Gösterge türünü kaldır",
- "add-widget-type": "Yeni gösterge türü ekle",
- "widget-type-load-failed-error": "Gösterge türü yüklenemedi!",
- "widget-template-load-failed-error": "Gösterge şablonu yüklenemedi!",
- "add": "Gösterge ekle",
- "undo": "Gösterge değişikliklerini geri al",
- "export": "Göstergeyi dışa aktar"
- },
- "widget-action": {
- "header-button": "Gösterge başlık butonu",
- "open-dashboard-state": "Yeni kontrol paneli durumunua git",
- "update-dashboard-state": "Kontrol paneli durumunu güncelle",
- "open-dashboard": "Diğer kontrol paneline git",
- "custom": "Özel eylem",
- "target-dashboard-state": "Hedef kontrol paneli durumu",
- "target-dashboard-state-required": "Hedef kontrol paneli durumu gerekli",
- "set-entity-from-widget": "Göstergeden öğe belirle",
- "target-dashboard": "Hedef kontrol paneli",
- "open-right-layout": "Sağdaki kontrol paneli arayüz düzenini aç(mobil görünüm)"
- },
- "widgets-bundle": {
- "current": "Şimdiki demet",
- "widgets-bundles": "Gösterge Demetleri",
- "add": "Gösterge Demeti Ekle",
- "delete": "Gösterge demeti sil",
- "title": "Başlık",
- "title-required": "Başlık gerekli.",
- "add-widgets-bundle-text": "Yeni gösterge demeti ekle",
- "no-widgets-bundles-text": "Hiçbir gösterge demeti bulunamadı",
- "empty": "Gösterge demeti boş",
- "details": "Detaylar",
- "widgets-bundle-details": "Gösterge demeti detayları",
- "delete-widgets-bundle-title": "'{{widgetsBundleTitle}}' isimli gösterge demetini silmek istediğinize emin misiniz?",
- "delete-widgets-bundle-text": "UYARI: Onaylandıktan sonra gösterge demeti ve ilişkili tüm veriler geri yüklenemez şekilde silinecektir.",
- "delete-widgets-bundles-title": "{ count, plural, 1 {1 gösterge demetini} other {# gösterge demetini} } silmek istediğinize emin misiniz?",
- "delete-widgets-bundles-action-title": "{ count, plural, 1 {1 gösterge demetini} other {# gösterge demetini} } sil",
- "delete-widgets-bundles-text": "UYARI: Onaylandıktan sonra seçili tüm gösterge demetleri ve ilişkili tüm veriler geri yüklenemez şekilde silinecektir.",
- "no-widgets-bundles-matching": "'{{widgetsBundle}}' ile eşleşen gösterge demeti bulunamadı.",
- "widgets-bundle-required": "Gösterge demeti gerekli.",
- "system": "Sistem",
- "import": "Gösterge demetini içe aktar",
- "export": "Gösterge demetini dışa aktar",
- "export-failed-error": "Gösterge demetini dışa aktaramadı: {{error}}",
- "create-new-widgets-bundle": "Yeni gösterge demeti oluştur",
- "widgets-bundle-file": "Gösterge demeti dosyası",
- "invalid-widgets-bundle-file-error": "Gösterge demeti içe aktarılamadı: Geçersiz gösterge demeti veri yapısı."
- },
- "widget-config": {
- "data": "Veri",
- "settings": "Ayarlar",
- "advanced": "İleri düzey",
- "title": "Başlık",
- "general-settings": "Genel ayarlar",
- "display-title": "Başlığı göster",
- "drop-shadow": "Gölge",
- "enable-fullscreen": "Tam ekranı etkinleştir",
- "background-color": "Arka plan rengi",
- "text-color": "Yazı rengi",
- "padding": "İç aralık (Padding)",
- "margin": "Dış aralık (Margin)",
- "widget-style": "Gösterge stili",
- "title-style": "Başlık stili",
- "mobile-mode-settings": "Mobil mod ayarları",
- "order": "Sıra",
- "height": "Yükseklik",
- "units": "Değerin yanında göstermek için özel simge",
- "decimals": "Noktadan sonraki basamak sayısı",
- "timewindow": "Zaman aralığı",
- "use-dashboard-timewindow": "Kontrol paneli zaman aralığı kullan",
- "display-legend": "Lejant göster",
- "datasources": "Veri kaynakları",
- "maximum-datasources": "En fazla { count, plural, 1 {1 veri kaynağı kullanılabilir.} other {# veri kaynağı kullanılabilir} }",
- "datasource-type": "Tür",
- "datasource-parameters": "Parametreler",
- "remove-datasource": "Veri kaynağını kaldır",
- "add-datasource": "Veri kaynağı ekle",
- "target-device": "Hedef aygıt",
- "alarm-source": "Alarm kaynağı",
- "actions": "Eylemler",
- "action": "Eylem",
- "add-action": "Eylem ekle",
- "search-actions": "Eylem ara",
- "action-source": "Eylem kaynağı",
- "action-source-required": "Eylem kaynağı gerekli.",
- "action-name": "İsim",
- "action-name-required": "Eylem ismi gerekli.",
- "action-name-not-unique": "Aynı ada sahip başka bir işlem zaten var.
Eylem adı, aynı eylem kaynağı içinde emsalsiz olmalıdır.",
- "action-icon": "İkon",
- "action-type": "Tür",
- "action-type-required": "Eylem türü gerekli.",
- "edit-action": "Eylemi düzenle",
- "delete-action": "Eylemi sil",
- "delete-action-title": "Gösterge eylemini sil",
- "delete-action-text": "'{{actionName}}' isimli gösterge eylemini silmek istediğinizden emin misiniz?"
- },
- "widget-type": {
- "import": "Gösterge türünü içer aktar",
- "export": "Gösterge türünü dışa aktar",
- "export-failed-error": "Gösterge türü dışa aktarılamadı: {{error}}",
- "create-new-widget-type": "Yeni gösterge türü oluştur",
- "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ç",
- "material-icons": "Material konları",
- "show-all": "Tüm ikonları göster"
- },
- "custom": {
- "widget-action": {
- "action-cell-button": "Eylem hücre butonu",
- "row-click": "Satır tıklama eylemi",
- "polygon-click": "Satır tıklama eylemi",
- "marker-click": "Çokgen tıklama eylemi",
- "tooltip-tag-action": "İpucu etiket eylemi"
- }
- },
- "language": {
- "language": "Dil"
- }
-}
diff --git a/ui/src/app/locale/locale.constant-uk_UA.json b/ui/src/app/locale/locale.constant-uk_UA.json
deleted file mode 100644
index 79c2ece00f..0000000000
--- a/ui/src/app/locale/locale.constant-uk_UA.json
+++ /dev/null
@@ -1,2408 +0,0 @@
-{
- "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}}",
- "continue": "Продовжити",
- "discard-changes": "Скасувати зміни",
- "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",
- "tls-version" : "Версія 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": "Вміст повідомлення",
- "security-settings": "Налаштування безпеки",
- "password-policy": "Політика щодо паролів",
- "minimum-password-length": "Мінімальна довжина пароля",
- "minimum-password-length-required": "Потрібна мінімальна довжина пароля",
- "minimum-password-length-range": "Мінімальна довжина пароля повинна бути в межах від 5 до 50",
- "minimum-uppercase-letters": "Мінімальна кількість великих літер",
- "minimum-uppercase-letters-range": "Мінімальна кількість великих літер не може бути негативною",
- "minimum-lowercase-letters": "Мінімальна кількість малих літер",
- "minimum-lowercase-letters-range": "Мінімальна кількість малих літер не може бути негативною",
- "minimum-digits": "Мінімальна кількість цифр",
- "minimum-digits-range": "Мінімальна кількість цифр не може бути негативною",
- "minimum-special-characters": "Мінімальна кількість спеціальних символів",
- "minimum-special-characters-range": "Мінімальна кількість спеціальних символів не може бути негативною",
- "password-expiration-period-days": "Термін дії пароля в днях",
- "password-expiration-period-days-range": "Термін дії пароля в днях не може бути негативним",
- "password-reuse-frequency-days": "Частота повторного використання пароля в днях",
- "password-reuse-frequency-days-range": "Частота повторного використання пароля в днях не може бути негативною",
- "general-policy": "Загальна політика",
- "max-failed-login-attempts": "Максимальна кількість невдалих спроб входу, перш ніж обліковий запис заблоковано",
- "minimum-max-failed-login-attempts-range": "Максимальна кількість невдалих спроб входу не може бути негативною",
- "user-lockout-notification-email": "У разі блокування облікового запису користувача, надішліть сповіщення на електронну пошту"
- },
- "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": "Фільтр статусу сигналу тривоги",
- "max-count-load": "Максимальна кількість сигналів тривоги для завантаження (0 - необмежено)",
- "max-count-load-required": "Необхідно задати максимальну кількість сигналів тривоги для завантаження.",
- "max-count-load-error-min": "Мінімальне значення 0.",
- "fetch-size": "Розмір пакету для завантаження",
- "fetch-size-required": "Необхідно задати розмір пакету для завантаження.",
- "fetch-size-error-min": "Мінімальне значення 10."
- },
- "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": "Фільтр обїектів не вказано",
- "root-state-entity": "Використовувати сутінсть стану як кореневу",
- "last-level-relation": "Використовувати лише відношення останнього рівня",
- "group-state-entity": "Використовувати групу сутностей стану як кореневу",
- "root-entity": "Коренева сутність",
- "state-entity-parameter-name": "Параметр сутності стану",
- "default-state-entity": "Сутність стану за замовчуванням",
- "default-state-entity-group": "Група сутностей стану за замовчуванням",
- "default-entity-parameter-name": "За замовчуванням",
- "max-relation-level": "Максимальна глибина відносин",
- "unlimited-level": "Необмежена глибина",
- "state-entity": "Сутність стану панелі пристроїв",
- "entities-of-group-state-entity": "Сутності із групи сутностей стану",
- "all-entities": "Всі сутності",
- "any-relation": "не вказано"
- },
- "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}}'",
- "import": "Імпортувати активи",
- "asset-file": "Файл з активами",
- "label": "Мітка"
- },
- "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-login": "Вхід",
- "type-logout": "Вихід",
- "type-lockout": "Заблокований",
- "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": "Атрибути",
- "entity-field": "Поле сутності",
- "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": "Режим редагування",
- "edit-json": "Редагувати JSON",
- "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": "Виберіть пристрій",
- "import": "Імпортувати пристрої",
- "device-file": "Файл з пристроями",
- "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": "Закрити діалогове вікно"
- },
- "direction": {
- "column": "Колонка",
- "row": "Рядок"
- },
- "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": "Поточний клієнт",
- "type-current-tenant": "Поточний власник",
- "search": "Пошук сутностей",
- "selected-entities": "{ count, plural, 1 {1 сутність} other {# сутності} } вибрано",
- "entity-name": "Ім'я сутності",
- "entity-label": "Мітка сутності",
- "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-field": {
- "created-time": "Час створення",
- "name": "Ім'я",
- "type": "Тип",
- "first-name": "Ім'я",
- "last-name": "Прізвище",
- "email": "Електронна пошта",
- "title": "Назва",
- "country": "Країна",
- "state": "Штат",
- "city": "Місто",
- "address": "Адреса",
- "address2": "Адреса 2",
- "zip": "Zip",
- "phone": "Телефон",
- "label": "Мітка"
- },
- "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": "Зробити представлення сутності публічним",
- "make-private": "Зробити представлення сутності приватним",
- "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": "Налаштуйте ключі даних телеметрії цільової сутності, які будуть доступні представленню сутності. Ці дані доступні лише для читання.",
- "make-public-entity-view-title": "Ви впевнені, що бажаєте зробити представлення сутності '{{entityViewName}}' публічним?",
- "make-public-entity-view-text": "Після підтвердження представлення сутності і всі пов'язані з ним дані стануть публічними і будуть доступні для інших користувачів.",
- "make-private-entity-view-title": "Ви впевнені, що бажаєте зробити представлення сутності '{{entityViewName}}' приватним?",
- "make-private-entity-view-text": "Після підтвердження представлення сутності і всі пов'язані з ним дані стануть приватними і не будуть доступні для інших користувачів."
- },
- "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-tcp-reconnect": "Перепідключатися автоматично",
- "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": "Видалити елемент",
- "delete-items": "Видалити елементи",
- "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 файл, або клацніть, щоб вибрати файл для завантаження.",
- "column-value": "Значення",
- "column-title": "Назва",
- "column-example": "Приклад значень даних",
- "column-key": "Ключ атрибута/телеметрії",
- "csv-delimiter": "Розділювач в CSV файлі",
- "csv-first-line-header": "Перший рядок містить назви колонок",
- "csv-update-data": "Оновити атрибути/телеметрію",
- "import-csv-number-columns-error": "Файл має містити як мінімум дві колонки",
- "import-csv-invalid-format-error": "Невірний формат даних. Рядок: '{{line}}'",
- "column-type": {
- "name": "Назва",
- "type": "Тип",
- "label": "Мітка",
- "column-type": "Тип колонки",
- "client-attribute": "Атрибут клієнта",
- "shared-attribute": "Спільний атрибут",
- "server-attribute": "Атрибут сервера",
- "timeseries": "Телеметрія",
- "entity-field": "Entity field",
- "access-token": "Токен"
- },
- "stepper-text": {
- "select-file": "Виберіть файл",
- "configuration": "Конфігурація імпорту",
- "column-type": "Виберіть тип колонок",
- "creat-entities": "Створення нових сутностей",
- "done": "Завершено"
- },
- "message": {
- "create-entities": "{{count}} нову(их) сутність(ей) успішно створено.",
- "update-entities": "{{count}} сутність(ей) успішно оновлено.",
- "error-entities": "Виникла помилка при створенні {{count}} сутності(ей)."
- }
- },
- "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}}'!"
- },
- "key-val": {
- "key": "Ключ",
- "value": "Значення",
- "remove-entry": "Видалити елемент",
- "add-entry": "Додати елемент",
- "no-data": "Елементи відсутні"
- },
- "layout": {
- "layout": "Макет",
- "manage": "Керування макетами",
- "settings": "Налаштування макета",
- "color": "Колір",
- "main": "Основний",
- "right": "Правий",
- "select": "Вибрати макет"
- },
- "legend": {
- "direction": "Розташування елементів легенди",
- "position": "Розташування легенди",
- "show-max": "Показати максимальне значення",
- "show-min": "Показати мінімальне значення ",
- "show-avg": "Показати середнє значення",
- "show-total": "Показати суму",
- "settings": "Налаштування легенди",
- "min": "мін",
- "max": "макс",
- "avg": "середнє",
- "total": "Сума",
- "comparison-time-ago": {
- "days": "(день тому)",
- "weeks": "(тиждень тому)",
- "months": "(місяць тому)",
- "years": "(рік тому)"
- }
- },
- "login": {
- "login": "Увійти",
- "request-password-reset": "Запит скидання пароля",
- "reset-password": "Скинути пароль",
- "create-password": "Створити пароль",
- "passwords-mismatch-error": "Введені паролі повинні бути однаковими!",
- "password-again": "Введіть пароль ще раз",
- "sign-in": "Будь ласка, увійдіть в систему",
- "username": "Ім'я користувача (ел. пошта)",
- "remember-me": "Запам'ятати мене",
- "forgot-password": "Забули пароль?",
- "password-reset": "Скидання пароля",
- "expired-password-reset-message": "Термін дії Вашого паролю закінчився! Будь ласка, створіть новий пароль.",
- "new-password": "Новий пароль",
- "new-password-again": "Повторіть новий пароль",
- "password-link-sent-message": "Посилання для скидання пароля було успішно надіслано!",
- "email": "Електронна пошта",
- "login-with": "Увійти через {{name}}",
- "or": "або"
- },
- "position": {
- "top": "Угорі",
- "bottom": "Знизу",
- "left": "Ліворуч",
- "right": "Праворуч"
- },
- "profile": {
- "profile": "Профіль",
- "last-login-time": "Час останнього входу",
- "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": "Фільтр",
- "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": "Допомога",
- "reset-debug-mode": "Вимкнути режим налогодження у всіх правилах"
- },
- "queue": {
- "select_name": "Виберіть ім'я для Queue",
- "name": "Iм'я для Queue",
- "name_required": "Поле 'Имя для Queue' обязательно к заполнению!"
-
- },
- "scheduler": {
- "scheduler": "Планувальник",
- "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": "Тип",
- "created_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": "Повторювати по",
- "repeat-every": "Повторювати кожний(у)",
- "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": "Виберіть стан панелі візуалізації",
- "hours": "Години",
- "minutes": "Хвилини",
- "seconds": "Секунди",
- "time-interval-required": "Необхідно вказати часовий інтервал",
- "time-unit-required": "Необхідно вказати одиниці часу"
- },
- "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": "Тип",
- "created_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": "Період часу",
- "hide": "Приховати"
- },
- "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": "Увійти як користувач клієнта",
- "disable-account": "Вимкнути обліковий запис користувача",
- "enable-account": "Увімкнути обліковий запис користувача",
- "enable-account-message": "Обліковий запис користувача успішно увімкнено!",
- "disabled-account-message": "Обліковий запис користувача успішно вимкнено!"
- },
- "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": "Дії користувачів",
- "custom-pretty": "Дії користувачів (з HTML шаблоном)",
- "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-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}}'?",
- "display-icon": "Показувати іконку у назві",
- "icon-color": "Колір іконки",
- "icon-size": "Розмір іконки"
- },
- "widget-type": {
- "import": "Імпортувати тип віджета",
- "export": "Експортувати тип віджета",
- "export-failed-error": "Неможливо експортувати тип віджета: {{error}}",
- "create-new-widget-type": "Створити новий тип віджета",
- "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"
- }
- },
- "input-widgets": {
- "attribute-not-allowed": "Атрибут не може бути вибраний в цьому віджеті",
- "date": "Дата",
- "blocked-location": "Геолокація заблокована у вашому браузері",
- "claim-device": "Підтвердити пристрій",
- "claim-failed": "Не вдалося підтвердити пристрій!",
- "claim-not-found": "Пристрій не знайдено!",
- "claim-successful": "Пристрій успішно підтверджено!",
- "discard-changes": "Скасувати зміни",
- "device-name": "Назва пристрою",
- "device-name-required": "Необхідно вказати назву пристрою",
- "entity-attribute-required": "Значення атрибута обов'язкове",
- "entity-coordinate-required": "Необхідно вказати широту та довготу",
- "entity-timeseries-required": "Значення телеметрії обов'язкове",
- "get-location": "Отримати поточне місцезнаходження",
- "latitude": "Широта",
- "longitude": "Довгота",
- "not-allowed-entity": "Обрана сутність не має спільних атрибутів",
- "no-attribute-selected": "Атрибут не вибрано",
- "no-datakey-selected": "Ні один datakey не обраний",
- "no-entity-selected": "Сутність не вибрано",
- "no-coordinate-specified": "Ключ для широти/довготи не вказаний",
- "no-support-geolocation": "Ваш браузер не підтримує геолокацію",
- "no-image": "Немає зображення",
- "no-support-web-camera": "Нет поддерживаемой веб-камеры",
- "no-timeseries-selected": "Параметр телеметрії не вибрано",
- "secret-key": "Секретний ключ",
- "secret-key-required": "Необхідно вказати секретний ключ",
- "switch-attribute-value": "Змінити значення атрибута",
- "switch-camera": "Змінити камеру",
- "switch-timeseries-value": "Змінити значення телеметрії",
- "take-photo": "Зробити фото",
- "time": "Час",
- "timeseries-not-allowed": "Телеметрія не може бути вибрана в цьому віджеті",
- "update-failed": "Не вдалося оновити",
- "update-successful": "Успішно оновлено",
- "update-attribute": "Оновити атрибут",
- "update-timeseries": "Оновити телеметрію",
- "value": "Значення"
- }
- },
- "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": "Іконки в стилі Material",
- "show-all": "Показати всі іконки"
- },
- "custom": {
- "widget-action": {
- "action-cell-button": "Кнопка дії в комірці таблиці",
- "row-click": "Клацніть на рядок",
- "marker-click": "Клацніть на маркер",
- "polygon-click": "Дія при натисканні на полігон",
- "tooltip-tag-action": "Дія при натисканні на посилання в підказці",
- "node-selected": "Дії при виборі ноди",
- "element-click": "Дії при натисканні на HTML елементі",
- "pie-slice-click": "Дії при натисканні на секції кругової діаграми",
- "row-double-click": "Дії при подвійному натисканні на рядок"
- }
- },
- "language": {
- "language": "Мова"
- }
-}
diff --git a/ui/src/app/locale/locale.constant-zh_CN.json b/ui/src/app/locale/locale.constant-zh_CN.json
deleted file mode 100644
index 811045c8aa..0000000000
--- a/ui/src/app/locale/locale.constant-zh_CN.json
+++ /dev/null
@@ -1,1607 +0,0 @@
-{
- "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": "确定",
- "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}}分享"
- },
- "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": "超时(ms)",
- "timeout-required": "超时必填。",
- "timeout-invalid": "这看起来不像有效的超时值。",
- "enable-tls": "启用TLS",
- "tls-version" : "TLS版本",
- "send-test-mail": "发送测试邮件"
- },
- "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 {# 警告} }?",
- "clear-alarms-title": "清除 { count, plural, 1 {1 警告} other {# 警告} }",
- "clear-alarms-text": "确定要清除 { count, plural, 1 {1 警告} other {# 警告} }?"
- },
- "alias": {
- "add": "添加别名",
- "edit": "编辑别名",
- "name": "别名",
- "name-required": "别名必填",
- "duplicate-alias": "别名已经存在。",
- "filter-type-single-entity": "单个实体",
- "filter-type-entity-list": "实体列表",
- "filter-type-entity-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": "具有 {{relationType}} 关联 {{direction}} {{rootEntity}} 的 {{entities}} ",
- "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": "没有指定实体过滤条件",
- "root-state-entity": "使用仪表板状态实体作为根实体",
- "root-entity": "根实体",
- "state-entity-parameter-name": "状态实体参数名称",
- "default-state-entity": "默认状态实体",
- "default-entity-parameter-name": "默认",
- "max-relation-level": "最大关系层级",
- "unlimited-level": "不限层级",
- "state-entity": "仪表板状态实体",
- "all-entities": "所有实体",
- "any-relation": "不限"
- },
- "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": "资产名称以此开头",
- "label": "标签"
- },
- "attribute": {
- "attributes": "属性",
- "latest-telemetry": "最新遥测",
- "attributes-scope": "设备属性范围",
- "scope-latest-telemetry": "最新遥测",
- "scope-client": "客户端属性",
- "scope-server": "服务端属性",
- "scope-shared": "共享属性",
- "add": "添加属性",
- "key": "键",
- "last-update-time": "最后更新时间",
- "key-required": "属性键必填。",
- "value": "值",
- "value-required": "属性值必填。",
- "delete-attributes-title": "您确定要删除 { count, plural, 1 {1 属性} other {# 属性} }吗?",
- "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 属性} other {# 属性} } 被选中",
- "selected-telemetry": "{ count, plural, 1 {1 遥测} other {# 遥测} } 被选中"
- },
- "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": "读取属性",
- "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": "输入检索条件"
- },
- "content-type": {
- "json": "Json",
- "text": "Text",
- "binary": "Binary (Base64)"
- },
- "customer": {
- "customer": "客户",
- "customers": "客户",
- "management": "客户管理",
- "dashboard": "客户仪表板",
- "dashboards": "客户仪表板",
- "devices": "客户设备",
- "entity-views": "客户实体视图",
- "assets": "客户资产",
- "public-dashboards": "公共仪表板",
- "public-devices": "公共设备",
- "public-assets": "公共资产",
- "public-entity-views": "公共实体视图",
- "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 客户} other {# 客户} }吗?",
- "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": "客户是必选项",
- "select-default-customer": "选择默认的客户",
- "default-customer": "默认客户",
- "default-customer-required": "为了调试租户级别上的仪表板,需要默认客户。"
- },
- "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": "您确定要删除仪表板 '{{dashboardTitle}}'吗?",
- "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": "您确定要取消分配仪表板 '{{dashboardTitle}}'吗?",
- "unassign-dashboard-text": "确认后,面板将被取消分配,客户将无法访问。",
- "unassign-dashboard": "取消分配仪表板",
- "unassign-dashboards-title": "您确定要取消分配仪表板 { count, plural, 1 {1 仪表板} other {# 仪表板} } 吗?",
- "unassign-dashboards-text": "确认后,所有选定的仪表板将被取消分配,客户将无法访问。",
- "public-dashboard-title": "仪表板现已公布",
- "public-dashboard-text": "你的仪表板 {{dashboardTitle}} 已被公开,可通过如下 链接访问:",
- "public-dashboard-notice": "提示: 不要忘记将相关设备公开以访问其数据。",
- "make-private-dashboard-title": "您确定要将仪表板 '{{dashboardTitle}}' 设为私有吗?",
- "make-private-dashboard-text": "确认后,仪表板将被设为私有,不能被其他人访问。",
- "make-private-dashboard": "仪表板设为私有",
- "socialshare-text": "'{{dashboardTitle}}' 由Thingsboard提供支持",
- "socialshare-title": "'{{dashboardTitle}}' 由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": "移动端行高距至少5px。",
- "max-mobile-row-height-message": "移动端行高距最多200px。",
- "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}}",
- "create-new-dashboard": "创建新的仪表板",
- "dashboard-file": "仪表板文件",
- "invalid-dashboard-file-error": "无法导入仪表板: 仪表板数据结构无效。",
- "dashboard-import-missing-aliases-title": "配置导入仪表板使用的别名",
- "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": "分配给客户",
- "public": "公共",
- "public-link": "公共链接",
- "copy-public-link": "复制公共链接",
- "public-link-copied-message": "仪表板的公共链接已被复制到剪贴板",
- "manage-states": "仪表板状态管理",
- "states": "仪表板状态",
- "search-states": "仪表板状态检索",
- "selected-states": "{ count, plural, 1 {1 仪表板状态} other {# 仪表板状态} } 选中",
- "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": "至少需要 { count, plural, 1 {1 函数类型} other {# 函数类型} }"
- },
- "datasource": {
- "type": "数据源类型",
- "name": "数据源名称",
- "add-datasource-prompt": "请添加数据源"
- },
- "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": "选择设备"
- },
- "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}}' 被以下部件使用不能删除:
{{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-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-current-customer": "当前客户",
- "search": "实体检索",
- "selected-entities": "{ count, plural, 1 {1 实体} other {# 实体} } 被选中",
- "entity-name": "实体名",
- "details": "实体详情",
- "no-entities-prompt": "没有找到实体",
- "no-data": "无数据"
- },
- "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-devices-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": "B小心,确认后,所有选定的实体视图将被删除,所有相关的数据将变得不可恢复。",
- "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": "实体视图设为公开",
- "make-private": "实体视图设为私有",
- "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": "配置目标实体的时间序列数据键,以便实体视图可以访问这些键。这个时间序列数据是只读的。",
- "make-public-entity-view-title": "你确定你想创建公开 '{{entityViewName}}' 实体视图?",
- "make-public-entity-view-text": "确认后,实体视图 及其所有数据将被公开并被他人访问。",
- "make-private-entity-view-title": "你确定你想创建私有 '{{entityViewName}}' 实体视图?",
- "make-private-entity-view-text": "确认后,实体视图及其所有数据将被私有化,无法被他人访问。"
- },
- "event": {
- "event-type": "事件类型",
- "type-error": "错误",
- "type-lc-event": "生命周期事件",
- "type-stats": "类型统计",
- "type-debug-rule-node": "调试",
- "type-debug-rule-chain": "调试",
- "no-events-prompt": "找不到事件",
- "error": "错误",
- "alarm": "报警",
- "event-time": "事件时间",
- "server": "服务器",
- "body": "整体",
- "method": "方法",
- "type": "类型",
- "entity": "实体",
- "message-id": "消息ID",
- "message-type": "消息类型",
- "data-type": "数据类型",
- "relation-type": "关系类型",
- "metadata": "元数据",
- "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": "转换器序号",
- "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": "必填字段",
- "brokers": "代理服务器组",
- "add-broker": "添加代理服务器",
- "host": "主机",
- "port": "端口",
- "port-range": "端口应该在1到65535的范围内。",
- "ssl": "Ssl",
- "credentials": "证书",
- "username": "用户名",
- "password": "密码",
- "retry-interval": "以毫秒为单位的重试间隔",
- "anonymous": "匿名",
- "basic": "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": "请求ID JSON表达式",
- "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-device-name-pattern": "设备名称模式",
- "modbus-server": "Servers/slaves",
- "modbus-add-server": "添加 server/slave",
- "modbus-add-server-prompt": "请添加 server/slave",
- "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": "单位编号",
- "modbus-unit-id-range": "单位ID应该在1到247的范围内",
- "modbus-device-name": "设备名称",
- "modbus-poll-period": "轮询周期 (ms)",
- "modbus-attributes-poll-period": "轮询属性周期 (ms)",
- "modbus-timeseries-poll-period": "时间序列轮询周期 (ms)",
- "modbus-poll-period-range": "轮询周期应为正值。",
- "modbus-tag": "标签",
- "modbus-function": "函数",
- "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": "寄存器计数应该是一个正值。",
- "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": "删除项目",
- "delete-items": "删除项目",
- "scroll-to-top": "滚动到顶部"
- },
- "help": {
- "goto-help-page": "转到帮助页面"
- },
- "home": {
- "home": "首页",
- "profile": "属性",
- "logout": "注销",
- "menu": "菜单",
- "avatar": "头像",
- "open-user-menu": "打开用户菜单"
- },
- "import": {
- "no-file": "没有选择文件",
- "drop-file": "拖动一个JSON文件或者单击以选择要上传的文件。"
- },
- "item": {
- "selected": "选择"
- },
- "js-func": {
- "no-return-error": "函数必须返回值!",
- "return-type-mismatch": "函数必须返回 '{{type}}' 类型的值!",
- "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": "删除规则",
- "activate": "激活规则",
- "suspend": "暂停规则",
- "active": "激活",
- "suspended": "暂停",
- "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 规则链}其他{# 规则链库}}吗?",
- "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": "自定义链接标签必填",
- "type-filter": "滤波器",
- "type-filter-details": "使用配置条件过滤传入消息",
- "type-enrichment": "属性集",
- "type-enrichment-details": "向消息元数据中添加附加信息",
- "type-transformation": "变换",
- "type-transformation-details": "更改消息有效载荷和元数据",
- "type-action": "动作",
- "type-action-details": "执行特别动作",
- "type-external": "外部的",
- "type-external-details": "与外部系统交互",
- "type-rule-chain": "规则链",
- "type-rule-chain-details": "将传入消息转发到指定的规则链",
- "type-input": "输入",
- "type-input-details": "规则链的逻辑输入,将传入消息转发到下一个相关规则节点",
- "directive-is-not-loaded": "定义的配置指令 '{{directiveName}}' 不可用。",
- "ui-resources-load-error": "加载配置UI资源失败。",
- "invalid-target-rulechain": "无法解析目标规则链!",
- "test-script-function": "测试脚本功能",
- "message": "消息",
- "message-type": "消息类型",
- "message-type-required": "消息类型必填",
- "metadata": "元数据",
- "metadata-required": "元数据项不能为空。",
- "output": "输出",
- "test": "测试",
- "help": "帮助"
- },
- "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": "租户必填"
- },
- "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": "使用该链接 激活 激活用户:",
- "copy-activation-link": "复制用户激活链接",
- "activation-link-copied-message": "用户激活链接已经复制到粘贴板",
- "details": "详细信息"
- },
- "value": {
- "type": "值类型",
- "string": "字符串",
- "string-value": "字符串值",
- "integer": "数字",
- "integer-value": "数字值",
- "invalid-integer-value": "整数值无效",
- "double": "双精度小数",
- "double-value": "双精度小数值",
- "boolean": "布尔",
- "boolean-value": "布尔值",
- "false": "假",
- "true": "真",
- "long": "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": "导出部件"
- },
- "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 {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": "启用全屏",
- "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": "无法导入部件类型:无效的部件类型数据结构。"
- },
- "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": "选择图标",
- "material-icons": "素材图标",
- "show-all": "显示所有图标"
- },
- "custom": {
- "widget-action": {
- "action-cell-button": "动作单元格按钮",
- "row-click": "点击行",
- "marker-click": "点击标记",
- "polygon-click": "单击多边形",
- "tooltip-tag-action": "提示标签动作"
- }
- },
- "language": {
- "language": "语言"
- }
-}
diff --git a/ui/src/app/locale/locale.constant-zh_TW.json b/ui/src/app/locale/locale.constant-zh_TW.json
deleted file mode 100644
index 99693103f8..0000000000
--- a/ui/src/app/locale/locale.constant-zh_TW.json
+++ /dev/null
@@ -1,1607 +0,0 @@
-{
- "access": {
- "unauthorized": "未授權",
- "unauthorized-access": "未授權存取",
- "unauthorized-access-text": "您需要登入才能存取這個資源!",
- "access-forbidden": "禁止存取",
- "access-forbidden-text": "您沒有存取此位置的權限
如果您仍希望存取此位置,請嘗試使用其他用戶登入。",
- "refresh-token-expired": "Session 已過期",
- "refresh-token-failed": "無法更新 Session"
- },
- "action": {
- "activate": "啟動",
- "suspend": "暫停",
- "save": "儲存",
- "saveAs": "另存為",
- "cancel": "取消",
- "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}}分享"
- },
- "aggregation": {
- "aggregation": "聚合",
- "function": "資料聚合功能",
- "limit": "最大值",
- "group-interval": "分組間隔",
- "min": "最少值",
- "max": "最大值",
- "avg": "平均值",
- "sum": "總計",
- "count": "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": "超時(ms)",
- "timeout-required": "超時必填。",
- "timeout-invalid": "這看起來不像有效的超時值。",
- "enable-tls": "啟用TLS",
- "tls-version": "TLS版本",
- "send-test-mail": "發送測試郵件"
- },
- "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 {# 警告} }?",
- "clear-alarms-title": "清除 { count, plural, 1 {1 警告} other {# 警告} }",
- "clear-alarms-text": "確定要清除 { count, plural, 1 {1 警告} other {# 警告} }?"
- },
- "alias": {
- "add": "增加別名",
- "edit": "編輯別名",
- "name": "別名",
- "name-required": "別名必填",
- "duplicate-alias": "別名已經存在。",
- "filter-type-single-entity": "單一實體",
- "filter-type-entity-list": "實體列表",
- "filter-type-entity-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": "具有 {{relationType}} 關聯 {{direction}} {{rootEntity}} 的 {{entities}} ",
- "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": "沒有指定實體過濾條件",
- "root-state-entity": "使用儀表板狀態實體作為根實體",
- "root-entity": "根實體",
- "state-entity-parameter-name": "狀態實體參數名稱",
- "default-state-entity": "預設狀態實體",
- "default-entity-parameter-name": "預設",
- "max-relation-level": "最大關係層級",
- "unlimited-level": "不限層級",
- "state-entity": "儀表板狀態實體",
- "all-entities": "所有實體",
- "any-relation": "不限"
- },
- "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": "資產名稱以此開頭",
- "label": "標籤"
- },
- "attribute": {
- "attributes": "屬性",
- "latest-telemetry": "最新遙測",
- "attributes-scope": "設備屬性範圍",
- "scope-latest-telemetry": "最新遙測",
- "scope-client": "客戶端屬性",
- "scope-server": "服務端屬性",
- "scope-shared": "共享屬性",
- "add": "增加屬性",
- "key": "鍵",
- "last-update-time": "最後更新時間",
- "key-required": "屬性鍵必填。",
- "value": "值",
- "value-required": "屬性值必填。",
- "delete-attributes-title": "您確定要刪除 { count, plural, 1 {1 屬性} other {# 屬性} }嗎?",
- "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 屬性} other {# 屬性} } 被選中",
- "selected-telemetry": "{ count, plural, 1 {1 遙測} other {# 遙測} } 被選中"
- },
- "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": "讀取屬性",
- "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": "輸入檢索條件"
- },
- "content-type": {
- "json": "Json",
- "text": "Text",
- "binary": "Binary (Base64)"
- },
- "customer": {
- "customer": "客戶",
- "customers": "客戶",
- "management": "客戶管理",
- "dashboard": "客戶儀表板",
- "dashboards": "客戶儀表板",
- "devices": "客戶設備",
- "entity-views": "客戶實體視圖",
- "assets": "客戶資產",
- "public-dashboards": "公共儀表板",
- "public-devices": "公共設備",
- "public-assets": "公共資產",
- "public-entity-views": "公共實體視圖",
- "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 客戶} other {# 客戶} }嗎?",
- "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": "客戶是必選項",
- "select-default-customer": "選擇預設的客戶",
- "default-customer": "預設客戶",
- "default-customer-required": "為了測試租戶級別上的儀表板,需要預設客戶。"
- },
- "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": "您確定要刪除儀表板 '{{dashboardTitle}}'嗎?",
- "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": "您確定要取消分配儀表板 '{{dashboardTitle}}'嗎?",
- "unassign-dashboard-text": "確認後,面板將被取消分配,客戶將無法存取。",
- "unassign-dashboard": "取消分配儀表板",
- "unassign-dashboards-title": "您確定要取消分配儀表板 { count, plural, 1 {1 儀表板} other {# 儀表板} } 嗎?",
- "unassign-dashboards-text": "確認後,所有選擇的儀表板將被取消分配,客戶將無法存取。",
- "public-dashboard-title": "儀表板現已公佈",
- "public-dashboard-text": "你的儀表板{{dashboardTitle}} 已被公開,可通過如下連結存取:",
- "public-dashboard-notice": "提示: 不要忘記將相關設備公開以存取其資料。",
- "make-private-dashboard-title": "您確定要將儀表板 '{{dashboardTitle}}' 設為私有嗎?",
- "make-private-dashboard-text": "確認後,儀表板將被設為私有,不能被其他人存取。",
- "make-private-dashboard": "儀表板設為私有",
- "socialshare-text": "'{{dashboardTitle}}' 由Thingsboard提供支持",
- "socialshare-title": "'{{dashboardTitle}}' 由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": "移動端行高距至少5px。",
- "max-mobile-row-height-message": "移動端行高距最多200px。",
- "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}}",
- "create-new-dashboard": "建立新的儀表板",
- "dashboard-file": "儀表板文件",
- "invalid-dashboard-file-error": "無法匯入儀表板: 儀表板資料結構無效。",
- "dashboard-import-missing-aliases-title": "配置匯入儀表板使用的別名",
- "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": "分配給客戶",
- "public": "公共",
- "public-link": "公共連結",
- "copy-public-link": "複製公共連結",
- "public-link-copied-message": "儀表板的公共連結已被複製到剪貼板",
- "manage-states": "儀表板狀態管理",
- "states": "儀表板狀態",
- "search-states": "儀表板狀態檢索",
- "selected-states": "{ count, plural, 1 {1 儀表板狀態} other {# 儀表板狀態} } 選中",
- "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": "至少需要 { count, plural, 1 {1 函數類型} other {# 函數類型} }"
- },
- "datasource": {
- "type": "資料源類型",
- "name": "資料源名稱",
- "add-datasource-prompt": "請增加資料源"
- },
- "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": "選擇設備"
- },
- "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}}' 被以下部件使用不能刪除:
{{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-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-current-customer": "當前客戶",
- "search": "實體檢索",
- "selected-entities": "{ count, plural, 1 {1 實體} other {# 實體} } 被選中",
- "entity-name": "實體名",
- "details": "實體詳細資訊",
- "no-entities-prompt": "沒有找到實體",
- "no-data": "無資料"
- },
- "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-devices-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": "B小心,確認後,所有選擇的實體視圖將被刪除,所有相關的資料將變得無法恢復。",
- "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": "實體視圖設為公開",
- "make-private": "實體視圖設為私有",
- "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": "配置目標實體的時間序列資料鍵,以便實體視圖可以存取這些鍵。這個時間序列資料是只讀的。",
- "make-public-entity-view-title": "你確定你想建立公開 '{{entityViewName}}' 實體視圖?",
- "make-public-entity-view-text": "確認後,實體視圖 及其所有資料將被公開並被他人存取。",
- "make-private-entity-view-title": "你確定你想建立私有 '{{entityViewName}}' 實體視圖?",
- "make-private-entity-view-text": "確認後,實體視圖及其所有資料將被私有化,無法被他人存取。"
- },
- "event": {
- "event-type": "事件類型",
- "type-error": "錯誤",
- "type-lc-event": "生命週期事件",
- "type-stats": "類型統計",
- "type-debug-rule-node": "測試",
- "type-debug-rule-chain": "測試",
- "no-events-prompt": "找不到事件",
- "error": "錯誤",
- "alarm": "報警",
- "event-time": "事件時間",
- "server": "伺服器",
- "body": "整體",
- "method": "方法",
- "type": "類型",
- "entity": "實體",
- "message-id": "消息ID",
- "message-type": "消息類型",
- "data-type": "資料類型",
- "relation-type": "關係類型",
- "metadata": "元資料",
- "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": "轉換器序號",
- "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": "必填字段",
- "brokers": "代理伺服器組",
- "add-broker": "增加代理伺服器",
- "host": "主機",
- "port": "連接埠",
- "port-range": "連接埠應該在1到65535的範圍內。",
- "ssl": "Ssl",
- "credentials": "證書",
- "username": "用戶名",
- "password": "密碼",
- "retry-interval": "以毫秒為單位的重試間隔",
- "anonymous": "匿名",
- "basic": "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": "請求ID JSON表達式",
- "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-device-name-pattern": "設備名稱模式",
- "modbus-server": "Servers/slaves",
- "modbus-add-server": "增加 server/slave",
- "modbus-add-server-prompt": "請增加 server/slave",
- "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": "單位編號",
- "modbus-unit-id-range": "單位ID應該在1到247的範圍內",
- "modbus-device-name": "設備名稱",
- "modbus-poll-period": "輪詢週期 (ms)",
- "modbus-attributes-poll-period": "輪詢屬性週期 (ms)",
- "modbus-timeseries-poll-period": "時間序列輪詢週期 (ms)",
- "modbus-poll-period-range": "輪詢週期應為正值。",
- "modbus-tag": "標籤",
- "modbus-function": "函數",
- "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": "寄存器計數應該是一個正值。",
- "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": "刪除項目",
- "delete-items": "刪除項目",
- "scroll-to-top": "滾動到頂部"
- },
- "help": {
- "goto-help-page": "轉到幫助頁面"
- },
- "home": {
- "home": "首頁",
- "profile": "屬性",
- "logout": "註銷",
- "menu": "菜單",
- "avatar": "頭像",
- "open-user-menu": "打開用戶菜單"
- },
- "import": {
- "no-file": "沒有選擇文件",
- "drop-file": "拖動一個JSON文件或者單擊以選擇要上傳的文件。"
- },
- "item": {
- "selected": "選擇"
- },
- "js-func": {
- "no-return-error": "函數必須返回值!",
- "return-type-mismatch": "函數必須返回 '{{type}}' 類型的值!",
- "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": "刪除規則",
- "activate": "啟動規則",
- "suspend": "暫停規則",
- "active": "啟動",
- "suspended": "暫停",
- "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 規則鏈}其他{# 規則鏈庫}}嗎?",
- "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": "自定義連結標籤必填",
- "type-filter": "濾波器",
- "type-filter-details": "使用配置條件過濾傳入消息",
- "type-enrichment": "屬性集",
- "type-enrichment-details": "向消息元資料中增加附加訊息",
- "type-transformation": "變換",
- "type-transformation-details": "更改消息有效載荷和元資料",
- "type-action": "動作",
- "type-action-details": "執行特別動作",
- "type-external": "外部的",
- "type-external-details": "與外部系統交互",
- "type-rule-chain": "規則鏈",
- "type-rule-chain-details": "將傳入消息轉發到指定的規則鏈",
- "type-input": "輸入",
- "type-input-details": "規則鏈的邏輯輸入,將傳入消息轉發到下一個相關規則節點",
- "directive-is-not-loaded": "定義的配置指令 '{{directiveName}}' 不可用。",
- "ui-resources-load-error": "加載配置UI資源失敗。",
- "invalid-target-rulechain": "無法解析目標規則鏈!",
- "test-script-function": "測試腳本功能",
- "message": "消息",
- "message-type": "消息類型",
- "message-type-required": "消息類型必填",
- "metadata": "元資料",
- "metadata-required": "元資料項不能為空。",
- "output": "輸出",
- "test": "測試",
- "help": "幫助"
- },
- "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": "租戶必填"
- },
- "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": "使用該連結 啟動 啟動用戶:",
- "copy-activation-link": "複製用戶啟動連結",
- "activation-link-copied-message": "用戶啟動連結已經複製到剪貼板",
- "details": "詳細訊息"
- },
- "value": {
- "type": "值類型",
- "string": "字符串",
- "string-value": "字符串值",
- "integer": "數字",
- "integer-value": "數字值",
- "invalid-integer-value": "整數值無效",
- "double": "雙精度浮點數",
- "double-value": "雙精度浮點數值",
- "boolean": "布林",
- "boolean-value": "布林值",
- "false": "假",
- "true": "真",
- "long": "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": "匯出部件"
- },
- "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 {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": "啟用全螢幕",
- "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": "無法匯入部件類型:無效的部件類型資料結構。"
- },
- "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": "選擇圖示",
- "material-icons": "素材圖示",
- "show-all": "顯示所有圖示"
- },
- "custom": {
- "widget-action": {
- "action-cell-button": "動作單元格按鈕",
- "row-click": "點選行",
- "marker-click": "點選標記",
- "polygon-click": "單擊多邊形",
- "tooltip-tag-action": "提示標籤動作"
- }
- },
- "language": {
- "language": "語言"
- }
-}
diff --git a/ui/src/app/locale/translate-handler.js b/ui/src/app/locale/translate-handler.js
deleted file mode 100644
index 5dd5796c76..0000000000
--- a/ui/src/app/locale/translate-handler.js
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
- export default angular.module('thingsboard.locale', [])
- .factory('tbMissingTranslationHandler', ThingsboardMissingTranslateHandler)
- .name;
-
-/*@ngInject*/
-function ThingsboardMissingTranslateHandler(/*$log, types*/) {
-
- 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/login/create-password.controller.js b/ui/src/app/login/create-password.controller.js
deleted file mode 100644
index 0802036a67..0000000000
--- a/ui/src/app/login/create-password.controller.js
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-/*@ngInject*/
-export default function CreatePasswordController($stateParams, $translate, toast, loginService, userService) {
- var vm = this;
-
- vm.password = '';
- vm.password2 = '';
-
- vm.createPassword = createPassword;
-
- function createPassword() {
- if (vm.password !== vm.password2) {
- toast.showError($translate.instant('login.passwords-mismatch-error'));
- } else {
- loginService.activate($stateParams.activateToken, vm.password).then(function success(response) {
- var token = response.data.token;
- var refreshToken = response.data.refreshToken;
- userService.setUserFromJwtToken(token, refreshToken, true);
- }, function fail() {
- });
- }
- }
-}
diff --git a/ui/src/app/login/create-password.tpl.html b/ui/src/app/login/create-password.tpl.html
deleted file mode 100644
index bedba02ce4..0000000000
--- a/ui/src/app/login/create-password.tpl.html
+++ /dev/null
@@ -1,56 +0,0 @@
-
-
-
-
-
- login.create-password
-
-
-
-
-
-
-
-
diff --git a/ui/src/app/login/index.js b/ui/src/app/login/index.js
deleted file mode 100644
index 1ff8d3dc55..0000000000
--- a/ui/src/app/login/index.js
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Copyright © 2016-2020 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 './login.scss';
-
-import uiRouter from 'angular-ui-router';
-import thingsboardApiLogin from '../api/login.service';
-import thingsboardApiUser from '../api/user.service';
-import thingsboardToast from '../services/toast';
-
-import LoginRoutes from './login.routes';
-import LoginController from './login.controller';
-import ResetPasswordRequestController from './reset-password-request.controller';
-import ResetPasswordController from './reset-password.controller';
-import CreatePasswordController from './create-password.controller';
-
-export default angular.module('thingsboard.login', [
- uiRouter,
- thingsboardApiLogin,
- thingsboardApiUser,
- thingsboardToast
-])
- .config(LoginRoutes)
- .controller('LoginController', LoginController)
- .controller('ResetPasswordRequestController', ResetPasswordRequestController)
- .controller('ResetPasswordController', ResetPasswordController)
- .controller('CreatePasswordController', CreatePasswordController)
- .name;
diff --git a/ui/src/app/login/login.controller.js b/ui/src/app/login/login.controller.js
deleted file mode 100644
index 8dcd2a9d8e..0000000000
--- a/ui/src/app/login/login.controller.js
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-/* eslint-disable import/no-unresolved, import/default */
-
-import logoSvg from '../../svg/logo_title_white.svg';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-/*@ngInject*/
-export default function LoginController(toast, loginService, userService, types, $state/*, $rootScope, $log, $translate*/) {
- var vm = this;
-
- vm.logoSvg = logoSvg;
-
- vm.user = {
- name: '',
- password: ''
- };
-
- vm.login = login;
-
- function doLogin() {
- loginService.login(vm.user).then(function success(response) {
- var token = response.data.token;
- var refreshToken = response.data.refreshToken;
- userService.setUserFromJwtToken(token, refreshToken, true);
- }, function fail(response) {
- /*if (response && response.data && response.data.message) {
- toast.showError(response.data.message);
- } else if (response && response.statusText) {
- toast.showError(response.statusText);
- } else {
- toast.showError($translate.instant('error.unknown-error'));
- }*/
- if (response && response.data && response.data.errorCode) {
- if (response.data.errorCode === types.serverErrorCode.credentialsExpired) {
- $state.go('login.resetExpiredPassword', {resetToken: response.data.resetToken});
- }
- }
- });
- }
-
- function login() {
- doLogin();
- }
-}
diff --git a/ui/src/app/login/login.routes.js b/ui/src/app/login/login.routes.js
deleted file mode 100644
index ac9401147b..0000000000
--- a/ui/src/app/login/login.routes.js
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-/* eslint-disable import/no-unresolved, import/default */
-
-import loginTemplate from './login.tpl.html';
-import resetPasswordTemplate from './reset-password.tpl.html';
-import resetPasswordRequestTemplate from './reset-password-request.tpl.html';
-import createPasswordTemplate from './create-password.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-/*@ngInject*/
-export default function LoginRoutes($stateProvider) {
- $stateProvider.state('login', {
- url: '/login',
- module: 'public',
- views: {
- "@": {
- controller: 'LoginController',
- controllerAs: 'vm',
- templateUrl: loginTemplate
- }
- },
- data: {
- pageTitle: 'login.login'
- }
- }).state('login.resetPasswordRequest', {
- url: '/resetPasswordRequest',
- module: 'public',
- views: {
- "@": {
- controller: 'ResetPasswordRequestController',
- controllerAs: 'vm',
- templateUrl: resetPasswordRequestTemplate
- }
- },
- data: {
- pageTitle: 'login.request-password-reset'
- }
- }).state('login.resetPassword', {
- url: '/resetPassword?resetToken',
- module: 'public',
- views: {
- "@": {
- controller: 'ResetPasswordController',
- controllerAs: 'vm',
- templateUrl: resetPasswordTemplate
- }
- },
- data: {
- pageTitle: 'login.reset-password'
- }
- }).state('login.resetExpiredPassword', {
- url: '/resetExpiredPassword?resetToken',
- module: 'public',
- views: {
- "@": {
- controller: 'ResetPasswordController',
- controllerAs: 'vm',
- templateUrl: resetPasswordTemplate
- }
- },
- data: {
- expiredPassword: true,
- pageTitle: 'login.reset-password'
- }
- }).state('login.createPassword', {
- url: '/createPassword?activateToken',
- module: 'public',
- views: {
- "@": {
- controller: 'CreatePasswordController',
- controllerAs: 'vm',
- templateUrl: createPasswordTemplate
- }
- },
- data: {
- pageTitle: 'login.create-password'
- }
- });
-}
diff --git a/ui/src/app/login/login.scss b/ui/src/app/login/login.scss
deleted file mode 100644
index 16520544fb..0000000000
--- a/ui/src/app/login/login.scss
+++ /dev/null
@@ -1,70 +0,0 @@
-/**
- * Copyright © 2016-2020 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.tb-login-card {
- width: 330px !important;
-
- @media (min-width: $layout-breakpoint-sm) {
- width: 450px !important;
- }
-
- .tb-padding {
- padding: 8px;
- }
-
- md-card-title {
- img.tb-login-logo {
- height: 50px;
- }
- }
-
- md-card-content {
- margin-top: -50px;
- }
-
- md-input-container .md-errors-spacer {
- display: none;
- }
-
- .oauth-container{
- .container-divider {
- display: flex;
- flex-direction: row;
- align-items: center;
- justify-content: center;
- width: 100%;
- margin: 10px 0;
-
- .line {
- flex: 1;
- }
-
- .text {
- padding-right: 10px;
- padding-left: 10px;
- }
- }
-
- .material-icons{
- width: 20px;
- min-width: 20px;
- height: 20px;
- min-height: 20px;
- margin: 0 4px;
- }
- }
-}
diff --git a/ui/src/app/login/login.tpl.html b/ui/src/app/login/login.tpl.html
deleted file mode 100644
index f12a207856..0000000000
--- a/ui/src/app/login/login.tpl.html
+++ /dev/null
@@ -1,64 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/ui/src/app/login/reset-password-request.controller.js b/ui/src/app/login/reset-password-request.controller.js
deleted file mode 100644
index 21b4a820c6..0000000000
--- a/ui/src/app/login/reset-password-request.controller.js
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-/*@ngInject*/
-export default function ResetPasswordRequestController($translate, toast, loginService) {
- var vm = this;
-
- vm.email = '';
-
- vm.sendResetPasswordLink = sendResetPasswordLink;
-
- function sendResetPasswordLink() {
- loginService.sendResetPasswordLink(vm.email).then(function success() {
- toast.showSuccess($translate.instant('login.password-link-sent-message'));
- }, function fail() {
- });
- }
-}
diff --git a/ui/src/app/login/reset-password-request.tpl.html b/ui/src/app/login/reset-password-request.tpl.html
deleted file mode 100644
index adbb004c6c..0000000000
--- a/ui/src/app/login/reset-password-request.tpl.html
+++ /dev/null
@@ -1,50 +0,0 @@
-
-
-
-
-
- login.request-password-reset
-
-
-
-
-
-
-
-
diff --git a/ui/src/app/login/reset-password.controller.js b/ui/src/app/login/reset-password.controller.js
deleted file mode 100644
index b1e87d3a35..0000000000
--- a/ui/src/app/login/reset-password.controller.js
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-/*@ngInject*/
-export default function ResetPasswordController($stateParams, $state, $translate, toast, loginService, userService) {
- var vm = this;
-
- vm.newPassword = '';
- vm.newPassword2 = '';
-
- vm.resetPassword = resetPassword;
-
- vm.isExpiredPassword = $state.$current.data.expiredPassword === true;
-
- function resetPassword() {
- if (vm.newPassword !== vm.newPassword2) {
- toast.showError($translate.instant('login.passwords-mismatch-error'));
- } else {
- loginService.resetPassword($stateParams.resetToken, vm.newPassword).then(function success(response) {
- var token = response.data.token;
- var refreshToken = response.data.refreshToken;
- userService.setUserFromJwtToken(token, refreshToken, true);
- }, function fail() {
- });
- }
- }
-}
diff --git a/ui/src/app/login/reset-password.tpl.html b/ui/src/app/login/reset-password.tpl.html
deleted file mode 100644
index c3c83da648..0000000000
--- a/ui/src/app/login/reset-password.tpl.html
+++ /dev/null
@@ -1,57 +0,0 @@
-
-
-
-
-
- login.password-reset
- login.expired-password-reset-message
-
-
-
-
-
-
-
-
diff --git a/ui/src/app/profile/change-password.controller.js b/ui/src/app/profile/change-password.controller.js
deleted file mode 100644
index 3e35461e32..0000000000
--- a/ui/src/app/profile/change-password.controller.js
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-/*@ngInject*/
-export default function ChangePasswordController($scope, $translate, toast, $mdDialog, loginService) {
- var vm = this;
-
- vm.currentPassword = '';
- vm.newPassword = '';
- vm.newPassword2 = '';
-
- vm.cancel = cancel;
- vm.changePassword = changePassword;
-
- function cancel() {
- $mdDialog.cancel();
- }
-
- function changePassword() {
- if (vm.newPassword !== vm.newPassword2) {
- toast.showError($translate.instant('login.passwords-mismatch-error'));
- } else {
- loginService.changePassword(vm.currentPassword, vm.newPassword).then(function success() {
- $scope.theForm.$setPristine();
- $mdDialog.hide();
- });
- }
- }
-}
diff --git a/ui/src/app/profile/change-password.tpl.html b/ui/src/app/profile/change-password.tpl.html
deleted file mode 100644
index 04abe20c4f..0000000000
--- a/ui/src/app/profile/change-password.tpl.html
+++ /dev/null
@@ -1,64 +0,0 @@
-
-
-
-
diff --git a/ui/src/app/profile/index.js b/ui/src/app/profile/index.js
deleted file mode 100644
index 6f4c460018..0000000000
--- a/ui/src/app/profile/index.js
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Copyright © 2016-2020 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 uiRouter from 'angular-ui-router';
-import ngMaterial from 'angular-material';
-import ngMessages from 'angular-messages';
-import thingsboardApiUser from '../api/user.service';
-import thingsboardApiLogin from '../api/login.service';
-import thingsboardConfirmOnExit from '../components/confirm-on-exit.directive';
-
-import ProfileRoutes from './profile.routes';
-import ProfileController from './profile.controller';
-import ChangePasswordController from './change-password.controller';
-
-export default angular.module('thingsboard.profile', [
- uiRouter,
- ngMaterial,
- ngMessages,
- thingsboardApiUser,
- thingsboardApiLogin,
- thingsboardConfirmOnExit
-])
- .config(ProfileRoutes)
- .controller('ProfileController', ProfileController)
- .controller('ChangePasswordController', ChangePasswordController)
- .name;
diff --git a/ui/src/app/profile/profile.controller.js b/ui/src/app/profile/profile.controller.js
deleted file mode 100644
index b28235134d..0000000000
--- a/ui/src/app/profile/profile.controller.js
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-/* eslint-disable import/no-unresolved, import/default */
-
-import changePasswordTemplate from './change-password.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-/*@ngInject*/
-export default function ProfileController(userService, $scope, $document, $mdDialog, $translate) {
- var vm = this;
-
- vm.profileUser = {};
- vm.save = save;
- vm.changePassword = changePassword;
- vm.languageList = SUPPORTED_LANGS; //eslint-disable-line
-
- loadProfile();
-
- function loadProfile() {
- userService.getUser(userService.getCurrentUser().userId).then(function success(user) {
- vm.profileUser = user;
- if (!vm.profileUser.additionalInfo) {
- vm.profileUser.additionalInfo = {};
- }
- if (!vm.profileUser.additionalInfo.lang) {
- vm.profileUser.additionalInfo.lang = $translate.use();
- }
- });
- }
-
- function save() {
- userService.saveUser(vm.profileUser).then(function success(user) {
- $translate.use(vm.profileUser.additionalInfo.lang);
- vm.profileUser = user;
- $scope.theForm.$setPristine();
- });
- }
-
- function changePassword($event) {
- $mdDialog.show({
- controller: 'ChangePasswordController',
- controllerAs: 'vm',
- templateUrl: changePasswordTemplate,
- parent: angular.element($document[0].body),
- fullscreen: true,
- targetEvent: $event
- }).then(function () {
- }, function () {
- });
- }
-}
diff --git a/ui/src/app/profile/profile.routes.js b/ui/src/app/profile/profile.routes.js
deleted file mode 100644
index c49255762c..0000000000
--- a/ui/src/app/profile/profile.routes.js
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-/* eslint-disable import/no-unresolved, import/default */
-
-import profileTemplate from './profile.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-/*@ngInject*/
-export default function ProfileRoutes($stateProvider) {
-
- $stateProvider
- .state('home.profile', {
- url: '/profile',
- module: 'private',
- auth: ['SYS_ADMIN', 'TENANT_ADMIN', 'CUSTOMER_USER'],
- views: {
- "content@home": {
- templateUrl: profileTemplate,
- controllerAs: 'vm',
- controller: 'ProfileController'
- }
- },
- data: {
- pageTitle: 'profile.profile'
- },
- ncyBreadcrumb: {
- label: '{"icon": "account_circle", "label": "profile.profile"}'
- }
- });
-
-}
diff --git a/ui/src/app/profile/profile.tpl.html b/ui/src/app/profile/profile.tpl.html
deleted file mode 100644
index f7478fff60..0000000000
--- a/ui/src/app/profile/profile.tpl.html
+++ /dev/null
@@ -1,68 +0,0 @@
-
-
-
diff --git a/ui/src/app/rulechain/add-link.tpl.html b/ui/src/app/rulechain/add-link.tpl.html
deleted file mode 100644
index dd6f70876e..0000000000
--- a/ui/src/app/rulechain/add-link.tpl.html
+++ /dev/null
@@ -1,48 +0,0 @@
-
-
-
-
diff --git a/ui/src/app/rulechain/add-rulechain.tpl.html b/ui/src/app/rulechain/add-rulechain.tpl.html
deleted file mode 100644
index 113b4e2c6a..0000000000
--- a/ui/src/app/rulechain/add-rulechain.tpl.html
+++ /dev/null
@@ -1,48 +0,0 @@
-
-
-
-
diff --git a/ui/src/app/rulechain/add-rulenode.tpl.html b/ui/src/app/rulechain/add-rulenode.tpl.html
deleted file mode 100644
index 3adb08cd30..0000000000
--- a/ui/src/app/rulechain/add-rulenode.tpl.html
+++ /dev/null
@@ -1,48 +0,0 @@
-
-
-
-
diff --git a/ui/src/app/rulechain/index.js b/ui/src/app/rulechain/index.js
deleted file mode 100644
index bcc6126295..0000000000
--- a/ui/src/app/rulechain/index.js
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Copyright © 2016-2020 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 RuleChainRoutes from './rulechain.routes';
-import RuleChainsController from './rulechains.controller';
-import {RuleChainController, AddRuleNodeController, AddRuleNodeLinkController} from './rulechain.controller';
-import NodeScriptTestController from './script/node-script-test.controller';
-import RuleChainDirective from './rulechain.directive';
-import RuleNodeDefinedConfigDirective from './rulenode-defined-config.directive';
-import RuleNodeConfigDirective from './rulenode-config.directive';
-import RuleNodeDirective from './rulenode.directive';
-import LinkDirective from './link.directive';
-import MessageTypeAutocompleteDirective from './message-type-autocomplete.directive';
-import NodeScriptTest from './script/node-script-test.service';
-
-export default angular.module('thingsboard.ruleChain', [])
- .config(RuleChainRoutes)
- .controller('RuleChainsController', RuleChainsController)
- .controller('RuleChainController', RuleChainController)
- .controller('AddRuleNodeController', AddRuleNodeController)
- .controller('AddRuleNodeLinkController', AddRuleNodeLinkController)
- .controller('NodeScriptTestController', NodeScriptTestController)
- .directive('tbRuleChain', RuleChainDirective)
- .directive('tbRuleNodeDefinedConfig', RuleNodeDefinedConfigDirective)
- .directive('tbRuleNodeConfig', RuleNodeConfigDirective)
- .directive('tbRuleNode', RuleNodeDirective)
- .directive('tbRuleNodeLink', LinkDirective)
- .directive('tbMessageTypeAutocomplete', MessageTypeAutocompleteDirective)
- .factory('ruleNodeScriptTest', NodeScriptTest)
- .name;
diff --git a/ui/src/app/rulechain/link-fieldset.tpl.html b/ui/src/app/rulechain/link-fieldset.tpl.html
deleted file mode 100644
index e0780e7d66..0000000000
--- a/ui/src/app/rulechain/link-fieldset.tpl.html
+++ /dev/null
@@ -1,60 +0,0 @@
-
-
-
-
diff --git a/ui/src/app/rulechain/link.directive.js b/ui/src/app/rulechain/link.directive.js
deleted file mode 100644
index 94ea4b94c3..0000000000
--- a/ui/src/app/rulechain/link.directive.js
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
- * Copyright © 2016-2020 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 './link.scss';
-
-/* eslint-disable import/no-unresolved, import/default */
-
-import linkFieldsetTemplate from './link-fieldset.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-/*@ngInject*/
-export default function LinkDirective($compile, $templateCache, $filter) {
- var linker = function (scope, element, attrs, ngModelCtrl) {
- var template = $templateCache.get(linkFieldsetTemplate);
- element.html(template);
-
- scope.selectedLabel = null;
- scope.labelSearchText = null;
-
- scope.ngModelCtrl = ngModelCtrl;
-
- var labelsList = [];
-
- scope.transformLinkLabelChip = function (chip) {
- var res = $filter('filter')(labelsList, {name: chip}, true);
- var result;
- if (res && res.length) {
- result = angular.copy(res[0]);
- } else {
- result = {
- name: chip,
- value: chip
- };
- }
- return result;
- };
-
- scope.labelsSearch = function (searchText) {
- var labels = searchText ? $filter('filter')(labelsList, {name: searchText}) : labelsList;
- return labels.map((label) => label.name);
- };
-
- scope.createLinkLabel = function (event, chipsId) {
- var chipsChild = angular.element(chipsId, element)[0].firstElementChild;
- var el = angular.element(chipsChild);
- var chipBuffer = el.scope().$mdChipsCtrl.getChipBuffer();
- event.preventDefault();
- event.stopPropagation();
- el.scope().$mdChipsCtrl.appendChip(chipBuffer.trim());
- el.scope().$mdChipsCtrl.resetChipBuffer();
- };
-
-
- ngModelCtrl.$render = function () {
- labelsList.length = 0;
- for (var label in scope.allowedLabels) {
- var linkLabel = {
- name: scope.allowedLabels[label].name,
- value: scope.allowedLabels[label].value
- };
- labelsList.push(linkLabel);
- }
-
- var link = ngModelCtrl.$viewValue;
- var labels = [];
- if (link && link.labels) {
- for (var i = 0; i < link.labels.length; i++) {
- label = link.labels[i];
- if (scope.allowedLabels[label]) {
- labels.push(angular.copy(scope.allowedLabels[label]));
- } else {
- labels.push({
- name: label,
- value: label
- });
- }
- }
- }
- scope.labels = labels;
- scope.$watch('labels', function (newVal, prevVal) {
- if (!angular.equals(newVal, prevVal)) {
- updateLabels();
- }
- }, true);
- };
-
- function updateLabels() {
- if (ngModelCtrl.$viewValue) {
- var labels = [];
- for (var i = 0; i < scope.labels.length; i++) {
- labels.push(scope.labels[i].value);
- }
- ngModelCtrl.$viewValue.labels = labels;
- ngModelCtrl.$viewValue.label = labels.join(' / ');
- updateValidity();
- }
- }
-
- function updateValidity() {
- var valid = ngModelCtrl.$viewValue.labels &&
- ngModelCtrl.$viewValue.labels.length ? true : false;
- ngModelCtrl.$setValidity('linkLabels', valid);
- }
-
- $compile(element.contents())(scope);
- }
- return {
- restrict: "E",
- require: "^ngModel",
- link: linker,
- scope: {
- allowedLabels: '=',
- allowCustom: '=',
- isEdit: '=',
- isReadOnly: '='
- }
- };
-}
diff --git a/ui/src/app/rulechain/link.scss b/ui/src/app/rulechain/link.scss
deleted file mode 100644
index baa2489a13..0000000000
--- a/ui/src/app/rulechain/link.scss
+++ /dev/null
@@ -1,31 +0,0 @@
-/**
- * Copyright © 2016-2020 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-link-label-autocomplete {
- .tb-not-found {
- display: block;
- height: 48px;
- line-height: 1.5;
-
- .tb-no-entries {
- line-height: 48px;
- }
- }
-
- li {
- height: auto !important;
- white-space: normal !important;
- }
-}
diff --git a/ui/src/app/rulechain/message-type-autocomplete.directive.js b/ui/src/app/rulechain/message-type-autocomplete.directive.js
deleted file mode 100644
index 088dea659e..0000000000
--- a/ui/src/app/rulechain/message-type-autocomplete.directive.js
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * Copyright © 2016-2020 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 './message-type-autocomplete.scss';
-
-/* eslint-disable import/no-unresolved, import/default */
-
-import messageTypeAutocompleteTemplate from './message-type-autocomplete.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-/*@ngInject*/
-export default function MessageTypeAutocomplete($compile, $templateCache, $q, $filter, types) {
-
- var linker = function (scope, element, attrs, ngModelCtrl) {
- var template = $templateCache.get(messageTypeAutocompleteTemplate);
- element.html(template);
-
- var messageTypeList = [];
- for (var t in types.messageType) {
- var type = types.messageType[t];
- messageTypeList.push(type);
- }
-
- scope.messageType = null;
- scope.messageTypeSearchText = '';
-
- scope.fetchMessageTypes = function(searchText) {
- var deferred = $q.defer();
- var result = $filter('filter')(messageTypeList, {'name': searchText});
- if (result && result.length) {
- deferred.resolve(result);
- } else {
- deferred.resolve([{name: searchText, value: searchText}]);
- }
- return deferred.promise;
- };
-
- scope.messageTypeSearchTextChanged = function() {
- };
-
- scope.updateView = function () {
- if (!scope.disabled) {
- var value = null;
- if (scope.messageType) {
- value = scope.messageType.value;
- }
- ngModelCtrl.$setViewValue(value);
- }
- };
-
- ngModelCtrl.$render = function () {
- var value = ngModelCtrl.$viewValue;
- if (value) {
- var result = $filter('filter')(messageTypeList, {'value': value}, true);
- if (result && result.length) {
- scope.messageType = result[0];
- } else {
- scope.messageType = {
- name: value,
- value: value
- };
- }
- } else {
- scope.messageType = null;
- }
- };
-
- scope.$watch('messageType', function (newValue, prevValue) {
- if (!angular.equals(newValue, prevValue)) {
- scope.updateView();
- }
- });
-
- $compile(element.contents())(scope);
- }
-
- return {
- restrict: "E",
- require: "^ngModel",
- link: linker,
- scope: {
- theForm: '=?',
- disabled:'=ngDisabled',
- required:'=ngRequired'
- }
- };
-}
diff --git a/ui/src/app/rulechain/message-type-autocomplete.scss b/ui/src/app/rulechain/message-type-autocomplete.scss
deleted file mode 100644
index b88211993e..0000000000
--- a/ui/src/app/rulechain/message-type-autocomplete.scss
+++ /dev/null
@@ -1,26 +0,0 @@
-/**
- * Copyright © 2016-2020 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-message-type-autocomplete {
- .tb-message-type-item {
- display: block;
- height: 48px;
- }
-
- li {
- height: auto !important;
- white-space: normal !important;
- }
-}
diff --git a/ui/src/app/rulechain/message-type-autocomplete.tpl.html b/ui/src/app/rulechain/message-type-autocomplete.tpl.html
deleted file mode 100644
index 5c96969847..0000000000
--- a/ui/src/app/rulechain/message-type-autocomplete.tpl.html
+++ /dev/null
@@ -1,41 +0,0 @@
-
-
-
-
- {{item.name}}
-
-
-
-
rulenode.message-type-required
-
-
diff --git a/ui/src/app/rulechain/rulechain-card.tpl.html b/ui/src/app/rulechain/rulechain-card.tpl.html
deleted file mode 100644
index dad4ab624d..0000000000
--- a/ui/src/app/rulechain/rulechain-card.tpl.html
+++ /dev/null
@@ -1,18 +0,0 @@
-
-rulechain.root
diff --git a/ui/src/app/rulechain/rulechain-fieldset.tpl.html b/ui/src/app/rulechain/rulechain-fieldset.tpl.html
deleted file mode 100644
index 4afd6ee96e..0000000000
--- a/ui/src/app/rulechain/rulechain-fieldset.tpl.html
+++ /dev/null
@@ -1,57 +0,0 @@
-
-{{ 'rulechain.export' | translate }}
-{{ 'rulechain.set-root' | translate }}
-{{ 'rulechain.delete' | translate }}
-
-
-
-
- rulechain.copyId
-
-
-
-
-
-
diff --git a/ui/src/app/rulechain/rulechain.controller.js b/ui/src/app/rulechain/rulechain.controller.js
deleted file mode 100644
index af7bdbf8d9..0000000000
--- a/ui/src/app/rulechain/rulechain.controller.js
+++ /dev/null
@@ -1,1410 +0,0 @@
-/*
- * Copyright © 2016-2020 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 './rulechain.scss';
-
-import 'tooltipster/dist/css/tooltipster.bundle.min.css';
-import 'tooltipster/dist/js/tooltipster.bundle.min.js';
-import 'tooltipster/dist/css/plugins/tooltipster/sideTip/themes/tooltipster-sideTip-shadow.min.css';
-
-/* eslint-disable import/no-unresolved, import/default */
-
-import addRuleNodeTemplate from './add-rulenode.tpl.html';
-import addRuleNodeLinkTemplate from './add-link.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-/*@ngInject*/
-export function RuleChainController($state, $scope, $compile, $q, $mdUtil, $timeout, $mdExpansionPanel, $window, $document, $mdDialog,
- $filter, $translate, hotkeys, types, ruleChainService, itembuffer, Modelfactory, flowchartConstants,
- ruleChain, ruleChainMetaData, ruleNodeComponents, helpLinks) {
-
- var vm = this;
-
- vm.$mdExpansionPanel = $mdExpansionPanel;
- vm.types = types;
-
- if ($state.current.data.import && !ruleChain) {
- $state.go('home.ruleChains');
- return;
- }
-
- vm.isImport = $state.current.data.import;
- vm.isConfirmOnExit = false;
-
- $scope.$watch(function() {
- return vm.isDirty || vm.isImport;
- }, (val) => {
- vm.isConfirmOnExit = val;
- });
-
- vm.errorTooltips = {};
-
- vm.isFullscreen = false;
-
- vm.editingRuleNode = null;
- vm.isEditingRuleNode = false;
-
- vm.editingRuleNodeLink = null;
- vm.isEditingRuleNodeLink = false;
-
- vm.isLibraryOpen = true;
- vm.enableHotKeys = true;
-
- Object.defineProperty(vm, 'isLibraryOpenReadonly', {
- get: function() { return vm.isLibraryOpen },
- set: function() {}
- });
-
- vm.ruleNodeSearch = '';
-
- vm.ruleChain = ruleChain;
- vm.ruleChainMetaData = ruleChainMetaData;
-
- vm.canvasControl = {};
-
- vm.ruleChainModel = {
- nodes: [],
- edges: []
- };
-
- vm.ruleNodeTypesModel = {};
- vm.ruleNodeTypesCanvasControl = {};
- vm.ruleChainLibraryLoaded = false;
- for (var type in types.ruleNodeType) {
- if (!types.ruleNodeType[type].special) {
- vm.ruleNodeTypesModel[type] = {
- model: {
- nodes: [],
- edges: []
- },
- selectedObjects: []
- };
- vm.ruleNodeTypesCanvasControl[type] = {};
- }
- }
-
-
-
- vm.selectedObjects = [];
-
- vm.modelservice = Modelfactory(vm.ruleChainModel, vm.selectedObjects);
-
- vm.saveRuleChain = saveRuleChain;
- vm.revertRuleChain = revertRuleChain;
-
- vm.objectsSelected = objectsSelected;
- vm.deleteSelected = deleteSelected;
-
- vm.isDebugModeEnabled = isDebugModeEnabled;
- vm.resetDebugModeInAllNodes = resetDebugModeInAllNodes;
-
- vm.triggerResize = triggerResize;
-
- vm.openRuleChainContextMenu = openRuleChainContextMenu;
-
- vm.helpLinkIdForRuleNodeType = helpLinkIdForRuleNodeType;
-
- initHotKeys();
-
- function openRuleChainContextMenu($event, $mdOpenMousepointMenu) {
- if (vm.canvasControl.modelservice && !$event.ctrlKey && !$event.metaKey) {
- var x = $event.clientX;
- var y = $event.clientY;
- var item = vm.canvasControl.modelservice.getItemInfoAtPoint(x, y);
- vm.contextInfo = prepareContextMenu(item);
- if (vm.contextInfo.items && vm.contextInfo.items.length > 0) {
- vm.contextMenuEvent = $event;
- $mdOpenMousepointMenu($event);
- return false;
- }
- }
- }
-
- function prepareContextMenu(item) {
- if (objectsSelected() || (!item.node && !item.edge)) {
- return prepareRuleChainContextMenu();
- } else if (item.node) {
- return prepareRuleNodeContextMenu(item.node);
- } else if (item.edge) {
- return prepareEdgeContextMenu(item.edge);
- }
- }
-
- function prepareRuleChainContextMenu() {
- var contextInfo = {
- headerClass: 'tb-rulechain',
- icon: 'settings_ethernet',
- title: vm.ruleChain.name,
- subtitle: $translate.instant('rulechain.rulechain')
- };
- contextInfo.items = [];
- if (vm.modelservice.nodes.getSelectedNodes().length) {
- contextInfo.items.push(
- {
- action: function () {
- copyRuleNodes();
- },
- enabled: true,
- value: "rulenode.copy-selected",
- icon: "content_copy",
- shortcut: "M-C"
- }
- );
- }
- contextInfo.items.push(
- {
- action: function ($event) {
- pasteRuleNodes($event);
- },
- enabled: itembuffer.hasRuleNodes(),
- value: "action.paste",
- icon: "content_paste",
- shortcut: "M-V"
- }
- );
- contextInfo.items.push(
- {
- divider: true
- }
- );
- if (objectsSelected()) {
- contextInfo.items.push(
- {
- action: function () {
- vm.modelservice.deselectAll();
- },
- enabled: true,
- value: "rulenode.deselect-all",
- icon: "tab_unselected",
- shortcut: "Esc"
- }
- );
- contextInfo.items.push(
- {
- action: function () {
- vm.modelservice.deleteSelected();
- },
- enabled: true,
- value: "rulenode.delete-selected",
- icon: "clear",
- shortcut: "Del"
- }
- );
- } else {
- contextInfo.items.push(
- {
- action: function () {
- vm.modelservice.selectAll();
- },
- enabled: true,
- value: "rulenode.select-all",
- icon: "select_all",
- shortcut: "M-A"
- }
- );
- }
- contextInfo.items.push(
- {
- divider: true
- }
- );
- contextInfo.items.push(
- {
- action: function () {
- vm.saveRuleChain();
- },
- enabled: !(vm.isInvalid || (!vm.isDirty && !vm.isImport)),
- value: "action.apply-changes",
- icon: "done",
- shortcut: "M-S"
- }
- );
- contextInfo.items.push(
- {
- action: function () {
- vm.revertRuleChain();
- },
- enabled: vm.isDirty,
- value: "action.decline-changes",
- icon: "close",
- shortcut: "M-Z"
- }
- );
- return contextInfo;
- }
-
- function prepareRuleNodeContextMenu(node) {
- var contextInfo = {
- headerClass: node.nodeClass,
- icon: node.icon,
- iconUrl: node.iconUrl,
- title: node.name,
- subtitle: node.component.name
- };
- contextInfo.items = [];
- if (!node.readonly) {
- contextInfo.items.push(
- {
- action: function () {
- openNodeDetails(node);
- },
- enabled: true,
- value: "rulenode.details",
- icon: "menu"
- }
- );
- contextInfo.items.push(
- {
- action: function () {
- copyNode(node);
- },
- enabled: true,
- value: "action.copy",
- icon: "content_copy"
- }
- );
- contextInfo.items.push(
- {
- action: function () {
- vm.canvasControl.modelservice.nodes.delete(node);
- },
- enabled: true,
- value: "action.delete",
- icon: "clear",
- shortcut: "M-X"
- }
- );
- }
- return contextInfo;
- }
-
- function prepareEdgeContextMenu(edge) {
- var contextInfo = {
- headerClass: 'tb-link',
- icon: 'trending_flat',
- title: edge.label,
- subtitle: $translate.instant('rulenode.link')
- };
- contextInfo.items = [];
- var sourceNode = vm.modelservice.nodes.getNodeByConnectorId(edge.source);
- if (sourceNode.component.type != types.ruleNodeType.INPUT.value) {
- contextInfo.items.push(
- {
- action: function () {
- openLinkDetails(edge);
- },
- enabled: true,
- value: "rulenode.details",
- icon: "menu"
- }
- );
- }
- contextInfo.items.push(
- {
- action: function () {
- vm.canvasControl.modelservice.edges.delete(edge);
- },
- enabled: true,
- value: "action.delete",
- icon: "clear",
- shortcut: "M-X"
- }
- );
- return contextInfo;
- }
-
- function initHotKeys() {
- hotkeys.bindTo($scope)
- .add({
- combo: 'ctrl+a',
- description: $translate.instant('rulenode.select-all-objects'),
- allowIn: ['INPUT', 'SELECT', 'TEXTAREA'],
- callback: function (event) {
- if (vm.enableHotKeys) {
- event.preventDefault();
- vm.modelservice.selectAll();
- }
- }
- })
- .add({
- combo: 'ctrl+c',
- description: $translate.instant('rulenode.copy-selected'),
- allowIn: ['INPUT', 'SELECT', 'TEXTAREA'],
- callback: function (event) {
- if (vm.enableHotKeys) {
- event.preventDefault();
- copyRuleNodes();
- }
- }
- })
- .add({
- combo: 'ctrl+v',
- description: $translate.instant('action.paste'),
- allowIn: ['INPUT', 'SELECT', 'TEXTAREA'],
- callback: function (event) {
- if (vm.enableHotKeys) {
- event.preventDefault();
- if (itembuffer.hasRuleNodes()) {
- pasteRuleNodes();
- }
- }
- }
- })
- .add({
- combo: 'esc',
- description: $translate.instant('rulenode.deselect-all-objects'),
- allowIn: ['INPUT', 'SELECT', 'TEXTAREA'],
- callback: function (event) {
- if (vm.enableHotKeys) {
- event.preventDefault();
- event.stopPropagation();
- vm.modelservice.deselectAll();
- }
- }
- })
- .add({
- combo: 'ctrl+s',
- description: $translate.instant('action.apply'),
- allowIn: ['INPUT', 'SELECT', 'TEXTAREA'],
- callback: function (event) {
- if (vm.enableHotKeys) {
- event.preventDefault();
- vm.saveRuleChain();
- }
- }
- })
- .add({
- combo: 'ctrl+z',
- description: $translate.instant('action.decline-changes'),
- allowIn: ['INPUT', 'SELECT', 'TEXTAREA'],
- callback: function (event) {
- if (vm.enableHotKeys) {
- event.preventDefault();
- vm.revertRuleChain();
- }
- }
- })
- .add({
- combo: 'del',
- description: $translate.instant('rulenode.delete-selected-objects'),
- allowIn: ['INPUT', 'SELECT', 'TEXTAREA'],
- callback: function (event) {
- if (vm.enableHotKeys) {
- event.preventDefault();
- vm.modelservice.deleteSelected();
- }
- }
- })
- }
-
- vm.onEditRuleNodeClosed = function() {
- vm.editingRuleNode = null;
- };
-
- vm.onEditRuleNodeLinkClosed = function() {
- vm.editingRuleNodeLink = null;
- };
-
- vm.saveRuleNode = function(theForm) {
- $scope.$broadcast('form-submit');
- if (theForm.$valid) {
- theForm.$setPristine();
- if (vm.editingRuleNode.error) {
- delete vm.editingRuleNode.error;
- }
- vm.ruleChainModel.nodes[vm.editingRuleNodeIndex] = vm.editingRuleNode;
- vm.editingRuleNode = angular.copy(vm.editingRuleNode);
- updateRuleNodesHighlight();
- }
- };
-
- vm.saveRuleNodeLink = function(theForm) {
- theForm.$setPristine();
- vm.ruleChainModel.edges[vm.editingRuleNodeLinkIndex] = vm.editingRuleNodeLink;
- vm.editingRuleNodeLink = angular.copy(vm.editingRuleNodeLink);
- };
-
- vm.onRevertRuleNodeEdit = function(theForm) {
- theForm.$setPristine();
- var node = vm.ruleChainModel.nodes[vm.editingRuleNodeIndex];
- vm.editingRuleNode = angular.copy(node);
- };
-
- vm.onRevertRuleNodeLinkEdit = function(theForm) {
- theForm.$setPristine();
- var edge = vm.ruleChainModel.edges[vm.editingRuleNodeLinkIndex];
- vm.editingRuleNodeLink = angular.copy(edge);
- };
-
- vm.nodeLibCallbacks = {
- nodeCallbacks: {
- 'mouseEnter': function (event, node) {
- displayLibNodeDescriptionTooltip(event, node);
- },
- 'mouseLeave': function () {
- destroyTooltips();
- },
- 'mouseDown': function () {
- destroyTooltips();
- }
- }
- };
-
- vm.typeHeaderMouseEnter = function(event, typeId) {
- var ruleNodeType = types.ruleNodeType[typeId];
- displayTooltip(event,
- ''
- );
- };
-
- vm.destroyTooltips = destroyTooltips;
-
- function helpLinkIdForRuleNodeType() {
- return helpLinks.getRuleNodeLink(vm.editingRuleNode);
- }
-
- function destroyTooltips() {
- if (vm.tooltipTimeout) {
- $timeout.cancel(vm.tooltipTimeout);
- vm.tooltipTimeout = null;
- }
- var instances = angular.element.tooltipster.instances();
- instances.forEach((instance) => {
- if (!instance.isErrorTooltip) {
- instance.destroy();
- }
- });
- }
-
- function displayLibNodeDescriptionTooltip(event, node) {
- displayTooltip(event,
- ''
- );
- }
-
- function displayNodeDescriptionTooltip(event, node) {
- if (!vm.errorTooltips[node.id]) {
- var name, desc, details;
- if (node.component.type == vm.types.ruleNodeType.INPUT.value) {
- name = $translate.instant(vm.types.ruleNodeType.INPUT.name) + '';
- desc = $translate.instant(vm.types.ruleNodeType.INPUT.details) + '';
- } else {
- name = node.name;
- desc = $translate.instant(vm.types.ruleNodeType[node.component.type].name) + ' - ' + node.component.name;
- if (node.additionalInfo) {
- details = node.additionalInfo.description;
- }
- }
- var tooltipContent = '';
- displayTooltip(event, tooltipContent);
- }
- }
-
- function displayTooltip(event, content) {
- destroyTooltips();
- vm.tooltipTimeout = $timeout(() => {
- var element = angular.element(event.target);
- element.tooltipster(
- {
- theme: 'tooltipster-shadow',
- delay: 100,
- trigger: 'custom',
- triggerOpen: {
- click: false,
- tap: false
- },
- triggerClose: {
- click: true,
- tap: true,
- scroll: true
- },
- side: 'right',
- trackOrigin: true
- }
- );
- var contentElement = angular.element(content);
- $compile(contentElement)($scope);
- var tooltip = element.tooltipster('instance');
- tooltip.content(contentElement);
- tooltip.open();
- }, 500);
- }
-
- function updateNodeErrorTooltip(node) {
- if (node.error) {
- var element = angular.element('#' + node.id);
- var tooltip = vm.errorTooltips[node.id];
- if (!tooltip || !element.hasClass("tooltipstered")) {
- element.tooltipster(
- {
- theme: 'tooltipster-shadow',
- delay: 0,
- animationDuration: 0,
- trigger: 'custom',
- triggerOpen: {
- click: false,
- tap: false
- },
- triggerClose: {
- click: false,
- tap: false,
- scroll: false
- },
- side: 'top',
- trackOrigin: true
- }
- );
- var content = '';
- var contentElement = angular.element(content);
- $compile(contentElement)($scope);
- tooltip = element.tooltipster('instance');
- tooltip.isErrorTooltip = true;
- tooltip.content(contentElement);
- vm.errorTooltips[node.id] = tooltip;
- }
- $mdUtil.nextTick(() => {
- tooltip.open();
- });
- } else {
- if (vm.errorTooltips[node.id]) {
- tooltip = vm.errorTooltips[node.id];
- tooltip.destroy();
- delete vm.errorTooltips[node.id];
- }
- }
- }
-
- function updateErrorTooltips(hide) {
- for (var nodeId in vm.errorTooltips) {
- var tooltip = vm.errorTooltips[nodeId];
- if (hide) {
- tooltip.close();
- } else {
- tooltip.open();
- }
- }
- }
-
- $scope.$watch(function() {
- return vm.isEditingRuleNode || vm.isEditingRuleNodeLink;
- }, (val) => {
- vm.enableHotKeys = !val;
- updateErrorTooltips(val);
- });
-
- vm.editCallbacks = {
- edgeDoubleClick: function (event, edge) {
- openLinkDetails(edge);
- },
- edgeEdit: function(event, edge) {
- openLinkDetails(edge);
- },
- nodeCallbacks: {
- 'doubleClick': function (event, node) {
- openNodeDetails(node);
- },
- 'nodeEdit': function (event, node) {
- openNodeDetails(node);
- },
- 'mouseEnter': function (event, node) {
- displayNodeDescriptionTooltip(event, node);
- },
- 'mouseLeave': function () {
- destroyTooltips();
- },
- 'mouseDown': function () {
- destroyTooltips();
- }
- },
- isValidEdge: function (source, destination) {
- return source.type === flowchartConstants.rightConnectorType && destination.type === flowchartConstants.leftConnectorType;
- },
- createEdge: function (event, edge) {
- var deferred = $q.defer();
- var sourceNode = vm.modelservice.nodes.getNodeByConnectorId(edge.source);
- if (sourceNode.component.type == types.ruleNodeType.INPUT.value) {
- var destNode = vm.modelservice.nodes.getNodeByConnectorId(edge.destination);
- if (destNode.component.type == types.ruleNodeType.RULE_CHAIN.value) {
- deferred.reject();
- } else {
- var res = $filter('filter')(vm.ruleChainModel.edges, {source: vm.inputConnectorId}, true);
- if (res && res.length) {
- vm.modelservice.edges.delete(res[0]);
- }
- deferred.resolve(edge);
- }
- } else {
- if (edge.label) {
- if (!edge.labels) {
- edge.labels = edge.label.split(' / ');
- }
- deferred.resolve(edge);
- } else {
- var labels = ruleChainService.getRuleNodeSupportedLinks(sourceNode.component);
- var allowCustomLabels = ruleChainService.ruleNodeAllowCustomLinks(sourceNode.component);
- vm.enableHotKeys = false;
- addRuleNodeLink(event, edge, labels, allowCustomLabels).then(
- (link) => {
- deferred.resolve(link);
- vm.enableHotKeys = true;
- },
- () => {
- deferred.reject();
- vm.enableHotKeys = true;
- }
- );
- }
- }
- return deferred.promise;
- },
- dropNode: function (event, node) {
- addRuleNode(event, node);
- }
- };
-
- function openNodeDetails(node) {
- if (node.component.type != types.ruleNodeType.INPUT.value) {
- vm.isEditingRuleNodeLink = false;
- vm.editingRuleNodeLink = null;
- vm.isEditingRuleNode = true;
- vm.editingRuleNodeIndex = vm.ruleChainModel.nodes.indexOf(node);
- vm.editingRuleNode = angular.copy(node);
- $mdUtil.nextTick(() => {
- if (vm.ruleNodeForm) {
- vm.ruleNodeForm.$setPristine();
- }
- });
- }
- }
-
- function openLinkDetails(edge) {
- var sourceNode = vm.modelservice.nodes.getNodeByConnectorId(edge.source);
- if (sourceNode.component.type != types.ruleNodeType.INPUT.value) {
- vm.isEditingRuleNode = false;
- vm.editingRuleNode = null;
- vm.editingRuleNodeLinkLabels = ruleChainService.getRuleNodeSupportedLinks(sourceNode.component);
- vm.editingRuleNodeAllowCustomLabels = ruleChainService.ruleNodeAllowCustomLinks(sourceNode.component);
- vm.isEditingRuleNodeLink = true;
- vm.editingRuleNodeLinkIndex = vm.ruleChainModel.edges.indexOf(edge);
- vm.editingRuleNodeLink = angular.copy(edge);
- $mdUtil.nextTick(() => {
- if (vm.ruleNodeLinkForm) {
- vm.ruleNodeLinkForm.$setPristine();
- }
- });
- }
- }
-
- function copyNode(node) {
- itembuffer.copyRuleNodes([node], []);
- }
-
- function copyRuleNodes() {
- var nodes = vm.modelservice.nodes.getSelectedNodes();
- var edges = vm.modelservice.edges.getSelectedEdges();
- var connections = [];
- for (var i=0;i -1) && toIndex > -1 ) {
- var connection = {
- isInputSource: isInputSource,
- fromIndex: fromIndex,
- toIndex: toIndex,
- label: edge.label,
- labels: edge.labels
- };
- connections.push(connection);
- }
- }
- itembuffer.copyRuleNodes(nodes, connections);
- }
-
- function pasteRuleNodes(event) {
- var canvas = angular.element(vm.canvasControl.modelservice.getCanvasHtmlElement());
- var x,y;
- if (event) {
- var offset = canvas.offset();
- x = Math.round(event.clientX - offset.left);
- y = Math.round(event.clientY - offset.top);
- } else {
- var scrollParent = canvas.parent();
- var scrollTop = scrollParent.scrollTop();
- var scrollLeft = scrollParent.scrollLeft();
- x = scrollLeft + scrollParent.width()/2;
- y = scrollTop + scrollParent.height()/2;
- }
- var ruleNodes = itembuffer.pasteRuleNodes(x, y, event);
- if (ruleNodes) {
- vm.modelservice.deselectAll();
- var nodes = [];
- for (var i=0;i {
- for (componentType in vm.ruleNodeTypesCanvasControl) {
- if (vm.ruleNodeTypesCanvasControl[componentType].adjustCanvasSize) {
- vm.ruleNodeTypesCanvasControl[componentType].adjustCanvasSize(true);
- }
- }
- for (componentType in vm.ruleNodeTypesModel) {
- var panel = vm.$mdExpansionPanel(componentType);
- if (panel) {
- if (!vm.ruleNodeTypesModel[componentType].model.nodes.length) {
- panel.collapse();
- } else {
- panel.expand();
- }
- }
- }
- });
- }
-
- function prepareRuleChain() {
-
- if (vm.ruleChainWatch) {
- vm.ruleChainWatch();
- vm.ruleChainWatch = null;
- }
-
- vm.nextNodeID = 1;
- vm.nextConnectorID = 1;
-
- vm.selectedObjects.length = 0;
- vm.ruleChainModel.nodes.length = 0;
- vm.ruleChainModel.edges.length = 0;
-
- vm.inputConnectorId = vm.nextConnectorID++;
-
- vm.ruleChainModel.nodes.push(
- {
- id: 'rule-chain-node-' + vm.nextNodeID++,
- component: types.inputNodeComponent,
- name: "",
- nodeClass: types.ruleNodeType.INPUT.nodeClass,
- icon: types.ruleNodeType.INPUT.icon,
- readonly: true,
- x: 50,
- y: 150,
- connectors: [
- {
- type: flowchartConstants.rightConnectorType,
- id: vm.inputConnectorId
- },
- ]
-
- }
- );
- ruleChainService.resolveTargetRuleChains(vm.ruleChainMetaData.ruleChainConnections)
- .then((ruleChainsMap) => {
- createRuleChainModel(ruleChainsMap);
- }
- );
- }
-
- function createRuleChainModel(ruleChainsMap) {
- var nodes = [];
- for (var i=0;i -1) {
- var destNode = nodes[vm.ruleChainMetaData.firstNodeIndex];
- if (destNode) {
- var connectors = vm.modelservice.nodes.getConnectorsByType(destNode, flowchartConstants.leftConnectorType);
- if (connectors && connectors.length) {
- var edge = {
- source: vm.inputConnectorId,
- destination: connectors[0].id
- };
- vm.ruleChainModel.edges.push(edge);
- }
- }
- }
-
- if (vm.ruleChainMetaData.connections) {
- var edgeMap = {};
- for (i = 0; i < vm.ruleChainMetaData.connections.length; i++) {
- var connection = vm.ruleChainMetaData.connections[i];
- var sourceNode = nodes[connection.fromIndex];
- destNode = nodes[connection.toIndex];
- if (sourceNode && destNode) {
- var sourceConnectors = vm.modelservice.nodes.getConnectorsByType(sourceNode, flowchartConstants.rightConnectorType);
- var destConnectors = vm.modelservice.nodes.getConnectorsByType(destNode, flowchartConstants.leftConnectorType);
- if (sourceConnectors && sourceConnectors.length && destConnectors && destConnectors.length) {
- var sourceId = sourceConnectors[0].id;
- var destId = destConnectors[0].id;
- var edgeKey = sourceId + '_' + destId;
- edge = edgeMap[edgeKey];
- if (!edge) {
- edge = {
- source: sourceId,
- destination: destId,
- label: connection.type,
- labels: [connection.type]
- };
- edgeMap[edgeKey] = edge;
- vm.ruleChainModel.edges.push(edge);
- } else {
- edge.label += ' / ' +connection.type;
- edge.labels.push(connection.type);
- }
- }
- }
- }
- }
-
- if (vm.ruleChainMetaData.ruleChainConnections) {
- var ruleChainNodesMap = {};
- var ruleChainEdgeMap = {};
- for (i = 0; i < vm.ruleChainMetaData.ruleChainConnections.length; i++) {
- var ruleChainConnection = vm.ruleChainMetaData.ruleChainConnections[i];
- var ruleChain = ruleChainsMap[ruleChainConnection.targetRuleChainId.id];
- if (ruleChainConnection.additionalInfo && ruleChainConnection.additionalInfo.ruleChainNodeId) {
- var ruleChainNode = ruleChainNodesMap[ruleChainConnection.additionalInfo.ruleChainNodeId];
- if (!ruleChainNode) {
- ruleChainNode = {
- id: 'rule-chain-node-' + vm.nextNodeID++,
- additionalInfo: ruleChainConnection.additionalInfo,
- x: Math.round(ruleChainConnection.additionalInfo.layoutX),
- y: Math.round(ruleChainConnection.additionalInfo.layoutY),
- component: types.ruleChainNodeComponent,
- nodeClass: vm.types.ruleNodeType.RULE_CHAIN.nodeClass,
- icon: vm.types.ruleNodeType.RULE_CHAIN.icon,
- connectors: [
- {
- type: flowchartConstants.leftConnectorType,
- id: vm.nextConnectorID++
- }
- ]
- };
- if (ruleChain.name) {
- ruleChainNode.name = ruleChain.name;
- ruleChainNode.targetRuleChainId = ruleChainConnection.targetRuleChainId.id;
- } else {
- ruleChainNode.name = "Unresolved";
- ruleChainNode.targetRuleChainId = null;
- ruleChainNode.error = $translate.instant('rulenode.invalid-target-rulechain');
- }
- ruleChainNodesMap[ruleChainConnection.additionalInfo.ruleChainNodeId] = ruleChainNode;
- vm.ruleChainModel.nodes.push(ruleChainNode);
- }
- sourceNode = nodes[ruleChainConnection.fromIndex];
- if (sourceNode) {
- connectors = vm.modelservice.nodes.getConnectorsByType(sourceNode, flowchartConstants.rightConnectorType);
- if (connectors && connectors.length) {
- sourceId = connectors[0].id;
- destId = ruleChainNode.connectors[0].id;
- edgeKey = sourceId + '_' + destId;
- var ruleChainEdge = ruleChainEdgeMap[edgeKey];
- if (!ruleChainEdge) {
- ruleChainEdge = {
- source: sourceId,
- destination: destId,
- label: ruleChainConnection.type,
- labels: [ruleChainConnection.type]
- };
- ruleChainEdgeMap[edgeKey] = ruleChainEdge;
- vm.ruleChainModel.edges.push(ruleChainEdge);
- } else {
- ruleChainEdge.label += ' / ' +ruleChainConnection.type;
- ruleChainEdge.labels.push(ruleChainConnection.type);
- }
- }
- }
- }
- }
- }
-
- if (vm.canvasControl.adjustCanvasSize) {
- vm.canvasControl.adjustCanvasSize(true);
- }
-
- vm.isDirty = false;
-
- updateRuleNodesHighlight();
-
- validate();
-
- $mdUtil.nextTick(() => {
- vm.ruleChainWatch = $scope.$watch('vm.ruleChainModel',
- function (newVal, oldVal) {
- if (!angular.equals(newVal, oldVal)) {
- validate();
- if (!vm.isDirty) {
- vm.isDirty = true;
- }
- }
- }, true
- );
- });
- }
-
- function updateRuleNodesHighlight() {
- for (var i = 0; i < vm.ruleChainModel.nodes.length; i++) {
- vm.ruleChainModel.nodes[i].highlighted = false;
- }
- if ($scope.searchConfig.searchText) {
- var res = $filter('filter')(vm.ruleChainModel.nodes, {name: $scope.searchConfig.searchText});
- if (res) {
- for (i = 0; i < res.length; i++) {
- res[i].highlighted = true;
- }
- }
- }
- }
-
- function validate() {
- $mdUtil.nextTick(() => {
- vm.isInvalid = false;
- for (var i = 0; i < vm.ruleChainModel.nodes.length; i++) {
- if (vm.ruleChainModel.nodes[i].error) {
- vm.isInvalid = true;
- }
- updateNodeErrorTooltip(vm.ruleChainModel.nodes[i]);
- }
- });
- }
-
- function saveRuleChain() {
- var saveRuleChainPromise;
- if (vm.isImport) {
- saveRuleChainPromise = ruleChainService.saveRuleChain(vm.ruleChain);
- } else {
- saveRuleChainPromise = $q.when(vm.ruleChain);
- }
- saveRuleChainPromise.then(
- (ruleChain) => {
- vm.ruleChain = ruleChain;
- var ruleChainMetaData = {
- ruleChainId: vm.ruleChain.id,
- nodes: [],
- connections: [],
- ruleChainConnections: []
- };
-
- var nodes = [];
-
- for (var i=0;i {
- vm.ruleChainMetaData = ruleChainMetaData;
- if (vm.isImport) {
- vm.isDirty = false;
- vm.isImport = false;
- $mdUtil.nextTick(() => {
- $state.go('home.ruleChains.ruleChain', {ruleChainId: vm.ruleChain.id.id});
- });
- } else {
- prepareRuleChain();
- }
- }
- );
- }
- );
- }
-
- function revertRuleChain() {
- prepareRuleChain();
- }
-
- function addRuleNode($event, ruleNode) {
-
- ruleNode.configuration = angular.copy(ruleNode.component.configurationDescriptor.nodeDefinition.defaultConfiguration);
-
- var ruleChainId = vm.ruleChain.id ? vm.ruleChain.id.id : null;
-
- vm.enableHotKeys = false;
-
- $mdDialog.show({
- controller: 'AddRuleNodeController',
- controllerAs: 'vm',
- templateUrl: addRuleNodeTemplate,
- parent: angular.element($document[0].body),
- locals: {ruleNode: ruleNode, ruleChainId: ruleChainId},
- fullscreen: true,
- targetEvent: $event
- }).then(function (ruleNode) {
- ruleNode.id = 'rule-chain-node-' + vm.nextNodeID++;
- ruleNode.connectors = [];
- if (ruleNode.component.configurationDescriptor.nodeDefinition.inEnabled) {
- ruleNode.connectors.push(
- {
- id: vm.nextConnectorID++,
- type: flowchartConstants.leftConnectorType
- }
- );
- }
- if (ruleNode.component.configurationDescriptor.nodeDefinition.outEnabled) {
- ruleNode.connectors.push(
- {
- id: vm.nextConnectorID++,
- type: flowchartConstants.rightConnectorType
- }
- );
- }
- vm.ruleChainModel.nodes.push(ruleNode);
- updateRuleNodesHighlight();
- vm.enableHotKeys = true;
- }, function () {
- vm.enableHotKeys = true;
- });
- }
-
- function addRuleNodeLink($event, link, labels, allowCustomLabels) {
- return $mdDialog.show({
- controller: 'AddRuleNodeLinkController',
- controllerAs: 'vm',
- templateUrl: addRuleNodeLinkTemplate,
- parent: angular.element($document[0].body),
- locals: {link: link, labels: labels, allowCustomLabels: allowCustomLabels},
- fullscreen: true,
- targetEvent: $event
- });
- }
-
- function objectsSelected() {
- return vm.modelservice.nodes.getSelectedNodes().length > 0 ||
- vm.modelservice.edges.getSelectedEdges().length > 0
- }
-
- function deleteSelected() {
- 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');
- }
-}
-
-/*@ngInject*/
-export function AddRuleNodeController($scope, $mdDialog, ruleNode, ruleChainId, helpLinks) {
-
- var vm = this;
-
- vm.helpLinks = helpLinks;
- vm.ruleNode = ruleNode;
- vm.ruleChainId = ruleChainId;
-
- vm.add = add;
- vm.cancel = cancel;
-
- function cancel() {
- $mdDialog.cancel();
- }
-
- function add() {
- $scope.theForm.$setPristine();
- $mdDialog.hide(vm.ruleNode);
- }
-}
-
-/*@ngInject*/
-export function AddRuleNodeLinkController($scope, $mdDialog, link, labels, allowCustomLabels, helpLinks) {
-
- var vm = this;
-
- vm.helpLinks = helpLinks;
- vm.link = link;
- vm.labels = labels;
- vm.allowCustomLabels = allowCustomLabels;
-
- vm.add = add;
- vm.cancel = cancel;
-
- function cancel() {
- $mdDialog.cancel();
- }
-
- function add() {
- $scope.theForm.$setPristine();
- $mdDialog.hide(vm.link);
- }
-}
diff --git a/ui/src/app/rulechain/rulechain.directive.js b/ui/src/app/rulechain/rulechain.directive.js
deleted file mode 100644
index a4951c2f8b..0000000000
--- a/ui/src/app/rulechain/rulechain.directive.js
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-/* eslint-disable import/no-unresolved, import/default */
-
-import ruleChainFieldsetTemplate from './rulechain-fieldset.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-/*@ngInject*/
-export default function RuleChainDirective($compile, $templateCache, $mdDialog, $document, $q, $translate, types, toast) {
- var linker = function (scope, element) {
- var template = $templateCache.get(ruleChainFieldsetTemplate);
- element.html(template);
-
- scope.onRuleChainIdCopied = function() {
- toast.showSuccess($translate.instant('rulechain.idCopiedMessage'), 750, angular.element(element).parent().parent(), 'bottom left');
- };
-
- $compile(element.contents())(scope);
- }
- return {
- restrict: "E",
- link: linker,
- scope: {
- ruleChain: '=',
- isEdit: '=',
- isReadOnly: '=',
- theForm: '=',
- onSetRootRuleChain: '&',
- onExportRuleChain: '&',
- onDeleteRuleChain: '&'
- }
- };
-}
diff --git a/ui/src/app/rulechain/rulechain.routes.js b/ui/src/app/rulechain/rulechain.routes.js
deleted file mode 100644
index 7bad80ebaa..0000000000
--- a/ui/src/app/rulechain/rulechain.routes.js
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-/* eslint-disable import/no-unresolved, import/default */
-
-import ruleNodeTemplate from './rulenode.tpl.html';
-import ruleChainsTemplate from './rulechains.tpl.html';
-import ruleChainTemplate from './rulechain.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-/*@ngInject*/
-export default function RuleChainRoutes($stateProvider, NodeTemplatePathProvider) {
-
- NodeTemplatePathProvider.setTemplatePath(ruleNodeTemplate);
-
- $stateProvider
- .state('home.ruleChains', {
- url: '/ruleChains',
- params: {'topIndex': 0},
- module: 'private',
- auth: ['SYS_ADMIN', 'TENANT_ADMIN'],
- views: {
- "content@home": {
- templateUrl: ruleChainsTemplate,
- controllerAs: 'vm',
- controller: 'RuleChainsController'
- }
- },
- data: {
- searchEnabled: true,
- pageTitle: 'rulechain.rulechains'
- },
- ncyBreadcrumb: {
- label: '{"icon": "settings_ethernet", "label": "rulechain.rulechains"}'
- }
- }).state('home.ruleChains.ruleChain', {
- url: '/:ruleChainId',
- reloadOnSearch: false,
- module: 'private',
- auth: ['SYS_ADMIN', 'TENANT_ADMIN'],
- views: {
- "content@home": {
- templateUrl: ruleChainTemplate,
- controller: 'RuleChainController',
- controllerAs: 'vm'
- }
- },
- resolve: {
- ruleChain:
- /*@ngInject*/
- function($stateParams, ruleChainService) {
- return ruleChainService.getRuleChain($stateParams.ruleChainId);
- },
- ruleChainMetaData:
- /*@ngInject*/
- function($stateParams, ruleChainService) {
- return ruleChainService.getRuleChainMetaData($stateParams.ruleChainId);
- },
- ruleNodeComponents:
- /*@ngInject*/
- function($stateParams, ruleChainService) {
- return ruleChainService.getRuleNodeComponents();
- }
- },
- data: {
- import: false,
- searchEnabled: true,
- pageTitle: 'rulechain.rulechain'
- },
- ncyBreadcrumb: {
- label: '{"icon": "settings_ethernet", "label": "{{ vm.ruleChain.name + (vm.ruleChain.root ? (\' (\' + (\'rulechain.root\' | translate) + \')\') : \'\') }}", "translate": "false"}'
- }
- }).state('home.ruleChains.importRuleChain', {
- url: '/ruleChain/import',
- reloadOnSearch: false,
- module: 'private',
- auth: ['SYS_ADMIN', 'TENANT_ADMIN'],
- views: {
- "content@home": {
- templateUrl: ruleChainTemplate,
- controller: 'RuleChainController',
- controllerAs: 'vm'
- }
- },
- params: {
- ruleChainImport: {}
- },
- resolve: {
- ruleChain:
- /*@ngInject*/
- function($stateParams) {
- return $stateParams.ruleChainImport.ruleChain;
- },
- ruleChainMetaData:
- /*@ngInject*/
- function($stateParams) {
- return $stateParams.ruleChainImport.metadata;
- },
- ruleNodeComponents:
- /*@ngInject*/
- function($stateParams, ruleChainService) {
- return ruleChainService.getRuleNodeComponents();
- }
- },
- data: {
- import: true,
- searchEnabled: true,
- pageTitle: 'rulechain.rulechain'
- },
- ncyBreadcrumb: {
- label: '{"icon": "settings_ethernet", "label": "{{ (\'rulechain.import\' | translate) + \': \'+ vm.ruleChain.name }}", "translate": "false"}'
- }
- });
-}
diff --git a/ui/src/app/rulechain/rulechain.scss b/ui/src/app/rulechain/rulechain.scss
deleted file mode 100644
index 21c417cbb5..0000000000
--- a/ui/src/app/rulechain/rulechain.scss
+++ /dev/null
@@ -1,561 +0,0 @@
-/**
- * Copyright © 2016-2020 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-rulechain {
- .tb-fullscreen-button-style {
- z-index: 1;
- }
-
- section.tb-header-buttons.tb-library-open {
- position: absolute;
- top: 0;
- left: 0;
- z-index: 1;
- pointer-events: none;
-
- .md-button.tb-btn-open-library {
- top: 0;
- left: 0;
- width: 36px;
- height: 36px;
- margin: 4px 0 0 4px;
- line-height: 36px;
- opacity: .5;
- }
- }
-
- .tb-rulechain-library {
- z-index: 1;
- width: 250px;
- min-width: 250px;
-
- md-toolbar {
- height: 48px;
- min-height: 48px;
-
- .md-toolbar-tools > .md-button:last-child {
- margin-right: 0;
- }
-
- .md-toolbar-tools {
- height: 48px;
- padding: 0 6px;
- font-size: 14px;
-
- .md-button.md-icon-button {
- margin: 0;
-
- &.tb-small {
- width: 32px;
- height: 32px;
- min-height: 32px;
- padding: 6px;
- line-height: 20px;
-
- md-icon {
- width: 20px;
- min-width: 20px;
- height: 20px;
- min-height: 20px;
- font-size: 20px;
- line-height: 20px;
- }
- }
- }
- }
- }
-
- .tb-rulechain-library-panel-group {
- overflow-x: hidden;
- overflow-y: auto;
-
- .tb-panel-title {
- min-width: 150px;
- user-select: none;
- }
-
- .fc-canvas {
- background: #f9f9f9;
- }
-
- md-icon.md-expansion-panel-icon {
- margin-right: 0;
- }
-
- md-expansion-panel-collapsed,
- .md-expansion-panel-header-container {
- position: static;
- background: #e6e6e6;
- border-color: #909090;
- }
-
- md-expansion-panel {
- &.md-open {
- margin-top: 0;
- margin-bottom: 0;
- }
- }
-
- md-expansion-panel-content {
- padding: 0;
- }
- }
- }
-
- .tb-rulechain-graph {
- z-index: 0;
- overflow: auto;
- }
-}
-
-#tb-rule-chain-context-menu {
- max-height: 404px;
- padding-top: 0;
- border-radius: 8px;
-
- .tb-context-menu-header {
- display: flex;
- flex-direction: row;
- height: 36px;
- min-height: 36px;
- padding: 8px 5px 5px;
- font-size: 14px;
-
- &.tb-rulechain {
- background-color: #aac7e4;
- }
-
- &.tb-link {
- background-color: #aac7e4;
- }
-
- md-icon {
- padding-right: 10px;
- padding-left: 2px;
- }
-
- .tb-context-menu-title {
- font-weight: 500;
- }
-
- .tb-context-menu-subtitle {
- font-size: 12px;
- }
- }
-}
-
-.fc-canvas {
- min-width: 100%;
- min-height: 100%;
- user-select: none;
- outline: none;
- -webkit-touch-callout: none;
-
- svg {
- display: block;
- }
-}
-
-.tb-rule-node,
-#tb-rule-chain-context-menu .tb-context-menu-header {
- &.tb-filter-type {
- background-color: #f1e861;
- }
-
- &.tb-enrichment-type {
- background-color: #cdf14e;
- }
-
- &.tb-transformation-type {
- background-color: #79cef1;
- }
-
- &.tb-action-type {
- background-color: #f1928f;
- }
-
- &.tb-external-type {
- background-color: #fbc766;
- }
-
- &.tb-rule-chain-type {
- background-color: #d6c4f1;
- }
-
- &.tb-unknown-type {
- background-color: #f16c29;
- }
-}
-
-.tb-rule-node {
- display: flex;
- flex-direction: row;
- min-width: 150px;
- max-width: 150px;
- height: 32px;
- min-height: 32px;
- max-height: 32px;
- padding: 5px 10px;
- font-size: 12px;
- line-height: 16px;
- color: #333;
- pointer-events: none;
- background-color: #f15b26;
- border: solid 1px #777;
- border-radius: 5px;
-
- &.tb-rule-node-highlighted:not(.tb-rule-node-invalid) {
- box-shadow: 0 0 10px 6px #51cbee;
-
- .tb-node-title {
- font-weight: 700;
- text-decoration: underline;
- }
- }
-
- &.tb-rule-node-invalid {
- box-shadow: 0 0 10px 6px #ff5c50;
- }
-
- &.tb-input-type {
- user-select: none;
- background-color: #a3eaa9;
- }
-
- md-icon {
- width: 20px;
- min-width: 20px;
- height: 20px;
- min-height: 20px;
- padding-right: 4px;
- font-size: 20px;
- }
-
- .tb-node-title {
- font-weight: 500;
- }
-
- .tb-node-type,
- .tb-node-title {
- overflow: hidden;
- text-overflow: ellipsis;
- white-space: nowrap;
- }
-}
-
-.fc-node {
- z-index: 1;
- border-radius: 8px;
- outline: none;
-
- &.fc-dragging {
- z-index: 10;
- }
-
- p {
- padding: 0 15px;
- text-align: center;
- }
-
- .fc-node-overlay {
- position: absolute;
- top: 0;
- right: 0;
- bottom: 0;
- left: 0;
- pointer-events: none;
- background-color: #000;
- border-radius: 5px;
- opacity: 0;
- }
-
- &.fc-hover {
- .fc-node-overlay {
- opacity: .25;
- }
- }
-
- &.fc-selected {
- .fc-node-overlay {
- opacity: .25;
- }
-
- &:not(.fc-edit) {
- margin: -3px;
- border: solid 3px #f00;
- }
- }
-}
-
-.fc-leftConnectors,
-.fc-rightConnectors {
- position: absolute;
- top: 0;
-
- z-index: 0;
-
- display: flex;
- flex-direction: column;
- height: 100%;
-
- .fc-magnet {
- align-items: center;
- }
-}
-
-.fc-leftConnectors {
- left: -20px;
-}
-
-.fc-rightConnectors {
- right: -20px;
-}
-
-.fc-magnet {
- display: flex;
- flex-grow: 1;
- justify-content: center;
- height: 60px;
-}
-
-.fc-connector {
- width: 14px;
- height: 14px;
- margin: 10px;
- pointer-events: all;
- background-color: #ccc;
- border: 1px solid #333;
- border-radius: 5px;
-}
-
-.fc-connector.fc-hover {
- background-color: #000;
-}
-
-.fc-arrow-marker {
- polygon {
- fill: #808080;
- stroke: #808080;
- }
-}
-
-.fc-arrow-marker-selected {
- polygon {
- fill: #f00;
- stroke: #f00;
- }
-}
-
-.fc-edge {
- outline: none;
- transition: stroke-width .2s;
- fill: transparent;
- stroke: #808080;
- stroke-width: 4;
-
- &.fc-selected {
- fill: transparent;
- stroke: #f00;
- stroke-width: 4;
- }
-
- &.fc-active {
- animation: dash 3s linear infinite;
- stroke-dasharray: 20;
- }
-
- &.fc-hover {
- fill: transparent;
- stroke: #808080;
- stroke-width: 6;
- }
-
- &.fc-dragging {
- pointer-events: none;
- }
-}
-
-.edge-endpoint {
- fill: #808080;
-}
-
-.fc-nodedelete {
- display: none;
- font-size: 18px;
-}
-
-.fc-nodeedit {
- display: none;
- font-size: 15px;
-}
-
-.fc-edit {
- .fc-nodedelete,
- .fc-nodeedit {
- position: absolute;
- display: block;
- width: 22px;
- height: 20px;
- padding-top: 2px;
- font-weight: 600;
- line-height: 20px;
- color: #fff;
- text-align: center;
- vertical-align: bottom;
- cursor: pointer;
- background: #f83e05;
- border: solid 2px #fff;
- border-radius: 50%;
- outline: none;
- }
-
- .fc-nodeedit {
- top: -24px;
- right: 16px;
- }
-
- .fc-nodedelete {
- top: -24px;
- right: -13px;
- }
-}
-
-.fc-noselect {
- user-select: none;
-}
-
-.fc-edge-label {
- position: absolute;
- transition: transform .2s;
- // opacity: 0.8;
-
- &.ng-leave {
- transition: 0s none;
- }
-
- &.fc-hover {
- transform: scale(1.25);
- }
-
- &.fc-selected {
- .fc-edge-label-text {
- span {
- font-weight: 600;
- color: #fff;
- background-color: #f00;
- border: solid #f00;
- }
- }
- }
-
- .fc-nodeedit {
- top: -30px;
- right: 14px;
- }
-
- .fc-nodedelete {
- top: -30px;
- right: -13px;
- }
-
- &:focus {
- outline: 0;
- }
-}
-
-.fc-edge-label-text {
- position: absolute;
- font-size: 14px;
- font-weight: 600;
- text-align: center;
- white-space: nowrap;
- transform: translate(-50%, -50%);
-
- span {
- padding: 3px 5px;
- color: #003a79;
- cursor: default;
- background-color: #fff;
- border: solid 2px #003a79;
- border-radius: 10px;
- }
-}
-
-.fc-select-rectangle {
- position: absolute;
- z-index: 2;
- background: rgba(20, 125, 255, .1);
- border: 2px dashed #5262ff;
-}
-
-@keyframes dash {
- from {
- stroke-dashoffset: 500;
- }
-}
-
-.tb-rule-node-tooltip,
-.tb-rule-node-help {
- color: #333;
-}
-
-.tb-rule-node-tooltip {
- max-width: 300px;
- font-size: 14px;
-
- &.tb-lib-tooltip {
- width: 300px;
- }
-}
-
-.tb-rule-node-help {
- font-size: 16px;
-}
-
-.tb-rule-node-error-tooltip {
- font-size: 16px;
- color: #ea0d0d;
-}
-
-.tb-rule-node-tooltip,
-.tb-rule-node-error-tooltip,
-.tb-rule-node-help {
- #tb-node-content {
- .tb-node-title {
- font-weight: 600;
- }
-
- .tb-node-description {
- font-style: italic;
- color: #555;
- }
-
- .tb-node-details {
- padding-top: 10px;
- padding-bottom: 10px;
- }
-
- code {
- padding: 0 3px 2px 3px;
- margin: 1px;
- font-size: 12px;
- color: #ad1625;
- white-space: nowrap;
- background-color: #f7f7f9;
- border: 1px solid #e1e1e8;
- border-radius: 2px;
- }
- }
-}
diff --git a/ui/src/app/rulechain/rulechain.tpl.html b/ui/src/app/rulechain/rulechain.tpl.html
deleted file mode 100644
index 52a7197e93..0000000000
--- a/ui/src/app/rulechain/rulechain.tpl.html
+++ /dev/null
@@ -1,254 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
- {{vm.types.ruleNodeType[typeId].icon}}
- {{vm.types.ruleNodeType[typeId].name}}
-
-
-
-
- {{vm.types.ruleNodeType[typeId].icon}}
- {{vm.types.ruleNodeType[typeId].name}}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
{{vm.editingRuleNode.component.name}}
-
-
{{vm.editingRuleNode.component.configurationDescriptor.nodeDefinition.description}}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/ui/src/app/rulechain/rulechains.controller.js b/ui/src/app/rulechain/rulechains.controller.js
deleted file mode 100644
index 4438e32f60..0000000000
--- a/ui/src/app/rulechain/rulechains.controller.js
+++ /dev/null
@@ -1,215 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-/* eslint-disable import/no-unresolved, import/default */
-
-import addRuleChainTemplate from './add-rulechain.tpl.html';
-import ruleChainCard from './rulechain-card.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-/*@ngInject*/
-export default function RuleChainsController(ruleChainService, userService, importExport, $state,
- $stateParams, $filter, $translate, $mdDialog, types) {
-
- var ruleChainActionsList = [
- {
- onAction: function ($event, item) {
- vm.grid.openItem($event, item);
- },
- name: function() { return $translate.instant('rulechain.details') },
- details: function() { return $translate.instant('rulechain.rulechain-details') },
- icon: "edit"
- },
- {
- onAction: function ($event, item) {
- exportRuleChain($event, item);
- },
- name: function() { $translate.instant('action.export') },
- details: function() { return $translate.instant('rulechain.export') },
- icon: "file_download"
- },
- {
- onAction: function ($event, item) {
- setRootRuleChain($event, item);
- },
- name: function() { return $translate.instant('rulechain.set-root') },
- details: function() { return $translate.instant('rulechain.set-root') },
- icon: "flag",
- isEnabled: isNonRootRuleChain
- },
- {
- onAction: function ($event, item) {
- vm.grid.deleteItem($event, item);
- },
- name: function() { return $translate.instant('action.delete') },
- details: function() { return $translate.instant('rulechain.delete') },
- icon: "delete",
- isEnabled: isNonRootRuleChain
- }
- ];
-
- var ruleChainAddItemActionsList = [
- {
- onAction: function ($event) {
- vm.grid.addItem($event);
- },
- name: function() { return $translate.instant('action.create') },
- details: function() { return $translate.instant('rulechain.create-new-rulechain') },
- icon: "insert_drive_file"
- },
- {
- onAction: function ($event) {
- importExport.importRuleChain($event).then(
- function(ruleChainImport) {
- $state.go('home.ruleChains.importRuleChain', {ruleChainImport:ruleChainImport});
- }
- );
- },
- name: function() { return $translate.instant('action.import') },
- details: function() { return $translate.instant('rulechain.import') },
- icon: "file_upload"
- }
- ];
-
- var vm = this;
-
- vm.types = types;
-
- vm.ruleChainGridConfig = {
-
- refreshParamsFunc: null,
-
- deleteItemTitleFunc: deleteRuleChainTitle,
- deleteItemContentFunc: deleteRuleChainText,
- deleteItemsTitleFunc: deleteRuleChainsTitle,
- deleteItemsActionTitleFunc: deleteRuleChainsActionTitle,
- deleteItemsContentFunc: deleteRuleChainsText,
-
- fetchItemsFunc: fetchRuleChains,
- saveItemFunc: saveRuleChain,
- clickItemFunc: openRuleChain,
- deleteItemFunc: deleteRuleChain,
-
- getItemTitleFunc: getRuleChainTitle,
- itemCardTemplateUrl: ruleChainCard,
- parentCtl: vm,
-
- actionsList: ruleChainActionsList,
- addItemActions: ruleChainAddItemActionsList,
-
- onGridInited: gridInited,
-
- addItemTemplateUrl: addRuleChainTemplate,
-
- addItemText: function() { return $translate.instant('rulechain.add-rulechain-text') },
- noItemsText: function() { return $translate.instant('rulechain.no-rulechains-text') },
- itemDetailsText: function() { return $translate.instant('rulechain.rulechain-details') },
- isSelectionEnabled: isNonRootRuleChain
- };
-
- if (angular.isDefined($stateParams.items) && $stateParams.items !== null) {
- vm.ruleChainGridConfig.items = $stateParams.items;
- }
-
- if (angular.isDefined($stateParams.topIndex) && $stateParams.topIndex > 0) {
- vm.ruleChainGridConfig.topIndex = $stateParams.topIndex;
- }
-
- vm.isRootRuleChain = isRootRuleChain;
- vm.isNonRootRuleChain = isNonRootRuleChain;
-
- vm.exportRuleChain = exportRuleChain;
- vm.setRootRuleChain = setRootRuleChain;
-
- function deleteRuleChainTitle(ruleChain) {
- return $translate.instant('rulechain.delete-rulechain-title', {ruleChainName: ruleChain.name});
- }
-
- function deleteRuleChainText() {
- return $translate.instant('rulechain.delete-rulechain-text');
- }
-
- function deleteRuleChainsTitle(selectedCount) {
- return $translate.instant('rulechain.delete-rulechains-title', {count: selectedCount}, 'messageformat');
- }
-
- function deleteRuleChainsActionTitle(selectedCount) {
- return $translate.instant('rulechain.delete-rulechains-action-title', {count: selectedCount}, 'messageformat');
- }
-
- function deleteRuleChainsText() {
- return $translate.instant('rulechain.delete-rulechains-text');
- }
-
- function gridInited(grid) {
- vm.grid = grid;
- }
-
- function fetchRuleChains(pageLink) {
- return ruleChainService.getRuleChains(pageLink);
- }
-
- function saveRuleChain(ruleChain) {
- return ruleChainService.saveRuleChain(ruleChain);
- }
-
- function openRuleChain($event, ruleChain) {
- if ($event) {
- $event.stopPropagation();
- }
- $state.go('home.ruleChains.ruleChain', {ruleChainId: ruleChain.id.id});
- }
-
- function deleteRuleChain(ruleChainId) {
- return ruleChainService.deleteRuleChain(ruleChainId);
- }
-
- function getRuleChainTitle(ruleChain) {
- return ruleChain ? ruleChain.name : '';
- }
-
- function isRootRuleChain(ruleChain) {
- return ruleChain && ruleChain.root;
- }
-
- function isNonRootRuleChain(ruleChain) {
- return ruleChain && !ruleChain.root;
- }
-
- function exportRuleChain($event, ruleChain) {
- $event.stopPropagation();
- importExport.exportRuleChain(ruleChain.id.id);
- }
-
- function setRootRuleChain($event, ruleChain) {
- $event.stopPropagation();
- var confirm = $mdDialog.confirm()
- .targetEvent($event)
- .title($translate.instant('rulechain.set-root-rulechain-title', {ruleChainName: ruleChain.name}))
- .htmlContent($translate.instant('rulechain.set-root-rulechain-text'))
- .ariaLabel($translate.instant('rulechain.set-root'))
- .cancel($translate.instant('action.no'))
- .ok($translate.instant('action.yes'));
- $mdDialog.show(confirm).then(function () {
- ruleChainService.setRootRuleChain(ruleChain.id.id).then(
- () => {
- vm.grid.refreshList();
- }
- );
- });
-
- }
-}
diff --git a/ui/src/app/rulechain/rulechains.tpl.html b/ui/src/app/rulechain/rulechains.tpl.html
deleted file mode 100644
index 9880ac0213..0000000000
--- a/ui/src/app/rulechain/rulechains.tpl.html
+++ /dev/null
@@ -1,78 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/ui/src/app/rulechain/rulenode-config.directive.js b/ui/src/app/rulechain/rulenode-config.directive.js
deleted file mode 100644
index a225253d73..0000000000
--- a/ui/src/app/rulechain/rulenode-config.directive.js
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-/* eslint-disable import/no-unresolved, import/default */
-
-import ruleNodeConfigTemplate from './rulenode-config.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-/*@ngInject*/
-export default function RuleNodeConfigDirective($compile, $templateCache, $injector, $translate) {
-
- var linker = function (scope, element, attrs, ngModelCtrl) {
- var template = $templateCache.get(ruleNodeConfigTemplate);
- element.html(template);
-
- scope.$watch('configuration', function (newVal, prevVal) {
- if (!angular.equals(newVal, prevVal)) {
- ngModelCtrl.$setViewValue(scope.configuration);
- }
- });
-
- ngModelCtrl.$render = function () {
- scope.configuration = ngModelCtrl.$viewValue;
- };
-
- scope.useDefinedDirective = function() {
- return scope.nodeDefinition &&
- scope.nodeDefinition.configDirective && !scope.definedDirectiveError;
- };
-
- scope.$watch('nodeDefinition', () => {
- if (scope.nodeDefinition) {
- validateDefinedDirective();
- }
- });
-
- function validateDefinedDirective() {
- if (scope.nodeDefinition.uiResourceLoadError && scope.nodeDefinition.uiResourceLoadError.length) {
- scope.definedDirectiveError = scope.nodeDefinition.uiResourceLoadError;
- } else {
- var definedDirective = scope.nodeDefinition.configDirective;
- if (definedDirective && definedDirective.length) {
- if (!$injector.has(definedDirective + 'Directive')) {
- scope.definedDirectiveError = $translate.instant('rulenode.directive-is-not-loaded', {directiveName: definedDirective});
- }
- }
- }
- }
-
- $compile(element.contents())(scope);
- };
-
- return {
- restrict: "E",
- require: "^ngModel",
- scope: {
- ruleNodeId:'=',
- nodeDefinition:'=',
- required:'=ngRequired',
- readonly:'=ngReadonly'
- },
- link: linker
- };
-
-}
diff --git a/ui/src/app/rulechain/rulenode-config.tpl.html b/ui/src/app/rulechain/rulenode-config.tpl.html
deleted file mode 100644
index 81a2408519..0000000000
--- a/ui/src/app/rulechain/rulenode-config.tpl.html
+++ /dev/null
@@ -1,32 +0,0 @@
-
-
-
-{{definedDirectiveError}}
-
-
diff --git a/ui/src/app/rulechain/rulenode-defined-config.directive.js b/ui/src/app/rulechain/rulenode-defined-config.directive.js
deleted file mode 100644
index 38072e80f5..0000000000
--- a/ui/src/app/rulechain/rulenode-defined-config.directive.js
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-const SNAKE_CASE_REGEXP = /[A-Z]/g;
-
-/*@ngInject*/
-export default function RuleNodeDefinedConfigDirective($compile) {
-
- var linker = function (scope, element, attrs, ngModelCtrl) {
-
- attrs.$observe('ruleNodeDirective', function() {
- loadTemplate();
- });
-
- scope.$watch('configuration', function (newVal, prevVal) {
- if (!angular.equals(newVal, prevVal)) {
- ngModelCtrl.$setViewValue(scope.configuration);
- }
- });
-
- ngModelCtrl.$render = function () {
- scope.configuration = ngModelCtrl.$viewValue;
- };
-
- function loadTemplate() {
- if (scope.ruleNodeConfigScope) {
- scope.ruleNodeConfigScope.$destroy();
- }
- var directive = snake_case(attrs.ruleNodeDirective, '-');
- var template = `<${directive} rule-node-id="ruleNodeId" ng-model="configuration" ng-required="required" ng-readonly="readonly">${directive}>`;
- element.html(template);
- scope.ruleNodeConfigScope = scope.$new();
- $compile(element.contents())(scope.ruleNodeConfigScope);
- }
-
- function snake_case(name, separator) {
- separator = separator || '_';
- return name.replace(SNAKE_CASE_REGEXP, function(letter, pos) {
- return (pos ? separator : '') + letter.toLowerCase();
- });
- }
- };
-
- return {
- restrict: "E",
- require: "^ngModel",
- scope: {
- ruleNodeId:'=',
- required:'=ngRequired',
- readonly:'=ngReadonly'
- },
- link: linker
- };
-
-}
diff --git a/ui/src/app/rulechain/rulenode-fieldset.tpl.html b/ui/src/app/rulechain/rulenode-fieldset.tpl.html
deleted file mode 100644
index 5a6f6039a7..0000000000
--- a/ui/src/app/rulechain/rulenode-fieldset.tpl.html
+++ /dev/null
@@ -1,64 +0,0 @@
-
-{{ 'rulenode.delete' | translate }}
-
-
-
-
diff --git a/ui/src/app/rulechain/rulenode.directive.js b/ui/src/app/rulechain/rulenode.directive.js
deleted file mode 100644
index 54e5e830cd..0000000000
--- a/ui/src/app/rulechain/rulenode.directive.js
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Copyright © 2016-2020 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 './rulenode.scss';
-
-/* eslint-disable import/no-unresolved, import/default */
-
-import ruleNodeFieldsetTemplate from './rulenode-fieldset.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-/*@ngInject*/
-export default function RuleNodeDirective($compile, $templateCache, ruleChainService, types) {
- var linker = function (scope, element) {
- var template = $templateCache.get(ruleNodeFieldsetTemplate);
- element.html(template);
-
- scope.types = types;
-
- scope.params = {
- targetRuleChainId: null
- };
-
- scope.$watch('ruleNode', function() {
- if (scope.ruleNode && scope.ruleNode.component.type == types.ruleNodeType.RULE_CHAIN.value) {
- scope.params.targetRuleChainId = scope.ruleNode.targetRuleChainId;
- watchTargetRuleChain();
- } else {
- if (scope.targetRuleChainWatch) {
- scope.targetRuleChainWatch();
- scope.targetRuleChainWatch = null;
- }
- }
- });
-
- function watchTargetRuleChain() {
- scope.targetRuleChainWatch = scope.$watch('params.targetRuleChainId',
- function(targetRuleChainId) {
- if (scope.ruleNode.targetRuleChainId != targetRuleChainId) {
- scope.ruleNode.targetRuleChainId = targetRuleChainId;
- if (targetRuleChainId) {
- ruleChainService.getRuleChain(targetRuleChainId).then(
- (ruleChain) => {
- scope.ruleNode.name = ruleChain.name;
- }
- );
- } else {
- scope.ruleNode.name = "";
- }
- }
- }
- );
- }
- $compile(element.contents())(scope);
- }
- return {
- restrict: "E",
- link: linker,
- scope: {
- ruleChainId: '=',
- ruleNode: '=',
- isEdit: '=',
- isReadOnly: '=',
- theForm: '=',
- onDeleteRuleNode: '&'
- }
- };
-}
diff --git a/ui/src/app/rulechain/rulenode.scss b/ui/src/app/rulechain/rulenode.scss
deleted file mode 100644
index b770224a51..0000000000
--- a/ui/src/app/rulechain/rulenode.scss
+++ /dev/null
@@ -1,27 +0,0 @@
-/**
- * Copyright © 2016-2020 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-rulenode {
- tb-json-object-edit.tb-rule-node-configuration-json {
- display: block;
- height: 300px;
- }
-}
-
-.tb-rulenode-directive-error {
- font-size: 13px;
- font-weight: 400;
- color: rgb(221, 44, 0);
-}
diff --git a/ui/src/app/rulechain/rulenode.tpl.html b/ui/src/app/rulechain/rulenode.tpl.html
deleted file mode 100644
index f58bcd8af8..0000000000
--- a/ui/src/app/rulechain/rulenode.tpl.html
+++ /dev/null
@@ -1,54 +0,0 @@
-
-
-
-
-
{{node.icon}}
-
-
- {{ node.component.name }}
- {{ node.name }}
-
-
-
-
-
-
-
-
- ×
-
-
diff --git a/ui/src/app/rulechain/script/node-script-test.controller.js b/ui/src/app/rulechain/script/node-script-test.controller.js
deleted file mode 100644
index 1fd8a79864..0000000000
--- a/ui/src/app/rulechain/script/node-script-test.controller.js
+++ /dev/null
@@ -1,176 +0,0 @@
-/*
- * Copyright © 2016-2020 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 './node-script-test.scss';
-
-import Split from 'split.js';
-
-import beautify from 'js-beautify';
-
-const js_beautify = beautify.js;
-
-/*@ngInject*/
-export default function NodeScriptTestController($scope, $mdDialog, $window, $document, $timeout,
- $q, $mdUtil, $translate, toast, types, utils,
- ruleChainService, onShowingCallback, msg, msgType, metadata,
- functionTitle, inputParams) {
-
- var vm = this;
-
- vm.types = types;
- vm.functionTitle = functionTitle;
- vm.inputParams = inputParams;
- vm.inputParams.msg = js_beautify(angular.toJson(msg), {indent_size: 4});
- vm.inputParams.metadata = metadata;
- vm.inputParams.msgType = msgType;
-
- vm.output = '';
-
- vm.test = test;
- vm.save = save;
- vm.cancel = cancel;
-
- $scope.$watch('theForm.metadataForm.$dirty', (newVal) => {
- if (newVal) {
- toast.hide();
- }
- });
-
- onShowingCallback.onShowed = () => {
- vm.nodeScriptTestDialogElement = angular.element('.tb-node-script-test-dialog');
- var w = vm.nodeScriptTestDialogElement.width();
- if (w > 0) {
- initSplitLayout();
- } else {
- $scope.$watch(
- function () {
- return vm.nodeScriptTestDialogElement[0].offsetWidth || parseInt(vm.nodeScriptTestDialogElement.css('width'), 10);
- },
- function (newSize) {
- if (newSize > 0) {
- initSplitLayout();
- }
- }
- );
- }
- };
-
- function onDividerDrag() {
- $scope.$broadcast('update-ace-editor-size');
- }
-
- function initSplitLayout() {
- if (!vm.layoutInited) {
- Split([angular.element('#top_panel', vm.nodeScriptTestDialogElement)[0], angular.element('#bottom_panel', vm.nodeScriptTestDialogElement)[0]], {
- sizes: [35, 65],
- gutterSize: 8,
- cursor: 'row-resize',
- direction: 'vertical',
- onDrag: function () {
- onDividerDrag()
- }
- });
-
- Split([angular.element('#top_left_panel', vm.nodeScriptTestDialogElement)[0], angular.element('#top_right_panel', vm.nodeScriptTestDialogElement)[0]], {
- sizes: [50, 50],
- gutterSize: 8,
- cursor: 'col-resize',
- onDrag: function () {
- onDividerDrag()
- }
- });
-
- Split([angular.element('#bottom_left_panel', vm.nodeScriptTestDialogElement)[0], angular.element('#bottom_right_panel', vm.nodeScriptTestDialogElement)[0]], {
- sizes: [50, 50],
- gutterSize: 8,
- cursor: 'col-resize',
- onDrag: function () {
- onDividerDrag()
- }
- });
-
- onDividerDrag();
-
- $scope.$applyAsync(function () {
- vm.layoutInited = true;
- var w = angular.element($window);
- $timeout(function () {
- w.triggerHandler('resize')
- });
- });
-
- }
- }
-
- function test() {
- testNodeScript().then(
- (output) => {
- vm.output = js_beautify(output, {indent_size: 4});
- }
- );
- }
-
- function checkInputParamErrors() {
- $scope.theForm.metadataForm.$setPristine();
- $scope.$broadcast('form-submit', 'validatePayload');
- if (!$scope.theForm.payloadForm.$valid) {
- return false;
- } else if (!$scope.theForm.metadataForm.$valid) {
- showMetadataError($translate.instant('rulenode.metadata-required'));
- return false;
- }
- return true;
- }
-
- function showMetadataError(error) {
- var toastParent = angular.element('#metadata-panel', vm.nodeScriptTestDialogElement);
- toast.showError(error, toastParent, 'bottom left');
- }
-
- function testNodeScript() {
- var deferred = $q.defer();
- if (checkInputParamErrors()) {
- $mdUtil.nextTick(() => {
- ruleChainService.testScript(vm.inputParams).then(
- (result) => {
- if (result.error) {
- toast.showError(result.error);
- deferred.reject();
- } else {
- deferred.resolve(result.output);
- }
- },
- () => {
- deferred.reject();
- }
- );
- });
- } else {
- deferred.reject();
- }
- return deferred.promise;
- }
-
- function cancel() {
- $mdDialog.cancel();
- }
-
- function save() {
- testNodeScript().then(() => {
- $scope.theForm.funcBodyForm.$setPristine();
- $mdDialog.hide(vm.inputParams.script);
- });
- }
-}
diff --git a/ui/src/app/rulechain/script/node-script-test.scss b/ui/src/app/rulechain/script/node-script-test.scss
deleted file mode 100644
index 58da7fbf3b..0000000000
--- a/ui/src/app/rulechain/script/node-script-test.scss
+++ /dev/null
@@ -1,120 +0,0 @@
-/**
- * Copyright © 2016-2020 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";
-
-@import "~compass-sass-mixins/lib/compass";
-
-md-dialog.tb-node-script-test-dialog {
- &.md-dialog-fullscreen {
- width: 100%;
- min-width: 100%;
- max-width: 100%;
- height: 100%;
- min-height: 100%;
- max-height: 100%;
- border-radius: 0;
- }
-
- .tb-split {
- box-sizing: border-box;
- overflow-x: hidden;
- overflow-y: auto;
- }
-
- .ace_editor {
- font-size: 14px !important;
- }
-
- .tb-content {
- padding-top: 5px;
- padding-left: 5px;
- border: 1px solid #c0c0c0;
- }
-
- .gutter {
- background-color: #eee;
-
- background-repeat: no-repeat;
- background-position: 50%;
- }
-
- .gutter.gutter-horizontal {
- cursor: col-resize;
- background-image: url("../../../../node_modules/split.js/grips/vertical.png");
- }
-
- .gutter.gutter-vertical {
- cursor: row-resize;
- background-image: url("../../../../node_modules/split.js/grips/horizontal.png");
- }
-
- .tb-split.tb-split-horizontal,
- .gutter.gutter-horizontal {
- float: left;
- height: 100%;
- }
-
- .tb-split.tb-split-vertical {
- display: flex;
-
- .tb-split.tb-content {
- height: 100%;
- }
- }
-
- div.tb-editor-area-title-panel {
- position: absolute;
- top: 13px;
- right: 40px;
- z-index: 5;
- font-size: .8rem;
- font-weight: 500;
-
- &.tb-js-function {
- right: 80px;
- }
-
- label {
- padding: 4px;
- color: #00acc1;
- text-transform: uppercase;
- background: rgba(220, 220, 220, .35);
- border-radius: 5px;
- }
-
- .md-button {
- min-width: 32px;
- min-height: 15px;
- padding: 4px;
- margin: 0;
- font-size: .8rem;
- line-height: 15px;
- color: #7b7b7b;
- background: rgba(220, 220, 220, .35);
- }
- }
-
- .tb-resize-container {
- position: relative;
- width: 100%;
- height: 100%;
- overflow-y: auto;
-
- .ace_editor {
- height: 100%;
- }
- }
-}
diff --git a/ui/src/app/rulechain/script/node-script-test.service.js b/ui/src/app/rulechain/script/node-script-test.service.js
deleted file mode 100644
index ee6eea8378..0000000000
--- a/ui/src/app/rulechain/script/node-script-test.service.js
+++ /dev/null
@@ -1,139 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-/* eslint-disable import/no-unresolved, import/default */
-
-import nodeScriptTestTemplate from './node-script-test.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-/*@ngInject*/
-export default function NodeScriptTest($q, $mdDialog, $document, ruleChainService) {
-
- var service = {
- testNodeScript: testNodeScript
- };
-
- return service;
-
- function testNodeScript($event, script, scriptType, functionTitle, functionName, argNames, ruleNodeId) {
- var deferred = $q.defer();
- if ($event) {
- $event.stopPropagation();
- }
-
- var msg, metadata, msgType;
- if (ruleNodeId) {
- ruleChainService.getLatestRuleNodeDebugInput(ruleNodeId).then(
- (debugIn) => {
- if (debugIn) {
- if (debugIn.data) {
- msg = angular.fromJson(debugIn.data);
- }
- if (debugIn.metadata) {
- metadata = angular.fromJson(debugIn.metadata);
- }
- msgType = debugIn.msgType;
- }
- openTestScriptDialog($event, script, scriptType, functionTitle,
- functionName, argNames, msg, metadata, msgType).then(
- (script) => {
- deferred.resolve(script);
- },
- () => {
- deferred.reject();
- }
- );
- },
- () => {
- deferred.reject();
- }
- );
- } else {
- openTestScriptDialog($event, script, scriptType, functionTitle,
- functionName, argNames).then(
- (script) => {
- deferred.resolve(script);
- },
- () => {
- deferred.reject();
- }
- );
- }
- return deferred.promise;
- }
-
- function openTestScriptDialog($event, script, scriptType, functionTitle, functionName, argNames, msg, metadata, msgType) {
- var deferred = $q.defer();
- if (!msg) {
- msg = {
- temperature: 22.4,
- humidity: 78
- };
- }
- if (!metadata) {
- metadata = {
- deviceType: "default",
- deviceName: "Test Device",
- ts: new Date().getTime() + ""
- };
- }
- if (!msgType) {
- msgType = "POST_TELEMETRY_REQUEST";
- }
-
- var onShowingCallback = {
- onShowed: () => {
- }
- };
-
- var inputParams = {
- script: script,
- scriptType: scriptType,
- functionName: functionName,
- argNames: argNames
- };
-
- $mdDialog.show({
- controller: 'NodeScriptTestController',
- controllerAs: 'vm',
- templateUrl: nodeScriptTestTemplate,
- parent: angular.element($document[0].body),
- locals: {
- msg: msg,
- metadata: metadata,
- msgType: msgType,
- functionTitle: functionTitle,
- inputParams: inputParams,
- onShowingCallback: onShowingCallback
- },
- fullscreen: true,
- multiple: true,
- targetEvent: $event,
- onComplete: () => {
- onShowingCallback.onShowed();
- }
- }).then(
- (script) => {
- deferred.resolve(script);
- },
- () => {
- deferred.reject();
- }
- );
- return deferred.promise;
- }
-
-}
\ No newline at end of file
diff --git a/ui/src/app/rulechain/script/node-script-test.tpl.html b/ui/src/app/rulechain/script/node-script-test.tpl.html
deleted file mode 100644
index 426cdb22f8..0000000000
--- a/ui/src/app/rulechain/script/node-script-test.tpl.html
+++ /dev/null
@@ -1,118 +0,0 @@
-
-
-
-
diff --git a/ui/src/app/services/clipboard.service.js b/ui/src/app/services/clipboard.service.js
deleted file mode 100644
index f44d57d3fb..0000000000
--- a/ui/src/app/services/clipboard.service.js
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-export default angular.module('thingsboard.clipboard', [])
- .factory('clipboardService', ClipboardService)
- .name;
-
-/*@ngInject*/
-function ClipboardService($q) {
-
- var fakeHandler, fakeHandlerCallback, fakeElem;
-
- var service = {
- copyToClipboard: copyToClipboard
- };
-
- return service;
-
- /* eslint-disable */
- function copyToClipboard(trigger, text) {
- var deferred = $q.defer();
- const isRTL = document.documentElement.getAttribute('dir') == 'rtl';
- removeFake();
- fakeHandlerCallback = () => removeFake();
- fakeHandler = document.body.addEventListener('click', fakeHandlerCallback) || true;
- fakeElem = document.createElement('textarea');
- fakeElem.style.fontSize = '12pt';
- fakeElem.style.border = '0';
- fakeElem.style.padding = '0';
- fakeElem.style.margin = '0';
- fakeElem.style.position = 'absolute';
- fakeElem.style[ isRTL ? 'right' : 'left' ] = '-9999px';
- let yPosition = window.pageYOffset || document.documentElement.scrollTop;
- fakeElem.style.top = `${yPosition}px`;
- fakeElem.setAttribute('readonly', '');
- fakeElem.value = text;
- document.body.appendChild(fakeElem);
- var selectedText = select(fakeElem);
-
- let succeeded;
- try {
- succeeded = document.execCommand('copy');
- }
- catch (err) {
- succeeded = false;
- }
- if (trigger) {
- trigger.focus();
- }
- window.getSelection().removeAllRanges();
- removeFake();
- if (succeeded) {
- deferred.resolve(selectedText);
- } else {
- deferred.reject();
- }
- return deferred.promise;
- }
-
- function removeFake() {
- if (fakeHandler) {
- document.body.removeEventListener('click', fakeHandlerCallback);
- fakeHandler = null;
- fakeHandlerCallback = null;
- }
- if (fakeElem) {
- document.body.removeChild(fakeElem);
- fakeElem = null;
- }
- }
-
- function select(element) {
- var selectedText;
-
- if (element.nodeName === 'SELECT') {
- element.focus();
-
- selectedText = element.value;
- }
- else if (element.nodeName === 'INPUT' || element.nodeName === 'TEXTAREA') {
- var isReadOnly = element.hasAttribute('readonly');
-
- if (!isReadOnly) {
- element.setAttribute('readonly', '');
- }
-
- element.select();
- element.setSelectionRange(0, element.value.length);
-
- if (!isReadOnly) {
- element.removeAttribute('readonly');
- }
-
- selectedText = element.value;
- }
- else {
- if (element.hasAttribute('contenteditable')) {
- element.focus();
- }
-
- var selection = window.getSelection();
- var range = document.createRange();
-
- range.selectNodeContents(element);
- selection.removeAllRanges();
- selection.addRange(range);
-
- selectedText = selection.toString();
- }
-
- return selectedText;
- }
-
- /* eslint-enable */
-
-}
\ No newline at end of file
diff --git a/ui/src/app/services/error-toast.tpl.html b/ui/src/app/services/error-toast.tpl.html
deleted file mode 100644
index fb9fb3a775..0000000000
--- a/ui/src/app/services/error-toast.tpl.html
+++ /dev/null
@@ -1,25 +0,0 @@
-
-
-
-
-
- {{ 'action.close' | translate }}
-
-
-
diff --git a/ui/src/app/services/info-toast.tpl.html b/ui/src/app/services/info-toast.tpl.html
deleted file mode 100644
index a1ec3693ae..0000000000
--- a/ui/src/app/services/info-toast.tpl.html
+++ /dev/null
@@ -1,25 +0,0 @@
-
-
-
-
-
- {{ 'action.close' | translate }}
-
-
-
diff --git a/ui/src/app/services/item-buffer.service.js b/ui/src/app/services/item-buffer.service.js
deleted file mode 100644
index 2bca07ef71..0000000000
--- a/ui/src/app/services/item-buffer.service.js
+++ /dev/null
@@ -1,412 +0,0 @@
-/*
- * Copyright © 2016-2020 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 angularStorage from 'angular-storage';
-
-export default angular.module('thingsboard.itembuffer', [angularStorage])
- .factory('itembuffer', ItemBuffer)
- .factory('bufferStore', function(store) {
- var newStore = store.getNamespacedStore('tbBufferStore', null, null, false);
- return newStore;
- })
- .name;
-
-/*@ngInject*/
-function ItemBuffer($q, bufferStore, types, utils, dashboardUtils, ruleChainService) {
-
- const WIDGET_ITEM = "widget_item";
- const WIDGET_REFERENCE = "widget_reference";
- const RULE_NODES = "rule_nodes";
-
- var service = {
- prepareWidgetItem: prepareWidgetItem,
- copyWidget: copyWidget,
- copyWidgetReference: copyWidgetReference,
- hasWidget: hasWidget,
- canPasteWidgetReference: canPasteWidgetReference,
- pasteWidget: pasteWidget,
- pasteWidgetReference: pasteWidgetReference,
- addWidgetToDashboard: addWidgetToDashboard,
- copyRuleNodes: copyRuleNodes,
- hasRuleNodes: hasRuleNodes,
- pasteRuleNodes: pasteRuleNodes
- }
-
- return service;
-
- /**
- aliasesInfo {
- datasourceAliases: {
- datasourceIndex: {
- alias: "...",
- filter: "..."
- }
- }
- targetDeviceAliases: {
- targetDeviceAliasIndex: {
- alias: "...",
- filter: "..."
- }
- }
- ....
- }
- **/
-
- function prepareAliasInfo(entityAlias) {
- return {
- alias: entityAlias.alias,
- filter: entityAlias.filter
- };
- }
-
- function getOriginalColumns(dashboard, sourceState, sourceLayout) {
- var originalColumns = 24;
- var gridSettings = null;
- var state = dashboard.configuration.states[sourceState];
- var layoutCount = Object.keys(state.layouts).length;
- if (state) {
- var layout = state.layouts[sourceLayout];
- if (layout) {
- gridSettings = layout.gridSettings;
-
- }
- }
- if (gridSettings &&
- gridSettings.columns) {
- originalColumns = gridSettings.columns;
- }
- originalColumns = originalColumns * layoutCount;
- return originalColumns;
- }
-
- function getOriginalSize(dashboard, sourceState, sourceLayout, widget) {
- var layout = dashboard.configuration.states[sourceState].layouts[sourceLayout];
- var widgetLayout = layout.widgets[widget.id];
- return {
- sizeX: widgetLayout.sizeX,
- sizeY: widgetLayout.sizeY
- }
- }
-
- function prepareWidgetItem(dashboard, sourceState, sourceLayout, widget) {
- var aliasesInfo = {
- datasourceAliases: {},
- targetDeviceAliases: {}
- };
- var originalColumns = getOriginalColumns(dashboard, sourceState, sourceLayout);
- var originalSize = getOriginalSize(dashboard, sourceState, sourceLayout, widget);
- if (widget.config && dashboard.configuration
- && dashboard.configuration.entityAliases) {
- var entityAlias;
- if (widget.config.datasources) {
- for (var i=0;i
-
-
-
-
- {{ 'action.close' | translate }}
-
-
-
diff --git a/ui/src/app/services/toast.controller.js b/ui/src/app/services/toast.controller.js
deleted file mode 100644
index c64621446b..0000000000
--- a/ui/src/app/services/toast.controller.js
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-/*@ngInject*/
-export default function ToastController($mdToast, message) {
- var vm = this;
- vm.message = message;
-
- vm.closeToast = closeToast;
-
- function closeToast() {
- $mdToast.hide();
- }
-
-}
diff --git a/ui/src/app/services/toast.js b/ui/src/app/services/toast.js
deleted file mode 100644
index 8fafc2caa4..0000000000
--- a/ui/src/app/services/toast.js
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright © 2016-2020 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 './toast.scss';
-
-import Toast from './toast.service';
-import ToastController from './toast.controller';
-
-export default angular.module('thingsboard.toast', [])
- .factory('toast', Toast)
- .controller('ToastController', ToastController)
- .name;
diff --git a/ui/src/app/services/toast.scss b/ui/src/app/services/toast.scss
deleted file mode 100644
index a4b4f807ca..0000000000
--- a/ui/src/app/services/toast.scss
+++ /dev/null
@@ -1,35 +0,0 @@
-/**
- * Copyright © 2016-2020 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.
- */
-md-toast.tb-info-toast .md-toast-content {
- height: 100%;
- max-height: 100%;
- padding: 18px;
- font-size: 18px;
-}
-
-md-toast.tb-success-toast .md-toast-content {
- height: 100%;
- max-height: 100%;
- font-size: 18px !important;
- background-color: #008000;
-}
-
-md-toast.tb-error-toast .md-toast-content {
- height: 100%;
- max-height: 100%;
- font-size: 18px !important;
- background-color: #800000;
-}
diff --git a/ui/src/app/services/toast.service.js b/ui/src/app/services/toast.service.js
deleted file mode 100644
index 963298c2b1..0000000000
--- a/ui/src/app/services/toast.service.js
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-/* eslint-disable import/no-unresolved, import/default */
-
-import infoToast from './info-toast.tpl.html';
-import successToast from './success-toast.tpl.html';
-import errorToast from './error-toast.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-/*@ngInject*/
-export default function Toast($mdToast, $document) {
-
- var showing = false;
-
- var service = {
- showInfo: showInfo,
- showSuccess: showSuccess,
- showError: showError,
- hide: hide
- }
-
- return service;
-
- function showInfo(infoMessage, delay, toastParent, position) {
- showMessage(infoToast, infoMessage, delay, toastParent, position);
- }
-
- function showSuccess(successMessage, delay, toastParent, position) {
- showMessage(successToast, successMessage, delay, toastParent, position);
- }
-
- function showMessage(templateUrl, message, delay, toastParent, position) {
- if (!toastParent) {
- toastParent = angular.element($document[0].getElementById('toast-parent'));
- }
- if (!position) {
- position = 'top left';
- }
- $mdToast.show({
- hideDelay: delay || 0,
- position: position,
- controller: 'ToastController',
- controllerAs: 'vm',
- templateUrl: templateUrl,
- locals: {message: message},
- parent: toastParent
- });
- }
-
- function showError(errorMessage, toastParent, position) {
- if (!showing) {
- if (!toastParent) {
- toastParent = angular.element($document[0].getElementById('toast-parent'));
- }
- if (!position) {
- position = 'top left';
- }
- showing = true;
- $mdToast.show({
- hideDelay: 0,
- position: position,
- controller: 'ToastController',
- controllerAs: 'vm',
- templateUrl: errorToast,
- locals: {message: errorMessage},
- parent: toastParent
- }).then(function hide() {
- showing = false;
- }, function cancel() {
- showing = false;
- });
- }
- }
-
- function hide() {
- if (showing) {
- $mdToast.hide();
- }
- }
-
-}
\ No newline at end of file
diff --git a/ui/src/app/tenant/add-tenant.tpl.html b/ui/src/app/tenant/add-tenant.tpl.html
deleted file mode 100644
index 6b86bdadac..0000000000
--- a/ui/src/app/tenant/add-tenant.tpl.html
+++ /dev/null
@@ -1,48 +0,0 @@
-
-
-
-
diff --git a/ui/src/app/tenant/index.js b/ui/src/app/tenant/index.js
deleted file mode 100644
index 60cd754b25..0000000000
--- a/ui/src/app/tenant/index.js
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Copyright © 2016-2020 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 uiRouter from 'angular-ui-router';
-import thingsboardGrid from '../components/grid.directive';
-import thingsboardApiTenant from '../api/tenant.service';
-import thingsboardContact from '../components/contact.directive';
-import thingsboardContactShort from '../components/contact-short.filter';
-
-import TenantRoutes from './tenant.routes';
-import TenantController from './tenant.controller';
-import TenantDirective from './tenant.directive';
-
-export default angular.module('thingsboard.tenant', [
- uiRouter,
- thingsboardGrid,
- thingsboardApiTenant,
- thingsboardContact,
- thingsboardContactShort
-])
- .config(TenantRoutes)
- .controller('TenantController', TenantController)
- .directive('tbTenant', TenantDirective)
- .name;
diff --git a/ui/src/app/tenant/tenant-card.tpl.html b/ui/src/app/tenant/tenant-card.tpl.html
deleted file mode 100644
index 0a9a51549d..0000000000
--- a/ui/src/app/tenant/tenant-card.tpl.html
+++ /dev/null
@@ -1,18 +0,0 @@
-
-{{ item | contactShort }}
\ No newline at end of file
diff --git a/ui/src/app/tenant/tenant-fieldset.tpl.html b/ui/src/app/tenant/tenant-fieldset.tpl.html
deleted file mode 100644
index b75ea30f06..0000000000
--- a/ui/src/app/tenant/tenant-fieldset.tpl.html
+++ /dev/null
@@ -1,64 +0,0 @@
-
-{{
- 'tenant.manage-tenant-admins' | translate }}
-
-{{ 'tenant.delete'
- | translate }}
-
-
-
-
-
- tenant.copyId
-
-
-
-
-
-
diff --git a/ui/src/app/tenant/tenant.controller.js b/ui/src/app/tenant/tenant.controller.js
deleted file mode 100644
index 00b4fcd869..0000000000
--- a/ui/src/app/tenant/tenant.controller.js
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-/* eslint-disable import/no-unresolved, import/default */
-
-import addTenantTemplate from './add-tenant.tpl.html';
-import tenantCard from './tenant-card.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-/*@ngInject*/
-export default function TenantController(tenantService, $state, $stateParams, $translate, types) {
-
- var tenantActionsList = [
- {
- onAction: function ($event, item) {
- openTenantUsers($event, item);
- },
- name: function() { return $translate.instant('tenant.admins') },
- details: function() { return $translate.instant('tenant.manage-tenant-admins') },
- icon: "account_circle"
- },
- {
- onAction: function ($event, item) {
- vm.grid.deleteItem($event, item);
- },
- name: function() { return $translate.instant('action.delete') },
- details: function() { return $translate.instant('tenant.delete') },
- icon: "delete"
- }
- ];
-
- var vm = this;
-
- vm.types = types;
-
- vm.tenantGridConfig = {
-
- refreshParamsFunc: null,
-
- deleteItemTitleFunc: deleteTenantTitle,
- deleteItemContentFunc: deleteTenantText,
- deleteItemsTitleFunc: deleteTenantsTitle,
- deleteItemsActionTitleFunc: deleteTenantsActionTitle,
- deleteItemsContentFunc: deleteTenantsText,
-
- fetchItemsFunc: fetchTenants,
- saveItemFunc: saveTenant,
- deleteItemFunc: deleteTenant,
-
- getItemTitleFunc: getTenantTitle,
-
- itemCardTemplateUrl: tenantCard,
-
- actionsList: tenantActionsList,
-
- onGridInited: gridInited,
-
- addItemTemplateUrl: addTenantTemplate,
-
- addItemText: function() { return $translate.instant('tenant.add-tenant-text') },
- noItemsText: function() { return $translate.instant('tenant.no-tenants-text') },
- itemDetailsText: function() { return $translate.instant('tenant.tenant-details') }
- };
-
- if (angular.isDefined($stateParams.items) && $stateParams.items !== null) {
- vm.tenantGridConfig.items = $stateParams.items;
- }
-
- if (angular.isDefined($stateParams.topIndex) && $stateParams.topIndex > 0) {
- vm.tenantGridConfig.topIndex = $stateParams.topIndex;
- }
-
- vm.openTenantUsers = openTenantUsers;
-
- function deleteTenantTitle(tenant) {
- return $translate.instant('tenant.delete-tenant-title', {tenantTitle: tenant.title});
- }
-
- function deleteTenantText() {
- return $translate.instant('tenant.delete-tenant-text');
- }
-
- function deleteTenantsTitle(selectedCount) {
- return $translate.instant('tenant.delete-tenants-title', {count: selectedCount}, 'messageformat');
- }
-
- function deleteTenantsActionTitle(selectedCount) {
- return $translate.instant('tenant.delete-tenants-action-title', {count: selectedCount}, 'messageformat');
- }
-
- function deleteTenantsText() {
- return $translate.instant('tenant.delete-tenants-text');
- }
-
- function gridInited(grid) {
- vm.grid = grid;
- }
-
- function fetchTenants(pageLink) {
- return tenantService.getTenants(pageLink);
- }
-
- function saveTenant(tenant) {
- return tenantService.saveTenant(tenant);
- }
-
- function deleteTenant(tenantId) {
- return tenantService.deleteTenant(tenantId);
- }
-
- function getTenantTitle(tenant) {
- return tenant ? tenant.title : '';
- }
-
- function openTenantUsers($event, tenant) {
- if ($event) {
- $event.stopPropagation();
- }
- $state.go('home.tenants.users', {tenantId: tenant.id.id});
- }
-}
diff --git a/ui/src/app/tenant/tenant.directive.js b/ui/src/app/tenant/tenant.directive.js
deleted file mode 100644
index 2dcee6ebfe..0000000000
--- a/ui/src/app/tenant/tenant.directive.js
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-/* eslint-disable import/no-unresolved, import/default */
-
-import tenantFieldsetTemplate from './tenant-fieldset.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-/*@ngInject*/
-export default function TenantDirective($compile, $templateCache, $translate, toast) {
- var linker = function (scope, element) {
- var template = $templateCache.get(tenantFieldsetTemplate);
- element.html(template);
-
- scope.onTenantIdCopied = function() {
- toast.showSuccess($translate.instant('tenant.idCopiedMessage'), 750, angular.element(element).parent().parent(), 'bottom left');
- };
-
- $compile(element.contents())(scope);
- }
- return {
- restrict: "E",
- link: linker,
- scope: {
- tenant: '=',
- isEdit: '=',
- theForm: '=',
- onManageUsers: '&',
- onDeleteTenant: '&'
- }
- };
-}
diff --git a/ui/src/app/tenant/tenant.routes.js b/ui/src/app/tenant/tenant.routes.js
deleted file mode 100644
index c4993ac51c..0000000000
--- a/ui/src/app/tenant/tenant.routes.js
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-/* eslint-disable import/no-unresolved, import/default */
-
-import tenantsTemplate from './tenants.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-/*@ngInject*/
-export default function TenantRoutes($stateProvider) {
-
- $stateProvider
- .state('home.tenants', {
- url: '/tenants',
- params: {'topIndex': 0},
- module: 'private',
- auth: ['SYS_ADMIN'],
- views: {
- "content@home": {
- templateUrl: tenantsTemplate,
- controllerAs: 'vm',
- controller: 'TenantController'
- }
- },
- data: {
- searchEnabled: true,
- pageTitle: 'tenant.tenants'
- },
- ncyBreadcrumb: {
- label: '{"icon": "supervisor_account", "label": "tenant.tenants"}'
- }
- });
-}
diff --git a/ui/src/app/tenant/tenants.tpl.html b/ui/src/app/tenant/tenants.tpl.html
deleted file mode 100644
index 563e8103ce..0000000000
--- a/ui/src/app/tenant/tenants.tpl.html
+++ /dev/null
@@ -1,67 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/ui/src/app/url.handler.js b/ui/src/app/url.handler.js
deleted file mode 100644
index 3451aded38..0000000000
--- a/ui/src/app/url.handler.js
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-export default function UrlHandler($injector, $location) {
- var userService = $injector.get('userService');
- if (userService.isUserLoaded() === true) {
- userService.gotoDefaultPlace();
- } else {
- var $rootScope = $injector.get('$rootScope');
- if ($rootScope.userLoadedHandle) {
- $rootScope.userLoadedHandle();
- }
- $rootScope.userLoadedHandle = $rootScope.$on('userLoaded', function () {
- $rootScope.userLoadedHandle();
- UrlHandler($injector, $location);
- });
- }
-}
\ No newline at end of file
diff --git a/ui/src/app/user/activation-link.controller.js b/ui/src/app/user/activation-link.controller.js
deleted file mode 100644
index 92a8893d2c..0000000000
--- a/ui/src/app/user/activation-link.controller.js
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-/*@ngInject*/
-export default function ActivationLinkDialogController($mdDialog, $translate, toast, activationLink) {
-
- var vm = this;
-
- vm.activationLink = activationLink;
-
- vm.onActivationLinkCopied = onActivationLinkCopied;
- vm.close = close;
-
- function onActivationLinkCopied(){
- toast.showSuccess($translate.instant('user.activation-link-copied-message'), 750, angular.element('#activation-link-dialog-content'), 'bottom left');
- }
-
- function close() {
- $mdDialog.hide();
- }
-
-}
\ No newline at end of file
diff --git a/ui/src/app/user/activation-link.dialog.tpl.html b/ui/src/app/user/activation-link.dialog.tpl.html
deleted file mode 100644
index e932ceffbb..0000000000
--- a/ui/src/app/user/activation-link.dialog.tpl.html
+++ /dev/null
@@ -1,55 +0,0 @@
-
-
-
-
diff --git a/ui/src/app/user/add-user.controller.js b/ui/src/app/user/add-user.controller.js
deleted file mode 100644
index 095d765a28..0000000000
--- a/ui/src/app/user/add-user.controller.js
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-/* eslint-disable import/no-unresolved, import/default */
-
-import activationLinkDialogTemplate from './activation-link.dialog.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-
-/*@ngInject*/
-export default function AddUserController($scope, $mdDialog, $state, $stateParams, $document, $q, types, userService, saveItemFunction, helpLinks) {
-
- var vm = this;
-
- var tenantId = $stateParams.tenantId;
- var customerId = $stateParams.customerId;
- var usersType = $state.$current.data.usersType;
-
- vm.helpLinks = helpLinks;
- vm.item = {};
-
- vm.activationMethods = [
- {
- value: 'displayActivationLink',
- name: 'user.display-activation-link'
- },
- {
- value: 'sendActivationMail',
- name: 'user.send-activation-mail'
- }
- ];
-
- vm.userActivationMethod = 'displayActivationLink';
-
- vm.add = add;
- vm.cancel = cancel;
-
- function cancel() {
- $mdDialog.cancel();
- }
-
- function add($event) {
- var sendActivationMail = false;
- if (vm.userActivationMethod == 'sendActivationMail') {
- sendActivationMail = true;
- }
- if (usersType === 'tenant') {
- vm.item.authority = "TENANT_ADMIN";
- vm.item.tenantId = {
- entityType: types.entityType.tenant,
- id: tenantId
- };
- } else if (usersType === 'customer') {
- vm.item.authority = "CUSTOMER_USER";
- vm.item.customerId = {
- entityType: types.entityType.customer,
- id: customerId
- };
- }
- userService.saveUser(vm.item, sendActivationMail).then(function success(item) {
- vm.item = item;
- $scope.theForm.$setPristine();
- if (vm.userActivationMethod == 'displayActivationLink') {
- userService.getActivationLink(vm.item.id.id).then(
- function success(activationLink) {
- displayActivationLink($event, activationLink).then(
- function() {
- $mdDialog.hide();
- }
- );
- }
- );
- } else {
- $mdDialog.hide();
- }
- });
- }
-
- function displayActivationLink($event, activationLink) {
- var deferred = $q.defer();
- $mdDialog.show({
- controller: 'ActivationLinkDialogController',
- controllerAs: 'vm',
- templateUrl: activationLinkDialogTemplate,
- locals: {
- activationLink: activationLink
- },
- parent: angular.element($document[0].body),
- fullscreen: true,
- multiple: true,
- targetEvent: $event
- }).then(function () {
- deferred.resolve();
- });
- return deferred.promise;
- }
-
-}
\ No newline at end of file
diff --git a/ui/src/app/user/add-user.tpl.html b/ui/src/app/user/add-user.tpl.html
deleted file mode 100644
index d6e9023743..0000000000
--- a/ui/src/app/user/add-user.tpl.html
+++ /dev/null
@@ -1,54 +0,0 @@
-
-
-
-
diff --git a/ui/src/app/user/index.js b/ui/src/app/user/index.js
deleted file mode 100644
index d5c2e410ab..0000000000
--- a/ui/src/app/user/index.js
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Copyright © 2016-2020 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 uiRouter from 'angular-ui-router';
-import thingsboardGrid from '../components/grid.directive';
-import thingsboardApiUser from '../api/user.service';
-import thingsboardToast from '../services/toast';
-
-import UserRoutes from './user.routes';
-import UserController from './user.controller';
-import AddUserController from './add-user.controller';
-import ActivationLinkDialogController from './activation-link.controller';
-import UserDirective from './user.directive';
-
-export default angular.module('thingsboard.user', [
- uiRouter,
- thingsboardGrid,
- thingsboardApiUser,
- thingsboardToast
-])
- .config(UserRoutes)
- .controller('UserController', UserController)
- .controller('AddUserController', AddUserController)
- .controller('ActivationLinkDialogController', ActivationLinkDialogController)
- .directive('tbUser', UserDirective)
- .name;
diff --git a/ui/src/app/user/user-card.tpl.html b/ui/src/app/user/user-card.tpl.html
deleted file mode 100644
index ec406023df..0000000000
--- a/ui/src/app/user/user-card.tpl.html
+++ /dev/null
@@ -1,18 +0,0 @@
-
-{{item ? ( ( item.firstName ? item.firstName : '' ) + ' ' + ( item.lastName ? item.lastName : '') ) : ''}}
diff --git a/ui/src/app/user/user-fieldset.scss b/ui/src/app/user/user-fieldset.scss
deleted file mode 100644
index 5662c0ada8..0000000000
--- a/ui/src/app/user/user-fieldset.scss
+++ /dev/null
@@ -1,32 +0,0 @@
-/**
- * Copyright © 2016-2020 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";
-
-.tb-default-dashboard {
- .tb-default-dashboard-label {
- padding-bottom: 8px;
- }
-
- tb-dashboard-autocomplete {
- @media (min-width: $layout-breakpoint-sm) {
- padding-right: 12px;
- }
-
- @media (max-width: $layout-breakpoint-sm) {
- padding-bottom: 12px;
- }
- }
-}
diff --git a/ui/src/app/user/user-fieldset.tpl.html b/ui/src/app/user/user-fieldset.tpl.html
deleted file mode 100644
index 9e3e34a409..0000000000
--- a/ui/src/app/user/user-fieldset.tpl.html
+++ /dev/null
@@ -1,87 +0,0 @@
-
-{{ 'user.disable-account' |
- translate }}
-
-{{ 'user.enable-account' |
- translate }}
-
-{{
- 'user.display-activation-link' | translate }}
-
-{{
- 'user.resend-activation' | translate }}
-
-{{
- (isTenantAdmin() ? 'user.login-as-tenant-admin' : 'user.login-as-customer-user') | translate }}
-
-{{ 'user.delete' |
- translate }}
-
-
-
-
-
diff --git a/ui/src/app/user/user.controller.js b/ui/src/app/user/user.controller.js
deleted file mode 100644
index bbe424c7a9..0000000000
--- a/ui/src/app/user/user.controller.js
+++ /dev/null
@@ -1,220 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-/* eslint-disable import/no-unresolved, import/default */
-
-import addUserTemplate from './add-user.tpl.html';
-import userCard from './user-card.tpl.html';
-import activationLinkDialogTemplate from './activation-link.dialog.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-
-/*@ngInject*/
-export default function UserController(userService, toast, $scope, $mdDialog, $document, $controller, $state, $stateParams, $translate, types) {
-
- var tenantId = $stateParams.tenantId;
- var customerId = $stateParams.customerId;
- var usersType = $state.$current.data.usersType;
-
- var userActionsList = [
- {
- onAction: function ($event, item) {
- loginAsUser(item);
- },
- name: function() { return $translate.instant('login.login') },
- details: function() { return $translate.instant(usersType === 'tenant' ? 'user.login-as-tenant-admin' : 'user.login-as-customer-user') },
- icon: "login",
- isEnabled: function() {
- return userService.isUserTokenAccessEnabled();
- }
- },
- {
- onAction: function ($event, item) {
- vm.grid.deleteItem($event, item);
- },
- name: function() { return $translate.instant('action.delete') },
- details: function() { return $translate.instant('user.delete') },
- icon: "delete"
- }
- ];
-
- var vm = this;
-
- vm.types = types;
-
- vm.userGridConfig = {
- deleteItemTitleFunc: deleteUserTitle,
- deleteItemContentFunc: deleteUserText,
- deleteItemsTitleFunc: deleteUsersTitle,
- deleteItemsActionTitleFunc: deleteUsersActionTitle,
- deleteItemsContentFunc: deleteUsersText,
-
- deleteItemFunc: deleteUser,
-
- getItemTitleFunc: getUserTitle,
- itemCardTemplateUrl: userCard,
-
- actionsList: userActionsList,
-
- onGridInited: gridInited,
-
- addItemTemplateUrl: addUserTemplate,
- addItemController: 'AddUserController',
-
- addItemText: function() { return $translate.instant('user.add-user-text') },
- noItemsText: function() { return $translate.instant('user.no-users-text') },
- itemDetailsText: function() { return $translate.instant('user.user-details') }
- };
-
- if (angular.isDefined($stateParams.items) && $stateParams.items !== null) {
- vm.userGridConfig.items = $stateParams.items;
- }
-
- if (angular.isDefined($stateParams.topIndex) && $stateParams.topIndex > 0) {
- vm.userGridConfig.topIndex = $stateParams.topIndex;
- }
-
- vm.displayActivationLink = displayActivationLink;
- vm.resendActivation = resendActivation;
- vm.loginAsUser = loginAsUser;
- vm.setUserCredentialsEnabled = setUserCredentialsEnabled;
-
- initController();
-
- function initController() {
- var fetchUsersFunction = null;
- var saveUserFunction = null;
- var refreshUsersParamsFunction = null;
-
- if (usersType === 'tenant') {
- fetchUsersFunction = function (pageLink) {
- return userService.getTenantAdmins(tenantId, pageLink);
- };
- saveUserFunction = function (user) {
- user.authority = "TENANT_ADMIN";
- user.tenantId = {
- entityType: types.entityType.tenant,
- id: tenantId
- };
- return userService.saveUser(user);
- };
- refreshUsersParamsFunction = function () {
- return {"tenantId": tenantId, "topIndex": vm.topIndex};
- };
-
- } else if (usersType === 'customer') {
- fetchUsersFunction = function (pageLink) {
- return userService.getCustomerUsers(customerId, pageLink);
- };
- saveUserFunction = function (user) {
- user.authority = "CUSTOMER_USER";
- user.customerId = {
- entityType: types.entityType.customer,
- id: customerId
- };
- return userService.saveUser(user);
- };
- refreshUsersParamsFunction = function () {
- return {"customerId": customerId, "topIndex": vm.topIndex};
- };
- }
-
- vm.userGridConfig.refreshParamsFunc = refreshUsersParamsFunction;
- vm.userGridConfig.fetchItemsFunc = fetchUsersFunction;
- vm.userGridConfig.saveItemFunc = saveUserFunction;
- }
-
- function deleteUserTitle(user) {
- return $translate.instant('user.delete-user-title', {userEmail: user.email});
- }
-
- function deleteUserText() {
- return $translate.instant('user.delete-user-text');
- }
-
- function deleteUsersTitle(selectedCount) {
- return $translate.instant('user.delete-users-title', {count: selectedCount}, 'messageformat');
- }
-
- function deleteUsersActionTitle(selectedCount) {
- return $translate.instant('user.delete-users-action-title', {count: selectedCount}, 'messageformat');
- }
-
- function deleteUsersText() {
- return $translate.instant('user.delete-users-text');
- }
-
- function gridInited(grid) {
- vm.grid = grid;
- }
-
- function getUserTitle(user) {
- return user ? user.email : '';
- }
-
- function deleteUser(userId) {
- return userService.deleteUser(userId);
- }
-
- function displayActivationLink(event, user) {
- userService.getActivationLink(user.id.id).then(
- function success(activationLink) {
- openActivationLinkDialog(event, activationLink);
- }
- );
- }
-
- function setUserCredentialsEnabled(user, userCredentialsEnabled) {
- userService.setUserCredentialsEnabled(user.id.id, userCredentialsEnabled).then(
- () => {
- if (!user.additionalInfo) {
- user.additionalInfo = {};
- }
- user.additionalInfo.userCredentialsEnabled = userCredentialsEnabled;
- if (userCredentialsEnabled) {
- toast.showSuccess($translate.instant('user.enable-account-message'));
- } else {
- toast.showSuccess($translate.instant('user.disable-account-message'));
- }
- }
- )
- }
-
- function openActivationLinkDialog(event, activationLink) {
- $mdDialog.show({
- controller: 'ActivationLinkDialogController',
- controllerAs: 'vm',
- templateUrl: activationLinkDialogTemplate,
- locals: {
- activationLink: activationLink
- },
- parent: angular.element($document[0].body),
- fullscreen: true,
- multiple: true,
- targetEvent: event
- });
- }
-
- function resendActivation(user) {
- userService.sendActivationEmail(user.email).then(function success() {
- toast.showSuccess($translate.instant('user.activation-email-sent-message'));
- });
- }
-
- function loginAsUser(user) {
- userService.loginAsUser(user.id.id);
- }
-}
diff --git a/ui/src/app/user/user.directive.js b/ui/src/app/user/user.directive.js
deleted file mode 100644
index 59ed8eba30..0000000000
--- a/ui/src/app/user/user.directive.js
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Copyright © 2016-2020 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 './user-fieldset.scss';
-
-/* eslint-disable import/no-unresolved, import/default */
-
-import userFieldsetTemplate from './user-fieldset.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-/*@ngInject*/
-export default function UserDirective($compile, $templateCache, userService) {
- var linker = function (scope, element) {
- var template = $templateCache.get(userFieldsetTemplate);
- element.html(template);
-
- scope.isTenantAdmin = function() {
- return scope.user && scope.user.authority === 'TENANT_ADMIN';
- };
-
- scope.isCustomerUser = function() {
- return scope.user && scope.user.authority === 'CUSTOMER_USER';
- };
-
- scope.isUserCredentialsEnabled = function() {
- if (scope.user == null || angular.isUndefined(scope.user) ||
- scope.user.additionalInfo == null || angular.isUndefined(scope.user.additionalInfo) ||
- scope.user.additionalInfo.userCredentialsEnabled == null || angular.isUndefined(scope.user.additionalInfo.userCredentialsEnabled)) {
- return true;
- }
- return scope.user.additionalInfo.userCredentialsEnabled === true;
- };
-
- scope.loginAsUserEnabled = userService.isUserTokenAccessEnabled();
-
- $compile(element.contents())(scope);
- }
- return {
- restrict: "E",
- link: linker,
- scope: {
- user: '=',
- isEdit: '=',
- theForm: '=',
- onDisplayActivationLink: '&',
- onResendActivation: '&',
- onLoginAsUser: '&',
- onDeleteUser: '&',
- onSetUserCredentialsEnabled: '&',
- }
- };
-}
diff --git a/ui/src/app/user/user.routes.js b/ui/src/app/user/user.routes.js
deleted file mode 100644
index 893772b8bf..0000000000
--- a/ui/src/app/user/user.routes.js
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-/* eslint-disable import/no-unresolved, import/default */
-
-import usersTemplate from '../user/users.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-/*@ngInject*/
-export default function UserRoutes($stateProvider) {
-
- $stateProvider
- .state('home.tenants.users', {
- url: '/:tenantId/users',
- params: {'topIndex': 0},
- module: 'private',
- auth: ['SYS_ADMIN'],
- views: {
- "content@home": {
- templateUrl: usersTemplate,
- controllerAs: 'vm',
- controller: 'UserController'
- }
- },
- data: {
- usersType: 'tenant',
- searchEnabled: true,
- pageTitle: 'user.tenant-admins'
- },
- ncyBreadcrumb: {
- label: '{"icon": "account_circle", "label": "user.tenant-admins"}'
- }
- })
- .state('home.customers.users', {
- url: '/:customerId/users',
- params: {'topIndex': 0},
- module: 'private',
- auth: ['TENANT_ADMIN'],
- views: {
- "content@home": {
- templateUrl: usersTemplate,
- controllerAs: 'vm',
- controller: 'UserController'
- }
- },
- data: {
- usersType: 'customer',
- searchEnabled: true,
- pageTitle: 'user.customer-users'
- },
- ncyBreadcrumb: {
- label: '{"icon": "account_circle", "label": "user.customer-users"}'
- }
- });
-
-}
diff --git a/ui/src/app/user/users.tpl.html b/ui/src/app/user/users.tpl.html
deleted file mode 100644
index 9c1d5a4e63..0000000000
--- a/ui/src/app/user/users.tpl.html
+++ /dev/null
@@ -1,40 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/ui/src/app/widget/add-widgets-bundle.tpl.html b/ui/src/app/widget/add-widgets-bundle.tpl.html
deleted file mode 100644
index 9638bedd5a..0000000000
--- a/ui/src/app/widget/add-widgets-bundle.tpl.html
+++ /dev/null
@@ -1,48 +0,0 @@
-
-
-
-
diff --git a/ui/src/app/widget/index.js b/ui/src/app/widget/index.js
deleted file mode 100644
index db0ade84fe..0000000000
--- a/ui/src/app/widget/index.js
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Copyright © 2016-2020 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 './widget-editor.scss';
-
-import 'angular-hotkeys';
-import 'angular-ui-ace';
-
-import uiRouter from 'angular-ui-router';
-import thingsboardApiUser from '../api/user.service';
-import thingsboardApiWidget from '../api/widget.service';
-import thingsboardTypes from '../common/types.constant';
-import thingsboardToast from '../services/toast';
-import thingsboardConfirmOnExit from '../components/confirm-on-exit.directive';
-import thingsboardDashboard from '../components/dashboard.directive';
-import thingsboardExpandFullscreen from '../components/expand-fullscreen.directive';
-import thingsboardCircularProgress from '../components/circular-progress.directive';
-import thingsboardMdChipDraggable from '../components/md-chip-draggable.directive';
-
-import WidgetLibraryRoutes from './widget-library.routes';
-import WidgetLibraryController from './widget-library.controller';
-import SelectWidgetTypeController from './select-widget-type.controller';
-import WidgetEditorController from './widget-editor.controller';
-import WidgetsBundleController from './widgets-bundle.controller';
-import WidgetsBundleDirective from './widgets-bundle.directive';
-import SaveWidgetTypeAsController from './save-widget-type-as.controller';
-
-export default angular.module('thingsboard.widget-library', [
- uiRouter,
- thingsboardApiWidget,
- thingsboardApiUser,
- thingsboardTypes,
- thingsboardToast,
- thingsboardConfirmOnExit,
- thingsboardDashboard,
- thingsboardExpandFullscreen,
- thingsboardCircularProgress,
- thingsboardMdChipDraggable,
- 'cfp.hotkeys',
- 'ui.ace'
-])
- .config(WidgetLibraryRoutes)
- .controller('WidgetLibraryController', WidgetLibraryController)
- .controller('SelectWidgetTypeController', SelectWidgetTypeController)
- .controller('WidgetEditorController', WidgetEditorController)
- .controller('WidgetsBundleController', WidgetsBundleController)
- .controller('SaveWidgetTypeAsController', SaveWidgetTypeAsController)
- .directive('tbWidgetsBundle', WidgetsBundleDirective)
- .name;
diff --git a/ui/src/app/widget/lib/CanvasDigitalGauge.js b/ui/src/app/widget/lib/CanvasDigitalGauge.js
deleted file mode 100644
index 8f48292c78..0000000000
--- a/ui/src/app/widget/lib/CanvasDigitalGauge.js
+++ /dev/null
@@ -1,860 +0,0 @@
-/*
- * Copyright © 2016-2020 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 $ from 'jquery';
-import canvasGauges from 'canvas-gauges';
-import tinycolor from 'tinycolor2';
-
-/* eslint-disable angular/angularelement */
-
-let defaultDigitalGaugeOptions = Object.assign({}, canvasGauges.GenericOptions, {
- gaugeType: 'arc',
- gaugeWithScale: 0.75,
- dashThickness: 0,
- roundedLineCap: false,
-
- gaugeColor: '#777',
- levelColors: ['blue'],
-
- symbol: '',
- label: '',
- hideValue: false,
- hideMinMax: false,
-
- fontTitle: 'Roboto',
-
- fontValue: 'Roboto',
-
- fontMinMaxSize: 10,
- fontMinMaxStyle: 'normal',
- fontMinMaxWeight: '500',
- colorMinMax: '#eee',
- fontMinMax: 'Roboto',
-
- fontLabelSize: 8,
- fontLabelStyle: 'normal',
- fontLabelWeight: '500',
- colorLabel: '#eee',
- fontLabel: 'Roboto',
-
- neonGlowBrightness: 0,
-
- colorTicks: 'gray',
- tickWidth: 4,
- ticks: [],
-
- isMobile: false
-
-});
-
-const round = Math.round;
-
-export default class CanvasDigitalGauge extends canvasGauges.BaseGauge {
-
- constructor(options) {
- canvasGauges.performance = window.performance; // eslint-disable-line no-undef, angular/window-service
- options = Object.assign({}, defaultDigitalGaugeOptions, options || {});
- super(CanvasDigitalGauge.configure(options));
- this.initValueClone();
- }
-
- initValueClone() {
- let canvas = this.canvas;
- this.elementValueClone = canvas.element.cloneNode(true);
- this.contextValueClone = this.elementValueClone.getContext('2d');
- this.elementValueClone.initialized = false;
-
- this.contextValueClone.translate(canvas.drawX, canvas.drawY);
- this.contextValueClone.save();
-
- this.elementProgressClone = canvas.element.cloneNode(true);
- this.contextProgressClone = this.elementProgressClone.getContext('2d');
- this.elementProgressClone.initialized = false;
-
- this.contextProgressClone.translate(canvas.drawX, canvas.drawY);
- this.contextProgressClone.save();
-
- }
-
- static configure(options) {
-
- if (options.value > options.maxValue) {
- options.value = options.maxValue;
- }
-
- if (options.value < options.minValue) {
- options.value = options.minValue;
- }
-
- if (options.gaugeType === 'donut') {
- if (!options.donutStartAngle) {
- options.donutStartAngle = 1.5 * Math.PI;
- }
- if (!options.donutEndAngle) {
- options.donutEndAngle = options.donutStartAngle + 2 * Math.PI;
- }
- }
-
- var colorsCount = options.levelColors.length;
- const inc = colorsCount > 1 ? (1 / (colorsCount - 1)) : 1;
- var isColorProperty = angular.isString(options.levelColors[0]);
-
- options.colorsRange = [];
- if (options.neonGlowBrightness) {
- options.neonColorsRange = [];
- }
-
- for (let i = 0; i < options.levelColors.length; i++) {
- const levelColor = options.levelColors[i];
- if (levelColor !== null) {
- let percentage = isColorProperty ? inc * i : CanvasDigitalGauge.normalizeValue(levelColor.value, options.minValue, options.maxValue);
- let tColor = tinycolor(isColorProperty ? levelColor : levelColor.color);
- options.colorsRange.push({
- pct: percentage,
- color: tColor.toRgb(),
- rgbString: tColor.toRgbString()
- });
- if (options.neonGlowBrightness) {
- tColor = tinycolor(isColorProperty ? levelColor : levelColor.color).brighten(options.neonGlowBrightness);
- options.neonColorsRange.push({
- pct: percentage,
- color: tColor.toRgb(),
- rgbString: tColor.toRgbString()
- });
- }
- }
- }
-
- options.ticksValue = [];
- for(let i = 0; i < options.ticks.length; i++){
- if(options.ticks[i] !== null){
- options.ticksValue.push(CanvasDigitalGauge.normalizeValue(options.ticks[i], options.minValue, options.maxValue))
- }
- }
-
- if (options.neonGlowBrightness) {
- options.neonColorTitle = tinycolor(options.colorTitle).brighten(options.neonGlowBrightness).toHexString();
- options.neonColorLabel = tinycolor(options.colorLabel).brighten(options.neonGlowBrightness).toHexString();
- options.neonColorValue = tinycolor(options.colorValue).brighten(options.neonGlowBrightness).toHexString();
- options.neonColorMinMax = tinycolor(options.colorMinMax).brighten(options.neonGlowBrightness).toHexString();
- }
-
- return canvasGauges.BaseGauge.configure(options);
- }
-
- static normalizeValue (value, min, max) {
- let normalValue = (value - min) / (max - min);
- if (normalValue <= 0) {
- return 0;
- }
- if (normalValue >= 1) {
- return 1;
- }
- return normalValue;
- }
-
- destroy() {
- this.contextValueClone = null;
- this.elementValueClone = null;
- this.contextProgressClone = null;
- this.elementProgressClone = null;
- super.destroy();
- }
-
- update(options) {
- this.canvas.onRedraw = null;
- var result = super.update(options);
- this.initValueClone();
- this.canvas.onRedraw = this.draw.bind(this);
- this.draw();
- return result;
- }
-
- set timestamp(timestamp) {
- this.options.timestamp = timestamp;
- this.draw();
- }
-
- get timestamp() {
- return this.options.timestamp;
- }
-
- draw() {
- try {
-
- let canvas = this.canvas;
-
- if (!canvas.drawWidth || !canvas.drawHeight) {
- return this;
- }
-
- let [x, y, w, h] = [
- -canvas.drawX,
- -canvas.drawY,
- canvas.drawWidth,
- canvas.drawHeight
- ];
- let options = this.options;
- if (!canvas.elementClone.initialized) {
- let context = canvas.contextClone;
-
- // clear the cache
- context.clearRect(x, y, w, h);
- context.save();
-
- canvas.context.barDimensions = barDimensions(context, options, x, y, w, h);
- this.contextValueClone.barDimensions = canvas.context.barDimensions;
- this.contextProgressClone.barDimensions = canvas.context.barDimensions;
-
- drawBackground(context, options);
-
- drawDigitalTitle(context, options);
-
- if (!options.showTimestamp) {
- drawDigitalLabel(context, options);
- }
-
- drawDigitalMinMax(context, options);
-
- canvas.elementClone.initialized = true;
- }
-
- var valueChanged = false;
- if (!this.elementValueClone.initialized || angular.isDefined(this._value) && this.elementValueClone.renderedValue !== this._value || (options.showTimestamp && this.elementValueClone.renderedTimestamp !== this.timestamp)) {
- if (angular.isDefined(this._value)) {
- this.elementValueClone.renderedValue = this._value;
- }
- if (angular.isUndefined(this.elementValueClone.renderedValue)) {
- this.elementValueClone.renderedValue = this.value;
- }
- let context = this.contextValueClone;
- // clear the cache
- context.clearRect(x, y, w, h);
- context.save();
-
- context.drawImage(canvas.elementClone, x, y, w, h);
- context.save();
-
- drawDigitalValue(context, options, this.elementValueClone.renderedValue);
-
- if (options.showTimestamp) {
- drawDigitalLabel(context, options);
- this.elementValueClone.renderedTimestamp = this.timestamp;
- }
-
- this.elementValueClone.initialized = true;
-
- valueChanged = true;
- }
-
- var progress = (canvasGauges.drawings.normalizedValue(options).normal - options.minValue) /
- (options.maxValue - options.minValue);
-
- var fixedProgress = progress.toFixed(3);
-
- if (!this.elementProgressClone.initialized || this.elementProgressClone.renderedProgress !== fixedProgress || valueChanged) {
- let context = this.contextProgressClone;
- // clear the cache
- context.clearRect(x, y, w, h);
- context.save();
-
- context.drawImage(this.elementValueClone, x, y, w, h);
- context.save();
-
- if (Number(fixedProgress) > 0) {
- drawProgress(context, options, progress);
- }
-
- this.elementProgressClone.initialized = true;
- this.elementProgressClone.renderedProgress = fixedProgress;
- }
-
- this.canvas.commit();
-
- // clear the canvas
- canvas.context.clearRect(x, y, w, h);
- canvas.context.save();
-
- canvas.context.drawImage(this.elementProgressClone, x, y, w, h);
- canvas.context.save();
-
- super.draw();
-
- } catch (err) {
- canvasGauges.drawings.verifyError(err);
- }
- return this;
- }
-
- getValueColor() {
- if (this.contextProgressClone) {
- var color = this.contextProgressClone.currentColor;
- if (!color) {
- if (this.options.neonGlowBrightness) {
- color = getProgressColor(0, this.options.neonColorsRange);
- } else {
- color = getProgressColor(0, this.options.colorsRange);
- }
- }
- return color;
- } else {
- return '#000';
- }
- }
-}
-
-/* eslint-disable angular/document-service */
-/* eslint-disable no-undef */
-function determineFontHeight (options, target, baseSize) {
- var fontStyleStr = 'font-style:' + options['font' + target + 'Style'] + ';font-weight:' +
- options['font' + target + 'Weight'] + ';font-size:' +
- options['font' + target + 'Size'] * baseSize + 'px;font-family:' +
- options['font' + target];
- var result = CanvasDigitalGauge.heightCache[fontStyleStr];
- if (!result)
- {
- var fontStyle = {
- fontFamily: options['font' + target],
- fontSize: options['font' + target + 'Size'] * baseSize + 'px',
- fontWeight: options['font' + target + 'Weight'],
- fontStyle: options['font' + target + 'Style']
- };
-
- var text = $('Hg').css(fontStyle);
- var block = $('');
-
- var div = $('');
- div.append(text, block);
-
- var body = $('body');
- body.append(div);
-
- try {
- result = {};
- block.css({ verticalAlign: 'baseline' });
- result.ascent = block.offset().top - text.offset().top;
- block.css({ verticalAlign: 'bottom' });
- result.height = block.offset().top - text.offset().top;
- result.descent = result.height - result.ascent;
- } finally {
- div.remove();
- }
- CanvasDigitalGauge.heightCache[fontStyleStr] = result;
- }
- return result;
-}
-
-/* eslint-enable angular/document-service */
-/* eslint-enable no-undef */
-
-function barDimensions(context, options, x, y, w, h) {
-
- context.barDimensions = {
- baseX: x,
- baseY: y,
- width: w,
- height: h
- };
-
- var bd = context.barDimensions;
-
- var aspect = 1;
-
- if (options.gaugeType === 'horizontalBar') {
- aspect = options.title === '' ? 2.5 : 2;
- } else if (options.gaugeType === 'verticalBar') {
- aspect = options.hideMinMax ? 0.35 : 0.5;
- } else if (options.gaugeType === 'arc') {
- aspect = 1.5;
- }
-
- var currentAspect = w / h;
- if (currentAspect > aspect) {
- bd.width = (h * aspect);
- bd.height = h;
- } else {
- bd.width = w;
- bd.height = w / aspect;
- }
-
- bd.origBaseX = bd.baseX;
- bd.origBaseY = bd.baseY;
- bd.baseX += (w - bd.width) / 2;
- bd.baseY += (h - bd.height) / 2;
-
- if (options.gaugeType === 'donut') {
- bd.fontSizeFactor = Math.max(bd.width, bd.height) / 125;
- } else if (options.gaugeType === 'verticalBar' || (options.gaugeType === 'arc' && options.title === '')) {
- bd.fontSizeFactor = Math.max(bd.width, bd.height) / 150;
- } else {
- bd.fontSizeFactor = Math.max(bd.width, bd.height) / 200;
- }
-
- var gws = options.gaugeWidthScale;
-
- if (options.neonGlowBrightness) {
- options.fontTitleHeight = determineFontHeight(options, 'Title', bd.fontSizeFactor);
- options.fontLabelHeight = determineFontHeight(options, 'Label', bd.fontSizeFactor);
- options.fontValueHeight = determineFontHeight(options, 'Value', bd.fontSizeFactor);
- options.fontMinMaxHeight = determineFontHeight(options, 'MinMax', bd.fontSizeFactor);
- }
-
- if (options.gaugeType === 'donut') {
- bd.Ro = bd.width / 2 - bd.width / 20;
- bd.Cy = bd.baseY + bd.height / 2;
- if (options.title && options.title.length > 0) {
- var titleOffset = determineFontHeight(options, 'Title', bd.fontSizeFactor).height;
- titleOffset += bd.fontSizeFactor * 2;
- bd.titleY = bd.baseY + titleOffset;
- titleOffset += bd.fontSizeFactor * 2;
- bd.Cy += titleOffset/2;
- bd.Ro -= titleOffset/2;
- }
- bd.Ri = bd.Ro - bd.width / 6.666666666666667 * gws * 1.2;
- bd.Cx = bd.baseX + bd.width / 2;
-
- } else if (options.gaugeType === 'arc') {
- if (options.title && options.title.length > 0) {
- bd.Ro = bd.width / 2 - bd.width / 7;
- bd.Ri = bd.Ro - bd.width / 6.666666666666667 * gws;
- } else {
- bd.Ro = bd.width / 2 - bd.fontSizeFactor * 4;
- bd.Ri = bd.Ro - bd.width / 6.666666666666667 * gws * 1.2;
- }
- bd.Cx = bd.baseX + bd.width / 2;
- bd.Cy = bd.baseY + bd.height / 1.25;
- } else if (options.gaugeType === 'verticalBar') {
- bd.Ro = bd.width / 2 - bd.width / 10;
- bd.Ri = bd.Ro - bd.width / 6.666666666666667 * gws * (options.hideMinMax ? 4 : 2.5);
- } else { //horizontalBar
- bd.Ro = bd.width / 2 - bd.width / 10;
- bd.Ri = bd.Ro - bd.width / 6.666666666666667 * gws;
- }
-
- bd.strokeWidth = bd.Ro - bd.Ri;
- bd.Rm = bd.Ri + bd.strokeWidth * 0.5;
-
- bd.fontValueBaseline = 'alphabetic';
- bd.fontMinMaxBaseline = 'alphabetic';
- bd.fontMinMaxAlign = 'center';
-
- if (options.gaugeType === 'donut') {
- bd.fontValueBaseline = 'middle';
- if (options.label && options.label.length > 0) {
- var valueHeight = determineFontHeight(options, 'Value', bd.fontSizeFactor).height;
- var labelHeight = determineFontHeight(options, 'Label', bd.fontSizeFactor).height;
- var total = valueHeight + labelHeight;
- bd.labelY = bd.Cy + total/2;
- bd.valueY = bd.Cy - total/2 + valueHeight/2;
- } else {
- bd.valueY = bd.Cy;
- }
- } else if (options.gaugeType === 'arc') {
- bd.titleY = bd.Cy - bd.Ro - 12 * bd.fontSizeFactor;
- bd.valueY = bd.Cy;
- bd.labelY = bd.Cy + (8 + options.fontLabelSize) * bd.fontSizeFactor;
- bd.minY = bd.maxY = bd.labelY;
- if (options.roundedLineCap) {
- bd.minY += bd.strokeWidth/2;
- bd.maxY += bd.strokeWidth/2;
- }
- bd.minX = bd.Cx - bd.Rm;
- bd.maxX = bd.Cx + bd.Rm;
- } else if (options.gaugeType === 'horizontalBar') {
- bd.titleY = bd.baseY + 4 * bd.fontSizeFactor +
- (options.title === '' ? 0 : options.fontTitleSize * bd.fontSizeFactor);
- bd.titleBottom = bd.titleY + (options.title === '' ? 0 : 4) * bd.fontSizeFactor;
-
- bd.valueY = bd.titleBottom +
- (options.hideValue ? 0 : options.fontValueSize * bd.fontSizeFactor);
-
- bd.barTop = bd.valueY + 8 * bd.fontSizeFactor;
- bd.barBottom = bd.barTop + bd.strokeWidth;
-
- if (options.hideMinMax && options.label === '') {
- bd.labelY = bd.barBottom;
- bd.barLeft = bd.origBaseX + options.fontMinMaxSize/3 * bd.fontSizeFactor;
- bd.barRight = bd.origBaseX + w + /*bd.width*/ - options.fontMinMaxSize/3 * bd.fontSizeFactor;
- } else {
- context.font = canvasGauges.drawings.font(options, 'MinMax', bd.fontSizeFactor);
- var minTextWidth = context.measureText(options.minValue+'').width;
- var maxTextWidth = context.measureText(options.maxValue+'').width;
- var maxW = Math.max(minTextWidth, maxTextWidth);
- bd.minX = bd.origBaseX + maxW/2 + options.fontMinMaxSize/3 * bd.fontSizeFactor;
- bd.maxX = bd.origBaseX + w + /*bd.width*/ - maxW/2 - options.fontMinMaxSize/3 * bd.fontSizeFactor;
- bd.barLeft = bd.minX;
- bd.barRight = bd.maxX;
- bd.labelY = bd.barBottom + (8 + options.fontLabelSize) * bd.fontSizeFactor;
- bd.minY = bd.maxY = bd.labelY;
- }
- } else if (options.gaugeType === 'verticalBar') {
- bd.titleY = bd.baseY + ((options.title === '' ? 0 : options.fontTitleSize) + 8) * bd.fontSizeFactor;
- bd.titleBottom = bd.titleY + (options.title === '' ? 0 : 4) * bd.fontSizeFactor;
-
- bd.valueY = bd.titleBottom + (options.hideValue ? 0 : options.fontValueSize * bd.fontSizeFactor);
- bd.barTop = bd.valueY + 8 * bd.fontSizeFactor;
-
- bd.labelY = bd.baseY + bd.height - 16;
- if (options.label === '') {
- bd.barBottom = bd.labelY;
- } else {
- bd.barBottom = bd.labelY - (8 + options.fontLabelSize) * bd.fontSizeFactor;
- }
- bd.minX = bd.maxX =
- bd.baseX + bd.width/2 + bd.strokeWidth/2 + options.fontMinMaxSize/3 * bd.fontSizeFactor;
- bd.minY = bd.barBottom;
- bd.maxY = bd.barTop;
- bd.fontMinMaxBaseline = 'middle';
- bd.fontMinMaxAlign = 'left';
- }
-
- if (options.dashThickness) {
- var circumference;
- if (options.gaugeType === 'donut') {
- circumference = Math.PI * bd.Rm * 2;
- } else if (options.gaugeType === 'arc') {
- circumference = Math.PI * bd.Rm;
- } else if (options.gaugeType === 'horizontalBar') {
- circumference = bd.barRight - bd.barLeft;
- } else if (options.gaugeType === 'verticalBar') {
- circumference = bd.barBottom - bd.barTop;
- }
- var dashCount = Math.floor(circumference / (options.dashThickness * bd.fontSizeFactor));
- if (options.gaugeType === 'donut') {
- dashCount = (dashCount | 1) - 1;
- } else {
- dashCount = (dashCount - 1) | 1;
- }
- bd.dashLength = Math.ceil(circumference/dashCount);
- }
-
- return bd;
-}
-
-function drawBackground(context, options) {
- let {barLeft, barRight, barTop, barBottom, width, baseX, strokeWidth} =
- context.barDimensions;
- if (context.barDimensions.dashLength) {
- context.setLineDash([context.barDimensions.dashLength]);
- }
- context.beginPath();
- context.strokeStyle = options.gaugeColor;
- context.lineWidth = strokeWidth;
- if (options.roundedLineCap) {
- context.lineCap = 'round';
- }
- if (options.gaugeType === 'donut') {
- context.arc(context.barDimensions.Cx, context.barDimensions.Cy, context.barDimensions.Rm, options.donutStartAngle, options.donutEndAngle);
- context.stroke();
- } else if (options.gaugeType === 'arc') {
- context.arc(context.barDimensions.Cx, context.barDimensions.Cy, context.barDimensions.Rm, Math.PI, 2*Math.PI);
- context.stroke();
- } else if (options.gaugeType === 'horizontalBar') {
- context.moveTo(barLeft,barTop + strokeWidth/2);
- context.lineTo(barRight,barTop + strokeWidth/2);
- context.stroke();
- } else if (options.gaugeType === 'verticalBar') {
- context.moveTo(baseX + width/2, barBottom);
- context.lineTo(baseX + width/2, barTop);
- context.stroke();
- }
-}
-
-function drawText(context, options, target, text, textX, textY) {
- context.fillStyle = options[(options.neonGlowBrightness ? 'neonColor' : 'color') + target];
- context.fillText(text, textX, textY);
-}
-
-function drawDigitalTitle(context, options) {
- if (!options.title) return;
-
- let {titleY, width, baseX, fontSizeFactor} =
- context.barDimensions;
-
- let textX = round(baseX + width / 2);
- let textY = titleY;
-
- context.save();
- context.textAlign = 'center';
- context.font = canvasGauges.drawings.font(options, 'Title', fontSizeFactor);
- context.lineWidth = 0;
- drawText(context, options, 'Title', options.title.toUpperCase(), textX, textY);
-}
-
-function drawDigitalLabel(context, options) {
- if (!options.label || options.label === '') return;
-
- let {labelY, baseX, width, fontSizeFactor} =
- context.barDimensions;
-
- let textX = round(baseX + width / 2);
- let textY = labelY;
-
- context.save();
- context.textAlign = 'center';
- context.font = canvasGauges.drawings.font(options, 'Label', fontSizeFactor);
- context.lineWidth = 0;
- drawText(context, options, 'Label', options.label.toUpperCase(), textX, textY);
-
-}
-
-function drawDigitalMinMax(context, options) {
- if (options.hideMinMax || options.gaugeType === 'donut') return;
-
- let {minY, maxY, minX, maxX, fontSizeFactor, fontMinMaxAlign, fontMinMaxBaseline} =
- context.barDimensions;
-
- context.save();
- context.textAlign = fontMinMaxAlign;
- context.textBaseline = fontMinMaxBaseline;
- context.font = canvasGauges.drawings.font(options, 'MinMax', fontSizeFactor);
- context.lineWidth = 0;
- drawText(context, options, 'MinMax', options.minValue+'', minX, minY);
- drawText(context, options, 'MinMax', options.maxValue+'', maxX, maxY);
-}
-
-function padValue(val, options) {
- let dec = options.valueDec;
- let strVal, n;
-
- val = parseFloat(val);
- n = (val < 0);
- val = Math.abs(val);
-
- if (dec > 0) {
- strVal = val.toFixed(dec).toString()
- } else {
- strVal = round(val).toString();
- }
- strVal = (n ? '-' : '') + strVal;
- return strVal;
-}
-
-function drawDigitalValue(context, options, value) {
- if (options.hideValue) return;
-
- let {valueY, baseX, width, fontSizeFactor, fontValueBaseline} =
- context.barDimensions;
-
- let textX = round(baseX + width / 2);
- let textY = valueY;
-
- let text = options.valueText || padValue(value, options);
- text += options.symbol;
-
- context.save();
- context.textAlign = 'center';
- context.textBaseline = fontValueBaseline;
- context.font = canvasGauges.drawings.font(options, 'Value', fontSizeFactor);
- context.lineWidth = 0;
- drawText(context, options, 'Value', text, textX, textY);
-}
-
-function getProgressColor(progress, colorsRange) {
-
- var lower, upper, range, rangePct, pctLower, pctUpper, color;
-
- if (progress === 0 || colorsRange.length === 1) {
- return colorsRange[0].rgbString;
- }
-
- for (var j = 0; j < colorsRange.length; j++) {
- if (progress <= colorsRange[j].pct) {
- lower = colorsRange[j - 1];
- upper = colorsRange[j];
- range = upper.pct - lower.pct;
- rangePct = (progress - lower.pct) / range;
- pctLower = 1 - rangePct;
- pctUpper = rangePct;
- color = tinycolor({
- r: Math.floor(lower.color.r * pctLower + upper.color.r * pctUpper),
- g: Math.floor(lower.color.g * pctLower + upper.color.g * pctUpper),
- b: Math.floor(lower.color.b * pctLower + upper.color.b * pctUpper)
- });
- return color.toRgbString();
- }
- }
-}
-
-function drawArcGlow(context, Cx, Cy, Ri, Rm, Ro, color, progress, isDonut, donutStartAngle, donutEndAngle) {
- context.setLineDash([]);
- var strokeWidth = Ro - Ri;
- var blur = 0.55;
- var edge = strokeWidth*blur;
- context.lineWidth = strokeWidth+edge;
- var stop = blur/(2*blur+2);
- var glowGradient = context.createRadialGradient(Cx,Cy,Ri-edge/2,Cx,Cy,Ro+edge/2);
- var color1 = tinycolor(color).setAlpha(0.5).toRgbString();
- var color2 = tinycolor(color).setAlpha(0).toRgbString();
- glowGradient.addColorStop(0,color2);
- glowGradient.addColorStop(stop,color1);
- glowGradient.addColorStop(1.0-stop,color1);
- glowGradient.addColorStop(1,color2);
- context.strokeStyle = glowGradient;
- context.beginPath();
- var e = 0.01 * Math.PI;
- if (isDonut) {
- context.arc(Cx, Cy, Rm, donutStartAngle - e, donutStartAngle + (donutEndAngle - donutStartAngle) * progress + e);
- } else {
- context.arc(Cx, Cy, Rm, Math.PI - e, Math.PI + Math.PI * progress + e);
- }
- context.stroke();
-}
-
-function drawBarGlow(context, startX, startY, endX, endY, color, strokeWidth, isVertical) {
- context.setLineDash([]);
- var blur = 0.55;
- var edge = strokeWidth*blur;
- context.lineWidth = strokeWidth+edge;
- var stop = blur/(2*blur+2);
- var gradientStartX = isVertical ? startX - context.lineWidth/2 : 0;
- var gradientStartY = isVertical ? 0 : startY - context.lineWidth/2;
- var gradientStopX = isVertical ? startX + context.lineWidth/2 : 0;
- var gradientStopY = isVertical ? 0 : startY + context.lineWidth/2;
-
- var glowGradient = context.createLinearGradient(gradientStartX,gradientStartY,gradientStopX,gradientStopY);
- var color1 = tinycolor(color).setAlpha(0.5).toRgbString();
- var color2 = tinycolor(color).setAlpha(0).toRgbString();
- glowGradient.addColorStop(0,color2);
- glowGradient.addColorStop(stop,color1);
- glowGradient.addColorStop(1.0-stop,color1);
- glowGradient.addColorStop(1,color2);
- context.strokeStyle = glowGradient;
- var dx = isVertical ? 0 : 0.05 * context.lineWidth;
- var dy = isVertical ? 0.05 * context.lineWidth : 0;
- context.beginPath();
- context.moveTo(startX - dx, startY + dy);
- context.lineTo(endX + dx, endY - dy);
- context.stroke();
-}
-
-function drawTickArc(context, tickValues, Cx, Cy, Ri, Rm, Ro, startAngle, endAngle, color, tickWidth) {
- if(!tickValues.length) {
- return;
- }
-
- const strokeWidth = Ro - Ri;
- context.beginPath();
- context.lineWidth = tickWidth;
- context.strokeStyle = color;
- for (let i = 0; i < tickValues.length; i++) {
- var angle = startAngle + tickValues[i] * endAngle;
- var x1 = Cx + (Ri + strokeWidth) * Math.cos(angle);
- var y1 = Cy + (Ri + strokeWidth) * Math.sin(angle);
- var x2 = Cx + Ri * Math.cos(angle);
- var y2 = Cy + Ri * Math.sin(angle);
- context.moveTo(x1, y1);
- context.lineTo(x2, y2);
- }
- context.stroke();
-}
-
-function drawTickBar(context, tickValues, startX, startY, distanceBar, strokeWidth, isVertical, color, tickWidth) {
- if(!tickValues.length) {
- return;
- }
-
- context.beginPath();
- context.lineWidth = tickWidth;
- context.strokeStyle = color;
- for (let i = 0; i < tickValues.length; i++) {
- let tickValue = tickValues[i] * distanceBar;
- if (isVertical) {
- context.moveTo(startX - strokeWidth / 2, startY + tickValue - distanceBar);
- context.lineTo(startX + strokeWidth / 2, startY + tickValue - distanceBar);
- } else {
- context.moveTo(startX + tickValue, startY);
- context.lineTo(startX + tickValue, startY + strokeWidth);
- }
- }
- context.stroke();
-}
-
-function drawProgress(context, options, progress) {
- var neonColor;
- if (options.neonGlowBrightness) {
- context.currentColor = neonColor = getProgressColor(progress, options.neonColorsRange);
- } else {
- context.currentColor = context.strokeStyle = getProgressColor(progress, options.colorsRange);
- }
-
- let {barLeft, barRight, barTop, baseX, width, barBottom, Cx, Cy, Rm, Ro, Ri, strokeWidth} =
- context.barDimensions;
-
- if (context.barDimensions.dashLength) {
- context.setLineDash([context.barDimensions.dashLength]);
- }
- context.lineWidth = strokeWidth;
- if (options.roundedLineCap) {
- context.lineCap = 'round';
- } else {
- context.lineCap = 'butt';
- }
- if (options.gaugeType === 'donut') {
- if (options.neonGlowBrightness) {
- context.strokeStyle = neonColor;
- }
- context.beginPath();
- context.arc(Cx, Cy, Rm, options.donutStartAngle, options.donutStartAngle + (options.donutEndAngle - options.donutStartAngle) * progress);
- context.stroke();
- if (options.neonGlowBrightness && !options.isMobile) {
- drawArcGlow(context, Cx, Cy, Ri, Rm, Ro, neonColor, progress, true, options.donutStartAngle, options.donutEndAngle);
- }
- drawTickArc(context, options.ticksValue, Cx, Cy, Ri, Rm, Ro, options.donutStartAngle, options.donutEndAngle - options.donutStartAngle, options.colorTicks, options.tickWidth);
- } else if (options.gaugeType === 'arc') {
- if (options.neonGlowBrightness) {
- context.strokeStyle = neonColor;
- }
- context.beginPath();
- context.arc(Cx, Cy, Rm, Math.PI, Math.PI + Math.PI * progress);
- context.stroke();
- if (options.neonGlowBrightness && !options.isMobile) {
- drawArcGlow(context, Cx, Cy, Ri, Rm, Ro, neonColor, progress, false);
- }
- drawTickArc(context, options.ticksValue, Cx, Cy, Ri, Rm, Ro, Math.PI, Math.PI, options.colorTicks, options.tickWidth);
- } else if (options.gaugeType === 'horizontalBar') {
- if (options.neonGlowBrightness) {
- context.strokeStyle = neonColor;
- }
- context.beginPath();
- context.moveTo(barLeft,barTop + strokeWidth/2);
- context.lineTo(barLeft + (barRight-barLeft)*progress, barTop + strokeWidth/2);
- context.stroke();
- if (options.neonGlowBrightness && !options.isMobile) {
- drawBarGlow(context, barLeft, barTop + strokeWidth/2, barLeft + (barRight-barLeft)*progress, barTop + strokeWidth/2,
- neonColor, strokeWidth, false);
- }
- drawTickBar(context, options.ticksValue, barLeft, barTop, barRight - barLeft, strokeWidth, false, options.colorTicks, options.tickWidth);
- } else if (options.gaugeType === 'verticalBar') {
- if (options.neonGlowBrightness) {
- context.strokeStyle = neonColor;
- }
- context.beginPath();
- context.moveTo(baseX + width/2, barBottom);
- context.lineTo(baseX + width/2, barBottom - (barBottom-barTop)*progress);
- context.stroke();
- if (options.neonGlowBrightness && !options.isMobile) {
- drawBarGlow(context, baseX + width/2, barBottom, baseX + width/2, barBottom - (barBottom-barTop)*progress,
- neonColor, strokeWidth, true);
- }
- drawTickBar(context, options.ticksValue, baseX + width / 2, barTop, barTop - barBottom, strokeWidth, true, options.colorTicks, options.tickWidth);
- }
-}
-
-CanvasDigitalGauge.heightCache = [];
-
-canvasGauges.BaseGauge.initialize('CanvasDigitalGauge', defaultDigitalGaugeOptions);
-
-/* eslint-enable angular/angularelement */
diff --git a/ui/src/app/widget/lib/add-entity-panel.scss b/ui/src/app/widget/lib/add-entity-panel.scss
deleted file mode 100644
index b7573f7c1b..0000000000
--- a/ui/src/app/widget/lib/add-entity-panel.scss
+++ /dev/null
@@ -1,27 +0,0 @@
-/**
- * Copyright © 2016-2020 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-add-entity-panel {
- min-width: 150px;
- max-height: 200px;
- overflow: hidden;
- overflow-y: auto;
- background: #fff;
- border-radius: 4px;
- box-shadow:
- 0 7px 8px -4px rgba(0, 0, 0, .2),
- 0 13px 19px 2px rgba(0, 0, 0, .14),
- 0 5px 24px 4px rgba(0, 0, 0, .12);
-}
diff --git a/ui/src/app/widget/lib/add-entity-panel.tpl.html b/ui/src/app/widget/lib/add-entity-panel.tpl.html
deleted file mode 100644
index bc6b99e9b0..0000000000
--- a/ui/src/app/widget/lib/add-entity-panel.tpl.html
+++ /dev/null
@@ -1,22 +0,0 @@
-
-
-
- {{ entity.entityLabel || entity.name }}
-
-
diff --git a/ui/src/app/widget/lib/alarm-status-filter-panel.scss b/ui/src/app/widget/lib/alarm-status-filter-panel.scss
deleted file mode 100644
index bfc0b58387..0000000000
--- a/ui/src/app/widget/lib/alarm-status-filter-panel.scss
+++ /dev/null
@@ -1,30 +0,0 @@
-/**
- * Copyright © 2016-2020 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-alarm-status-filter-panel {
- min-width: 300px;
- overflow: hidden;
- background: #fff;
- border-radius: 4px;
- box-shadow:
- 0 7px 8px -4px rgba(0, 0, 0, .2),
- 0 13px 19px 2px rgba(0, 0, 0, .14),
- 0 5px 24px 4px rgba(0, 0, 0, .12);
-
- md-content {
- overflow: hidden;
- background-color: #fff;
- }
-}
diff --git a/ui/src/app/widget/lib/alarm-status-filter-panel.tpl.html b/ui/src/app/widget/lib/alarm-status-filter-panel.tpl.html
deleted file mode 100644
index 5790ac03e9..0000000000
--- a/ui/src/app/widget/lib/alarm-status-filter-panel.tpl.html
+++ /dev/null
@@ -1,27 +0,0 @@
-
-
-
-
-
- {{ ('alarm.search-status.' + searchStatus) | translate }}
-
-
-
diff --git a/ui/src/app/widget/lib/alarms-table-widget.js b/ui/src/app/widget/lib/alarms-table-widget.js
deleted file mode 100644
index aa2d1cc6b8..0000000000
--- a/ui/src/app/widget/lib/alarms-table-widget.js
+++ /dev/null
@@ -1,803 +0,0 @@
-/*
- * Copyright © 2016-2020 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 './alarms-table-widget.scss';
-import './display-columns-panel.scss';
-import './alarm-status-filter-panel.scss';
-
-/* eslint-disable import/no-unresolved, import/default */
-
-import alarmsTableWidgetTemplate from './alarms-table-widget.tpl.html';
-import alarmDetailsDialogTemplate from '../../alarm/alarm-details-dialog.tpl.html';
-import displayColumnsPanelTemplate from './display-columns-panel.tpl.html';
-import alarmStatusFilterPanelTemplate from './alarm-status-filter-panel.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-import tinycolor from 'tinycolor2';
-import cssjs from '../../../vendor/css.js/css';
-
-export default angular.module('thingsboard.widgets.alarmsTableWidget', [])
- .directive('tbAlarmsTableWidget', AlarmsTableWidget)
- .name;
-
-/*@ngInject*/
-function AlarmsTableWidget() {
- return {
- restrict: "E",
- scope: true,
- bindToController: {
- tableId: '=',
- ctx: '='
- },
- controller: AlarmsTableWidgetController,
- controllerAs: 'vm',
- templateUrl: alarmsTableWidgetTemplate
- };
-}
-
-/*@ngInject*/
-function AlarmsTableWidgetController($element, $scope, $filter, $mdMedia, $mdDialog, $mdPanel, $document, $translate, $q, $timeout, alarmService, utils, types) {
- var vm = this;
-
- vm.stylesInfo = {};
- vm.contentsInfo = {};
- vm.columnWidth = {};
-
- vm.showData = true;
- vm.hasData = false;
-
- vm.alarms = [];
- vm.alarmsCount = 0;
- vm.selectedAlarms = []
-
- vm.alarmSource = null;
- vm.alarmSearchStatus = null;
- vm.allAlarms = [];
-
- vm.currentAlarm = null;
-
- vm.enableSelection = true;
- vm.displayDetails = true;
- vm.allowAcknowledgment = true;
- vm.allowClear = true;
- vm.actionCellDescriptors = [];
- vm.displayPagination = true;
- vm.defaultPageSize = 10;
- vm.defaultSortOrder = '-'+types.alarmFields.createdTime.value;
-
- vm.query = {
- order: vm.defaultSortOrder,
- limit: vm.defaultPageSize,
- page: 1,
- search: null
- };
-
- vm.searchAction = {
- name: 'action.search',
- show: true,
- onAction: function() {
- vm.enterFilterMode();
- },
- icon: 'search'
- };
-
- let columnDisplayAction = {
- name: 'entity.columns-to-display',
- show: true,
- onAction: function($event) {
- vm.editColumnsToDisplay($event);
- },
- icon: 'view_column'
- };
-
- let statusFilterAction = {
- name: 'alarm.alarm-status-filter',
- show: true,
- onAction: function($event) {
- vm.editAlarmStatusFilter($event);
- },
- icon: 'filter_list'
- };
-
- vm.enterFilterMode = enterFilterMode;
- vm.exitFilterMode = exitFilterMode;
- vm.onReorder = onReorder;
- vm.onPaginate = onPaginate;
- vm.onRowClick = onRowClick;
- vm.onActionButtonClick = onActionButtonClick;
- vm.actionEnabled = actionEnabled;
- vm.isCurrent = isCurrent;
- vm.openAlarmDetails = openAlarmDetails;
- vm.ackAlarms = ackAlarms;
- vm.ackAlarm = ackAlarm;
- vm.clearAlarms = clearAlarms;
- vm.clearAlarm = clearAlarm;
-
- vm.cellStyle = cellStyle;
- vm.cellContent = cellContent;
-
- vm.editAlarmStatusFilter = editAlarmStatusFilter;
- vm.editColumnsToDisplay = editColumnsToDisplay;
-
- $scope.$watch('vm.ctx', function() {
- if (vm.ctx) {
- vm.settings = vm.ctx.settings;
- vm.widgetConfig = vm.ctx.widgetConfig;
- vm.subscription = vm.ctx.defaultSubscription;
- vm.alarmSource = vm.subscription.alarmSource;
- initializeConfig();
- updateAlarmSource();
- }
- });
-
- $scope.$watch("vm.query.search", function(newVal, prevVal) {
- if (!angular.equals(newVal, prevVal) && vm.query.search != null) {
- updateAlarms();
- }
- });
-
- $scope.$on('alarms-table-data-updated', function(event, tableId) {
- if (vm.tableId == tableId) {
- if (vm.subscription) {
- vm.allAlarms = vm.subscription.alarms || [];
- updateAlarms(true);
- $scope.$digest();
- }
- }
- });
-
- $scope.$watch(function() { return $mdMedia('gt-xs'); }, function(isGtXs) {
- vm.isGtXs = isGtXs;
- });
-
- $scope.$watch(function() { return $mdMedia('gt-md'); }, function(isGtMd) {
- vm.isGtMd = isGtMd;
- if (vm.isGtMd) {
- vm.limitOptions = [vm.defaultPageSize, vm.defaultPageSize*2, vm.defaultPageSize*3];
- } else {
- vm.limitOptions = null;
- }
- });
-
- $scope.$watch('vm.selectedAlarms.length', function (newLength) {
- var selectionMode = newLength ? true : false;
- if (vm.ctx) {
- if (selectionMode) {
- vm.ctx.hideTitlePanel = true;
- } else if (vm.query.search == null) {
- vm.ctx.hideTitlePanel = false;
- }
- }
- });
-
- function initializeConfig() {
-
- vm.ctx.widgetActions = [ vm.searchAction, statusFilterAction, columnDisplayAction ];
-
- vm.displayDetails = angular.isDefined(vm.settings.displayDetails) ? vm.settings.displayDetails : true;
- vm.allowAcknowledgment = angular.isDefined(vm.settings.allowAcknowledgment) ? vm.settings.allowAcknowledgment : true;
- vm.allowClear = angular.isDefined(vm.settings.allowClear) ? vm.settings.allowClear : true;
-
- if (vm.displayDetails) {
- vm.actionCellDescriptors.push(
- {
- displayName: $translate.instant('alarm.details'),
- icon: 'more_horiz',
- details: true
- }
- );
- }
-
- if (vm.allowAcknowledgment) {
- vm.actionCellDescriptors.push(
- {
- displayName: $translate.instant('alarm.acknowledge'),
- icon: 'done',
- acknowledge: true
- }
- );
- }
-
- if (vm.allowClear) {
- vm.actionCellDescriptors.push(
- {
- displayName: $translate.instant('alarm.clear'),
- icon: 'clear',
- clear: true
- }
- );
- }
-
- vm.actionCellDescriptors = vm.actionCellDescriptors.concat(vm.ctx.actionsApi.getActionDescriptors('actionCellButton'));
-
- if (vm.settings.alarmsTitle && vm.settings.alarmsTitle.length) {
- vm.alarmsTitle = utils.customTranslation(vm.settings.alarmsTitle, vm.settings.alarmsTitle);
- } else {
- vm.alarmsTitle = $translate.instant('alarm.alarms');
- }
-
- vm.ctx.widgetTitle = vm.alarmsTitle;
-
- vm.enableSelection = angular.isDefined(vm.settings.enableSelection) ? vm.settings.enableSelection : true;
- vm.searchAction.show = angular.isDefined(vm.settings.enableSearch) ? vm.settings.enableSearch : true;
- columnDisplayAction.show = angular.isDefined(vm.settings.enableSelectColumnDisplay) ? vm.settings.enableSelectColumnDisplay : true;
- statusFilterAction.show = angular.isDefined(vm.settings.enableStatusFilter) ? vm.settings.enableStatusFilter : true;
- if (!vm.allowAcknowledgment && !vm.allowClear) {
- vm.enableSelection = false;
- }
-
- vm.displayPagination = angular.isDefined(vm.settings.displayPagination) ? vm.settings.displayPagination : true;
-
- var pageSize = vm.settings.defaultPageSize;
- if (angular.isDefined(pageSize) && angular.isNumber(pageSize) && pageSize > 0) {
- vm.defaultPageSize = pageSize;
- }
-
- if (vm.settings.defaultSortOrder && vm.settings.defaultSortOrder.length) {
- vm.defaultSortOrder = vm.settings.defaultSortOrder;
- }
-
- vm.query.order = vm.defaultSortOrder;
- vm.query.limit = vm.defaultPageSize;
- if (vm.isGtMd) {
- vm.limitOptions = [vm.defaultPageSize, vm.defaultPageSize*2, vm.defaultPageSize*3];
- } else {
- vm.limitOptions = null;
- }
-
- var origColor = vm.widgetConfig.color || 'rgba(0, 0, 0, 0.87)';
- var defaultColor = tinycolor(origColor);
- var mdDark = defaultColor.setAlpha(0.87).toRgbString();
- var mdDarkSecondary = defaultColor.setAlpha(0.54).toRgbString();
- var mdDarkDisabled = defaultColor.setAlpha(0.26).toRgbString();
- //var mdDarkIcon = mdDarkSecondary;
- var mdDarkDivider = defaultColor.setAlpha(0.12).toRgbString();
-
- var cssString = 'table.md-table th.md-column {\n'+
- 'color: ' + mdDarkSecondary + ';\n'+
- '}\n'+
- 'table.md-table th.md-column.md-checkbox-column md-checkbox:not(.md-checked) .md-icon {\n'+
- 'border-color: ' + mdDarkSecondary + ';\n'+
- '}\n'+
- 'table.md-table th.md-column md-icon.md-sort-icon {\n'+
- 'color: ' + mdDarkDisabled + ';\n'+
- '}\n'+
- 'table.md-table th.md-column.md-active, table.md-table th.md-column.md-active md-icon {\n'+
- 'color: ' + mdDark + ';\n'+
- '}\n'+
- 'table.md-table td.md-cell {\n'+
- 'color: ' + mdDark + ';\n'+
- 'border-top: 1px '+mdDarkDivider+' solid;\n'+
- '}\n'+
- 'table.md-table td.md-cell.md-checkbox-cell md-checkbox:not(.md-checked) .md-icon {\n'+
- 'border-color: ' + mdDarkSecondary + ';\n'+
- '}\n'+
- 'table.md-table td.md-cell.tb-action-cell button.md-icon-button md-icon {\n'+
- 'color: ' + mdDarkSecondary + ';\n'+
- '}\n'+
- 'table.md-table td.md-cell.md-placeholder {\n'+
- 'color: ' + mdDarkDisabled + ';\n'+
- '}\n'+
- 'table.md-table td.md-cell md-select > .md-select-value > span.md-select-icon {\n'+
- 'color: ' + mdDarkSecondary + ';\n'+
- '}\n'+
- '.md-table-pagination {\n'+
- 'color: ' + mdDarkSecondary + ';\n'+
- 'border-top: 1px '+mdDarkDivider+' solid;\n'+
- '}\n'+
- '.md-table-pagination .buttons md-icon {\n'+
- 'color: ' + mdDarkSecondary + ';\n'+
- '}\n'+
- '.md-table-pagination md-select:not([disabled]):focus .md-select-value {\n'+
- 'color: ' + mdDarkSecondary + ';\n'+
- '}';
-
- var cssParser = new cssjs();
- cssParser.testMode = false;
- var namespace = 'ts-table-' + hashCode(cssString);
- cssParser.cssPreviewNamespace = namespace;
- cssParser.createStyleElement(namespace, cssString);
- $element.addClass(namespace);
-
- function hashCode(str) {
- var hash = 0;
- var i, char;
- if (str.length === 0) return hash;
- for (i = 0; i < str.length; i++) {
- char = str.charCodeAt(i);
- hash = ((hash << 5) - hash) + char;
- hash = hash & hash;
- }
- return hash;
- }
- }
-
- function enterFilterMode () {
- vm.query.search = '';
- vm.ctx.hideTitlePanel = true;
- $timeout(()=>{
- angular.element(vm.ctx.$container).find('.searchInput').focus();
- })
- }
-
- function exitFilterMode () {
- vm.query.search = null;
- updateAlarms();
- vm.ctx.hideTitlePanel = false;
- }
-
- function onReorder () {
- updateAlarms();
- }
-
- function onPaginate () {
- updateAlarms();
- }
-
- function onRowClick($event, alarm) {
- if ($event) {
- $event.stopPropagation();
- }
- if (vm.currentAlarm != alarm) {
- vm.currentAlarm = alarm;
- }
- var descriptors = vm.ctx.actionsApi.getActionDescriptors('rowClick');
- if (descriptors.length) {
- var entityId;
- var entityName;
- if (vm.currentAlarm && vm.currentAlarm.originator) {
- entityId = vm.currentAlarm.originator;
- entityName = vm.currentAlarm.originatorName;
- }
- vm.ctx.actionsApi.handleWidgetAction($event, descriptors[0], entityId, entityName, { alarm: alarm });
- }
- }
-
- function onActionButtonClick($event, alarm, actionDescriptor) {
- if (actionDescriptor.details) {
- vm.openAlarmDetails($event, alarm);
- } else if (actionDescriptor.acknowledge) {
- vm.ackAlarm($event, alarm);
- } else if (actionDescriptor.clear) {
- vm.clearAlarm($event, alarm);
- } else {
- if ($event) {
- $event.stopPropagation();
- }
- var entityId;
- var entityName;
- if (alarm && alarm.originator) {
- entityId = alarm.originator;
- entityName = alarm.originatorName;
- }
- vm.ctx.actionsApi.handleWidgetAction($event, actionDescriptor, entityId, entityName, {alarm: alarm});
- }
- }
-
- function actionEnabled(alarm, actionDescriptor) {
- if (actionDescriptor.acknowledge) {
- return (alarm.status == types.alarmStatus.activeUnack ||
- alarm.status == types.alarmStatus.clearedUnack);
- } else if (actionDescriptor.clear) {
- return (alarm.status == types.alarmStatus.activeAck ||
- alarm.status == types.alarmStatus.activeUnack);
- }
- return true;
- }
-
- function isCurrent(alarm) {
- return (vm.currentAlarm && alarm && vm.currentAlarm.id && alarm.id) &&
- (vm.currentAlarm.id.id === alarm.id.id);
- }
-
- function openAlarmDetails($event, alarm) {
- if (alarm && alarm.id) {
- var onShowingCallback = {
- onShowing: function(){}
- }
- $mdDialog.show({
- controller: 'AlarmDetailsDialogController',
- controllerAs: 'vm',
- templateUrl: alarmDetailsDialogTemplate,
- locals: {
- alarmId: alarm.id.id,
- allowAcknowledgment: vm.allowAcknowledgment,
- allowClear: vm.allowClear,
- displayDetails: true,
- showingCallback: onShowingCallback
- },
- parent: angular.element($document[0].body),
- targetEvent: $event,
- fullscreen: true,
- multiple: true,
- onShowing: function(scope, element) {
- onShowingCallback.onShowing(scope, element);
- }
- }).then(function (alarm) {
- if (alarm) {
- vm.subscription.update();
- }
- });
-
- }
- }
-
- function ackAlarms($event) {
- if ($event) {
- $event.stopPropagation();
- }
- if (vm.selectedAlarms && vm.selectedAlarms.length > 0) {
- var title = $translate.instant('alarm.aknowledge-alarms-title', {count: vm.selectedAlarms.length}, 'messageformat');
- var content = $translate.instant('alarm.aknowledge-alarms-text', {count: vm.selectedAlarms.length}, 'messageformat');
- var confirm = $mdDialog.confirm()
- .targetEvent($event)
- .title(title)
- .htmlContent(content)
- .ariaLabel(title)
- .cancel($translate.instant('action.no'))
- .ok($translate.instant('action.yes'));
- $mdDialog.show(confirm).then(function () {
- var tasks = [];
- for (var i=0;i 0) {
- var title = $translate.instant('alarm.clear-alarms-title', {count: vm.selectedAlarms.length}, 'messageformat');
- var content = $translate.instant('alarm.clear-alarms-text', {count: vm.selectedAlarms.length}, 'messageformat');
- var confirm = $mdDialog.confirm()
- .targetEvent($event)
- .title(title)
- .htmlContent(content)
- .ariaLabel(title)
- .cancel($translate.instant('action.no'))
- .ok($translate.instant('action.yes'));
- $mdDialog.show(confirm).then(function () {
- var tasks = [];
- for (var i=0;i (
- path.split('.').reduce((acc, part) => acc && acc[part], obj)
- );
-
- function getAlarmValue(alarm, key) {
- var alarmField = types.alarmFields[key.name];
- if (alarmField) {
- return getDescendantProp(alarm, alarmField.value);
- } else {
- return getDescendantProp(alarm, key.name);
- }
- }
-
- function editAlarmStatusFilter($event) {
- var element = angular.element($event.target);
- var position = $mdPanel.newPanelPosition()
- .relativeTo(element)
- .addPanelPosition($mdPanel.xPosition.ALIGN_END, $mdPanel.yPosition.BELOW);
- var config = {
- attachTo: angular.element($document[0].body),
- controller: AlarmStatusFilterPanelController,
- controllerAs: 'vm',
- templateUrl: alarmStatusFilterPanelTemplate,
- panelClass: 'tb-alarm-status-filter-panel',
- position: position,
- fullscreen: false,
- locals: {
- 'subscription': vm.subscription
- },
- openFrom: $event,
- clickOutsideToClose: true,
- escapeToClose: true,
- focusOnOpen: false
- };
- $mdPanel.open(config);
- }
-
- function editColumnsToDisplay($event) {
- var element = angular.element($event.target);
- var position = $mdPanel.newPanelPosition()
- .relativeTo(element)
- .addPanelPosition($mdPanel.xPosition.ALIGN_END, $mdPanel.yPosition.BELOW);
- var config = {
- attachTo: angular.element($document[0].body),
- controller: DisplayColumnsPanelController,
- controllerAs: 'vm',
- templateUrl: displayColumnsPanelTemplate,
- panelClass: 'tb-display-columns-panel',
- position: position,
- fullscreen: false,
- locals: {
- 'columns': vm.alarmSource.dataKeys
- },
- openFrom: $event,
- clickOutsideToClose: true,
- escapeToClose: true,
- focusOnOpen: false
- };
- $mdPanel.open(config);
- }
-
- function updateAlarmSource() {
-
- vm.ctx.widgetTitle = utils.createLabelFromDatasource(vm.alarmSource, vm.alarmsTitle);
-
- vm.stylesInfo = {};
- vm.contentsInfo = {};
- vm.columnWidth = {};
-
- for (var d = 0; d < vm.alarmSource.dataKeys.length; d++ ) {
- var dataKey = vm.alarmSource.dataKeys[d];
-
- dataKey.title = utils.customTranslation(dataKey.label, dataKey.label);
- dataKey.display = true;
-
- var keySettings = dataKey.settings;
-
- var cellStyleFunction = null;
- var useCellStyleFunction = false;
-
- if (keySettings.useCellStyleFunction === true) {
- if (angular.isDefined(keySettings.cellStyleFunction) && keySettings.cellStyleFunction.length > 0) {
- try {
- cellStyleFunction = new Function('value', keySettings.cellStyleFunction);
- useCellStyleFunction = true;
- } catch (e) {
- cellStyleFunction = null;
- useCellStyleFunction = false;
- }
- }
- }
-
- vm.stylesInfo[dataKey.label] = {
- useCellStyleFunction: useCellStyleFunction,
- cellStyleFunction: cellStyleFunction
- };
-
- var cellContentFunction = null;
- var useCellContentFunction = false;
-
- if (keySettings.useCellContentFunction === true) {
- if (angular.isDefined(keySettings.cellContentFunction) && keySettings.cellContentFunction.length > 0) {
- try {
- cellContentFunction = new Function('value, alarm, filter', keySettings.cellContentFunction);
- useCellContentFunction = true;
- } catch (e) {
- cellContentFunction = null;
- useCellContentFunction = false;
- }
- }
- }
-
- vm.contentsInfo[dataKey.label] = {
- useCellContentFunction: useCellContentFunction,
- cellContentFunction: cellContentFunction
- };
-
- var columnWidth = angular.isDefined(keySettings.columnWidth) ? keySettings.columnWidth : '0px';
- vm.columnWidth[dataKey.label] = columnWidth;
- }
- }
-
-}
-
-/*@ngInject*/
-function DisplayColumnsPanelController(columns) { //eslint-disable-line
-
- var vm = this;
- vm.columns = columns;
-}
-
-/*@ngInject*/
-function AlarmStatusFilterPanelController(subscription, types) { //eslint-disable-line
-
- var vm = this;
- vm.types = types;
- vm.subscription = subscription;
-}
diff --git a/ui/src/app/widget/lib/alarms-table-widget.scss b/ui/src/app/widget/lib/alarms-table-widget.scss
deleted file mode 100644
index 427323890e..0000000000
--- a/ui/src/app/widget/lib/alarms-table-widget.scss
+++ /dev/null
@@ -1,61 +0,0 @@
-/**
- * Copyright © 2016-2020 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-has-timewindow {
- .tb-alarms-table {
- md-toolbar {
- min-height: 60px;
- max-height: 60px;
-
- &.md-table-toolbar {
- .md-toolbar-tools {
- max-height: 60px;
- }
- }
- }
- }
-}
-
-.tb-alarms-table {
- md-toolbar {
- min-height: 39px;
- max-height: 39px;
-
- &.md-table-toolbar {
- .md-toolbar-tools {
- max-height: 39px;
- }
- }
- }
-
- &.tb-data-table {
- table.md-table,
- table.md-table.md-row-select {
- tbody {
- .tb-action-cell {
- width: 36px;
- min-width: 36px;
- max-width: 36px;
-
- .md-button[disabled] {
- md-icon {
- color: rgba(0, 0, 0, .38);
- }
- }
- }
- }
- }
- }
-}
diff --git a/ui/src/app/widget/lib/alarms-table-widget.tpl.html b/ui/src/app/widget/lib/alarms-table-widget.tpl.html
deleted file mode 100644
index 16fdd01a63..0000000000
--- a/ui/src/app/widget/lib/alarms-table-widget.tpl.html
+++ /dev/null
@@ -1,108 +0,0 @@
-
-
-
-
-
-
- search
-
- {{'alarm.search' | translate}}
-
-
-
-
-
-
-
- close
-
- {{ 'action.close' | translate }}
-
-
-
-
-
-
-
-
-
- done
-
- {{ 'alarm.acknowledge' | translate }}
-
-
-
- clear
-
- {{ 'alarm.clear' | translate }}
-
-
-
-
-
-
-
-
- | {{ key.title }} |
- |
-
-
-
-
- |
- |
-
-
- {{actionDescriptor.icon}}
-
- {{ actionDescriptor.displayName }}
-
-
- |
-
-
-
-
- alarm.no-alarms-prompt
-
-
-
-
-
alarm.no-data
-
diff --git a/ui/src/app/widget/lib/analogue-compass.js b/ui/src/app/widget/lib/analogue-compass.js
deleted file mode 100644
index f7cf4eb875..0000000000
--- a/ui/src/app/widget/lib/analogue-compass.js
+++ /dev/null
@@ -1,444 +0,0 @@
-/*
- * Copyright © 2016-2020 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 $ from 'jquery';
-import canvasGauges from 'canvas-gauges';
-/*import tinycolor from 'tinycolor2';*/
-
-/* eslint-disable angular/angularelement */
-
-export default class TbAnalogueCompass {
- constructor(ctx, canvasId) {
- this.ctx = ctx;
-
- canvasGauges.performance = window.performance; // eslint-disable-line no-undef, angular/window-service
-
- var gaugeElement = $('#'+canvasId, ctx.$container);
-
- var settings = ctx.settings;
- var majorTicks = (settings.majorTicks && settings.majorTicks.length > 0) ? angular.copy(settings.majorTicks) : ["N","NE","E","SE","S","SW","W","NW"];
- majorTicks.push(majorTicks[0]);
-
- function getFontFamily(fontSettings) {
- var family = fontSettings && fontSettings.family ? fontSettings.family : 'Roboto';
- if (family === 'RobotoDraft') {
- family = 'Roboto';
- }
- return family;
- }
-
- var gaugeData = {
-
- renderTo: gaugeElement[0],
-
- // Generic options
- minValue: 0,
- maxValue: 360,
- majorTicks: majorTicks,
- minorTicks: settings.minorTicks || 22,
- ticksAngle: 360,
- startAngle: 180,
- strokeTicks: settings.showStrokeTicks || false,
- highlights: false,
- valueBox: false,
-
- //needle
- needleCircleSize: settings.needleCircleSize || 15,
- needleType: 'line',
- needleStart: 75,
- needleEnd: 99,
- needleWidth: 3,
- needleCircleOuter: false,
-
- //borders
- borders: settings.showBorder || false,
- borderInnerWidth: 0,
- borderMiddleWidth: 0,
- borderOuterWidth: settings.borderOuterWidth || 10,
- borderShadowWidth: 0,
-
- //colors
- colorPlate: settings.colorPlate || '#222',
- colorMajorTicks: settings.colorMajorTicks || '#f5f5f5',
- colorMinorTicks: settings.colorMinorTicks || '#ddd',
- colorNeedle: settings.colorNeedle || '#f08080',
- colorNeedleEnd: settings.colorNeedle || '#f08080',
- colorNeedleCircleInner: settings.colorNeedleCircle || '#e8e8e8',
- colorNeedleCircleInnerEnd: settings.colorNeedleCircle || '#e8e8e8',
- colorBorderOuter: settings.colorBorder || '#ccc',
- colorBorderOuterEnd: settings.colorBorder || '#ccc',
- colorNeedleShadowDown: "#222",
-
- //fonts
- fontNumbers: getFontFamily(settings.majorTickFont),
- fontNumbersSize: settings.majorTickFont && settings.majorTickFont.size ? settings.majorTickFont.size : 20,
- fontNumbersStyle: settings.majorTickFont && settings.majorTickFont.style ? settings.majorTickFont.style : 'normal',
- fontNumbersWeight: settings.majorTickFont && settings.majorTickFont.weight ? settings.majorTickFont.weight : '500',
- colorNumbers: settings.majorTickFont && settings.majorTickFont.color ? settings.majorTickFont.color : '#ccc',
-
- //animations
- animation: settings.animation !== false && !ctx.isMobile,
- animationDuration: (angular.isDefined(settings.animationDuration) && settings.animationDuration !== null) ? settings.animationDuration : 500,
- animationRule: settings.animationRule || 'cycle',
- animationTarget: settings.animationTarget || 'needle'
- };
- this.gauge = new canvasGauges.RadialGauge(gaugeData).draw();
- }
-
- update() {
- if (this.ctx.data.length > 0) {
- var cellData = this.ctx.data[0];
- if (cellData.data.length > 0) {
- var tvPair = cellData.data[cellData.data.length -
- 1];
- var value = tvPair[1];
- if(value !== this.gauge.value) {
- this.gauge.value = value;
- }
- }
- }
- }
-
- mobileModeChanged() {
- var animation = this.ctx.settings.animation !== false && !this.ctx.isMobile;
- this.gauge.update({animation: animation});
- }
-
- resize() {
- this.gauge.update({width: this.ctx.width, height: this.ctx.height});
- }
-
- static get settingsSchema() {
- return {
- "schema": {
- "type": "object",
- "title": "Settings",
- "properties": {
- "majorTicks": {
- "title": "Major ticks names",
- "type": "array",
- "items": {
- "title": "Tick name",
- "type": "string"
- }
- },
- "minorTicks": {
- "title": "Minor ticks count",
- "type": "number",
- "default": 22
- },
- "showStrokeTicks": {
- "title": "Show ticks stroke",
- "type": "boolean",
- "default": false
- },
- "needleCircleSize": {
- "title": "Needle circle size",
- "type": "number",
- "default": 15
- },
- "showBorder": {
- "title": "Show border",
- "type": "boolean",
- "default": true
- },
- "borderOuterWidth": {
- "title": "Border width",
- "type": "number",
- "default": 10
- },
- "colorPlate": {
- "title": "Plate color",
- "type": "string",
- "default": "#222"
- },
- "colorMajorTicks": {
- "title": "Major ticks color",
- "type": "string",
- "default": "#f5f5f5"
- },
- "colorMinorTicks": {
- "title": "Minor ticks color",
- "type": "string",
- "default": "#ddd"
- },
- "colorNeedle": {
- "title": "Needle color",
- "type": "string",
- "default": "#f08080"
- },
- "colorNeedleCircle": {
- "title": "Needle circle color",
- "type": "string",
- "default": "#e8e8e8"
- },
- "colorBorder": {
- "title": "Border color",
- "type": "string",
- "default": "#ccc"
- },
- "majorTickFont": {
- "title": "Major tick font",
- "type": "object",
- "properties": {
- "family": {
- "title": "Font family",
- "type": "string",
- "default": "Roboto"
- },
- "size": {
- "title": "Size",
- "type": "number",
- "default": 20
- },
- "style": {
- "title": "Style",
- "type": "string",
- "default": "normal"
- },
- "weight": {
- "title": "Weight",
- "type": "string",
- "default": "500"
- },
- "color": {
- "title": "color",
- "type": "string",
- "default": "#ccc"
- }
- }
- },
- "animation": {
- "title": "Enable animation",
- "type": "boolean",
- "default": true
- },
- "animationDuration": {
- "title": "Animation duration",
- "type": "number",
- "default": 500
- },
- "animationRule": {
- "title": "Animation rule",
- "type": "string",
- "default": "cycle"
- },
- "animationTarget": {
- "title": "Animation target",
- "type": "string",
- "default": "needle"
- }
- },
- "required": []
- },
- "form": [
- {
- "key": "majorTicks",
- "items":[
- "majorTicks[]"
- ]
- },
- "minorTicks",
- "showStrokeTicks",
- "needleCircleSize",
- "showBorder",
- "borderOuterWidth",
- {
- "key": "colorPlate",
- "type": "color"
- },
- {
- "key": "colorMajorTicks",
- "type": "color"
- },
- {
- "key": "colorMinorTicks",
- "type": "color"
- },
- {
- "key": "colorNeedle",
- "type": "color"
- },
- {
- "key": "colorNeedleCircle",
- "type": "color"
- },
- {
- "key": "colorBorder",
- "type": "color"
- },
- {
- "key": "majorTickFont",
- "items": [
- "majorTickFont.family",
- "majorTickFont.size",
- {
- "key": "majorTickFont.style",
- "type": "rc-select",
- "multiple": false,
- "items": [
- {
- "value": "normal",
- "label": "Normal"
- },
- {
- "value": "italic",
- "label": "Italic"
- },
- {
- "value": "oblique",
- "label": "Oblique"
- }
- ]
- },
- {
- "key": "majorTickFont.weight",
- "type": "rc-select",
- "multiple": false,
- "items": [
- {
- "value": "normal",
- "label": "Normal"
- },
- {
- "value": "bold",
- "label": "Bold"
- },
- {
- "value": "bolder",
- "label": "Bolder"
- },
- {
- "value": "lighter",
- "label": "Lighter"
- },
- {
- "value": "100",
- "label": "100"
- },
- {
- "value": "200",
- "label": "200"
- },
- {
- "value": "300",
- "label": "300"
- },
- {
- "value": "400",
- "label": "400"
- },
- {
- "value": "500",
- "label": "500"
- },
- {
- "value": "600",
- "label": "600"
- },
- {
- "value": "700",
- "label": "800"
- },
- {
- "value": "800",
- "label": "800"
- },
- {
- "value": "900",
- "label": "900"
- }
- ]
- },
- {
- "key": "majorTickFont.color",
- "type": "color"
- }
- ]
- },
- "animation",
- "animationDuration",
- {
- "key": "animationRule",
- "type": "rc-select",
- "multiple": false,
- "items": [
- {
- "value": "linear",
- "label": "Linear"
- },
- {
- "value": "quad",
- "label": "Quad"
- },
- {
- "value": "quint",
- "label": "Quint"
- },
- {
- "value": "cycle",
- "label": "Cycle"
- },
- {
- "value": "bounce",
- "label": "Bounce"
- },
- {
- "value": "elastic",
- "label": "Elastic"
- },
- {
- "value": "dequad",
- "label": "Dequad"
- },
- {
- "value": "dequint",
- "label": "Dequint"
- },
- {
- "value": "decycle",
- "label": "Decycle"
- },
- {
- "value": "debounce",
- "label": "Debounce"
- },
- {
- "value": "delastic",
- "label": "Delastic"
- }
- ]
- },
- {
- "key": "animationTarget",
- "type": "rc-select",
- "multiple": false,
- "items": [
- {
- "value": "needle",
- "label": "Needle"
- },
- {
- "value": "plate",
- "label": "Plate"
- }
- ]
- }
- ]
- };
- }
-}
-
-/* eslint-enable angular/angularelement */
diff --git a/ui/src/app/widget/lib/analogue-linear-gauge.js b/ui/src/app/widget/lib/analogue-linear-gauge.js
deleted file mode 100644
index 4f9b39c143..0000000000
--- a/ui/src/app/widget/lib/analogue-linear-gauge.js
+++ /dev/null
@@ -1,1057 +0,0 @@
-/*
- * Copyright © 2016-2020 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 $ from 'jquery';
-import canvasGauges from 'canvas-gauges';
-import tinycolor from 'tinycolor2';
-
-/* eslint-disable angular/angularelement */
-export default class TbAnalogueLinearGauge {
- constructor(ctx, canvasId) {
-
- this.ctx = ctx;
-
- canvasGauges.performance = window.performance; // eslint-disable-line no-undef, angular/window-service
-
- var gaugeElement = $('#'+canvasId, ctx.$container);
-
- var settings = ctx.settings;
-
- var minValue = settings.minValue || 0;
- var maxValue = settings.maxValue || 100;
-
- var dataKey = ctx.data[0].dataKey;
- var keyColor = settings.defaultColor || dataKey.color;
-
- var majorTicksCount = settings.majorTicksCount || 10;
- var total = maxValue-minValue;
- var step = (total/majorTicksCount);
-
- var valueInt = settings.valueInt || 3;
-
- var valueDec = getValueDec(settings);
-
- step = parseFloat(parseFloat(step).toFixed(valueDec));
-
- var majorTicks = [];
- var highlights = [];
- var tick = minValue;
-
- while(tick<=maxValue) {
- majorTicks.push(tick);
- var nextTick = tick+step;
- nextTick = parseFloat(parseFloat(nextTick).toFixed(valueDec));
- if (tick 0 ? settings.units : ctx.units;
- }
- }
-
- function getValueDec(settings) {
- var dataKey;
- if (ctx.data && ctx.data[0]) {
- dataKey = ctx.data[0].dataKey;
- }
- if (dataKey && angular.isDefined(dataKey.decimals)) {
- return dataKey.decimals;
- } else {
- return (angular.isDefined(settings.valueDec) && settings.valueDec !== null)
- ? settings.valueDec : ctx.decimals;
- }
- }
-
-
- function getFontFamily(fontSettings) {
- var family = fontSettings && fontSettings.family ? fontSettings.family : 'Roboto';
- if (family === 'RobotoDraft') {
- family = 'Roboto';
- }
- return family;
- }
-
- var gaugeData = {
-
- renderTo: gaugeElement[0],
-
- /* Generic options */
-
- minValue: minValue,
- maxValue: maxValue,
- majorTicks: majorTicks,
- minorTicks: settings.minorTicks || 2,
- units: getUnits(settings),
- title: ((settings.showUnitTitle !== false) ?
- (settings.unitTitle && settings.unitTitle.length > 0 ?
- settings.unitTitle : dataKey.label) : ''),
-
- borders: settings.showBorder === true,
- borderShadowWidth: (settings.showBorder === true) ? 3 : 0,
- borderOuterWidth: (settings.showBorder === true) ? 3 : 0,
- borderMiddleWidth: (settings.showBorder === true) ? 3 : 0,
- borderInnerWidth: (settings.showBorder === true) ? 3 : 0,
-
- // borders
-
- // number formats
- valueInt: valueInt,
- valueDec: valueDec,
- majorTicksInt: 1,
- majorTicksDec: 0,
-
- valueBox: settings.valueBox !== false,
- valueBoxStroke: 5,
- valueBoxWidth: 0,
- valueText: '',
- valueTextShadow: true,
- valueBoxBorderRadius: 2.5,
-
- //highlights
- highlights: (settings.highlights && settings.highlights.length > 0) ? settings.highlights : highlights,
- highlightsWidth: (angular.isDefined(settings.highlightsWidth) && settings.highlightsWidth !== null) ? settings.highlightsWidth : 10,
-
- //fonts
- fontNumbers: getFontFamily(settings.numbersFont),
- fontTitle: getFontFamily(settings.titleFont),
- fontUnits: getFontFamily(settings.unitsFont),
- fontValue: getFontFamily(settings.valueFont),
-
- fontNumbersSize: settings.numbersFont && settings.numbersFont.size ? settings.numbersFont.size : 18,
- fontTitleSize: settings.titleFont && settings.titleFont.size ? settings.titleFont.size : 24,
- fontUnitsSize: settings.unitsFont && settings.unitsFont.size ? settings.unitsFont.size : 22,
- fontValueSize: settings.valueFont && settings.valueFont.size ? settings.valueFont.size : 40,
-
- fontNumbersStyle: settings.numbersFont && settings.numbersFont.style ? settings.numbersFont.style : 'normal',
- fontTitleStyle: settings.titleFont && settings.titleFont.style ? settings.titleFont.style : 'normal',
- fontUnitsStyle: settings.unitsFont && settings.unitsFont.style ? settings.unitsFont.style : 'normal',
- fontValueStyle: settings.valueFont && settings.valueFont.style ? settings.valueFont.style : 'normal',
-
- fontNumbersWeight: settings.numbersFont && settings.numbersFont.weight ? settings.numbersFont.weight : '500',
- fontTitleWeight: settings.titleFont && settings.titleFont.weight ? settings.titleFont.weight : '500',
- fontUnitsWeight: settings.unitsFont && settings.unitsFont.weight ? settings.unitsFont.weight : '500',
- fontValueWeight: settings.valueFont && settings.valueFont.weight ? settings.valueFont.weight : '500',
-
- colorNumbers: settings.numbersFont && settings.numbersFont.color ? settings.numbersFont.color : colorNumbers,
- colorTitle: settings.titleFont && settings.titleFont.color ? settings.titleFont.color : '#888',
- colorUnits: settings.unitsFont && settings.unitsFont.color ? settings.unitsFont.color : '#888',
- colorValueText: settings.valueFont && settings.valueFont.color ? settings.valueFont.color : '#444',
- colorValueTextShadow: settings.valueFont && settings.valueFont.shadowColor ? settings.valueFont.shadowColor : 'rgba(0,0,0,0.3)',
-
- //colors
- colorPlate: settings.colorPlate || '#fff',
- colorMajorTicks: settings.colorMajorTicks || '#444',
- colorMinorTicks: settings.colorMinorTicks || '#666',
- colorNeedle: settings.colorNeedle || keyColor,
- colorNeedleEnd: settings.colorNeedleEnd || keyColor,
-
- colorValueBoxRect: settings.colorValueBoxRect || '#888',
- colorValueBoxRectEnd: settings.colorValueBoxRectEnd || '#666',
- colorValueBoxBackground: settings.colorValueBoxBackground || '#babab2',
- colorValueBoxShadow: settings.colorValueBoxShadow || 'rgba(0,0,0,1)',
- colorNeedleShadowUp: settings.colorNeedleShadowUp || 'rgba(2,255,255,0.2)',
- colorNeedleShadowDown: settings.colorNeedleShadowDown || 'rgba(188,143,143,0.45)',
-
- // animations
- animation: settings.animation !== false && !ctx.isMobile,
- animationDuration: (angular.isDefined(settings.animationDuration) && settings.animationDuration !== null) ? settings.animationDuration : 500,
- animationRule: settings.animationRule || 'cycle',
-
- /* Linear gauge specific */
-
- barStrokeWidth: (angular.isDefined(settings.barStrokeWidth) && settings.barStrokeWidth !== null) ? settings.barStrokeWidth : 2.5,
- colorBarStroke: settings.colorBarStroke || barStrokeColor,
- colorBar: settings.colorBar || "#fff",
- colorBarEnd: settings.colorBarEnd || "#ddd",
- colorBarProgress: settings.colorBarProgress || progressColorStart,
- colorBarProgressEnd: settings.colorBarProgressEnd || progressColorEnd
- };
- this.gauge = new canvasGauges.LinearGauge(gaugeData).draw();
- }
-
- update() {
- if (this.ctx.data.length > 0) {
- var cellData = this.ctx.data[0];
- if (cellData.data.length > 0) {
- var tvPair = cellData.data[cellData.data.length -
- 1];
- var value = tvPair[1];
- if(value !== this.gauge.value) {
- this.gauge.value = value;
- }
- }
- }
- }
-
- mobileModeChanged() {
- var animation = this.ctx.settings.animation !== false && !this.ctx.isMobile;
- this.gauge.update({animation: animation});
- }
-
- resize() {
- this.gauge.update({width: this.ctx.width, height: this.ctx.height});
- }
-
- static get settingsSchema() {
- return {
- "schema": {
- "type": "object",
- "title": "Settings",
- "properties": {
- "minValue": {
- "title": "Minimum value",
- "type": "number",
- "default": 0
- },
- "maxValue": {
- "title": "Maximum value",
- "type": "number",
- "default": 100
- },
- "unitTitle": {
- "title": "Unit title",
- "type": "string",
- "default": null
- },
- "showUnitTitle": {
- "title": "Show unit title",
- "type": "boolean",
- "default": true
- },
- "majorTicksCount": {
- "title": "Major ticks count",
- "type": "number",
- "default": null
- },
- "minorTicks": {
- "title": "Minor ticks count",
- "type": "number",
- "default": 2
- },
- "valueBox": {
- "title": "Show value box",
- "type": "boolean",
- "default": true
- },
- "valueInt": {
- "title": "Digits count for integer part of value",
- "type": "number",
- "default": 3
- },
- "defaultColor": {
- "title": "Default color",
- "type": "string",
- "default": null
- },
- "colorPlate": {
- "title": "Plate color",
- "type": "string",
- "default": "#fff"
- },
- "colorMajorTicks": {
- "title": "Major ticks color",
- "type": "string",
- "default": "#444"
- },
- "colorMinorTicks": {
- "title": "Minor ticks color",
- "type": "string",
- "default": "#666"
- },
- "colorNeedle": {
- "title": "Needle color",
- "type": "string",
- "default": null
- },
- "colorNeedleEnd": {
- "title": "Needle color - end gradient",
- "type": "string",
- "default": null
- },
- "colorNeedleShadowUp": {
- "title": "Upper half of the needle shadow color",
- "type": "string",
- "default": "rgba(2,255,255,0.2)"
- },
- "colorNeedleShadowDown": {
- "title": "Drop shadow needle color.",
- "type": "string",
- "default": "rgba(188,143,143,0.45)"
- },
- "colorValueBoxRect": {
- "title": "Value box rectangle stroke color",
- "type": "string",
- "default": "#888"
- },
- "colorValueBoxRectEnd": {
- "title": "Value box rectangle stroke color - end gradient",
- "type": "string",
- "default": "#666"
- },
- "colorValueBoxBackground": {
- "title": "Value box background color",
- "type": "string",
- "default": "#babab2"
- },
- "colorValueBoxShadow": {
- "title": "Value box shadow color",
- "type": "string",
- "default": "rgba(0,0,0,1)"
- },
- "highlights": {
- "title": "Highlights",
- "type": "array",
- "items": {
- "title": "Highlight",
- "type": "object",
- "properties": {
- "from": {
- "title": "From",
- "type": "number"
- },
- "to": {
- "title": "To",
- "type": "number"
- },
- "color": {
- "title": "Color",
- "type": "string"
- }
- }
- }
- },
- "highlightsWidth": {
- "title": "Highlights width",
- "type": "number",
- "default": 15
- },
- "showBorder": {
- "title": "Show border",
- "type": "boolean",
- "default": true
- },
- "numbersFont": {
- "title": "Tick numbers font",
- "type": "object",
- "properties": {
- "family": {
- "title": "Font family",
- "type": "string",
- "default": "Roboto"
- },
- "size": {
- "title": "Size",
- "type": "number",
- "default": 18
- },
- "style": {
- "title": "Style",
- "type": "string",
- "default": "normal"
- },
- "weight": {
- "title": "Weight",
- "type": "string",
- "default": "500"
- },
- "color": {
- "title": "color",
- "type": "string",
- "default": null
- }
- }
- },
- "titleFont": {
- "title": "Title text font",
- "type": "object",
- "properties": {
- "family": {
- "title": "Font family",
- "type": "string",
- "default": "Roboto"
- },
- "size": {
- "title": "Size",
- "type": "number",
- "default": 24
- },
- "style": {
- "title": "Style",
- "type": "string",
- "default": "normal"
- },
- "weight": {
- "title": "Weight",
- "type": "string",
- "default": "500"
- },
- "color": {
- "title": "color",
- "type": "string",
- "default": "#888"
- }
- }
- },
- "unitsFont": {
- "title": "Units text font",
- "type": "object",
- "properties": {
- "family": {
- "title": "Font family",
- "type": "string",
- "default": "Roboto"
- },
- "size": {
- "title": "Size",
- "type": "number",
- "default": 22
- },
- "style": {
- "title": "Style",
- "type": "string",
- "default": "normal"
- },
- "weight": {
- "title": "Weight",
- "type": "string",
- "default": "500"
- },
- "color": {
- "title": "color",
- "type": "string",
- "default": "#888"
- }
- }
- },
- "valueFont": {
- "title": "Value text font",
- "type": "object",
- "properties": {
- "family": {
- "title": "Font family",
- "type": "string",
- "default": "Roboto"
- },
- "size": {
- "title": "Size",
- "type": "number",
- "default": 40
- },
- "style": {
- "title": "Style",
- "type": "string",
- "default": "normal"
- },
- "weight": {
- "title": "Weight",
- "type": "string",
- "default": "500"
- },
- "color": {
- "title": "color",
- "type": "string",
- "default": "#444"
- },
- "shadowColor": {
- "title": "Shadow color",
- "type": "string",
- "default": "rgba(0,0,0,0.3)"
- }
- }
- },
- "animation": {
- "title": "Enable animation",
- "type": "boolean",
- "default": true
- },
- "animationDuration": {
- "title": "Animation duration",
- "type": "number",
- "default": 500
- },
- "animationRule": {
- "title": "Animation rule",
- "type": "string",
- "default": "cycle"
- },
- "barStrokeWidth": {
- "title": "Bar stroke width",
- "type": "number",
- "default": 2.5
- },
- "colorBarStroke": {
- "title": "Bar stroke color",
- "type": "string",
- "default": null
- },
- "colorBar": {
- "title": "Bar background color",
- "type": "string",
- "default": "#fff"
- },
- "colorBarEnd": {
- "title": "Bar background color - end gradient",
- "type": "string",
- "default": "#ddd"
- },
- "colorBarProgress": {
- "title": "Progress bar color",
- "type": "string",
- "default": null
- },
- "colorBarProgressEnd": {
- "title": "Progress bar color - end gradient",
- "type": "string",
- "default": null
- }
-
- },
- "required": []
- },
- "form": [
- "barStrokeWidth",
- {
- "key": "colorBarStroke",
- "type": "color"
- },
- {
- "key": "colorBar",
- "type": "color"
- },
- {
- "key": "colorBarEnd",
- "type": "color"
- },
- {
- "key": "colorBarProgress",
- "type": "color"
- },
- {
- "key": "colorBarProgressEnd",
- "type": "color"
- },
- "minValue",
- "maxValue",
- "unitTitle",
- "showUnitTitle",
- "majorTicksCount",
- "minorTicks",
- "valueBox",
- "valueInt",
- {
- "key": "defaultColor",
- "type": "color"
- },
- {
- "key": "colorPlate",
- "type": "color"
- },
- {
- "key": "colorMajorTicks",
- "type": "color"
- },
- {
- "key": "colorMinorTicks",
- "type": "color"
- },
- {
- "key": "colorNeedle",
- "type": "color"
- },
- {
- "key": "colorNeedleEnd",
- "type": "color"
- },
- {
- "key": "colorNeedleShadowUp",
- "type": "color"
- },
- {
- "key": "colorNeedleShadowDown",
- "type": "color"
- },
- {
- "key": "colorValueBoxRect",
- "type": "color"
- },
- {
- "key": "colorValueBoxRectEnd",
- "type": "color"
- },
- {
- "key": "colorValueBoxBackground",
- "type": "color"
- },
- {
- "key": "colorValueBoxShadow",
- "type": "color"
- },
- {
- "key": "highlights",
- "items": [
- "highlights[].from",
- "highlights[].to",
- {
- "key": "highlights[].color",
- "type": "color"
- }
- ]
- },
- "highlightsWidth",
- "showBorder",
- {
- "key": "numbersFont",
- "items": [
- "numbersFont.family",
- "numbersFont.size",
- {
- "key": "numbersFont.style",
- "type": "rc-select",
- "multiple": false,
- "items": [
- {
- "value": "normal",
- "label": "Normal"
- },
- {
- "value": "italic",
- "label": "Italic"
- },
- {
- "value": "oblique",
- "label": "Oblique"
- }
- ]
- },
- {
- "key": "numbersFont.weight",
- "type": "rc-select",
- "multiple": false,
- "items": [
- {
- "value": "normal",
- "label": "Normal"
- },
- {
- "value": "bold",
- "label": "Bold"
- },
- {
- "value": "bolder",
- "label": "Bolder"
- },
- {
- "value": "lighter",
- "label": "Lighter"
- },
- {
- "value": "100",
- "label": "100"
- },
- {
- "value": "200",
- "label": "200"
- },
- {
- "value": "300",
- "label": "300"
- },
- {
- "value": "400",
- "label": "400"
- },
- {
- "value": "500",
- "label": "500"
- },
- {
- "value": "600",
- "label": "600"
- },
- {
- "value": "700",
- "label": "800"
- },
- {
- "value": "800",
- "label": "800"
- },
- {
- "value": "900",
- "label": "900"
- }
- ]
- },
- {
- "key": "numbersFont.color",
- "type": "color"
- }
- ]
- },
- {
- "key": "titleFont",
- "items": [
- "titleFont.family",
- "titleFont.size",
- {
- "key": "titleFont.style",
- "type": "rc-select",
- "multiple": false,
- "items": [
- {
- "value": "normal",
- "label": "Normal"
- },
- {
- "value": "italic",
- "label": "Italic"
- },
- {
- "value": "oblique",
- "label": "Oblique"
- }
- ]
- },
- {
- "key": "titleFont.weight",
- "type": "rc-select",
- "multiple": false,
- "items": [
- {
- "value": "normal",
- "label": "Normal"
- },
- {
- "value": "bold",
- "label": "Bold"
- },
- {
- "value": "bolder",
- "label": "Bolder"
- },
- {
- "value": "lighter",
- "label": "Lighter"
- },
- {
- "value": "100",
- "label": "100"
- },
- {
- "value": "200",
- "label": "200"
- },
- {
- "value": "300",
- "label": "300"
- },
- {
- "value": "400",
- "label": "400"
- },
- {
- "value": "500",
- "label": "500"
- },
- {
- "value": "600",
- "label": "600"
- },
- {
- "value": "700",
- "label": "800"
- },
- {
- "value": "800",
- "label": "800"
- },
- {
- "value": "900",
- "label": "900"
- }
- ]
- },
- {
- "key": "titleFont.color",
- "type": "color"
- }
- ]
- },
- {
- "key": "unitsFont",
- "items": [
- "unitsFont.family",
- "unitsFont.size",
- {
- "key": "unitsFont.style",
- "type": "rc-select",
- "multiple": false,
- "items": [
- {
- "value": "normal",
- "label": "Normal"
- },
- {
- "value": "italic",
- "label": "Italic"
- },
- {
- "value": "oblique",
- "label": "Oblique"
- }
- ]
- },
- {
- "key": "unitsFont.weight",
- "type": "rc-select",
- "multiple": false,
- "items": [
- {
- "value": "normal",
- "label": "Normal"
- },
- {
- "value": "bold",
- "label": "Bold"
- },
- {
- "value": "bolder",
- "label": "Bolder"
- },
- {
- "value": "lighter",
- "label": "Lighter"
- },
- {
- "value": "100",
- "label": "100"
- },
- {
- "value": "200",
- "label": "200"
- },
- {
- "value": "300",
- "label": "300"
- },
- {
- "value": "400",
- "label": "400"
- },
- {
- "value": "500",
- "label": "500"
- },
- {
- "value": "600",
- "label": "600"
- },
- {
- "value": "700",
- "label": "800"
- },
- {
- "value": "800",
- "label": "800"
- },
- {
- "value": "900",
- "label": "900"
- }
- ]
- },
- {
- "key": "unitsFont.color",
- "type": "color"
- }
- ]
- },
- {
- "key": "valueFont",
- "items": [
- "valueFont.family",
- "valueFont.size",
- {
- "key": "valueFont.style",
- "type": "rc-select",
- "multiple": false,
- "items": [
- {
- "value": "normal",
- "label": "Normal"
- },
- {
- "value": "italic",
- "label": "Italic"
- },
- {
- "value": "oblique",
- "label": "Oblique"
- }
- ]
- },
- {
- "key": "valueFont.weight",
- "type": "rc-select",
- "multiple": false,
- "items": [
- {
- "value": "normal",
- "label": "Normal"
- },
- {
- "value": "bold",
- "label": "Bold"
- },
- {
- "value": "bolder",
- "label": "Bolder"
- },
- {
- "value": "lighter",
- "label": "Lighter"
- },
- {
- "value": "100",
- "label": "100"
- },
- {
- "value": "200",
- "label": "200"
- },
- {
- "value": "300",
- "label": "300"
- },
- {
- "value": "400",
- "label": "400"
- },
- {
- "value": "500",
- "label": "500"
- },
- {
- "value": "600",
- "label": "600"
- },
- {
- "value": "700",
- "label": "800"
- },
- {
- "value": "800",
- "label": "800"
- },
- {
- "value": "900",
- "label": "900"
- }
- ]
- },
- {
- "key": "valueFont.color",
- "type": "color"
- },
- {
- "key": "valueFont.shadowColor",
- "type": "color"
- }
- ]
- },
- "animation",
- "animationDuration",
- {
- "key": "animationRule",
- "type": "rc-select",
- "multiple": false,
- "items": [
- {
- "value": "linear",
- "label": "Linear"
- },
- {
- "value": "quad",
- "label": "Quad"
- },
- {
- "value": "quint",
- "label": "Quint"
- },
- {
- "value": "cycle",
- "label": "Cycle"
- },
- {
- "value": "bounce",
- "label": "Bounce"
- },
- {
- "value": "elastic",
- "label": "Elastic"
- },
- {
- "value": "dequad",
- "label": "Dequad"
- },
- {
- "value": "dequint",
- "label": "Dequint"
- },
- {
- "value": "decycle",
- "label": "Decycle"
- },
- {
- "value": "debounce",
- "label": "Debounce"
- },
- {
- "value": "delastic",
- "label": "Delastic"
- }
- ]
- }
- ]
- };
- }
-
-}
-
-/* eslint-enable angular/angularelement */
diff --git a/ui/src/app/widget/lib/analogue-radial-gauge.js b/ui/src/app/widget/lib/analogue-radial-gauge.js
deleted file mode 100644
index cb89d9ddd2..0000000000
--- a/ui/src/app/widget/lib/analogue-radial-gauge.js
+++ /dev/null
@@ -1,1033 +0,0 @@
-/*
- * Copyright © 2016-2020 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 $ from 'jquery';
-import canvasGauges from 'canvas-gauges';
-import tinycolor from 'tinycolor2';
-
-/* eslint-disable angular/angularelement */
-
-export default class TbAnalogueRadialGauge {
- constructor(ctx, canvasId) {
-
- this.ctx = ctx;
-
- canvasGauges.performance = window.performance; // eslint-disable-line no-undef, angular/window-service
-
- var gaugeElement = $('#'+canvasId, ctx.$container);
-
- var settings = ctx.settings;
-
- var minValue = settings.minValue || 0;
- var maxValue = settings.maxValue || 100;
-
- var dataKey = ctx.data[0].dataKey;
- var keyColor = settings.defaultColor || dataKey.color;
-
- var majorTicksCount = settings.majorTicksCount || 10;
- var total = maxValue-minValue;
- var step = (total/majorTicksCount);
-
- var valueInt = settings.valueInt || 3;
-
- var valueDec = getValueDec(settings);
-
- step = parseFloat(parseFloat(step).toFixed(valueDec));
-
- var majorTicks = [];
- var highlights = [];
- var tick = minValue;
-
- while(tick<=maxValue) {
- majorTicks.push(tick);
- var nextTick = tick+step;
- nextTick = parseFloat(parseFloat(nextTick).toFixed(valueDec));
- if (tick 0 ? settings.units : ctx.units;
- }
- }
-
- function getValueDec(settings) {
- var dataKey;
- if (ctx.data && ctx.data[0]) {
- dataKey = ctx.data[0].dataKey;
- }
- if (dataKey && angular.isDefined(dataKey.decimals)) {
- return dataKey.decimals;
- } else {
- return (angular.isDefined(settings.valueDec) && settings.valueDec !== null)
- ? settings.valueDec : ctx.decimals;
- }
- }
-
- function getFontFamily(fontSettings) {
- var family = fontSettings && fontSettings.family ? fontSettings.family : 'Roboto';
- if (family === 'RobotoDraft') {
- family = 'Roboto';
- }
- return family;
- }
-
- var gaugeData = {
-
- renderTo: gaugeElement[0],
-
- /* Generic options */
-
- minValue: minValue,
- maxValue: maxValue,
- majorTicks: majorTicks,
- minorTicks: settings.minorTicks || 2,
- units: getUnits(settings),
- title: ((settings.showUnitTitle !== false) ?
- (settings.unitTitle && settings.unitTitle.length > 0 ?
- settings.unitTitle : dataKey.label) : ''),
-
- borders: settings.showBorder !== false,
- borderShadowWidth: (settings.showBorder !== false) ? 3 : 0,
-
- // borders
- //borderOuterWidth: (settings.showBorder !== false) ? 3 : 0,
- //borderMiddleWidth: (settings.showBorder !== false) ? 3 : 0,
- //borderInnerWidth: (settings.showBorder !== false) ? 3 : 0,
- //borderShadowWidth: (settings.showBorder !== false) ? 3 : 0,
-
- // number formats
- valueInt: valueInt,
- valueDec: valueDec,
- majorTicksInt: 1,
- majorTicksDec: 0,
-
- valueBox: settings.valueBox !== false,
- valueBoxStroke: 5,
- valueBoxWidth: 0,
- valueText: '',
- valueTextShadow: true,
- valueBoxBorderRadius: 2.5,
-
- //highlights
- highlights: (settings.highlights && settings.highlights.length > 0) ? settings.highlights : highlights,
- highlightsWidth: (angular.isDefined(settings.highlightsWidth) && settings.highlightsWidth !== null) ? settings.highlightsWidth : 15,
-
- //fonts
- fontNumbers: getFontFamily(settings.numbersFont),
- fontTitle: getFontFamily(settings.titleFont),
- fontUnits: getFontFamily(settings.unitsFont),
- fontValue: getFontFamily(settings.valueFont),
-
- fontNumbersSize: settings.numbersFont && settings.numbersFont.size ? settings.numbersFont.size : 18,
- fontTitleSize: settings.titleFont && settings.titleFont.size ? settings.titleFont.size : 24,
- fontUnitsSize: settings.unitsFont && settings.unitsFont.size ? settings.unitsFont.size : 22,
- fontValueSize: settings.valueFont && settings.valueFont.size ? settings.valueFont.size : 40,
-
- fontNumbersStyle: settings.numbersFont && settings.numbersFont.style ? settings.numbersFont.style : 'normal',
- fontTitleStyle: settings.titleFont && settings.titleFont.style ? settings.titleFont.style : 'normal',
- fontUnitsStyle: settings.unitsFont && settings.unitsFont.style ? settings.unitsFont.style : 'normal',
- fontValueStyle: settings.valueFont && settings.valueFont.style ? settings.valueFont.style : 'normal',
-
- fontNumbersWeight: settings.numbersFont && settings.numbersFont.weight ? settings.numbersFont.weight : '500',
- fontTitleWeight: settings.titleFont && settings.titleFont.weight ? settings.titleFont.weight : '500',
- fontUnitsWeight: settings.unitsFont && settings.unitsFont.weight ? settings.unitsFont.weight : '500',
- fontValueWeight: settings.valueFont && settings.valueFont.weight ? settings.valueFont.weight : '500',
-
- colorNumbers: settings.numbersFont && settings.numbersFont.color ? settings.numbersFont.color : colorNumbers,
- colorTitle: settings.titleFont && settings.titleFont.color ? settings.titleFont.color : '#888',
- colorUnits: settings.unitsFont && settings.unitsFont.color ? settings.unitsFont.color : '#888',
- colorValueText: settings.valueFont && settings.valueFont.color ? settings.valueFont.color : '#444',
- colorValueTextShadow: settings.valueFont && settings.valueFont.shadowColor ? settings.valueFont.shadowColor : 'rgba(0,0,0,0.3)',
-
- //colors
- colorPlate: settings.colorPlate || '#fff',
- colorMajorTicks: settings.colorMajorTicks || '#444',
- colorMinorTicks: settings.colorMinorTicks || '#666',
- colorNeedle: settings.colorNeedle || keyColor,
- colorNeedleEnd: settings.colorNeedleEnd || keyColor,
-
- colorValueBoxRect: settings.colorValueBoxRect || '#888',
- colorValueBoxRectEnd: settings.colorValueBoxRectEnd || '#666',
- colorValueBoxBackground: settings.colorValueBoxBackground || '#babab2',
- colorValueBoxShadow: settings.colorValueBoxShadow || 'rgba(0,0,0,1)',
- colorNeedleShadowUp: settings.colorNeedleShadowUp || 'rgba(2,255,255,0.2)',
- colorNeedleShadowDown: settings.colorNeedleShadowDown || 'rgba(188,143,143,0.45)',
-
- // animations
- animation: settings.animation !== false && !ctx.isMobile,
- animationDuration: (angular.isDefined(settings.animationDuration) && settings.animationDuration !== null) ? settings.animationDuration : 500,
- animationRule: settings.animationRule || 'cycle',
-
- /* Radial gauge specific */
-
- ticksAngle: settings.ticksAngle || 270,
- startAngle: settings.startAngle || 45,
-
- // colors
-
- colorNeedleCircleOuter: '#f0f0f0',
- colorNeedleCircleOuterEnd: '#ccc',
- colorNeedleCircleInner: '#e8e8e8', //tinycolor(keyColor).lighten(30).toRgbString(),//'#e8e8e8',
- colorNeedleCircleInnerEnd: '#f5f5f5',
-
- // needle
- needleCircleSize: settings.needleCircleSize || 10,
- needleCircleInner: true,
- needleCircleOuter: true,
-
- // custom animations
- animationTarget: 'needle' // 'needle' or 'plate'
-
- };
- this.gauge = new canvasGauges.RadialGauge(gaugeData).draw();
- }
-
- update() {
- if (this.ctx.data.length > 0) {
- var cellData = this.ctx.data[0];
- if (cellData.data.length > 0) {
- var tvPair = cellData.data[cellData.data.length -
- 1];
- var value = tvPair[1];
- if(value !== this.gauge.value) {
- this.gauge.value = value;
- }
- }
- }
-
- }
-
- mobileModeChanged() {
- var animation = this.ctx.settings.animation !== false && !this.ctx.isMobile;
- this.gauge.update({animation: animation});
- }
-
- resize() {
- this.gauge.update({width: this.ctx.width, height: this.ctx.height});
- }
-
- static get settingsSchema() {
- return {
- "schema": {
- "type": "object",
- "title": "Settings",
- "properties": {
- "minValue": {
- "title": "Minimum value",
- "type": "number",
- "default": 0
- },
- "maxValue": {
- "title": "Maximum value",
- "type": "number",
- "default": 100
- },
- "unitTitle": {
- "title": "Unit title",
- "type": "string",
- "default": null
- },
- "showUnitTitle": {
- "title": "Show unit title",
- "type": "boolean",
- "default": true
- },
- "majorTicksCount": {
- "title": "Major ticks count",
- "type": "number",
- "default": null
- },
- "minorTicks": {
- "title": "Minor ticks count",
- "type": "number",
- "default": 2
- },
- "valueBox": {
- "title": "Show value box",
- "type": "boolean",
- "default": true
- },
- "valueInt": {
- "title": "Digits count for integer part of value",
- "type": "number",
- "default": 3
- },
- "defaultColor": {
- "title": "Default color",
- "type": "string",
- "default": null
- },
- "colorPlate": {
- "title": "Plate color",
- "type": "string",
- "default": "#fff"
- },
- "colorMajorTicks": {
- "title": "Major ticks color",
- "type": "string",
- "default": "#444"
- },
- "colorMinorTicks": {
- "title": "Minor ticks color",
- "type": "string",
- "default": "#666"
- },
- "colorNeedle": {
- "title": "Needle color",
- "type": "string",
- "default": null
- },
- "colorNeedleEnd": {
- "title": "Needle color - end gradient",
- "type": "string",
- "default": null
- },
- "colorNeedleShadowUp": {
- "title": "Upper half of the needle shadow color",
- "type": "string",
- "default": "rgba(2,255,255,0.2)"
- },
- "colorNeedleShadowDown": {
- "title": "Drop shadow needle color.",
- "type": "string",
- "default": "rgba(188,143,143,0.45)"
- },
- "colorValueBoxRect": {
- "title": "Value box rectangle stroke color",
- "type": "string",
- "default": "#888"
- },
- "colorValueBoxRectEnd": {
- "title": "Value box rectangle stroke color - end gradient",
- "type": "string",
- "default": "#666"
- },
- "colorValueBoxBackground": {
- "title": "Value box background color",
- "type": "string",
- "default": "#babab2"
- },
- "colorValueBoxShadow": {
- "title": "Value box shadow color",
- "type": "string",
- "default": "rgba(0,0,0,1)"
- },
- "highlights": {
- "title": "Highlights",
- "type": "array",
- "items": {
- "title": "Highlight",
- "type": "object",
- "properties": {
- "from": {
- "title": "From",
- "type": "number"
- },
- "to": {
- "title": "To",
- "type": "number"
- },
- "color": {
- "title": "Color",
- "type": "string"
- }
- }
- }
- },
- "highlightsWidth": {
- "title": "Highlights width",
- "type": "number",
- "default": 15
- },
- "showBorder": {
- "title": "Show border",
- "type": "boolean",
- "default": true
- },
- "numbersFont": {
- "title": "Tick numbers font",
- "type": "object",
- "properties": {
- "family": {
- "title": "Font family",
- "type": "string",
- "default": "Roboto"
- },
- "size": {
- "title": "Size",
- "type": "number",
- "default": 18
- },
- "style": {
- "title": "Style",
- "type": "string",
- "default": "normal"
- },
- "weight": {
- "title": "Weight",
- "type": "string",
- "default": "500"
- },
- "color": {
- "title": "color",
- "type": "string",
- "default": null
- }
- }
- },
- "titleFont": {
- "title": "Title text font",
- "type": "object",
- "properties": {
- "family": {
- "title": "Font family",
- "type": "string",
- "default": "Roboto"
- },
- "size": {
- "title": "Size",
- "type": "number",
- "default": 24
- },
- "style": {
- "title": "Style",
- "type": "string",
- "default": "normal"
- },
- "weight": {
- "title": "Weight",
- "type": "string",
- "default": "500"
- },
- "color": {
- "title": "color",
- "type": "string",
- "default": "#888"
- }
- }
- },
- "unitsFont": {
- "title": "Units text font",
- "type": "object",
- "properties": {
- "family": {
- "title": "Font family",
- "type": "string",
- "default": "Roboto"
- },
- "size": {
- "title": "Size",
- "type": "number",
- "default": 22
- },
- "style": {
- "title": "Style",
- "type": "string",
- "default": "normal"
- },
- "weight": {
- "title": "Weight",
- "type": "string",
- "default": "500"
- },
- "color": {
- "title": "color",
- "type": "string",
- "default": "#888"
- }
- }
- },
- "valueFont": {
- "title": "Value text font",
- "type": "object",
- "properties": {
- "family": {
- "title": "Font family",
- "type": "string",
- "default": "Roboto"
- },
- "size": {
- "title": "Size",
- "type": "number",
- "default": 40
- },
- "style": {
- "title": "Style",
- "type": "string",
- "default": "normal"
- },
- "weight": {
- "title": "Weight",
- "type": "string",
- "default": "500"
- },
- "color": {
- "title": "color",
- "type": "string",
- "default": "#444"
- },
- "shadowColor": {
- "title": "Shadow color",
- "type": "string",
- "default": "rgba(0,0,0,0.3)"
- }
- }
- },
- "animation": {
- "title": "Enable animation",
- "type": "boolean",
- "default": true
- },
- "animationDuration": {
- "title": "Animation duration",
- "type": "number",
- "default": 500
- },
- "animationRule": {
- "title": "Animation rule",
- "type": "string",
- "default": "cycle"
- },
- "startAngle": {
- "title": "Start ticks angle",
- "type": "number",
- "default": 45
- },
- "ticksAngle": {
- "title": "Ticks angle",
- "type": "number",
- "default": 270
- },
- "needleCircleSize": {
- "title": "Needle circle size",
- "type": "number",
- "default": 10
- }
- },
- "required": []
- },
- "form": [
- "startAngle",
- "ticksAngle",
- "needleCircleSize",
- "minValue",
- "maxValue",
- "unitTitle",
- "showUnitTitle",
- "majorTicksCount",
- "minorTicks",
- "valueBox",
- "valueInt",
- {
- "key": "defaultColor",
- "type": "color"
- },
- {
- "key": "colorPlate",
- "type": "color"
- },
- {
- "key": "colorMajorTicks",
- "type": "color"
- },
- {
- "key": "colorMinorTicks",
- "type": "color"
- },
- {
- "key": "colorNeedle",
- "type": "color"
- },
- {
- "key": "colorNeedleEnd",
- "type": "color"
- },
- {
- "key": "colorNeedleShadowUp",
- "type": "color"
- },
- {
- "key": "colorNeedleShadowDown",
- "type": "color"
- },
- {
- "key": "colorValueBoxRect",
- "type": "color"
- },
- {
- "key": "colorValueBoxRectEnd",
- "type": "color"
- },
- {
- "key": "colorValueBoxBackground",
- "type": "color"
- },
- {
- "key": "colorValueBoxShadow",
- "type": "color"
- },
- {
- "key": "highlights",
- "items": [
- "highlights[].from",
- "highlights[].to",
- {
- "key": "highlights[].color",
- "type": "color"
- }
- ]
- },
- "highlightsWidth",
- "showBorder",
- {
- "key": "numbersFont",
- "items": [
- "numbersFont.family",
- "numbersFont.size",
- {
- "key": "numbersFont.style",
- "type": "rc-select",
- "multiple": false,
- "items": [
- {
- "value": "normal",
- "label": "Normal"
- },
- {
- "value": "italic",
- "label": "Italic"
- },
- {
- "value": "oblique",
- "label": "Oblique"
- }
- ]
- },
- {
- "key": "numbersFont.weight",
- "type": "rc-select",
- "multiple": false,
- "items": [
- {
- "value": "normal",
- "label": "Normal"
- },
- {
- "value": "bold",
- "label": "Bold"
- },
- {
- "value": "bolder",
- "label": "Bolder"
- },
- {
- "value": "lighter",
- "label": "Lighter"
- },
- {
- "value": "100",
- "label": "100"
- },
- {
- "value": "200",
- "label": "200"
- },
- {
- "value": "300",
- "label": "300"
- },
- {
- "value": "400",
- "label": "400"
- },
- {
- "value": "500",
- "label": "500"
- },
- {
- "value": "600",
- "label": "600"
- },
- {
- "value": "700",
- "label": "800"
- },
- {
- "value": "800",
- "label": "800"
- },
- {
- "value": "900",
- "label": "900"
- }
- ]
- },
- {
- "key": "numbersFont.color",
- "type": "color"
- }
- ]
- },
- {
- "key": "titleFont",
- "items": [
- "titleFont.family",
- "titleFont.size",
- {
- "key": "titleFont.style",
- "type": "rc-select",
- "multiple": false,
- "items": [
- {
- "value": "normal",
- "label": "Normal"
- },
- {
- "value": "italic",
- "label": "Italic"
- },
- {
- "value": "oblique",
- "label": "Oblique"
- }
- ]
- },
- {
- "key": "titleFont.weight",
- "type": "rc-select",
- "multiple": false,
- "items": [
- {
- "value": "normal",
- "label": "Normal"
- },
- {
- "value": "bold",
- "label": "Bold"
- },
- {
- "value": "bolder",
- "label": "Bolder"
- },
- {
- "value": "lighter",
- "label": "Lighter"
- },
- {
- "value": "100",
- "label": "100"
- },
- {
- "value": "200",
- "label": "200"
- },
- {
- "value": "300",
- "label": "300"
- },
- {
- "value": "400",
- "label": "400"
- },
- {
- "value": "500",
- "label": "500"
- },
- {
- "value": "600",
- "label": "600"
- },
- {
- "value": "700",
- "label": "800"
- },
- {
- "value": "800",
- "label": "800"
- },
- {
- "value": "900",
- "label": "900"
- }
- ]
- },
- {
- "key": "titleFont.color",
- "type": "color"
- }
- ]
- },
- {
- "key": "unitsFont",
- "items": [
- "unitsFont.family",
- "unitsFont.size",
- {
- "key": "unitsFont.style",
- "type": "rc-select",
- "multiple": false,
- "items": [
- {
- "value": "normal",
- "label": "Normal"
- },
- {
- "value": "italic",
- "label": "Italic"
- },
- {
- "value": "oblique",
- "label": "Oblique"
- }
- ]
- },
- {
- "key": "unitsFont.weight",
- "type": "rc-select",
- "multiple": false,
- "items": [
- {
- "value": "normal",
- "label": "Normal"
- },
- {
- "value": "bold",
- "label": "Bold"
- },
- {
- "value": "bolder",
- "label": "Bolder"
- },
- {
- "value": "lighter",
- "label": "Lighter"
- },
- {
- "value": "100",
- "label": "100"
- },
- {
- "value": "200",
- "label": "200"
- },
- {
- "value": "300",
- "label": "300"
- },
- {
- "value": "400",
- "label": "400"
- },
- {
- "value": "500",
- "label": "500"
- },
- {
- "value": "600",
- "label": "600"
- },
- {
- "value": "700",
- "label": "800"
- },
- {
- "value": "800",
- "label": "800"
- },
- {
- "value": "900",
- "label": "900"
- }
- ]
- },
- {
- "key": "unitsFont.color",
- "type": "color"
- }
- ]
- },
- {
- "key": "valueFont",
- "items": [
- "valueFont.family",
- "valueFont.size",
- {
- "key": "valueFont.style",
- "type": "rc-select",
- "multiple": false,
- "items": [
- {
- "value": "normal",
- "label": "Normal"
- },
- {
- "value": "italic",
- "label": "Italic"
- },
- {
- "value": "oblique",
- "label": "Oblique"
- }
- ]
- },
- {
- "key": "valueFont.weight",
- "type": "rc-select",
- "multiple": false,
- "items": [
- {
- "value": "normal",
- "label": "Normal"
- },
- {
- "value": "bold",
- "label": "Bold"
- },
- {
- "value": "bolder",
- "label": "Bolder"
- },
- {
- "value": "lighter",
- "label": "Lighter"
- },
- {
- "value": "100",
- "label": "100"
- },
- {
- "value": "200",
- "label": "200"
- },
- {
- "value": "300",
- "label": "300"
- },
- {
- "value": "400",
- "label": "400"
- },
- {
- "value": "500",
- "label": "500"
- },
- {
- "value": "600",
- "label": "600"
- },
- {
- "value": "700",
- "label": "800"
- },
- {
- "value": "800",
- "label": "800"
- },
- {
- "value": "900",
- "label": "900"
- }
- ]
- },
- {
- "key": "valueFont.color",
- "type": "color"
- },
- {
- "key": "valueFont.shadowColor",
- "type": "color"
- }
- ]
- },
- "animation",
- "animationDuration",
- {
- "key": "animationRule",
- "type": "rc-select",
- "multiple": false,
- "items": [
- {
- "value": "linear",
- "label": "Linear"
- },
- {
- "value": "quad",
- "label": "Quad"
- },
- {
- "value": "quint",
- "label": "Quint"
- },
- {
- "value": "cycle",
- "label": "Cycle"
- },
- {
- "value": "bounce",
- "label": "Bounce"
- },
- {
- "value": "elastic",
- "label": "Elastic"
- },
- {
- "value": "dequad",
- "label": "Dequad"
- },
- {
- "value": "dequint",
- "label": "Dequint"
- },
- {
- "value": "decycle",
- "label": "Decycle"
- },
- {
- "value": "debounce",
- "label": "Debounce"
- },
- {
- "value": "delastic",
- "label": "Delastic"
- }
- ]
- }
- ]
- };
- }
-
-}
-
-/* eslint-enable angular/angularelement */
diff --git a/ui/src/app/widget/lib/canvas-digital-gauge.js b/ui/src/app/widget/lib/canvas-digital-gauge.js
deleted file mode 100644
index 3d9caa2417..0000000000
--- a/ui/src/app/widget/lib/canvas-digital-gauge.js
+++ /dev/null
@@ -1,1323 +0,0 @@
-/*
- * Copyright © 2016-2020 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 $ from 'jquery';
-import tinycolor from 'tinycolor2';
-import canvasGauges from 'canvas-gauges';
-import CanvasDigitalGauge from './CanvasDigitalGauge';
-
-/* eslint-disable angular/angularelement */
-export default class TbCanvasDigitalGauge {
-
- constructor(ctx, canvasId) {
- this.ctx = ctx;
-
- canvasGauges.performance = window.performance; // eslint-disable-line no-undef, angular/window-service
-
- var gaugeElement = $('#'+canvasId, ctx.$container);
- var settings = ctx.settings;
-
- this.localSettings = {};
- this.localSettings.minValue = settings.minValue || 0;
- this.localSettings.maxValue = settings.maxValue || 100;
- this.localSettings.gaugeType = settings.gaugeType || 'arc';
- this.localSettings.neonGlowBrightness = settings.neonGlowBrightness || 0;
- this.localSettings.dashThickness = settings.dashThickness || 0;
- this.localSettings.roundedLineCap = settings.roundedLineCap === true;
-
- var dataKey = ctx.data[0].dataKey;
- var keyColor = settings.defaultColor || dataKey.color;
-
- this.localSettings.unitTitle = ((settings.showUnitTitle === true) ?
- (settings.unitTitle && settings.unitTitle.length > 0 ?
- settings.unitTitle : dataKey.label) : '');
-
- this.localSettings.showTimestamp = settings.showTimestamp == true ? true : false;
- this.localSettings.timestampFormat = settings.timestampFormat && settings.timestampFormat.length ? settings.timestampFormat : 'yyyy-MM-dd HH:mm:ss';
-
- this.localSettings.gaugeWidthScale = settings.gaugeWidthScale || 0.75;
- this.localSettings.gaugeColor = settings.gaugeColor || tinycolor(keyColor).setAlpha(0.2).toRgbString();
-
- this.localSettings.useFixedLevelColor = settings.useFixedLevelColor || false;
- if (!settings.useFixedLevelColor) {
- if (!settings.levelColors || settings.levelColors.length <= 0) {
- this.localSettings.levelColors = [keyColor];
- } else {
- this.localSettings.levelColors = settings.levelColors.slice();
- }
- } else {
- this.localSettings.levelColors = [keyColor];
- this.localSettings.fixedLevelColors = settings.fixedLevelColors || [];
- }
-
- this.localSettings.showTicks = settings.showTicks || false;
- this.localSettings.ticks = [];
- this.localSettings.ticksValue = settings.ticksValue || [];
- this.localSettings.tickWidth = settings.tickWidth || 4;
- this.localSettings.colorTicks = settings.colorTicks || '#666';
-
- this.localSettings.decimals = angular.isDefined(dataKey.decimals) ? dataKey.decimals :
- ((angular.isDefined(settings.decimals) && settings.decimals !== null)
- ? settings.decimals : ctx.decimals);
-
- this.localSettings.units = dataKey.units && dataKey.units.length ? dataKey.units :
- (angular.isDefined(settings.units) && settings.units.length > 0 ? settings.units : ctx.units);
-
- this.localSettings.hideValue = settings.showValue !== true;
- this.localSettings.hideMinMax = settings.showMinMax !== true;
-
- this.localSettings.title = ((settings.showTitle === true) ?
- (settings.title && settings.title.length > 0 ?
- settings.title : dataKey.label) : '');
-
- if (!this.localSettings.unitTitle && this.localSettings.showTimestamp) {
- this.localSettings.unitTitle = ' ';
- }
-
- this.localSettings.titleFont = {};
- var settingsTitleFont = settings.titleFont;
- if (!settingsTitleFont) {
- settingsTitleFont = {};
- }
-
- function getFontFamily(fontSettings) {
- var family = fontSettings && fontSettings.family ? fontSettings.family : 'Roboto';
- if (family === 'RobotoDraft') {
- family = 'Roboto';
- }
- return family;
- }
-
- this.localSettings.titleFont.family = getFontFamily(settingsTitleFont);
- this.localSettings.titleFont.size = settingsTitleFont.size ? settingsTitleFont.size : 12;
- this.localSettings.titleFont.style = settingsTitleFont.style ? settingsTitleFont.style : 'normal';
- this.localSettings.titleFont.weight = settingsTitleFont.weight ? settingsTitleFont.weight : '500';
- this.localSettings.titleFont.color = settingsTitleFont.color ? settingsTitleFont.color : keyColor;
-
- this.localSettings.valueFont = {};
- var settingsValueFont = settings.valueFont;
- if (!settingsValueFont) {
- settingsValueFont = {};
- }
-
- this.localSettings.valueFont.family = getFontFamily(settingsValueFont);
- this.localSettings.valueFont.size = settingsValueFont.size ? settingsValueFont.size : 18;
- this.localSettings.valueFont.style = settingsValueFont.style ? settingsValueFont.style : 'normal';
- this.localSettings.valueFont.weight = settingsValueFont.weight ? settingsValueFont.weight : '500';
- this.localSettings.valueFont.color = settingsValueFont.color ? settingsValueFont.color : keyColor;
-
- this.localSettings.minMaxFont = {};
- var settingsMinMaxFont = settings.minMaxFont;
- if (!settingsMinMaxFont) {
- settingsMinMaxFont = {};
- }
-
- this.localSettings.minMaxFont.family = getFontFamily(settingsMinMaxFont);
- this.localSettings.minMaxFont.size = settingsMinMaxFont.size ? settingsMinMaxFont.size : 10;
- this.localSettings.minMaxFont.style = settingsMinMaxFont.style ? settingsMinMaxFont.style : 'normal';
- this.localSettings.minMaxFont.weight = settingsMinMaxFont.weight ? settingsMinMaxFont.weight : '500';
- this.localSettings.minMaxFont.color = settingsMinMaxFont.color ? settingsMinMaxFont.color : keyColor;
-
- this.localSettings.labelFont = {};
- var settingsLabelFont = settings.labelFont;
- if (!settingsLabelFont) {
- settingsLabelFont = {};
- }
-
- this.localSettings.labelFont.family = getFontFamily(settingsLabelFont);
- this.localSettings.labelFont.size = settingsLabelFont.size ? settingsLabelFont.size : 8;
- this.localSettings.labelFont.style = settingsLabelFont.style ? settingsLabelFont.style : 'normal';
- this.localSettings.labelFont.weight = settingsLabelFont.weight ? settingsLabelFont.weight : '500';
- this.localSettings.labelFont.color = settingsLabelFont.color ? settingsLabelFont.color : keyColor;
-
-
- var gaugeData = {
-
- renderTo: gaugeElement[0],
-
- gaugeWidthScale: this.localSettings.gaugeWidthScale,
- gaugeColor: this.localSettings.gaugeColor,
- levelColors: this.localSettings.levelColors,
-
- colorTicks: this.localSettings.colorTicks,
- tickWidth: this.localSettings.tickWidth,
- ticks: this.localSettings.ticks,
-
- title: this.localSettings.title,
-
- fontTitleSize: this.localSettings.titleFont.size,
- fontTitleStyle: this.localSettings.titleFont.style,
- fontTitleWeight: this.localSettings.titleFont.weight,
- colorTitle: this.localSettings.titleFont.color,
- fontTitle: this.localSettings.titleFont.family,
-
- fontValueSize: this.localSettings.valueFont.size,
- fontValueStyle: this.localSettings.valueFont.style,
- fontValueWeight: this.localSettings.valueFont.weight,
- colorValue: this.localSettings.valueFont.color,
- fontValue: this.localSettings.valueFont.family,
-
- fontMinMaxSize: this.localSettings.minMaxFont.size,
- fontMinMaxStyle: this.localSettings.minMaxFont.style,
- fontMinMaxWeight: this.localSettings.minMaxFont.weight,
- colorMinMax: this.localSettings.minMaxFont.color,
- fontMinMax: this.localSettings.minMaxFont.family,
-
- fontLabelSize: this.localSettings.labelFont.size,
- fontLabelStyle: this.localSettings.labelFont.style,
- fontLabelWeight: this.localSettings.labelFont.weight,
- colorLabel: this.localSettings.labelFont.color,
- fontLabel: this.localSettings.labelFont.family,
-
- minValue: this.localSettings.minValue,
- maxValue: this.localSettings.maxValue,
- gaugeType: this.localSettings.gaugeType,
- dashThickness: this.localSettings.dashThickness,
- roundedLineCap: this.localSettings.roundedLineCap,
-
- symbol: this.localSettings.units,
- label: this.localSettings.unitTitle,
- showTimestamp: this.localSettings.showTimestamp,
- hideValue: this.localSettings.hideValue,
- hideMinMax: this.localSettings.hideMinMax,
-
- valueDec: this.localSettings.decimals,
-
- neonGlowBrightness: this.localSettings.neonGlowBrightness,
-
- // animations
- animation: settings.animation !== false && !ctx.isMobile,
- animationDuration: (angular.isDefined(settings.animationDuration) && settings.animationDuration !== null) ? settings.animationDuration : 500,
- animationRule: settings.animationRule || 'linear',
-
- isMobile: ctx.isMobile
-
- };
-
- this.gauge = new CanvasDigitalGauge(gaugeData).draw();
- this.init();
- }
-
- init() {
- if (this.localSettings.useFixedLevelColor) {
- if (this.localSettings.fixedLevelColors && this.localSettings.fixedLevelColors.length > 0) {
- this.localSettings.levelColors = this.settingLevelColorsSubscribe(this.localSettings.fixedLevelColors);
- }
- }
- if (this.localSettings.showTicks) {
- if (this.localSettings.ticksValue && this.localSettings.ticksValue.length) {
- this.localSettings.ticks = this.settingTicksSubscribe(this.localSettings.ticksValue);
- }
- }
- this.updateSetting();
- }
-
- static generateDatasorce(ctx, datasources, entityAlias, attribute, settings){
- let entityAliasId = ctx.aliasController.getEntityAliasId(entityAlias);
- if (!entityAliasId) {
- throw new Error('Not valid entity aliase name ' + entityAlias);
- }
-
- let datasource = datasources.filter((datasource) => {
- return datasource.entityAliasId === entityAliasId;
- })[0];
-
- let dataKey = {
- type: ctx.$scope.$injector.get('types').dataKeyType.attribute,
- name: attribute,
- label: attribute,
- settings: [settings],
- _hash: Math.random()
- };
-
- if (datasource) {
- let findDataKey = datasource.dataKeys.filter((dataKey) => {
- return dataKey.name === attribute;
- })[0];
-
- if (findDataKey) {
- findDataKey.settings.push(settings);
- } else {
- datasource.dataKeys.push(dataKey)
- }
- } else {
- datasource = {
- type: ctx.$scope.$injector.get('types').datasourceType.entity,
- name: entityAlias,
- aliasName: entityAlias,
- entityAliasId: entityAliasId,
- dataKeys: [dataKey]
- };
- datasources.push(datasource);
- }
-
- return datasources;
- }
-
- settingTicksSubscribe(options) {
- let ticksDatasource = [];
- let predefineTicks = [];
-
- for (let i = 0; i < options.length; i++) {
- let tick = options[i];
- if (tick.valueSource === 'predefinedValue' && isFinite(tick.value)) {
- predefineTicks.push(tick.value)
- } else if (tick.entityAlias && tick.attribute) {
- try {
- ticksDatasource = TbCanvasDigitalGauge.generateDatasorce(this.ctx, ticksDatasource, tick.entityAlias, tick.attribute, predefineTicks.length);
- } catch (e) {
- continue;
- }
- predefineTicks.push(null);
- }
- }
-
- this.subscribeAttributes(ticksDatasource, 'ticks').then((subscription) => {
- this.ticksSourcesSubscription = subscription;
- });
-
- return predefineTicks;
- }
-
- settingLevelColorsSubscribe(options) {
- let levelColorsDatasource = [];
- let predefineLevelColors = [];
-
- function setLevelColor(levelSetting, color) {
- if (levelSetting.valueSource === 'predefinedValue' && isFinite(levelSetting.value)) {
- predefineLevelColors.push({
- value: levelSetting.value,
- color: color
- })
- } else if (levelSetting.entityAlias && levelSetting.attribute) {
- try {
- levelColorsDatasource = TbCanvasDigitalGauge.generateDatasorce(this.ctx, levelColorsDatasource, levelSetting.entityAlias, levelSetting.attribute, {
- color: color,
- index: predefineLevelColors.length
- });
- } catch (e) {
- return;
- }
- predefineLevelColors.push(null);
- }
- }
-
- for (let i = 0; i < options.length; i++) {
- let levelColor = options[i];
- if (levelColor.from) {
- setLevelColor.call(this, levelColor.from, levelColor.color);
- }
- if (levelColor.to) {
- setLevelColor.call(this, levelColor.to, levelColor.color);
- }
- }
-
- this.subscribeAttributes(levelColorsDatasource, 'levelColors').then((subscription) => {
- this.levelColorSourcesSubscription = subscription;
- });
-
- return predefineLevelColors;
- }
-
- subscribeAttributes(datasources, typeAttributes) {
- if (!datasources.length) {
- return this.ctx.$scope.$injector.get('$q').when(null);
- }
-
- let levelColorsSourcesSubscriptionOptions = {
- datasources: datasources,
- useDashboardTimewindow: false,
- type: this.ctx.$scope.$injector.get('types').widgetType.latest.value,
- callbacks: {
- onDataUpdated: (subscription) => {
- this.updateAttribute(subscription.data, typeAttributes);
- }
- }
- };
-
- return this.ctx.subscriptionApi.createSubscription(levelColorsSourcesSubscriptionOptions, true);
- }
-
- updateAttribute(data, typeAttributes) {
- for (let i = 0; i < data.length; i++) {
- let keyData = data[i];
- if (keyData && keyData.data && keyData.data[0]) {
- let attrValue = keyData.data[0][1];
- if (isFinite(attrValue)) {
- for (let i = 0; i < keyData.dataKey.settings.length; i++) {
- let setting = keyData.dataKey.settings[i];
- switch (typeAttributes) {
- case 'levelColors':
- this.localSettings.levelColors[setting.index] = {
- value: attrValue,
- color: setting.color
- };
- break;
- case 'ticks':
- this.localSettings.ticks[setting] = attrValue;
- break;
- }
- }
- }
- }
- }
- this.updateSetting();
- }
-
- updateSetting() {
- this.gauge.options.ticks = this.localSettings.ticks;
- this.gauge.options.levelColors = this.localSettings.levelColors;
- this.gauge.options = CanvasDigitalGauge.configure(this.gauge.options);
- this.gauge.update();
- }
-
- update() {
- if (this.ctx.data.length > 0) {
- var cellData = this.ctx.data[0];
- if (cellData.data.length > 0) {
- var tvPair = cellData.data[cellData.data.length - 1];
- var timestamp;
- if (this.localSettings.showTimestamp) {
- timestamp = tvPair[0];
- var filter= this.ctx.$scope.$injector.get('$filter');
- var timestampDisplayValue = filter('date')(timestamp, this.localSettings.timestampFormat);
- this.gauge.options.label = timestampDisplayValue;
- }
- var value = tvPair[1];
- if(value !== this.gauge.value) {
- if (!this.ctx.settings.animation) {
- this.gauge._value = value;
- }
- this.gauge.value = value;
- } else if (this.localSettings.showTimestamp && this.gauge.timestamp != timestamp) {
- this.gauge.timestamp = timestamp;
- }
- }
- }
- }
-
- mobileModeChanged() {
- var animation = this.ctx.settings.animation !== false && !this.ctx.isMobile;
- this.gauge.update({animation: animation, isMobile: this.ctx.isMobile});
- }
-
- resize() {
- this.gauge.update({width: this.ctx.width, height: this.ctx.height});
- }
-
- static get settingsSchema() {
- return {
- "schema": {
- "type": "object",
- "title": "Settings",
- "properties": {
- "minValue": {
- "title": "Minimum value",
- "type": "number",
- "default": 0
- },
- "maxValue": {
- "title": "Maximum value",
- "type": "number",
- "default": 100
- },
- "gaugeType": {
- "title": "Gauge type",
- "type": "string",
- "default": "arc"
- },
- "donutStartAngle": {
- "title": "Angle to start from when in donut mode",
- "type": "number",
- "default": 90
- },
- "neonGlowBrightness": {
- "title": "Neon glow effect brightness, (0-100), 0 - disable effect",
- "type": "number",
- "default": 0
- },
- "dashThickness": {
- "title": "Thickness of the stripes, 0 - no stripes",
- "type": "number",
- "default": 0
- },
- "roundedLineCap": {
- "title": "Display rounded line cap",
- "type": "boolean",
- "default": false
- },
- "title": {
- "title": "Gauge title",
- "type": "string",
- "default": null
- },
- "showTitle": {
- "title": "Show gauge title",
- "type": "boolean",
- "default": false
- },
- "unitTitle": {
- "title": "Unit title",
- "type": "string",
- "default": null
- },
- "showUnitTitle": {
- "title": "Show unit title",
- "type": "boolean",
- "default": false
- },
- "showTimestamp": {
- "title": "Show value timestamp",
- "type": "boolean",
- "default": false
- },
- "timestampFormat": {
- "title": "Timestamp format",
- "type": "string",
- "default": "yyyy-MM-dd HH:mm:ss"
- },
- "showValue": {
- "title": "Show value text",
- "type": "boolean",
- "default": true
- },
- "showMinMax": {
- "title": "Show min and max values",
- "type": "boolean",
- "default": true
- },
- "gaugeWidthScale": {
- "title": "Width of the gauge element",
- "type": "number",
- "default": 0.75
- },
- "defaultColor": {
- "title": "Default color",
- "type": "string",
- "default": null
- },
- "gaugeColor": {
- "title": "Background color of the gauge element",
- "type": "string",
- "default": null
- },
- "useFixedLevelColor": {
- "title": "Use precise value for the color indicator",
- "type": "boolean",
- "default": false
- },
- "levelColors": {
- "title": "Colors of indicator, from lower to upper",
- "type": "array",
- "items": {
- "title": "Color",
- "type": "string"
- }
- },
- "fixedLevelColors": {
- "title": "The colors for the indicator using boundary values",
- "type": "array",
- "items": {
- "title": "levelColor",
- "type": "object",
- "properties": {
- "from": {
- "title": "From",
- "type": "object",
- "properties": {
- "valueSource": {
- "title": "[From] Value source",
- "type": "string",
- "default": "predefinedValue"
- },
- "entityAlias": {
- "title": "[From] Source entity alias",
- "type": "string"
- },
- "attribute": {
- "title": "[From] Source entity attribute",
- "type": "string"
- },
- "value": {
- "title": "[From] Value (if predefined value is selected)",
- "type": "number"
- }
- }
- },
- "to": {
- "title": "To",
- "type": "object",
- "properties": {
- "valueSource": {
- "title": "[To] Value source",
- "type": "string",
- "default": "predefinedValue"
- },
- "entityAlias": {
- "title": "[To] Source entity alias",
- "type": "string"
- },
- "attribute": {
- "title": "[To] Source entity attribute",
- "type": "string"
- },
- "value": {
- "title": "[To] Value (if predefined value is selected)",
- "type": "number"
- }
- }
- },
- "color": {
- "title": "Color",
- "type": "string"
- }
- }
- }
- },
- "showTicks": {
- "title": "Show ticks",
- "type": "boolean",
- "default": false
- },
- "tickWidth": {
- "title": "Width ticks",
- "type": "number",
- "default": 4
- },
- "colorTicks": {
- "title": "Color ticks",
- "type": "string",
- "default": "#666"
- },
- "ticksValue": {
- "title": "The ticks predefined value",
- "type": "array",
- "items": {
- "title": "tickValue",
- "type": "object",
- "properties": {
- "valueSource": {
- "title": "Value source",
- "type": "string",
- "default": "predefinedValue"
- },
- "entityAlias": {
- "title": "Source entity alias",
- "type": "string"
- },
- "attribute": {
- "title": "Source entity attribute",
- "type": "string"
- },
- "value": {
- "title": "Value (if predefined value is selected)",
- "type": "number"
- }
- }
- }
- },
- "animation": {
- "title": "Enable animation",
- "type": "boolean",
- "default": true
- },
- "animationDuration": {
- "title": "Animation duration",
- "type": "number",
- "default": 500
- },
- "animationRule": {
- "title": "Animation rule",
- "type": "string",
- "default": "linear"
- },
- "titleFont": {
- "title": "Gauge title font",
- "type": "object",
- "properties": {
- "family": {
- "title": "Font family",
- "type": "string",
- "default": "Roboto"
- },
- "size": {
- "title": "Size",
- "type": "number",
- "default": 12
- },
- "style": {
- "title": "Style",
- "type": "string",
- "default": "normal"
- },
- "weight": {
- "title": "Weight",
- "type": "string",
- "default": "500"
- },
- "color": {
- "title": "color",
- "type": "string",
- "default": null
- }
- }
- },
- "labelFont": {
- "title": "Font of label showing under value",
- "type": "object",
- "properties": {
- "family": {
- "title": "Font family",
- "type": "string",
- "default": "Roboto"
- },
- "size": {
- "title": "Size",
- "type": "number",
- "default": 8
- },
- "style": {
- "title": "Style",
- "type": "string",
- "default": "normal"
- },
- "weight": {
- "title": "Weight",
- "type": "string",
- "default": "500"
- },
- "color": {
- "title": "color",
- "type": "string",
- "default": null
- }
- }
- },
- "valueFont": {
- "title": "Font of label showing current value",
- "type": "object",
- "properties": {
- "family": {
- "title": "Font family",
- "type": "string",
- "default": "Roboto"
- },
- "size": {
- "title": "Size",
- "type": "number",
- "default": 18
- },
- "style": {
- "title": "Style",
- "type": "string",
- "default": "normal"
- },
- "weight": {
- "title": "Weight",
- "type": "string",
- "default": "500"
- },
- "color": {
- "title": "color",
- "type": "string",
- "default": null
- }
- }
- },
- "minMaxFont": {
- "title": "Font of minimum and maximum labels",
- "type": "object",
- "properties": {
- "family": {
- "title": "Font family",
- "type": "string",
- "default": "Roboto"
- },
- "size": {
- "title": "Size",
- "type": "number",
- "default": 10
- },
- "style": {
- "title": "Style",
- "type": "string",
- "default": "normal"
- },
- "weight": {
- "title": "Weight",
- "type": "string",
- "default": "500"
- },
- "color": {
- "title": "color",
- "type": "string",
- "default": null
- }
- }
- }
- }
- },
- "form": [
- "minValue",
- "maxValue",
- {
- "key": "gaugeType",
- "type": "rc-select",
- "multiple": false,
- "items": [
- {
- "value": "arc",
- "label": "Arc"
- },
- {
- "value": "donut",
- "label": "Donut"
- },
- {
- "value": "horizontalBar",
- "label": "Horizontal bar"
- },
- {
- "value": "verticalBar",
- "label": "Vertical bar"
- }
- ]
- },
- "donutStartAngle",
- "neonGlowBrightness",
- "dashThickness",
- "roundedLineCap",
- "title",
- "showTitle",
- "unitTitle",
- "showUnitTitle",
- "showTimestamp",
- "timestampFormat",
- "showValue",
- "showMinMax",
- "gaugeWidthScale",
- {
- "key": "defaultColor",
- "type": "color"
- },
- {
- "key": "gaugeColor",
- "type": "color"
- },
- "useFixedLevelColor",
- {
- "key": "levelColors",
- "condition": "model.useFixedLevelColor !== true",
- "items": [
- {
- "key": "levelColors[]",
- "type": "color"
- }
- ]
- },
- {
- "key": "fixedLevelColors",
- "condition": "model.useFixedLevelColor === true",
- "items": [
- {
- "key": "fixedLevelColors[].from.valueSource",
- "type": "rc-select",
- "multiple": false,
- "items": [
- {
- "value": "predefinedValue",
- "label": "Predefined value (Default)"
- },
- {
- "value": "entityAttribute",
- "label": "Value taken from entity attribute"
- }
- ]
- },
- "fixedLevelColors[].from.value",
- "fixedLevelColors[].from.entityAlias",
- "fixedLevelColors[].from.attribute",
- {
- "key": "fixedLevelColors[].to.valueSource",
- "type": "rc-select",
- "multiple": false,
- "items": [
- {
- "value": "predefinedValue",
- "label": "Predefined value (Default)"
- },
- {
- "value": "entityAttribute",
- "label": "Value taken from entity attribute"
- }
- ]
- },
- "fixedLevelColors[].to.value",
- "fixedLevelColors[].to.entityAlias",
- "fixedLevelColors[].to.attribute",
- {
- "key": "fixedLevelColors[].color",
- "type": "color"
- }
- ]
- },
- "showTicks",
- {
- "key": "tickWidth",
- "condition": "model.showTicks === true"
- },
- {
- "key": "colorTicks",
- "condition": "model.showTicks === true",
- "type": "color"
- },
- {
- "key": "ticksValue",
- "condition": "model.showTicks === true",
- "items": [
- {
- "key": "ticksValue[].valueSource",
- "type": "rc-select",
- "multiple": false,
- "items": [
- {
- "value": "predefinedValue",
- "label": "Predefined value (Default)"
- },
- {
- "value": "entityAttribute",
- "label": "Value taken from entity attribute"
- }
- ]
- },
- "ticksValue[].value",
- "ticksValue[].entityAlias",
- "ticksValue[].attribute"
- ]
- },
- "animation",
- "animationDuration",
- {
- "key": "animationRule",
- "type": "rc-select",
- "multiple": false,
- "items": [
- {
- "value": "linear",
- "label": "Linear"
- },
- {
- "value": "quad",
- "label": "Quad"
- },
- {
- "value": "quint",
- "label": "Quint"
- },
- {
- "value": "cycle",
- "label": "Cycle"
- },
- {
- "value": "bounce",
- "label": "Bounce"
- },
- {
- "value": "elastic",
- "label": "Elastic"
- },
- {
- "value": "dequad",
- "label": "Dequad"
- },
- {
- "value": "dequint",
- "label": "Dequint"
- },
- {
- "value": "decycle",
- "label": "Decycle"
- },
- {
- "value": "debounce",
- "label": "Debounce"
- },
- {
- "value": "delastic",
- "label": "Delastic"
- }
- ]
- },
- {
- "key": "titleFont",
- "items": [
- "titleFont.family",
- "titleFont.size",
- {
- "key": "titleFont.style",
- "type": "rc-select",
- "multiple": false,
- "items": [
- {
- "value": "normal",
- "label": "Normal"
- },
- {
- "value": "italic",
- "label": "Italic"
- },
- {
- "value": "oblique",
- "label": "Oblique"
- }
- ]
- },
- {
- "key": "titleFont.weight",
- "type": "rc-select",
- "multiple": false,
- "items": [
- {
- "value": "normal",
- "label": "Normal"
- },
- {
- "value": "bold",
- "label": "Bold"
- },
- {
- "value": "bolder",
- "label": "Bolder"
- },
- {
- "value": "lighter",
- "label": "Lighter"
- },
- {
- "value": "100",
- "label": "100"
- },
- {
- "value": "200",
- "label": "200"
- },
- {
- "value": "300",
- "label": "300"
- },
- {
- "value": "400",
- "label": "400"
- },
- {
- "value": "500",
- "label": "500"
- },
- {
- "value": "600",
- "label": "600"
- },
- {
- "value": "700",
- "label": "800"
- },
- {
- "value": "800",
- "label": "800"
- },
- {
- "value": "900",
- "label": "900"
- }
- ]
- },
- {
- "key": "titleFont.color",
- "type": "color"
- }
- ]
- },
- {
- "key": "labelFont",
- "items": [
- "labelFont.family",
- "labelFont.size",
- {
- "key": "labelFont.style",
- "type": "rc-select",
- "multiple": false,
- "items": [
- {
- "value": "normal",
- "label": "Normal"
- },
- {
- "value": "italic",
- "label": "Italic"
- },
- {
- "value": "oblique",
- "label": "Oblique"
- }
- ]
- },
- {
- "key": "labelFont.weight",
- "type": "rc-select",
- "multiple": false,
- "items": [
- {
- "value": "normal",
- "label": "Normal"
- },
- {
- "value": "bold",
- "label": "Bold"
- },
- {
- "value": "bolder",
- "label": "Bolder"
- },
- {
- "value": "lighter",
- "label": "Lighter"
- },
- {
- "value": "100",
- "label": "100"
- },
- {
- "value": "200",
- "label": "200"
- },
- {
- "value": "300",
- "label": "300"
- },
- {
- "value": "400",
- "label": "400"
- },
- {
- "value": "500",
- "label": "500"
- },
- {
- "value": "600",
- "label": "600"
- },
- {
- "value": "700",
- "label": "800"
- },
- {
- "value": "800",
- "label": "800"
- },
- {
- "value": "900",
- "label": "900"
- }
- ]
- },
- {
- "key": "labelFont.color",
- "type": "color"
- }
- ]
- },
- {
- "key": "valueFont",
- "items": [
- "valueFont.family",
- "valueFont.size",
- {
- "key": "valueFont.style",
- "type": "rc-select",
- "multiple": false,
- "items": [
- {
- "value": "normal",
- "label": "Normal"
- },
- {
- "value": "italic",
- "label": "Italic"
- },
- {
- "value": "oblique",
- "label": "Oblique"
- }
- ]
- },
- {
- "key": "valueFont.weight",
- "type": "rc-select",
- "multiple": false,
- "items": [
- {
- "value": "normal",
- "label": "Normal"
- },
- {
- "value": "bold",
- "label": "Bold"
- },
- {
- "value": "bolder",
- "label": "Bolder"
- },
- {
- "value": "lighter",
- "label": "Lighter"
- },
- {
- "value": "100",
- "label": "100"
- },
- {
- "value": "200",
- "label": "200"
- },
- {
- "value": "300",
- "label": "300"
- },
- {
- "value": "400",
- "label": "400"
- },
- {
- "value": "500",
- "label": "500"
- },
- {
- "value": "600",
- "label": "600"
- },
- {
- "value": "700",
- "label": "800"
- },
- {
- "value": "800",
- "label": "800"
- },
- {
- "value": "900",
- "label": "900"
- }
- ]
- },
- {
- "key": "valueFont.color",
- "type": "color"
- }
- ]
- },
- {
- "key": "minMaxFont",
- "items": [
- "minMaxFont.family",
- "minMaxFont.size",
- {
- "key": "minMaxFont.style",
- "type": "rc-select",
- "multiple": false,
- "items": [
- {
- "value": "normal",
- "label": "Normal"
- },
- {
- "value": "italic",
- "label": "Italic"
- },
- {
- "value": "oblique",
- "label": "Oblique"
- }
- ]
- },
- {
- "key": "minMaxFont.weight",
- "type": "rc-select",
- "multiple": false,
- "items": [
- {
- "value": "normal",
- "label": "Normal"
- },
- {
- "value": "bold",
- "label": "Bold"
- },
- {
- "value": "bolder",
- "label": "Bolder"
- },
- {
- "value": "lighter",
- "label": "Lighter"
- },
- {
- "value": "100",
- "label": "100"
- },
- {
- "value": "200",
- "label": "200"
- },
- {
- "value": "300",
- "label": "300"
- },
- {
- "value": "400",
- "label": "400"
- },
- {
- "value": "500",
- "label": "500"
- },
- {
- "value": "600",
- "label": "600"
- },
- {
- "value": "700",
- "label": "800"
- },
- {
- "value": "800",
- "label": "800"
- },
- {
- "value": "900",
- "label": "900"
- }
- ]
- },
- {
- "key": "minMaxFont.color",
- "type": "color"
- }
- ]
- }
- ]
- };
- }
-}
-/* eslint-enable angular/angularelement */
diff --git a/ui/src/app/widget/lib/date-range-navigator/date-range-navigator.js b/ui/src/app/widget/lib/date-range-navigator/date-range-navigator.js
deleted file mode 100644
index a159badc68..0000000000
--- a/ui/src/app/widget/lib/date-range-navigator/date-range-navigator.js
+++ /dev/null
@@ -1,301 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-/* eslint-disable import/no-unresolved, import/default */
-import widgetTpl from './date-range-navigator.tpl.html';
-import './date-range-navigator.scss';
-/* eslint-enable import/no-unresolved, import/default */
-
-export default angular.module('thingsboard.widgets.dateRangeNavigator', [])
- .directive('dateRangeNavigatorWidget', DateRangeNavigatorWidget)
- .name;
-
-/*@ngInject*/
-function DateRangeNavigatorWidget() {
- return {
- restrict: "E",
- scope: true,
- bindToController: {
- tableId: '=',
- ctx: '='
- },
- controller: DateRangeNavigatorWidgetController,
- controllerAs: 'vm',
- templateUrl: widgetTpl
- };
-}
-
-/*@ngInject*/
-function DateRangeNavigatorWidgetController($scope, $window, $filter) {
-
- let vm = this,
- hour = 3600000,
- day = 86400000,
- week = 604800000,
- month = 2629743000,
- words = [
- "Mon",
- "Tue",
- "Wed",
- "Thu",
- "Fri",
- "Sat",
- "Sun",
- "January",
- "February",
- "March",
- "April",
- "May",
- "June",
- "July",
- "August",
- "September",
- "October",
- "November",
- "December",
- "Ok",
- 'Custom Date Range',
- 'Date Range Template',
- 'Today',
- 'Yesterday',
- 'This Week',
- 'Last Week',
- 'Month',
- 'This Month',
- 'Last Month',
- 'Year',
- 'This Year',
- 'Last Year'
- ],
- firstUpdate = true;
-
- $scope.datesMap = {
- hour: {
- ts: hour,
- label: "Hour"
- },
- day: {
- ts: day,
- label: "Day"
- },
- week: {
- ts: week,
- label: "Week"
- },
- twoWeeks: {
- ts: week * 2,
- label: "2 weeks"
- },
- month: {
- ts: month,
- label: "Month"
- },
- threeMonths: {
- ts: month * 3,
- label: "3 months"
- },
- sixMonths: {
- ts: month * 6,
- label: "6 months"
- }
- };
- $scope.advancedModel = {};
- $scope.endRestrictionDate = Date.now();
- $scope.localizationMap = getLocalizationMap();
-
- $scope.changeInterval = changeInterval;
- $scope.goForth = goForth;
- $scope.goBack = goBack;
- $scope.triggerChange = triggerChange;
-
- $scope.$watch('vm.ctx', function () {
- if (vm.ctx && vm.ctx.dashboard.dashboardTimewindow) {
- $scope.settings = vm.ctx.widgetConfig.settings;
- let selection;
- if ($scope.settings.useSessionStorage) {
- selection = readFromStorage('date-range');
- }
- if (selection) {
- $scope.advancedModel = {
- selectedTemplateName: selection.name,
- dateStart: selection.start,
- dateEnd: selection.end
- };
- } else {
- let end = new Date();
- end.setHours(23, 59, 59, 999);
-
- let formattedDate = getFormattedDate(
- (end.getTime() + 1) - $scope.datesMap[$scope.settings.initialInterval || "week"].ts,
- end.getTime()
- );
- $scope.advancedModel = formattedDate;
- }
- $scope.selectedStepSize = $scope.datesMap[$scope.settings.stepSize || "day"].ts;
-
- widgetContextTimewindowSync();
- }
- });
-
- $scope.$on('dashboardTimewindowChanged', function () {
- $scope.dashboardTimewindowChanged = true;
- widgetContextTimewindowSync();
- });
-
- function getLocalizationMap() {
- let result = {};
-
- words.forEach(function (key) {
- result[key] = $filter('translate')('widgets.date-range-navigator.localizationMap.' + key);
- });
-
- return result;
- }
-
- function triggerChange() {
- updateTimewindow($scope.advancedModel.dateStart.getTime(), $scope.advancedModel.dateEnd.getTime() + day - 1);
- }
-
- function widgetContextTimewindowSync() {
- if (vm.ctx && vm.ctx.dashboardTimewindow && $scope.dashboardTimewindowChanged &&
- vm.ctx.dashboard.dashboardTimewindow.history &&
- vm.ctx.dashboard.dashboardTimewindow.history.fixedTimewindow) {
-
-
- if (!firstUpdate) {
- updateAdvancedModel();
- }
- updateDateInterval();
- if ($scope.settings.useSessionStorage) {
- updateStorageDate();
- }
- if (firstUpdate) {
- updateTimewindow($scope.advancedModel.dateStart.getTime(), $scope.advancedModel.dateEnd.getTime());
- firstUpdate = false;
- }
- }
- }
-
- function getFormattedDate(startTime, endTime) {
- var template;
-
- let startDate = new Date(startTime);
- let endDate = new Date(endTime);
-
- if (getDateDiff(startDate, endDate) === 0) {
- template = $filter('date')(startDate, 'dd MMM yyyy');
- } else {
- template = $filter('date')(
- startDate,
- 'dd' + (startDate.getMonth() !== endDate.getMonth() || startDate.getFullYear() !== endDate.getFullYear() ? ' MMM' : '') + (startDate.getFullYear() !== endDate.getFullYear() ? ' yyyy' : '')
- )
- + ' - ' +
- $filter('date')(
- endDate,
- 'dd MMM yyyy'
- );
- }
-
- return {
- selectedTemplateName: template,
- dateStart: startDate,
- dateEnd: endDate
- };
- }
-
- function readFromStorage(itemKey) {
- if ($window.sessionStorage.getItem(itemKey)) {
- let selection = angular.fromJson($window.sessionStorage.getItem(itemKey));
- selection.start = new Date(parseInt(selection.start));
- selection.end = new Date(parseInt(selection.end));
- return selection;
- }
-
- return undefined;
- }
-
- function goForth() {
- let startTime = vm.ctx.dashboard.dashboardTimewindow.history ?
- vm.ctx.dashboard.dashboardTimewindow.history.fixedTimewindow.startTimeMs :
- $scope.advancedModel.dateStart.getTime();
- let endTime = vm.ctx.dashboard.dashboardTimewindow.history ?
- vm.ctx.dashboard.dashboardTimewindow.history.fixedTimewindow.endTimeMs :
- $scope.advancedModel.dateEnd.getTime();
- updateTimewindow(startTime + $scope.selectedStepSize, endTime + $scope.selectedStepSize);
- }
-
- function goBack() {
- let startTime = vm.ctx.dashboard.dashboardTimewindow.history ?
- vm.ctx.dashboard.dashboardTimewindow.history.fixedTimewindow.startTimeMs :
- $scope.advancedModel.dateStart.getTime();
- let endTime = vm.ctx.dashboard.dashboardTimewindow.history ?
- vm.ctx.dashboard.dashboardTimewindow.history.fixedTimewindow.endTimeMs :
- $scope.advancedModel.dateEnd.getTime();
- updateTimewindow(startTime - $scope.selectedStepSize, endTime - $scope.selectedStepSize);
- }
-
- function changeInterval() {
- let endTime = vm.ctx.dashboard.dashboardTimewindow.history ?
- vm.ctx.dashboard.dashboardTimewindow.history.fixedTimewindow.endTimeMs :
- $scope.advancedModel.dateEnd.getTime();
- updateTimewindow(endTime - $scope.selectedDateInterval / 2, endTime + $scope.selectedDateInterval / 2);
- }
-
- function getDateDiff(date1, date2) {
- if (!date1 || !date2) return;
- var _d1 = new Date(date1.getFullYear(), date1.getMonth(), date1.getDate()),
- _d2 = new Date(date2.getFullYear(), date2.getMonth(), date2.getDate());
- return _d2 - _d1;
- }
-
- function updateTimewindow(startTime, endTime) {
- vm.ctx.dashboard.dashboardTimewindowApi.onUpdateTimewindow(startTime, endTime, 10);
- }
-
- function updateDateInterval() {
- let interval = $scope.advancedModel.dateEnd.getTime() - $scope.advancedModel.dateStart.getTime();
-
- for (let i in $scope.datesMap) {
- if (Object.prototype.hasOwnProperty.call($scope.datesMap, i)) {
- if ($scope.datesMap[i].ts === interval || $scope.datesMap[i].ts === interval + 1 || $scope.datesMap[i].ts === interval - 1) {
- $scope.selectedDateInterval = $scope.datesMap[i].ts;
- $scope.customInterval = false;
- return;
- }
- }
- }
-
- $scope.selectedDateInterval = interval;
- $scope.customInterval = {ts: interval, label: "Custom interval"};
- }
-
- function updateAdvancedModel() {
- $scope.advancedModel = getFormattedDate(vm.ctx.dashboard.dashboardTimewindow.history.fixedTimewindow.startTimeMs, vm.ctx.dashboard.dashboardTimewindow.history.fixedTimewindow.endTimeMs);
- }
-
- function updateStorageDate() {
- saveIntoStorage('date-range', {
- start: $scope.advancedModel.dateStart.getTime(),
- end: $scope.advancedModel.dateEnd.getTime(),
- name: $scope.advancedModel.selectedTemplateName
- });
- }
-
- function saveIntoStorage(keyName, selection) {
- if (selection) {
- $window.sessionStorage.setItem(keyName, angular.toJson(selection));
- }
- }
-}
\ No newline at end of file
diff --git a/ui/src/app/widget/lib/date-range-navigator/date-range-navigator.scss b/ui/src/app/widget/lib/date-range-navigator/date-range-navigator.scss
deleted file mode 100644
index e85c627504..0000000000
--- a/ui/src/app/widget/lib/date-range-navigator/date-range-navigator.scss
+++ /dev/null
@@ -1,108 +0,0 @@
-/**
- * Copyright © 2016-2020 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.
- */
-.date-range-navigator-widget {
- display: flex;
- height: 100%;
-}
-
-.date-range-navigator {
- display: flex;
- flex-wrap: wrap;
- align-items: center;
- justify-content: space-evenly;
- width: 100%;
- margin: auto;
-
- .drn__element {
- display: flex;
- flex-direction: row;
- align-items: center;
- max-width: 100%;
- height: 60px;
- margin: 4px 0;
- }
-
- .navigation {
- md-input-container {
- margin: 0;
- }
- }
-
- .picker {
- .picker__wrapper {
- position: relative;
- max-width: 100%;
- padding: 2px;
-
- > label {
- position: absolute;
- right: -3px;
- bottom: 100%;
- left: 0;
- padding-left: 3px;
- color: #787878;
- transform: scale(.75);
- transform-origin: left bottom;
- }
- }
-
- .md-select-value {
- min-width: 225px;
- border-color: #e1e1e1;
-
- .md-select-icon {
- color: #757575;
- }
- }
- }
-
- &.short-mode {
- display: block;
- width: 90%;
-
- .drn__element {
- width: 100%;
-
- md-input-container {
- flex: 1;
- }
- }
-
- .picker {
- .picker__wrapper {
- width: 100%;
- }
-
- .md-select-value {
- min-width: initial;
- }
- }
-
- &.labels-hidden {
- .drn__element {
- margin: 0;
- }
- }
- }
-
- &.long-mode {
- &.labels-hidden {
- .drn__element {
- height: 36px;
- }
- }
- }
-}
diff --git a/ui/src/app/widget/lib/date-range-navigator/date-range-navigator.tpl.html b/ui/src/app/widget/lib/date-range-navigator/date-range-navigator.tpl.html
deleted file mode 100644
index 714a40b6f5..0000000000
--- a/ui/src/app/widget/lib/date-range-navigator/date-range-navigator.tpl.html
+++ /dev/null
@@ -1,72 +0,0 @@
-
-
-
-
-
-
-
-
- {{'widgets.date-range-navigator.localizationMap.' + customInterval.label | translate}}
-
- {{'widgets.date-range-navigator.localizationMap.' + dateValue.label | translate}}
-
-
-
-
-
-
-
- keyboard_arrow_left
-
-
-
-
-
- {{'widgets.date-range-navigator.localizationMap.'+dateValue.label | translate}}
-
-
-
-
- keyboard_arrow_right
-
-
-
diff --git a/ui/src/app/widget/lib/display-columns-panel.scss b/ui/src/app/widget/lib/display-columns-panel.scss
deleted file mode 100644
index 7fbe98975e..0000000000
--- a/ui/src/app/widget/lib/display-columns-panel.scss
+++ /dev/null
@@ -1,30 +0,0 @@
-/**
- * Copyright © 2016-2020 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-display-columns-panel {
- min-width: 300px;
- overflow: hidden;
- background: #fff;
- border-radius: 4px;
- box-shadow:
- 0 7px 8px -4px rgba(0, 0, 0, .2),
- 0 13px 19px 2px rgba(0, 0, 0, .14),
- 0 5px 24px 4px rgba(0, 0, 0, .12);
-
- md-content {
- overflow: hidden;
- background-color: #fff;
- }
-}
diff --git a/ui/src/app/widget/lib/display-columns-panel.tpl.html b/ui/src/app/widget/lib/display-columns-panel.tpl.html
deleted file mode 100644
index e77a6fb131..0000000000
--- a/ui/src/app/widget/lib/display-columns-panel.tpl.html
+++ /dev/null
@@ -1,23 +0,0 @@
-
-
-
- {{ column.title }}
-
-
diff --git a/ui/src/app/widget/lib/entities-hierarchy-widget.js b/ui/src/app/widget/lib/entities-hierarchy-widget.js
deleted file mode 100644
index 977bd7cea6..0000000000
--- a/ui/src/app/widget/lib/entities-hierarchy-widget.js
+++ /dev/null
@@ -1,529 +0,0 @@
-/*
- * Copyright © 2016-2020 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 './entities-hierarchy-widget.scss';
-
-/* eslint-disable import/no-unresolved, import/default */
-
-import entitiesHierarchyWidgetTemplate from './entities-hierarchy-widget.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-export default angular.module('thingsboard.widgets.entitiesHierarchyWidget', [])
- .directive('tbEntitiesHierarchyWidget', EntitiesHierarchyWidget)
- .name;
-
-/*@ngInject*/
-function EntitiesHierarchyWidget() {
- return {
- restrict: "E",
- scope: true,
- bindToController: {
- hierarchyId: '=',
- ctx: '='
- },
- controller: EntitiesHierarchyWidgetController,
- controllerAs: 'vm',
- templateUrl: entitiesHierarchyWidgetTemplate
- };
-}
-
-/*@ngInject*/
-function EntitiesHierarchyWidgetController($element, $scope, $q, $timeout, toast, types, entityService, entityRelationService /*$filter, $mdMedia, $mdPanel, $document, $translate, $timeout, utils, types*/) {
- var vm = this;
-
- vm.showData = true;
-
- vm.nodeEditCallbacks = {};
-
- vm.nodeIdCounter = 0;
-
- vm.nodesMap = {};
- vm.pendingUpdateNodeTasks = {};
-
- vm.query = {
- search: null
- };
-
- vm.searchAction = {
- name: 'action.search',
- show: true,
- onAction: function() {
- vm.enterFilterMode();
- },
- icon: 'search'
- };
-
- vm.onNodesInserted = onNodesInserted;
- vm.onNodeSelected = onNodeSelected;
- vm.enterFilterMode = enterFilterMode;
- vm.exitFilterMode = exitFilterMode;
- vm.searchCallback = searchCallback;
-
- $scope.$watch('vm.ctx', function() {
- if (vm.ctx && vm.ctx.defaultSubscription) {
- vm.settings = vm.ctx.settings;
- vm.widgetConfig = vm.ctx.widgetConfig;
- vm.subscription = vm.ctx.defaultSubscription;
- vm.datasources = vm.subscription.datasources;
- initializeConfig();
- updateDatasources();
- }
- });
-
- $scope.$watch("vm.query.search", function(newVal, prevVal) {
- if (!angular.equals(newVal, prevVal) && vm.query.search != null) {
- updateSearchNodes();
- }
- });
-
- $scope.$on('entities-hierarchy-data-updated', function(event, hierarchyId) {
- if (vm.hierarchyId == hierarchyId) {
- if (vm.subscription) {
- updateNodeData(vm.subscription.data);
- }
- }
- });
-
- function initializeConfig() {
-
- vm.ctx.widgetActions = [ vm.searchAction ];
-
- var testNodeCtx = {
- entity: {
- id: {
- entityType: 'DEVICE',
- id: '123'
- },
- name: 'TEST DEV1'
- },
- data: {},
- level: 2
- };
- var parentNodeCtx = angular.copy(testNodeCtx);
- parentNodeCtx.level = 1;
- testNodeCtx.parentNodeCtx = parentNodeCtx;
-
- var nodeRelationQueryFunction = loadNodeCtxFunction(vm.settings.nodeRelationQueryFunction, 'nodeCtx', testNodeCtx);
- var nodeIconFunction = loadNodeCtxFunction(vm.settings.nodeIconFunction, 'nodeCtx', testNodeCtx);
- var nodeTextFunction = loadNodeCtxFunction(vm.settings.nodeTextFunction, 'nodeCtx', testNodeCtx);
- var nodeDisabledFunction = loadNodeCtxFunction(vm.settings.nodeDisabledFunction, 'nodeCtx', testNodeCtx);
- var nodeOpenedFunction = loadNodeCtxFunction(vm.settings.nodeOpenedFunction, 'nodeCtx', testNodeCtx);
- var nodeHasChildrenFunction = loadNodeCtxFunction(vm.settings.nodeHasChildrenFunction, 'nodeCtx', testNodeCtx);
-
- var testNodeCtx2 = angular.copy(testNodeCtx);
- testNodeCtx2.entity.name = 'TEST DEV2';
-
- var nodesSortFunction = loadNodeCtxFunction(vm.settings.nodesSortFunction, 'nodeCtx1,nodeCtx2', testNodeCtx, testNodeCtx2);
-
- vm.nodeRelationQueryFunction = nodeRelationQueryFunction || defaultNodeRelationQueryFunction;
- vm.nodeIconFunction = nodeIconFunction || defaultNodeIconFunction;
- vm.nodeTextFunction = nodeTextFunction || ((nodeCtx) => nodeCtx.entity.name);
- vm.nodeDisabledFunction = nodeDisabledFunction || (() => false);
- vm.nodeOpenedFunction = nodeOpenedFunction || defaultNodeOpenedFunction;
- vm.nodeHasChildrenFunction = nodeHasChildrenFunction || (() => true);
- vm.nodesSortFunction = nodesSortFunction || defaultSortFunction;
- }
-
- function loadNodeCtxFunction(functionBody, argNames, ...args) {
- var nodeCtxFunction = null;
- if (angular.isDefined(functionBody) && functionBody.length) {
- try {
- nodeCtxFunction = new Function(argNames, functionBody);
- var res = nodeCtxFunction.apply(null, args);
- if (angular.isUndefined(res)) {
- nodeCtxFunction = null;
- }
- } catch (e) {
- nodeCtxFunction = null;
- }
- }
- return nodeCtxFunction;
- }
-
- function enterFilterMode () {
- vm.query.search = '';
- vm.ctx.hideTitlePanel = true;
- $timeout(()=>{
- angular.element(vm.ctx.$container).find('.searchInput').focus();
- })
- }
-
- function exitFilterMode () {
- vm.query.search = null;
- updateSearchNodes();
- vm.ctx.hideTitlePanel = false;
- }
-
- function searchCallback (searchText, node) {
- var theNode = vm.nodesMap[node.id];
- if (theNode && theNode.data.searchText) {
- return theNode.data.searchText.includes(searchText.toLowerCase());
- }
- return false;
- }
-
- function updateDatasources() {
- vm.loadNodes = loadNodes;
- }
-
- function updateSearchNodes() {
- if (vm.query.search != null) {
- vm.nodeEditCallbacks.search(vm.query.search);
- } else {
- vm.nodeEditCallbacks.clearSearch();
- }
- }
-
- function onNodesInserted(nodes/*, parent*/) {
- if (nodes) {
- nodes.forEach((nodeId) => {
- var task = vm.pendingUpdateNodeTasks[nodeId];
- if (task) {
- task();
- delete vm.pendingUpdateNodeTasks[nodeId];
- }
- });
- }
- }
-
- function onNodeSelected(node, event) {
- var nodeId;
- if (!node) {
- nodeId = -1;
- } else {
- nodeId = node.id;
- }
- if (nodeId !== -1) {
- var selectedNode = vm.nodesMap[nodeId];
- if (selectedNode) {
- var descriptors = vm.ctx.actionsApi.getActionDescriptors('nodeSelected');
- if (descriptors.length) {
- var entity = selectedNode.data.nodeCtx.entity;
- vm.ctx.actionsApi.handleWidgetAction(event, descriptors[0], entity.id, entity.name, { nodeCtx: selectedNode.data.nodeCtx });
- }
- }
- }
- }
-
- function updateNodeData(subscriptionData) {
- var affectedNodes = [];
- if (subscriptionData) {
- for (var i=0;i {
- var node = vm.nodeEditCallbacks.getNode(nodeId);
- if (node) {
- updateNodeStyle(vm.nodesMap[nodeId]);
- } else {
- vm.pendingUpdateNodeTasks[nodeId] = () => {
- updateNodeStyle(vm.nodesMap[nodeId]);
- };
- }
- });
- }
-
- function updateNodeStyle(node) {
- var newText = prepareNodeText(node);
- if (!angular.equals(node.text, newText)) {
- node.text = newText;
- vm.nodeEditCallbacks.updateNode(node.id, node.text);
- }
- var newDisabled = vm.nodeDisabledFunction(node.data.nodeCtx);
- if (!angular.equals(node.state.disabled, newDisabled)) {
- node.state.disabled = newDisabled;
- if (node.state.disabled) {
- vm.nodeEditCallbacks.disableNode(node.id);
- } else {
- vm.nodeEditCallbacks.enableNode(node.id);
- }
- }
- var newHasChildren = vm.nodeHasChildrenFunction(node.data.nodeCtx);
- if (!angular.equals(node.children, newHasChildren)) {
- node.children = newHasChildren;
- vm.nodeEditCallbacks.setNodeHasChildren(node.id, node.children);
- }
- }
-
- function prepareNodeText(node) {
- var nodeIcon = prepareNodeIcon(node.data.nodeCtx);
- var nodeText = vm.nodeTextFunction(node.data.nodeCtx);
- node.data.searchText = nodeText ? nodeText.replace(/<[^>]+>/g, '').toLowerCase() : "";
- return nodeIcon + nodeText;
- }
-
- function loadNodes(node, cb) {
- if (node.id === '#') {
- var tasks = [];
- for (var i=0;i {
- cb(prepareNodes(nodes));
- updateNodeData(vm.subscription.data);
- });
- } else {
- if (node.data && node.data.nodeCtx.entity && node.data.nodeCtx.entity.id && node.data.nodeCtx.entity.id.entityType !== 'function') {
- var relationQuery = prepareNodeRelationQuery(node.data.nodeCtx);
- entityRelationService.findByQuery(relationQuery, {ignoreErrors: true, ignoreLoading: true}).then(
- (entityRelations) => {
- var tasks = [];
- for (var i=0;i {
- cb(prepareNodes(nodes));
- });
- },
- (error) => {
- var errorText = "Failed to get relations!";
- if (error && error.status === 400) {
- errorText = "Invalid relations query returned by 'Node relations query function'! Please check widget configuration!";
- }
- showError(errorText);
- }
- );
- } else {
- cb([]);
- }
- }
- }
-
- function showError(errorText) {
- var toastParent = angular.element('.tb-entities-hierarchy', $element);
- toast.showError(errorText, toastParent, 'bottom left');
- }
-
- function prepareNodes(nodes) {
- nodes = nodes.filter((node) => node !== null);
- nodes.sort((node1, node2) => vm.nodesSortFunction(node1.data.nodeCtx, node2.data.nodeCtx));
- return nodes;
- }
-
- function datasourceToNode(datasource, parentNodeCtx) {
- var deferred = $q.defer();
- resolveEntity(datasource).then(
- (entity) => {
- if (entity != null) {
- var node = {
- id: ++vm.nodeIdCounter
- };
- vm.nodesMap[node.id] = node;
- datasource.nodeId = node.id;
- node.icon = false;
- var nodeCtx = {
- parentNodeCtx: parentNodeCtx,
- entity: entity,
- data: {}
- };
- nodeCtx.level = parentNodeCtx ? parentNodeCtx.level + 1 : 1;
- node.data = {
- datasource: datasource,
- nodeCtx: nodeCtx
- };
- node.state = {
- disabled: vm.nodeDisabledFunction(node.data.nodeCtx),
- opened: vm.nodeOpenedFunction(node.data.nodeCtx)
- };
- node.text = prepareNodeText(node);
- node.children = vm.nodeHasChildrenFunction(node.data.nodeCtx);
- deferred.resolve(node);
- } else {
- deferred.resolve(null);
- }
- }
- );
- return deferred.promise;
- }
-
- function entityIdToNode(entityType, entityId, parentDatasource, parentNodeCtx) {
- var deferred = $q.defer();
- var datasource = {
- dataKeys: parentDatasource.dataKeys,
- type: types.datasourceType.entity,
- entityType: entityType,
- entityId: entityId
- };
- datasourceToNode(datasource, parentNodeCtx).then(
- (node) => {
- if (node != null) {
- var subscriptionOptions = {
- type: types.widgetType.latest.value,
- datasources: [datasource],
- callbacks: {
- onDataUpdated: (subscription) => {
- updateNodeData(subscription.data);
- }
- }
- };
- vm.ctx.subscriptionApi.createSubscription(subscriptionOptions, true).then(
- (/*subscription*/) => {
- deferred.resolve(node);
- }
- );
- } else {
- deferred.resolve(node);
- }
- }
- );
- return deferred.promise;
- }
-
- function resolveEntity(datasource) {
- var deferred = $q.defer();
- if (datasource.type === types.datasourceType.function) {
- var entity = {
- id: {
- entityType: "function"
- },
- name: datasource.name
- }
- deferred.resolve(entity);
- } else {
- entityService.getEntity(datasource.entityType, datasource.entityId, {ignoreLoading: true}).then(
- (entity) => {
- deferred.resolve(entity);
- },
- () => {
- deferred.resolve(null);
- }
- );
- }
- return deferred.promise;
- }
-
-
- function prepareNodeRelationQuery(nodeCtx) {
- var relationQuery = vm.nodeRelationQueryFunction(nodeCtx);
- if (relationQuery && relationQuery === 'default') {
- relationQuery = defaultNodeRelationQueryFunction(nodeCtx);
- }
- return relationQuery;
- }
-
- function defaultNodeRelationQueryFunction(nodeCtx) {
- var entity = nodeCtx.entity;
- var query = {
- parameters: {
- rootId: entity.id.id,
- rootType: entity.id.entityType,
- direction: types.entitySearchDirection.from,
- relationTypeGroup: "COMMON",
- maxLevel: 1
- },
- filters: [
- {
- relationType: "Contains",
- entityTypes: []
- }
- ]
- };
- return query;
- }
-
- function prepareNodeIcon(nodeCtx) {
- var iconInfo = vm.nodeIconFunction(nodeCtx);
- if (iconInfo && iconInfo === 'default') {
- iconInfo = defaultNodeIconFunction(nodeCtx);
- }
- if (iconInfo && (iconInfo.iconUrl || iconInfo.materialIcon)) {
- if (iconInfo.materialIcon) {
- return materialIconHtml(iconInfo.materialIcon);
- } else {
- return iconUrlHtml(iconInfo.iconUrl);
- }
- } else {
- return "";
- }
- }
-
- function materialIconHtml(materialIcon) {
- return ''+materialIcon+'';
- }
-
- function iconUrlHtml(iconUrl) {
- return '
';
- }
-
- function defaultNodeIconFunction(nodeCtx) {
- var materialIcon = 'insert_drive_file';
- var entity = nodeCtx.entity;
- if (entity && entity.id && entity.id.entityType) {
- switch (entity.id.entityType) {
- case 'function':
- materialIcon = 'functions';
- break;
- case types.entityType.device:
- materialIcon = 'devices_other';
- break;
- case types.entityType.asset:
- materialIcon = 'domain';
- break;
- case types.entityType.tenant:
- materialIcon = 'supervisor_account';
- break;
- case types.entityType.customer:
- materialIcon = 'supervisor_account';
- break;
- case types.entityType.user:
- materialIcon = 'account_circle';
- break;
- case types.entityType.dashboard:
- materialIcon = 'dashboards';
- break;
- case types.entityType.alarm:
- materialIcon = 'notifications_active';
- break;
- case types.entityType.entityView:
- materialIcon = 'view_quilt';
- break;
- }
- }
- return {
- materialIcon: materialIcon
- };
- }
-
- function defaultNodeOpenedFunction(nodeCtx) {
- return nodeCtx.level <= 4;
- }
-
- function defaultSortFunction(nodeCtx1, nodeCtx2) {
- var result = nodeCtx1.entity.id.entityType.localeCompare(nodeCtx2.entity.id.entityType);
- if (result === 0) {
- result = nodeCtx1.entity.name.localeCompare(nodeCtx2.entity.name);
- }
- return result;
- }
-}
diff --git a/ui/src/app/widget/lib/entities-hierarchy-widget.scss b/ui/src/app/widget/lib/entities-hierarchy-widget.scss
deleted file mode 100644
index d6b0c81724..0000000000
--- a/ui/src/app/widget/lib/entities-hierarchy-widget.scss
+++ /dev/null
@@ -1,109 +0,0 @@
-/**
- * Copyright © 2016-2020 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-has-timewindow {
- .tb-entities-hierarchy {
- md-toolbar {
- min-height: 60px;
- max-height: 60px;
- }
- }
-}
-
-.tb-entities-hierarchy {
- md-toolbar {
- min-height: 39px;
- max-height: 39px;
- }
-
- .tb-entities-nav-tree-panel {
- overflow-x: auto;
- overflow-y: auto;
-
- .tb-nav-tree-container {
- &.jstree-proton {
- .jstree-anchor {
- div.node-icon {
- display: inline-block;
- width: 22px;
- height: 22px;
- margin-right: 2px;
- margin-bottom: 2px;
- background-color: transparent;
- background-repeat: no-repeat;
- background-attachment: scroll;
- background-position: center center;
- background-size: 18px 18px;
- }
-
- md-icon.node-icon {
- width: 22px;
- min-width: 22px;
- height: 22px;
- min-height: 22px;
- margin-right: 2px;
- margin-bottom: 2px;
- color: inherit;
-
- &.material-icons { /* stylelint-disable-line selector-max-class */
- font-size: 18px;
- line-height: 22px;
- text-align: center;
- }
- }
-
- &.jstree-hovered:not(.jstree-clicked),
- &.jstree-disabled {
- div.node-icon { /* stylelint-disable-line selector-max-class */
- opacity: .5;
- }
- }
- }
- }
- }
- }
-}
-
-@media (max-width: 768px) {
- .tb-entities-hierarchy {
- .tb-entities-nav-tree-panel {
- .tb-nav-tree-container {
- &.jstree-proton-responsive {
- .jstree-anchor {
- div.node-icon {
- width: 40px;
- height: 40px;
- margin: 0;
- background-size: 24px 24px;
- }
-
- md-icon.node-icon {
- width: 40px;
- min-width: 40px;
- height: 40px;
- min-height: 40px;
- margin: 0;
-
- &.material-icons { /* stylelint-disable-line selector-max-class */
- font-size: 24px;
- line-height: 40px;
- }
- }
- }
- }
- }
- }
- }
-}
diff --git a/ui/src/app/widget/lib/entities-hierarchy-widget.tpl.html b/ui/src/app/widget/lib/entities-hierarchy-widget.tpl.html
deleted file mode 100644
index 1ae4dbba6a..0000000000
--- a/ui/src/app/widget/lib/entities-hierarchy-widget.tpl.html
+++ /dev/null
@@ -1,51 +0,0 @@
-
-
-
-
-
-
- search
-
- {{'entity.search' | translate}}
-
-
-
-
-
-
-
- close
-
- {{ 'action.close' | translate }}
-
-
-
-
-
-
-
-
-
diff --git a/ui/src/app/widget/lib/entities-table-widget.js b/ui/src/app/widget/lib/entities-table-widget.js
deleted file mode 100644
index e8cedd640e..0000000000
--- a/ui/src/app/widget/lib/entities-table-widget.js
+++ /dev/null
@@ -1,633 +0,0 @@
-/*
- * Copyright © 2016-2020 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 './entities-table-widget.scss';
-import './display-columns-panel.scss';
-
-/* eslint-disable import/no-unresolved, import/default */
-
-import entitiesTableWidgetTemplate from './entities-table-widget.tpl.html';
-//import entityDetailsDialogTemplate from './entitiy-details-dialog.tpl.html';
-import displayColumnsPanelTemplate from './display-columns-panel.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-import tinycolor from 'tinycolor2';
-import cssjs from '../../../vendor/css.js/css';
-
-export default angular.module('thingsboard.widgets.entitiesTableWidget', [])
- .directive('tbEntitiesTableWidget', EntitiesTableWidget)
- .name;
-
-/*@ngInject*/
-function EntitiesTableWidget() {
- return {
- restrict: "E",
- scope: true,
- bindToController: {
- tableId: '=',
- ctx: '='
- },
- controller: EntitiesTableWidgetController,
- controllerAs: 'vm',
- templateUrl: entitiesTableWidgetTemplate
- };
-}
-
-/*@ngInject*/
-function EntitiesTableWidgetController($element, $scope, $filter, $mdMedia, $mdPanel, $document, $translate, $timeout, utils, types) {
- var vm = this;
-
- vm.stylesInfo = {};
- vm.contentsInfo = {};
- vm.columnWidth = {};
-
- vm.showData = true;
- vm.hasData = false;
-
- vm.entities = [];
- vm.entitiesCount = 0;
-
- vm.datasources = null;
- vm.allEntities = null;
-
- vm.currentEntity = null;
-
- vm.displayEntityName = true;
- vm.entityNameColumnTitle = '';
- vm.displayEntityLabel = false;
- vm.entityLabelColumnTitle = '';
- vm.displayEntityType = true;
- vm.actionCellDescriptors = [];
- vm.displayPagination = true;
- vm.defaultPageSize = 10;
- vm.defaultSortOrder = "'entityName'";
-
- vm.query = {
- order: vm.defaultSortOrder,
- limit: vm.defaultPageSize,
- page: 1,
- search: null
- };
-
- vm.searchAction = {
- name: 'action.search',
- show: true,
- onAction: function() {
- vm.enterFilterMode();
- },
- icon: 'search'
- };
-
- let columnDisplayAction = {
- name: 'entity.columns-to-display',
- show: true,
- onAction: function($event) {
- vm.editColumnsToDisplay($event);
- },
- icon: 'view_column'
- };
-
- vm.enterFilterMode = enterFilterMode;
- vm.exitFilterMode = exitFilterMode;
- vm.onReorder = onReorder;
- vm.onPaginate = onPaginate;
- vm.onRowClick = onRowClick;
- vm.onActionButtonClick = onActionButtonClick;
- vm.isCurrent = isCurrent;
-
- vm.cellStyle = cellStyle;
- vm.cellContent = cellContent;
-
- vm.editColumnsToDisplay = editColumnsToDisplay;
-
- $scope.$watch('vm.ctx', function() {
- if (vm.ctx && vm.ctx.defaultSubscription) {
- vm.settings = vm.ctx.settings;
- vm.widgetConfig = vm.ctx.widgetConfig;
- vm.subscription = vm.ctx.defaultSubscription;
- vm.datasources = vm.subscription.datasources;
- initializeConfig();
- updateDatasources();
- updateEntities();
- }
- });
-
- $scope.$watch("vm.query.search", function(newVal, prevVal) {
- if (!angular.equals(newVal, prevVal) && vm.query.search != null) {
- updateEntities();
- }
- });
-
- $scope.$on('entities-table-data-updated', function(event, tableId) {
- if (vm.tableId == tableId) {
- if (vm.subscription) {
- updateEntitiesData(vm.subscription.data);
- updateEntities();
- $scope.$digest();
- }
- }
- });
-
- $scope.$watch(function() { return $mdMedia('gt-xs'); }, function(isGtXs) {
- vm.isGtXs = isGtXs;
- });
-
- $scope.$watch(function() { return $mdMedia('gt-md'); }, function(isGtMd) {
- vm.isGtMd = isGtMd;
- if (vm.isGtMd) {
- vm.limitOptions = [vm.defaultPageSize, vm.defaultPageSize*2, vm.defaultPageSize*3];
- } else {
- vm.limitOptions = null;
- }
- });
-
- function initializeConfig() {
-
- vm.ctx.widgetActions = [ vm.searchAction, columnDisplayAction ];
-
- vm.actionCellDescriptors = vm.ctx.actionsApi.getActionDescriptors('actionCellButton');
-
- if (vm.settings.entitiesTitle && vm.settings.entitiesTitle.length) {
- vm.entitiesTitle = utils.customTranslation(vm.settings.entitiesTitle, vm.settings.entitiesTitle);
- } else {
- vm.entitiesTitle = $translate.instant('entity.entities');
- }
-
- vm.ctx.widgetTitle = vm.entitiesTitle;
-
- vm.searchAction.show = angular.isDefined(vm.settings.enableSearch) ? vm.settings.enableSearch : true;
- vm.displayEntityName = angular.isDefined(vm.settings.displayEntityName) ? vm.settings.displayEntityName : true;
- vm.displayEntityLabel = angular.isDefined(vm.settings.displayEntityLabel) ? vm.settings.displayEntityLabel : false;
- columnDisplayAction.show = angular.isDefined(vm.settings.enableSelectColumnDisplay) ? vm.settings.enableSelectColumnDisplay : true;
-
- if (vm.settings.entityNameColumnTitle && vm.settings.entityNameColumnTitle.length) {
- vm.entityNameColumnTitle = utils.customTranslation(vm.settings.entityNameColumnTitle, vm.settings.entityNameColumnTitle);
- } else {
- vm.entityNameColumnTitle = $translate.instant('entity.entity-name');
- }
-
- if (vm.settings.entityLabelColumnTitle && vm.settings.entityLabelColumnTitle.length) {
- vm.entityLabelColumnTitle = utils.customTranslation(vm.settings.entityLabelColumnTitle, vm.settings.entityLabelColumnTitle);
- } else {
- vm.entityLabelColumnTitle = $translate.instant('entity.entity-label');
- }
-
- vm.displayEntityType = angular.isDefined(vm.settings.displayEntityType) ? vm.settings.displayEntityType : true;
- vm.displayPagination = angular.isDefined(vm.settings.displayPagination) ? vm.settings.displayPagination : true;
-
- var pageSize = vm.settings.defaultPageSize;
- if (angular.isDefined(pageSize) && angular.isNumber(pageSize) && pageSize > 0) {
- vm.defaultPageSize = pageSize;
- }
-
- if (vm.settings.defaultSortOrder && vm.settings.defaultSortOrder.length) {
- vm.defaultSortOrder = vm.settings.defaultSortOrder;
- if (vm.settings.defaultSortOrder.charAt(0) === "-") {
- vm.defaultSortOrder = '-"' + utils.customTranslation(vm.settings.defaultSortOrder.substring(1), vm.settings.defaultSortOrder.substring(1)) + '"';
- } else {
- vm.defaultSortOrder = '"' + utils.customTranslation(vm.settings.defaultSortOrder, vm.settings.defaultSortOrder) + '"';
- }
- }
-
- vm.query.order = vm.defaultSortOrder;
- vm.query.limit = vm.defaultPageSize;
- if (vm.isGtMd) {
- vm.limitOptions = [vm.defaultPageSize, vm.defaultPageSize*2, vm.defaultPageSize*3];
- } else {
- vm.limitOptions = null;
- }
-
- var origColor = vm.widgetConfig.color || 'rgba(0, 0, 0, 0.87)';
- var defaultColor = tinycolor(origColor);
- var mdDark = defaultColor.setAlpha(0.87).toRgbString();
- var mdDarkSecondary = defaultColor.setAlpha(0.54).toRgbString();
- var mdDarkDisabled = defaultColor.setAlpha(0.26).toRgbString();
- //var mdDarkIcon = mdDarkSecondary;
- var mdDarkDivider = defaultColor.setAlpha(0.12).toRgbString();
-
- //md-icon.md-default-theme, md-icon {
-
- var cssString = 'table.md-table th.md-column {\n'+
- 'color: ' + mdDarkSecondary + ';\n'+
- '}\n'+
- 'table.md-table th.md-column.md-checkbox-column md-checkbox:not(.md-checked) .md-icon {\n'+
- 'border-color: ' + mdDarkSecondary + ';\n'+
- '}\n'+
- 'table.md-table th.md-column md-icon.md-sort-icon {\n'+
- 'color: ' + mdDarkDisabled + ';\n'+
- '}\n'+
- 'table.md-table th.md-column.md-active, table.md-table th.md-column.md-active md-icon {\n'+
- 'color: ' + mdDark + ';\n'+
- '}\n'+
- 'table.md-table td.md-cell {\n'+
- 'color: ' + mdDark + ';\n'+
- 'border-top: 1px '+mdDarkDivider+' solid;\n'+
- '}\n'+
- 'table.md-table td.md-cell.md-checkbox-cell md-checkbox:not(.md-checked) .md-icon {\n'+
- 'border-color: ' + mdDarkSecondary + ';\n'+
- '}\n'+
- 'table.md-table td.md-cell.tb-action-cell button.md-icon-button md-icon {\n'+
- 'color: ' + mdDarkSecondary + ';\n'+
- '}\n'+
- 'table.md-table td.md-cell.md-placeholder {\n'+
- 'color: ' + mdDarkDisabled + ';\n'+
- '}\n'+
- 'table.md-table td.md-cell md-select > .md-select-value > span.md-select-icon {\n'+
- 'color: ' + mdDarkSecondary + ';\n'+
- '}\n'+
- '.md-table-pagination {\n'+
- 'color: ' + mdDarkSecondary + ';\n'+
- 'border-top: 1px '+mdDarkDivider+' solid;\n'+
- '}\n'+
- '.md-table-pagination .buttons md-icon {\n'+
- 'color: ' + mdDarkSecondary + ';\n'+
- '}\n'+
- '.md-table-pagination md-select:not([disabled]):focus .md-select-value {\n'+
- 'color: ' + mdDarkSecondary + ';\n'+
- '}';
-
- var cssParser = new cssjs();
- cssParser.testMode = false;
- var namespace = 'entities-table-' + hashCode(cssString);
- cssParser.cssPreviewNamespace = namespace;
- cssParser.createStyleElement(namespace, cssString);
- $element.addClass(namespace);
-
- function hashCode(str) {
- var hash = 0;
- var i, char;
- if (str.length === 0) return hash;
- for (i = 0; i < str.length; i++) {
- char = str.charCodeAt(i);
- hash = ((hash << 5) - hash) + char;
- hash = hash & hash;
- }
- return hash;
- }
- }
-
- function enterFilterMode () {
- vm.query.search = '';
- vm.ctx.hideTitlePanel = true;
- $timeout(()=>{
- angular.element(vm.ctx.$container).find('.searchInput').focus();
- })
- }
-
- function exitFilterMode () {
- vm.query.search = null;
- updateEntities();
- vm.ctx.hideTitlePanel = false;
- }
-
- function onReorder () {
- updateEntities();
- }
-
- function onPaginate () {
- updateEntities();
- }
-
- function onRowClick($event, entity, isDouble) {
- if ($event) {
- $event.stopPropagation();
- }
- if (vm.currentEntity != entity) {
- vm.currentEntity = entity;
- }
- var actionSourceId = isDouble ? 'rowDoubleClick' : 'rowClick';
- var descriptors = vm.ctx.actionsApi.getActionDescriptors(actionSourceId);
- if (descriptors.length) {
- var entityId, entityName, entityLabel;
- if (vm.currentEntity) {
- entityId = vm.currentEntity.id;
- entityName = vm.currentEntity.entityName;
- entityLabel = vm.currentEntity.entityLabel;
- }
- vm.ctx.actionsApi.handleWidgetAction($event, descriptors[0], entityId, entityName, null, entityLabel);
- }
- }
-
- function onActionButtonClick($event, entity, actionDescriptor) {
- if ($event) {
- $event.stopPropagation();
- }
- var entityId, entityName, entityLabel;
- if (entity) {
- entityId = entity.id;
- entityName = entity.entityName;
- entityLabel = entity.entityLabel;
- }
- vm.ctx.actionsApi.handleWidgetAction($event, actionDescriptor, entityId, entityName, null, entityLabel);
- }
-
- function isCurrent(entity) {
- return (vm.currentEntity && entity && vm.currentEntity.id && entity.id) &&
- (vm.currentEntity.id.id === entity.id.id);
- }
-
- function updateEntities() {
- var result = $filter('orderBy')(vm.allEntities, vm.query.order);
- if (vm.query.search != null) {
- result = $filter('filter')(result, {$: vm.query.search});
- }
- vm.entitiesCount = result.length;
-
- if (vm.displayPagination) {
- var startIndex = vm.query.limit * (vm.query.page - 1);
- vm.entities = result.slice(startIndex, startIndex + vm.query.limit);
- } else {
- vm.entities = result;
- }
- }
-
- function cellStyle(entity, key) {
- var style = {};
- if (entity && key) {
- var styleInfo = vm.stylesInfo[key.label];
- var value = getEntityValue(entity, key);
- if (styleInfo.useCellStyleFunction && styleInfo.cellStyleFunction) {
- try {
- style = styleInfo.cellStyleFunction(value);
- } catch (e) {
- style = {};
- }
- } else {
- style = defaultStyle(key, value);
- }
- }
- if (!style.width) {
- var columnWidth = vm.columnWidth[key.label];
- if(columnWidth !== "0px") {
- style.width = columnWidth;
- } else {
- style.width = "auto";
- }
- }
- return style;
- }
-
- function cellContent(entity, key) {
- var strContent = '';
- if (entity && key) {
- var contentInfo = vm.contentsInfo[key.label];
- var value = getEntityValue(entity, key);
- if (contentInfo.useCellContentFunction && contentInfo.cellContentFunction) {
- if (angular.isDefined(value)) {
- strContent = '' + value;
- }
- var content = strContent;
- try {
- content = contentInfo.cellContentFunction(value, entity, $filter);
- } catch (e) {
- content = strContent;
- }
- } else {
- var decimals = (contentInfo.decimals || contentInfo.decimals === 0) ? contentInfo.decimals : vm.widgetConfig.decimals;
- var units = contentInfo.units || vm.widgetConfig.units;
- content = vm.ctx.utils.formatValue(value, decimals, units, true);
- }
- return content;
- } else {
- return strContent;
- }
- }
-
- function defaultStyle(/*key, value*/) {
- return {};
- }
-
- const getDescendantProp = (obj, path) => (
- path.split('.').reduce((acc, part) => acc && acc[part], obj)
- );
-
- function getEntityValue(entity, key) {
- return getDescendantProp(entity, key.label);
- }
-
- function updateEntitiesData(data) {
- if (vm.allEntities) {
- for (var i=0;i 1) {
- var value = keyData[0][1];
- entity[dataKey.label] = value;
- } else {
- entity[dataKey.label] = '';
- }
- }
- }
- }
- }
-
- function editColumnsToDisplay($event) {
- var element = angular.element($event.target);
- var position = $mdPanel.newPanelPosition()
- .relativeTo(element)
- .addPanelPosition($mdPanel.xPosition.ALIGN_END, $mdPanel.yPosition.BELOW);
- var config = {
- attachTo: angular.element($document[0].body),
- controller: DisplayColumnsPanelController,
- controllerAs: 'vm',
- templateUrl: displayColumnsPanelTemplate,
- panelClass: 'tb-display-columns-panel',
- position: position,
- fullscreen: false,
- locals: {
- 'columns': vm.columns
- },
- openFrom: $event,
- clickOutsideToClose: true,
- escapeToClose: true,
- focusOnOpen: false
- };
- $mdPanel.open(config);
- }
-
- function updateDatasources() {
-
- vm.stylesInfo = {};
- vm.contentsInfo = {};
- vm.columnWidth = {};
- vm.dataKeys = [];
- vm.columns = [];
- vm.allEntities = [];
-
- var datasource;
- var dataKey;
-
- datasource = vm.datasources[0];
-
- vm.ctx.widgetTitle = utils.createLabelFromDatasource(datasource, vm.entitiesTitle);
-
- if (vm.displayEntityName) {
- vm.columns.push(
- {
- name: 'entityName',
- label: 'entityName',
- title: vm.entityNameColumnTitle,
- display: true
- }
- );
- vm.contentsInfo['entityName'] = {
- useCellContentFunction: false
- };
- vm.stylesInfo['entityName'] = {
- useCellStyleFunction: false
- };
- vm.columnWidth['entityName'] = '0px';
- }
-
- if (vm.displayEntityLabel) {
- vm.columns.push(
- {
- name: 'entityLabel',
- label: 'entityLabel',
- title: vm.entityLabelColumnTitle,
- display: true
- }
- );
- vm.contentsInfo['entityLabel'] = {
- useCellContentFunction: false
- };
- vm.stylesInfo['entityLabel'] = {
- useCellStyleFunction: false
- };
- vm.columnWidth['entityLabel'] = '0px';
- }
-
- if (vm.displayEntityType) {
- vm.columns.push(
- {
- name: 'entityType',
- label: 'entityType',
- title: $translate.instant('entity.entity-type'),
- display: true
- }
- );
- vm.contentsInfo['entityType'] = {
- useCellContentFunction: false
- };
- vm.stylesInfo['entityType'] = {
- useCellStyleFunction: false
- };
- vm.columnWidth['entityType'] = '0px';
- }
-
- for (var d = 0; d < datasource.dataKeys.length; d++ ) {
- dataKey = angular.copy(datasource.dataKeys[d]);
- if (dataKey.type == types.dataKeyType.function) {
- dataKey.name = dataKey.label;
- }
- vm.dataKeys.push(dataKey);
-
- dataKey.title = utils.customTranslation(dataKey.label, dataKey.label);
-
- var keySettings = dataKey.settings;
-
- var cellStyleFunction = null;
- var useCellStyleFunction = false;
-
- if (keySettings.useCellStyleFunction === true) {
- if (angular.isDefined(keySettings.cellStyleFunction) && keySettings.cellStyleFunction.length > 0) {
- try {
- cellStyleFunction = new Function('value', keySettings.cellStyleFunction);
- useCellStyleFunction = true;
- } catch (e) {
- cellStyleFunction = null;
- useCellStyleFunction = false;
- }
- }
- }
-
- vm.stylesInfo[dataKey.label] = {
- useCellStyleFunction: useCellStyleFunction,
- cellStyleFunction: cellStyleFunction
- };
-
- var cellContentFunction = null;
- var useCellContentFunction = false;
-
- if (keySettings.useCellContentFunction === true) {
- if (angular.isDefined(keySettings.cellContentFunction) && keySettings.cellContentFunction.length > 0) {
- try {
- cellContentFunction = new Function('value, entity, filter', keySettings.cellContentFunction);
- useCellContentFunction = true;
- } catch (e) {
- cellContentFunction = null;
- useCellContentFunction = false;
- }
- }
- }
-
- vm.contentsInfo[dataKey.label] = {
- useCellContentFunction: useCellContentFunction,
- cellContentFunction: cellContentFunction,
- units: dataKey.units,
- decimals: dataKey.decimals
- };
-
- var columnWidth = angular.isDefined(keySettings.columnWidth) ? keySettings.columnWidth : '0px';
- vm.columnWidth[dataKey.label] = columnWidth;
-
- dataKey.display = true;
- vm.columns.push(dataKey);
- }
-
- for (var i=0;i
-
-
-
-
-
- search
-
- {{'entity.search' | translate}}
-
-
-
-
-
-
-
- close
-
- {{ 'action.close' | translate }}
-
-
-
-
-
-
-
-
- | {{ column.title }} |
- |
-
-
-
-
- |
- |
-
-
- {{actionDescriptor.icon}}
-
- {{ actionDescriptor.displayName }}
-
-
- |
-
-
-
-
- entity.no-entities-prompt
-
-
-
-
-
entity.no-data
-
diff --git a/ui/src/app/widget/lib/extensions-table-widget.js b/ui/src/app/widget/lib/extensions-table-widget.js
deleted file mode 100644
index b8c093f066..0000000000
--- a/ui/src/app/widget/lib/extensions-table-widget.js
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- * Copyright © 2016-2020 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 './extensions-table-widget.scss';
-
-/* eslint-disable import/no-unresolved, import/default */
-
-import extensionsTableWidgetTemplate from './extensions-table-widget.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-export default angular.module('thingsboard.widgets.extensionsTableWidget', [])
- .directive('tbExtensionsTableWidget', ExtensionsTableWidget)
- .name;
-
-/*@ngInject*/
-function ExtensionsTableWidget() {
- return {
- restrict: "E",
- scope: true,
- bindToController: {
- ctx: '='
- },
- controller: ExtensionsTableWidgetController,
- controllerAs: 'vm',
- templateUrl: extensionsTableWidgetTemplate
- };
-}
-
-/*@ngInject*/
-function ExtensionsTableWidgetController($scope, $translate, utils) {
- var vm = this;
-
- vm.datasources = null;
- vm.tabsHidden = false;
-
- $scope.$watch('vm.ctx', function() {
- if (vm.ctx && vm.ctx.defaultSubscription) {
- vm.settings = vm.ctx.settings;
- vm.subscription = vm.ctx.defaultSubscription;
- vm.datasources = vm.subscription.datasources;
- initializeConfig();
- updateDatasources();
- }
- });
-
- function initializeConfig() {
-
- if (vm.settings.extensionsTitle && vm.settings.extensionsTitle.length) {
- vm.extensionsTitle = utils.customTranslation(vm.settings.extensionsTitle, vm.settings.extensionsTitle);
- } else {
- vm.extensionsTitle = $translate.instant('extension.extensions');
- }
- vm.ctx.widgetTitle = vm.extensionsTitle;
-
- vm.ctx.widgetActions = [vm.importExtensionsAction, vm.exportExtensionsAction, vm.addAction, vm.searchAction, vm.refreshAction];
- }
-
- function updateDatasources() {
-
- var datasource = vm.datasources[0];
- vm.selectedSource = vm.datasources[0];
- vm.ctx.widgetTitle = utils.createLabelFromDatasource(datasource, vm.extensionsTitle);
- }
-
- vm.changeSelectedSource = function(source) {
- vm.selectedSource = source;
- };
-
- vm.searchAction = {
- name: "action.search",
- show: true,
- onAction: function() {
- $scope.$broadcast("showSearch", vm.selectedSource);
- },
- icon: "search"
- };
-
- vm.refreshAction = {
- name: "action.refresh",
- show: true,
- onAction: function() {
- $scope.$broadcast("refreshExtensions", vm.selectedSource);
- },
- icon: "refresh"
- };
-
- vm.addAction = {
- name: "action.add",
- show: true,
- onAction: function() {
- $scope.$broadcast("addExtension", vm.selectedSource);
- },
- icon: "add"
- };
-
- vm.exportExtensionsAction = {
- name: "extension.export-extensions-configuration",
- show: true,
- onAction: function() {
- $scope.$broadcast("exportExtensions", vm.selectedSource);
- },
- icon: "file_download"
- };
-
- vm.importExtensionsAction = {
- name: "extension.import-extensions-configuration",
- show: true,
- onAction: function() {
- $scope.$broadcast("importExtensions", vm.selectedSource);
- },
- icon: "file_upload"
- };
-
- $scope.$on("filterMode", function($event, mode) {
- vm.tabsHidden = mode;
- });
-
- $scope.$on("selectedExtensions", function($event, mode) {
- vm.tabsHidden = mode;
- });
-}
\ No newline at end of file
diff --git a/ui/src/app/widget/lib/extensions-table-widget.scss b/ui/src/app/widget/lib/extensions-table-widget.scss
deleted file mode 100644
index ec0f41dd17..0000000000
--- a/ui/src/app/widget/lib/extensions-table-widget.scss
+++ /dev/null
@@ -1,30 +0,0 @@
-/**
- * Copyright © 2016-2020 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-extension-table {
- md-content {
- background-color: #fff;
- }
-}
-
-md-tabs.hide-tabs-menu {
- md-tabs-wrapper {
- display: none;
- }
-
- md-tabs-content-wrapper {
- top: 0 !important;
- }
-}
diff --git a/ui/src/app/widget/lib/extensions-table-widget.tpl.html b/ui/src/app/widget/lib/extensions-table-widget.tpl.html
deleted file mode 100644
index 7a16f8af06..0000000000
--- a/ui/src/app/widget/lib/extensions-table-widget.tpl.html
+++ /dev/null
@@ -1,27 +0,0 @@
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/ui/src/app/widget/lib/flot-widget.js b/ui/src/app/widget/lib/flot-widget.js
deleted file mode 100644
index 3be077ca6d..0000000000
--- a/ui/src/app/widget/lib/flot-widget.js
+++ /dev/null
@@ -1,2151 +0,0 @@
-/*
- * Copyright © 2016-2020 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 $ from 'jquery';
-import tinycolor from 'tinycolor2';
-import moment from 'moment';
-import 'flot/lib/jquery.colorhelpers';
-import 'flot/src/jquery.flot';
-import 'flot/src/plugins/jquery.flot.time';
-import 'flot/src/plugins/jquery.flot.selection';
-import 'flot/src/plugins/jquery.flot.pie';
-import 'flot/src/plugins/jquery.flot.crosshair';
-import 'flot/src/plugins/jquery.flot.stack';
-import 'flot/src/plugins/jquery.flot.symbol';
-import 'flot.curvedlines/curvedLines';
-
-/* eslint-disable angular/angularelement */
-export default class TbFlot {
- constructor(ctx, chartType) {
-
- this.ctx = ctx;
- this.chartType = chartType || 'line';
- var settings = ctx.settings;
- this.utils = this.ctx.$scope.$injector.get('utils');
- this.types = this.ctx.$scope.$injector.get('types');
-
- ctx.tooltip = $('#flot-series-tooltip');
- if (ctx.tooltip.length === 0) {
- ctx.tooltip = $("");
- ctx.tooltip.css({
- fontSize: "12px",
- fontFamily: "Roboto",
- fontWeight: "300",
- lineHeight: "18px",
- opacity: "1",
- backgroundColor: "rgba(0,0,0,0.7)",
- color: "#D9DADB",
- position: "absolute",
- display: "none",
- zIndex: "100",
- padding: "4px 10px",
- borderRadius: "4px"
- }).appendTo("body");
- }
-
- var tbFlot = this;
-
- function seriesInfoDiv(label, color, value, units, trackDecimals, active, percent, valueFormatFunction) {
- var divElement = $('');
- divElement.css({
- display: "flex",
- alignItems: "center",
- justifyContent: "space-between"
- });
- var lineSpan = $('');
- lineSpan.css({
- backgroundColor: color,
- width: "20px",
- height: "3px",
- display: "inline-block",
- verticalAlign: "middle",
- marginRight: "5px"
- });
- divElement.append(lineSpan);
- var labelSpan = $('' + label + ':');
- labelSpan.css({
- marginRight: "10px"
- });
- if (active) {
- labelSpan.css({
- color: "#FFF",
- fontWeight: "700"
- });
- }
- divElement.append(labelSpan);
- var valueContent;
- if (valueFormatFunction) {
- valueContent = valueFormatFunction(value);
- } else {
- valueContent = tbFlot.ctx.utils.formatValue(value, trackDecimals, units);
- }
- if (angular.isNumber(percent)) {
- valueContent += ' (' + Math.round(percent) + ' %)';
- }
- var valueSpan = $('' + valueContent + '');
- valueSpan.css({
- marginLeft: "auto",
- fontWeight: "700"
- });
- if (active) {
- valueSpan.css({
- color: "#FFF"
- });
- }
- divElement.append(valueSpan);
-
- return divElement;
- }
-
- function seriesInfoDivFromInfo(seriesHoverInfo, seriesIndex) {
- var units = seriesHoverInfo.units && seriesHoverInfo.units.length ? seriesHoverInfo.units : tbFlot.ctx.trackUnits;
- var decimals = angular.isDefined(seriesHoverInfo.decimals) ? seriesHoverInfo.decimals : tbFlot.ctx.trackDecimals;
- var divElement = seriesInfoDiv(seriesHoverInfo.label, seriesHoverInfo.color,
- seriesHoverInfo.value, units, decimals, seriesHoverInfo.index === seriesIndex, null, seriesHoverInfo.tooltipValueFormatFunction);
- return divElement.prop('outerHTML');
- }
-
- if (this.chartType === 'pie') {
- ctx.tooltipFormatter = function(item) {
- var units = item.series.dataKey.units && item.series.dataKey.units.length ? item.series.dataKey.units : tbFlot.ctx.trackUnits;
- var decimals = angular.isDefined(item.series.dataKey.decimals) ? item.series.dataKey.decimals : tbFlot.ctx.trackDecimals;
- var divElement = seriesInfoDiv(item.series.dataKey.label, item.series.dataKey.color,
- item.datapoint[1][0][1], units, decimals, true, item.series.percent, item.series.dataKey.tooltipValueFormatFunction);
- return divElement.prop('outerHTML');
- };
- } else {
- ctx.tooltipFormatter = function(hoverInfo, seriesIndex) {
- var content = '';
-
- if (tbFlot.ctx.tooltipIndividual) {
- var seriesHoverArray;
- if (hoverInfo[1] && hoverInfo[1].seriesHover.length) {
- seriesHoverArray = hoverInfo[0].seriesHover.concat(hoverInfo[1].seriesHover);
- } else {
- seriesHoverArray = hoverInfo[0].seriesHover;
- }
- var found = seriesHoverArray.filter((seriesHover) => {
- return seriesHover.index === seriesIndex;
- });
- if (found && found.length) {
- let timestamp = parseInt(found[0].time);
- let date = moment(timestamp).format('YYYY-MM-DD HH:mm:ss');
- let dateDiv = $('' + date + '
');
- dateDiv.css({
- display: "flex",
- alignItems: "center",
- justifyContent: "center",
- padding: "4px",
- fontWeight: "700"
- });
- content += dateDiv.prop('outerHTML');
- content += seriesInfoDivFromInfo(found[0], seriesIndex);
- }
- } else {
- var maxRows;
- if (hoverInfo[1] && hoverInfo[1].seriesHover.length) {
- maxRows = 5;
- } else {
- maxRows = 15;
- }
- var columns = 0;
- if (hoverInfo[1] && (hoverInfo[1].seriesHover.length > hoverInfo[0].seriesHover.length)) {
- columns = Math.ceil(hoverInfo[1].seriesHover.length / maxRows);
- } else {
- columns = Math.ceil(hoverInfo[0].seriesHover.length / maxRows);
- }
-
- for (var j = 0; j < hoverInfo.length; j++) {
- var hoverData = hoverInfo[j];
- if (angular.isNumber(hoverData.time)) {
- var columnsContent = '';
- let timestamp = parseInt(hoverData.time);
- let date = moment(timestamp).format('YYYY-MM-DD HH:mm:ss');
- let dateDiv = $('' + date + '
');
- dateDiv.css({
- display: "flex",
- alignItems: "center",
- justifyContent: "center",
- padding: "4px",
- fontWeight: "700"
- });
- content += dateDiv.prop('outerHTML');
-
- var seriesDiv = $('');
- seriesDiv.css({
- display: "flex",
- flexDirection: "row"
- });
- for (var c = 0; c < columns; c++) {
- var columnDiv = $('');
- columnDiv.css({
- display: "flex",
- flexDirection: "column",
- flex: "1"
- });
- var columnContent = '';
- for (var i = c*maxRows; i < (c+1)*maxRows; i++) {
- if (i >= hoverData.seriesHover.length) {
- break;
- }
- var seriesHoverInfo = hoverData.seriesHover[i];
- columnContent += seriesInfoDivFromInfo(seriesHoverInfo, seriesIndex);
- }
- columnDiv.html(columnContent);
-
- if (columnContent) {
- if (c > 0) {
- columnsContent += '';
- }
- columnsContent += columnDiv.prop('outerHTML');
- }
- }
- seriesDiv.html(columnsContent);
- content += seriesDiv.prop('outerHTML');
- }
- }
- }
- return content;
- };
- }
-
- ctx.trackDecimals = ctx.decimals;
-
- ctx.trackUnits = ctx.units;
-
- ctx.tooltipIndividual = this.chartType === 'pie' || (angular.isDefined(settings.tooltipIndividual) ? settings.tooltipIndividual : false);
- ctx.tooltipCumulative = angular.isDefined(settings.tooltipCumulative) ? settings.tooltipCumulative : false;
- ctx.hideZeros = angular.isDefined(settings.hideZeros) ? settings.hideZeros : false;
-
- var font = {
- color: settings.fontColor || "#545454",
- size: settings.fontSize || 10,
- family: "Roboto"
- };
-
- var options = {
- title: null,
- subtitle: null,
- shadowSize: angular.isDefined(settings.shadowSize) ? settings.shadowSize : 4,
- HtmlText: false,
- grid: {
- hoverable: true,
- mouseActiveRadius: 10,
- autoHighlight: ctx.tooltipIndividual === true,
- markings: []
- },
- selection : { mode : ctx.isMobile ? null : 'x' },
- legend : {
- show: false
- }
- };
-
- if (this.chartType === 'line' || this.chartType === 'bar' || this.chartType === 'state') {
- options.xaxes = [];
- this.xaxis = {
- mode: 'time',
- timezone: 'browser',
- font: angular.copy(font),
- labelFont: angular.copy(font)
- };
- this.yaxis = {
- font: angular.copy(font),
- labelFont: angular.copy(font)
- };
- if (settings.xaxis) {
- this.xaxis.font.color = settings.xaxis.color || this.xaxis.font.color;
- this.xaxis.label = this.utils.customTranslation(settings.xaxis.title, settings.xaxis.title) || null;
- this.xaxis.labelFont.color = this.xaxis.font.color;
- this.xaxis.labelFont.size = this.xaxis.font.size+2;
- this.xaxis.labelFont.weight = "bold";
- }
-
- ctx.yAxisTickFormatter = function(value/*, axis*/) {
- if (settings.yaxis && settings.yaxis.showLabels === false) {
- return '';
- }
- if (this.ticksFormatterFunction) {
- return this.ticksFormatterFunction(value);
- }
-
- var factor = this.tickDecimals ? Math.pow(10, this.tickDecimals) : 1,
- formatted = "" + Math.round(value * factor) / factor;
- if (this.tickDecimals != null) {
- var decimal = formatted.indexOf("."),
- precision = decimal === -1 ? 0 : formatted.length - decimal - 1;
-
- if (precision < this.tickDecimals) {
- formatted = (precision ? formatted : formatted + ".") + ("" + factor).substr(1, this.tickDecimals - precision);
- }
- }
- if (this.tickUnits) {
- formatted += ' ' + this.tickUnits;
- }
-
- return formatted;
- };
-
- this.yaxis.tickFormatter = ctx.yAxisTickFormatter;
-
- if (settings.yaxis) {
- this.yaxis.font.color = settings.yaxis.color || this.yaxis.font.color;
- this.yaxis.min = angular.isDefined(settings.yaxis.min) ? settings.yaxis.min : null;
- this.yaxis.max = angular.isDefined(settings.yaxis.max) ? settings.yaxis.max : null;
- this.yaxis.label = this.utils.customTranslation(settings.yaxis.title, settings.yaxis.title) || null;
- this.yaxis.labelFont.color = this.yaxis.font.color;
- this.yaxis.labelFont.size = this.yaxis.font.size+2;
- this.yaxis.labelFont.weight = "bold";
- if (angular.isNumber(settings.yaxis.tickSize)) {
- this.yaxis.tickSize = settings.yaxis.tickSize;
- } else {
- this.yaxis.tickSize = null;
- }
- if (angular.isNumber(settings.yaxis.tickDecimals)) {
- this.yaxis.tickDecimals = settings.yaxis.tickDecimals
- } else {
- this.yaxis.tickDecimals = null;
- }
- if (settings.yaxis.ticksFormatter && settings.yaxis.ticksFormatter.length) {
- try {
- this.yaxis.ticksFormatterFunction = new Function('value', settings.yaxis.ticksFormatter);
- } catch (e) {
- this.yaxis.ticksFormatterFunction = null;
- }
- }
- }
-
- options.grid.borderWidth = 1;
- options.grid.color = settings.fontColor || "#545454";
-
- if (settings.grid) {
- options.grid.color = settings.grid.color || "#545454";
- options.grid.backgroundColor = settings.grid.backgroundColor || null;
- options.grid.tickColor = settings.grid.tickColor || "#DDDDDD";
- options.grid.borderWidth = angular.isDefined(settings.grid.outlineWidth) ?
- settings.grid.outlineWidth : 1;
- if (settings.grid.verticalLines === false) {
- this.xaxis.tickLength = 0;
- }
- if (settings.grid.horizontalLines === false) {
- this.yaxis.tickLength = 0;
- }
- if (angular.isDefined(settings.grid.margin)) {
- options.grid.margin = settings.grid.margin;
- }
- if (angular.isDefined(settings.grid.minBorderMargin)) {
- options.grid.minBorderMargin = settings.grid.minBorderMargin;
- }
- }
-
- options.xaxes[0] = angular.copy(this.xaxis);
-
- if (settings.xaxis && settings.xaxis.showLabels === false) {
- options.xaxes[0].tickFormatter = function() {
- return '';
- };
- }
-
- if (settings.comparisonEnabled) {
- var xaxis = angular.copy(this.xaxis);
- xaxis.position = 'top';
- if (settings.xaxisSecond) {
- if (settings.xaxisSecond.showLabels === false) {
- xaxis.tickFormatter = function() {
- return '';
- };
- }
- xaxis.label = this.utils.customTranslation(settings.xaxisSecond.title, settings.xaxisSecond.title) || null;
- xaxis.position = settings.xaxisSecond.axisPosition;
- }
- xaxis.tickLength = 0;
- options.xaxes.push(xaxis);
-
- options.series = {
- stack: false
- };
- } else {
- options.series = {
- stack: settings.stack === true
- };
- }
-
- options.crosshair = {
- mode: 'x'
- };
-
- if (this.chartType === 'line' && settings.smoothLines) {
- options.series.curvedLines = {
- active: true,
- monotonicFit: true
- }
- }
-
- if (this.chartType === 'line' && isFinite(settings.thresholdsLineWidth)) {
- options.grid.markingsLineWidth = settings.thresholdsLineWidth;
- }
-
- if (this.chartType === 'bar') {
- options.series.lines = {
- show: false,
- fill: false,
- steps: false
- }
- options.series.bars ={
- show: true,
- lineWidth: 0,
- fill: 0.9,
- align: settings.barAlignment || "left"
- }
- ctx.defaultBarWidth = settings.defaultBarWidth || 600;
- }
-
- if (this.chartType === 'state') {
- options.series.lines = {
- steps: true,
- show: true
- }
- }
-
- } else if (this.chartType === 'pie') {
- options.series = {
- pie: {
- show: true,
- label: {
- show: settings.showLabels || settings.showPercentages
- },
- radius: settings.radius || 1,
- innerRadius: settings.innerRadius || 0,
- stroke: {
- color: '#fff',
- width: 0
- },
- tilt: settings.tilt || 1,
- shadow: {
- left: 5,
- top: 15,
- alpha: 0.02
- }
- }
- }
- options.grid.clickable = true;
-
- if (settings.stroke) {
- options.series.pie.stroke.color = settings.stroke.color || '#fff';
- options.series.pie.stroke.width = settings.stroke.width || 0;
- }
-
- if (options.series.pie.label.show) {
- options.series.pie.label.formatter = function (label, series) {
- return "" +
- (settings.showLabels ? series.dataKey.label : "") +
- (settings.showLabels && settings.showPercentages ? "
" : "") +
- (settings.showPercentages ? Math.round(series.percent) + "%" : "") +
- "
";
- }
- options.series.pie.label.radius = 3/4;
- options.series.pie.label.background = {
- opacity: 0.8
- };
- }
- }
-
- //Experimental
- this.ctx.animatedPie = settings.animatedPie === true;
-
- this.options = options;
-
- if (this.ctx.defaultSubscription) {
- this.init(this.ctx.$container, this.ctx.defaultSubscription);
- }
- }
-
- init($element, subscription) {
- this.subscription = subscription;
- this.$element = $element;
- var colors = [];
- this.yaxes = [];
- var yaxesMap = {};
- let predefinedThresholds = [], thresholdsDatasources = [];
-
- var tooltipValueFormatFunction = null;
- if (this.ctx.settings.tooltipValueFormatter && this.ctx.settings.tooltipValueFormatter.length) {
- try {
- tooltipValueFormatFunction = new Function('value', this.ctx.settings.tooltipValueFormatter);
- } catch (e) {
- tooltipValueFormatFunction = null;
- }
- }
-
- for (var i = 0; i < this.subscription.data.length; i++) {
- var series = this.subscription.data[i];
- colors.push(series.dataKey.color);
- var keySettings = series.dataKey.settings;
-
- series.dataKey.tooltipValueFormatFunction = tooltipValueFormatFunction;
- if (keySettings.tooltipValueFormatter && keySettings.tooltipValueFormatter.length) {
- try {
- series.dataKey.tooltipValueFormatFunction = new Function('value', keySettings.tooltipValueFormatter);
- } catch (e) {
- series.dataKey.tooltipValueFormatFunction = tooltipValueFormatFunction;
- }
- }
- series.lines = {
- fill: keySettings.fillLines === true
- };
-
- if (this.ctx.settings.stack && !this.ctx.settings.comparisonEnabled) {
- series.stack = !keySettings.excludeFromStacking;
- } else {
- series.stack = false;
- }
-
- if (this.chartType === 'line' || this.chartType === 'state') {
- series.lines.show = keySettings.showLines !== false
- } else {
- series.lines.show = keySettings.showLines === true;
- }
-
- if (angular.isDefined(keySettings.lineWidth)) {
- series.lines.lineWidth = keySettings.lineWidth;
- }
-
- series.points = {
- show: false,
- radius: 8
- };
- if (keySettings.showPoints === true) {
- series.points.show = true;
- series.points.lineWidth = angular.isDefined(keySettings.showPointsLineWidth) ? keySettings.showPointsLineWidth : 5;
- series.points.radius = angular.isDefined(keySettings.showPointsRadius) ? keySettings.showPointsRadius : 3;
- series.points.symbol = angular.isDefined(keySettings.showPointShape) ? keySettings.showPointShape : 'circle';
- if (series.points.symbol == 'custom' && keySettings.pointShapeFormatter) {
- try {
- series.points.symbol = new Function('ctx, x, y, radius, shadow', keySettings.pointShapeFormatter);
- } catch (e) {
- series.points.symbol = 'circle';
- }
- }
-
- }
-
- if (this.chartType === 'line' && this.ctx.settings.smoothLines && !series.points.show) {
- series.curvedLines = {
- apply: true
- };
- }
-
- var lineColor = tinycolor(series.dataKey.color);
- lineColor.setAlpha(.75);
-
- series.highlightColor = lineColor.toRgbString();
-
- if (series.datasource.isAdditional) {
- series.xaxisIndex = 1;
- series.xaxis = 2;
- } else {
- series.xaxisIndex = 0;
- series.xaxis = 1;
- }
-
-
- if (this.yaxis) {
- var units = series.dataKey.units && series.dataKey.units.length ? series.dataKey.units : this.ctx.trackUnits;
- var yaxis;
- if (keySettings.showSeparateAxis) {
- yaxis = this.createYAxis(keySettings, units);
- this.yaxes.push(yaxis);
- } else {
- yaxis = yaxesMap[units];
- if (!yaxis) {
- yaxis = this.createYAxis(keySettings, units);
- yaxesMap[units] = yaxis;
- this.yaxes.push(yaxis);
- }
- }
- series.yaxisIndex = this.yaxes.indexOf(yaxis);
- series.yaxis = series.yaxisIndex+1;
- yaxis.keysInfo[i] = {hidden: false};
- yaxis.show = true;
-
- if (keySettings.thresholds && keySettings.thresholds.length) {
- for (let j = 0; j < keySettings.thresholds.length; j++) {
- let threshold = keySettings.thresholds[j];
- if (threshold.thresholdValueSource === 'predefinedValue' && isFinite(threshold.thresholdValue)) {
- let colorIndex = this.subscription.data.length + predefinedThresholds.length;
- this.generateThreshold(predefinedThresholds, series.yaxis, threshold.lineWidth, threshold.color, colorIndex, threshold.thresholdValue);
- } else if (threshold.thresholdEntityAlias && threshold.thresholdAttribute) {
- let entityAliasId = this.ctx.aliasController.getEntityAliasId(threshold.thresholdEntityAlias);
- if (!entityAliasId) {
- continue;
- }
-
- let datasource = thresholdsDatasources.filter((datasource) => {
- return datasource.entityAliasId === entityAliasId;
- })[0];
-
- let dataKey = {
- type: this.types.dataKeyType.attribute,
- name: threshold.thresholdAttribute,
- label: threshold.thresholdAttribute,
- settings: {
- yaxis: series.yaxis,
- lineWidth: threshold.lineWidth,
- color: threshold.color
- },
- _hash: Math.random()
- };
-
- if (datasource) {
- datasource.dataKeys.push(dataKey);
- } else {
- datasource = {
- type: this.types.datasourceType.entity,
- name: threshold.thresholdEntityAlias,
- aliasName: threshold.thresholdEntityAlias,
- entityAliasId: entityAliasId,
- dataKeys: [ dataKey ]
- };
- thresholdsDatasources.push(datasource);
- }
- }
- }
- }
- }
- }
-
- this.subscribeForThresholdsAttributes(thresholdsDatasources);
-
- this.options.grid.markings = predefinedThresholds;
- this.predefinedThresholds = predefinedThresholds;
-
- this.options.colors = colors;
- this.options.yaxes = angular.copy(this.yaxes);
- if (this.chartType === 'line' || this.chartType === 'bar' || this.chartType === 'state') {
- if (this.chartType === 'bar') {
- if (this.subscription.timeWindowConfig.aggregation && this.subscription.timeWindowConfig.aggregation.type === 'NONE') {
- this.options.series.bars.barWidth = this.ctx.defaultBarWidth;
- } else {
- this.options.series.bars.barWidth = this.subscription.timeWindow.interval * 0.6;
- }
- }
- this.options.xaxes[0].min = this.subscription.timeWindow.minTime;
- this.options.xaxes[0].max = this.subscription.timeWindow.maxTime;
- if (this.ctx.settings.comparisonEnabled) {
- this.options.xaxes[1].min = this.subscription.comparisonTimeWindow.minTime;
- this.options.xaxes[1].max = this.subscription.comparisonTimeWindow.maxTime;
- }
- }
-
- this.checkMouseEvents();
-
- if (this.ctx.plot) {
- this.ctx.plot.destroy();
- }
-
- if (this.chartType === 'pie' && this.ctx.animatedPie) {
- this.ctx.pieDataAnimationDuration = 250;
- this.pieData = angular.copy(this.subscription.data);
- this.ctx.pieRenderedData = [];
- this.ctx.pieTargetData = [];
- for (i = 0; i < this.subscription.data.length; i++) {
- this.ctx.pieTargetData[i] = (this.subscription.data[i].data && this.subscription.data[i].data[0])
- ? this.subscription.data[i].data[0][1] : 0;
- }
- this.pieDataRendered();
- }
- this.ctx.plotInited = true;
- this.createPlot();
- }
-
- createYAxis(keySettings, units) {
- var yaxis = angular.copy(this.yaxis);
- var tickDecimals, tickSize;
-
- var label = keySettings.axisTitle && keySettings.axisTitle.length ? keySettings.axisTitle : yaxis.label;
- if (angular.isNumber(keySettings.axisTickDecimals)) {
- tickDecimals = keySettings.axisTickDecimals;
- } else {
- tickDecimals = yaxis.tickDecimals;
- }
- if (angular.isNumber(keySettings.axisTickSize)) {
- tickSize = keySettings.axisTickSize;
- } else {
- tickSize = yaxis.tickSize;
- }
- var position = keySettings.axisPosition && keySettings.axisPosition.length ? keySettings.axisPosition : "left";
-
- var min = angular.isDefined(keySettings.axisMin) ? keySettings.axisMin : yaxis.min;
- var max = angular.isDefined(keySettings.axisMax) ? keySettings.axisMax : yaxis.max;
-
- yaxis.label = label;
- yaxis.min = min;
- yaxis.max = max;
- yaxis.tickUnits = units;
- yaxis.tickDecimals = tickDecimals;
- yaxis.tickSize = tickSize;
- if (position === "right" && tickSize === null) {
- yaxis.alignTicksWithAxis = 1;
- } else {
- yaxis.alignTicksWithAxis = null;
- }
- yaxis.position = position;
-
- yaxis.keysInfo = [];
-
- if (keySettings.axisTicksFormatter && keySettings.axisTicksFormatter.length) {
- try {
- yaxis.ticksFormatterFunction = new Function('value', keySettings.axisTicksFormatter);
- } catch (e) {
- yaxis.ticksFormatterFunction = this.yaxis.ticksFormatterFunction;
- }
- }
- return yaxis;
- }
-
- subscribeForThresholdsAttributes(datasources) {
- let tbFlot = this;
- let thresholdsSourcesSubscriptionOptions = {
- datasources: datasources,
- useDashboardTimewindow: false,
- type: this.types.widgetType.latest.value,
- callbacks: {
- onDataUpdated: (subscription) => {tbFlot.thresholdsSourcesDataUpdated(subscription.data)}
- }
- };
- this.ctx.subscriptionApi.createSubscription(thresholdsSourcesSubscriptionOptions, true).then(
- (subscription) => {
- tbFlot.thresholdsSourcesSubscription = subscription;
- }
- );
- }
-
- thresholdsSourcesDataUpdated(data) {
- let allThresholds = angular.copy(this.predefinedThresholds);
- for (let i = 0; i < data.length; i++) {
- let keyData = data[i];
- if (keyData && keyData.data && keyData.data[0]) {
- let attrValue = keyData.data[0][1];
- if (isFinite(attrValue)) {
- let settings = keyData.dataKey.settings;
- let colorIndex = this.subscription.data.length + allThresholds.length;
- this.generateThreshold(allThresholds, settings.yaxis, settings.lineWidth, settings.color, colorIndex, attrValue);
- }
- }
- }
-
- this.options.grid.markings = allThresholds;
- this.redrawPlot();
- }
-
- generateThreshold(existingThresholds, yaxis, lineWidth, color, defaultColorIndex, thresholdValue) {
- let marking = {};
- let markingYAxis;
-
- if (yaxis !== 1) {
- markingYAxis = 'y' + yaxis + 'axis';
- } else {
- markingYAxis = 'yaxis';
- }
-
- if (isFinite(lineWidth)) {
- marking.lineWidth = lineWidth;
- }
-
- if (angular.isDefined(color)) {
- marking.color = color;
- } else {
- marking.color = this.utils.getMaterialColor(defaultColorIndex);
- }
-
- marking[markingYAxis] = {
- from: thresholdValue,
- to: thresholdValue
- };
-
- let similarMarkings = existingThresholds.filter((existingMarking) => {
- return angular.equals(existingMarking[markingYAxis], marking[markingYAxis]);
- });
- if (!similarMarkings.length) {
- existingThresholds.push(marking);
- }
- }
-
- update() {
- if (this.updateTimeoutHandle) {
- this.ctx.$scope.$timeout.cancel(this.updateTimeoutHandle);
- this.updateTimeoutHandle = null;
- }
- if (this.subscription) {
- if (!this.isMouseInteraction && this.ctx.plot) {
- if (this.chartType === 'line' || this.chartType === 'bar' || this.chartType === 'state') {
-
- var axisVisibilityChanged = false;
- if (this.yaxis) {
- for (var i = 0; i < this.subscription.data.length; i++) {
- var series = this.subscription.data[i];
- var yaxisIndex = series.yaxisIndex;
- if (this.yaxes[yaxisIndex].keysInfo[i].hidden != series.dataKey.hidden) {
- this.yaxes[yaxisIndex].keysInfo[i].hidden = series.dataKey.hidden;
- axisVisibilityChanged = true;
- }
- }
- if (axisVisibilityChanged) {
- this.options.yaxes.length = 0;
- for (var y = 0; y < this.yaxes.length; y++) {
- var yaxis = this.yaxes[y];
- var hidden = true;
- for (var k = 0; k < yaxis.keysInfo.length; k++) {
- if (yaxis.keysInfo[k]) {
- hidden = hidden && yaxis.keysInfo[k].hidden;
- }
- }
- yaxis.hidden = hidden;
- var newIndex = 1;
- if (!yaxis.hidden) {
- this.options.yaxes.push(yaxis);
- newIndex = this.options.yaxes.length;
- }
- for (k = 0; k < yaxis.keysInfo.length; k++) {
- if (yaxis.keysInfo[k]) {
- this.subscription.data[k].yaxis = newIndex;
- }
- }
-
- }
- this.options.yaxis = {
- show: this.options.yaxes.length ? true : false
- };
- }
- }
-
- this.options.xaxes[0].min = this.subscription.timeWindow.minTime;
- this.options.xaxes[0].max = this.subscription.timeWindow.maxTime;
- if (this.ctx.settings.comparisonEnabled) {
- this.options.xaxes[1].min = this.subscription.comparisonTimeWindow.minTime;
- this.options.xaxes[1].max = this.subscription.comparisonTimeWindow.maxTime;
- }
- if (this.chartType === 'bar') {
- if (this.subscription.timeWindowConfig.aggregation && this.subscription.timeWindowConfig.aggregation.type === 'NONE') {
- this.options.series.bars.barWidth = this.ctx.defaultBarWidth;
- } else {
- this.options.series.bars.barWidth = this.subscription.timeWindow.interval * 0.6;
- }
- }
-
- if (axisVisibilityChanged) {
- this.redrawPlot();
- } else {
- this.ctx.plot.getOptions().xaxes[0].min = this.subscription.timeWindow.minTime;
- this.ctx.plot.getOptions().xaxes[0].max = this.subscription.timeWindow.maxTime;
- if (this.ctx.settings.comparisonEnabled) {
- this.ctx.plot.getOptions().xaxes[1].min = this.subscription.comparisonTimeWindow.minTime;
- this.ctx.plot.getOptions().xaxes[1].max = this.subscription.comparisonTimeWindow.maxTime;
- }
- if (this.chartType === 'bar') {
- if (this.subscription.timeWindowConfig.aggregation && this.subscription.timeWindowConfig.aggregation.type === 'NONE') {
- this.ctx.plot.getOptions().series.bars.barWidth = this.ctx.defaultBarWidth;
- } else {
- this.ctx.plot.getOptions().series.bars.barWidth = this.subscription.timeWindow.interval * 0.6;
- }
- }
- this.updateData();
- }
- } else if (this.chartType === 'pie') {
- if (this.ctx.animatedPie) {
- this.nextPieDataAnimation(true);
- } else {
- this.updateData();
- }
- }
- } else if (this.isMouseInteraction && this.ctx.plot){
- var tbFlot = this;
- this.updateTimeoutHandle = this.ctx.$scope.$timeout(function() {
- tbFlot.update();
- }, 30, false);
- }
- }
- }
-
- updateData() {
- this.ctx.plot.setData(this.subscription.data);
- if (this.chartType !== 'pie') {
- this.ctx.plot.setupGrid();
- }
- this.ctx.plot.draw();
- }
-
- resize() {
- if (this.resizeTimeoutHandle) {
- this.ctx.$scope.$timeout.cancel(this.resizeTimeoutHandle);
- this.resizeTimeoutHandle = null;
- }
- if (this.ctx.plot && this.ctx.plotInited) {
- var width = this.$element.width();
- var height = this.$element.height();
- if (width && height) {
- this.ctx.plot.resize();
- if (this.chartType !== 'pie') {
- this.ctx.plot.setupGrid();
- }
- this.ctx.plot.draw();
- } else {
- var tbFlot = this;
- this.resizeTimeoutHandle = this.ctx.$scope.$timeout(function() {
- tbFlot.resize();
- }, 30, false);
- }
- }
- }
-
-
- redrawPlot() {
- if (this.ctx.plot && this.ctx.plotInited) {
- this.ctx.plot.destroy();
- this.ctx.plot = null;
- this.createPlot();
- }
- }
-
- createPlot() {
- if (this.createPlotTimeoutHandle) {
- this.ctx.$scope.$timeout.cancel(this.createPlotTimeoutHandle);
- this.createPlotTimeoutHandle = null;
- }
- if (this.ctx.plotInited && !this.ctx.plot) {
- var width = this.$element.width();
- var height = this.$element.height();
- if (width && height) {
- if (this.chartType === 'pie' && this.ctx.animatedPie) {
- this.ctx.plot = $.plot(this.$element, this.pieData, this.options);
- } else {
- this.ctx.plot = $.plot(this.$element, this.subscription.data, this.options);
- }
- } else {
- var tbFlot = this;
- this.createPlotTimeoutHandle = this.ctx.$scope.$timeout(function() {
- tbFlot.createPlot();
- }, 30, false);
- }
- }
- }
-
- destroy() {
- this.cleanup();
- if (this.ctx.plot) {
- this.ctx.plot.destroy();
- this.ctx.plot = null;
- this.ctx.plotInited = false;
- }
- }
-
- cleanup() {
- if (this.updateTimeoutHandle) {
- this.ctx.$scope.$timeout.cancel(this.updateTimeoutHandle);
- this.updateTimeoutHandle = null;
- }
- if (this.createPlotTimeoutHandle) {
- this.ctx.$scope.$timeout.cancel(this.createPlotTimeoutHandle);
- this.createPlotTimeoutHandle = null;
- }
- if (this.resizeTimeoutHandle) {
- this.ctx.$scope.$timeout.cancel(this.resizeTimeoutHandle);
- this.resizeTimeoutHandle = null;
- }
- }
-
- checkMouseEvents() {
- var enabled = !this.ctx.isMobile && !this.ctx.isEdit;
- if (angular.isUndefined(this.mouseEventsEnabled) || this.mouseEventsEnabled != enabled) {
- this.mouseEventsEnabled = enabled;
- if (this.$element) {
- if (enabled) {
- this.enableMouseEvents();
- } else {
- this.disableMouseEvents();
- }
- this.redrawPlot();
- }
- }
- }
-
- static get pieSettingsSchema() {
- return {
- "schema": {
- "type": "object",
- "title": "Settings",
- "properties": {
- "radius": {
- "title": "Radius",
- "type": "number",
- "default": 1
- },
- "innerRadius": {
- "title": "Inner radius",
- "type": "number",
- "default": 0
- },
- "tilt": {
- "title": "Tilt",
- "type": "number",
- "default": 1
- },
- "animatedPie": {
- "title": "Enable pie animation (experimental)",
- "type": "boolean",
- "default": false
- },
- "stroke": {
- "title": "Stroke",
- "type": "object",
- "properties": {
- "color": {
- "title": "Color",
- "type": "string",
- "default": ""
- },
- "width": {
- "title": "Width (pixels)",
- "type": "number",
- "default": 0
- }
- }
- },
- "showLabels": {
- "title": "Show labels",
- "type": "boolean",
- "default": false
- },
- "showPercentages": {
- "title": "Show percentages",
- "type": "boolean",
- "default": false
- },
- "fontColor": {
- "title": "Font color",
- "type": "string",
- "default": "#545454"
- },
- "fontSize": {
- "title": "Font size",
- "type": "number",
- "default": 10
- }
- },
- "required": []
- },
- "form": [
- "radius",
- "innerRadius",
- "animatedPie",
- "tilt",
- {
- "key": "stroke",
- "items": [
- {
- "key": "stroke.color",
- "type": "color"
- },
- "stroke.width"
- ]
- },
- "showLabels",
- "showPercentages",
- {
- "key": "fontColor",
- "type": "color"
- },
- "fontSize"
- ]
- }
- }
-
- static settingsSchema(chartType) {
-
- var schema = {
- "schema": {
- "type": "object",
- "title": "Settings",
- "properties": {
- }
- }
- };
-
- var properties = schema["schema"]["properties"];
- properties["stack"] = {
- "title": "Stacking",
- "type": "boolean",
- "default": false
- };
- if (chartType === 'graph') {
- properties["smoothLines"] = {
- "title": "Display smooth (curved) lines",
- "type": "boolean",
- "default": false
- };
- }
- if (chartType === 'bar') {
- properties["defaultBarWidth"] = {
- "title": "Default bar width for non-aggregated data (milliseconds)",
- "type": "number",
- "default": 600
- };
- properties["barAlignment"] = {
- "title": "Bar alignment",
- "type": "string",
- "default": "left"
- };
- }
- if (chartType === 'graph' || chartType === 'bar') {
- properties["thresholdsLineWidth"] = {
- "title": "Default line width for all thresholds",
- "type": "number"
- };
- }
- properties["shadowSize"] = {
- "title": "Shadow size",
- "type": "number",
- "default": 4
- };
- properties["fontColor"] = {
- "title": "Font color",
- "type": "string",
- "default": "#545454"
- };
- properties["fontSize"] = {
- "title": "Font size",
- "type": "number",
- "default": 10
- };
- properties["tooltipIndividual"] = {
- "title": "Hover individual points",
- "type": "boolean",
- "default": false
- };
- properties["tooltipCumulative"] = {
- "title": "Show cumulative values in stacking mode",
- "type": "boolean",
- "default": false
- };
- properties["tooltipValueFormatter"] = {
- "title": "Tooltip value format function, f(value)",
- "type": "string",
- "default": ""
- };
- properties["hideZeros"] = {
- "title": "Hide zero/false values from tooltip",
- "type": "boolean",
- "default": false
- };
-
- properties["grid"] = {
- "title": "Grid settings",
- "type": "object",
- "properties": {
- "color": {
- "title": "Primary color",
- "type": "string",
- "default": "#545454"
- },
- "backgroundColor": {
- "title": "Background color",
- "type": "string",
- "default": null
- },
- "tickColor": {
- "title": "Ticks color",
- "type": "string",
- "default": "#DDDDDD"
- },
- "outlineWidth": {
- "title": "Grid outline/border width (px)",
- "type": "number",
- "default": 1
- },
- "verticalLines": {
- "title": "Show vertical lines",
- "type": "boolean",
- "default": true
- },
- "horizontalLines": {
- "title": "Show horizontal lines",
- "type": "boolean",
- "default": true
- }
- }
- };
-
- properties["xaxis"] = {
- "title": "X axis settings",
- "type": "object",
- "properties": {
- "showLabels": {
- "title": "Show labels",
- "type": "boolean",
- "default": true
- },
- "title": {
- "title": "Axis title",
- "type": "string",
- "default": null
- },
- "color": {
- "title": "Ticks color",
- "type": "string",
- "default": null
- }
- }
- };
-
- properties["yaxis"] = {
- "title": "Y axis settings",
- "type": "object",
- "properties": {
- "min": {
- "title": "Minimum value on the scale",
- "type": "number",
- "default": null
- },
- "max": {
- "title": "Maximum value on the scale",
- "type": "number",
- "default": null
- },
- "showLabels": {
- "title": "Show labels",
- "type": "boolean",
- "default": true
- },
- "title": {
- "title": "Axis title",
- "type": "string",
- "default": null
- },
- "color": {
- "title": "Ticks color",
- "type": "string",
- "default": null
- },
- "ticksFormatter": {
- "title": "Ticks formatter function, f(value)",
- "type": "string",
- "default": ""
- },
- "tickDecimals": {
- "title": "The number of decimals to display",
- "type": "number",
- "default": 0
- },
- "tickSize": {
- "title": "Step size between ticks",
- "type": "number",
- "default": null
- }
- }
- };
-
- schema["schema"]["required"] = [];
- schema["form"] = ["stack"];
- if (chartType === 'graph') {
- schema["form"].push("smoothLines");
- }
- if (chartType === 'bar') {
- schema["form"].push("defaultBarWidth");
- schema["form"].push({
- "key": "barAlignment",
- "type": "rc-select",
- "multiple": false,
- "items": [
- {
- "value": "left",
- "label": "Left"
- },
- {
- "value": "right",
- "label": "Right"
- },
- {
- "value": "center",
- "label": "Center"
- }
- ]
- });
- }
- if (chartType === 'graph' || chartType === 'bar') {
- schema["form"].push("thresholdsLineWidth");
- }
- schema["form"].push("shadowSize");
- schema["form"].push({
- "key": "fontColor",
- "type": "color"
- });
- schema["form"].push("fontSize");
- schema["form"].push("tooltipIndividual");
- schema["form"].push("tooltipCumulative");
- schema["form"].push({
- "key": "tooltipValueFormatter",
- "type": "javascript"
- });
- schema["form"].push("hideZeros");
- schema["form"].push({
- "key": "grid",
- "items": [
- {
- "key": "grid.color",
- "type": "color"
- },
- {
- "key": "grid.backgroundColor",
- "type": "color"
- },
- {
- "key": "grid.tickColor",
- "type": "color"
- },
- "grid.outlineWidth",
- "grid.verticalLines",
- "grid.horizontalLines"
- ]
- });
- schema["form"].push({
- "key": "xaxis",
- "items": [
- "xaxis.showLabels",
- "xaxis.title",
- {
- "key": "xaxis.color",
- "type": "color"
- }
- ]
- });
- schema["form"].push({
- "key": "yaxis",
- "items": [
- "yaxis.min",
- "yaxis.max",
- "yaxis.tickDecimals",
- "yaxis.tickSize",
- "yaxis.showLabels",
- "yaxis.title",
- {
- "key": "yaxis.color",
- "type": "color"
- },
- {
- "key": "yaxis.ticksFormatter",
- "type": "javascript"
- }
- ]
- });
- if (chartType === 'graph' || chartType === 'bar') {
- schema.groupInfoes = [{
- "formIndex":0,
- "GroupTitle":"Common Settings"
- }];
- schema.form = [schema.form];
- angular.merge(schema.schema.properties, chartSettingsSchemaForComparison.schema.properties);
- schema.schema.required = schema.schema.required.concat(chartSettingsSchemaForComparison.schema.required);
- schema.form.push(chartSettingsSchemaForComparison.form);
- schema.groupInfoes.push({
- "formIndex":schema.groupInfoes.length,
- "GroupTitle":"Comparison Settings"
- });
- }
-
- return schema;
- }
-
- static get pieDatakeySettingsSchema() {
- return {
- "schema": {
- "type": "object",
- "title": "DataKeySettings",
- "properties": {
- "hideDataByDefault": {
- "title": "Data is hidden by default",
- "type": "boolean",
- "default": false
- },
- "disableDataHiding": {
- "title": "Disable data hiding",
- "type": "boolean",
- "default": false
- },
- "removeFromLegend": {
- "title": "Remove datakey from legend",
- "type": "boolean",
- "default": false
- }
- },
- "required": []
- },
- "form": [
- "hideDataByDefault",
- "disableDataHiding",
- "removeFromLegend"
- ]
- };
- }
-
- static datakeySettingsSchema(defaultShowLines, chartType) {
-
- var schema = {
- "schema": {
- "type": "object",
- "title": "DataKeySettings",
- "properties": {
- "excludeFromStacking": {
- "title": "Exclude from stacking(available in \"Stacking\" mode)",
- "type": "boolean",
- "default": false
- },
- "hideDataByDefault": {
- "title": "Data is hidden by default",
- "type": "boolean",
- "default": false
- },
- "disableDataHiding": {
- "title": "Disable data hiding",
- "type": "boolean",
- "default": false
- },
- "removeFromLegend": {
- "title": "Remove datakey from legend",
- "type": "boolean",
- "default": false
- },
- "showLines": {
- "title": "Show lines",
- "type": "boolean",
- "default": defaultShowLines
- },
- "fillLines": {
- "title": "Fill lines",
- "type": "boolean",
- "default": false
- },
- "showPoints": {
- "title": "Show points",
- "type": "boolean",
- "default": false
- },
- "showPointShape": {
- "title": "Select point shape:",
- "type": "string",
- "default": "circle"
- },
- "pointShapeFormatter": {
- "title": "Point shape format function, f(ctx, x, y, radius, shadow)",
- "type": "string",
- "default": "var size = radius * Math.sqrt(Math.PI) / 2;\n" +
- "ctx.moveTo(x - size, y - size);\n" +
- "ctx.lineTo(x + size, y + size);\n" +
- "ctx.moveTo(x - size, y + size);\n" +
- "ctx.lineTo(x + size, y - size);"
- },
- "showPointsLineWidth": {
- "title": "Line width of points",
- "type": "number",
- "default": 5
- },
- "showPointsRadius": {
- "title": "Radius of points",
- "type": "number",
- "default": 3
- },
- "tooltipValueFormatter": {
- "title": "Tooltip value format function, f(value)",
- "type": "string",
- "default": ""
- },
- "showSeparateAxis": {
- "title": "Show separate axis",
- "type": "boolean",
- "default": false
- },
- "axisMin": {
- "title": "Minimum value on the axis scale",
- "type": "number",
- "default": null
- },
- "axisMax": {
- "title": "Maximum value on the axis scale",
- "type": "number",
- "default": null
- },
- "axisTitle": {
- "title": "Axis title",
- "type": "string",
- "default": ""
- },
- "axisTickDecimals": {
- "title": "Axis tick number of digits after floating point",
- "type": "number",
- "default": null
- },
- "axisTickSize": {
- "title": "Axis step size between ticks",
- "type": "number",
- "default": null
- },
- "axisPosition": {
- "title": "Axis position",
- "type": "string",
- "default": "left"
- },
- "axisTicksFormatter": {
- "title": "Ticks formatter function, f(value)",
- "type": "string",
- "default": ""
- }
- },
- "required": ["showLines", "fillLines", "showPoints"]
- },
- "form": [
- "hideDataByDefault",
- "disableDataHiding",
- "removeFromLegend",
- "excludeFromStacking",
- "showLines",
- "fillLines",
- "showPoints",
- {
- "key": "showPointShape",
- "type": "rc-select",
- "multiple": false,
- "items": [
- {
- "value": "circle",
- "label": "Circle"
- },
- {
- "value": "cross",
- "label": "Cross"
- },
- {
- "value": "diamond",
- "label": "Diamond"
- },
- {
- "value": "square",
- "label": "Square"
- },
- {
- "value": "triangle",
- "label": "Triangle"
- },
- {
- "value": "custom",
- "label": "Custom function"
- }
- ]
- },
- {
- "key": "pointShapeFormatter",
- "type": "javascript"
- },
- "showPointsLineWidth",
- "showPointsRadius",
- {
- "key": "tooltipValueFormatter",
- "type": "javascript"
- },
- "showSeparateAxis",
- "axisMin",
- "axisMax",
- "axisTitle",
- "axisTickDecimals",
- "axisTickSize",
- {
- "key": "axisPosition",
- "type": "rc-select",
- "multiple": false,
- "items": [
- {
- "value": "left",
- "label": "Left"
- },
- {
- "value": "right",
- "label": "Right"
- }
- ]
- },
- {
- "key": "axisTicksFormatter",
- "type": "javascript"
- }
- ]
- };
-
- var properties = schema["schema"]["properties"];
-
- if (chartType === 'graph' || chartType === 'bar') {
- properties["thresholds"] = {
- "title": "Thresholds",
- "type": "array",
- "items": {
- "title": "Threshold",
- "type": "object",
- "properties": {
- "thresholdValueSource": {
- "title": "Threshold value source",
- "type": "string",
- "default": "predefinedValue"
- },
- "thresholdEntityAlias": {
- "title": "Thresholds source entity alias",
- "type": "string"
- },
- "thresholdAttribute": {
- "title": "Threshold source entity attribute",
- "type": "string"
- },
- "thresholdValue": {
- "title": "Threshold value (if predefined value is selected)",
- "type": "number"
- },
- "lineWidth": {
- "title": "Line width",
- "type": "number"
- },
- "color": {
- "title": "Color",
- "type": "string"
- }
- }
- },
- "required": []
- };
- schema["form"].push({
- "key": "thresholds",
- "items": [
- {
- "key": "thresholds[].thresholdValueSource",
- "type": "rc-select",
- "multiple": false,
- "items": [
- {
- "value": "predefinedValue",
- "label": "Predefined value (Default)"
- },
- {
- "value": "entityAttribute",
- "label": "Value taken from entity attribute"
- }
- ]
- },
- "thresholds[].thresholdValue",
- "thresholds[].thresholdEntityAlias",
- "thresholds[].thresholdAttribute",
- {
- "key": "thresholds[].color",
- "type": "color"
- },
- "thresholds[].lineWidth"
- ]
- });
-
- properties["comparisonSettings"] = {
- "title": "Comparison Settings",
- "type": "object",
- "properties": {
- "showValuesForComparison": {
- "title": "Show historical values for comparison",
- "type": "boolean",
- "default": true
- },
- "comparisonValuesLabel": {
- "title": "Historical values label",
- "type": "string",
- "default": ""
- },
- "color": {
- "title": "Color",
- "type": "string",
- "default": ""
- }
- },
- "required": ["showValuesForComparison"]
- };
- schema["form"].push({
- "key": "comparisonSettings",
- "items": [
- "comparisonSettings.showValuesForComparison",
- "comparisonSettings.comparisonValuesLabel",
- {
- "key": "comparisonSettings.color",
- "type": "color"
- }
- ]
- });
-
- }
-
- return schema;
- }
-
- enableMouseEvents() {
- this.$element.css('pointer-events','');
- this.$element.addClass('mouse-events');
- this.options.selection = { mode : 'x' };
-
- var tbFlot = this;
-
- if (!this.flotHoverHandler) {
- this.flotHoverHandler = function (event, pos, item) {
- if (!tbFlot.ctx.plot) {
- return;
- }
- if (!tbFlot.ctx.tooltipIndividual || item) {
-
- var multipleModeTooltip = !tbFlot.ctx.tooltipIndividual;
-
- if (multipleModeTooltip) {
- tbFlot.ctx.plot.unhighlight();
- }
-
- var pageX = pos.pageX;
- var pageY = pos.pageY;
-
- var tooltipHtml;
-
- if (tbFlot.chartType === 'pie') {
- tooltipHtml = tbFlot.ctx.tooltipFormatter(item);
- } else {
- var hoverInfo = tbFlot.getHoverInfo(tbFlot.ctx.plot.getData(), pos);
- if (angular.isNumber(hoverInfo[0].time) || (hoverInfo[1] && angular.isNumber(hoverInfo[1].time))) {
- hoverInfo[0].seriesHover.sort(function (a, b) {
- return b.value - a.value;
- });
- if (hoverInfo[1] && hoverInfo[1].seriesHover.length) {
- hoverInfo[1].seriesHover.sort(function (a, b) {
- return b.value - a.value;
- });
- }
- tooltipHtml = tbFlot.ctx.tooltipFormatter(hoverInfo, item ? item.seriesIndex : -1);
- }
- }
-
- if (tooltipHtml) {
- tbFlot.ctx.tooltip.html(tooltipHtml)
- .css({top: 0, left: 0})
- .fadeIn(200);
-
- var windowWidth = $( window ).width(); //eslint-disable-line
- var windowHeight = $( window ).height(); //eslint-disable-line
- var tooltipWidth = tbFlot.ctx.tooltip.width();
- var tooltipHeight = tbFlot.ctx.tooltip.height();
- var left = pageX+5;
- var top = pageY+5;
- if (windowWidth - pageX < tooltipWidth + 50) {
- left = pageX - tooltipWidth - 10;
- }
- if (windowHeight - pageY < tooltipHeight + 20) {
- top = pageY - tooltipHeight - 10;
- }
- tbFlot.ctx.tooltip.css({
- top: top,
- left: left
- });
-
- if (multipleModeTooltip) {
- for (var j = 0; j < hoverInfo.length; j++) {
- for (var i = 0; i < hoverInfo[j].seriesHover.length; i++) {
- var seriesHoverInfo = hoverInfo[j].seriesHover[i];
- tbFlot.ctx.plot.highlight(seriesHoverInfo.index, seriesHoverInfo.hoverIndex);
- }
- }
- }
- }
-
- } else {
- tbFlot.ctx.tooltip.stop(true);
- tbFlot.ctx.tooltip.hide();
- tbFlot.ctx.plot.unhighlight();
- }
- };
- this.$element.bind('plothover', this.flotHoverHandler);
- }
-
- if (!this.flotSelectHandler) {
- this.flotSelectHandler = function (event, ranges) {
- if (!tbFlot.ctx.plot) {
- return;
- }
- tbFlot.ctx.plot.clearSelection();
- tbFlot.subscription.onUpdateTimewindow(ranges.xaxis.from, ranges.xaxis.to);
- };
- this.$element.bind('plotselected', this.flotSelectHandler);
- }
- if (!this.dblclickHandler) {
- this.dblclickHandler = function () {
- tbFlot.subscription.onResetTimewindow();
- };
- this.$element.bind('dblclick', this.dblclickHandler);
- }
- if (!this.mousedownHandler) {
- this.mousedownHandler = function () {
- tbFlot.isMouseInteraction = true;
- };
- this.$element.bind('mousedown', this.mousedownHandler);
- }
- if (!this.mouseupHandler) {
- this.mouseupHandler = function () {
- tbFlot.isMouseInteraction = false;
- };
- this.$element.bind('mouseup', this.mouseupHandler);
- }
- if (!this.mouseleaveHandler) {
- this.mouseleaveHandler = function () {
- if (!tbFlot.ctx.plot) {
- return;
- }
- tbFlot.ctx.tooltip.stop(true);
- tbFlot.ctx.tooltip.hide();
- tbFlot.ctx.plot.unhighlight();
- tbFlot.isMouseInteraction = false;
- };
- this.$element.bind('mouseleave', this.mouseleaveHandler);
- }
-
- if (!this.flotClickHandler) {
- this.flotClickHandler = function (event, pos, item) {
- if (!tbFlot.ctx.plot) {
- return;
- }
- tbFlot.onPieSliceClick(event, item);
- };
- this.$element.bind('plotclick', this.flotClickHandler);
- }
-
- }
-
- disableMouseEvents() {
- this.$element.css('pointer-events','none');
- this.$element.removeClass('mouse-events');
- this.options.selection = { mode : null };
-
- if (this.flotHoverHandler) {
- this.$element.unbind('plothover', this.flotHoverHandler);
- this.flotHoverHandler = null;
- }
-
- if (this.flotSelectHandler) {
- this.$element.unbind('plotselected', this.flotSelectHandler);
- this.flotSelectHandler = null;
- }
- if (this.dblclickHandler) {
- this.$element.unbind('dblclick', this.dblclickHandler);
- this.dblclickHandler = null;
- }
- if (this.mousedownHandler) {
- this.$element.unbind('mousedown', this.mousedownHandler);
- this.mousedownHandler = null;
- }
- if (this.mouseupHandler) {
- this.$element.unbind('mouseup', this.mouseupHandler);
- this.mouseupHandler = null;
- }
- if (this.mouseleaveHandler) {
- this.$element.unbind('mouseleave', this.mouseleaveHandler);
- this.mouseleaveHandler = null;
- }
- if (this.flotClickHandler) {
- this.$element.unbind('plotclick', this.flotClickHandler);
- this.flotClickHandler = null;
- }
- }
-
-
- findHoverIndexFromData (posX, series) {
- var lower = 0;
- var upper = series.data.length - 1;
- var middle;
- var index = null;
- while (index === null) {
- if (lower > upper) {
- return Math.max(upper, 0);
- }
- middle = Math.floor((lower + upper) / 2);
- if (series.data[middle][0] === posX) {
- return middle;
- } else if (series.data[middle][0] < posX) {
- lower = middle + 1;
- } else {
- upper = middle - 1;
- }
- }
- }
-
- findHoverIndexFromDataPoints (posX, series, last) {
- var ps = series.datapoints.pointsize;
- var initial = last*ps;
- var len = series.datapoints.points.length;
- for (var j = initial; j < len; j += ps) {
- if ((!series.lines.steps && series.datapoints.points[initial] != null && series.datapoints.points[j] == null)
- || series.datapoints.points[j] > posX) {
- return Math.max(j - ps, 0)/ps;
- }
- }
- return j/ps - 1;
- }
-
-
- getHoverInfo (seriesList, pos) {
- var i, series, value, hoverIndex, hoverDistance, pointTime, minDistance, minTime, hoverData;
- var last_value = 0;
- var results = [{
- seriesHover: []
- }];
- if (this.ctx.settings.comparisonEnabled) {
- results.push({
- seriesHover: []
- });
- var minDistanceHistorical, minTimeHistorical;
- }
- for (i = 0; i < seriesList.length; i++) {
- series = seriesList[i];
- var posx;
- if (series.datasource.isAdditional) {
- posx = pos.x2;
- } else {
- posx = pos.x;
- }
- hoverIndex = this.findHoverIndexFromData(posx, series);
- if (series.data[hoverIndex] && series.data[hoverIndex][0]) {
- hoverDistance = posx - series.data[hoverIndex][0];
- pointTime = series.data[hoverIndex][0];
-
- if (series.datasource.isAdditional) {
- if (!minDistanceHistorical
- || (hoverDistance >= 0 && (hoverDistance < minDistanceHistorical || minDistanceHistorical < 0))
- || (hoverDistance < 0 && hoverDistance > minDistanceHistorical)) {
- minDistanceHistorical = hoverDistance;
- minTimeHistorical = pointTime;
- }
- } else if (!minDistance
- || (hoverDistance >= 0 && (hoverDistance < minDistance || minDistance < 0))
- || (hoverDistance < 0 && hoverDistance > minDistance)) {
- minDistance = hoverDistance;
- minTime = pointTime;
- }
- if (series.stack) {
- if (this.ctx.tooltipIndividual || !this.ctx.tooltipCumulative) {
- value = series.data[hoverIndex][1];
- } else {
- last_value += series.data[hoverIndex][1];
- value = last_value;
- }
- } else {
- value = series.data[hoverIndex][1];
- }
-
- if (series.stack || (series.curvedLines && series.curvedLines.apply)) {
- hoverIndex = this.findHoverIndexFromDataPoints(posx, series, hoverIndex);
- }
- if (!this.ctx.hideZeros || value) {
- hoverData = {
- value: value,
- hoverIndex: hoverIndex,
- color: series.dataKey.color,
- label: series.dataKey.label,
- units: series.dataKey.units,
- decimals: series.dataKey.decimals,
- tooltipValueFormatFunction: series.dataKey.tooltipValueFormatFunction,
- time: pointTime,
- distance: hoverDistance,
- index: i
- };
- if (series.datasource.isAdditional) {
- results[1].seriesHover.push(hoverData);
- } else {
- results[0].seriesHover.push(hoverData);
- }
- }
- }
- }
- if (results[1] && results[1].seriesHover.length) {
- results[1].time = minTimeHistorical;
- }
- results[0].time = minTime;
- return results;
- }
-
- pieDataRendered() {
- for (var i = 0; i < this.ctx.pieTargetData.length; i++) {
- var value = this.ctx.pieTargetData[i] ? this.ctx.pieTargetData[i] : 0;
- this.ctx.pieRenderedData[i] = value;
- if (!this.pieData[i].data[0]) {
- this.pieData[i].data[0] = [0,0];
- }
- this.pieData[i].data[0][1] = value;
- }
- }
-
- nextPieDataAnimation(start) {
- if (start) {
- this.finishPieDataAnimation();
- this.ctx.pieAnimationStartTime = this.ctx.pieAnimationLastTime = Date.now();
- for (var i = 0; i < this.subscription.data.length; i++) {
- this.ctx.pieTargetData[i] = (this.subscription.data[i].data && this.subscription.data[i].data[0])
- ? this.subscription.data[i].data[0][1] : 0;
- }
- }
- if (this.ctx.pieAnimationCaf) {
- this.ctx.pieAnimationCaf();
- this.ctx.pieAnimationCaf = null;
- }
- var self = this;
- this.ctx.pieAnimationCaf = this.ctx.$scope.tbRaf(
- function () {
- self.onPieDataAnimation();
- }
- );
- }
-
- onPieDataAnimation() {
- var time = Date.now();
- var elapsed = time - this.ctx.pieAnimationLastTime;//this.ctx.pieAnimationStartTime;
- var progress = (time - this.ctx.pieAnimationStartTime) / this.ctx.pieDataAnimationDuration;
- if (progress >= 1) {
- this.finishPieDataAnimation();
- } else {
- if (elapsed >= 40) {
- for (var i = 0; i < this.ctx.pieTargetData.length; i++) {
- var prevValue = this.ctx.pieRenderedData[i];
- var targetValue = this.ctx.pieTargetData[i];
- var value = prevValue + (targetValue - prevValue) * progress;
- if (!this.pieData[i].data[0]) {
- this.pieData[i].data[0] = [0,0];
- }
- this.pieData[i].data[0][1] = value;
- }
- this.ctx.plot.setData(this.pieData);
- this.ctx.plot.draw();
- this.ctx.pieAnimationLastTime = time;
- }
- this.nextPieDataAnimation(false);
- }
- }
-
- finishPieDataAnimation() {
- this.pieDataRendered();
- this.ctx.plot.setData(this.pieData);
- this.ctx.plot.draw();
- }
-
- onPieSliceClick($event, item) {
- var descriptors = this.ctx.actionsApi.getActionDescriptors('sliceClick');
- if ($event && descriptors.length) {
- $event.stopPropagation();
- var entityInfo = this.ctx.actionsApi.getActiveEntityInfo();
- var entityId = entityInfo ? entityInfo.entityId : null;
- var entityName = entityInfo ? entityInfo.entityName : null;
- var entityLabel = entityInfo && entityInfo.entityLabel ? entityInfo.entityLabel : null;
- this.ctx.actionsApi.handleWidgetAction($event, descriptors[0], entityId, entityName, item, entityLabel);
- }
- }
-}
-
-const chartSettingsSchemaForComparison = {
- "schema": {
- "title": "Comparison Settings",
- "type": "object",
- "properties": {
- "comparisonEnabled": {
- "title": "Enable comparison",
- "type": "boolean",
- "default": false
- },
- "timeForComparison": {
- "title": "Time to show historical data",
- "type": "string",
- "default": "months"
- },
- "xaxisSecond": {
- "title": "Second X axis",
- "type": "object",
- "properties": {
- "axisPosition": {
- "title": "Axis position",
- "type": "string",
- "default": "top"
- },
- "showLabels": {
- "title": "Show labels",
- "type": "boolean",
- "default": true
- },
- "title": {
- "title": "Axis title",
- "type": "string",
- "default": null
- }
- }
- }
- },
- "required": []
- },
- "form": [
- "comparisonEnabled",
- {
- "key": "timeForComparison",
- "type": "rc-select",
- "multiple": false,
- "items": [
- {
- "value": "days",
- "label": "Day ago"
- },
- {
- "value": "weeks",
- "label": "Week ago"
- },
- {
- "value": "months",
- "label": "Month ago (default)"
- },
- {
- "value": "years",
- "label": "Year ago"
- }
- ]
- },
- {
- "key": "xaxisSecond",
- "items": [
- {
- "key": "xaxisSecond.axisPosition",
- "type": "rc-select",
- "multiple": false,
- "items": [
- {
- "value": "top",
- "label": "Top (default)"
- },
- {
- "value": "bottom",
- "label": "Bottom"
- }
- ]
- },
- "xaxisSecond.showLabels",
- "xaxisSecond.title",
- ]
- }
- ]
-};
-
-/* eslint-enable angular/angularelement */
diff --git a/ui/src/app/widget/lib/google-map.js b/ui/src/app/widget/lib/google-map.js
deleted file mode 100644
index dd39efb048..0000000000
--- a/ui/src/app/widget/lib/google-map.js
+++ /dev/null
@@ -1,489 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-var gmGlobals = {
- loadingGmId: null,
- gmApiKeys: {}
-}
-
-export default class TbGoogleMap {
- constructor($containerElement, utils, initCallback, defaultZoomLevel, dontFitMapBounds, disableScrollZooming, minZoomLevel, gmApiKey, gmDefaultMapType, defaultCenterPosition, markerClusteringSetting) {
-
- var tbMap = this;
- this.utils = utils;
- this.defaultZoomLevel = defaultZoomLevel;
- this.dontFitMapBounds = dontFitMapBounds;
- this.minZoomLevel = minZoomLevel;
- this.tooltips = [];
- this.defaultMapType = gmDefaultMapType;
- this.defaultCenterPosition = defaultCenterPosition;
- this.isMarketCluster = markerClusteringSetting && markerClusteringSetting.isMarketCluster;
-
- function clearGlobalId() {
- if (gmGlobals.loadingGmId && gmGlobals.loadingGmId === tbMap.mapId) {
- gmGlobals.loadingGmId = null;
- }
- }
-
- function displayError(message) {
- $containerElement.html( // eslint-disable-line angular/angularelement
- ""+ message + "
"
- );
- }
-
- function initGoogleMap() {
- tbMap.map = new google.maps.Map($containerElement[0], { // eslint-disable-line no-undef
- scrollwheel: !disableScrollZooming,
- mapTypeId: getGoogleMapTypeId(tbMap.defaultMapType),
- zoom: tbMap.defaultZoomLevel || 8,
- center: new google.maps.LatLng(tbMap.defaultCenterPosition[0], tbMap.defaultCenterPosition[1]) // eslint-disable-line no-undef
- });
- if (tbMap.isMarketCluster){
- tbMap.markersCluster = new MarkerClusterer(tbMap.map, [], // eslint-disable-line no-undef
- angular.merge({imagePath: 'https://developers.google.com/maps/documentation/javascript/examples/markerclusterer/m'}, markerClusteringSetting));
- }
- if (initCallback) {
- setTimeout(initCallback, 0);// eslint-disable-line
- }
-
- }
-
- /* eslint-disable no-undef */
-
- function getGoogleMapTypeId(mapType) {
- var mapTypeId = google.maps.MapTypeId.ROADMAP;
- if (mapType) {
- if (mapType === 'hybrid') {
- mapTypeId = google.maps.MapTypeId.HYBRID;
- } else if (mapType === 'satellite') {
- mapTypeId = google.maps.MapTypeId.SATELLITE;
- } else if (mapType === 'terrain') {
- mapTypeId = google.maps.MapTypeId.TERRAIN;
- }
- }
- return mapTypeId;
- }
-
- /* eslint-enable no-undef */
-
- this.mapId = '' + Math.random().toString(36).substr(2, 9);
- this.apiKey = gmApiKey || '';
-
- window.gm_authFailure = function() { // eslint-disable-line no-undef, angular/window-service
- if (gmGlobals.loadingGmId && gmGlobals.loadingGmId === tbMap.mapId) {
- gmGlobals.loadingGmId = null;
- gmGlobals.gmApiKeys[tbMap.apiKey].error = 'Unable to authentificate for Google Map API.Please check your API key.';
- displayError(gmGlobals.gmApiKeys[tbMap.apiKey].error);
- }
- };
-
- this.initMapFunctionName = 'initGoogleMap_' + this.mapId;
-
- window[this.initMapFunctionName] = function() { // eslint-disable-line no-undef, angular/window-service
- lazyLoad.load([ // eslint-disable-line no-undef
- { type: 'js', path: 'https://unpkg.com/@google/markerwithlabel@1.2.3/src/markerwithlabel.js' },
- { type: 'js', path: 'https://unpkg.com/@google/markerclustererplus@4.0.1/dist/markerclustererplus.min.js' }
- ]).then(
- function success() {
- gmGlobals.gmApiKeys[tbMap.apiKey].loaded = true;
- initGoogleMap();
- for (var p = 0; p < gmGlobals.gmApiKeys[tbMap.apiKey].pendingInits.length; p++) {
- var pendingInit = gmGlobals.gmApiKeys[tbMap.apiKey].pendingInits[p];
- pendingInit();
- }
- gmGlobals.gmApiKeys[tbMap.apiKey].pendingInits = [];
- },
- function fail(e) {
- clearGlobalId();
- gmGlobals.gmApiKeys[tbMap.apiKey].error = 'Google map api load failed!'+e;
- displayError(gmGlobals.gmApiKeys[tbMap.apiKey].error);
- }
- );
-
- };
- /* eslint-enable no-undef */
-
- if (this.apiKey && this.apiKey.length > 0) {
- if (gmGlobals.gmApiKeys[this.apiKey]) {
- if (gmGlobals.gmApiKeys[this.apiKey].error) {
- displayError(gmGlobals.gmApiKeys[this.apiKey].error);
- } else if (gmGlobals.gmApiKeys[this.apiKey].loaded) {
- initGoogleMap();
- } else {
- gmGlobals.gmApiKeys[this.apiKey].pendingInits.push(initGoogleMap);
- }
- } else {
- gmGlobals.gmApiKeys[this.apiKey] = {
- loaded: false,
- pendingInits: []
- };
- var googleMapScriptRes = 'https://maps.googleapis.com/maps/api/js?key='+this.apiKey+'&callback='+this.initMapFunctionName;
-
- gmGlobals.loadingGmId = this.mapId;
- lazyLoad.load({ type: 'js', path: googleMapScriptRes }).then( // eslint-disable-line no-undef
- function success() {
- setTimeout(clearGlobalId, 2000); // eslint-disable-line no-undef, angular/timeout-service
- },
- function fail(e) {
- clearGlobalId();
- gmGlobals.gmApiKeys[tbMap.apiKey].error = 'Google map api load failed!'+e;
- displayError(gmGlobals.gmApiKeys[tbMap.apiKey].error);
- }
- );
- }
- } else {
- displayError('No Google Map Api Key provided!');
- }
- }
-
- inited() {
- return angular.isDefined(this.map);
- }
-
- getContainer() {
- return this.isMarketCluster ? this.markersCluster : this.map;
- }
-
- /* eslint-disable no-undef */
- updateMarkerLabel(marker, settings) {
- marker.set('labelContent', ''+settings.labelText+'
');
- }
- /* eslint-enable no-undef */
-
- /* eslint-disable no-undef */
- updateMarkerColor(marker, color) {
- this.createDefaultMarkerIcon(marker, color, (iconInfo) => {
- marker.setIcon(iconInfo.icon);
- });
- }
- /* eslint-enable no-undef */
-
- /* eslint-disable no-undef */
- updateMarkerIcon(marker, settings) {
- this.createMarkerIcon(marker, settings, (iconInfo) => {
- marker.setIcon(iconInfo.icon);
- if (settings.showLabel) {
- marker.set('labelAnchor', new google.maps.Point(100, iconInfo.size[1] + 20));
- }
- });
- }
- /* eslint-disable no-undef */
-
- /* eslint-disable no-undef */
- createMarkerIcon(marker, settings, onMarkerIconReady) {
- var currentImage = settings.currentImage;
- var gMap = this;
- if (currentImage && currentImage.url) {
- this.utils.loadImageAspect(currentImage.url).then(
- (aspect) => {
- if (aspect) {
- var width;
- var height;
- if (aspect > 1) {
- width = currentImage.size;
- height = currentImage.size / aspect;
- } else {
- width = currentImage.size * aspect;
- height = currentImage.size;
- }
- var icon = {
- url: currentImage.url,
- scaledSize : new google.maps.Size(width, height)
- };
- var iconInfo = {
- size: [width, height],
- icon: icon
- };
- onMarkerIconReady(iconInfo);
- } else {
- gMap.createDefaultMarkerIcon(marker, settings.color, onMarkerIconReady);
- }
- }
- );
- } else {
- this.createDefaultMarkerIcon(marker, settings.color, onMarkerIconReady);
- }
- }
- /* eslint-enable no-undef */
-
- /* eslint-disable no-undef */
- createDefaultMarkerIcon(marker, color, onMarkerIconReady) {
- var pinColor = color.substr(1);
- var icon = new google.maps.MarkerImage("https://chart.apis.google.com/chart?chst=d_map_pin_letter_withshadow&chld=%E2%80%A2|" + pinColor,
- new google.maps.Size(40, 37),
- new google.maps.Point(0,0),
- new google.maps.Point(10, 37));
- var iconInfo = {
- size: [40, 37],
- icon: icon
- };
- onMarkerIconReady(iconInfo);
- }
- /* eslint-enable no-undef */
-
- /* eslint-disable no-undef */
- createMarker(location, dsIndex, settings, onClickListener, markerArgs, onDragendListener) {
- var marker;
- if (settings.showLabel) {
- marker = new MarkerWithLabel({
- position: location,
- labelContent: ''+settings.labelText+'
',
- labelClass: "tb-labels",
- draggable: settings.drraggable,
- });
- } else {
- marker = new google.maps.Marker({
- position: location,
- draggable: settings.drraggable,
- });
- }
- var gMap = this;
- this.createMarkerIcon(marker, settings, (iconInfo) => {
- marker.setIcon(iconInfo.icon);
- if (settings.showLabel) {
- marker.set('labelAnchor', new google.maps.Point(100, iconInfo.size[1] + 20));
- }
- if(gMap.isMarketCluster) {
- gMap.getContainer().addMarker(marker);
- } else {
- marker.setMap(gMap.getContainer());
- }
- });
-
- if (settings.displayTooltip) {
- this.createTooltip(marker, dsIndex, settings, markerArgs);
- }
-
- if (onClickListener) {
- marker.addListener('click', onClickListener);
- }
-
- if (onDragendListener) {
- marker.addListener('dragend', onDragendListener);
- }
-
- return marker;
- }
-
- removeMarker(marker) {
- marker.setMap(null);
- }
-
- /* eslint-enable no-undef */
-
- /* eslint-disable no-undef */
- createTooltip(marker, dsIndex, settings, markerArgs) {
- var popup = new google.maps.InfoWindow({
- content: ''
- });
- var map = this;
- if (settings.displayTooltipAction == 'hover') {
- marker.addListener('mouseover', function () {
- popup.open(this.map, marker);
- });
- marker.addListener('mouseout', function () {
- popup.close();
- });
- } else {
- marker.addListener('click', function() {
- if (settings.autocloseTooltip) {
- map.tooltips.forEach((tooltip) => {
- tooltip.popup.close();
- });
- }
- popup.open(this.map, marker);
- });
- }
- this.tooltips.push( {
- markerArgs: markerArgs,
- popup: popup,
- locationSettings: settings,
- dsIndex: dsIndex
- });
- }
- /* eslint-enable no-undef */
-
- /* eslint-disable no-undef */
- updatePolylineColor(polyline, settings, color) {
- var options = {
- path: polyline.getPath(),
- strokeColor: color,
- strokeOpacity: settings.strokeOpacity,
- strokeWeight: settings.strokeWeight,
- map: this.map
- };
- polyline.setOptions(options);
- }
- /* eslint-enable no-undef */
-
- /* eslint-disable no-undef */
- createPolyline(locations, settings) {
- var polyline = new google.maps.Polyline({
- path: locations,
- strokeColor: settings.color,
- strokeOpacity: settings.strokeOpacity,
- strokeWeight: settings.strokeWeight,
- map: this.map
- });
-
- return polyline;
- }
- /* eslint-enable no-undef */
-
- removePolyline(polyline) {
- polyline.setMap(null);
- }
-
-
- createPolygon(latLangs, settings, location, onClickListener, markerArgs) {
- let polygon = new google.maps.Polygon({ // eslint-disable-line no-undef
- map: this.map,
- paths: latLangs,
- strokeColor: settings.polygonStrokeColor,
- strokeOpacity: settings.polygonStrokeColor,
- fillColor: settings.polygonColor,
- fillOpacity: settings.polygonOpacity,
- strokeWeight: settings.polygonStrokeWeight
- });
-
- //initialize-tooltip
-
- let popup = new google.maps.InfoWindow({ // eslint-disable-line no-undef
- content: ''
- });
- if (!this.tooltips) this.tooltips = [];
- this.tooltips.push({
- markerArgs: markerArgs,
- popup: popup,
- locationSettings: settings,
- dsIndex: location.dsIndex
- });
- let map = this;
- if (onClickListener) {
- google.maps.event.addListener(polygon, 'click', function (event) { // eslint-disable-line no-undef
- if (settings.displayTooltip ) {
- if (settings.autocloseTooltip) {
- map.tooltips.forEach((tooltip) => {
- tooltip.popup.close();
- });
- }
- if (!polygon.anchor) {
- polygon.anchor = new google.maps.MVCObject(); // eslint-disable-line no-undef
- }
- polygon.anchor.set("position", event.latLng);
- popup.open(this.map, polygon.anchor);
-
- }
- onClickListener();
- });
- }
- return polygon;
- }
- /* eslint-disable no-undef */
-
- removePolygon (polygon) {
- polygon.setMap(null);
- }
-
- /* eslint-disable no-undef,no-unused-vars */
- updatePolygonColor (polygon, settings, color) {
- let options = {
- paths: polygon.getPaths(),
- map: this.map,
- strokeColor: color,
- fillColor: color,
- strokeWeight: settings.polygonStrokeWeight
- };
- polygon.setOptions(options);
- }
- /* eslint-disable no-undef ,no-unused-vars*/
-
-
- getPolygonLatLngs(polygon) {
- return polygon.getPaths().getArray();
- }
-
- setPolygonLatLngs(polygon, latLngs) {
- polygon.setPaths(latLngs);
- }
-
-
- /* eslint-disable no-undef */
- fitBounds(bounds, useDefaultZoom) {
- if ((this.dontFitMapBounds || useDefaultZoom) && this.defaultZoomLevel) {
- this.map.setZoom(this.defaultZoomLevel);
- this.map.setCenter(bounds.getCenter());
- } else {
- var tbMap = this;
- google.maps.event.addListenerOnce(this.map, 'bounds_changed', function() { // eslint-disable-line no-undef
- if (!tbMap.defaultZoomLevel && tbMap.map.getZoom() > tbMap.minZoomLevel) {
- tbMap.map.setZoom(tbMap.minZoomLevel);
- }
- });
- this.map.fitBounds(bounds);
- }
- }
- /* eslint-enable no-undef */
-
- createLatLng(lat, lng) {
- return new google.maps.LatLng(lat, lng); // eslint-disable-line no-undef
- }
-
- extendBoundsWithMarker(bounds, marker) {
- bounds.extend(marker.getPosition());
- }
-
- getMarkerPosition(marker) {
- return marker.getPosition();
- }
-
- setMarkerPosition(marker, latLng) {
- marker.setPosition(latLng);
- }
-
- getPolylineLatLngs(polyline) {
- return polyline.getPath().getArray();
- }
-
- setPolylineLatLngs(polyline, latLngs) {
- polyline.setPath(latLngs);
- }
-
- createBounds() {
- return new google.maps.LatLngBounds(); // eslint-disable-line no-undef
- }
-
- extendBounds(bounds, polyline) {
- if (polyline && polyline.getPath()) {
- var locations = polyline.getPath();
- for (var i = 0; i < locations.getLength(); i++) {
- bounds.extend(locations.getAt(i));
- }
- }
- }
-
- invalidateSize() {
- google.maps.event.trigger(this.map, "resize"); // eslint-disable-line no-undef
- }
-
- getTooltips() {
- return this.tooltips;
- }
-
- getCenter() {
- return this.map.getCenter().toJSON();
- }
-
-}
diff --git a/ui/src/app/widget/lib/image-map.js b/ui/src/app/widget/lib/image-map.js
deleted file mode 100644
index 33eb6a5176..0000000000
--- a/ui/src/app/widget/lib/image-map.js
+++ /dev/null
@@ -1,479 +0,0 @@
-/*
- * Copyright © 2016-2020 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 'leaflet/dist/leaflet.css';
-import * as L from 'leaflet';
-
-const maxZoom = 4;
-
-export default class TbImageMap {
-
- constructor(ctx, $containerElement, utils, initCallback, imageUrl, disableScrollZooming, posFunction, imageEntityAlias, imageUrlAttribute) {
-
- this.ctx = ctx;
- this.utils = utils;
- this.tooltips = [];
-
- this.$containerElement = $containerElement;
- this.$containerElement.css('background', '#fff');
-
- this.aspect = 0;
- this.width = 0;
- this.height = 0;
- this.markers = [];
- this.initCallback = initCallback;
- this.disableScrollZooming = disableScrollZooming;
-
- if (angular.isDefined(posFunction) && posFunction.length > 0) {
- try {
- this.posFunction = new Function('origXPos, origYPos', posFunction);
- } catch (e) {
- this.posFunction = null;
- }
- }
- if (!this.posFunction) {
- this.posFunction = (origXPos, origYPos) => {return {x: origXPos, y: origYPos}};
- }
-
- if (!this.subscribeForImageAttribute(imageEntityAlias, imageUrlAttribute)) {
- this.loadImage(imageUrl, initCallback);
- }
- }
-
- subscribeForImageAttribute(imageEntityAlias, imageUrlAttribute) {
- if (!imageEntityAlias || !imageEntityAlias.length ||
- !imageUrlAttribute || !imageUrlAttribute.length) {
- return false;
- }
- var entityAliasId = this.ctx.aliasController.getEntityAliasId(imageEntityAlias);
- if (!entityAliasId) {
- return false;
- }
- var types = this.ctx.$scope.$injector.get('types');
- var datasources = [
- {
- type: types.datasourceType.entity,
- name: imageEntityAlias,
- aliasName: imageEntityAlias,
- entityAliasId: entityAliasId,
- dataKeys: [
- {
- type: types.dataKeyType.attribute,
- name: imageUrlAttribute,
- label: imageUrlAttribute,
- settings: {},
- _hash: Math.random()
- }
- ]
- }
- ];
- var imageMap = this;
- var imageUrlSubscriptionOptions = {
- datasources: datasources,
- useDashboardTimewindow: false,
- type: types.widgetType.latest.value,
- callbacks: {
- onDataUpdated: (subscription, apply) => {imageMap.imageUrlDataUpdated(subscription, apply)}
- }
- };
- this.ctx.subscriptionApi.createSubscription(imageUrlSubscriptionOptions, true).then(
- (subscription) => {
- imageMap.imageUrlSubscription = subscription;
- }
- );
- return true;
- }
-
- imageUrlDataUpdated(subscription, apply) {
- var data = subscription.data;
- if (data.length) {
- var keyData = data[0];
- if (keyData && keyData.data && keyData.data[0]) {
- var attrValue = keyData.data[0][1];
- if (attrValue && attrValue.length) {
- this.loadImage(attrValue, this.aspect > 0 ? null : this.initCallback, true);
- }
- }
- }
- if (apply) {
- this.ctx.$scope.$digest();
- }
- }
-
- loadImage(imageUrl, initCallback, updateImage) {
- if (!imageUrl) {
- imageUrl = 'data:image/svg+xml;base64,PHN2ZyBpZD0ic3ZnMiIgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMTAwIiB3aWR0aD0iMTAwIiB2ZXJzaW9uPSIxLjEiIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgdmlld0JveD0iMCAwIDEwMCAxMDAiPgogPGcgaWQ9ImxheWVyMSIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCAtOTUyLjM2KSI+CiAgPHJlY3QgaWQ9InJlY3Q0Njg0IiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBoZWlnaHQ9Ijk5LjAxIiB3aWR0aD0iOTkuMDEiIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiB5PSI5NTIuODYiIHg9Ii40OTUwNSIgc3Ryb2tlLXdpZHRoPSIuOTkwMTAiIGZpbGw9IiNlZWUiLz4KICA8dGV4dCBpZD0idGV4dDQ2ODYiIHN0eWxlPSJ3b3JkLXNwYWNpbmc6MHB4O2xldHRlci1zcGFjaW5nOjBweDt0ZXh0LWFuY2hvcjptaWRkbGU7dGV4dC1hbGlnbjpjZW50ZXIiIGZvbnQtd2VpZ2h0PSJib2xkIiB4bWw6c3BhY2U9InByZXNlcnZlIiBmb250LXNpemU9IjEwcHgiIGxpbmUtaGVpZ2h0PSIxMjUlIiB5PSI5NzAuNzI4MDkiIHg9IjQ5LjM5NjQ3NyIgZm9udC1mYW1pbHk9IlJvYm90byIgZmlsbD0iIzY2NjY2NiI+PHRzcGFuIGlkPSJ0c3BhbjQ2OTAiIHg9IjUwLjY0NjQ3NyIgeT0iOTcwLjcyODA5Ij5JbWFnZSBiYWNrZ3JvdW5kIDwvdHNwYW4+PHRzcGFuIGlkPSJ0c3BhbjQ2OTIiIHg9IjQ5LjM5NjQ3NyIgeT0iOTgzLjIyODA5Ij5pcyBub3QgY29uZmlndXJlZDwvdHNwYW4+PC90ZXh0PgogIDxyZWN0IGlkPSJyZWN0NDY5NCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgaGVpZ2h0PSIxOS4zNiIgd2lkdGg9IjY5LjM2IiBzdHJva2U9IiMwMDAiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgeT0iOTkyLjY4IiB4PSIxNS4zMiIgc3Ryb2tlLXdpZHRoPSIuNjM5ODYiIGZpbGw9Im5vbmUiLz4KIDwvZz4KPC9zdmc+Cg==';
- }
- this.imageUrl = imageUrl;
- var imageMap = this;
- this.utils.loadImageAspect(imageUrl).then(
- (aspect) => {
- imageMap.aspect = aspect;
- imageMap.onresize(updateImage);
- if (initCallback) {
- setTimeout(initCallback, 0); //eslint-disable-line
- }
- }
- );
- }
-
- onresize(updateImage) {
- if (this.aspect > 0) {
- var width = this.$containerElement.width();
- if (width > 0) {
- var height = width / this.aspect;
- var imageMapHeight = this.$containerElement.height();
- if (imageMapHeight > 0 && height > imageMapHeight) {
- height = imageMapHeight;
- width = height * this.aspect;
- }
- width *= maxZoom;
- var prevWidth = this.width;
- var prevHeight = this.height;
- if (this.width !== width) {
- this.width = width;
- this.height = width / this.aspect;
- if (!this.map) {
- this.initMap(updateImage);
- } else {
- var lastCenterPos = this.latLngToPoint(this.map.getCenter());
- lastCenterPos.x /= prevWidth;
- lastCenterPos.y /= prevHeight;
- this.updateBounds(updateImage, lastCenterPos);
- this.map.invalidateSize(true);
- this.updateMarkers();
- }
- }
- }
- }
- }
-
- initMap(updateImage) {
- if (!this.map && this.aspect > 0) {
- var center = this.pointToLatLng(this.width/2, this.height/2);
- this.map = L.map(this.$containerElement[0], {
- minZoom: 1,
- maxZoom: maxZoom,
- scrollWheelZoom: !this.disableScrollZooming,
- center: center,
- zoom: 1,
- crs: L.CRS.Simple,
- attributionControl: false
- });
- this.updateBounds(updateImage);
- this.updateMarkers();
- }
- }
-
- pointToLatLng(x, y) {
- return L.CRS.Simple.pointToLatLng({x:x, y:y}, maxZoom-1);
- }
-
- latLngToPoint(latLng) {
- return L.CRS.Simple.latLngToPoint(latLng, maxZoom-1);
- }
-
- inited() {
- return angular.isDefined(this.map);
- }
-
- updateBounds(updateImage, lastCenterPos) {
- var w = this.width;
- var h = this.height;
- var southWest = this.pointToLatLng(0, h);
- var northEast = this.pointToLatLng(w, 0);
- var bounds = new L.LatLngBounds(southWest, northEast);
-
- if (updateImage && this.imageOverlay) {
- this.imageOverlay.remove();
- this.imageOverlay = null;
- }
-
- if (this.imageOverlay) {
- this.imageOverlay.setBounds(bounds);
- } else {
- this.imageOverlay = L.imageOverlay(this.imageUrl, bounds).addTo(this.map);
- }
- var padding = 200 * maxZoom;
- southWest = this.pointToLatLng(-padding, h + padding);
- northEast = this.pointToLatLng(w+padding, -padding);
- var maxBounds = new L.LatLngBounds(southWest, northEast);
- this.map.setMaxBounds(maxBounds);
- if (lastCenterPos) {
- lastCenterPos.x *= w;
- lastCenterPos.y *= h;
- var center = this.pointToLatLng(lastCenterPos.x, lastCenterPos.y);
- this.ctx.$scope.$injector.get('$mdUtil').nextTick(() => {
- this.map.panTo(center, {animate: false});
- });
- }
- }
-
- updateMarkerLabel(marker, settings) {
- marker.unbindTooltip();
- marker.bindTooltip(''+settings.labelText+'
',
- { className: 'tb-marker-label', permanent: true, direction: 'top', offset: marker.tooltipOffset });
- }
-
- updateMarkerColor(marker, color) {
- this.createDefaultMarkerIcon(marker, color, (iconInfo) => {
- marker.setIcon(iconInfo.icon);
- });
- }
-
- updateMarkerIcon(marker, settings) {
- this.createMarkerIcon(marker, settings, (iconInfo) => {
- marker.setIcon(iconInfo.icon);
- if (settings.showLabel) {
- marker.unbindTooltip();
- marker.tooltipOffset = [0, -iconInfo.size[1] * marker.offsetY + 10];
- marker.bindTooltip(''+settings.labelText+'
',
- { className: 'tb-marker-label', permanent: true, direction: 'top', offset: marker.tooltipOffset });
- }
- });
- }
-
- createMarkerIcon(marker, settings, onMarkerIconReady) {
- var currentImage = settings.currentImage;
- var opMap = this;
- if (currentImage && currentImage.url) {
- this.utils.loadImageAspect(currentImage.url).then(
- (aspect) => {
- if (aspect) {
- var width;
- var height;
- if (aspect > 1) {
- width = currentImage.size;
- height = currentImage.size / aspect;
- } else {
- width = currentImage.size * aspect;
- height = currentImage.size;
- }
- var icon = L.icon({
- iconUrl: currentImage.url,
- iconSize: [width, height],
- iconAnchor: [marker.offsetX * width, marker.offsetY * height],
- popupAnchor: [0, -height]
- });
- var iconInfo = {
- size: [width, height],
- icon: icon
- };
- onMarkerIconReady(iconInfo);
- } else {
- opMap.createDefaultMarkerIcon(marker, settings.color, onMarkerIconReady);
- }
- }
- );
- } else {
- this.createDefaultMarkerIcon(marker, settings.color, onMarkerIconReady);
- }
- }
-
- createDefaultMarkerIcon(marker, color, onMarkerIconReady) {
- var pinColor = color.substr(1);
- var icon = L.icon({
- iconUrl: 'https://chart.apis.google.com/chart?chst=d_map_pin_letter&chld=%E2%80%A2|' + pinColor,
- iconSize: [21, 34],
- iconAnchor: [21 * marker.offsetX, 34 * marker.offsetY],
- popupAnchor: [0, -34],
- shadowUrl: 'https://chart.apis.google.com/chart?chst=d_map_pin_shadow',
- shadowSize: [40, 37],
- shadowAnchor: [12, 35]
- });
- var iconInfo = {
- size: [21, 34],
- icon: icon
- };
- onMarkerIconReady(iconInfo);
- }
-
- createMarker(position, dsIndex, settings, onClickListener, markerArgs, onDragendListener) {
- var pos = this.posFunction(position.x, position.y);
- var x = pos.x * this.width;
- var y = pos.y * this.height;
- var location = this.pointToLatLng(x, y);
- var marker = L.marker(location, {
- draggable: settings.drraggable
- });//.addTo(this.map);
- marker.position = position;
- marker.offsetX = settings.markerOffsetX;
- marker.offsetY = settings.markerOffsetY;
- var opMap = this;
- this.createMarkerIcon(marker, settings, (iconInfo) => {
- marker.setIcon(iconInfo.icon);
- if (settings.showLabel) {
- marker.tooltipOffset = [0, -iconInfo.size[1] * marker.offsetY + 10];
- marker.bindTooltip(''+settings.labelText+'
',
- { className: 'tb-marker-label', permanent: true, direction: 'top', offset: marker.tooltipOffset });
- }
- marker.addTo(opMap.map);
- });
-
- if (settings.displayTooltip) {
- this.createTooltip(marker, dsIndex, settings, markerArgs);
- }
-
- if (onClickListener) {
- marker.on('click', onClickListener);
- }
- if (onDragendListener) {
- marker.on('dragend', ($event) => {
- let newMarkerPosition = this.latLngToPoint(marker.getLatLng());
- marker.position.x = this.constructor.calculateNewPosition(newMarkerPosition.x, this.width);
- marker.position.y = this.constructor.calculateNewPosition(newMarkerPosition.y, this.height);
- this.setMarkerPosition(marker, marker.position);
- onDragendListener($event);
- });
- }
- this.markers.push(marker);
- return marker;
- }
-
- static calculateNewPosition(positon, imageSize) {
- let newPosition = positon / imageSize;
- if (newPosition < 0) {
- newPosition = 0;
- } else if (newPosition > 1) {
- newPosition = 1;
- }
- return newPosition;
- }
-
-
- updateMarkers() {
- this.markers.forEach((marker) => {
- this.updateMarkerLocation(marker);
- });
- }
-
- updateMarkerLocation(marker) {
- this.setMarkerPosition(marker, marker.position);
- }
-
- removeMarker(marker) {
- this.map.removeLayer(marker);
- var index = this.markers.indexOf(marker);
- if (index > -1) {
- marker.pinElement.remove();
- this.markers.splice(index, 1);
- }
- }
-
- createTooltip(marker, dsIndex, settings, markerArgs) {
- var popup = L.popup();
- popup.setContent('');
- marker.bindPopup(popup, {autoClose: settings.autocloseTooltip, closeOnClick: false});
- if (settings.displayTooltipAction == 'hover') {
- marker.off('click');
- marker.on('mouseover', function () {
- this.openPopup();
- });
- marker.on('mouseout', function () {
- this.closePopup();
- });
- }
- this.tooltips.push( {
- markerArgs: markerArgs,
- popup: popup,
- locationSettings: settings,
- dsIndex: dsIndex
- });
- }
-
- updatePolylineColor(/*polyline, settings, color*/) {
- }
-
- createPolyline(/*locations, settings*/) {
- }
-
- removePolyline(/*polyline*/) {
- }
-
- createPolygon(/*latLangs, settings*/) {
- }
-
- removePolygon(/*latLangs, settings*/) {
- }
-
- updatePolygonColor(/*latLangs, settings*/) {
- }
-
- getPolygonLatLngs(/*latLangs, settings*/) {
- }
-
- setPolygonLatLngs(/*latLangs, settings*/) {
- }
-
- fitBounds() {
- }
-
- createLatLng(x, y) {
- return new Position(x, y);
- }
-
- extendBoundsWithMarker() {
- }
-
- getMarkerPosition(marker) {
- return marker.position;
- }
-
- setMarkerPosition(marker, position) {
- marker.position = position;
- var pos = this.posFunction(position.x, position.y);
- var x = pos.x * this.width;
- var y = pos.y * this.height;
- var location = this.pointToLatLng(x, y);
- marker.setLatLng(location);
- }
-
- getPolylineLatLngs(/*polyline*/) {
- }
-
- setPolylineLatLngs(/*polyline, latLngs*/) {
- }
-
- createBounds() {
- return {};
- }
-
- extendBounds() {
- }
-
- invalidateSize() {
- this.onresize();
- }
-
- getTooltips() {
- return this.tooltips;
- }
-
- getCenter() {
- return this.map.getCenter();
- }
-
-}
-
-class Position {
- constructor(x, y) {
- this.x = x;
- this.y = y;
- }
-
- equals(loc) {
- return loc && loc.x == this.x && loc.y == this.y;
- }
-}
diff --git a/ui/src/app/widget/lib/map-widget.js b/ui/src/app/widget/lib/map-widget.js
deleted file mode 100644
index 3080074521..0000000000
--- a/ui/src/app/widget/lib/map-widget.js
+++ /dev/null
@@ -1,609 +0,0 @@
-/*
- * Copyright © 2016-2020 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 tinycolor from 'tinycolor2';
-
-import TbGoogleMap from './google-map';
-import TbOpenStreetMap from './openstreet-map';
-
-function procesTooltipPattern(tbMap, pattern, datasources, dsIndex) {
- var match = tbMap.varsRegex.exec(pattern);
- var replaceInfo = {};
- replaceInfo.variables = [];
- while (match !== null) {
- var variableInfo = {};
- variableInfo.dataKeyIndex = -1;
- var variable = match[0];
- var label = match[1];
- var valDec = 2;
- var splitVals = label.split(':');
- if (splitVals.length > 1) {
- label = splitVals[0];
- valDec = parseFloat(splitVals[1]);
- }
- variableInfo.variable = variable;
- variableInfo.valDec = valDec;
-
- if (label.startsWith('#')) {
- var keyIndexStr = label.substring(1);
- var n = Math.floor(Number(keyIndexStr));
- if (String(n) === keyIndexStr && n >= 0) {
- variableInfo.dataKeyIndex = n;
- }
- }
- if (variableInfo.dataKeyIndex === -1) {
- var offset = 0;
- for (var i=0;i 0 && settings.defaultZoomLevel < 21) {
- this.defaultZoomLevel = Math.floor(settings.defaultZoomLevel);
- }
- }
-
- this.dontFitMapBounds = settings.fitMapBounds === false;
-
- if (!useDynamicLocations) {
- this.subscription = this.ctx.defaultSubscription;
- this.configureLocationsFromSettings();
- }
-
- var minZoomLevel = this.drawRoutes ? 18 : 15;
-
- var initCallback = function() {
- tbMap.update();
- tbMap.resize();
- };
-
- if (mapProvider === 'google-map') {
- this.map = new TbGoogleMap($element, this.utils, initCallback, this.defaultZoomLevel, this.dontFitMapBounds, minZoomLevel, settings.gmApiKey, settings.gmDefaultMapType);
- } else if (mapProvider === 'openstreet-map') {
- this.map = new TbOpenStreetMap($element, this.utils, initCallback, this.defaultZoomLevel, this.dontFitMapBounds, minZoomLevel);
- }
-
- }
-
- setCallbacks(callbacks) {
- Object.assign(this.callbacks, callbacks);
- }
-
- clearLocations() {
- if (this.locations) {
- var tbMap = this;
- this.locations.forEach(function(location) {
- if (location.marker) {
- tbMap.map.removeMarker(location.marker);
- }
- if (location.polyline) {
- tbMap.map.removePolyline(location.polyline);
- }
- });
- this.locations = null;
- this.markers = [];
- if (this.drawRoutes) {
- this.polylines = [];
- }
- }
- }
-
- configureLocationsFromSubscription(subscription, subscriptionLocationSettings) {
- this.subscription = subscription;
- this.clearLocations();
- this.locationsSettings = [];
- var latKeyName = subscriptionLocationSettings.latKeyName;
- var lngKeyName = subscriptionLocationSettings.lngKeyName;
- var index = 0;
- for (var i=0;i -1 && lngKeyIndex > -1) {
- var locationsSettings = {
- latKeyName: localLatKeyName,
- lngKeyName: localLngKeyName,
- showLabel: subscriptionLocationSettings.showLabel !== false,
- displayTooltip: subscriptionLocationSettings.displayTooltip !== false,
- label: datasource.name,
- labelText: datasource.name,
- labelColor: subscriptionLocationSettings.labelColor || this.ctx.widgetConfig.color || '#000000',
- color: "#FE7569",
- useColorFunction: false,
- colorFunction: null,
- markerImage: null,
- markerImageSize: 34,
- useMarkerImage: false,
- useMarkerImageFunction: false,
- markerImageFunction: null,
- markerImages: [],
- tooltipPattern: subscriptionLocationSettings.tooltipPattern || "Latitude: ${latitude:7}
Longitude: ${longitude:7}"
- };
-
- locationsSettings.tooltipReplaceInfo = procesTooltipPattern(this, locationsSettings.tooltipPattern, this.subscription.datasources, i);
-
- locationsSettings.useColorFunction = subscriptionLocationSettings.useColorFunction === true;
- if (angular.isDefined(subscriptionLocationSettings.colorFunction) && subscriptionLocationSettings.colorFunction.length > 0) {
- try {
- locationsSettings.colorFunction = new Function('data, dsData, dsIndex', subscriptionLocationSettings.colorFunction);
- } catch (e) {
- locationsSettings.colorFunction = null;
- }
- }
-
- this.locationsSettings.push(locationsSettings);
- latKeyIndex = -1;
- lngKeyIndex = -1;
- }
- index++;
- }
- }
- }
-
- configureLocationsFromSettings() {
- var configuredLocationsSettings = this.drawRoutes ? this.ctx.settings.routesSettings : this.ctx.settings.markersSettings;
- if (!configuredLocationsSettings) {
- configuredLocationsSettings = [];
- }
-
- for (var i=0;iLatitude: ${lat:7}
Longitude: ${lng:7}"
- };
-
- if (this.drawRoutes) {
- this.locationsSettings[i].strokeWeight = 2;
- this.locationsSettings[i].strokeOpacity = 1.0;
- }
-
- if (configuredLocationsSettings[i]) {
- this.locationsSettings[i].latKeyName = configuredLocationsSettings[i].latKeyName || this.locationsSettings[i].latKeyName;
- this.locationsSettings[i].lngKeyName = configuredLocationsSettings[i].lngKeyName || this.locationsSettings[i].lngKeyName;
-
- this.locationsSettings[i].tooltipPattern = configuredLocationsSettings[i].tooltipPattern || "Latitude: ${"+this.locationsSettings[i].latKeyName+":7}
Longitude: ${"+this.locationsSettings[i].lngKeyName+":7}";
-
- this.locationsSettings[i].tooltipReplaceInfo = procesTooltipPattern(this, this.locationsSettings[i].tooltipPattern, this.subscription.datasources);
-
- this.locationsSettings[i].showLabel = configuredLocationsSettings[i].showLabel !== false;
- this.locationsSettings[i].label = configuredLocationsSettings[i].label || this.locationsSettings[i].label;
- this.locationsSettings[i].labelText = this.locationsSettings[i].label;
- this.locationsSettings[i].color = configuredLocationsSettings[i].color ? tinycolor(configuredLocationsSettings[i].color).toHexString() : this.locationsSettings[i].color;
-
- this.locationsSettings[i].useColorFunction = configuredLocationsSettings[i].useColorFunction === true;
- if (angular.isDefined(configuredLocationsSettings[i].colorFunction) && configuredLocationsSettings[i].colorFunction.length > 0) {
- try {
- this.locationsSettings[i].colorFunction = new Function('data, dsData, dsIndex', configuredLocationsSettings[i].colorFunction);
- } catch (e) {
- this.locationsSettings[i].colorFunction = null;
- }
- }
-
- this.locationsSettings[i].useMarkerImageFunction = configuredLocationsSettings[i].useMarkerImageFunction === true;
- if (angular.isDefined(configuredLocationsSettings[i].markerImageFunction) && configuredLocationsSettings[i].markerImageFunction.length > 0) {
- try {
- this.locationsSettings[i].markerImageFunction = new Function('data, images, dsData, dsIndex', configuredLocationsSettings[i].markerImageFunction);
- } catch (e) {
- this.locationsSettings[i].markerImageFunction = null;
- }
- }
-
- this.locationsSettings[i].markerImages = configuredLocationsSettings[i].markerImages || [];
-
- if (!this.locationsSettings[i].useMarkerImageFunction &&
- angular.isDefined(configuredLocationsSettings[i].markerImage) &&
- configuredLocationsSettings[i].markerImage.length > 0) {
- this.locationsSettings[i].useMarkerImage = true;
- var url = this.ctx.settings.markerImage;
- var size = this.ctx.settings.markerImageSize || 34;
- this.locationsSettings[i].currentImage = {
- url: url,
- size: size
- };
- }
-
- if (this.drawRoutes) {
- this.locationsSettings[i].strokeWeight = configuredLocationsSettings[i].strokeWeight || this.locationsSettings[i].strokeWeight;
- this.locationsSettings[i].strokeOpacity = angular.isDefined(configuredLocationsSettings[i].strokeOpacity) ? configuredLocationsSettings[i].strokeOpacity : this.locationsSettings[i].strokeOpacity;
- }
- }
- }
- }
-
- update() {
-
- var tbMap = this;
-
- function isNumber(n) {
- return !isNaN(parseFloat(n)) && isFinite(n);
- }
-
- function padValue(val, dec, int) {
- var i = 0;
- var s, strVal, n;
-
- val = parseFloat(val);
- n = (val < 0);
- val = Math.abs(val);
-
- if (dec > 0) {
- strVal = val.toFixed(dec).toString().split('.');
- s = int - strVal[0].length;
-
- for (; i < s; ++i) {
- strVal[0] = '0' + strVal[0];
- }
-
- strVal = (n ? '-' : '') + strVal[0] + '.' + strVal[1];
- }
-
- else {
- strVal = Math.round(val).toString();
- s = int - strVal.length;
-
- for (; i < s; ++i) {
- strVal = '0' + strVal;
- }
-
- strVal = (n ? '-' : '') + strVal;
- }
-
- return strVal;
- }
-
- function arraysEqual(a, b) {
- if (a === b) return true;
- if (a === null || b === null) return false;
- if (a.length != b.length) return false;
-
- for (var i = 0; i < a.length; ++i) {
- if (!a[i].equals(b[i])) return false;
- }
- return true;
- }
-
- function calculateLocationColor(location, dataMap) {
- if (location.settings.useColorFunction && location.settings.colorFunction) {
- var color = '#FE7569';
- try {
- color = location.settings.colorFunction(dataMap.dataMap, dataMap.dsDataMap, location.dsIndex);
- } catch (e) {
- color = '#FE7569';
- }
- return tinycolor(color).toHexString();
- } else {
- return location.settings.color;
- }
- }
-
- function updateLocationColor(location, dataMap) {
- var color = calculateLocationColor(location, dataMap);
- if (!location.settings.calculatedColor || location.settings.calculatedColor !== color) {
- if (!location.settings.useMarkerImage && !location.settings.useMarkerImageFunction) {
- tbMap.map.updateMarkerColor(location.marker, color);
- }
- if (location.polyline) {
- tbMap.map.updatePolylineColor(location.polyline, location.settings, color);
- }
- location.settings.calculatedColor = color;
- }
- }
-
- function calculateLocationMarkerImage(location, dataMap) {
- if (location.settings.useMarkerImageFunction && location.settings.markerImageFunction) {
- var image = null;
- try {
- image = location.settings.markerImageFunction(dataMap.dataMap, location.settings.markerImages, dataMap.dsDataMap, location.dsIndex);
- } catch (e) {
- image = null;
- }
- return image;
- } else {
- return null;
- }
- }
-
- function updateLocationMarkerIcon(location, dataMap) {
- var image = calculateLocationMarkerImage(location, dataMap);
- if (image && (!location.settings.currentImage || !angular.equals(location.settings.currentImage, image))) {
- location.settings.currentImage = image;
- tbMap.map.updateMarkerIcon(location.marker, location.settings);
- }
- }
-
- function updateLocationStyle(location, dataMap) {
- updateLocationColor(location, dataMap);
- updateLocationMarkerIcon(location, dataMap);
- }
-
- function createOrUpdateLocationMarker(location, markerLocation, dataMap) {
- var changed = false;
- if (!location.marker) {
- var image = calculateLocationMarkerImage(location, dataMap);
- if (image && (!location.settings.currentImage || !angular.equals(location.settings.currentImage, image))) {
- location.settings.currentImage = image;
- }
- location.marker = tbMap.map.createMarker(markerLocation, location.dsIndex, location.settings,
- function() {
- tbMap.callbacks.onLocationClick(location);
- }
- );
- tbMap.markers.push(location.marker);
- changed = true;
- } else {
- var prevPosition = tbMap.map.getMarkerPosition(location.marker);
- if (!prevPosition.equals(markerLocation)) {
- tbMap.map.setMarkerPosition(location.marker, markerLocation);
- changed = true;
- }
- }
- return changed;
- }
-
- function updateLocation(location, data, dataMap) {
- var locationChanged = false;
- if (location.latIndex > -1 && location.lngIndex > -1) {
- var latData = data[location.latIndex].data;
- var lngData = data[location.lngIndex].data;
- var lat, lng, latLng;
- if (latData.length > 0 && lngData.length > 0) {
- if (tbMap.drawRoutes) {
- // Create or update route
- var latLngs = [];
- for (var i = 0; i < latData.length; i++) {
- lat = latData[i][1];
- lng = lngData[i][1];
- latLng = tbMap.map.createLatLng(lat, lng);
- if (i == 0 || !latLngs[latLngs.length-1].equals(latLng)) {
- latLngs.push(latLng);
- }
- }
- if (latLngs.length > 0) {
- var markerLocation = latLngs[latLngs.length-1];
- createOrUpdateLocationMarker(location, markerLocation, dataMap);
- }
- if (!location.polyline) {
- location.polyline = tbMap.map.createPolyline(latLngs, location.settings);
- tbMap.polylines.push(location.polyline);
- locationChanged = true;
- } else {
- var prevPath = tbMap.map.getPolylineLatLngs(location.polyline);
- if (!prevPath || !arraysEqual(prevPath, latLngs)) {
- tbMap.map.setPolylineLatLngs(location.polyline, latLngs);
- locationChanged = true;
- }
- }
- } else {
- // Create or update marker
- lat = latData[latData.length-1][1];
- lng = lngData[lngData.length-1][1];
- latLng = tbMap.map.createLatLng(lat, lng);
- if (createOrUpdateLocationMarker(location, latLng, dataMap)) {
- locationChanged = true;
- }
- }
- updateLocationStyle(location, dataMap);
- }
- }
- return locationChanged;
- }
-
- function toLabelValueMap(data, datasources) {
- var dataMap = {};
- var dsDataMap = [];
- for (var d=0;d 0) {
- val = keyData[keyData.length-1][1];
- }
- dataMap[label] = val;
- var dsIndex = datasources.indexOf(data[i].datasource);
- dsDataMap[dsIndex][label] = val;
- }
- return {
- dataMap: dataMap,
- dsDataMap: dsDataMap
- };
- }
-
- function loadLocations(data, datasources) {
- var bounds = tbMap.map.createBounds();
- tbMap.locations = [];
- var dataMap = toLabelValueMap(data, datasources);
- for (var l=0; l < tbMap.locationsSettings.length; l++) {
- var locationSettings = tbMap.locationsSettings[l];
- var latIndex = -1;
- var lngIndex = -1;
- for (var i = 0; i < data.length; i++) {
- var dataKey = data[i].dataKey;
- var nameToCheck;
- if (dataKey.locationAttrName) {
- nameToCheck = dataKey.locationAttrName;
- } else {
- nameToCheck = dataKey.label;
- }
- if (nameToCheck === locationSettings.latKeyName) {
- latIndex = i;
- } else if (nameToCheck === locationSettings.lngKeyName) {
- lngIndex = i;
- }
- }
- if (latIndex > -1 && lngIndex > -1) {
- var ds = data[latIndex].datasource;
- var dsIndex = datasources.indexOf(ds);
- var location = {
- latIndex: latIndex,
- lngIndex: lngIndex,
- dsIndex: dsIndex,
- settings: locationSettings
- };
- tbMap.locations.push(location);
- updateLocation(location, data, dataMap);
- if (location.polyline) {
- tbMap.map.extendBounds(bounds, location.polyline);
- } else if (location.marker) {
- tbMap.map.extendBoundsWithMarker(bounds, location.marker);
- }
- }
- }
- tbMap.map.fitBounds(bounds);
- }
-
- function updateLocations(data, datasources) {
- var locationsChanged = false;
- var bounds = tbMap.map.createBounds();
- var dataMap = toLabelValueMap(data, datasources);
- for (var p = 0; p < tbMap.locations.length; p++) {
- var location = tbMap.locations[p];
- locationsChanged |= updateLocation(location, data, dataMap);
- if (location.polyline) {
- tbMap.map.extendBounds(bounds, location.polyline);
- } else if (location.marker) {
- tbMap.map.extendBoundsWithMarker(bounds, location.marker);
- }
- }
- if (locationsChanged) {
- tbMap.map.fitBounds(bounds);
- }
- }
-
- if (this.map && this.map.inited() && this.subscription) {
- if (this.subscription.data) {
- if (!this.locations) {
- loadLocations(this.subscription.data, this.subscription.datasources);
- } else {
- updateLocations(this.subscription.data, this.subscription.datasources);
- }
- var tooltips = this.map.getTooltips();
- for (var t=0; t < tooltips.length; t++) {
- var tooltip = tooltips[t];
- var settings = tooltip.locationSettings;
- var text = settings.tooltipPattern;
- var replaceInfo = settings.tooltipReplaceInfo;
- for (var v = 0; v < replaceInfo.variables.length; v++) {
- var variableInfo = replaceInfo.variables[v];
- var txtVal = '';
- if (variableInfo.dataKeyIndex > -1 && this.subscription.data[variableInfo.dataKeyIndex]) {
- var varData = this.subscription.data[variableInfo.dataKeyIndex].data;
- if (varData.length > 0) {
- var val = varData[varData.length - 1][1];
- if (isNumber(val)) {
- txtVal = padValue(val, variableInfo.valDec, 0);
- } else {
- txtVal = val;
- }
- }
- }
- text = text.split(variableInfo.variable).join(txtVal);
- }
- tooltip.popup.setContent(text);
- }
- }
- }
- }
-
- resize() {
- if (this.map && this.map.inited()) {
- this.map.invalidateSize();
- if (this.locations && this.locations.length > 0) {
- var bounds = this.map.createBounds();
- for (var m = 0; m < this.markers.length; m++) {
- this.map.extendBoundsWithMarker(bounds, this.markers[m]);
- }
- if (this.polylines) {
- for (var p = 0; p < this.polylines.length; p++) {
- this.map.extendBounds(bounds, this.polylines[p]);
- }
- }
- this.map.fitBounds(bounds);
- }
- }
- }
-
-}
diff --git a/ui/src/app/widget/lib/map-widget2.js b/ui/src/app/widget/lib/map-widget2.js
deleted file mode 100644
index 6f05c3ae03..0000000000
--- a/ui/src/app/widget/lib/map-widget2.js
+++ /dev/null
@@ -1,1782 +0,0 @@
-/*
- * Copyright © 2016-2020 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 tinycolor from 'tinycolor2';
-
-import TbGoogleMap from './google-map';
-import TbOpenStreetMap from './openstreet-map';
-import TbImageMap from './image-map';
-import TbTencentMap from './tencent-map';
-
-import {processPattern, arraysEqual, toLabelValueMap, fillPattern, fillPatternWithActions} from './widget-utils';
-import addEntityPanelTemplate from './add-entity-panel.tpl.html';
-import './add-entity-panel.scss';
-
-export default class TbMapWidgetV2 {
-
- constructor(mapProvider, drawRoutes, ctx, useDynamicLocations, $element, isEdit) {
- var tbMap = this;
- this.ctx = ctx;
- this.mapProvider = mapProvider;
- if (!$element) {
- $element = ctx.$container;
- }
- this.utils = ctx.$scope.$injector.get('utils');
- this.drawRoutes = drawRoutes;
- this.isEdit = isEdit ? isEdit : false;
- this.markers = [];
- this.polygons = [];
- if (this.drawRoutes) {
- this.polylines = [];
- }
-
- this.locationSettings = {};
-
- var settings = ctx.settings;
-
- this.callbacks = {};
- this.callbacks.onLocationClick = function () {
- };
-
- if (settings.defaultZoomLevel) {
- if (settings.defaultZoomLevel >= 0 && settings.defaultZoomLevel < 21) {
- this.defaultZoomLevel = Math.floor(settings.defaultZoomLevel);
- }
- }
-
- if (angular.isUndefined(settings.defaultCenterPosition)) {
- settings.defaultCenterPosition = [0,0];
- } else if (angular.isString(settings.defaultCenterPosition)) {
- settings.defaultCenterPosition = settings.defaultCenterPosition.split(',').map(x => +x);
- }
-
- this.dontFitMapBounds = settings.fitMapBounds === false;
-
- if (!useDynamicLocations) {
- this.subscription = this.ctx.defaultSubscription;
- }
-
- this.configureLocationsSettings();
-
- var minZoomLevel = this.drawRoutes ? 18 : 15;
-
- let markerClusteringSetting = {
- isMarketCluster: false
- };
-
- if (settings.useClusterMarkers === true){
- if (mapProvider === 'google-map' || mapProvider === 'tencent-map') {
- markerClusteringSetting = {
- isMarketCluster: true,
- zoomOnClick: settings.zoomOnClick,
- averageCenter: true
- };
- if(angular.isDefined(settings.maxZoom) && settings.maxZoom >= 0 && settings.maxZoom < 19){
- markerClusteringSetting.maxZoom = Math.floor(settings.maxZoom);
- }
- if(angular.isDefined(settings.gridSize) && settings.gridSize > 0){
- markerClusteringSetting.gridSize = Math.floor(settings.gridSize);
- }
- if(angular.isDefined(settings.minimumClusterSize) && settings.minimumClusterSize > 1){
- markerClusteringSetting.minimumClusterSize = Math.ceil(settings.minimumClusterSize);
- }
- } else if(mapProvider === 'openstreet-map' || mapProvider === 'here') {
- markerClusteringSetting = {
- isMarketCluster: true,
- zoomToBoundsOnClick: settings.zoomOnClick,
- showCoverageOnHover: settings.showCoverageOnHover,
- removeOutsideVisibleBounds: settings.removeOutsideVisibleBounds,
- animate: settings.animate,
- chunkedLoading: settings.chunkedLoading
- };
- if(angular.isDefined(settings.maxClusterRadius) && settings.maxClusterRadius > 0){
- markerClusteringSetting.maxClusterRadius = Math.floor(settings.maxClusterRadius);
- }
- if(angular.isDefined(settings.maxZoom) && settings.maxZoom >= 0 && settings.maxZoom < 19){
- markerClusteringSetting.disableClusteringAtZoom = Math.floor(settings.maxZoom);
- }
- }
- }
-
-
-
-
- var initCallback = function () {
- tbMap.update();
- tbMap.resize();
- };
-
- this.ctx.$scope.onTooltipAction = function (event, actionName, dsIndex) {
- tbMap.onTooltipAction(event, actionName, dsIndex);
- };
- this.tooltipActionsMap = {};
- var descriptors = this.ctx.actionsApi.getActionDescriptors('tooltipAction');
- descriptors.forEach(function (descriptor) {
- tbMap.tooltipActionsMap[descriptor.name] = descriptor;
- });
-
- let openStreetMapProvider = {};
- if (mapProvider === 'google-map') {
- this.map = new TbGoogleMap($element, this.utils, initCallback, this.defaultZoomLevel, this.dontFitMapBounds, settings.disableScrollZooming, minZoomLevel, settings.gmApiKey, settings.gmDefaultMapType, settings.defaultCenterPosition, markerClusteringSetting);
- } else if (mapProvider === 'openstreet-map') {
- if (settings.useCustomProvider && settings.customProviderTileUrl) {
- openStreetMapProvider.name = settings.customProviderTileUrl;
- openStreetMapProvider.isCustom = true;
- } else {
- openStreetMapProvider.name = settings.mapProvider;
- }
- this.map = new TbOpenStreetMap($element, this.utils, initCallback, this.defaultZoomLevel, this.dontFitMapBounds, settings.disableScrollZooming, minZoomLevel, openStreetMapProvider, null,settings.defaultCenterPosition, markerClusteringSetting);
- } else if (mapProvider === 'here') {
- openStreetMapProvider.name = settings.mapProvider;
- this.map = new TbOpenStreetMap($element, this.utils, initCallback, this.defaultZoomLevel, this.dontFitMapBounds, settings.disableScrollZooming, minZoomLevel, openStreetMapProvider, settings.credentials, settings.defaultCenterPosition, markerClusteringSetting);
- } else if (mapProvider === 'image-map') {
- this.map = new TbImageMap(this.ctx, $element, this.utils, initCallback,
- settings.mapImageUrl,
- settings.disableScrollZooming,
- settings.posFunction,
- settings.imageEntityAlias,
- settings.imageUrlAttribute,
- settings.useDefaultCenterPosition ? settings.defaultCenterPosition: null);
- } else if (mapProvider === 'tencent-map') {
- this.map = new TbTencentMap($element, this.utils, initCallback, this.defaultZoomLevel, this.dontFitMapBounds, settings.disableScrollZooming, minZoomLevel, settings.tmApiKey, settings.tmDefaultMapType, settings.defaultCenterPosition, markerClusteringSetting);
- }
-
-
- tbMap.initBounds = true;
- }
-
- setCallbacks(callbacks) {
- Object.assign(this.callbacks, callbacks);
- }
-
- clearLocations() {
- if (this.locations) {
- var tbMap = this;
- this.locations.forEach(function (location) {
- if (location.marker) {
- tbMap.map.removeMarker(location.marker);
- }
- if (location.polyline) {
- tbMap.map.removePolyline(location.polyline);
- }
- if (location.polygon) {
- tbMap.map.removePolygon(location.polygon);
- }
- });
- this.locations = null;
- this.markers = [];
- this.polygons = [];
- if (this.drawRoutes) {
- this.polylines = [];
- }
- }
- }
-
- setSubscription(subscription) {
- this.subscription = subscription;
- this.clearLocations();
- }
-
- configureLocationsSettings() {
-
- if (this.mapProvider == 'image-map') {
- this.locationSettings.latKeyName = this.ctx.settings.xPosKeyName || 'xPos';
- this.locationSettings.lngKeyName = this.ctx.settings.yPosKeyName || 'yPos';
- this.locationSettings.markerOffsetX = angular.isDefined(this.ctx.settings.markerOffsetX) ? this.ctx.settings.markerOffsetX : 0.5;
- this.locationSettings.markerOffsetY = angular.isDefined(this.ctx.settings.markerOffsetY) ? this.ctx.settings.markerOffsetY : 1;
- } else {
- this.locationSettings.latKeyName = this.ctx.settings.latKeyName || 'latitude';
- this.locationSettings.lngKeyName = this.ctx.settings.lngKeyName || 'longitude';
- this.locationSettings.polygonKeyName = this.ctx.settings.polygonKeyName || 'coordinates';
- }
-
- this.locationSettings.tooltipPattern = this.ctx.settings.tooltipPattern || "${entityName}
Latitude: ${" + this.locationSettings.latKeyName + ":7}
Longitude: ${" + this.locationSettings.lngKeyName + ":7}";
-
- this.locationSettings.showLabel = this.ctx.settings.showLabel !== false;
- this.locationSettings.displayTooltip = this.ctx.settings.showTooltip !== false;
- this.locationSettings.useDefaultCenterPosition = this.ctx.settings.useDefaultCenterPosition === true;
- this.locationSettings.displayTooltipAction = this.ctx.settings.showTooltipAction && this.ctx.settings.showTooltipAction.length ? this.ctx.settings.showTooltipAction : "click";
- this.locationSettings.autocloseTooltip = this.ctx.settings.autocloseTooltip !== false;
- this.locationSettings.showPolygon = this.ctx.settings.showPolygon === true;
- this.locationSettings.labelColor = this.ctx.widgetConfig.color || '#000000';
- this.locationSettings.label = this.ctx.settings.label || "${entityName}";
- this.locationSettings.color = this.ctx.settings.color ? tinycolor(this.ctx.settings.color).toHexString() : "#FE7569";
- this.locationSettings.polygonColor = this.ctx.settings.polygonColor ? tinycolor(this.ctx.settings.polygonColor).toHexString() : "#0000ff";
- this.locationSettings.polygonStrokeColor = this.ctx.settings.polygonStrokeColor ? tinycolor(this.ctx.settings.polygonStrokeColor).toHexString() : "#fe0001";
- this.locationSettings.polygonOpacity = angular.isDefined(this.ctx.settings.polygonOpacity) ? this.ctx.settings.polygonOpacity : 0.5;
- this.locationSettings.polygonStrokeOpacity = angular.isDefined(this.ctx.settings.polygonStrokeOpacity) ? this.ctx.settings.polygonStrokeOpacity : 1;
- this.locationSettings.polygonStrokeWeight = angular.isDefined(this.ctx.settings.polygonStrokeWeight) ? this.ctx.settings.polygonStrokeWeight : 1;
-
- this.locationSettings.useLabelFunction = this.ctx.settings.useLabelFunction === true;
- if (angular.isDefined(this.ctx.settings.labelFunction) && this.ctx.settings.labelFunction.length > 0) {
- try {
- this.locationSettings.labelFunction = new Function('data, dsData, dsIndex', this.ctx.settings.labelFunction);
- } catch (e) {
- this.locationSettings.labelFunction = null;
- }
- }
-
- this.locationSettings.useTooltipFunction = this.ctx.settings.useTooltipFunction === true;
- if (angular.isDefined(this.ctx.settings.tooltipFunction) && this.ctx.settings.tooltipFunction.length > 0) {
- try {
- this.locationSettings.tooltipFunction = new Function('data, dsData, dsIndex', this.ctx.settings.tooltipFunction);
- } catch (e) {
- this.locationSettings.tooltipFunction = null;
- }
- }
-
- this.locationSettings.useColorFunction = this.ctx.settings.useColorFunction === true;
- if (angular.isDefined(this.ctx.settings.colorFunction) && this.ctx.settings.colorFunction.length > 0) {
- try {
- this.locationSettings.colorFunction = new Function('data, dsData, dsIndex', this.ctx.settings.colorFunction);
- } catch (e) {
- this.locationSettings.colorFunction = null;
- }
- }
- this.locationSettings.usePolygonColorFunction = this.ctx.settings.usePolygonColorFunction === true;
- if (angular.isDefined(this.ctx.settings.polygonColorFunction) && this.ctx.settings.polygonColorFunction.length > 0) {
- try {
- this.locationSettings.polygonColorFunction = new Function('data, dsData, dsIndex', this.ctx.settings.polygonColorFunction);
- } catch (e) {
- this.locationSettings.polygonColorFunction = null;
- }
- }
-
- this.locationSettings.useMarkerImageFunction = this.ctx.settings.useMarkerImageFunction === true;
- if (angular.isDefined(this.ctx.settings.markerImageFunction) && this.ctx.settings.markerImageFunction.length > 0) {
- try {
- this.locationSettings.markerImageFunction = new Function('data, images, dsData, dsIndex', this.ctx.settings.markerImageFunction);
- } catch (e) {
- this.locationSettings.markerImageFunction = null;
- }
- }
-
- this.locationSettings.markerImages = this.ctx.settings.markerImages || [];
-
- if (!this.locationSettings.useMarkerImageFunction &&
- angular.isDefined(this.ctx.settings.markerImage) &&
- this.ctx.settings.markerImage.length > 0) {
- this.locationSettings.useMarkerImage = true;
- var url = this.ctx.settings.markerImage;
- var size = this.ctx.settings.markerImageSize || 34;
- this.locationSettings.currentImage = {
- url: url,
- size: size
- };
- }
-
- if (this.drawRoutes) {
- this.locationSettings.strokeWeight = this.ctx.settings.strokeWeight || 2;
- this.locationSettings.strokeOpacity = this.ctx.settings.strokeOpacity || 1.0;
- }
- }
-
- onTooltipAction(event, actionName, dsIndex) {
- var descriptor = this.tooltipActionsMap[actionName];
- if (descriptor) {
- var datasource = this.subscription.datasources[dsIndex];
- var entityId = {};
- entityId.id = datasource.entityId;
- entityId.entityType = datasource.entityType;
- var entityName = datasource.entityName;
- var entityLabel = datasource.entityLabel;
- this.ctx.actionsApi.handleWidgetAction(event, descriptor, entityId, entityName, null, entityLabel);
- }
- }
-
- selectEntity($event) {
- var tbMap = this;
-
- function setDefaultPosition(entity) {
- let position = tbMap.map.getCenter();
- if (tbMap.mapProvider === "image-map") {
- position = tbMap.map.latLngToPoint(position);
- position.lat = position.x / tbMap.map.width;
- position.lng = position.y / tbMap.map.height;
- }
-
- tbMap.saveMarkerLocation(
- entity,
- locationsWithoutMarker[entitiesWithoutPosition.indexOf(entity)],
- position
- );
- }
-
- const element = angular.element($event.target);
- const $mdPanel = this.ctx.$scope.$injector.get('$mdPanel');
- const $document = this.ctx.$scope.$injector.get('$document');
- let position = $mdPanel.newPanelPosition()
- .relativeTo(element)
- .addPanelPosition($mdPanel.xPosition.ALIGN_END, $mdPanel.yPosition.BELOW);
-
- let locationsWithoutMarker = this.locations.filter((location) => !location.marker);
- let entitiesWithoutPosition = [];
- for (let i = 0; i < locationsWithoutMarker.length; i++) {
- entitiesWithoutPosition.push(this.subscription.datasources[locationsWithoutMarker[i].dsIndex]);
- }
-
- if(entitiesWithoutPosition.length === 1){
- setDefaultPosition(entitiesWithoutPosition[0]);
- } else {
- let config = {
- attachTo: angular.element($document[0].body),
- controller: addEntityPanelController,
- controllerAs: 'vm',
- templateUrl: addEntityPanelTemplate,
- panelClass: 'tb-add-entity-panel',
- position: position,
- fullscreen: false,
- locals: {
- 'entities': entitiesWithoutPosition,
- 'onClose': setDefaultPosition
- },
- openFrom: $event,
- clickOutsideToClose: true,
- escapeToClose: true,
- focusOnOpen: false
- };
- $mdPanel.open(config);
- }
- }
-
- saveMarkerLocation(datasource, location, coordinate) {
- var tbMap = this;
-
- const types = tbMap.ctx.$scope.$injector.get('types');
- const $q = tbMap.ctx.$scope.$injector.get('$q');
- const attributeService = tbMap.ctx.$scope.$injector.get('attributeService');
-
- let attributesLocation = [];
- let timeseriesLocation = [];
- let promises = [];
-
- let dataKeys = datasource.dataKeys;
- for (let i = 0; i < dataKeys.length; i++) {
- if (dataKeys[i].name === location.settings.latKeyName || dataKeys[i].name === location.settings.lngKeyName) {
- let newLocation = {
- key: dataKeys[i].name,
- value: dataKeys[i].name === location.settings.latKeyName ? coordinate.lat : coordinate.lng
- };
- if (dataKeys[i].type === types.dataKeyType.attribute) {
- attributesLocation.push(newLocation);
- } else if (dataKeys[i].type === types.dataKeyType.timeseries) {
- timeseriesLocation.push(newLocation);
- }
- }
- }
-
- if (attributesLocation.length > 0) {
- promises.push(attributeService.saveEntityAttributes(
- datasource.entityType,
- datasource.entityId,
- types.attributesScope.server.value,
- attributesLocation,
- {
- ignoreLoading: true
- }
- ))
- }
- if (timeseriesLocation.length > 0) {
- promises.push(attributeService.saveEntityTimeseries(
- datasource.entityType,
- datasource.entityId,
- "scope",
- timeseriesLocation,
- {
- ignoreLoading: true
- }
- ))
- }
- return $q.all([promises]);
- }
-
- update() {
- var tbMap = this;
-
-
- function updateLocationLabel(location, dataMap) {
- if (location.settings.showLabel) {
- if (location.settings.useLabelFunction && location.settings.labelFunction) {
- try {
- location.settings.label = location.settings.labelFunction(dataMap.dataMap, dataMap.dsDataMap, location.dsIndex);
- } catch (e) {
- location.settings.label = null;
- }
- if (location.settings.label) {
- var datasources = tbMap.subscription.datasources;
- location.settings.label = tbMap.utils.createLabelFromDatasource(datasources[location.dsIndex], location.settings.label);
- location.settings.labelReplaceInfo = processPattern(location.settings.label, datasources, location.dsIndex);
- location.settings.labelText = location.settings.label;
- }
- }
- if (location.settings.labelReplaceInfo.variables.length) {
- location.settings.labelText = fillPattern(location.settings.label,
- location.settings.labelReplaceInfo, tbMap.subscription.data);
- }
- tbMap.map.updateMarkerLabel(location.marker, location.settings);
- }
- }
-
-
- function calculateLocationColor(location, dataMap) {
- if (location.settings.useColorFunction && location.settings.colorFunction) {
- var color;
- try {
- color = location.settings.colorFunction(dataMap.dataMap, dataMap.dsDataMap, location.dsIndex);
- } catch (e) {/**/
- }
- if (!color) {
- color = '#FE7569';
- }
- return tinycolor(color).toHexString();
- } else {
- return location.settings.color;
- }
- }
-
- function calculateLocationPolygonColor(location, dataMap) {
- if (location.settings.usePolygonColorFunction && location.settings.polygonColorFunction) {
- var color;
- try {
- color = location.settings.polygonColorFunction(dataMap.dataMap, dataMap.dsDataMap, location.dsIndex);
- } catch (e) {/**/
- }
- if (!color) {
- color = '#007800';
- }
- return tinycolor(color).toHexString();
- } else {
- return location.settings.polygonColor;
- }
- }
-
- function updateLocationColor(location, color, image) {
- if (!location.settings.calculatedColor || location.settings.calculatedColor !== color) {
- if (!location.settings.useMarkerImage && !image) {
- tbMap.map.updateMarkerColor(location.marker, color);
- }
- if (location.polyline) {
- tbMap.map.updatePolylineColor(location.polyline, location.settings, color);
- }
- location.settings.calculatedColor = color;
- }
- }
-
- function updateLocationPolygonColor(location, color) {
- if (location.polygon && color) {
- location.settings.calculatedPolygonColor = color;
- tbMap.map.updatePolygonColor(location.polygon, location.settings, color);
- }
- }
-
- function calculateLocationMarkerImage(location, dataMap) {
- if (location.settings.useMarkerImageFunction && location.settings.markerImageFunction) {
- var image = null;
- try {
- image = location.settings.markerImageFunction(dataMap.dataMap, location.settings.markerImages, dataMap.dsDataMap, location.dsIndex);
- } catch (e) {
- image = null;
- }
- return image;
- } else {
- return null;
- }
- }
-
- function updateLocationMarkerIcon(location, image) {
- if (image && (!location.settings.currentImage || !angular.equals(location.settings.currentImage, image))) {
- location.settings.currentImage = image;
- tbMap.map.updateMarkerIcon(location.marker, location.settings);
- }
- }
-
- function updateLocationStyle(location, dataMap) {
- updateLocationLabel(location, dataMap);
- var color = calculateLocationColor(location, dataMap);
- var image = calculateLocationMarkerImage(location, dataMap);
- updateLocationColor(location, color, image);
- updateLocationMarkerIcon(location, image);
- }
-
- function createOrUpdateLocationMarker(location, markerLocation, dataMap) {
- var changed = false;
- if (!location.marker) {
- var image = calculateLocationMarkerImage(location, dataMap);
- if (image && (!location.settings.currentImage || !angular.equals(location.settings.currentImage, image))) {
- location.settings.currentImage = image;
- }
- location.marker = tbMap.map.createMarker(markerLocation, location.dsIndex, location.settings,
- function (event) {
- tbMap.callbacks.onLocationClick(location);
- locationRowClick(event, location);
- }, [location.dsIndex],
- function (event) {
- markerDragend(event, location)
- });
- tbMap.markers.push(location.marker);
- changed = true;
- } else {
- var prevPosition = tbMap.map.getMarkerPosition(location.marker);
- if (!prevPosition.equals(markerLocation)) {
- tbMap.map.setMarkerPosition(location.marker, markerLocation);
- changed = true;
- }
- }
- return changed;
- }
-
- function markerDragend($event, location) {
- if (location.settings.drraggable) {
- let position = tbMap.map.getMarkerPosition(location.marker);
- if (tbMap.mapProvider === "image-map") {
- position.lat = position.x;
- position.lng = position.y;
- delete position.x;
- delete position.y;
- } else if (tbMap.mapProvider === "google-map") {
- position = position.toJSON();
- }
-
- tbMap.saveMarkerLocation(tbMap.subscription.datasources[location.dsIndex], location, position);
- }
- }
-
- function locationRowClick($event, location) {
- var descriptors = tbMap.ctx.actionsApi.getActionDescriptors('markerClick');
- if (descriptors.length) {
- var datasource = tbMap.subscription.datasources[location.dsIndex];
- var entityId = {};
- entityId.id = datasource.entityId;
- entityId.entityType = datasource.entityType;
- var entityName = datasource.entityName;
- var entityLabel = datasource.entityLabel;
- tbMap.ctx.actionsApi.handleWidgetAction($event, descriptors[0], entityId, entityName, null, entityLabel);
- }
- }
- function locationPolygonClick($event, location) {
- var descriptors = tbMap.ctx.actionsApi.getActionDescriptors('polygonClick');
- if (descriptors.length) {
- var datasource = tbMap.subscription.datasources[location.dsIndex];
- var entityId = {};
- entityId.id = datasource.entityId;
- entityId.entityType = datasource.entityType;
- var entityName = datasource.entityName;
- var entityLabel = datasource.entityLabel;
- tbMap.ctx.actionsApi.handleWidgetAction($event, descriptors[0], entityId, entityName, null, entityLabel);
- }
- }
-
- function updateLocation(location, data, dataMap) {
- var locationChanged = false;
- if (location.latIndex > -1 && location.lngIndex > -1) {
- var latData = data[location.latIndex].data;
- var lngData = data[location.lngIndex].data;
- var lat, lng, latLng;
-
- if (tbMap.drawRoutes) {
- // Create or update route
- var latLngs = [];
- for (var i = 0; i < latData.length; i++) {
- lat = latData[i][1];
- lng = lngData[i][1];
- if (angular.isDefined(lat) && lat != null && angular.isDefined(lng) && lng != null) {
- latLng = tbMap.map.createLatLng(lat, lng);
- if (i == 0 || !latLngs[latLngs.length - 1].equals(latLng)) {
- latLngs.push(latLng);
- }
- }
- }
- if (latLngs.length > 0) {
- var markerLocation = latLngs[latLngs.length - 1];
- createOrUpdateLocationMarker(location, markerLocation, dataMap);
- } else if (location.marker) {
- tbMap.map.removeMarker(location.marker);
- delete location.marker;
- }
- if (!location.polyline) {
- location.polyline = tbMap.map.createPolyline(latLngs, location.settings);
- tbMap.polylines.push(location.polyline);
- locationChanged = true;
- } else {
- var prevPath = tbMap.map.getPolylineLatLngs(location.polyline);
- if (!prevPath || !arraysEqual(prevPath, latLngs)) {
- tbMap.map.setPolylineLatLngs(location.polyline, latLngs);
- locationChanged = true;
- }
- }
- } else if (latData.length > 0 && lngData.length > 0) {
- // Create or update marker
- lat = latData[latData.length - 1][1];
- lng = lngData[lngData.length - 1][1];
- if (angular.isDefined(lat) && lat != null && angular.isDefined(lng) && lng != null) {
- latLng = tbMap.map.createLatLng(lat, lng);
- if (createOrUpdateLocationMarker(location, latLng, dataMap)) {
- locationChanged = true;
- }
- }
- }
- if (location.marker) {
- updateLocationStyle(location, dataMap);
- }
-
- }
- return locationChanged;
- }
-
- function createUpdatePolygon(location, dataMap) {
- if (location.settings.showPolygon && dataMap.dsDataMap[location.dsIndex][location.settings.polygonKeyName] !== null) {
- let polygonLatLngsRaw = angular.fromJson(dataMap.dsDataMap[location.dsIndex][location.settings.polygonKeyName]);
- let polygonLatLngs = !polygonLatLngsRaw || mapPolygonArray(polygonLatLngsRaw);
- if (!location.polygon && polygonLatLngs.length > 0) {
- location.polygon = tbMap.map.createPolygon(polygonLatLngs, location.settings, location, function (event) {
- tbMap.callbacks.onLocationClick(location);
- locationPolygonClick(event, location);
- }, [location.dsIndex]);
- tbMap.polygons.push(location.polygon);
- if (location.settings.usePolygonColorFunction) updateLocationPolygonColor(location, calculateLocationPolygonColor(location, dataMap));
- } else if (polygonLatLngs.length > 0) {
- let prevPolygonArr = tbMap.map.getPolygonLatLngs(location.polygon);
- if (!prevPolygonArr || !arraysEqual(prevPolygonArr, polygonLatLngs)) {
- tbMap.map.setPolygonLatLngs(location.polygon, polygonLatLngs);
- }
- if (location.settings.usePolygonColorFunction) updateLocationPolygonColor(location, calculateLocationPolygonColor(location, dataMap));
- }
- }
- }
-
- function loadLocations(data, datasources) {
- var bounds = tbMap.locationSettings.useDefaultCenterPosition ? tbMap.map.createBounds().extend(tbMap.map.map.getCenter()) : tbMap.map.createBounds();
- tbMap.locations = [];
- var dataMap = toLabelValueMap(data, datasources);
- var currentDatasource = null;
- var currentDatasourceIndex = -1;
- var latIndex = -1;
- var lngIndex = -1;
- for (var i = 0; i < data.length; i++) {
- var dataKeyData = data[i];
- var dataKey = dataKeyData.dataKey;
- if (dataKeyData.datasource != currentDatasource) {
- currentDatasource = dataKeyData.datasource;
- currentDatasourceIndex++;
- latIndex = -1;
- lngIndex = -1;
- }
- var nameToCheck;
- if (dataKey.locationAttrName) {
- nameToCheck = dataKey.locationAttrName;
- } else {
- nameToCheck = dataKey.label;
- }
- if (nameToCheck === tbMap.locationSettings.latKeyName) {
- latIndex = i;
- } else if (nameToCheck === tbMap.locationSettings.lngKeyName) {
- lngIndex = i;
- }
- if (latIndex > -1 && lngIndex > -1) {
- var location = {
- latIndex: latIndex,
- lngIndex: lngIndex,
- dsIndex: currentDatasourceIndex,
- settings: angular.copy(tbMap.locationSettings)
- };
- if (location.settings.showLabel) {
- location.settings.label = tbMap.utils.createLabelFromDatasource(currentDatasource, location.settings.label);
- location.settings.labelReplaceInfo = processPattern(location.settings.label, datasources, currentDatasourceIndex);
- location.settings.labelText = location.settings.label;
- }
- if (location.settings.displayTooltip) {
- location.settings.tooltipPattern = tbMap.utils.createLabelFromDatasource(currentDatasource, location.settings.tooltipPattern);
- location.settings.tooltipReplaceInfo = processPattern(location.settings.tooltipPattern, datasources, currentDatasourceIndex);
- }
- location.settings.drraggable = tbMap.isEdit;
- tbMap.locations.push(location);
- updateLocation(location, data, dataMap);
- if (!tbMap.locationSettings.useDefaultCenterPosition) {
- if (location.polyline) {
- tbMap.map.extendBounds(bounds, location.polyline);
- } else if (location.marker) {
- tbMap.map.extendBoundsWithMarker(bounds, location.marker);
- }
- }
- latIndex = -1;
- lngIndex = -1;
- }
- }
- data.forEach(function (dataEl, index) {
- let nameToCheck;
- if (dataEl.dataKey.locationAttrName) {
- nameToCheck = dataEl.dataKey.locationAttrName;
- } else {
- nameToCheck = dataEl.dataKey.label;
- }
- if (nameToCheck === tbMap.locationSettings.polygonKeyName) {
- let location = {
- polIndex: index,
- settings: angular.copy(tbMap.locationSettings)
- };
- location.dsIndex = datasources.findIndex(function (ds) {
- return dataEl.datasource.entityId === ds.entityId;
- });
- tbMap.locations.push(location);
- createUpdatePolygon(location, dataMap);
- if (!tbMap.locationSettings.useDefaultCenterPosition) {
- tbMap.map.extendBounds(bounds, location.polygon);
- }
- }
- });
-
- tbMap.map.fitBounds(bounds, tbMap.isEdit && tbMap.markers.length === 1);
- }
-
- function mapPolygonArray (rawArray) {
- let latLngArray = rawArray.map(function (el) {
- if (el.length === 2) {
- if (!angular.isNumber(el[0]) && !angular.isNumber(el[1])) {
- return el.map(function (subEl) {
- return mapPolygonArray(subEl);
- })
- } else {
- return tbMap.map.createLatLng(el[0], el[1]);
- }
- } else if (el.length > 2) {
- return mapPolygonArray(el);
- } else {
- return tbMap.map.createLatLng(false);
- }
- });
- return latLngArray;
- }
-
- function updateLocations(data, datasources) {
- var locationsChanged = false;
- var bounds = tbMap.locationSettings.useDefaultCenterPosition ? tbMap.map.createBounds().extend(tbMap.map.map.getCenter()) : tbMap.map.createBounds();
- var dataMap = toLabelValueMap(data, datasources);
- for (var p = 0; p < tbMap.locations.length; p++) {
- var location = tbMap.locations[p];
- locationsChanged |= updateLocation(location, data, dataMap);
- createUpdatePolygon(location, dataMap);
- if (!tbMap.locationSettings.useDefaultCenterPosition) {
- if (location.polyline) {
- tbMap.map.extendBounds(bounds, location.polyline);
- } else if (location.marker) {
- tbMap.map.extendBoundsWithMarker(bounds, location.marker);
- } else if (location.polygon) {
- tbMap.map.extendBounds(bounds, location.polygon);
- }
- }
- }
- if (locationsChanged && tbMap.initBounds) {
- let dataReceived = datasources.every(
- function (ds) {
- return ds.dataReceived === true;
- });
- let dataValid = dataReceived && dataMap.dsDataMap.every(function (ds) {
- return !(!ds[tbMap.locationSettings.latKeyName] && !ds[tbMap.locationSettings.lngKeyName]);
- });
- tbMap.initBounds = !dataValid;
-
- if(!tbMap.isEdit && tbMap.markers.length !== 1 || tbMap.polylines || tbMap.polygons) {
- tbMap.map.fitBounds(bounds);
- }
- }
- }
-
- function createTooltipContent(tooltip, data, datasources) {
- var content;
- var settings = tooltip.locationSettings;
- if (settings.useTooltipFunction && settings.tooltipFunction) {
- var dataMap = toLabelValueMap(data, datasources);
- try {
- settings.tooltipPattern = settings.tooltipFunction(dataMap.dataMap, dataMap.dsDataMap, tooltip.dsIndex);
- } catch (e) {
- settings.tooltipPattern = null;
- }
- if (settings.tooltipPattern) {
- settings.tooltipPattern = tbMap.utils.createLabelFromDatasource(datasources[tooltip.dsIndex], settings.tooltipPattern);
- settings.tooltipReplaceInfo = processPattern(settings.tooltipPattern, datasources, tooltip.dsIndex);
- }
- }
- content = fillPattern(settings.tooltipPattern, settings.tooltipReplaceInfo, data);
- return fillPatternWithActions(content, 'onTooltipAction', tooltip.markerArgs);
- }
-
- if (this.map && this.map.inited() && this.subscription) {
- if (this.subscription.data) {
- if (!this.locations) {
- loadLocations(this.subscription.data, this.subscription.datasources);
-
- } else {
- updateLocations(this.subscription.data, this.subscription.datasources);
- }
- var tooltips = this.map.getTooltips();
- for (var t = 0; t < tooltips.length; t++) {
- var tooltip = tooltips[t];
- var text = createTooltipContent(tooltip, this.subscription.data, this.subscription.datasources);
- tooltip.popup.setContent(text);
- }
- }
- }
- }
-
- resize() {
- if (this.map && this.map.inited()) {
- let map = this.map;
- if (this.locations && this.locations.length > 0) {
- map.invalidateSize();
- var bounds = this.locationSettings.useDefaultCenterPosition ? map.createBounds().extend(map.map.getCenter()) : map.createBounds();
- if (!this.locationSettings.useDefaultCenterPosition) {
- if (this.markers && this.markers.length > 0) {
- this.markers.forEach(function (marker) {
- map.extendBoundsWithMarker(bounds, marker);
- });
- }
- if (this.polylines && this.polylines.length > 0) {
- this.polylines.forEach(function (polyline) {
- map.extendBounds(bounds, polyline);
- })
- }
- if (this.polygons && this.polygons.length > 0) {
- this.polygons.forEach(function (polygon) {
- map.extendBounds(bounds, polygon);
- })
- }
- }
- if((!map.isEdit && map.markers && map.markers.length !== 1) ||
- (this.polylines && this.polylines.length > 0) ||
- (this.polygons && this.polygons.length > 0)) {
- map.fitBounds(bounds);
- }
- }
- }
- }
-
- static settingsSchema(mapProvider, drawRoutes) {
- var schema;
- if (mapProvider === 'google-map') {
- schema = angular.copy(googleMapSettingsSchema);
- schema.groupInfoes=[{
- "formIndex":0,
- "GroupTitle":"Google Map Settings"
- }];
- } else if (mapProvider === 'openstreet-map') {
- schema = angular.copy(openstreetMapSettingsSchema);
- schema.groupInfoes=[{
- "formIndex":0,
- "GroupTitle":"Openstreet Map Settings"
- }];
- } else if (mapProvider === 'image-map') {
- return imageMapSettingsSchema;
- } else if (mapProvider === 'tencent-map') {
- schema = angular.copy(tencentMapSettingsSchema);
- schema.groupInfoes=[{
- "formIndex":0,
- "GroupTitle":"Tencent Map Settings"
- }];
- } else if (mapProvider === 'here') {
- schema = angular.copy(hereMapSettingsSchema);
- schema.groupInfoes=[{
- "formIndex":0,
- "GroupTitle":"Here Map Settings"
- }];
- }
- if(!schema.groupInfoes)schema.groupInfoes=[];
- schema.form = [schema.form];
-
- angular.merge(schema.schema.properties, commonMapSettingsSchema.schema.properties);
- schema.schema.required = schema.schema.required.concat(commonMapSettingsSchema.schema.required);
- schema.form.push(commonMapSettingsSchema.form);//schema.form.concat(commonMapSettingsSchema.form);
- schema.groupInfoes.push({
- "formIndex":schema.groupInfoes.length,
- "GroupTitle":"Common Map Settings"
- });
- if (drawRoutes) {
- angular.merge(schema.schema.properties, routeMapSettingsSchema.schema.properties);
- schema.schema.required = schema.schema.required.concat(routeMapSettingsSchema.schema.required);
- schema.form.push(routeMapSettingsSchema.form);//schema.form = schema.form.concat(routeMapSettingsSchema.form);
- schema.groupInfoes.push({
- "formIndex":schema.groupInfoes.length,
- "GroupTitle":"Route Map Settings"
- });
- } else if (mapProvider !== 'image-map'){
- angular.merge(schema.schema.properties, markerClusteringSettingsSchema.schema.properties);
- schema.schema.required = schema.schema.required.concat(markerClusteringSettingsSchema.schema.required);
- schema.form.push(markerClusteringSettingsSchema.form);
- if (mapProvider === 'google-map' || mapProvider === 'tencent-map') {
- angular.merge(schema.schema.properties, markerClusteringSettingsSchemaGoogle.schema.properties);
- schema.schema.required = schema.schema.required.concat(markerClusteringSettingsSchemaGoogle.schema.required);
- schema.form[schema.form.length -1] = schema.form[schema.form.length -1].concat(markerClusteringSettingsSchemaGoogle.form);
- }
- if (mapProvider === 'openstreet-map' || mapProvider === 'here') {
- angular.merge(schema.schema.properties, markerClusteringSettingsSchemaLeaflet.schema.properties);
- schema.schema.required = schema.schema.required.concat(markerClusteringSettingsSchemaLeaflet.schema.required);
- schema.form[schema.form.length -1] = schema.form[schema.form.length -1].concat(markerClusteringSettingsSchemaLeaflet.form);
- }
- schema.groupInfoes.push({
- "formIndex":schema.groupInfoes.length,
- "GroupTitle":"Markers Clustering Settings"
- });
- }
- return schema;
- }
-
- static dataKeySettingsSchema(/*mapProvider*/) {
- return {};
- }
-
- static actionSources() {
- return {
- 'markerClick': {
- name: 'widget-action.marker-click',
- multiple: false
- },
- 'polygonClick': {
- name: 'widget-action.polygon-click',
- multiple: false
- },
- 'tooltipAction': {
- name: 'widget-action.tooltip-tag-action',
- multiple: true
- }
- };
- }
-
-}
-
-const googleMapSettingsSchema =
- {
- "schema": {
- "title": "Google Map Configuration",
- "type": "object",
- "properties": {
- "gmApiKey": {
- "title": "Google Maps API Key",
- "type": "string"
- },
- "gmDefaultMapType": {
- "title": "Default map type",
- "type": "string",
- "default": "roadmap"
- }
- },
- "required": [
- "gmApiKey"
- ]
- },
- "form": [
- "gmApiKey",
- {
- "key": "gmDefaultMapType",
- "type": "rc-select",
- "multiple": false,
- "items": [
- {
- "value": "roadmap",
- "label": "Roadmap"
- },
- {
- "value": "satellite",
- "label": "Satellite"
- },
- {
- "value": "hybrid",
- "label": "Hybrid"
- },
- {
- "value": "terrain",
- "label": "Terrain"
- }
- ]
- }
- ]
- };
-
-const tencentMapSettingsSchema =
- {
- "schema": {
- "title": "Tencent Map Configuration",
- "type": "object",
- "properties": {
- "tmApiKey": {
- "title": "Tencent Maps API Key",
- "type": "string"
- },
- "tmDefaultMapType": {
- "title": "Default map type",
- "type": "string",
- "default": "roadmap"
- }
- },
- "required": [
- "tmApiKey"
- ]
- },
- "form": [
- "tmApiKey",
- {
- "key": "tmDefaultMapType",
- "type": "rc-select",
- "multiple": false,
- "items": [
- {
- "value": "roadmap",
- "label": "Roadmap"
- },
- {
- "value": "satellite",
- "label": "Satellite"
- },
- {
- "value": "hybrid",
- "label": "Hybrid"
- },
- ]
- }
- ]
- };
-
-const hereMapSettingsSchema =
- {
- "schema": {
- "title": "HERE Map Configuration",
- "type": "object",
- "properties": {
- "mapProvider": {
- "title": "Map layer",
- "type": "string",
- "default": "HERE.normalDay"
- },
- "credentials":{
- "type": "object",
- "properties": {
- "app_id": {
- "title": "HERE app id",
- "type": "string"
- },
- "app_code": {
- "title": "HERE app code",
- "type": "string"
- }
- },
- "required": ["app_id", "app_code"]
- }
- },
- "required": []
- },
- "form": [
- {
- "key": "mapProvider",
- "type": "rc-select",
- "multiple": false,
- "items": [
- {
- "value": "HERE.normalDay",
- "label": "HERE.normalDay (Default)"
- },
- {
- "value": "HERE.normalNight",
- "label": "HERE.normalNight"
- },
- {
- "value": "HERE.hybridDay",
- "label": "HERE.hybridDay"
- },
- {
- "value": "HERE.terrainDay",
- "label": "HERE.terrainDay"
- }
- ]
- },
- "credentials"
- ]
- };
-
-const openstreetMapSettingsSchema =
- {
- "schema": {
- "title": "Openstreet Map Configuration",
- "type": "object",
- "properties": {
- "mapProvider": {
- "title": "Map provider",
- "type": "string",
- "default": "OpenStreetMap.Mapnik"
- },
- "useCustomProvider": {
- "title": "Use custom provider",
- "type": "boolean",
- "default": false
- },
- "customProviderTileUrl": {
- "title": "Custom provider tile URL",
- "type": "string",
- "default": "https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png"
- }
- },
- "required": []
- },
- "form": [
- {
- "key": "mapProvider",
- "type": "rc-select",
- "multiple": false,
- "items": [
- {
- "value": "OpenStreetMap.Mapnik",
- "label": "OpenStreetMap.Mapnik (Default)"
- },
- {
- "value": "OpenStreetMap.BlackAndWhite",
- "label": "OpenStreetMap.BlackAndWhite"
- },
- {
- "value": "OpenStreetMap.HOT",
- "label": "OpenStreetMap.HOT"
- },
- {
- "value": "Esri.WorldStreetMap",
- "label": "Esri.WorldStreetMap"
- },
- {
- "value": "Esri.WorldTopoMap",
- "label": "Esri.WorldTopoMap"
- },
- {
- "value": "CartoDB.Positron",
- "label": "CartoDB.Positron"
- },
- {
- "value": "CartoDB.DarkMatter",
- "label": "CartoDB.DarkMatter"
- }
- ]
- },
- "useCustomProvider",
- "customProviderTileUrl"
- ]
- };
-
-const commonMapSettingsSchema =
- {
- "schema": {
- "title": "Map Configuration",
- "type": "object",
- "properties": {
- "defaultZoomLevel": {
- "title": "Default map zoom level (0 - 20)",
- "type": "number"
- },
- "useDefaultCenterPosition": {
- "title": "Use default map center position",
- "type": "boolean",
- "default": false
- },
- "defaultCenterPosition": {
- "title": "Default map center position (0,0)",
- "type": "string",
- "default" : "0,0"
- },
- "fitMapBounds": {
- "title": "Fit map bounds to cover all markers",
- "type": "boolean",
- "default": true
- },
- "disableScrollZooming": {
- "title": "Disable scroll zooming",
- "type": "boolean",
- "default": false
- },
- "latKeyName": {
- "title": "Latitude key name",
- "type": "string",
- "default": "latitude"
- },
- "lngKeyName": {
- "title": "Longitude key name",
- "type": "string",
- "default": "longitude"
- },
- "showLabel": {
- "title": "Show label",
- "type": "boolean",
- "default": true
- },
- "label": {
- "title": "Label (pattern examples: '${entityName}', '${entityName}: (Text ${keyName} units.)' )",
- "type": "string",
- "default": "${entityName}"
- },
- "useLabelFunction": {
- "title": "Use label function",
- "type": "boolean",
- "default": false
- },
- "labelFunction": {
- "title": "Label function: f(data, dsData, dsIndex)",
- "type": "string"
- },
- "showTooltip": {
- "title": "Show tooltip",
- "type": "boolean",
- "default": true
- },
- "showTooltipAction": {
- "title": "Action for displaying the tooltip",
- "type": "string",
- "default": "click"
- },
- "autocloseTooltip": {
- "title": "Auto-close tooltips",
- "type": "boolean",
- "default": true
- },
- "tooltipPattern": {
- "title": "Tooltip (for ex. 'Text ${keyName} units.' or Link text')",
- "type": "string",
- "default": "${entityName}
Latitude: ${latitude:7}
Longitude: ${longitude:7}"
- },
- "useTooltipFunction": {
- "title": "Use tooltip function",
- "type": "boolean",
- "default": false
- },
- "tooltipFunction": {
- "title": "Tooltip function: f(data, dsData, dsIndex)",
- "type": "string"
- },
- "color": {
- "title": "Color",
- "type": "string"
- },
- "useColorFunction": {
- "title": "Use color function",
- "type": "boolean",
- "default": false
- },
- "colorFunction": {
- "title": "Color function: f(data, dsData, dsIndex)",
- "type": "string"
- },
- "showPolygon": {
- "title": "Show polygon",
- "type": "boolean",
- "default": false
- },
- "polygonKeyName": {
- "title": "Polygon key name",
- "type": "string",
- "default": "coordinates"
- },
- "polygonColor": {
- "title": "Polygon color",
- "type": "string"
- },
- "polygonOpacity": {
- "title": "Polygon opacity",
- "type": "number",
- "default": 0.5
- },
- "polygonStrokeColor": {
- "title": "Stroke color",
- "type": "string"
- },
- "polygonStrokeOpacity": {
- "title": "Stroke opacity",
- "type": "number",
- "default": 1
- },
- "polygonStrokeWeight": {
- "title": "Stroke weight",
- "type": "number",
- "default": 1
- },
- "usePolygonColorFunction": {
- "title": "Use polygon color function",
- "type": "boolean",
- "default": false
- },
- "polygonColorFunction": {
- "title": "Polygon Color function: f(data, dsData, dsIndex)",
- "type": "string"
- },
- "markerImage": {
- "title": "Custom marker image",
- "type": "string"
- },
- "markerImageSize": {
- "title": "Custom marker image size (px)",
- "type": "number",
- "default": 34
- },
- "useMarkerImageFunction": {
- "title": "Use marker image function",
- "type": "boolean",
- "default": false
- },
- "markerImageFunction": {
- "title": "Marker image function: f(data, images, dsData, dsIndex)",
- "type": "string"
- },
- "markerImages": {
- "title": "Marker images",
- "type": "array",
- "items": {
- "title": "Marker image",
- "type": "string"
- }
- }
- },
- "required": []
- },
- "form": [
- "defaultZoomLevel",
- "useDefaultCenterPosition",
- "defaultCenterPosition",
- "fitMapBounds",
- "disableScrollZooming",
- "latKeyName",
- "lngKeyName",
- "showLabel",
- "label",
- "useLabelFunction",
- {
- "key": "labelFunction",
- "type": "javascript"
- },
- "showTooltip",
- {
- "key": "showTooltipAction",
- "type": "rc-select",
- "multiple": false,
- "items": [
- {
- "value": "click",
- "label": "Show tooltip on click (Default)"
- },
- {
- "value": "hover",
- "label": "Show tooltip on hover"
- }
- ]
- },
- "autocloseTooltip",
- {
- "key": "tooltipPattern",
- "type": "textarea"
- },
- "useTooltipFunction",
- {
- "key": "tooltipFunction",
- "type": "javascript"
- },
- {
- "key": "color",
- "type": "color"
- },
- "useColorFunction",
- {
- "key": "colorFunction",
- "type": "javascript"
- }, "showPolygon", "polygonKeyName",
- {
- "key": "polygonColor",
- "type": "color"
- },
- "polygonOpacity",
- {
- "key": "polygonStrokeColor",
- "type": "color"
- },
- "polygonStrokeOpacity","polygonStrokeWeight","usePolygonColorFunction",
- {
- "key": "polygonColorFunction",
- "type": "javascript"
- },
- {
- "key": "markerImage",
- "type": "image"
- },
- "markerImageSize",
- "useMarkerImageFunction",
- {
- "key": "markerImageFunction",
- "type": "javascript"
- },
- {
- "key": "markerImages",
- "items": [
- {
- "key": "markerImages[]",
- "type": "image"
- }
- ]
- }
- ]
- };
-
-const routeMapSettingsSchema =
- {
- "schema": {
- "title": "Route Map Configuration",
- "type": "object",
- "properties": {
- "strokeWeight": {
- "title": "Stroke weight",
- "type": "number",
- "default": 2
- },
- "strokeOpacity": {
- "title": "Stroke opacity",
- "type": "number",
- "default": 1.0
- }
- },
- "required": []
- },
- "form": [
- "strokeWeight",
- "strokeOpacity"
- ]
- };
-
-const markerClusteringSettingsSchema =
- {
- "schema": {
- "title": "Markers Clustering Configuration",
- "type": "object",
- "properties": {
- "useClusterMarkers": {
- "title": "Use map markers clustering",
- "type": "boolean",
- "default": false
- },
- "zoomOnClick": {
- "title": "Zoom when clicking on a cluster",
- "type": "boolean",
- "default": true
- },
- "maxZoom": {
- "title": "The maximum zoom level when a marker can be part of a cluster (0 - 18)",
- "type": "number"
- }
- },
- "required": []
- },
- "form": [
- "useClusterMarkers",
- "zoomOnClick",
- "maxZoom"
- ]
- };
-
-const markerClusteringSettingsSchemaGoogle =
- {
- "schema": {
- "title": "Marker Clustering Configuration Google",
- "type": "object",
- "properties": {
- "gridSize": {
- "title": "Maximum radius that a cluster will cover in pixels",
- "type": "number",
- "default": 60
- },
- "minimumClusterSize": {
- "title": "The minimum number of markers in a cluster",
- "type": "number"
- }
- },
- "required": []
- },
- "form": [
- "gridSize",
- "minimumClusterSize"
- ]
- };
-
-const markerClusteringSettingsSchemaLeaflet =
- {
- "schema": {
- "title": "Markers Clustering Configuration Leaflet",
- "type": "object",
- "properties": {
- "showCoverageOnHover": {
- "title": "Show the bounds of markers when mouse over a cluster",
- "type": "boolean",
- "default": true
- },
- "animate": {
- "title": "Show animation on markers when zooming",
- "type": "boolean",
- "default": true
- },
- "maxClusterRadius": {
- "title": "Maximum radius that a cluster will cover in pixels",
- "type": "number",
- "default": 80
- },
- "chunkedLoading": {
- "title": "Use chunks for adding markers so that the page does not freeze",
- "type": "boolean",
- "default": false
- },
- "removeOutsideVisibleBounds": {
- "title": "Use lazy load for adding markers",
- "type": "boolean",
- "default": true
- }
- },
- "required": []
- },
- "form": [
- "showCoverageOnHover",
- "animate",
- "maxClusterRadius",
- "chunkedLoading",
- "removeOutsideVisibleBounds"
- ]
- };
-
-const imageMapSettingsSchema =
- {
- "schema": {
- "title": "Image Map Configuration",
- "type": "object",
- "properties": {
- "mapImageUrl": {
- "title": "Image map background",
- "type": "string",
- "default": "data:image/svg+xml;base64,PHN2ZyBpZD0ic3ZnMiIgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMTAwIiB3aWR0aD0iMTAwIiB2ZXJzaW9uPSIxLjEiIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgdmlld0JveD0iMCAwIDEwMCAxMDAiPgogPGcgaWQ9ImxheWVyMSIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCAtOTUyLjM2KSI+CiAgPHJlY3QgaWQ9InJlY3Q0Njg0IiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBoZWlnaHQ9Ijk5LjAxIiB3aWR0aD0iOTkuMDEiIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiB5PSI5NTIuODYiIHg9Ii40OTUwNSIgc3Ryb2tlLXdpZHRoPSIuOTkwMTAiIGZpbGw9IiNlZWUiLz4KICA8dGV4dCBpZD0idGV4dDQ2ODYiIHN0eWxlPSJ3b3JkLXNwYWNpbmc6MHB4O2xldHRlci1zcGFjaW5nOjBweDt0ZXh0LWFuY2hvcjptaWRkbGU7dGV4dC1hbGlnbjpjZW50ZXIiIGZvbnQtd2VpZ2h0PSJib2xkIiB4bWw6c3BhY2U9InByZXNlcnZlIiBmb250LXNpemU9IjEwcHgiIGxpbmUtaGVpZ2h0PSIxMjUlIiB5PSI5NzAuNzI4MDkiIHg9IjQ5LjM5NjQ3NyIgZm9udC1mYW1pbHk9IlJvYm90byIgZmlsbD0iIzY2NjY2NiI+PHRzcGFuIGlkPSJ0c3BhbjQ2OTAiIHg9IjUwLjY0NjQ3NyIgeT0iOTcwLjcyODA5Ij5JbWFnZSBiYWNrZ3JvdW5kIDwvdHNwYW4+PHRzcGFuIGlkPSJ0c3BhbjQ2OTIiIHg9IjQ5LjM5NjQ3NyIgeT0iOTgzLjIyODA5Ij5pcyBub3QgY29uZmlndXJlZDwvdHNwYW4+PC90ZXh0PgogIDxyZWN0IGlkPSJyZWN0NDY5NCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgaGVpZ2h0PSIxOS4zNiIgd2lkdGg9IjY5LjM2IiBzdHJva2U9IiMwMDAiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgeT0iOTkyLjY4IiB4PSIxNS4zMiIgc3Ryb2tlLXdpZHRoPSIuNjM5ODYiIGZpbGw9Im5vbmUiLz4KIDwvZz4KPC9zdmc+Cg=="
- },
- "imageEntityAlias": {
- "title": "Image URL source entity alias",
- "type": "string",
- "default": ""
- },
- "imageUrlAttribute": {
- "title": "Image URL source entity attribute",
- "type": "string",
- "default": ""
- },
- "disableScrollZooming": {
- "title": "Disable scroll zooming",
- "type": "boolean",
- "default": false
- },
- "xPosKeyName": {
- "title": "X position key name",
- "type": "string",
- "default": "xPos"
- },
- "yPosKeyName": {
- "title": "Y position key name",
- "type": "string",
- "default": "yPos"
- },
- "showLabel": {
- "title": "Show label",
- "type": "boolean",
- "default": true
- },
- "label": {
- "title": "Label (pattern examples: '${entityName}', '${entityName}: (Text ${keyName} units.)' )",
- "type": "string",
- "default": "${entityName}"
- },
- "useLabelFunction": {
- "title": "Use label function",
- "type": "boolean",
- "default": false
- },
- "labelFunction": {
- "title": "Label function: f(data, dsData, dsIndex)",
- "type": "string"
- },
- "showTooltip": {
- "title": "Show tooltip",
- "type": "boolean",
- "default": true
- },
- "showTooltipAction": {
- "title": "Action for displaying the tooltip",
- "type": "string",
- "default": "click"
- },
- "autocloseTooltip": {
- "title": "Auto-close tooltips",
- "type": "boolean",
- "default": true
- },
- "tooltipPattern": {
- "title": "Tooltip (for ex. 'Text ${keyName} units.' or Link text')",
- "type": "string",
- "default": "${entityName}
X Pos: ${xPos:2}
Y Pos: ${yPos:2}"
- },
- "useTooltipFunction": {
- "title": "Use tooltip function",
- "type": "boolean",
- "default": false
- },
- "tooltipFunction": {
- "title": "Tooltip function: f(data, dsData, dsIndex)",
- "type": "string"
- },
- "color": {
- "title": "Color",
- "type": "string"
- },
- "posFunction": {
- "title": "Position conversion function: f(origXPos, origYPos), should return x,y coordinates as double from 0 to 1 each",
- "type": "string",
- "default": "return {x: origXPos, y: origYPos};"
- },
- "markerOffsetX": {
- "title": "Marker X offset relative to position",
- "type": "number",
- "default": 0.5
- },
- "markerOffsetY": {
- "title": "Marker Y offset relative to position",
- "type": "number",
- "default": 1
- },
- "useColorFunction": {
- "title": "Use color function",
- "type": "boolean",
- "default": false
- },
- "colorFunction": {
- "title": "Color function: f(data, dsData, dsIndex)",
- "type": "string"
- },
- "markerImage": {
- "title": "Custom marker image",
- "type": "string"
- },
- "markerImageSize": {
- "title": "Custom marker image size (px)",
- "type": "number",
- "default": 34
- },
- "useMarkerImageFunction": {
- "title": "Use marker image function",
- "type": "boolean",
- "default": false
- },
- "markerImageFunction": {
- "title": "Marker image function: f(data, images, dsData, dsIndex)",
- "type": "string"
- },
- "markerImages": {
- "title": "Marker images",
- "type": "array",
- "items": {
- "title": "Marker image",
- "type": "string"
- }
- }
- },
- "required": []
- },
- "form": [
- {
- "key": "mapImageUrl",
- "type": "image"
- },
- "imageEntityAlias",
- "imageUrlAttribute",
- "disableScrollZooming",
- "xPosKeyName",
- "yPosKeyName",
- "showLabel",
- "label",
- "useLabelFunction",
- {
- "key": "labelFunction",
- "type": "javascript"
- },
- "showTooltip",
- {
- "key": "showTooltipAction",
- "type": "rc-select",
- "multiple": false,
- "items": [
- {
- "value": "click",
- "label": "Show tooltip on click (Default)"
- },
- {
- "value": "hover",
- "label": "Show tooltip on hover"
- }
- ]
- },
- "autocloseTooltip",
- {
- "key": "tooltipPattern",
- "type": "textarea"
- },
- "useTooltipFunction",
- {
- "key": "tooltipFunction",
- "type": "javascript"
- },
- {
- "key": "color",
- "type": "color"
- },
- {
- "key": "posFunction",
- "type": "javascript"
- },
- "markerOffsetX",
- "markerOffsetY",
- "useColorFunction",
- {
- "key": "colorFunction",
- "type": "javascript"
- },
- {
- "key": "markerImage",
- "type": "image"
- },
- "markerImageSize",
- "useMarkerImageFunction",
- {
- "key": "markerImageFunction",
- "type": "javascript"
- },
- {
- "key": "markerImages",
- "items": [
- {
- "key": "markerImages[]",
- "type": "image"
- }
- ]
- }
- ]
- };
-
-/*@ngInject*/
-function addEntityPanelController(mdPanelRef, entities) {
- var vm = this;
- vm.entities = entities;
- vm.selectEntity = selectEntity;
-
- function selectEntity(entity) {
- mdPanelRef.close().then(() => {
- this.onClose(entity);
- });
- }
-}
diff --git a/ui/src/app/widget/lib/multiple-input-widget.js b/ui/src/app/widget/lib/multiple-input-widget.js
deleted file mode 100644
index 9d93b8f993..0000000000
--- a/ui/src/app/widget/lib/multiple-input-widget.js
+++ /dev/null
@@ -1,344 +0,0 @@
-/*
- * Copyright © 2016-2020 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 './multiple-input-widget.scss';
-
-/* eslint-disable import/no-unresolved, import/default */
-
-import multipleInputWidgetTemplate from './multiple-input-widget.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-export default angular.module('thingsboard.widgets.multipleInputWidget', [])
- .directive('tbMultipleInputWidget', MultipleInputWidget)
- .name;
-
-/*@ngInject*/
-function MultipleInputWidget() {
- return {
- restrict: "E",
- scope: true,
- bindToController: {
- formId: '=',
- ctx: '='
- },
- controller: MultipleInputWidgetController,
- controllerAs: 'vm',
- templateUrl: multipleInputWidgetTemplate
- };
-}
-
-/*@ngInject*/
-function MultipleInputWidgetController($q, $scope, $translate, attributeService, toast, types, utils) {
- var vm = this;
-
- vm.entityDetected = false;
- vm.isAllParametersValid = true;
-
- vm.sources = [];
- vm.datasources = null;
-
- vm.discardAll = discardAll;
- vm.inputChanged = inputChanged;
- vm.save = save;
- vm.getGroupTitle = getGroupTitle;
-
- $scope.$watch('vm.ctx', function () {
- if (vm.ctx && vm.ctx.defaultSubscription) {
- vm.settings = vm.ctx.settings;
- vm.widgetConfig = vm.ctx.widgetConfig;
- vm.subscription = vm.ctx.defaultSubscription;
- vm.datasources = vm.subscription.datasources;
- initializeConfig();
- updateDatasources();
- }
- });
-
- $scope.$on('multiple-input-data-updated', function (event, formId) {
- if (vm.formId == formId) {
- updateWidgetData(vm.subscription.data);
- $scope.$digest();
- }
- });
-
- $scope.$on('multiple-input-resize', function (event, formId) {
- if (vm.formId == formId) {
- updateWidgetDisplaying();
- }
- });
-
- function discardAll() {
- for (var i = 0; i < vm.sources.length; i++) {
- for (var j = 0; j < vm.sources[i].keys.length; j++) {
- vm.sources[i].keys[j].data.currentValue = vm.sources[i].keys[j].data.originalValue;
- }
- }
- $scope.multipleInputForm.$setPristine();
- }
-
- function inputChanged(source, key) {
- if (!vm.settings.showActionButtons) {
- if (!key.settings.required || (key.settings.required && key.data && angular.isDefined(key.data.currentValue))) {
- var dataToSave = {
- datasource: source.datasource,
- keys: [key]
- };
- vm.save(dataToSave);
- }
- }
- }
-
- function save(dataToSave) {
- var tasks = [];
- var config = {
- ignoreLoading: !vm.settings.showActionButtons
- };
- var data;
- if (dataToSave) {
- data = [dataToSave];
- } else {
- data = vm.sources;
- }
- for (let i = 0; i < data.length; i++) {
- var serverAttributes = [], sharedAttributes = [], telemetry = [];
- for (let j = 0; j < data[i].keys.length; j++) {
- var key = data[i].keys[j];
- if ((key.data.currentValue !== key.data.originalValue) || vm.settings.updateAllValues) {
- var attribute = {
- key: key.name
- };
- if (key.data.currentValue) {
- switch (key.settings.dataKeyValueType) {
- case 'dateTime':
- case 'date':
- attribute.value = key.data.currentValue.getTime();
- break;
- case 'time':
- attribute.value = key.data.currentValue.getTime() - moment().startOf('day').valueOf();//eslint-disable-line
- break;
- default:
- attribute.value = key.data.currentValue;
- }
- } else {
- if (key.data.currentValue === '') {
- attribute.value = null;
- } else {
- attribute.value = key.data.currentValue;
- }
- }
-
- switch (key.settings.dataKeyType) {
- case 'shared':
- sharedAttributes.push(attribute);
- break;
- case 'timeseries':
- telemetry.push(attribute);
- break;
- default:
- serverAttributes.push(attribute);
- }
- }
- }
- if (serverAttributes.length) {
- tasks.push(attributeService.saveEntityAttributes(
- data[i].datasource.entityType,
- data[i].datasource.entityId,
- types.attributesScope.server.value,
- serverAttributes,
- config));
- }
- if (sharedAttributes.length) {
- tasks.push(attributeService.saveEntityAttributes(
- data[i].datasource.entityType,
- data[i].datasource.entityId,
- types.attributesScope.shared.value,
- sharedAttributes,
- config));
- }
- if (telemetry.length) {
- tasks.push(attributeService.saveEntityTimeseries(
- data[i].datasource.entityType,
- data[i].datasource.entityId,
- types.latestTelemetry.value,
- telemetry,
- config));
- }
- }
-
- if (tasks.length) {
- $q.all(tasks).then(
- function success() {
- $scope.multipleInputForm.$setPristine();
- if (vm.settings.showResultMessage) {
- toast.showSuccess($translate.instant('widgets.input-widgets.update-successful'), 1000, angular.element(vm.ctx.$container), 'bottom left');
- }
- },
- function fail() {
- if (vm.settings.showResultMessage) {
- toast.showError($translate.instant('widgets.input-widgets.update-failed'), angular.element(vm.ctx.$container), 'bottom left');
- }
- }
- );
- } else {
- $scope.multipleInputForm.$setPristine();
- }
- }
-
- function initializeConfig() {
-
- if (vm.settings.widgetTitle && vm.settings.widgetTitle.length) {
- vm.widgetTitle = utils.customTranslation(vm.settings.widgetTitle, vm.settings.widgetTitle);
- } else {
- vm.widgetTitle = vm.ctx.widgetConfig.title;
- }
-
- vm.ctx.widgetTitle = vm.widgetTitle;
-
- vm.settings.groupTitle = vm.settings.groupTitle || "${entityName}";
-
- //For backward compatibility
- if (angular.isUndefined(vm.settings.showActionButtons)) {
- vm.settings.showActionButtons = true;
- }
- if (angular.isUndefined(vm.settings.fieldsAlignment)) {
- vm.settings.fieldsAlignment = 'row';
- }
- if (angular.isUndefined(vm.settings.fieldsInRow)) {
- vm.settings.fieldsInRow = 2;
- }
- //For backward compatibility
-
- vm.isVerticalAlignment = !(vm.settings.fieldsAlignment === 'row');
-
- if (!vm.isVerticalAlignment && vm.settings.fieldsInRow) {
- vm.inputWidthSettings = 100 / vm.settings.fieldsInRow + '%';
- }
- updateWidgetDisplaying();
- }
-
- function updateDatasources() {
- if (vm.datasources && vm.datasources.length) {
- vm.entityDetected = true;
- for (var i = 0; i < vm.datasources.length; i++) {
- var datasource = vm.datasources[i];
- var source = {
- datasource: datasource,
- keys: []
- };
- if (datasource.type === types.datasourceType.entity) {
- for (var j = 0; j < datasource.dataKeys.length; j++) {
- if ((datasource.entityType !== types.entityType.device) && (datasource.dataKeys[j].settings.dataKeyType == 'shared')) {
- vm.isAllParametersValid = false;
- }
- source.keys.push(datasource.dataKeys[j]);
- if (source.keys[j].units) {
- source.keys[j].label += ' (' + source.keys[j].units + ')';
- }
- source.keys[j].data = {};
-
- //For backward compatibility
- if (angular.isUndefined(source.keys[j].settings.dataKeyType)) {
- if (vm.settings.attributesShared) {
- source.keys[j].settings.dataKeyType = 'shared';
- } else {
- source.keys[j].settings.dataKeyType = 'server';
- }
- }
-
- if (angular.isUndefined(source.keys[j].settings.dataKeyValueType)) {
- if (source.keys[j].settings.inputTypeNumber) {
- source.keys[j].settings.dataKeyValueType = 'double';
- } else {
- source.keys[j].settings.dataKeyValueType = 'string';
- }
- }
-
- if (angular.isUndefined(source.keys[j].settings.isEditable)) {
- if (source.keys[j].settings.readOnly) {
- source.keys[j].settings.isEditable = 'readonly';
- } else {
- source.keys[j].settings.isEditable = 'editable';
- }
- }
- //For backward compatibility
-
- }
- } else {
- vm.entityDetected = false;
- }
- vm.sources.push(source);
- }
- }
- }
-
- function updateWidgetData(data) {
- var dataIndex = 0;
- for (var i = 0; i < vm.sources.length; i++) {
- var source = vm.sources[i];
- for (var j = 0; j < source.keys.length; j++) {
- var keyData = data[dataIndex].data;
- var key = source.keys[j];
- if (keyData && keyData.length) {
- var value;
- switch (key.settings.dataKeyValueType) {
- case 'dateTime':
- case 'date':
- value = moment(keyData[0][1]).toDate(); // eslint-disable-line
- break;
- case 'time':
- value = moment().startOf('day').add(keyData[0][1], 'ms').toDate(); // eslint-disable-line
- break;
- case 'booleanCheckbox':
- case 'booleanSwitch':
- value = (keyData[0][1] === 'true');
- break;
- default:
- value = keyData[0][1];
- }
-
- key.data = {
- currentValue: value,
- originalValue: value
- };
- }
-
- if (key.settings.isEditable === 'editable' && key.settings.disabledOnDataKey) {
- var conditions = data.filter((item) => {
- return item.dataKey.name === key.settings.disabledOnDataKey;
- });
- if (conditions && conditions.length) {
- if (conditions[0].data.length) {
- if (conditions[0].data[0][1] === 'false') {
- key.settings.disabledOnCondition = true;
- } else {
- key.settings.disabledOnCondition = !conditions[0].data[0][1];
- }
- }
- }
- }
- dataIndex++;
- }
- }
- }
-
- function updateWidgetDisplaying() {
- vm.changeAlignment = (vm.ctx.$container[0].offsetWidth < 620);
- vm.smallWidthContainer = (vm.ctx.$container[0].offsetWidth < 420);
- }
-
- function getGroupTitle(datasource) {
- return utils.createLabelFromDatasource(datasource, vm.settings.groupTitle);
- }
-}
diff --git a/ui/src/app/widget/lib/multiple-input-widget.scss b/ui/src/app/widget/lib/multiple-input-widget.scss
deleted file mode 100644
index e16922b103..0000000000
--- a/ui/src/app/widget/lib/multiple-input-widget.scss
+++ /dev/null
@@ -1,115 +0,0 @@
-/**
- * Copyright © 2016-2020 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-multiple-input {
- height: 100%;
- overflow-x: hidden;
- overflow-y: auto;
-
- .fields-group {
- padding: 0 8px;
- margin: 10px 0;
- border: 1px groove rgba(0, 0, 0, .25);
-
- legend {
- color: rgba(0, 0, 0, .7);
- }
- }
-
- .input-field {
- padding-right: 10px;
-
- md-input-container,
- md-checkbox,
- md-switch {
- margin-bottom: 5px;
- }
- }
-
- md-checkbox {
- margin-top: 22px;
- }
-
- md-switch {
- margin-top: 20px;
- white-space: normal;
- }
-
- .md-icon-button md-icon {
- width: 20px;
- min-width: 20px;
- height: 20px;
- min-height: 20px;
- font-size: 20px;
- }
-
- .date-time-input {
- &__label {
- margin-left: 36px;
- font-size: 12px;
- color: rgba(0, 0, 0, .54);
- }
-
- mdp-date-picker,
- mdp-time-picker {
- width: 100%;
-
- .md-button.md-icon-button {
- margin: 5px 0 0;
- }
-
- md-input-container {
- width: 100%;
- margin: 2px 0;
-
- label {
- display: none;
- }
- }
- }
- }
-
- .vertical-alignment {
- flex-direction: column;
-
- md-checkbox,
- md-switch {
- margin-top: 18px;
- }
-
- md-switch {
- display: flex;
- justify-content: space-between;
- }
-
- .date-time-input {
- &__label {
- margin-top: 10px;
- }
- }
- }
-
- .vertically-aligned {
- flex-direction: column;
- }
-}
-
-md-toast {
- min-width: 0;
-
- .md-toast-content {
- font-size: 14px !important;
- }
-}
diff --git a/ui/src/app/widget/lib/multiple-input-widget.tpl.html b/ui/src/app/widget/lib/multiple-input-widget.tpl.html
deleted file mode 100644
index a1c903108b..0000000000
--- a/ui/src/app/widget/lib/multiple-input-widget.tpl.html
+++ /dev/null
@@ -1,162 +0,0 @@
-
-
diff --git a/ui/src/app/widget/lib/openstreet-map.js b/ui/src/app/widget/lib/openstreet-map.js
deleted file mode 100644
index ad14071df3..0000000000
--- a/ui/src/app/widget/lib/openstreet-map.js
+++ /dev/null
@@ -1,339 +0,0 @@
-/*
- * Copyright © 2016-2020 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 'leaflet/dist/leaflet.css';
-import 'leaflet.markercluster/dist/MarkerCluster.css'
-import 'leaflet.markercluster/dist/MarkerCluster.Default.css'
-import * as L from 'leaflet';
-import 'leaflet-providers';
-import 'leaflet.markercluster/dist/leaflet.markercluster'
-
-export default class TbOpenStreetMap {
-
- constructor($containerElement, utils, initCallback, defaultZoomLevel, dontFitMapBounds, disableScrollZooming, minZoomLevel, mapProvider, credentials, defaultCenterPosition, markerClusteringSetting) {
-
- this.utils = utils;
- this.defaultZoomLevel = defaultZoomLevel;
- this.dontFitMapBounds = dontFitMapBounds;
- this.minZoomLevel = minZoomLevel;
- this.tooltips = [];
- this.isMarketCluster = markerClusteringSetting && markerClusteringSetting.isMarketCluster;
-
- if (!mapProvider) {
- mapProvider = {
- name: "OpenStreetMap.Mapnik"
- };
- }
-
- if (mapProvider.name.startsWith("HERE.")) {
- credentials.app_id = credentials.app_id || "AhM6TzD9ThyK78CT3ptx";
- credentials.app_code = credentials.app_code || "p6NPiITB3Vv0GMUFnkLOOg";
- }
-
- defaultCenterPosition = defaultCenterPosition || [0,0];
- this.map = L.map($containerElement[0]).setView(defaultCenterPosition, this.defaultZoomLevel || 8);
-
- if (disableScrollZooming) {
- this.map.scrollWheelZoom.disable();
- }
-
- var tileLayer = mapProvider.isCustom ? L.tileLayer(mapProvider.name) : L.tileLayer.provider(mapProvider.name, credentials);
- tileLayer.addTo(this.map);
-
- if (this.isMarketCluster) {
- this.markersCluster = L.markerClusterGroup(markerClusteringSetting);
- this.map.addLayer(this.markersCluster);
- }
-
- if (initCallback) {
- setTimeout(initCallback, 0); //eslint-disable-line
- }
-
- }
-
- inited() {
- return angular.isDefined(this.map);
- }
-
- getContainer() {
- return this.isMarketCluster ? this.markersCluster : this.map;
- }
-
- updateMarkerLabel(marker, settings) {
- marker.unbindTooltip();
- marker.bindTooltip('' + settings.labelText + '
',
- {className: 'tb-marker-label', permanent: true, direction: 'top', offset: marker.tooltipOffset});
- }
-
- updateMarkerColor(marker, color) {
- this.createDefaultMarkerIcon(marker, color, (iconInfo) => {
- marker.setIcon(iconInfo.icon);
- });
- }
-
- updateMarkerIcon(marker, settings) {
- this.createMarkerIcon(marker, settings, (iconInfo) => {
- marker.setIcon(iconInfo.icon);
- if (settings.showLabel) {
- marker.unbindTooltip();
- marker.tooltipOffset = [0, -iconInfo.size[1] + 10];
- marker.bindTooltip('' + settings.labelText + '
',
- {className: 'tb-marker-label', permanent: true, direction: 'top', offset: marker.tooltipOffset});
- }
- });
- }
-
- createMarkerIcon(marker, settings, onMarkerIconReady) {
- var currentImage = settings.currentImage;
- var opMap = this;
- if (currentImage && currentImage.url) {
- this.utils.loadImageAspect(currentImage.url).then(
- (aspect) => {
- if (aspect) {
- var width;
- var height;
- if (aspect > 1) {
- width = currentImage.size;
- height = currentImage.size / aspect;
- } else {
- width = currentImage.size * aspect;
- height = currentImage.size;
- }
- var icon = L.icon({
- iconUrl: currentImage.url,
- iconSize: [width, height],
- iconAnchor: [width / 2, height],
- popupAnchor: [0, -height]
- });
- var iconInfo = {
- size: [width, height],
- icon: icon
- };
- onMarkerIconReady(iconInfo);
- } else {
- opMap.createDefaultMarkerIcon(marker, settings.color, onMarkerIconReady);
- }
- }
- );
- } else {
- this.createDefaultMarkerIcon(marker, settings.color, onMarkerIconReady);
- }
- }
-
- createDefaultMarkerIcon(marker, color, onMarkerIconReady) {
- var pinColor = color.substr(1);
- var icon = L.icon({
- iconUrl: 'https://chart.apis.google.com/chart?chst=d_map_pin_letter&chld=%E2%80%A2|' + pinColor,
- iconSize: [21, 34],
- iconAnchor: [10, 34],
- popupAnchor: [0, -34],
- shadowUrl: 'https://chart.apis.google.com/chart?chst=d_map_pin_shadow',
- shadowSize: [40, 37],
- shadowAnchor: [12, 35]
- });
- var iconInfo = {
- size: [21, 34],
- icon: icon
- };
- onMarkerIconReady(iconInfo);
- }
-
- createMarker(location, dsIndex, settings, onClickListener, markerArgs, onDragendListener) {
- var marker = L.marker(location, {
- draggable: settings.drraggable
- });
- var opMap = this;
- this.createMarkerIcon(marker, settings, (iconInfo) => {
- marker.setIcon(iconInfo.icon);
- if (settings.showLabel) {
- marker.tooltipOffset = [0, -iconInfo.size[1] + 10];
- marker.bindTooltip('' + settings.labelText + '
',
- {className: 'tb-marker-label', permanent: true, direction: 'top', offset: marker.tooltipOffset});
- }
- marker.addTo(opMap.getContainer());
- });
-
- if (settings.displayTooltip) {
- this.createTooltip(marker, dsIndex, settings, markerArgs);
- }
-
- if (onClickListener) {
- marker.on('click', onClickListener);
- }
-
- if (onDragendListener) {
- marker.on('dragend', onDragendListener);
- }
-
- return marker;
- }
-
- removeMarker(marker) {
- this.getContainer().removeLayer(marker);
- }
-
- createTooltip(marker, dsIndex, settings, markerArgs) {
- var popup = L.popup();
- popup.setContent('');
- marker.bindPopup(popup, {autoClose: settings.autocloseTooltip, closeOnClick: false});
- if (settings.displayTooltipAction == 'hover') {
- marker.off('click');
- marker.on('mouseover', function () {
- this.openPopup();
- });
- marker.on('mouseout', function () {
- this.closePopup();
- });
- }
- this.tooltips.push({
- markerArgs: markerArgs,
- popup: popup,
- locationSettings: settings,
- dsIndex: dsIndex
- });
- }
-
- updatePolylineColor(polyline, settings, color) {
- var style = {
- color: color,
- opacity: settings.strokeOpacity,
- weight: settings.strokeWeight
- };
- polyline.setStyle(style);
- }
-
- createPolyline(locations, settings) {
- var polyline = L.polyline(locations,
- {
- color: settings.color,
- opacity: settings.strokeOpacity,
- weight: settings.strokeWeight
- }
- ).addTo(this.map);
- return polyline;
- }
-
- removePolyline(polyline) {
- this.map.removeLayer(polyline);
- }
-
- createPolygon(latLangs, settings, location, onClickListener, markerArgs) {
- let polygon = L.polygon(latLangs, {
- fill: true,
- fillColor: settings.polygonColor,
- color: settings.polygonStrokeColor,
- weight: settings.polygonStrokeWeight,
- fillOpacity: settings.polygonOpacity,
- opacity: settings.polygonStrokeOpacity
- }).addTo(this.map);
-
- if (settings.displayTooltip) {
- this.createTooltip(polygon, location.dsIndex, settings, markerArgs);
- }
- if (onClickListener) {
- polygon.on('click', onClickListener);
- }
- return polygon;
- }
-
- removePolygon(polygon) {
- this.map.removeLayer(polygon);
- }
-
- updatePolygonColor(polygon, settings, color) {
- let style = {
- fill: true,
- fillColor: color,
- color: color,
- weight: settings.polygonStrokeWeight,
- fillOpacity: settings.polygonOpacity,
- opacity: settings.polygonStrokeOpacity
- };
- polygon.setStyle(style);
- }
-
- getPolygonLatLngs(polygon) {
- return polygon.getLatLngs();
- }
-
- setPolygonLatLngs(polygon, latLngs) {
- polygon.setLatLngs(latLngs);
- polygon.redraw();
- }
-
- fitBounds(bounds, useDefaultZoom) {
- if (bounds.isValid()) {
- if ((this.dontFitMapBounds || useDefaultZoom) && this.defaultZoomLevel) {
- this.map.setZoom(this.defaultZoomLevel, {animate: false});
- this.map.panTo(bounds.getCenter(), {animate: false});
- } else {
- var tbMap = this;
- this.map.once('zoomend', function () {
- if (!tbMap.defaultZoomLevel && tbMap.map.getZoom() > tbMap.minZoomLevel) {
- tbMap.map.setZoom(tbMap.minZoomLevel, {animate: false});
- }
- });
- this.map.fitBounds(bounds, {padding: [50, 50], animate: false});
- }
- }
- }
-
- createLatLng(lat, lng) {
- return L.latLng(lat, lng);
- }
-
- extendBoundsWithMarker(bounds, marker) {
- bounds.extend(marker.getLatLng());
- }
-
- getMarkerPosition(marker) {
- return marker.getLatLng();
- }
-
- setMarkerPosition(marker, latLng) {
- marker.setLatLng(latLng);
- }
-
- getPolylineLatLngs(polyline) {
- return polyline.getLatLngs();
- }
-
- setPolylineLatLngs(polyline, latLngs) {
- polyline.setLatLngs(latLngs);
- }
-
- createBounds() {
- return L.latLngBounds();
- }
-
- extendBounds(bounds, polyline) {
- if (polyline && polyline.getLatLngs() && polyline.getBounds()) {
- bounds.extend(polyline.getBounds());
- }
- }
-
- invalidateSize() {
- this.map.invalidateSize(true);
- }
-
- getTooltips() {
- return this.tooltips;
- }
-
- getCenter() {
- return this.map.getCenter();
- }
-
-}
diff --git a/ui/src/app/widget/lib/rpc/index.js b/ui/src/app/widget/lib/rpc/index.js
deleted file mode 100644
index 788e014f50..0000000000
--- a/ui/src/app/widget/lib/rpc/index.js
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright © 2016-2020 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 tbKnob from './knob.directive';
-import tbSwitch from './switch.directive';
-import tbRoundSwitch from './round-switch.directive';
-import tbLedIndicator from './led-indicator.directive';
-
-export default angular.module('thingsboard.widgets.rpc', [
- tbKnob,
- tbSwitch,
- tbRoundSwitch,
- tbLedIndicator
-]).name;
diff --git a/ui/src/app/widget/lib/rpc/knob.directive.js b/ui/src/app/widget/lib/rpc/knob.directive.js
deleted file mode 100644
index d89c13de5d..0000000000
--- a/ui/src/app/widget/lib/rpc/knob.directive.js
+++ /dev/null
@@ -1,388 +0,0 @@
-/*
- * Copyright © 2016-2020 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 './knob.scss';
-
-import CanvasDigitalGauge from './../CanvasDigitalGauge';
-import tinycolor from 'tinycolor2';
-
-import { isNumber } from '../widget-utils';
-
-/* eslint-disable import/no-unresolved, import/default */
-
-import knobTemplate from './knob.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-export default angular.module('thingsboard.widgets.rpc.knob', [])
- .directive('tbKnob', Knob)
- .name;
-
-/*@ngInject*/
-function Knob() {
- return {
- restrict: "E",
- scope: true,
- bindToController: {
- ctx: '='
- },
- controller: KnobController,
- controllerAs: 'vm',
- templateUrl: knobTemplate
- };
-}
-
-/*@ngInject*/
-function KnobController($element, $scope, $document) {
- let vm = this;
-
- vm.value = 0;
- vm.error = '';
-
- var knob = angular.element('.knob', $element),
- knobContainer = angular.element('#knob-container', $element),
- knobTopPointerContainer = knob.find('.top-pointer-container'),
- knobTopPointer = knob.find('.top-pointer'),
- knobValueContainer = knob.find('.value-container'),
- knobValue = knob.find('.knob-value'),
- knobErrorContainer = knob.find('.error-container'),
- knobError = knob.find('.knob-error'),
- knobTitleContainer = knob.find('.title-container'),
- knobTitle = knob.find('.knob-title'),
- knobMinmaxContainer = knob.find('.minmax-container'),
- minmaxLabel = knob.find('.minmax-label'),
- textMeasure = knob.find('#text-measure'),
- startDeg = -1,
- currentDeg = 0,
- rotation = 0,
- lastDeg = 0,
- moving = false;
-
- var minDeg = -45;
- var maxDeg = 225;
-
- var canvasBarElement = angular.element('#canvasBar', $element);
-
- var levelColors = ['#19ff4b', '#ffff19', '#ff3232'];
-
- var canvasBar;
-
- $scope.$watch('vm.ctx', () => {
- if (vm.ctx) {
- init();
- }
- });
-
- function init() {
-
- vm.minValue = angular.isDefined(vm.ctx.settings.minValue) ? vm.ctx.settings.minValue : 0;
- vm.maxValue = angular.isDefined(vm.ctx.settings.maxValue) ? vm.ctx.settings.maxValue : 100;
- vm.title = angular.isDefined(vm.ctx.settings.title) ? vm.ctx.settings.title : '';
-
- var canvasBarData = {
- renderTo: canvasBarElement[0],
- hideValue: true,
- neonGlowBrightness: 0,
- gaugeWidthScale: 0.4,
- gaugeColor: 'rgba(0, 0, 0, 0)',
- levelColors: levelColors,
- minValue: vm.minValue,
- maxValue: vm.maxValue,
- gaugeType: 'donut',
- dashThickness: 2,
- donutStartAngle: 3/4*Math.PI,
- donutEndAngle: 9/4*Math.PI,
- animation: false
- };
-
- canvasBar = new CanvasDigitalGauge(canvasBarData).draw();
-
- knob.on('click', (e) => {
- if (moving) {
- moving = false;
- return false;
- }
- e.preventDefault();
-
- var offset = knob.offset();
- var center = {
- y : offset.top + knob.height()/2,
- x: offset.left + knob.width()/2
- };
- var a, b, deg,
- rad2deg = 180/Math.PI;
-
- e = (e.originalEvent.touches) ? e.originalEvent.touches[0] : e;
-
- a = center.y - e.pageY;
- b = center.x - e.pageX;
- deg = Math.atan2(a,b)*rad2deg;
- if(deg < 0){
- deg = 360 + deg;
- }
- if (deg > maxDeg) {
- if (deg - 360 > minDeg) {
- deg = deg - 360;
- } else {
- return false;
- }
- }
- currentDeg = deg;
- lastDeg = deg;
- knobTopPointerContainer.css('transform','rotate('+(currentDeg)+'deg)');
- turn(degreeToRatio(currentDeg));
- rotation = currentDeg;
- startDeg = -1;
- });
-
- knob.on('mousedown touchstart', (e) => {
- e.preventDefault();
- var offset = knob.offset();
- var center = {
- y : offset.top + knob.height()/2,
- x: offset.left + knob.width()/2
- };
-
- var a, b, deg, tmp,
- rad2deg = 180/Math.PI;
-
- knob.on('mousemove.rem touchmove.rem', (e) => {
- moving = true;
- e = (e.originalEvent.touches) ? e.originalEvent.touches[0] : e;
-
- a = center.y - e.pageY;
- b = center.x - e.pageX;
- deg = Math.atan2(a,b)*rad2deg;
- if(deg < 0){
- deg = 360 + deg;
- }
-
- if(startDeg == -1){
- startDeg = deg;
- }
-
- tmp = Math.floor((deg-startDeg) + rotation);
-
- if(tmp < 0){
- tmp = 360 + tmp;
- }
- else if(tmp > 359){
- tmp = tmp % 360;
- }
-
- if (tmp > maxDeg) {
- if (tmp - 360 > minDeg) {
- tmp = tmp - 360;
- } else {
- var deltaMax = Math.abs(maxDeg - lastDeg);
- var deltaMin = Math.abs(minDeg - lastDeg);
- if (deltaMax < deltaMin) {
- tmp = maxDeg;
- } else {
- tmp = minDeg;
- }
- }
- }
- if(Math.abs(tmp - lastDeg) > 180){
- startDeg = deg;
- rotation = currentDeg;
- return false;
- }
-
- currentDeg = tmp;
- lastDeg = tmp;
-
- knobTopPointerContainer.css('transform','rotate('+(currentDeg)+'deg)');
- turn(degreeToRatio(currentDeg));
- });
-
- $document.on('mouseup.rem touchend.rem',() => {
- knob.off('.rem');
- $document.off('.rem');
- rotation = currentDeg;
- startDeg = -1;
- });
-
- });
- vm.ctx.resize = resize;
- resize();
- var initialValue = angular.isDefined(vm.ctx.settings.initialValue) ? vm.ctx.settings.initialValue : vm.minValue;
- setValue(initialValue);
-
- var subscription = vm.ctx.defaultSubscription;
- var rpcEnabled = subscription.rpcEnabled;
-
- vm.isSimulated = $scope.widgetEditMode;
-
- vm.requestTimeout = 500;
- if (vm.ctx.settings.requestTimeout) {
- vm.requestTimeout = vm.ctx.settings.requestTimeout;
- }
- vm.getValueMethod = 'getValue';
- if (vm.ctx.settings.getValueMethod && vm.ctx.settings.getValueMethod.length) {
- vm.getValueMethod = vm.ctx.settings.getValueMethod;
- }
- vm.setValueMethod = 'setValue';
- if (vm.ctx.settings.setValueMethod && vm.ctx.settings.setValueMethod.length) {
- vm.setValueMethod = vm.ctx.settings.setValueMethod;
- }
- if (!rpcEnabled) {
- onError('Target device is not set!');
- } else {
- if (!vm.isSimulated) {
- rpcRequestValue();
- }
- }
- }
-
- function ratioToDegree(ratio) {
- return minDeg + ratio*(maxDeg-minDeg);
- }
-
- function degreeToRatio(degree) {
- return (degree-minDeg)/(maxDeg-minDeg);
- }
-
- function resize() {
- var width = knobContainer.width();
- var height = knobContainer.height();
- var size = Math.min(width, height);
- knob.css({width: size, height: size});
- canvasBar.update({width: size, height: size});
- setFontSize(knobTitle, vm.title, knobTitleContainer.height(), knobTitleContainer.width());
- setFontSize(knobError, vm.error, knobErrorContainer.height(), knobErrorContainer.width());
- var minmaxHeight = knobMinmaxContainer.height();
- minmaxLabel.css({'fontSize': minmaxHeight+'px', 'lineHeight': minmaxHeight+'px'});
- checkValueSize();
- }
-
- function turn(ratio) {
- var value = (vm.minValue + (vm.maxValue - vm.minValue)*ratio).toFixed(vm.ctx.decimals);
- if (canvasBar.value != value) {
- canvasBar.value = value;
- }
- updateColor(canvasBar.getValueColor());
- onValue(value);
- }
-
- function setValue(value) {
- var ratio = (value-vm.minValue) / (vm.maxValue - vm.minValue);
- rotation = lastDeg = currentDeg = ratioToDegree(ratio);
- knobTopPointerContainer.css('transform','rotate('+(currentDeg)+'deg)');
- if (canvasBar.value != value) {
- canvasBar.value = value;
- }
- updateColor(canvasBar.getValueColor());
- vm.value = formatValue(value);
- checkValueSize();
- }
-
- function updateColor(color) {
- var glowColor = tinycolor(color).brighten(30).toHexString();
- knobValue.css({'color': glowColor});
- var textShadow = `${color} 1px 1px 10px, ${glowColor} 1px 1px 10px`;
- knobValue.css({'textShadow': textShadow});
- knobTopPointer.css({'backgroundColor': glowColor});
- var boxShadow = `inset 1px 0 2px #040404, 1px 1px 8px 2px ${glowColor}`;
- knobTopPointer.css({'boxShadow': boxShadow});
- }
-
- function onValue(value) {
- $scope.$applyAsync(() => {
- vm.value = formatValue(value);
- checkValueSize();
- rpcUpdateValue(value);
- });
- }
-
- function onError(error) {
- $scope.$applyAsync(() => {
- vm.error = error;
- setFontSize(knobError, vm.error, knobErrorContainer.height(), knobErrorContainer.width());
- });
- }
-
- function formatValue(value) {
- return vm.ctx.utils.formatValue(value, vm.ctx.decimals, vm.ctx.units, true);
- }
-
- function checkValueSize() {
- var fontSize = knobValueContainer.height()/3.3;
- var containerWidth = knobValueContainer.width();
- setFontSize(knobValue, vm.value, fontSize, containerWidth);
- }
-
- function setFontSize(element, text, fontSize, maxWidth) {
- var textWidth = measureTextWidth(text, fontSize);
- while (textWidth > maxWidth) {
- fontSize--;
- if (fontSize < 0) {
- break;
- }
- textWidth = measureTextWidth(text, fontSize);
- }
- element.css({'fontSize': fontSize+'px', 'lineHeight': fontSize+'px'});
- }
-
- function measureTextWidth(text, fontSize) {
- textMeasure.css({'fontSize': fontSize+'px', 'lineHeight': fontSize+'px'});
- textMeasure.html(text);
- return textMeasure.width();
- }
-
- function rpcRequestValue() {
- vm.error = '';
- vm.ctx.controlApi.sendTwoWayCommand(vm.getValueMethod, null, vm.requestTimeout).then(
- (responseBody) => {
- if (isNumber(responseBody)) {
- var numValue = Number(responseBody).toFixed(vm.ctx.decimals);
- setValue(numValue);
- } else {
- var errorText = `Unable to parse response: ${responseBody}`;
- onError(errorText);
- }
- },
- () => {
- var errorText = vm.ctx.defaultSubscription.rpcErrorText;
- onError(errorText);
- }
- );
- }
-
- function rpcUpdateValue(value) {
- if (vm.executingUpdateValue) {
- vm.scheduledValue = value;
- return;
- } else {
- vm.scheduledValue = null;
- vm.rpcValue = value;
- vm.executingUpdateValue = true;
- }
- vm.error = '';
- vm.ctx.controlApi.sendOneWayCommand(vm.setValueMethod, value, vm.requestTimeout).then(
- () => {
- vm.executingUpdateValue = false;
- if (vm.scheduledValue != null && vm.scheduledValue != vm.rpcValue) {
- rpcUpdateValue(vm.scheduledValue);
- }
- },
- () => {
- vm.executingUpdateValue = false;
- var errorText = vm.ctx.defaultSubscription.rpcErrorText;
- onError(errorText);
- }
- );
- }
-}
diff --git a/ui/src/app/widget/lib/rpc/knob.scss b/ui/src/app/widget/lib/rpc/knob.scss
deleted file mode 100644
index 2188511a95..0000000000
--- a/ui/src/app/widget/lib/rpc/knob.scss
+++ /dev/null
@@ -1,163 +0,0 @@
-/**
- * Copyright © 2016-2020 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.
- */
-$knob-img: url("./svg/knob.svg") !default;
-
-$bars-margin-pct: percentage(.033) !default;
-$background-margin-pct: percentage(.05) !default;
-$value-container-margin-pct: percentage(.35) !default;
-$error-height: percentage(.05) !default;
-$title-height: percentage(.066) !default;
-$title-container-margin-pct: percentage(.2) !default;
-$title-container-margin-bottom-pct: percentage(.05) !default;
-$minmax-height: percentage(.04) !default;
-$minmax-container-margin-pct: percentage(.18) !default;
-$minmax-container-margin-bottom-pct: percentage(.12) !default;
-
-.tb-knob {
- width: 100%;
- height: 100%;
-
- .knob {
- position: relative;
-
- &[draggable] {
- user-select: none;
- }
-
- #canvasBar {
- position: absolute;
- top: 0;
- right: 0;
- bottom: 0;
- left: 0;
- z-index: 2;
- }
-
- .canvas-background {
- position: absolute;
- top: $background-margin-pct;
- right: $background-margin-pct;
- bottom: $background-margin-pct;
- left: $background-margin-pct;
- z-index: 2;
- background: #3f4346;
- border-radius: 50%;
- }
-
- .value-container {
- position: absolute;
- top: $value-container-margin-pct;
- right: $value-container-margin-pct;
- bottom: $value-container-margin-pct;
- left: $value-container-margin-pct;
- z-index: 4;
-
- .knob-value {
- font-weight: 500;
- color: #fff;
- white-space: nowrap;
- }
- }
-
- .error-container {
- position: absolute;
- top: 1%;
- right: 0;
- left: 0;
- z-index: 4;
- height: $error-height;
-
- .knob-error {
- color: #ff3315;
- white-space: nowrap;
- }
- }
-
- .title-container {
- position: absolute;
- right: $title-container-margin-pct;
- bottom: $title-container-margin-bottom-pct;
- left: $title-container-margin-pct;
- z-index: 4;
- height: $title-height;
-
- .knob-title {
- font-weight: 500;
- color: #757575;
- white-space: nowrap;
- }
- }
-
- .minmax-container {
- position: absolute;
- right: $minmax-container-margin-pct;
- bottom: $minmax-container-margin-bottom-pct;
- left: $minmax-container-margin-pct;
- z-index: 4;
- height: $minmax-height;
-
- .minmax-label {
- font-weight: 500;
- color: #757575;
- white-space: nowrap;
- }
- }
-
- .top-pointer-container {
- position: absolute;
- top: $bars-margin-pct;
- right: $bars-margin-pct;
- bottom: $bars-margin-pct;
- left: $bars-margin-pct;
- z-index: 3;
- cursor: pointer !important;
-
- .top-pointer {
- position: absolute;
- top: 50%;
- left: 22%;
- width: 5%;
- height: 5%;
- margin-top: -2.5%;
- cursor: pointer !important;
- content: "";
- background-color: #b5b5b5;
- border-radius: 50%;
- box-shadow: 1px 0 2px #040404;
- }
- }
-
- .top{
- position: absolute;
- top: $bars-margin-pct;
- right: $bars-margin-pct;
- bottom: $bars-margin-pct;
- left: $bars-margin-pct;
- z-index: 2;
- cursor: pointer !important;
- background: $knob-img no-repeat;
- background-size: contain;
- }
-
- #text-measure {
- position: absolute;
- width: auto;
- height: auto;
- white-space: nowrap;
- visibility: hidden;
- }
- }
-}
diff --git a/ui/src/app/widget/lib/rpc/knob.tpl.html b/ui/src/app/widget/lib/rpc/knob.tpl.html
deleted file mode 100644
index 3ff858293e..0000000000
--- a/ui/src/app/widget/lib/rpc/knob.tpl.html
+++ /dev/null
@@ -1,45 +0,0 @@
-
-
-
-
-
- {{ vm.value }}
-
-
-
-
-
-
-
-
-
- {{ vm.title }}
-
-
- min
-
- max
-
-
-
-
-
diff --git a/ui/src/app/widget/lib/rpc/led-indicator.directive.js b/ui/src/app/widget/lib/rpc/led-indicator.directive.js
deleted file mode 100644
index cb64d5cff9..0000000000
--- a/ui/src/app/widget/lib/rpc/led-indicator.directive.js
+++ /dev/null
@@ -1,297 +0,0 @@
-/*
- * Copyright © 2016-2020 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 './led-indicator.scss';
-
-import tinycolor from 'tinycolor2';
-
-/* eslint-disable import/no-unresolved, import/default */
-
-import ledIndicatorTemplate from './led-indicator.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-export default angular.module('thingsboard.widgets.rpc.ledIndicator', [])
- .directive('tbLedIndicator', LedIndicator)
- .name;
-
-/*@ngInject*/
-function LedIndicator() {
- return {
- restrict: "E",
- scope: true,
- bindToController: {
- ctx: '='
- },
- controller: LedIndicatorController,
- controllerAs: 'vm',
- templateUrl: ledIndicatorTemplate
- };
-}
-
-/*@ngInject*/
-function LedIndicatorController($element, $scope, $timeout, utils, types) {
- let vm = this;
-
- vm.showTitle = false;
- vm.value = false;
- vm.error = '';
-
- const checkStatusPollingInterval = 10000;
-
- vm.subscriptionOptions = {
- callbacks: {
- onDataUpdated: onDataUpdated,
- onDataUpdateError: onDataUpdateError,
- dataLoading: () => {}
- }
- };
-
- var led = angular.element('.led', $element),
- ledContainer = angular.element('#led-container', $element),
- textMeasure = angular.element('#text-measure', $element),
- ledTitleContainer = angular.element('.title-container', $element),
- ledTitle = angular.element('.led-title', $element),
- ledErrorContainer = angular.element('.error-container', $element),
- ledError = angular.element('.led-error', $element);
-
- $scope.$watch('vm.ctx', () => {
- if (vm.ctx) {
- init();
- }
- });
-
- $scope.$on('$destroy', () => {
- vm.destroyed = true;
- if (vm.checkStatusTimeoutHandle) {
- $timeout.cancel(vm.checkStatusTimeoutHandle);
- }
- if (vm.subscription) {
- vm.ctx.subscriptionApi.removeSubscription(vm.subscription.id);
- }
- });
-
- resize();
-
- function init() {
-
- vm.title = angular.isDefined(vm.ctx.settings.title) ? vm.ctx.settings.title : '';
- vm.showTitle = vm.title && vm.title.length ? true : false;
-
- var origColor = angular.isDefined(vm.ctx.settings.ledColor) ? vm.ctx.settings.ledColor : 'green';
-
- vm.valueAttribute = angular.isDefined(vm.ctx.settings.valueAttribute) ? vm.ctx.settings.valueAttribute : 'value';
-
- vm.ledColor = tinycolor(origColor).brighten(30).toHexString();
- vm.ledMiddleColor = tinycolor(origColor).toHexString();
- vm.disabledColor = tinycolor(origColor).darken(40).toHexString();
- vm.disabledMiddleColor = tinycolor(origColor).darken(60).toHexString();
-
- vm.ctx.resize = resize;
- $scope.$applyAsync(() => {
- resize();
- });
- var initialValue = angular.isDefined(vm.ctx.settings.initialValue) ? vm.ctx.settings.initialValue : false;
- setValue(initialValue, true);
-
- var subscription = vm.ctx.defaultSubscription;
- var rpcEnabled = subscription.rpcEnabled;
-
- vm.isSimulated = $scope.widgetEditMode;
-
- vm.requestTimeout = 500;
- if (vm.ctx.settings.requestTimeout) {
- vm.requestTimeout = vm.ctx.settings.requestTimeout;
- }
- vm.retrieveValueMethod = 'attribute';
- if (vm.ctx.settings.retrieveValueMethod && vm.ctx.settings.retrieveValueMethod.length) {
- vm.retrieveValueMethod = vm.ctx.settings.retrieveValueMethod;
- }
-
- vm.parseValueFunction = (data) => data ? true : false;
- if (vm.ctx.settings.parseValueFunction && vm.ctx.settings.parseValueFunction.length) {
- try {
- vm.parseValueFunction = new Function('data', vm.ctx.settings.parseValueFunction);
- } catch (e) {
- vm.parseValueFunction = (data) => data ? true : false;
- }
- }
-
- vm.performCheckStatus = vm.ctx.settings.performCheckStatus != false;
- if (vm.performCheckStatus) {
- vm.checkStatusMethod = 'checkStatus';
- if (vm.ctx.settings.checkStatusMethod && vm.ctx.settings.checkStatusMethod.length) {
- vm.checkStatusMethod = vm.ctx.settings.checkStatusMethod;
- }
- }
- if (!rpcEnabled) {
- onError('Target device is not set!');
- } else {
- if (!vm.isSimulated) {
- if (vm.performCheckStatus) {
- rpcCheckStatus();
- } else {
- subscribeForValue();
- }
- }
- }
- }
-
- function resize() {
- var width = ledContainer.width();
- var height = ledContainer.height();
- var size = Math.min(width, height);
-
- led.css({width: size, height: size});
-
- if (vm.showTitle) {
- setFontSize(ledTitle, vm.title, ledTitleContainer.height() * 2 / 3, ledTitleContainer.width());
- }
- setFontSize(ledError, vm.error, ledErrorContainer.height(), ledErrorContainer.width());
- }
-
- function setValue(value, forceUpdate) {
- if (vm.value != value || forceUpdate) {
- vm.value = value;
- updateColor();
- }
- }
-
- function updateColor() {
- var color = vm.value ? vm.ledColor : vm.disabledColor;
- var middleColor = vm.value ? vm.ledMiddleColor : vm.disabledMiddleColor;
- var boxShadow = `#000 0 -1px 6px 1px, inset ${middleColor} 0 -1px 8px, ${color} 0 3px 11px`;
- led.css({'backgroundColor': color});
- led.css({'boxShadow': boxShadow});
- if (vm.value) {
- led.removeClass( 'disabled' );
- } else {
- led.addClass( 'disabled' );
- }
- }
-
- function onError(error) {
- $scope.$applyAsync(() => {
- vm.error = error;
- setFontSize(ledError, vm.error, ledErrorContainer.height(), ledErrorContainer.width());
- });
- }
-
- function setFontSize(element, text, fontSize, maxWidth) {
- var textWidth = measureTextWidth(text, fontSize);
- while (textWidth > maxWidth) {
- fontSize--;
- textWidth = measureTextWidth(text, fontSize);
- }
- element.css({'fontSize': fontSize+'px', 'lineHeight': fontSize+'px'});
- }
-
- function measureTextWidth(text, fontSize) {
- textMeasure.css({'fontSize': fontSize+'px', 'lineHeight': fontSize+'px'});
- textMeasure.text(text);
- return textMeasure.width();
- }
-
- function rpcCheckStatus() {
- if (vm.destroyed) {
- return;
- }
- vm.error = '';
- vm.ctx.controlApi.sendTwoWayCommand(vm.checkStatusMethod, null, vm.requestTimeout).then(
- (responseBody) => {
- var status = responseBody ? true : false;
- if (status) {
- if (vm.checkStatusTimeoutHandle) {
- $timeout.cancel(vm.checkStatusTimeoutHandle);
- vm.checkStatusTimeoutHandle = null;
- }
- subscribeForValue();
- } else {
- var errorText = 'Unknown device status!';
- onError(errorText);
- if (vm.checkStatusTimeoutHandle) {
- $timeout.cancel(vm.checkStatusTimeoutHandle);
- }
- vm.checkStatusTimeoutHandle = $timeout(rpcCheckStatus, checkStatusPollingInterval);
- }
- },
- () => {
- var errorText = vm.ctx.defaultSubscription.rpcErrorText;
- onError(errorText);
- if (vm.checkStatusTimeoutHandle) {
- $timeout.cancel(vm.checkStatusTimeoutHandle);
- }
- vm.checkStatusTimeoutHandle = $timeout(rpcCheckStatus, checkStatusPollingInterval);
- }
- );
- }
-
- function subscribeForValue() {
- var subscriptionsInfo = [{
- type: types.datasourceType.entity,
- entityType: types.entityType.device,
- entityId: vm.ctx.defaultSubscription.targetDeviceId
- }];
-
- if (vm.retrieveValueMethod == 'attribute') {
- subscriptionsInfo[0].attributes = [
- {name: vm.valueAttribute}
- ];
- } else {
- subscriptionsInfo[0].timeseries = [
- {name: vm.valueAttribute}
- ];
- }
-
- vm.ctx.subscriptionApi.createSubscriptionFromInfo (
- types.widgetType.latest.value, subscriptionsInfo, vm.subscriptionOptions, false, true).then(
- function(subscription) {
- vm.subscription = subscription;
- }
- );
- }
-
- function onDataUpdated(subscription, apply) {
- var value = false;
- var data = subscription.data;
- if (data.length) {
- var keyData = data[0];
- if (keyData && keyData.data && keyData.data[0]) {
- var attrValue = keyData.data[0][1];
- if (attrValue) {
- var parsed = null;
- try {
- parsed = vm.parseValueFunction(angular.fromJson(attrValue));
- } catch (e){/**/}
- value = parsed ? true : false;
- }
- }
- }
- setValue(value);
- if (apply) {
- $scope.$digest();
- }
- }
-
- function onDataUpdateError(subscription, e) {
- var exceptionData = utils.parseException(e);
- var errorText = exceptionData.name;
- if (exceptionData.message) {
- errorText += ': ' + exceptionData.message;
- }
- onError(errorText);
- }
-
-}
diff --git a/ui/src/app/widget/lib/rpc/led-indicator.scss b/ui/src/app/widget/lib/rpc/led-indicator.scss
deleted file mode 100644
index 454128a28f..0000000000
--- a/ui/src/app/widget/lib/rpc/led-indicator.scss
+++ /dev/null
@@ -1,70 +0,0 @@
-/**
- * Copyright © 2016-2020 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 "~compass-sass-mixins/lib/compass";
-
-$error-height: 14px !default;
-
-.tb-led-indicator {
- width: 100%;
- height: 100%;
-
- .title-container {
- .led-title {
- font-weight: 500;
- color: #757575;
- white-space: nowrap;
- }
- }
-
- .error-container {
- position: absolute;
- top: 1%;
- right: 0;
- left: 0;
- z-index: 4;
- height: $error-height;
-
- .led-error {
- color: #ff3315;
- white-space: nowrap;
- }
- }
-
- #text-measure {
- position: absolute;
- width: auto;
- height: auto;
- white-space: nowrap;
- visibility: hidden;
- }
-
- #led-container {
- padding: 10px;
-
- .led {
- position: relative;
- cursor: pointer;
- background-image: radial-gradient(50% 50%, circle closest-corner, transparent, rgba(0, 0, 0, .25));
- border-radius: 50%;
- transition: background-color .5s, box-shadow .5s;
-
- &.disabled {
- background-image: radial-gradient(50% 50%, circle closest-corner, rgba(255, 255, 255, .5), rgba(0, 0, 0, .1));
- }
- }
- }
-}
-
diff --git a/ui/src/app/widget/lib/rpc/led-indicator.tpl.html b/ui/src/app/widget/lib/rpc/led-indicator.tpl.html
deleted file mode 100644
index 1d2c674ab9..0000000000
--- a/ui/src/app/widget/lib/rpc/led-indicator.tpl.html
+++ /dev/null
@@ -1,32 +0,0 @@
-
-
-
- {{vm.title}}
-
-
-
- {{ vm.error }}
-
-
-
diff --git a/ui/src/app/widget/lib/rpc/round-switch.directive.js b/ui/src/app/widget/lib/rpc/round-switch.directive.js
deleted file mode 100644
index feb9f96ab7..0000000000
--- a/ui/src/app/widget/lib/rpc/round-switch.directive.js
+++ /dev/null
@@ -1,298 +0,0 @@
-/*
- * Copyright © 2016-2020 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 './round-switch.scss';
-
-/* eslint-disable import/no-unresolved, import/default */
-
-import roundSwitchTemplate from './round-switch.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-export default angular.module('thingsboard.widgets.rpc.roundSwitch', [])
- .directive('tbRoundSwitch', RoundSwitch)
- .name;
-
-/*@ngInject*/
-function RoundSwitch() {
- return {
- restrict: "E",
- scope: true,
- bindToController: {
- ctx: '='
- },
- controller: RoundSwitchController,
- controllerAs: 'vm',
- templateUrl: roundSwitchTemplate
- };
-}
-
-/*@ngInject*/
-function RoundSwitchController($element, $scope, utils, types) {
- let vm = this;
-
- vm.showTitle = false;
- vm.value = false;
- vm.error = '';
-
- vm.checkboxId = 'onoff-' + utils.guid();
-
- var switchElement = angular.element('.switch', $element),
- switchContainer = angular.element('#switch-container', $element),
- onoff = angular.element('input', $element),
- textMeasure = angular.element('#text-measure', $element),
- switchTitleContainer = angular.element('.title-container', $element),
- switchTitle = angular.element('.switch-title', $element),
- switchErrorContainer = angular.element('.error-container', $element),
- switchError = angular.element('.switch-error', $element);
-
- onoff.bind('change', () => {
- vm.value = onoff.prop('checked') === false;
- onValue();
- });
-
- vm.valueSubscription = null;
-
- $scope.$watch('vm.ctx', () => {
- if (vm.ctx) {
- init();
- }
- });
-
- $scope.$on('$destroy', () => {
- if (vm.valueSubscription) {
- vm.ctx.subscriptionApi.removeSubscription(vm.valueSubscription.id);
- }
- });
-
- resize();
-
- function init() {
-
- vm.title = angular.isDefined(vm.ctx.settings.title) ? vm.ctx.settings.title : '';
- vm.showTitle = vm.title && vm.title.length ? true : false;
- vm.ctx.resize = resize;
- $scope.$applyAsync(() => {
- resize();
- });
- var initialValue = angular.isDefined(vm.ctx.settings.initialValue) ? vm.ctx.settings.initialValue : false;
- setValue(initialValue);
-
- var subscription = vm.ctx.defaultSubscription;
- var rpcEnabled = subscription.rpcEnabled;
-
- vm.isSimulated = $scope.widgetEditMode;
-
- vm.requestTimeout = 500;
- if (vm.ctx.settings.requestTimeout) {
- vm.requestTimeout = vm.ctx.settings.requestTimeout;
- }
-
- vm.retrieveValueMethod = 'rpc';
- if (vm.ctx.settings.retrieveValueMethod && vm.ctx.settings.retrieveValueMethod.length) {
- vm.retrieveValueMethod = vm.ctx.settings.retrieveValueMethod;
- }
-
- vm.valueKey = 'value';
- if (vm.ctx.settings.valueKey && vm.ctx.settings.valueKey.length) {
- vm.valueKey = vm.ctx.settings.valueKey;
- }
-
- vm.parseValueFunction = (data) => data ? true : false;
- if (vm.ctx.settings.parseValueFunction && vm.ctx.settings.parseValueFunction.length) {
- try {
- vm.parseValueFunction = new Function('data', vm.ctx.settings.parseValueFunction);
- } catch (e) {
- vm.parseValueFunction = (data) => data ? true : false;
- }
- }
-
- vm.convertValueFunction = (value) => value;
- if (vm.ctx.settings.convertValueFunction && vm.ctx.settings.convertValueFunction.length) {
- try {
- vm.convertValueFunction = new Function('value', vm.ctx.settings.convertValueFunction);
- } catch (e) {
- vm.convertValueFunction = (value) => value;
- }
- }
-
- vm.getValueMethod = 'getValue';
- if (vm.ctx.settings.getValueMethod && vm.ctx.settings.getValueMethod.length) {
- vm.getValueMethod = vm.ctx.settings.getValueMethod;
- }
- vm.setValueMethod = 'setValue';
- if (vm.ctx.settings.setValueMethod && vm.ctx.settings.setValueMethod.length) {
- vm.setValueMethod = vm.ctx.settings.setValueMethod;
- }
- if (!rpcEnabled) {
- onError('Target device is not set!');
- } else {
- if (!vm.isSimulated) {
- if (vm.retrieveValueMethod == 'rpc') {
- rpcRequestValue();
- } else if (vm.retrieveValueMethod == 'attribute' || vm.retrieveValueMethod == 'timeseries') {
- subscribeForValue();
- }
- }
- }
- }
-
- function resize() {
- var width = switchContainer.width();
- var height = switchContainer.height();
- var size = Math.min(width, height);
- var scale = size/260;
- switchElement.css({
- '-webkit-transform': `scale(${scale})`,
- '-moz-transform': `scale(${scale})`,
- '-ms-transform': `scale(${scale})`,
- '-o-transform': `scale(${scale})`,
- transform: `scale(${scale})`
- });
- if (vm.showTitle) {
- setFontSize(switchTitle, vm.title, switchTitleContainer.height() * 2 / 3, switchTitleContainer.width());
- }
- setFontSize(switchError, vm.error, switchErrorContainer.height(), switchErrorContainer.width());
- }
-
- function subscribeForValue() {
- var valueSubscriptionInfo = [{
- type: types.datasourceType.entity,
- entityType: types.entityType.device,
- entityId: vm.ctx.defaultSubscription.targetDeviceId
- }];
- if (vm.retrieveValueMethod == 'attribute') {
- valueSubscriptionInfo[0].attributes = [
- {name: vm.valueKey}
- ];
- } else {
- valueSubscriptionInfo[0].timeseries = [
- {name: vm.valueKey}
- ];
- }
- var subscriptionOptions = {
- callbacks: {
- onDataUpdated: onDataUpdated,
- onDataUpdateError: onDataUpdateError
- }
- };
- vm.ctx.subscriptionApi.createSubscriptionFromInfo (
- types.widgetType.latest.value, valueSubscriptionInfo, subscriptionOptions, false, true).then(
- (subscription) => {
- vm.valueSubscription = subscription;
- }
- );
- }
-
- function onDataUpdated(subscription, apply) {
- var value = false;
- var data = subscription.data;
- if (data.length) {
- var keyData = data[0];
- if (keyData && keyData.data && keyData.data[0]) {
- var attrValue = keyData.data[0][1];
- if (attrValue) {
- var parsed = null;
- try {
- parsed = vm.parseValueFunction(angular.fromJson(attrValue));
- } catch (e){/**/}
- value = parsed ? true : false;
- }
- }
- }
- setValue(value);
- if (apply) {
- $scope.$digest();
- }
- }
-
- function onDataUpdateError(subscription, e) {
- var exceptionData = utils.parseException(e);
- var errorText = exceptionData.name;
- if (exceptionData.message) {
- errorText += ': ' + exceptionData.message;
- }
- onError(errorText);
- }
-
- function setValue(value) {
- vm.value = value ? true : false;
- onoff.prop('checked', !vm.value);
- }
-
- function onValue() {
- rpcUpdateValue(vm.value);
- }
-
- function onError(error) {
- $scope.$applyAsync(() => {
- vm.error = error;
- setFontSize(switchError, vm.error, switchErrorContainer.height(), switchErrorContainer.width());
- });
- }
-
- function setFontSize(element, text, fontSize, maxWidth) {
- var textWidth = measureTextWidth(text, fontSize);
- while (textWidth > maxWidth) {
- fontSize--;
- textWidth = measureTextWidth(text, fontSize);
- }
- element.css({'fontSize': fontSize+'px', 'lineHeight': fontSize+'px'});
- }
-
- function measureTextWidth(text, fontSize) {
- textMeasure.css({'fontSize': fontSize+'px', 'lineHeight': fontSize+'px'});
- textMeasure.text(text);
- return textMeasure.width();
- }
-
- function rpcRequestValue() {
- vm.error = '';
- vm.ctx.controlApi.sendTwoWayCommand(vm.getValueMethod, null, vm.requestTimeout).then(
- (responseBody) => {
- setValue(vm.parseValueFunction(responseBody));
- },
- () => {
- var errorText = vm.ctx.defaultSubscription.rpcErrorText;
- onError(errorText);
- }
- );
- }
-
- function rpcUpdateValue(value) {
- if (vm.executingUpdateValue) {
- vm.scheduledValue = value;
- return;
- } else {
- vm.scheduledValue = null;
- vm.rpcValue = value;
- vm.executingUpdateValue = true;
- }
- vm.error = '';
- vm.ctx.controlApi.sendOneWayCommand(vm.setValueMethod, vm.convertValueFunction(value), vm.requestTimeout).then(
- () => {
- vm.executingUpdateValue = false;
- if (vm.scheduledValue != null && vm.scheduledValue != vm.rpcValue) {
- rpcUpdateValue(vm.scheduledValue);
- }
- },
- () => {
- vm.executingUpdateValue = false;
- var errorText = vm.ctx.defaultSubscription.rpcErrorText;
- onError(errorText);
- }
- );
- }
-}
diff --git a/ui/src/app/widget/lib/rpc/round-switch.scss b/ui/src/app/widget/lib/rpc/round-switch.scss
deleted file mode 100644
index ead8a7d7da..0000000000
--- a/ui/src/app/widget/lib/rpc/round-switch.scss
+++ /dev/null
@@ -1,200 +0,0 @@
-/**
- * Copyright © 2016-2020 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 "~compass-sass-mixins/lib/compass";
-
-$error-height: 14px !default;
-
-.tb-round-switch {
- width: 100%;
- height: 100%;
-
- .title-container {
- .switch-title {
- font-weight: 500;
- color: #757575;
- white-space: nowrap;
- }
- }
-
- .error-container {
- position: absolute;
- top: 1%;
- right: 0;
- left: 0;
- z-index: 4;
- height: $error-height;
-
- .switch-error {
- color: #ff3315;
- white-space: nowrap;
- }
- }
-
- #text-measure {
- position: absolute;
- width: auto;
- height: auto;
- white-space: nowrap;
- visibility: hidden;
- }
-
- #switch-container {
- padding: 10px;
-
- .switch {
- position: relative;
-
- box-sizing: border-box;
- width: 260px;
- min-width: 260px;
- height: 260px;
- min-height: 260px;
- padding: 25px;
- font-family: sans-serif;
- font-size: 48px;
-
- color: #424242;
- cursor: pointer;
- background: #ddd;
- background: linear-gradient(180deg, #bbb, #ddd);
- border-radius: 130px;
-
- box-shadow:
- 0 0 0 8px rgba(0, 0, 0, .1),
- 0 0 3px 1px rgba(0, 0, 0, .1),
- inset 0 8px 3px -8px rgba(255, 255, 255, .4);
-
- input {
- display: none;
- }
-
- .on,
- .off {
- position: absolute;
- width: 100%;
- text-align: center;
-
- text-shadow: 1px 1px 4px #4a4a4a;
- }
-
- .on {
- top: 10px;
- font-family: sans-serif;
- color: #444;
-
- transition: all .1s;
- }
-
- .off {
- bottom: 5px;
-
- transition: all .1s;
-
- transform: scaleY(.85);
- }
-
- .but {
- position: relative;
- display: block;
- width: 200px;
- height: 178px;
- font-size: 48px;
- cursor: pointer;
- background-color: #d8d8d8;
- border-bottom-width: 0;
- border-radius: 400px 400px 400px 400px / 400px 400px 300px 300px;
-
- box-shadow:
- inset 8px 6px 5px -7px #a2a2a2,
- inset -8px 6px 5px -7px #a2a2a2,
- inset 0 -3px 2px -2px rgba(200, 200, 200, .5),
- 0 3px 3px -2px #fff,
- inset 0 -230px 60px -200px rgba(255, 255, 255, .2),
- inset 0 220px 40px -200px rgba(0, 0, 0, .3);
-
- transition: all .2s;
- }
-
- .back {
-
- box-sizing: border-box;
- width: 210px;
- height: 210px;
- padding: 4px 4px;
- cursor: pointer;
- background-color: #888787;
- background-image: linear-gradient(-90deg, transparent 30%, transparent 70%), linear-gradient(0deg, rgba(150, 150, 150, 0) 30%, rgba(150, 150, 150, .2) 50%, rgba(150, 150, 150, 0) 70%);
- border-radius: 105px;
-
- box-shadow:
- 30px 30px 30px -20px rgba(58, 58, 58, .3),
- -30px 30px 30px -20px rgba(58, 58, 58, .3),
- 0 30px 30px 0 rgba(16, 16, 16, .3),
- inset 0 -1px 0 0 #484848;
-
- transition: all .2s;
- }
-
-
- input:checked + .back .on,
- input:checked + .back .off{
- text-shadow: 1px 1px 4px #4a4a4a;
- }
-
- input:checked + .back .on{
- top: 10px;
- color: #4c4c4c;
-
- transform: scaleY(.85);
- }
-
- input:checked + .back .off{
- bottom: 5px;
- color: #444;
-
- transform: scaleY(1);
- }
-
- input:checked + .back .but{
- margin-top: 20px;
- background: #dcdcdc;
- background-image: radial-gradient(50% 15%, circle closest-corner, rgba(0, 0, 0, .3), transparent);
- border-radius: 400px 400px 400px 400px / 300px 300px 400px 400px;
-
- box-shadow:
- inset 8px -4px 5px -7px #a9a9a9,
- inset -8px -4px 5px -7px #808080,
- 0 -3px 8px -4px rgba(50, 50, 50, .4),
- inset 0 3px 4px -2px #9c9c9c,
- inset 0 280px 40px -200px rgba(0, 0, 0, .2),
- inset 0 -200px 40px -200px rgba(180, 180, 180, .2);
- }
-
- input:checked + .back{
- padding: 2px 4px;
-
- background-image: linear-gradient(0deg, #868686 30%, transparent 70%), linear-gradient(90deg, rgba(115, 115, 115, 0) 0%, rgba(255, 255, 255, .74) 50%, rgba(105, 105, 105, 0) 100%);
-
- box-shadow:
- 30px 30px 30px -20px rgba(49, 49, 49, .1),
- -30px 30px 30px -20px rgba(111, 111, 111, .1),
- 0 30px 30px 0 rgba(0, 0, 0, .2),
- inset 0 1px 2px 0 rgba(167, 167, 167, .6);
- }
- }
- }
-}
-
diff --git a/ui/src/app/widget/lib/rpc/round-switch.tpl.html b/ui/src/app/widget/lib/rpc/round-switch.tpl.html
deleted file mode 100644
index fcecbef0f3..0000000000
--- a/ui/src/app/widget/lib/rpc/round-switch.tpl.html
+++ /dev/null
@@ -1,38 +0,0 @@
-
-
-
- {{vm.title}}
-
-
-
- {{ vm.error }}
-
-
-
diff --git a/ui/src/app/widget/lib/rpc/svg/knob.svg b/ui/src/app/widget/lib/rpc/svg/knob.svg
deleted file mode 100644
index 81fe9949b7..0000000000
--- a/ui/src/app/widget/lib/rpc/svg/knob.svg
+++ /dev/null
@@ -1,36 +0,0 @@
-
diff --git a/ui/src/app/widget/lib/rpc/svg/thumb-bar-checked.svg b/ui/src/app/widget/lib/rpc/svg/thumb-bar-checked.svg
deleted file mode 100644
index 57fa2b423e..0000000000
--- a/ui/src/app/widget/lib/rpc/svg/thumb-bar-checked.svg
+++ /dev/null
@@ -1,43 +0,0 @@
-
diff --git a/ui/src/app/widget/lib/rpc/svg/thumb-bar.svg b/ui/src/app/widget/lib/rpc/svg/thumb-bar.svg
deleted file mode 100644
index 0b952933a4..0000000000
--- a/ui/src/app/widget/lib/rpc/svg/thumb-bar.svg
+++ /dev/null
@@ -1,42 +0,0 @@
-
diff --git a/ui/src/app/widget/lib/rpc/svg/thumb-checked.svg b/ui/src/app/widget/lib/rpc/svg/thumb-checked.svg
deleted file mode 100644
index 6d59b94736..0000000000
--- a/ui/src/app/widget/lib/rpc/svg/thumb-checked.svg
+++ /dev/null
@@ -1,40 +0,0 @@
-
diff --git a/ui/src/app/widget/lib/rpc/svg/thumb.svg b/ui/src/app/widget/lib/rpc/svg/thumb.svg
deleted file mode 100644
index 03e9ea0f77..0000000000
--- a/ui/src/app/widget/lib/rpc/svg/thumb.svg
+++ /dev/null
@@ -1,37 +0,0 @@
-
diff --git a/ui/src/app/widget/lib/rpc/switch.directive.js b/ui/src/app/widget/lib/rpc/switch.directive.js
deleted file mode 100644
index 0105056dab..0000000000
--- a/ui/src/app/widget/lib/rpc/switch.directive.js
+++ /dev/null
@@ -1,314 +0,0 @@
-/*
- * Copyright © 2016-2020 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 './switch.scss';
-
-/* eslint-disable import/no-unresolved, import/default */
-
-import switchTemplate from './switch.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-export default angular.module('thingsboard.widgets.rpc.switch', [])
- .directive('tbSwitch', Switch)
- .name;
-
-/*@ngInject*/
-function Switch() {
- return {
- restrict: "E",
- scope: true,
- bindToController: {
- ctx: '='
- },
- controller: SwitchController,
- controllerAs: 'vm',
- templateUrl: switchTemplate
- };
-}
-
-/*@ngInject*/
-function SwitchController($element, $scope, types, utils) {
- let vm = this;
-
- vm.showTitle = false;
- vm.value = false;
- vm.error = '';
-
- var switchElement = angular.element('.switch', $element),
- switchContainer = angular.element('#switch-container', $element),
- mdSwitch = angular.element('md-switch', switchElement),
- onoffContainer = angular.element('.onoff-container', $element),
- onLabel = angular.element('.on-label', $element),
- offLabel = angular.element('.off-label', $element),
- switchTitleContainer = angular.element('.title-container', $element),
- switchTitle = angular.element('.switch-title', $element),
- textMeasure = angular.element('#text-measure', $element),
- switchErrorContainer = angular.element('.error-container', $element),
- switchError = angular.element('.switch-error', $element);
-
-
- vm.onValue = onValue;
-
- vm.valueSubscription = null;
-
- $scope.$watch('vm.ctx', () => {
- if (vm.ctx) {
- init();
- }
- });
-
- $scope.$on('$destroy', () => {
- if (vm.valueSubscription) {
- vm.ctx.subscriptionApi.removeSubscription(vm.valueSubscription.id);
- }
- });
-
- function init() {
-
- vm.title = angular.isDefined(vm.ctx.settings.title) ? vm.ctx.settings.title : '';
- vm.showTitle = vm.title && vm.title.length ? true : false;
- vm.showOnOffLabels = angular.isDefined(vm.ctx.settings.showOnOffLabels) ? vm.ctx.settings.showOnOffLabels : true;
- vm.ctx.resize = resize;
- $scope.$applyAsync(() => {
- resize();
- });
- var initialValue = angular.isDefined(vm.ctx.settings.initialValue) ? vm.ctx.settings.initialValue : false;
- setValue(initialValue);
-
- var subscription = vm.ctx.defaultSubscription;
- var rpcEnabled = subscription.rpcEnabled;
-
- vm.isSimulated = $scope.widgetEditMode;
-
- vm.requestTimeout = 500;
- if (vm.ctx.settings.requestTimeout) {
- vm.requestTimeout = vm.ctx.settings.requestTimeout;
- }
-
- vm.retrieveValueMethod = 'rpc';
- if (vm.ctx.settings.retrieveValueMethod && vm.ctx.settings.retrieveValueMethod.length) {
- vm.retrieveValueMethod = vm.ctx.settings.retrieveValueMethod;
- }
-
- vm.valueKey = 'value';
- if (vm.ctx.settings.valueKey && vm.ctx.settings.valueKey.length) {
- vm.valueKey = vm.ctx.settings.valueKey;
- }
-
- vm.parseValueFunction = (data) => data ? true : false;
- if (vm.ctx.settings.parseValueFunction && vm.ctx.settings.parseValueFunction.length) {
- try {
- vm.parseValueFunction = new Function('data', vm.ctx.settings.parseValueFunction);
- } catch (e) {
- vm.parseValueFunction = (data) => data ? true : false;
- }
- }
-
- vm.convertValueFunction = (value) => value;
- if (vm.ctx.settings.convertValueFunction && vm.ctx.settings.convertValueFunction.length) {
- try {
- vm.convertValueFunction = new Function('value', vm.ctx.settings.convertValueFunction);
- } catch (e) {
- vm.convertValueFunction = (value) => value;
- }
- }
-
- vm.getValueMethod = 'getValue';
- if (vm.ctx.settings.getValueMethod && vm.ctx.settings.getValueMethod.length) {
- vm.getValueMethod = vm.ctx.settings.getValueMethod;
- }
- vm.setValueMethod = 'setValue';
- if (vm.ctx.settings.setValueMethod && vm.ctx.settings.setValueMethod.length) {
- vm.setValueMethod = vm.ctx.settings.setValueMethod;
- }
- if (!rpcEnabled) {
- onError('Target device is not set!');
- } else {
- if (!vm.isSimulated) {
- if (vm.retrieveValueMethod == 'rpc') {
- rpcRequestValue();
- } else if (vm.retrieveValueMethod == 'attribute' || vm.retrieveValueMethod == 'timeseries') {
- subscribeForValue();
- }
- }
- }
- }
-
- const switchAspectRation = 2.7893;
-
- function resize() {
- var width = switchContainer.width();
- var height;
- if (vm.showOnOffLabels) {
- height = switchContainer.height()*2/3;
- } else {
- height = switchContainer.height();
- }
- var ratio = width/height;
- if (ratio > switchAspectRation) {
- width = height*switchAspectRation;
- } else {
- height = width/switchAspectRation;
- }
- switchElement.css({width: width, height: height});
- mdSwitch.css('height', height+'px');
- mdSwitch.css('width', width+'px');
- mdSwitch.css('min-width', width+'px');
- angular.element('.md-container', mdSwitch).css('height', height+'px');
- angular.element('.md-container', mdSwitch).css('width', width+'px');
-
-
- if (vm.showTitle) {
- setFontSize(switchTitle, vm.title, switchTitleContainer.height() * 2 / 3, switchTitleContainer.width());
- }
-
- if (vm.showOnOffLabels) {
- onoffContainer.css({width: width, height: switchContainer.height() / 3});
- setFontSize(onLabel, 'OFF', onoffContainer.height(), onoffContainer.width() / 2);
- setFontSize(offLabel, 'OFF', onoffContainer.height(), onoffContainer.width() / 2);
- }
-
- setFontSize(switchError, vm.error, switchErrorContainer.height(), switchErrorContainer.width());
- }
-
- function subscribeForValue() {
- var valueSubscriptionInfo = [{
- type: types.datasourceType.entity,
- entityType: types.entityType.device,
- entityId: vm.ctx.defaultSubscription.targetDeviceId
- }];
- if (vm.retrieveValueMethod == 'attribute') {
- valueSubscriptionInfo[0].attributes = [
- {name: vm.valueKey}
- ];
- } else {
- valueSubscriptionInfo[0].timeseries = [
- {name: vm.valueKey}
- ];
- }
- var subscriptionOptions = {
- callbacks: {
- onDataUpdated: onDataUpdated,
- onDataUpdateError: onDataUpdateError
- }
- };
- vm.ctx.subscriptionApi.createSubscriptionFromInfo (
- types.widgetType.latest.value, valueSubscriptionInfo, subscriptionOptions, false, true).then(
- (subscription) => {
- vm.valueSubscription = subscription;
- }
- );
- }
-
- function onDataUpdated(subscription, apply) {
- var value = false;
- var data = subscription.data;
- if (data.length) {
- var keyData = data[0];
- if (keyData && keyData.data && keyData.data[0]) {
- var attrValue = keyData.data[0][1];
- if (attrValue) {
- var parsed = null;
- try {
- parsed = vm.parseValueFunction(angular.fromJson(attrValue));
- } catch (e){/**/}
- value = parsed ? true : false;
- }
- }
- }
- setValue(value);
- if (apply) {
- $scope.$digest();
- }
- }
-
- function onDataUpdateError(subscription, e) {
- var exceptionData = utils.parseException(e);
- var errorText = exceptionData.name;
- if (exceptionData.message) {
- errorText += ': ' + exceptionData.message;
- }
- onError(errorText);
- }
-
- function setValue(value) {
- vm.value = value ? true : false;
- }
-
- function onValue() {
- rpcUpdateValue(vm.value);
- }
-
- function onError(error) {
- $scope.$applyAsync(() => {
- vm.error = error;
- setFontSize(switchError, vm.error, switchErrorContainer.height(), switchErrorContainer.width());
- });
- }
-
- function setFontSize(element, text, fontSize, maxWidth) {
- var textWidth = measureTextWidth(text, fontSize);
- while (textWidth > maxWidth) {
- fontSize--;
- textWidth = measureTextWidth(text, fontSize);
- }
- element.css({'fontSize': fontSize+'px', 'lineHeight': fontSize+'px'});
- }
-
- function measureTextWidth(text, fontSize) {
- textMeasure.css({'fontSize': fontSize+'px', 'lineHeight': fontSize+'px'});
- textMeasure.text(text);
- return textMeasure.width();
- }
-
- function rpcRequestValue() {
- vm.error = '';
- vm.ctx.controlApi.sendTwoWayCommand(vm.getValueMethod, null, vm.requestTimeout).then(
- (responseBody) => {
- setValue(vm.parseValueFunction(responseBody));
- },
- () => {
- var errorText = vm.ctx.defaultSubscription.rpcErrorText;
- onError(errorText);
- }
- );
- }
-
- function rpcUpdateValue(value) {
- if (vm.executingUpdateValue) {
- vm.scheduledValue = value;
- return;
- } else {
- vm.scheduledValue = null;
- vm.rpcValue = value;
- vm.executingUpdateValue = true;
- }
- vm.error = '';
- vm.ctx.controlApi.sendOneWayCommand(vm.setValueMethod, vm.convertValueFunction(value), vm.requestTimeout).then(
- () => {
- vm.executingUpdateValue = false;
- if (vm.scheduledValue != null && vm.scheduledValue != vm.rpcValue) {
- rpcUpdateValue(vm.scheduledValue);
- }
- },
- () => {
- vm.executingUpdateValue = false;
- var errorText = vm.ctx.defaultSubscription.rpcErrorText;
- onError(errorText);
- }
- );
- }
-}
diff --git a/ui/src/app/widget/lib/rpc/switch.scss b/ui/src/app/widget/lib/rpc/switch.scss
deleted file mode 100644
index 83c9c4e952..0000000000
--- a/ui/src/app/widget/lib/rpc/switch.scss
+++ /dev/null
@@ -1,134 +0,0 @@
-/**
- * Copyright © 2016-2020 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.
- */
-$thumb-img: url("./svg/thumb.svg") !default;
-$thumb-checked-img: url("./svg/thumb-checked.svg") !default;
-$thumb-bar-img: url("./svg/thumb-bar.svg") !default;
-$thumb-bar-checked-img: url("./svg/thumb-bar-checked.svg") !default;
-
-$error-height: 14px !default;
-
-.tb-switch {
- width: 100%;
- height: 100%;
-
- .error-container {
- position: absolute;
- top: 1%;
- right: 0;
- left: 0;
- z-index: 4;
- height: $error-height;
-
- .switch-error {
- color: #ff3315;
- white-space: nowrap;
- }
- }
-
- .onoff-container {
- height: 100%;
- font-weight: 500;
- color: #757575;
- white-space: nowrap;
-
- .off-label {
- color: #b7b5b5;
- }
-
- .on-label {
- color: #ff7e57;
- text-shadow: #ff6e4a 1px 1px 10px, #ffd1c3 1px 1px 10px;
- }
- }
-
- .title-container {
- .switch-title {
- font-weight: 500;
- color: #757575;
- white-space: nowrap;
- }
- }
-
- #switch-container {
- padding-right: 10px;
- padding-left: 10px;
- }
-
- .switch {
- position: relative;
-
- md-switch {
- position: absolute;
- top: 0;
- right: 0;
- bottom: 0;
- left: 0;
- margin: 0;
-
- .md-container {
- margin: 0;
- }
-
- .md-bar {
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
- background: $thumb-bar-img no-repeat;
- background-size: contain;
- border-radius: 0;
- }
-
- .md-thumb-container {
- top: 5%;
- left: .25%;
- width: 50%;
- height: 90%;
- }
-
- .md-thumb {
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
- background: $thumb-img no-repeat;
- background-size: contain;
- border-radius: 0;
- box-shadow: none;
- }
-
- &.md-checked {
- .md-bar {
- background: $thumb-bar-checked-img no-repeat;
- background-size: contain;
- }
-
- .md-thumb {
- background: $thumb-checked-img no-repeat;
- background-size: contain;
- }
- }
- }
- }
-
- #text-measure {
- position: absolute;
- width: auto;
- height: auto;
- white-space: nowrap;
- visibility: hidden;
- }
-}
diff --git a/ui/src/app/widget/lib/rpc/switch.tpl.html b/ui/src/app/widget/lib/rpc/switch.tpl.html
deleted file mode 100644
index 8b63bbd48e..0000000000
--- a/ui/src/app/widget/lib/rpc/switch.tpl.html
+++ /dev/null
@@ -1,39 +0,0 @@
-
-
-
- {{ vm.error }}
-
-
- {{vm.title}}
-
-
-
-
-
-
-
- OFF
-
- ON
-
-
-
-
-
diff --git a/ui/src/app/widget/lib/tencent-map.js b/ui/src/app/widget/lib/tencent-map.js
deleted file mode 100644
index ac6b4a8ea1..0000000000
--- a/ui/src/app/widget/lib/tencent-map.js
+++ /dev/null
@@ -1,499 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-var tmGlobals = {
- loadingTmId: null,
- tmApiKeys: {}
-}
-
-export default class TbTencentMap {
- constructor($containerElement, utils, initCallback, defaultZoomLevel, dontFitMapBounds, disableScrollZooming, minZoomLevel, tmApiKey, tmDefaultMapType, defaultCenterPosition, markerClusteringSetting) {
- var tbMap = this;
- this.utils = utils;
- this.defaultZoomLevel = defaultZoomLevel;
- this.dontFitMapBounds = dontFitMapBounds;
- this.minZoomLevel = minZoomLevel;
- this.tooltips = [];
- this.defaultMapType = tmDefaultMapType;
- this.defaultCenterPosition =defaultCenterPosition;
- this.isMarketCluster = markerClusteringSetting && markerClusteringSetting.isMarketCluster;
-
- function clearGlobalId() {
- if (tmGlobals.loadingTmId && tmGlobals.loadingTmId === tbMap.mapId) {
- tmGlobals.loadingTmId = null;
- }
- }
-
- function displayError(message) {
- $containerElement.html( // eslint-disable-line angular/angularelement
- "" + message + "
"
- );
- }
-
- function initTencentMap() {
- tbMap.map = new qq.maps.Map($containerElement[0], { // eslint-disable-line no-undef
- scrollwheel: !disableScrollZooming,
- mapTypeId: getTencentMapTypeId(tbMap.defaultMapType),
- zoom: tbMap.defaultZoomLevel || 8,
- center: new qq.maps.LatLng(tbMap.defaultCenterPosition[0],tbMap.defaultCenterPosition[1]) // eslint-disable-line no-undef
- });
-
- if (tbMap.isMarketCluster){
- tbMap.markersCluster = new qq.maps.MarkerCluster( // eslint-disable-line no-undef
- angular.merge({map:tbMap.map}, markerClusteringSetting)
- );
- }
-
-
- if (initCallback) {
- setTimeout(initCallback, 0);// eslint-disable-line
- }
- }
-
- /* eslint-disable no-undef */
-
- function getTencentMapTypeId(mapType) {
- var mapTypeId = qq.maps.MapTypeId.ROADMAP;
- if (mapType) {
- if (mapType === 'hybrid') {
- mapTypeId = qq.maps.MapTypeId.HYBRID;
- } else if (mapType === 'satellite') {
- mapTypeId = qq.maps.MapTypeId.SATELLITE;
- } else if (mapType === 'terrain') {
- mapTypeId = qq.maps.MapTypeId.ROADMAP;
- }
- }
- return mapTypeId;
- }
-
- /* eslint-enable no-undef */
-
- this.mapId = '' + Math.random().toString(36).substr(2, 9);
- this.apiKey = tmApiKey || '84d6d83e0e51e481e50454ccbe8986b';
-
- window.tm_authFailure = function () { // eslint-disable-line no-undef, angular/window-service
- if (tmGlobals.loadingTmId && tmGlobals.loadingTmId === tbMap.mapId) {
- tmGlobals.loadingTmId = null;
- tmGlobals.tmApiKeys[tbMap.apiKey].error = 'Unable to authentificate for tencent Map API.Please check your API key.';
- displayError(tmGlobals.tmApiKeys[tbMap.apiKey].error);
- }
- };
-
- this.initMapFunctionName = 'initTencentMap_' + this.mapId;
-
- window[this.initMapFunctionName] = function () { // eslint-disable-line no-undef, angular/window-service
- tmGlobals.tmApiKeys[tbMap.apiKey].loaded = true;
- initTencentMap();
- for (var p = 0; p < tmGlobals.tmApiKeys[tbMap.apiKey].pendingInits.length; p++) {
- var pendingInit = tmGlobals.tmApiKeys[tbMap.apiKey].pendingInits[p];
- pendingInit();
- }
- tmGlobals.tmApiKeys[tbMap.apiKey].pendingInits = [];
- };
- if (this.apiKey && this.apiKey.length > 0) {
- if (tmGlobals.tmApiKeys[this.apiKey]) {
- if (tmGlobals.tmApiKeys[this.apiKey].error) {
- displayError(tmGlobals.tmApiKeys[this.apiKey].error);
- } else if (tmGlobals.tmApiKeys[this.apiKey].loaded) {
- initTencentMap();
- } else {
- tmGlobals.tmApiKeys[this.apiKey].pendingInits.push(initTencentMap);
- }
- } else {
- tmGlobals.tmApiKeys[this.apiKey] = {
- loaded: false,
- pendingInits: []
- };
- var tencentMapScriptRes = 'https://map.qq.com/api/js?v=2.exp&key=' + this.apiKey + '&callback=' + this.initMapFunctionName;
-
- tmGlobals.loadingTmId = this.mapId;
- lazyLoad.load({type: 'js', path: tencentMapScriptRes}).then( // eslint-disable-line no-undef
- function success() {
- setTimeout(clearGlobalId, 2000); // eslint-disable-line no-undef, angular/timeout-service
- },
- function fail(e) {
- clearGlobalId();
- tmGlobals.tmApiKeys[tbMap.apiKey].error = 'tencent map api load failed!' + e;
- displayError(tmGlobals.tmApiKeys[tbMap.apiKey].error);
- }
- );
- }
- } else {
- displayError('No tencent Map Api Key provided!');
- }
- }
-
- inited() {
- return angular.isDefined(this.map);
- }
-
- createMarkerLabelStyle(settings) {
- return {
- width: "200px",
- textAlign: "center",
- color: settings.labelColor,
- background: "none",
- border: "none",
- fontSize: "12px",
- fontFamily: "\"Helvetica Neue\", Arial, Helvetica, sans-serif",
- fontWeight: "bold"
- };
- }
-
- /* eslint-disable no-undef,no-unused-vars*/
- updateMarkerLabel(marker, settings) {
- if (marker.label) {
- marker.label.setContent(settings.labelText);
- marker.label.setStyle(this.createMarkerLabelStyle(settings));
- }
- }
-
- /* eslint-enable no-undef,no-unused-vars */
-
- /* eslint-disable no-undef,no-unused-vars */
- updateMarkerColor(marker, color) {
- this.createDefaultMarkerIcon(marker, color, (iconInfo) => {
- marker.setIcon(iconInfo.icon);
- });
- }
-
- /* eslint-enable no-undef,,no-unused-vars */
-
- /* eslint-disable no-undef */
- updateMarkerIcon(marker, settings) {
- this.createMarkerIcon(marker, settings, (iconInfo) => {
- marker.setIcon(iconInfo.icon);
- if (marker.label) {
- marker.label.setOffset(new qq.maps.Size(-100, -iconInfo.size[1] - 20));
- }
- });
- }
-
- /* eslint-disable no-undef */
-
- /* eslint-disable no-undef */
- createMarkerIcon(marker, settings, onMarkerIconReady) {
- var currentImage = settings.currentImage;
- var tMap = this;
- if (currentImage && currentImage.url) {
- this.utils.loadImageAspect(currentImage.url).then(
- (aspect) => {
- if (aspect) {
- var width;
- var height;
- if (aspect > 1) {
- width = currentImage.size;
- height = currentImage.size / aspect;
- } else {
- width = currentImage.size * aspect;
- height = currentImage.size;
- }
- var icon = new qq.maps.MarkerImage(currentImage.url,
- new qq.maps.Size(width, height),
- new qq.maps.Point(0, 0),
- new qq.maps.Point(width / 2, height),
- new qq.maps.Size(width, height));
- var iconInfo = {
- size: [width, height],
- icon: icon
- };
- onMarkerIconReady(iconInfo);
- } else {
- tMap.createDefaultMarkerIcon(marker, settings.color, onMarkerIconReady);
- }
- }
- );
- } else {
- this.createDefaultMarkerIcon(marker, settings.color, onMarkerIconReady);
- }
- }
-
- /* eslint-enable no-undef */
-
- /* eslint-disable no-undef */
- createDefaultMarkerIcon(marker, color, onMarkerIconReady) {
- var pinColor = color.substr(1);
- var icon = new qq.maps.MarkerImage("https://chart.apis.google.com/chart?chst=d_map_pin_letter_withshadow&chld=%E2%80%A2|" + pinColor,
- new qq.maps.Size(40, 37),
- new qq.maps.Point(0, 0),
- new qq.maps.Point(10, 37));
- var iconInfo = {
- size: [40, 37],
- icon: icon
- };
- onMarkerIconReady(iconInfo);
- }
-
- /* eslint-enable no-undef */
-
- /* eslint-disable no-undef */
- createMarker(location, dsIndex, settings, onClickListener, markerArgs, onDragendListener) {
- var marker = new qq.maps.Marker({
- position: location
- });
- var tMap = this;
- this.createMarkerIcon(marker, settings, (iconInfo) => {
- marker.setIcon(iconInfo.icon);
- if(tMap.isMarketCluster) {
- tMap.markersCluster.addMarker(marker);
- } else {
- marker.setMap(tMap.map);
- }
- if (settings.showLabel) {
- marker.label = new qq.maps.Label({
- clickable: false,
- content: settings.labelText,
- offset: new qq.maps.Size(-100, -iconInfo.size[1] - 20),
- style: tMap.createMarkerLabelStyle(settings),
- visible: true,
- position: location,
- map: tMap.map,
- zIndex: 1000,
- draggable: settings.drraggable
- });
- }
- });
-
- if (settings.displayTooltip) {
- this.createTooltip(marker, dsIndex, settings, markerArgs);
- }
-
- if (onClickListener) {
- qq.maps.event.addListener(marker, 'click', onClickListener);
- }
-
- if (onDragendListener) {
- qq.maps.event.addListener(marker, 'dragend', onDragendListener);
- }
-
- return marker;
- }
-
- /* eslint-disable no-undef */
- removeMarker(marker) {
- marker.setMap(null);
- if (marker.label) {
- marker.label.setMap(null);
- }
- }
-
- /* eslint-enable no-undef */
-
- /* eslint-disable no-undef */
- createTooltip(marker, dsIndex, settings, markerArgs) {
- var popup = new qq.maps.InfoWindow({
- map: this.map
- });
- var map = this;
- if (settings.displayTooltipAction == 'hover') {
- qq.maps.event.addListener(marker, 'mouseover', function () {
- popup.open();
- popup.setPosition(marker);
- });
- qq.maps.event.addListener(marker, 'mouseout', function () {
- popup.close();
- });
- } else {
- qq.maps.event.addListener(marker, 'click', function () {
- if (settings.autocloseTooltip) {
- map.tooltips.forEach((tooltip) => {
- tooltip.popup.close();
- });
- }
- popup.open();
- popup.setPosition(marker);
- });
- }
- map.tooltips.push({
- markerArgs: markerArgs,
- popup: popup,
- locationSettings: settings,
- dsIndex: dsIndex
- });
- }
-
- /* eslint-enable no-undef */
-
- /* eslint-disable no-undef */
- updatePolylineColor(polyline, settings, color) {
- var options = {
- path: polyline.getPath(),
- strokeColor: color,
- strokeOpacity: settings.strokeOpacity,
- strokeWeight: settings.strokeWeight,
- map: this.map
- };
- polyline.setOptions(options);
- }
-
- /* eslint-enable no-undef */
-
- /* eslint-disable no-undef */
- createPolyline(locations, settings) {
- var polyline = new qq.maps.Polyline({
- path: locations,
- strokeColor: settings.color,
- strokeOpacity: settings.strokeOpacity,
- strokeWeight: settings.strokeWeight,
- map: this.map
- });
-
- return polyline;
- }
-
- /* eslint-enable no-undef */
-
- removePolyline(polyline) {
- polyline.setMap(null);
- }
-
- /* eslint-disable no-undef */
- createPolygon(latLangs, settings, location, onClickListener, markerArgs) {
- let polygon = new qq.maps.Polygon({
- map: this.map,
- path: latLangs,
- strokeColor: settings.polygonStrokeColor,
- fillColor: qq.maps.Color.fromHex(settings.polygonColor, settings.polygonOpacity),
- strokeWeight: settings.polygonStrokeWeight
- });
- //initialize-tooltip
- let popup = new qq.maps.InfoWindow({
- content: ''
- });
- if (!this.tooltips) this.tooltips = [];
- this.tooltips.push({
- markerArgs: markerArgs,
- popup: popup,
- locationSettings: settings,
- dsIndex: location.dsIndex
- });
-
- if (onClickListener) {
- qq.maps.event.addListener(polygon, 'click', function (event) {
- if (settings.autocloseTooltip) {
- map.tooltips.forEach((tooltip) => {
- tooltip.popup.close();
- });
- }
- if (settings.displayTooltip) {
- popup.setMap(this.map);
- popup.setPosition(event.latLng);
- popup.open();
- }
- onClickListener();
- });
- }
- return polygon;
- }
-
- /* eslint-disable no-undef */
-
- removePolygon (polygon) {
- polygon.setMap(null);
- }
-
- /* eslint-disable no-undef,no-unused-vars */
- updatePolygonColor (polygon, settings, color) {
- let options = {
- path: polygon.getPath(),
- map: this.map,
- strokeColor: color,
- fillColor: qq.maps.Color.fromHex(color, settings.polygonOpacity),
- strokeWeight: settings.polygonStrokeWeight
- }
- polygon.setOptions(options);
- }
- /* eslint-disable no-undef ,no-unused-vars*/
-
-
- getPolygonLatLngs(polygon) {
- return polygon.getPath().getArray();
- }
-
- setPolygonLatLngs(polygon, latLngs) {
- polygon.setPath(latLngs);
- }
-
- /* eslint-disable no-undef ,no-unused-vars*/
- fitBounds(bounds, useDefaultZoom) {
- if ((this.dontFitMapBounds || useDefaultZoom) && this.defaultZoomLevel) {
- this.map.setZoom(this.defaultZoomLevel);
- this.map.setCenter(bounds.getCenter());
- } else {
- var tbMap = this;
- qq.maps.event.addListenerOnce(this.map, 'bounds_changed', function () { // eslint-disable-line no-undef
- if (!tbMap.defaultZoomLevel && tbMap.map.getZoom() > tbMap.minZoomLevel) {
- tbMap.map.setZoom(tbMap.minZoomLevel);
- }
- });
- this.map.fitBounds(bounds);
- }
- }
-
- /* eslint-enable no-undef,no-unused-vars */
-
- createLatLng(lat, lng) {
- return new qq.maps.LatLng(lat, lng); // eslint-disable-line no-undef
- }
-
- extendBoundsWithMarker(bounds, marker) {
- bounds.extend(marker.getPosition());
- }
-
- getMarkerPosition(marker) {
- return marker.getPosition();
- }
-
- setMarkerPosition(marker, latLng) {
- marker.setPosition(latLng);
- if (marker.label) {
- marker.label.setPosition(latLng);
- }
- }
-
- getPolylineLatLngs(polyline) {
- return polyline.getPath().getArray();
- }
-
- setPolylineLatLngs(polyline, latLngs) {
- polyline.setPath(latLngs);
- }
-
- createBounds() {
- return new qq.maps.LatLngBounds(); // eslint-disable-line no-undef
- }
-
- extendBounds(bounds, polyline) {
- if (polyline && polyline.getPath()) {
- var locations = polyline.getPath();
- for (var i = 0; i < locations.getLength(); i++) {
- bounds.extend(locations.getAt(i));
- }
- }
- }
-
- invalidateSize() {
- qq.maps.event.trigger(this.map, "resize"); // eslint-disable-line no-undef
- }
-
- getTooltips() {
- return this.tooltips;
- }
-
- getCenter() {
- return this.map.getCenter();
- }
-
-}
diff --git a/ui/src/app/widget/lib/timeseries-table-widget.js b/ui/src/app/widget/lib/timeseries-table-widget.js
deleted file mode 100644
index 5922288ad7..0000000000
--- a/ui/src/app/widget/lib/timeseries-table-widget.js
+++ /dev/null
@@ -1,445 +0,0 @@
-/*
- * Copyright © 2016-2020 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 './timeseries-table-widget.scss';
-
-/* eslint-disable import/no-unresolved, import/default */
-
-import timeseriesTableWidgetTemplate from './timeseries-table-widget.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-import tinycolor from 'tinycolor2';
-import cssjs from '../../../vendor/css.js/css';
-
-export default angular.module('thingsboard.widgets.timeseriesTableWidget', [])
- .directive('tbTimeseriesTableWidget', TimeseriesTableWidget)
- .name;
-
-/*@ngInject*/
-function TimeseriesTableWidget() {
- return {
- restrict: "E",
- scope: true,
- bindToController: {
- tableId: '=',
- ctx: '='
- },
- controller: TimeseriesTableWidgetController,
- controllerAs: 'vm',
- templateUrl: timeseriesTableWidgetTemplate
- };
-}
-
-/*@ngInject*/
-function TimeseriesTableWidgetController($element, $scope, $filter, $timeout, types) {
- var vm = this;
- let dateFormatFilter;
-
- vm.sources = [];
- vm.sourceIndex = 0;
- vm.defaultPageSize = 10;
- vm.defaultSortOrder = '-0';
- vm.query = {
- "search": null
- };
-
- vm.enterFilterMode = enterFilterMode;
- vm.exitFilterMode = exitFilterMode;
- vm.onRowClick = onRowClick;
- vm.onActionButtonClick = onActionButtonClick;
- vm.actionCellDescriptors = [];
-
- function enterFilterMode () {
- vm.query.search = '';
- vm.ctx.hideTitlePanel = true;
- $timeout(()=>{
- angular.element(vm.ctx.$container).find('.searchInput').focus();
- })
- }
-
- function exitFilterMode () {
- vm.query.search = null;
- vm.ctx.hideTitlePanel = false;
- }
-
- vm.searchAction = {
- name: 'action.search',
- show: true,
- onAction: function() {
- vm.enterFilterMode();
- },
- icon: 'search'
- };
-
- $scope.$watch('vm.ctx', function() {
- if (vm.ctx) {
- vm.settings = vm.ctx.settings;
- vm.widgetConfig = vm.ctx.widgetConfig;
- vm.data = vm.ctx.data;
- vm.datasources = vm.ctx.datasources;
- initialize();
- }
- });
-
- function initialize() {
- vm.ctx.widgetActions = [ vm.searchAction ];
- vm.actionCellDescriptors = vm.ctx.actionsApi.getActionDescriptors('actionCellButton');
- vm.showTimestamp = vm.settings.showTimestamp !== false;
- dateFormatFilter = (vm.settings.showMilliseconds !== true) ? 'yyyy-MM-dd HH:mm:ss' : 'yyyy-MM-dd HH:mm:ss.sss';
- var origColor = vm.widgetConfig.color || 'rgba(0, 0, 0, 0.87)';
- var defaultColor = tinycolor(origColor);
- var mdDark = defaultColor.setAlpha(0.87).toRgbString();
- var mdDarkSecondary = defaultColor.setAlpha(0.54).toRgbString();
- var mdDarkDisabled = defaultColor.setAlpha(0.26).toRgbString();
- //var mdDarkIcon = mdDarkSecondary;
- var mdDarkDivider = defaultColor.setAlpha(0.12).toRgbString();
-
- var cssString = 'table.md-table th.md-column {\n'+
- 'color: ' + mdDarkSecondary + ';\n'+
- '}\n'+
- 'table.md-table th.md-column md-icon.md-sort-icon {\n'+
- 'color: ' + mdDarkDisabled + ';\n'+
- '}\n'+
- 'table.md-table th.md-column.md-active, table.md-table th.md-column.md-active md-icon {\n'+
- 'color: ' + mdDark + ';\n'+
- '}\n'+
- 'table.md-table td.md-cell {\n'+
- 'color: ' + mdDark + ';\n'+
- 'border-top: 1px '+mdDarkDivider+' solid;\n'+
- '}\n'+
- 'table.md-table td.md-cell.md-placeholder {\n'+
- 'color: ' + mdDarkDisabled + ';\n'+
- '}\n'+
- 'table.md-table td.md-cell md-select > .md-select-value > span.md-select-icon {\n'+
- 'color: ' + mdDarkSecondary + ';\n'+
- '}\n'+
- '.md-table-pagination {\n'+
- 'color: ' + mdDarkSecondary + ';\n'+
- 'border-top: 1px '+mdDarkDivider+' solid;\n'+
- '}\n'+
- '.md-table-pagination .buttons md-icon {\n'+
- 'color: ' + mdDarkSecondary + ';\n'+
- '}\n'+
- '.md-table-pagination md-select:not([disabled]):focus .md-select-value {\n'+
- 'color: ' + mdDarkSecondary + ';\n'+
- '}';
-
- var cssParser = new cssjs();
- cssParser.testMode = false;
- var namespace = 'ts-table-' + hashCode(cssString);
- cssParser.cssPreviewNamespace = namespace;
- cssParser.createStyleElement(namespace, cssString);
- $element.addClass(namespace);
-
- vm.displayPagination = angular.isDefined(vm.settings.displayPagination) ? vm.settings.displayPagination : true;
-
- function hashCode(str) {
- var hash = 0;
- var i, char;
- if (str.length === 0) return hash;
- for (i = 0; i < str.length; i++) {
- char = str.charCodeAt(i);
- hash = ((hash << 5) - hash) + char;
- hash = hash & hash;
- }
- return hash;
- }
- updateDatasources();
- }
-
- $scope.$on('timeseries-table-data-updated', function(event, tableId) {
- if (vm.tableId == tableId) {
- dataUpdated();
- }
- });
-
- function dataUpdated() {
- for (var s=0; s < vm.sources.length; s++) {
- var source = vm.sources[s];
- source.rawData = vm.data.slice(source.keyStartIndex, source.keyEndIndex);
- }
- updateSourceData(vm.sources[vm.sourceIndex]);
- $scope.$digest();
- }
-
- vm.onPaginate = function(source) {
- updatePage(source);
- }
-
- vm.onReorder = function(source) {
- reorder(source);
- updatePage(source);
- }
-
- function onRowClick($event, row) {
- if ($event) {
- $event.stopPropagation();
- }
- var descriptors = vm.ctx.actionsApi.getActionDescriptors('rowClick');
- if (descriptors.length) {
- var entityId = vm.ctx.activeEntityInfo.entityId;
- var entityName = vm.ctx.activeEntityInfo.entityName;
- var entityLabel = vm.ctx.activeEntityInfo.entityLabel;
- vm.ctx.actionsApi.handleWidgetAction($event, descriptors[0], entityId, entityName, row, entityLabel);
- }
- }
-
- function onActionButtonClick($event, row, actionDescriptor) {
- if ($event) {
- $event.stopPropagation();
- }
- var entityId = vm.ctx.activeEntityInfo.entityId;
- var entityName = vm.ctx.activeEntityInfo.entityName;
- var entityLabel = vm.ctx.activeEntityInfo.entityLabel;
- vm.ctx.actionsApi.handleWidgetAction($event, actionDescriptor, entityId, entityName, row, entityLabel);
- }
-
-
- vm.cellStyle = function(source, index, value) {
- var style = {};
- if (index > 0) {
- var styleInfo = source.ts.stylesInfo[index-1];
- if (styleInfo.useCellStyleFunction && styleInfo.cellStyleFunction) {
- try {
- style = styleInfo.cellStyleFunction(value);
- } catch (e) {
- style = {};
- }
- }
- }
- return style;
- }
-
- vm.cellContent = function(source, index, row, value) {
- if (index === 0) {
- return $filter('date')(value, dateFormatFilter);
- } else {
- var strContent = '';
- if (angular.isDefined(value)) {
- strContent = ''+value;
- }
- var content = strContent;
- var contentInfo = source.ts.contentsInfo[index-1];
- if (contentInfo.useCellContentFunction && contentInfo.cellContentFunction) {
- try {
- var rowData = source.ts.rowDataTemplate;
- rowData['Timestamp'] = row[0];
- for (var h=0; h < source.ts.header.length; h++) {
- var headerInfo = source.ts.header[h];
- rowData[headerInfo.dataKey.name] = row[headerInfo.index];
- }
- content = contentInfo.cellContentFunction(value, rowData, $filter);
- } catch (e) {
- content = strContent;
- }
- } else {
- var decimals = (contentInfo.decimals || contentInfo.decimals === 0) ? contentInfo.decimals : vm.widgetConfig.decimals;
- var units = contentInfo.units || vm.widgetConfig.units;
- content = vm.ctx.utils.formatValue(value, decimals, units, true);
- }
- return content;
- }
- }
-
- $scope.$watch('vm.sourceIndex', function(newIndex, oldIndex) {
- if (newIndex != oldIndex) {
- updateSourceData(vm.sources[vm.sourceIndex]);
- updateActiveEntityInfo();
- }
- });
-
- function updateActiveEntityInfo() {
- var source = vm.sources[vm.sourceIndex];
- var activeEntityInfo = null;
- if (source) {
- var datasource = source.datasource;
- if (datasource.type === types.datasourceType.entity &&
- datasource.entityType && datasource.entityId) {
- activeEntityInfo = {
- entityId: {
- entityType: datasource.entityType,
- id: datasource.entityId
- },
- entityName: datasource.entityName
- };
- }
- }
- vm.ctx.activeEntityInfo = activeEntityInfo;
- }
-
- function updateDatasources() {
- vm.sources = [];
- vm.sourceIndex = 0;
- var keyOffset = 0;
- if (vm.datasources) {
- for (var ds = 0; ds < vm.datasources.length; ds++) {
- var source = {};
- var datasource = vm.datasources[ds];
- source.keyStartIndex = keyOffset;
- keyOffset += datasource.dataKeys.length;
- source.keyEndIndex = keyOffset;
- source.datasource = datasource;
- source.data = [];
- source.rawData = [];
- source.query = {
- limit: vm.settings.defaultPageSize || 10,
- page: 1,
- order: '-0'
- }
- source.ts = {
- header: [],
- count: 0,
- data: [],
- stylesInfo: [],
- contentsInfo: [],
- rowDataTemplate: {}
- }
- source.ts.rowDataTemplate['Timestamp'] = null;
- for (var a = 0; a < datasource.dataKeys.length; a++ ) {
- var dataKey = datasource.dataKeys[a];
- var keySettings = dataKey.settings;
- source.ts.header.push({
- index: a+1,
- dataKey: dataKey
- });
- source.ts.rowDataTemplate[dataKey.label] = null;
-
- var cellStyleFunction = null;
- var useCellStyleFunction = false;
-
- if (keySettings.useCellStyleFunction === true) {
- if (angular.isDefined(keySettings.cellStyleFunction) && keySettings.cellStyleFunction.length > 0) {
- try {
- cellStyleFunction = new Function('value', keySettings.cellStyleFunction);
- useCellStyleFunction = true;
- } catch (e) {
- cellStyleFunction = null;
- useCellStyleFunction = false;
- }
- }
- }
-
- source.ts.stylesInfo.push({
- useCellStyleFunction: useCellStyleFunction,
- cellStyleFunction: cellStyleFunction
- });
-
- var cellContentFunction = null;
- var useCellContentFunction = false;
-
- if (keySettings.useCellContentFunction === true) {
- if (angular.isDefined(keySettings.cellContentFunction) && keySettings.cellContentFunction.length > 0) {
- try {
- cellContentFunction = new Function('value, rowData, filter', keySettings.cellContentFunction);
- useCellContentFunction = true;
- } catch (e) {
- cellContentFunction = null;
- useCellContentFunction = false;
- }
- }
- }
-
- source.ts.contentsInfo.push({
- useCellContentFunction: useCellContentFunction,
- cellContentFunction: cellContentFunction,
- units: dataKey.units,
- decimals: dataKey.decimals
- });
-
- }
- vm.sources.push(source);
- }
- }
- updateActiveEntityInfo();
- }
-
- function updatePage(source) {
- var startIndex = source.query.limit * (source.query.page - 1);
- source.ts.data = source.data.slice(startIndex, startIndex + source.query.limit);
- }
-
- function reorder(source) {
- let searchRegExp = new RegExp(vm.query.search);
-
- source.data = $filter('orderBy')(source.data, source.query.order);
- if (vm.query.search !== null) {
- source.data = source.data.filter(function(item){
- for (let i = 0; i < item.length; i++) {
- if (vm.showTimestamp) {
- if (i === 0) {
- if (searchRegExp.test($filter('date')(item[i], dateFormatFilter))) {
- return true;
- }
- } else {
- if (searchRegExp.test(item[i])) {
- return true;
- }
- }
- } else {
- if (searchRegExp.test(item[i])) {
- return true;
- }
- }
- }
- });
- }
- }
-
- function convertData(data) {
- var rowsMap = {};
- for (var d = 0; d < data.length; d++) {
- var columnData = data[d].data;
- for (var i = 0; i < columnData.length; i++) {
- var cellData = columnData[i];
- var timestamp = cellData[0];
- var row = rowsMap[timestamp];
- if (!row) {
- row = [];
- row[0] = timestamp;
- for (var c = 0; c < data.length; c++) {
- row[c+1] = undefined;
- }
- rowsMap[timestamp] = row;
- }
- row[d+1] = cellData[1];
- }
- }
- var rows = [];
- for (var t in rowsMap) {
- if (vm.settings.hideEmptyLines)
- {
- var hideLine = true;
- for (var _c = 0; (_c < data.length) && hideLine; _c++) {
- if (rowsMap[t][_c+1])
- hideLine = false;
- }
- if (!hideLine)
- rows.push(rowsMap[t]);
- }
- else
- rows.push(rowsMap[t]);
- }
- return rows;
- }
-
- function updateSourceData(source) {
- source.data = convertData(source.rawData);
- source.ts.count = source.data.length;
- reorder(source);
- updatePage(source);
- }
-
-}
diff --git a/ui/src/app/widget/lib/timeseries-table-widget.scss b/ui/src/app/widget/lib/timeseries-table-widget.scss
deleted file mode 100644
index 9e8ed9ea3a..0000000000
--- a/ui/src/app/widget/lib/timeseries-table-widget.scss
+++ /dev/null
@@ -1,37 +0,0 @@
-/**
- * Copyright © 2016-2020 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-timeseries-table-widget {
- table.md-table thead.md-head > tr.md-row {
- height: 40px;
- }
-
- table.md-table tbody.md-body > tr.md-row,
- table.md-table tfoot.md-foot > tr.md-row {
- height: 38px;
- }
-
- .md-table-pagination > * {
- height: 46px;
- }
-
- .tb-data-table md-toolbar {
- z-index: 10;
- }
-
- md-tabs:not(.md-no-tab-content):not(.md-dynamic-height) {
- min-height: 0;
- }
-}
diff --git a/ui/src/app/widget/lib/timeseries-table-widget.tpl.html b/ui/src/app/widget/lib/timeseries-table-widget.tpl.html
deleted file mode 100644
index 1a7194b3f9..0000000000
--- a/ui/src/app/widget/lib/timeseries-table-widget.tpl.html
+++ /dev/null
@@ -1,104 +0,0 @@
-
-
diff --git a/ui/src/app/widget/lib/tripAnimation/trip-animation-widget.js b/ui/src/app/widget/lib/tripAnimation/trip-animation-widget.js
deleted file mode 100644
index b8aeda735b..0000000000
--- a/ui/src/app/widget/lib/tripAnimation/trip-animation-widget.js
+++ /dev/null
@@ -1,985 +0,0 @@
-/*
- * Copyright © 2016-2020 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 './trip-animation-widget.scss';
-import template from "./trip-animation-widget.tpl.html";
-import TbOpenStreetMap from '../openstreet-map';
-import L from 'leaflet';
-import 'leaflet-polylinedecorator'
-import tinycolor from "tinycolor2";
-import {fillPatternWithActions, isNumber, padValue, processPattern} from "../widget-utils";
-
-(function () {
- // save these original methods before they are overwritten
- var proto_initIcon = L.Marker.prototype._initIcon;
- var proto_setPos = L.Marker.prototype._setPos;
- var oldIE = (L.DomUtil.TRANSFORM === 'msTransform');
-
- L.Marker.addInitHook(function () {
- var iconOptions = this.options.icon && this.options.icon.options;
- var iconAnchor = iconOptions && this.options.icon.options.iconAnchor;
- if (iconAnchor) {
- iconAnchor = (iconAnchor[0] + 'px ' + iconAnchor[1] + 'px');
- }
- this.options.rotationOrigin = this.options.rotationOrigin || iconAnchor || 'center bottom';
- this.options.rotationAngle = this.options.rotationAngle || 0;
-
- // Ensure marker keeps rotated during dragging
- this.on('drag', function (e) {
- e.target._applyRotation();
- });
- });
-
- L.Marker.include({
- _initIcon: function () {
- proto_initIcon.call(this);
- },
-
- _setPos: function (pos) {
- proto_setPos.call(this, pos);
- this._applyRotation();
- },
-
- _applyRotation: function () {
- if (this.options.rotationAngle) {
- this._icon.style[L.DomUtil.TRANSFORM + 'Origin'] = this.options.rotationOrigin;
-
- if (oldIE) {
- // for IE 9, use the 2D rotation
- this._icon.style[L.DomUtil.TRANSFORM] = 'rotate(' + this.options.rotationAngle + 'deg)';
- } else {
- // for modern browsers, prefer the 3D accelerated version
- let rotation = ' rotateZ(' + this.options.rotationAngle + 'deg)';
- if (!this._icon.style[L.DomUtil.TRANSFORM].includes(rotation)) {
- this._icon.style[L.DomUtil.TRANSFORM] += rotation;
- }
- }
- }
- },
-
- setRotationAngle: function (angle) {
- this.options.rotationAngle = angle;
- this.update();
- return this;
- },
-
- setRotationOrigin: function (origin) {
- this.options.rotationOrigin = origin;
- this.update();
- return this;
- }
- });
-})();
-
-
-export default angular.module('thingsboard.widgets.tripAnimation', [])
- .directive('tripAnimation', tripAnimationWidget)
- .filter('tripAnimation', function ($filter) {
- return function (label) {
- label = label.toString();
-
- let translateSelector = "widgets.tripAnimation." + label;
- let translation = $filter('translate')(translateSelector);
-
- if (translation !== translateSelector) {
- return translation;
- }
-
- return label;
- }
- })
- .name;
-
-
-/*@ngInject*/
-function tripAnimationWidget() {
- return {
- restrict: "E",
- scope: true,
- bindToController: {
- ctx: '=',
- self: '='
- },
- controller: tripAnimationController,
- controllerAs: 'vm',
- templateUrl: template
- };
-}
-
-/*@ngInject*/
-function tripAnimationController($document, $scope, $log, $http, $timeout, $filter, $sce) {
- let vm = this;
-
- vm.initBounds = true;
-
- vm.markers = [];
- vm.index = 0;
- vm.dsIndex = 0;
- vm.minTime = 0;
- vm.minTimeIndex = 0;
- vm.maxTimeIndex = 0;
- vm.isPlaying = false;
- vm.trackingLine = {
- "type": "FeatureCollection",
- features: []
- };
- vm.speeds = [1, 5, 10, 25];
- vm.speed = 1;
- vm.trips = [];
- vm.activeTripIndex = 0;
-
- vm.showHideTooltip = showHideTooltip;
- vm.recalculateTrips = recalculateTrips;
-
- $scope.$watch('vm.ctx', function () {
- if (vm.ctx) {
- vm.utils = vm.ctx.$scope.$injector.get('utils');
- vm.settings = vm.ctx.settings;
- vm.widgetConfig = vm.ctx.widgetConfig;
- vm.data = vm.ctx.data;
- vm.datasources = vm.ctx.datasources;
- configureStaticSettings();
- initialize();
- initializeCallbacks();
- }
- });
-
-
- function initializeCallbacks() {
- vm.self.onDataUpdated = function () {
- createUpdatePath(true);
- };
-
- vm.self.onResize = function () {
- resize();
- };
-
- vm.self.typeParameters = function () {
- return {
- maxDatasources: 1, // Maximum allowed datasources for this widget, -1 - unlimited
- maxDataKeys: -1 //Maximum allowed data keys for this widget, -1 - unlimited
- }
- };
- return true;
- }
-
-
- function resize() {
- if (vm.map) {
- vm.map.invalidateSize();
- }
- }
-
- function initCallback() {
- //createUpdatePath();
- //resize();
- }
-
- vm.playMove = function (play) {
- if (play && vm.isPlaying) return;
- if (play || vm.isPlaying) vm.isPlaying = true;
- if (vm.isPlaying) {
- moveInc(1);
- vm.timeout = $timeout(function () {
- vm.playMove();
- }, 1000 / vm.speed)
- }
- };
-
- vm.moveNext = function () {
- vm.stopPlay();
- if (vm.staticSettings.usePointAsAnchor) {
- let newIndex = vm.maxTimeIndex;
- for (let index = vm.index + 1; index < vm.maxTimeIndex; index++) {
- if (vm.trips.some(function (trip) {
- return calculateCurrentDate(trip.timeRange, index).hasAnchor;
- })) {
- newIndex = index;
- break;
- }
- }
- moveToIndex(newIndex);
- } else moveInc(1);
- };
-
- vm.movePrev = function () {
- vm.stopPlay();
- if (vm.staticSettings.usePointAsAnchor) {
- let newIndex = vm.minTimeIndex;
- for (let index = vm.index - 1; index > vm.minTimeIndex; index--) {
- if (vm.trips.some(function (trip) {
- return calculateCurrentDate(trip.timeRange, index).hasAnchor;
- })) {
- newIndex = index;
- break;
- }
- }
- moveToIndex(newIndex);
- } else moveInc(-1);
- };
-
- vm.moveStart = function () {
- vm.stopPlay();
- moveToIndex(vm.minTimeIndex);
- };
-
- vm.moveEnd = function () {
- vm.stopPlay();
- moveToIndex(vm.maxTimeIndex);
- };
-
- vm.stopPlay = function () {
- if (vm.isPlaying) {
- vm.isPlaying = false;
- $timeout.cancel(vm.timeout);
- }
- };
-
- function moveInc(inc) {
- let newIndex = vm.index + inc;
- moveToIndex(newIndex);
- }
-
- function moveToIndex(newIndex) {
- if (newIndex > vm.maxTimeIndex || newIndex < vm.minTimeIndex) return;
- vm.index = newIndex;
- vm.animationTime = vm.minTime + vm.index * vm.staticSettings.normalizationStep;
- recalculateTrips();
- }
-
- function recalculateTrips() {
- vm.trips.forEach(function (value) {
- moveMarker(value);
- })
- }
-
- function initialize() {
- $scope.currentDate = $filter('date')(0, "yyyy.MM.dd HH:mm:ss");
-
- vm.self.actionSources = [vm.searchAction];
- vm.endpoint = vm.ctx.settings.endpointUrl;
- $scope.title = vm.ctx.widgetConfig.title;
- vm.utils = vm.self.ctx.$scope.$injector.get('utils');
-
- vm.showTimestamp = vm.settings.showTimestamp !== false;
- vm.ctx.$element = angular.element("#trip-animation-map", vm.ctx.$container);
- vm.defaultZoomLevel = 2;
- if (vm.ctx.settings.defaultZoomLevel) {
- if (vm.ctx.settings.defaultZoomLevel > 0 && vm.ctx.settings.defaultZoomLevel < 21) {
- vm.defaultZoomLevel = Math.floor(vm.ctx.settings.defaultZoomLevel);
- }
- }
- vm.dontFitMapBounds = vm.ctx.settings.fitMapBounds === false;
- vm.map = new TbOpenStreetMap(vm.ctx.$element, vm.utils, initCallback, vm.defaultZoomLevel, vm.dontFitMapBounds, vm.staticSettings.disableScrollZooming, null, vm.staticSettings.mapProvider);
- vm.map.bounds = vm.map.createBounds();
- vm.map.invalidateSize(true);
- vm.map.bounds = vm.map.createBounds();
-
- vm.tooltipActionsMap = {};
- var descriptors = vm.ctx.actionsApi.getActionDescriptors('tooltipAction');
- descriptors.forEach(function (descriptor) {
- if (descriptor) vm.tooltipActionsMap[descriptor.name] = descriptor;
- });
- }
-
- function configureStaticSettings() {
- let staticSettings = {};
- vm.staticSettings = staticSettings;
- //Calculate General Settings
- staticSettings.normalizationStep = vm.ctx.settings.normalizationStep || 1000;
- staticSettings.buttonColor = tinycolor(vm.widgetConfig.color).setAlpha(0.54).toRgbString();
- staticSettings.disabledButtonColor = tinycolor(vm.widgetConfig.color).setAlpha(0.3).toRgbString();
- staticSettings.polygonColor = tinycolor(vm.ctx.settings.polygonColor).toHexString();
- staticSettings.polygonStrokeColor = tinycolor(vm.ctx.settings.polygonStrokeColor).toHexString();
- staticSettings.mapProvider = vm.ctx.settings.mapProvider ? {name: vm.ctx.settings.mapProvider} : {name: "OpenStreetMap.Mapnik"};
- staticSettings.disableScrollZooming = vm.ctx.settings.disableScrollZooming || false;
- staticSettings.latKeyName = vm.ctx.settings.latKeyName || "latitude";
- staticSettings.lngKeyName = vm.ctx.settings.lngKeyName || "longitude";
- staticSettings.polKeyName = vm.ctx.settings.polKeyName || "coordinates";
- staticSettings.rotationAngle = vm.ctx.settings.rotationAngle || 0;
- staticSettings.polygonOpacity = vm.ctx.settings.polygonOpacity || 0.5;
- staticSettings.polygonStrokeOpacity = vm.ctx.settings.polygonStrokeOpacity || 1;
- staticSettings.polygonStrokeWeight = vm.ctx.settings.polygonStrokeWeight || 1;
- staticSettings.showPolygon = vm.ctx.settings.showPolygon || false;
- staticSettings.usePolygonColorFunction = vm.ctx.settings.usePolygonColorFunction || false;
- staticSettings.usePolygonTooltipFunction = vm.ctx.settings.usePolygonTooltipFunction || false;
- staticSettings.displayTooltip = vm.ctx.settings.showTooltip || false;
- staticSettings.defaultZoomLevel = vm.ctx.settings.defaultZoomLevel || true;
- staticSettings.showTooltip = false;
- staticSettings.label = vm.ctx.settings.label || "${entityName}";
- staticSettings.useLabelFunction = vm.ctx.settings.useLabelFunction || false;
- staticSettings.autocloseTooltip = vm.ctx.settings.autocloseTooltip || false;
- staticSettings.pointTooltipOnRightPanel = vm.ctx.settings.pointTooltipOnRightPanel || false;
- staticSettings.usePointAsAnchor = vm.ctx.settings.usePointAsAnchor || false;
- staticSettings.showLabel = vm.ctx.settings.showLabel || false;
- staticSettings.useTooltipFunction = vm.ctx.settings.useTooltipFunction || false;
- staticSettings.usePolylineDecorator = vm.ctx.settings.usePolylineDecorator || false;
- staticSettings.useDecoratorCustomColor = vm.ctx.settings.useDecoratorCustomColor || false;
- staticSettings.decoratorCustomColor = tinycolor(vm.ctx.settings.decoratorCustomColor).toHexString();
- staticSettings.decoratorSymbol = vm.ctx.settings.decoratorSymbol || "arrowHead";
- staticSettings.decoratorSymbolSize = vm.ctx.settings.decoratorSymbolSize || 10;
- staticSettings.decoratorOffset = vm.ctx.settings.decoratorOffset || "20px";
- staticSettings.endDecoratorOffset = vm.ctx.settings.endDecoratorOffset || "20px";
- staticSettings.decoratorRepeat = vm.ctx.settings.decoratorRepeat || "20px";
- staticSettings.tooltipPattern = vm.ctx.settings.tooltipPattern || "${entityName}\n" +
- "
\n" +
- "Time: ${formattedTs}\n" +
- "Latitude: ${latitude:7}\n" +
- "Longitude: ${longitude:7}";
- staticSettings.polygonTooltipPattern = vm.ctx.settings.polygonTooltipPattern || "${entityName}\n" +
- "
\n" +
- "Time: ${formattedTs}\n";
- staticSettings.tooltipOpacity = angular.isNumber(vm.ctx.settings.tooltipOpacity) ? vm.ctx.settings.tooltipOpacity : 1;
- staticSettings.tooltipColor = vm.ctx.settings.tooltipColor ? tinycolor(vm.ctx.settings.tooltipColor).toRgbString() : "#ffffff";
- staticSettings.tooltipFontColor = vm.ctx.settings.tooltipFontColor ? tinycolor(vm.ctx.settings.tooltipFontColor).toRgbString() : "#000000";
- staticSettings.pathColor = vm.ctx.settings.color ? tinycolor(vm.ctx.settings.color).toHexString() : "#ff6300";
- staticSettings.pathWeight = vm.ctx.settings.strokeWeight || 1;
- staticSettings.pathOpacity = vm.ctx.settings.strokeOpacity || 1;
- staticSettings.usePathColorFunction = vm.ctx.settings.useColorFunction || false;
- staticSettings.showPoints = vm.ctx.settings.showPoints || false;
- staticSettings.pointSize = vm.ctx.settings.pointSize || 1;
- staticSettings.markerImageSize = vm.ctx.settings.markerImageSize || 20;
- staticSettings.useMarkerImageFunction = vm.ctx.settings.useMarkerImageFunction || false;
- staticSettings.pointColor = vm.ctx.settings.pointColor ? tinycolor(vm.ctx.settings.pointColor).toHexString() : "#ff6300";
- staticSettings.markerImages = vm.ctx.settings.markerImages || [];
- staticSettings.icon = L.icon({
- iconUrl: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKoAAACqCAYAAAA9dtSCAAAAhnpUWHRSYXcgcHJvZmlsZSB0eXBlIGV4aWYAAHjadY7LDcAwCEPvTNERCBA+40RVI3WDjl+iNMqp7wCWBZbheu4Ox6AggVRzDVVMJCSopXCcMGIhLGPnnHybSyraNjBNoeGGsg/l8xeV1bWbmGnVU0/KdLqY2HPmH4xUHDVih7S2Gv34q8ULVzos2Vmq5r4AAAoGaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/Pgo8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJYTVAgQ29yZSA0LjQuMC1FeGl2MiI+CiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICB4bWxuczpleGlmPSJodHRwOi8vbnMuYWRvYmUuY29tL2V4aWYvMS4wLyIKICAgIHhtbG5zOnRpZmY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vdGlmZi8xLjAvIgogICBleGlmOlBpeGVsWERpbWVuc2lvbj0iMTcwIgogICBleGlmOlBpeGVsWURpbWVuc2lvbj0iMTcwIgogICB0aWZmOkltYWdlV2lkdGg9IjE3MCIKICAgdGlmZjpJbWFnZUhlaWdodD0iMTcwIgogICB0aWZmOk9yaWVudGF0aW9uPSIxIi8+CiA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgCjw/eHBhY2tldCBlbmQ9InciPz7hlLlNAAAABHNCSVQICAgIfAhkiAAAIABJREFUeNrtnXmcXFWZ97/Pubeq1+wJSQghhHQ2FUFlFVdUlEXAAVFBQZh3cAy4ESGbCBHIQiTKxHUW4FVwGcAFFMRhkWEZfZkBZJQkTRASIGHJQpbequ49z/vHre7cqrpVXd1da3edz6c+XX1rv+d3f+f3/M5zniPUW87WulAnTnN5i8IBYpnsttKoSZoVpitMFssoIIbSqIILxFIvVVGsQjdCQoSEKvtweMkIrwh0+gm6fMtWA7s2XicP1s92/ib1U7C/TfmCThrXyvm+5TgnzgwRWtUyDksL0GJigIJq8LevaWFnWMz+YzYJCHsRusSwHej2etiA8HT7Klld7406UAFou1yPdVyOclxmWZ8TRDnMaQT1AQtqU4AsBIxFOPsigAnAbBzwulAV/kdiPGK7+RuWJzaukUfrQB0hbfYSXRlz+TDKAWo50LiIpoBZEjAOoWckBVybRMXwCg6bvSSPta+UhXWgDrM293I912niSJvgTLeJ6eoFrJk1fNdAT4mAOCAueF28JA6/tsp/bbxWbq0DtUbb/EV6tTRwuvWY5bg0q59izeHScSYArfXpFHjB8/hd++rhy7TDCqjzlupFOJxshNNFQL0aZM7BNAPGDS5Ea7kf5ZcbVsh360CtsjZniV7qOFyIMscYYtYbwdGxC+qhEuOvtosbN6yRb9WBWsE26/M6PT6Bi9VykRNnnCaH19BeDGlg4uD3sAfhRr+Lm9vXyp/rQC1ngLRElxuHCwSmo3WA5u3glO0FvOz73LZxpXylDtTSa9ArUL7gNDDJJkaA9ixyT5sY2CR71GXdhm/I1+pALXKbvUSPcR1+KMrhUGfQoQZeKZZ9xvNY3r5C/r0O1CG2Q7+ih8UbucaJc5r6qVmjeiuuhk3wB7+Hq9u/KQ/UgTqYSH6xLnDiLBHlIPXqwCoZABwAdvvKDzdeK4vqQC00ml+o74g3scqJ8UG/p65Dy6pffdYrfG3DNfKLOlDzB0vnAd82hnH1Yb4CYAgmDfZ6Pt97dpUsrgM1CqSL9U4nzketV2fRSiPCaQCb5DGviy+3Xy+P14EKzPyqvrWxkR8JHF5n0erSrtbnDQsXtK+UX1WBWVFBFl2klzY28l91kFZfUx/EMNZ1+eX8ZfqvI5ZR5y3V60S5VAxO3RetbikgDvge921cKR8aMUCdgTY2f50bjeFT9dml2mmp7KxNPQk+8dwaeWJYA3XM+Tp22sHcCby77o3WpiuA8LyX5JL2lXL3sATqmy/Vw/0mfua4zLOJeqfXcpClSg8+X16/Sn4wrIA6c6HOaGjgYWOYXg+ahgFYDSh0+B5fb18ta4dF1D97iR7TGOePxqmDdNg4AhZEaXHjXD9vsZZl2rWkjDpzoc5ojPNHcZhSB+nwdASApK98vX2lrKpJRp19mR7REOcRcesgHb7UCkDMjbFy9mJdWHNAPfgcHefG+Llx6plPIwGs6oFruHruIv1C7QD1Q9rScih3mRhz6kw6csAqQpOJsXbOUj27JoA67zhuEuH4ugU1IgMs13G5fvYifU9VA3XuIr3ecfh4fbgf0WA9yI1zc9UCde5Svcw4fNl21zusigKdsk9RqwcCM+cv0UeKbzAMNcL/qh7jNvKQKA31BJMKAbIiPZ/n7V2wPndsWCFnVQmjaizWxL8IdZCWDZjhWz9PK+h9SsSsjsuZcxbr/6kKRp23VO82DifVdWllmFMHwaoiZWJYAYR9fpIz2q+T+yvGqLOX6medWB2kZWHQ8CHdf2Mgt4zXD4yCB/fdBVqdGEMu2DZooM5ZrEe5wlqbrGOpHABNA2cuCdAPQCPfs1iaN48TYGLMnb9kaKsEBg1Ux+VbIoyrJz6XB6D5gKi6v5R7rltOAOdi1yI22wMI581dop8vK1DnLtbLnBjH12eeShAgZQK0AHAWMuynsWeEdaUlJhwRYo7DFWUD6vzL9VjjstDvqeOrlPozckhnP0D7HrMFANWmAzYnWEssAcQwdd5SvbUsQCXGchEm14f8EutPMtgwDNDe4zbErDbi/xyyoY9doy6IEjabBGM4c95i/VRJgTp7kZ5iYpxYj/KLBFAigGQzwJl53EaDtk9v2pAzpMGNXolgye2fankkANDAICRA4e7ZRRqbP4mnBebVjf1BADTz3xxDsBId7IjsB6HmYUBV6PRhaweQTPVwHKa3QJOb8lBDtz5PVUJokBAwSuCvOo2Q6GJp+ypZWXRGnT+eq0XqIC16gNQLRiJYLxQsaYhpsxjWBgUjXu+EriScMEO5/0seO7/Xw+vfSfDgFz2Omqbs7AEbEWSRJ8gqRfN7wHG5+NBFeljRGXX+Mt2DMqquTQfBoLkAEAaepMAXAm7acBwGV+gxa2FnAt7ohCXvt5zxLp+j59v9gVaIjq7+qcsNDztMaKBvw7U+Zs1g1TSmLYULEGyK8eP1K+W8ogF13lL9thPjS/Uc00GAMwdb5Quc0t5Dyd5/VQOAvtQF05vg9MMtXz7d46DJGoDPy9HTDpx7fZyHXhBaYukyQDKH/hIDtfdCSexmzKZ1smfIQJ37FT3MaeVe9ZlaZ9Mh6E+JAGcOzam5hmcLnoUXOgKWXHuKz6nv9Jl9UIpm+/O1XfjLc4bDvhFj7vhU75t04JQNqClWxfLrZ66VM4asUZ1WLhTqIC04gs8VJNmQtrTpGjOsR9M2De7do9VCTwJe7IAJMeWGM3xev6GHr5ztMXuaBgxayOSLD9MnW2jcL4V7v59IDm1awn5XHxTe/+ZF+lH6v8b6eTPL57UO0jRmzDmjk3G/71+bgzEz9ahNj/pVIeHDi7vgiCnK6jN9Pni0z6RxClaih/j+WEygwQn9ltDvCGdV9T0spT2fxmG0H+PTwF2DBurcpbrKuDTUtWkejRkB0KzhPAKgaWC12c/fm4BOD46aqPzgfJ/3HuHT0pwCvTdI9BjYuVvo2QNmUuozK1wh13pgXM4GPjGooX/Ml3SsMZw9orOj+kuRy9SSmWZ8hknfZ0PZ0FAf2oLd+tDZA5tehaMPVH55scc9KxKc/E6floZUkDQUe1DgX37vMra1/xG9nPgVgbmL9ZZBAXVKMwtQZo5YbZprDr6QKD4jcaRXo6pNacmI+zu6oCsBRx6kPLkyyS++nuADR/nEnRRAh9oPDjzzvPCTxw0T4tV1qm2wGuB98y/Vtw146BfhNJERVr40XwRfqMWUaStFBVSpm29hdwJ27oUFx1s++xGfo+bZvsAHr7i/7aZ7Xd5IwiQ3B4NKRc/7NJo5GXiycKCepA1uA8f43SMYpPkAGiELMhlVyW0x+Qovd8DsFjj5cMuiT3ocNCmPBzrU5sJT7YZvPmRomxj6nqHxVCWVF2Aqev4vAK4tGKhzjuDGEbGVeCEeaC6AQpYRr1HmfeiW9GFzF8QsXPNhnzNP8Jk1zQYo8YeoP/OJTYVrfuYydUzEHL5UAaOmRhuniVkzLtW3bV4rT/YL1IkX6VTX5ehhnRSdI5ljwBF85nNs9tAvCj0ebOmEd05SLn6v5eIzPJqbU8/xSowOB+58xOHeF4QpzaQnn0Qwa0W7JQmNjVwJnNEvUCeM4yz1aBsR4ByIBo2ymMiO+sPP7/HhxT3QNhZuOsfntHf5jB+txdefedjU82D1r1zGxDIAGpo2lYgovOyhP4Hr4bgc3vYFnbVpnTyXF6gmzvtNKhIbUUN8Ln80l0kf9kAJ2VHAvgS8koCTpiurzrJ88gMexqQeL+d5deDWe1we2wazx6a+s4kAYoWAGdVP6nNIbBR/B6zJC1T1ONXKCARoLv0p0UN6VnRvoSMJr+yAjx6mXPABn1OO84nHGbr/OZhmYMdu4Ya7DYeMCmRweIiXzGE/pWWlwjLAGLDKu/ICdc4iPcltJFbz0X4hETwR0XkOiykzMNKMpJLXuiAmcNocy4Vf9HnXYX5AW0Uf4m3hgtLALb9z2LBHmNYaETBJP4xaIbKyQWx0Wl6NKvC5mh3yhxIghSLPXGDNnPK0Fnb1wK7XYeHJljOO93nX4ak3KHqA1GvAFvi+Dry2Q/jyXQ4zR2Xo0ah0vioKqNBgBcCcJXpyeIugNKA6DcytufVQ+QDaX4AEheeBhkz75zpgZhP8wzGWBad5zDgw9WDRz53N+IEFokmUq2+NMTYGTig5Oi0puj9GrWCzHhjDRUA2UOdermepz4HDRn/2asvQWqO0/id/Hmjmfd8GFpPtgG9+3Ocjx1jePDMVSZUcoAMAqQtPPevwyz8bxjdGsKeka1IM6V5qFQBWfTAucyN/vWniMOMwuurnTAvNA7URw7nNON6bWmez80B7n5v04Lm9MDEOaz7qs/OmHhZ+0uPNh9jC80AL/mF+6qbZPlMh6EldlNff4dKtQWACQYAUNfSH0/qkygJo9Tho9mX7l1X3MaomOUqdGg+QNOOp/eWBRllMqeNJH7bshrGNcOunPd7zdstBk+yg80D7v/I0PwIL1KaPP2O45XGhbXIGADOCqKzhv0rYtPeUSIzWuOHgLKAKvBO/RgHajwYtKA80BerOBLyWgBOmKDec63PysSmLaSh5oDl/WKGeVWFsmkjAFTe7HDSB/ctMQktMcrGmSHX2u6+8F1idBlSniTF+Z40yaH9ZTOTIaArJgG4PXt4Fxx6s/PhTHke/2dLaTAkspoFW0C1Qmzpw76MOj74qTGkJsabJZtaqZtPwaGh5exqjzlusl1RNtD8UBu0HoH0gDUmCnSnP+H2HKEsu9ThyfonS7AbEoAPXpns74Iu3ukxozLG6NAc4RaoQpCnycJuZnHa5qnJkxQtLDCaTPqoMTub9zIVyPvg+vNEFm16Bk2db7v5qktu/lghA6lGcROU0ahhsalShbKrccp/LC3sJEq0zI/ywNiU3aKuu+dB2uZ7Vx6hOA2+pmD4daKrdQBk0dN8qbEnlgZ5yhGXhxz0OmZpKsyv6PLwdItoLD6Ce32ZY9zuHmaPJLtcTWvosUal9VC9g1YIjnADc7o4/V0cDLRVZadpfRZFCE0U0O2rvS7MDEh5s7YZkJyw/2XL2CR7zZqQAWvQAqVg1xk3BeP75Ay7rO6CtdT8wpR9zX2ogn0N9MHHeCuCOO5B3qs8BVQ/SXACNiu5TN8+HF/bB8ZODPNAFZ/i0NGsJ8kCLvcVI4Wy6eZuw5HbDrCnsz4yKAKfkGuqrGLAaJMmMAnAdw0QsLdUG0pzLPfph0L480L2BsLn5HJ8Tj/GZOlFLMLyXag+cwtn0+p+5jB8XXZVPckX2NZQdpz4T5izUo1wnxlRjaCjbsuhCQNrfco8IDSopD/TlLjjlEGXFmZZPn+jtl4sVj+CLDFIXHnzCcMvTqalSs7/omeRi0xrRphmnehQuB7omRpwKRfwDAmnofuaxTg+27YB3HKx873yP971NGd2i0bORVcmgg6E7Zd2dLrEQQMPaU2rMjspzukepMNm1SeaUTVhr4SDNXNaRWSdUCNbCJy2cNVf57AKP9xzhBz1QFR5oadn0rkddfvlXoW0S6eZ+ZqHeGhzu085IHIkrY1yxTCt3LmLO3TkiQBoubqsEeaB7ErD9NTjvnZYFp/q8Y57FdSlhHmg5mhT8tI4u+KffOEwfF/3SnKxZi2ANCKrBtTDKKBVCKv3P0YfK4mzphMkNcMHbLQvO8DikNw+0qAxa6uF96JH+bQ+43LdFaBtN3jS+rOK8NQjY1MTNdFdgTCWCqCytmiOC9yxs74K9b8DXTrF8+oM+cw8uZx5ouUBa2FRpMgGX/bvDjJZU0Yio1L2It6opbZqBGwvTXFUmVpDSs4EcKvm9aR8cNU656F2Wi0/zGdVcSxZTCbSpAyt/FGO7hbEZEb5kAFpqZZq0kLOjtLrAmHL2keZi01Amfo8Hm/fC9//O49TjKpkHWl0g/dvLws//ZDikaT+bZpFyPjat0abQ6EoBxXxLyqQZx5MWxjTA35YmmDlVK5wHWl1B1Lf/3WVzB0xpyWPw51MStRpMBTsPVc2XQYDnd8FDlyaZOdVW+TRnee2o514S1v3BcOiUbOBlDvsow2LID3VdY0WB2hfpp4b9Tg8+dZhyzJss+FJEgFbr5liFr4O69Icxpo7P/Qsj1z9JDQdRGZeqW94LI6KfQlOg3RbmTbU4Eiyqq80IvrhDvuvAfY8bHnhOmNQcKg2Zq2iEpvQrGfdrlUwDfLhuNX0pA3T7sGNfEPXXd2KBmAvPbRMSNg+2q6DCSckptdwcErnVdmoPpgYDL7welLl2JFUvaUiwr0ZdmnN8yckoJx/v85M/OLywT4i7RFt7IW06nLAqAQ48U+kv0XuiRaDZhZ/+1fDU84bGeLEuDRN4O1VTs2ZgYLUKY5ph6bkeL+6KYE4NFTzrHe5DBDBMQOtVR+/J/m47ZBR8/TaX13ZDU0MxPUCpQsAWxqrdCTh6nuXEucreRIaJkUv7Z4K2lmWU0G20vBU7c2eap05w3IFtHcJblzdwx8MO+7qFxpIBtgoKgg5AAnztk14wFObYoSVqNUQaRrUmQQrQZYDdlewvidg7vsmBqY3wj7e5/P0/xbjlPgcxSlPD/jI1xZMFlWbYwqwzz4fDZvmcNM+yJ5ED5/1tE1mjOkCg24iwvSJTbPlmTySoQjejBTbvES75lcsBFzfyvbtcXtkZMKxTVMBWmmELozrPE5adm2R7935WTUviyShhhA7qY6oRqfucie++6jMiTCv5j5ACgioy7EEBIzAhDuMa4M71hgefMOzYYXjTDGVsaxBsFGcFbSWzOAorUKoKo5sh3i38/lnD6Fjwst5zJVFZ/qGTWovmvwT7tv7BGNhb9i8e5ftF/BX2E50xML0Vunzh+48Y2i6Js+ymGO0vGmKxwG8sriRwytyjhUmApA+fOdHnTeMUL1RsI22TYO0nkKohZpWg7190Jr73qg+IcHg5Zxmj9jqSHI+Hk38l9X+zC+Nb4bEtwq8fd3h5i2H6ZGXaxFAZypLqk1K1wlh1bCvYhPCzpw3j4xmsmqH9s5Kna4xVJSCg3xkTo71sGwzkmI8mPHT1nmCTflzCx1O3A5qh0YVfPmM4bmmc89bE+X/PGHylSD5suRm2MLbo7oHPnOhx+ISguFvmVpbkWFZei80m0ESC3cYmSVTqR+QFK+kFaMMgFbP/vnFgVAO0TQ0Y9uwfxPjSd2Lc96RDU6MScwOdWzzGK6UXWxiiep9x+WkeryTS91jVPHsU5DtetdaUYa8orxo/yTabpKci+rQAZs1i1NCKSwkvFTYwuhEmN8FjLxrO+o7LsYsauPuPgRfb3FgrXmzhdtWJR/ucMcvSldoeKLy9eppWzbgGaspXFfbisdVY5XUMHeXdoL0wsPYBtpdJQ/9LmGGdEHgdaIrD7Amwr0f4zI9d/uGGGDff62IMNMRrwYstgFVT+RALTvPZuivipREbZQyAtKsp6t/Rfr08buzz/FEcXqsIrecCa56s9TQ5EAoacNLBqwYaYtA2Cp7dJXzxDodJX2jgxrtdXn9DaKpqL7YwVk0k4W1tlgXvsWzvZH+Jd0vezYVrxQGQIBd3L4D5222yG+iomOkfBdYMwPaB02QcM+mPp/0f0rFxF9pGB1vuLLzT4fxvxbjuZzH2dAtNcXCcUjCslJxVIaj1es77fcbEU6mRNkKrRthTWgOsKgasx9N9fojfw18qNpMo2W6A5NhdTsgB2FygDoEVBxwX2sbA9h5h3SOGWV+Kc+WPYjz3shCPQ6yqAFu4Vj1ituWcYyzbutLBmetv1qVQpaAVB/B5oI/T5i3WS5wG1tlEFXy7ge5+EqHDBlLY9/VOOKAJ3jPLcvHpHrOnKUkv2FequKwzmExwKUj/GgN7O2HW4gZmNgcXZNaoE958ArLyK6rRV3Wa4S9XSN+8DxtWyXekWrbuiWBYovRrmGEzCCxNBmR4r2nWloHJqUIO92wwHLkszvnXx3ny2QAcDbFi9t9grK3CgG0tjBsF3z/T47WuCLtKcwdS1cqqYsDr4tXw2QuGkG72VNX674xSNJGSIGO4TwNtoYB1Ai+2tRHaJsGjm4VPfC/GBWvj/GmDwXUpshc70LzYwiXAh4/2ees4xfOJLjqXY6q1KlvQb09kARXhUapxQ7QBaNi0gCyDYbPA64Qsr9BzxzQGCTD/+6rwkTUxPnRFnAeeMHT0CM0VyYstnFUnjoavfMxn8xukZVRpf/mq1TgJIOA4PJQFVHF5vKorahQC2DDDEu27Skin9bkDmY85wbA/eyK81il89qYY562JccfDDr4GLoJTVi+2MFbtSsB73+rzoVlKRyKHl1oLCSsC6rPPT7AlC6i2h7+oz56qT1bIBdh8myqEY5IMSZCpW8OTB2qCnIEpLbBln3DBj1wOvbSBnz/osG2n0NqkRZ48yMWwBU6tarC8euEZHj02VL7TZgeVmcFptdlV4vLShlXy0yygblwlt+GwlVppmYAlArDh4Z50cGZpWzIAm+HHxlxoGwtTGuHLd7icc32ctbfH2NspxGMBQErLsAWmAXpw9HzLBzNZlYj7uRi0wqAVB2yS9kzJut88TrBRHGqr5QMsRG5WK1FgzvRmnQgv1gQlO6a3QoeFlfc5zPpinHW/cNmwxdDSVGzAOqRnbRWuV5d+MskrIQdAbcQkQD4rsJJxlAt+kn9Js6rC/0x691X7nDjnVM12k0UAbL+TBxkyIW1yLCoZJvV8IzA6DuOb4Z52w73/47DlJcOMKcqksYH1ZW2xf1xhRaWsBnaV2Sc8/LyhOR4aMcgIOsnI/620r5oqYbRxlZybeQbS2rylmhCI1XyVEo3WcFmP5UmLy9pHgBz+pA1AuTcJr++Az73PctqxPse+xWIUepLl//mOA6/uEs5aHadHg0kACedEZASa4dTK3OgoD5tay13rr5XTcg79qS93t3Go/Sa5Ay+J2pQhc8MGMnIIInRreLrWuIG11XYg3Pa04bx/jnHxt2M8/BdDQzzQuOV0VXwfDj5A+ex7fJ7vzNakCumrVntr1FaYoGwgUR6NslUzWed+6zO8Wq5tbCJuWfkEmZWdw5o2c/Ig9fzxTTC2Af5zs+G0tTHOXhXnnj85eJYgL7ZMP7srtRJg3mhI+BEGQrVZU8F53ZzYxy+yRojMA+OOuGprrJnTVRkPwxuw+QKvKI2btcqT7H1HwytCY06gYbfuFm59yvDE0w7WE950iO0LukrNYA0xmNgIv/hfQ2ssu5R62grWCq+tMg5Yy8PPflO+2y+jblonL3k9/Lc4DN8mEfjNMXkQmcQdISH6ZrucdJsLA80NcEgLbNol/ONPHY5b2sAt/+GyuyNYeWBKCAbPh1OO8zl2qtLjkb9oRaVtqTgkLcsL6LJUu1Ib32Lo8rsZGW2ogVfETI+GCkJkmu0JD7Z0wzvGKae+zXLhSR4tTfRtNFwKVn3sGcMp62K0jUvX1mlBVYi6ys2oYkCV59evkEMj2TbyVcul2+vh8WHNqgPVsOQJvDLzYMnOiQ0zbDwWbFm+o1tY9aDD/MsauOF2l82vCs2NWsTp2aD1JOGYeZbzjwiVA8oo/yNK7pJA5dKnws05ZUHO1/ncqSOtkG7E5raRU7S5Aq+MGbC0mS+TvfLAjcH0liDV8Nv/6fCptXEW/iDO1p2C4xSzqEbQLviQT4MTrYuVyoIUYWuPz29z2m25Hph4xFV/Nc2cjTKWkdhyMSwMaPIgHLykJSyHcg+MQGsMPIU/bxPW/s5hx6uGyWNg2qSAYYc6eWAVZkyxbNlqeHKb9O3ekFWkrgIJ1RID3+O3z66SdQV2R3qbt0zXOC5frYrM/2rVsGTr1SwdG7F+KefKA4KJht0JcAXecaCy8GMebzrEEneDufzBjnSuA8+/Ihy1Is7c8Snr1EQDNW0lQBmA+sw3MCkBMrChH2DDtXKZeiSGa134oWrYnDkFOVyEyERuZ78sCN8f2wgtMXhqm3DCiiCR+8EngjTDwRY49i1MHa9MHg1+lWzxY1xQy+35QNovUFMn+ofGod4iNGx/1lbm6lgyVsmmadrwzFcqD6WvRsEkeOoV4e9vdvnEtXF+80eHhCeDyotVpLDXaHnOp1X2+Elu6RfQ/T0h0clNVnl1xLNqPyybL5Eb6T8vVjKcg8y82JY4TGgK8mLP/VeXj14T4/b/dNi1D1qbtSAv1jGwfTds3R0Ur0DyXIBSesCmSko+1L5afj1koG5aK09iud3E6tgcEGBzDf1EMGzGsu++93Ci82Jnj4Od3cLCO1w+fl2cdb+Ksacz0KD50gwb4sq/3e/2LWgMa9C+DStkIFHM0FvHTs4fRGybu81fpvtQWup7Pw1s2MyqsicEEwG9mxSHvctQtpYSHXhpaheU3mO+wvNd0OrCkvf7fPhIn/kHK109gSbtZdLGuHLrH1yu+I3L2DjpeQu56n+VEKgSZEn9dMO1ck5BgWDh/gbfFYfL1a/jsKDLP7S/a3jXl75xTFNACWcthf6XEEh7mVY1dbz3mAbx1+yWALCrHnC48TGHk95s+cz7fQ4cb1GE7Xvgxvtj/PzPhjHxDCAWEDiW6Pxs007WDtItzN0OvUjHxCfx3wba1NaxOBR7K9/CuvC28FkMG7K7sgz61H2rsMeD1ztgythAi768ByY3kw7SKL80qrByCUDrNEJPJ8ufXS1XFR2oAPMW65lOI7fbnjr2hgrWNMBGgC6rAG+uWlI58kjDOO/dBVEiAieRfqy1UgRQlk3PrJDZA7KxBvLkDavkDj/B/eLWcVcUayvPCtqo6dlwjYK0fIPQe4Xf06T2PtAcn5MXpKW7YBOe8o2BvmzA6Q++shxle92uKqJTQP/5BGnLu6McA0NkGXnppzByOSL7PrDFwCp3ta+UHw/mlA24zVmsV8Sb+MaISQOslIbtTxbkkRW5ejmytGeux4p5bQbM/tr6a2TyoEA+mBe1r5KrveQISgMsN8NGrHoNPzdrZYGJZuPMYV4KMfhLdS0qvk2yYtBsPNgX2i4uVa0OvmekAAAFN0lEQVTs9pTDHbBpOjIHGDOH/MxJg3xpijlBWuQ+NQ2A8JONq+WGoZyaQbf5y3SBcfnuiM+uqrQsKDThOV+F71IO+coL61fIzCGBfSgvXn+tfM9P8EDdBSgxyxItC6Sf+XrILQHKAVICW6zTT3LxkFl5qG+wewefUFhf16tlkAQRQIoEbmjZS+SK2gIkR7GifJRl7Wvk7iJfr4Nrcy7XD7hxfq8WU88FqKw0KF+v9/MRLqjH3etXyilFAX0x3qT9Ornf97myjpoKs22eNMNybp6dAunjxQJp0YAKsHGlXKPwfaexjp1q0rRl//hAAr68ew8nFVVGFPPNNqyQBdbj7npwNUKvkZSpn0jw+a3flR1VC1SA5D4uUsvTUk+0HpESxPos2bRa7goyDKoYqM9+S17u6OAj1uOluhMwouSG53ks3rhCbuRKNf0t1qs4UAG2fFu2+cpZ1rK9DtbhD1ITA2u5qn2VrC42k5ZFerddprNcl8eNYVw92Xr4Bm5quWrDKlnOlWq4CkVEawqoAHOX6PEi/MYYxtaXsQw/JvW6Wb6xL1NfpdhDflnNjLbLdFbM5U9imFBn1mGAUQELSfVYvvE6ubYcn1mWPaU3rZHnSHKKtWytW1c1DtLUigG1LCsXSMvGqL1t+iV6YOsY7hXDW2py55WRDtKggssryR4WP3ud/N9yfrYp54e9+B3Z2rOXUxTurc9g1RhIXVDhRT/JBeUGadkZNdzmL9MfolwUaPA6EKq5GRd8jz9teIr3co9UZA1yRWeG5y3WK43DVSmLo96qMbIPdtG7c8NKOb2iF0slP3zDKlnueZyMQ3s9yKpKPdrhWRZUGqQVZ9Te1vYFPcht5SdOnHfbZF0KVHyobwCboN3zuOTZ6+Q/qoTcq6fNXarLHMNioLU+OVABMATrm5IKP96wQv6+ylRIdbW2y/REt4Hr3BiH+z11di0bi8ZAfbb5HldvXC3fr0K5XJ1t7hJdaQyfM4Zxtu65llSLKnSrzx0bVsqnq/ZCqtYvtnGlLFHlE1Z51DRU8zet3YjeaQSrPOMluaCaQVrVjBpusxfpZ43LVY4wQ21dDgy1x1Ms+hIJ1q1fLdfVyNeujTZpgU6ZNJ6volwiDg3WqwN2wAANdiBBfW5KdnP9c9+Sv9bQ16+9Nm+Z3miEUxEmqV8HbEEMannDWh7ojnPu5uXSXYM/ozbbrK/qcfEGLgQuMA5OnWGze9a4QQkg9fmZ7/Oj9tVyTw3/nNpvc5fqdxzDqcAMgJHswfYu/VF40U9yX/tquXCYXHfDo02/XA9sjfE54GNOA4fZZAqwI4FlBYwTaFC/h3Yc/i2xj9/WkgYdMUBNcwm+otPcBtaJy9vVMkOcYQjaFDitD+LwgrU8Tg/f2PBN+cswvRaHb5t5qc5pbOIjwIeBE00cV72QNNDa66k+5uzGF5c7reWRnje44/nvyuZhPmiMnDZ7sX7MgQtNjNlqOdA4jFIF/MHv2FzSzknt3oeAeuwTl5d8j/We5Z+fWyW/G2Gx4Qhsp2rznLfw0VgDb7IeR6rleLeJMWqBwGfMvbVOCXsgbdNeB7wutiP8t+PwB7+LLRvWyE9HsIlRb72tbbH+o1jeEWvgbUCjWg5AaRZDS2qD2bTtHiHP5mahs5tZO79vJz4PrNJhDHsx7ETZ7Sd4Rg0PDWbnkDpQR2ibc7l+QAzjxXCQG8OxPgep5WCECWppQhiD0gK0oDQBjgiuQhLFqtAp0IWwG9iH0iGGXeKwSYTtNkmPtWy1Pq88u0Yerp/x3O3/A6qXxURxUsm4AAAAAElFTkSuQmCC",
- iconSize: [30, 30],
- iconAnchor: [15, 15]
- });
-
- if (vm.ctx.settings.useCustomProvider && vm.ctx.settings.customProviderTileUrl) {
- staticSettings.mapProvider.name = vm.ctx.settings.customProviderTileUrl;
- staticSettings.mapProvider.isCustom = true;
- }
-
- if (angular.isDefined(vm.ctx.settings.markerImage)) {
- staticSettings.icon = L.icon({
- iconUrl: vm.ctx.settings.markerImage,
- iconSize: [staticSettings.markerImageSize, staticSettings.markerImageSize],
- iconAnchor: [(staticSettings.markerImageSize / 2), (staticSettings.markerImageSize / 2)]
- })
- }
-
- if (staticSettings.usePathColorFunction && angular.isDefined(vm.ctx.settings.colorFunction)) {
- staticSettings.colorFunction = new Function('data, dsData, dsIndex', vm.ctx.settings.colorFunction);
- }
-
- if (staticSettings.usePointAsAnchor && angular.isDefined(vm.ctx.settings.pointAsAnchorFunction)) {
- staticSettings.pointAsAnchorFunction = new Function('data, dsData, dsIndex', vm.ctx.settings.pointAsAnchorFunction);
- }
-
- if (staticSettings.usePolygonTooltipFunction && angular.isDefined(vm.ctx.settings.polygonTooltipFunction)) {
- staticSettings.polygonTooltipFunction = new Function('data, dsData, dsIndex', vm.ctx.settings.polygonTooltipFunction);
- }
-
- if (staticSettings.useLabelFunction && angular.isDefined(vm.ctx.settings.labelFunction)) {
- staticSettings.labelFunction = new Function('data, dsData, dsIndex', vm.ctx.settings.labelFunction);
- }
-
- if (staticSettings.useTooltipFunction && angular.isDefined(vm.ctx.settings.tooltipFunction)) {
- staticSettings.tooltipFunction = new Function('data, dsData, dsIndex', vm.ctx.settings.tooltipFunction);
- }
-
- if (staticSettings.usePolygonColorFunction && angular.isDefined(vm.ctx.settings.polygonColorFunction)) {
- staticSettings.polygonColorFunction = new Function('data, dsData, dsIndex', vm.ctx.settings.polygonColorFunction);
- }
-
- if (staticSettings.useMarkerImageFunction && angular.isDefined(vm.ctx.settings.markerImageFunction)) {
- staticSettings.markerImageFunction = new Function('data, images, dsData, dsIndex', vm.ctx.settings.markerImageFunction);
- }
-
- if (!staticSettings.useMarkerImageFunction &&
- angular.isDefined(vm.ctx.settings.markerImage) &&
- vm.ctx.settings.markerImage.length > 0) {
- staticSettings.useMarkerImage = true;
- let url = vm.ctx.settings.markerImage;
- let size = staticSettings.markerImageSize || 20;
- staticSettings.currentImage = {
- url: url,
- size: size
- };
- vm.utils.loadImageAspect(staticSettings.currentImage.url).then(
- (aspect) => {
- if (aspect) {
- let width;
- let height;
- if (aspect > 1) {
- width = staticSettings.currentImage.size;
- height = staticSettings.currentImage.size / aspect;
- } else {
- width = staticSettings.currentImage.size * aspect;
- height = staticSettings.currentImage.size;
- }
- staticSettings.icon = L.icon({
- iconUrl: staticSettings.currentImage.url,
- iconSize: [width, height],
- iconAnchor: [width / 2, height / 2]
- });
- }
- if (vm.trips) {
- vm.trips.forEach(function (trip) {
- if (trip.marker) {
- trip.marker.setIcon(staticSettings.icon);
- }
- });
- }
- }
- )
- }
- }
-
- function configureTripSettings(trip, apply) {
- trip.settings = {};
- trip.settings.color = calculateColor(trip);
- trip.settings.polygonColor = calculatePolygonColor(trip);
- trip.settings.strokeWeight = vm.staticSettings.pathWeight;
- trip.settings.strokeOpacity = vm.staticSettings.pathOpacity;
- trip.settings.pointColor = vm.staticSettings.pointColor;
- trip.settings.polygonStrokeColor = vm.staticSettings.polygonStrokeColor;
- trip.settings.polygonStrokeOpacity = vm.staticSettings.polygonStrokeOpacity;
- trip.settings.polygonOpacity = vm.staticSettings.polygonOpacity;
- trip.settings.polygonStrokeWeight = vm.staticSettings.polygonStrokeWeight;
- trip.settings.pointSize = vm.staticSettings.pointSize;
- trip.settings.icon = calculateIcon(trip);
- if (apply) {
- $timeout(() => {
- trip.settings.labelText = calculateLabel(trip);
- trip.settings.tooltipText = $sce.trustAsHtml(calculateTooltip(trip));
- trip.settings.polygonTooltipText = $sce.trustAsHtml(calculatePolygonTooltip(trip));
- }, 0, true);
- } else {
- trip.settings.labelText = calculateLabel(trip);
- trip.settings.tooltipText = $sce.trustAsHtml(calculateTooltip(trip));
- trip.settings.polygonTooltipText = $sce.trustAsHtml(calculatePolygonTooltip(trip));
- }
- }
-
- function calculateLabel(trip) {
- let label = '';
- if (vm.staticSettings.showLabel) {
- let labelReplaceInfo;
- let labelText = vm.staticSettings.label;
- if (vm.staticSettings.useLabelFunction && angular.isDefined(vm.staticSettings.labelFunction)) {
- try {
- labelText = vm.staticSettings.labelFunction(vm.ctx.data, calculateCurrentDate(trip.timeRange, vm.index), trip.dsIndex);
- } catch (e) {
- labelText = null;
- }
- }
- labelText = vm.utils.createLabelFromDatasource(trip.dataSource, labelText);
- labelReplaceInfo = processPattern(labelText, vm.ctx.datasources, trip.dSIndex);
- label = fillPattern(labelText, labelReplaceInfo, calculateCurrentDate(trip.timeRange, vm.index));
- if (vm.staticSettings.useLabelFunction && angular.isDefined(vm.staticSettings.labelFunction)) {
- try {
- labelText = vm.staticSettings.labelFunction(vm.ctx.data, calculateCurrentDate(trip.timeRange, vm.index), trip.dSIndex);
- } catch (e) {
- labelText = null;
- }
- }
- }
- return label;
- }
-
- function calculateTooltip(trip) {
- let tooltip = '';
- if (vm.staticSettings.displayTooltip) {
- let tooltipReplaceInfo;
- let tooltipText = vm.staticSettings.tooltipPattern;
- if (vm.staticSettings.useTooltipFunction && angular.isDefined(vm.staticSettings.tooltipFunction)) {
- try {
- tooltipText = vm.staticSettings.tooltipFunction(vm.ctx.data, calculateCurrentDate(trip.timeRange, vm.index), trip.dSIndex);
- } catch (e) {
- tooltipText = null;
- }
- }
- tooltipText = vm.utils.createLabelFromDatasource(trip.dataSource, tooltipText);
- tooltipReplaceInfo = processPattern(tooltipText, vm.ctx.datasources, trip.dSIndex);
- tooltip = fillPattern(tooltipText, tooltipReplaceInfo, calculateCurrentDate(trip.timeRange, vm.index));
- tooltip = fillPatternWithActions(tooltip, 'onTooltipAction', null);
-
- }
- return tooltip;
- }
-
- function calculatePolygonTooltip(trip) {
- let tooltip = '';
- if (vm.staticSettings.displayTooltip) {
- let tooltipReplaceInfo;
- let tooltipText = vm.staticSettings.polygonTooltipPattern;
- if (vm.staticSettings.usePolygonTooltipFunction && angular.isDefined(vm.staticSettings.polygonTooltipFunction)) {
- try {
- tooltipText = vm.staticSettings.polygonTooltipFunction(vm.ctx.data, calculateCurrentDate(trip.timeRange, vm.index), trip.dSIndex);
- } catch (e) {
- tooltipText = null;
- }
- }
- tooltipText = vm.utils.createLabelFromDatasource(trip.dataSource, tooltipText);
- tooltipReplaceInfo = processPattern(tooltipText, vm.ctx.datasources, trip.dSIndex);
- tooltip = fillPattern(tooltipText, tooltipReplaceInfo, calculateCurrentDate(trip.timeRange, vm.index));
- tooltip = fillPatternWithActions(tooltip, 'onTooltipAction', null);
-
- }
- return tooltip;
- }
-
- function calculatePointTooltip(trip, index) {
- let tooltip = '';
- if (vm.staticSettings.displayTooltip) {
- let tooltipReplaceInfo;
- let tooltipText = vm.staticSettings.tooltipPattern;
- if (vm.staticSettings.useTooltipFunction && angular.isDefined(vm.staticSettings.tooltipFunction)) {
- try {
- tooltipText = vm.staticSettings.tooltipFunction(vm.ctx.data, calculateCurrentDate(trip.timeRange, index), trip.dSIndex);
- } catch (e) {
- tooltipText = null;
- }
- }
- tooltipText = vm.utils.createLabelFromDatasource(trip.dataSource, tooltipText);
- tooltipReplaceInfo = processPattern(tooltipText, vm.ctx.datasources, trip.dSIndex);
- tooltip = fillPattern(tooltipText, tooltipReplaceInfo, calculateCurrentDate(trip.timeRange, index));
- tooltip = fillPatternWithActions(tooltip, 'onTooltipAction', null);
-
- }
- return tooltip;
- }
-
- function calculateColor(trip) {
- let color = vm.staticSettings.pathColor;
- let colorFn;
- if (vm.staticSettings.usePathColorFunction && angular.isDefined(vm.staticSettings.colorFunction)) {
- try {
- colorFn = vm.staticSettings.colorFunction(vm.ctx.data, calculateCurrentDate(trip.timeRange, vm.index), trip.dSIndex);
- } catch (e) {
- colorFn = null;
- }
- }
- if (colorFn && colorFn !== color && trip.polyline) {
- trip.polyline.setStyle({color: colorFn});
- }
- return colorFn || color;
- }
-
- function calculatePolygonColor(trip) {
- let color = vm.staticSettings.polygonColor;
- let colorFn;
- if (vm.staticSettings.usePolygonColorFunction && angular.isDefined(vm.staticSettings.polygonColorFunction)) {
- try {
- colorFn = vm.staticSettings.polygonColorFunction(vm.ctx.data, calculateCurrentDate(trip.timeRange, vm.index), trip.dSIndex);
- } catch (e) {
- colorFn = null;
- }
- }
- if (colorFn && colorFn !== color && trip.polygon) {
- trip.polygon.setStyle({fillColor: colorFn});
- }
- return colorFn || color;
- }
-
- function calculateIcon(trip) {
- let icon = vm.staticSettings.icon;
- if (vm.staticSettings.useMarkerImageFunction && angular.isDefined(vm.staticSettings.markerImageFunction)) {
- let rawIcon;
- try {
- rawIcon = vm.staticSettings.markerImageFunction(vm.ctx.data, vm.staticSettings.markerImages, calculateCurrentDate(trip.timeRange, vm.index), trip.dSIndex);
- } catch (e) {
- rawIcon = null;
- }
- if (rawIcon) {
- vm.utils.loadImageAspect(rawIcon).then(
- (aspect) => {
- if (aspect) {
- let width;
- let height;
- if (aspect > 1) {
- width = rawIcon.size;
- height = rawIcon.size / aspect;
- } else {
- width = rawIcon.size * aspect;
- height = rawIcon.size;
- }
- icon = L.icon({
- iconUrl: rawIcon,
- iconSize: [width, height],
- iconAnchor: [width / 2, height / 2]
- });
- }
- if (trip.marker) {
- trip.marker.setIcon(icon);
- }
- }
- )
- }
- }
- return icon;
- }
-
- function createUpdatePath(apply) {
- if (vm.trips && vm.map) {
- vm.trips.forEach(function (trip) {
- if (trip.marker) {
- trip.marker.remove();
- delete trip.marker;
- }
- if (trip.polyline) {
- trip.polyline.remove();
- delete trip.polyline;
- }
- if (trip.polylineDecorator) {
- trip.polylineDecorator.remove();
- delete trip.polylineDecorator;
- }
- if (trip.polygon) {
- trip.polygon.remove();
- delete trip.polygon;
- }
- if (trip.points && trip.points.length) {
- trip.points.forEach(function (point) {
- point.remove();
- });
- delete trip.points;
- }
- });
- vm.initBounds = true;
- }
- createNormalizedTime(vm.data, vm.staticSettings.normalizationStep);
- createNormalizedTrips(vm.datasources, vm.data, vm.staticSettings.normalizationStep);
- createTripsOnMap(apply);
- if (vm.initBounds && !vm.initTrips) {
- vm.trips.forEach(function (trip) {
- vm.map.extendBounds(vm.map.bounds, trip.polyline);
- vm.initBounds = !vm.datasources.every(
- function (ds) {
- return ds.dataReceived === true;
- });
- vm.initTrips = vm.trips.every(function (trip) {
- return angular.isDefined(trip.marker) && angular.isDefined(trip.polyline);
- });
- });
-
- vm.map.fitBounds(vm.map.bounds);
- }
- }
-
- function fillPattern(pattern, replaceInfo, currentNormalizedValue) {
- let text = angular.copy(pattern);
- let reg = /\$\{([^}]*)\}/g;
- if (replaceInfo) {
- for (let v = 0; v < replaceInfo.variables.length; v++) {
- let variableInfo = replaceInfo.variables[v];
- let label = reg.exec(pattern)[1].split(":")[0];
- let txtVal = '';
- if (label.length > -1 && angular.isDefined(currentNormalizedValue[label])) {
- let varData = currentNormalizedValue[label];
- if (isNumber(varData)) {
- txtVal = padValue(varData, variableInfo.valDec, 0);
- } else {
- txtVal = varData;
- }
- }
- text = text.split(variableInfo.variable).join(txtVal);
- }
- }
- return text;
- }
-
- function createNormalizedTime(data, step) {
- if (!step) step = 1000;
- let max_time = -Infinity;
- let min_time = Infinity;
- if (data) {
- for (let i = 0; i < data.length; i++) {
- for (let j = 0; j < data[i].data.length; j++) {
- if (max_time < data[i].data[j][0]) {
- max_time = data[i].data[j][0]
- }
- if (min_time > data[i].data[j][0]) {
- min_time = data[i].data[j][0];
- }
- }
- }
- }
- vm.minTime = vm.animationTime = min_time;
- if(min_time === Infinity){
- vm.animationTime = null;
- } else {
- vm.animationTime = min_time
- }
- vm.maxTimeIndex = Math.ceil((max_time - min_time) / step);
- if (vm.index < vm.minTimeIndex) {
- vm.index = vm.minTimeIndex;
- } else if (vm.index > vm.maxTimeIndex) {
- vm.index = vm.maxTimeIndex;
- }
- }
-
- function createNormalizedTrips(dataSources, data, step) {
- vm.trips = [];
- step = step || 1000;
- if (dataSources && data) {
- for (let i = 0; i < dataSources.length; i++) {
- vm.trips.push({
- dataSource: dataSources[i],
- dSIndex: i,
- timeRange: {}
- })
- }
-
- for (let i = 0; i < data.length; i++) {
- let ds = data[i].datasource;
- let tripIndex = vm.trips.findIndex(function (el) {
- return el.dataSource.entityId === ds.entityId;
- });
- if (tripIndex > -1) {
- createNormalizedValue(data[i].data, data[i].dataKey.label, vm.trips[tripIndex].timeRange, step);
- }
- }
- }
-
- createNormalizedLatLngs();
- }
-
- function createNormalizedValue(dataArray, dataKey, timeRange, step) {
- for (let i = 0; i < dataArray.length; i++) {
- let normalizeTime = vm.minTime + Math.ceil((dataArray[i][0] - vm.minTime) / step) * step;
- timeRange[normalizeTime] = timeRange[normalizeTime] || {};
- timeRange[normalizeTime][dataKey] = dataArray[i][1];
- }
- }
-
- function createNormalizedLatLngs() {
- vm.trips.forEach(function (item) {
- item.latLngs = [];
- for (let timestamp in item.timeRange) {
- if(Object.prototype.hasOwnProperty.call(item.timeRange, timestamp)) {
- let lat = item.timeRange[timestamp][vm.staticSettings.latKeyName];
- let lng = item.timeRange[timestamp][vm.staticSettings.lngKeyName];
- if (lat && lng && vm.map) {
- item.timeRange[timestamp].latLng = vm.map.createLatLng(lat, lng);
- }
- item.latLngs.push(item.timeRange[timestamp].latLng);
- }
- }
- });
- }
-
- function createPointPopup(point, index, trip) {
- let popup = L.popup();
- popup.setContent(calculatePointTooltip(trip, index));
- point.bindPopup(popup, {autoClose: vm.staticSettings.autocloseTooltip, closeOnClick: false});
- return popup;
- }
-
- function createTripsOnMap(apply) {
- if (vm.trips.length > 0) {
- vm.trips.forEach(function (trip) {
- configureTripSettings(trip, apply);
- if (Object.keys(trip.timeRange).length > 0 && trip.latLngs.every(el => angular.isDefined(el))) {
- if (vm.staticSettings.showPoints) {
- trip.points = [];
- Object.keys(trip.timeRange).forEach(function (tRange, index) {
- if (trip.timeRange[tRange] && trip.timeRange[tRange].latLng
- && (!vm.staticSettings.usePointAsAnchor || vm.staticSettings.pointAsAnchorFunction(vm.ctx.data, trip.timeRange[tRange], trip.dSIndex))) {
- let point = L.circleMarker(trip.timeRange[tRange].latLng, {
- color: trip.settings.pointColor,
- radius: trip.settings.pointSize
- }).addTo(vm.map.map);
- if (vm.staticSettings.pointTooltipOnRightPanel) {
- point.popup = createPointPopup(point, index, trip);
- } else {
- point.on('click', function () {
- showHidePointTooltip(calculatePointTooltip(trip, index), index);
- });
- }
- if (vm.staticSettings.usePointAsAnchor) trip.timeRange[tRange].hasAnchor = true;
- trip.points.push(point);
- }
- });
- }
-
- if (angular.isUndefined(trip.marker)) {
- trip.polyline = vm.map.createPolyline(trip.latLngs, trip.settings);
- if (vm.staticSettings.usePolylineDecorator) {
- trip.polylineDecorator = L.polylineDecorator(trip.polyline, {
- patterns: [
- {
- offset: vm.staticSettings.decoratorOffset,
- endOffset: vm.staticSettings.endDecoratorOffset,
- repeat: vm.staticSettings.decoratorRepeat,
- symbol: L.Symbol[vm.staticSettings.decoratorSymbol]({
- pixelSize: vm.staticSettings.decoratorSymbolSize,
- polygon: false,
- pathOptions: {
- color: vm.staticSettings.useDecoratorCustomColor ? vm.staticSettings.decoratorCustomColor : trip.settings.color,
- stroke: true
- }
- })
- }
- ],
- interactive: false,
- }).addTo(vm.map.map);
- }
- }
-
-
- if (trip.timeRange && Object.keys(trip.timeRange).length && angular.isUndefined(trip.marker)) {
- trip.marker = L.marker(calculateCurrentDate(trip.timeRange, vm.index).latLng);
- trip.marker.setZIndexOffset(1000);
- trip.marker.setIcon(vm.staticSettings.icon);
- trip.marker.setRotationOrigin('center center');
- trip.marker.on('click', function () {
- showHideTooltip(trip);
- });
- trip.marker.addTo(vm.map.map);
- moveMarker(trip);
- }
- }
-
- if (vm.staticSettings.showPolygon && angular.isDefined(calculateCurrentDate(trip.timeRange, vm.index)[vm.staticSettings.polKeyName])) {
- let polygonSettings = {
- fill: true,
- fillColor: trip.settings.polygonColor,
- color: trip.settings.polygonStrokeColor,
- weight: trip.settings.polygonStrokeWeight,
- fillOpacity: trip.settings.polygonOpacity,
- opacity: trip.settings.polygonStrokeOpacity
- };
- let polygonLatLngsRaw = mapPolygonArray(angular.fromJson(calculateCurrentDate(trip.timeRange, vm.index)[vm.staticSettings.polKeyName]));
- trip.polygon = L.polygon(polygonLatLngsRaw, polygonSettings).addTo(vm.map.map);
- trip.polygon.on('click',function(){showHidePolygonTooltip(trip)});
- }
- });
- }
- }
-
- function calculateCurrentDate(tripTimeRange, index) {
- let time = vm.minTime + index * vm.staticSettings.normalizationStep;
- if (Object.hasOwnProperty.call(tripTimeRange, time)) {
- return tripTimeRange[time];
- } else {
- let timeInterval = Object.keys(tripTimeRange);
- for (let i = 1; i < timeInterval.length; i++) {
- if (timeInterval[i - 1] < time && timeInterval[i] > time) {
- let calcPosition = angular.copy(tripTimeRange[timeInterval[i - 1]]);
- let startLatLng = tripTimeRange[timeInterval[i - 1]].latLng;
- let finishLatLng = tripTimeRange[timeInterval[i]].latLng;
- let percentRouteComplete = (time - timeInterval[i - 1]) / (timeInterval[i] - timeInterval[i - 1]);
- calcPosition[vm.staticSettings.latKeyName] = startLatLng.lat + (finishLatLng.lat - startLatLng.lat) * percentRouteComplete;
- calcPosition[vm.staticSettings.lngKeyName] = startLatLng.lng + (finishLatLng.lng - startLatLng.lng) * percentRouteComplete;
- calcPosition.latLng = vm.map.createLatLng(calcPosition[vm.staticSettings.latKeyName], calcPosition[vm.staticSettings.lngKeyName]);
- calcPosition.angle = vm.staticSettings.rotationAngle + findAngle(startLatLng, finishLatLng);
- return calcPosition;
- }
- }
- }
- return {};
- }
-
- function findAngle(startPoint, endPoint) {
- let angle = -Math.atan2(endPoint.lat - startPoint.lat, endPoint.lng - startPoint.lng);
- angle = angle * 180 / Math.PI;
- return parseInt(angle.toFixed(2));
- }
-
- function mapPolygonArray(rawArray) {
- return rawArray.map(function (el) {
- if (el.length === 2) {
- if (!angular.isNumber(el[0]) && !angular.isNumber(el[1])) {
- return el.map(function (subEl) {
- return mapPolygonArray(subEl);
- })
- } else {
- return vm.map.createLatLng(el[0], el[1]);
- }
- } else if (el.length > 2) {
- return mapPolygonArray(el);
- } else {
- return vm.map.createLatLng(false);
- }
- });
- }
-
- function moveMarker(trip) {
- let postionMarker = calculateCurrentDate(trip.timeRange, vm.index);
- if (angular.isDefined(postionMarker)) {
- if (angular.isDefined(trip.marker)) {
- trip.markerAngleIsSet = true;
- trip.marker.setLatLng(postionMarker.latLng);
- trip.marker.setRotationAngle(postionMarker.angle);
- trip.marker.update();
- } else {
- if (trip.timeRange && trip.timeRange.length) {
- trip.marker = L.marker(postionMarker.latLng);
- trip.marker.setZIndexOffset(1000);
- trip.marker.setIcon(vm.staticSettings.icon);
- trip.marker.setRotationOrigin('center center');
- trip.marker.on('click', function () {
- showHideTooltip(trip);
- });
- trip.marker.addTo(vm.map.map);
- trip.marker.update();
- }
- }
- }
- configureTripSettings(trip);
- }
-
-
- function showHideTooltip(trip) {
- if (vm.staticSettings.displayTooltip) {
- if (vm.staticSettings.showTooltip && trip && (vm.activeTripIndex !== trip.dSIndex || vm.staticSettings.tooltipMarker !== 'marker')) {
- vm.staticSettings.showTooltip = true;
- vm.staticSettings.tooltipMarker = 'marker';
- } else {
- vm.staticSettings.showTooltip = !vm.staticSettings.showTooltip;
- }
- }
- if (trip && vm.activeTripIndex !== trip.dSIndex) vm.activeTripIndex = trip.dSIndex;
- if (vm.trips.length) {
- vm.mainTooltip = vm.trips[vm.activeTripIndex].settings.tooltipText;
- }
- }
-
- function showHidePointTooltip(text, index) {
- if (vm.staticSettings.displayTooltip) {
- if (vm.staticSettings.tooltipMarker && vm.staticSettings.tooltipMarker.includes('point')) {
- if (vm.staticSettings.tooltipMarker === 'point' + index) {
- vm.staticSettings.showTooltip = !vm.staticSettings.showTooltip;
- } else {
- vm.staticSettings.showTooltip = true;
- vm.mainTooltip = $sce.trustAsHtml(text);
- vm.staticSettings.tooltipMarker = 'point' + index;
- }
- } else {
- vm.staticSettings.showTooltip = true;
- vm.mainTooltip = $sce.trustAsHtml(text);
- vm.staticSettings.tooltipMarker = 'point' + index;
- }
- }
- }
-
- function showHidePolygonTooltip(trip) {
- if (vm.staticSettings.displayTooltip) {
- if (vm.staticSettings.showTooltip && trip && (vm.activeTripIndex !== trip.dSIndex || vm.staticSettings.tooltipMarker !== 'polygon')) {
- vm.staticSettings.showTooltip = true;
- vm.staticSettings.tooltipMarker = 'polygon';
- } else {
- vm.staticSettings.showTooltip = !vm.staticSettings.showTooltip;
- }
- }
- if (trip && vm.activeTripIndex !== trip.dSIndex) vm.activeTripIndex = trip.dSIndex;
- vm.mainTooltip = vm.trips[vm.activeTripIndex].settings.polygonTooltipText;
- }
-}
diff --git a/ui/src/app/widget/lib/tripAnimation/trip-animation-widget.scss b/ui/src/app/widget/lib/tripAnimation/trip-animation-widget.scss
deleted file mode 100644
index c38a8ebf2c..0000000000
--- a/ui/src/app/widget/lib/tripAnimation/trip-animation-widget.scss
+++ /dev/null
@@ -1,136 +0,0 @@
-/**
- * Copyright © 2016-2020 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.
- */
-.trip-animation-widget {
-
- position: relative;
- width: 100%;
- height: 100%;
- font-size: 16px;
- line-height: 24px;
-
- .trip-animation-label-container {
- height: 24px;
- }
-
- .trip-animation-container {
- position: relative;
- z-index: 1;
- flex: 1;
- width: 100%;
-
- #trip-animation-map {
- z-index: 1;
- width: 100%;
- height: 100%;
-
- .pointsLayerMarkerIcon {
- border-radius: 50%;
- }
- }
-
- .trip-animation-info-panel {
- position: absolute;
- top: 0;
- right: 0;
- z-index: 2;
- pointer-events: none;
-
- .md-button {
- top: 0;
- left: 0;
- width: 32px;
- min-width: 32px;
- height: 32px;
- min-height: 32px;
- padding: 0 0 2px;
- margin: 2px;
- line-height: 24px;
-
- ng-md-icon {
- width: 24px;
- height: 24px;
-
- svg {
- width: inherit;
- height: inherit;
- }
- }
- }
- }
-
- .trip-animation-tooltip {
- position: absolute;
- top: 38px;
- right: 0;
- z-index: 2;
- padding: 10px;
- background-color: #fff;
- transition: .3s ease-in-out;
-
- &-hidden {
- transform: translateX(110%);
- }
- }
- }
-
- .trip-animation-control-panel {
- position: relative;
- box-sizing: border-box;
- width: 100%;
- padding-bottom: 16px;
- padding-left: 10px;
-
- md-slider-container {
- md-slider {
- min-width: 80px;
- }
-
- button.md-button.md-icon-button {
- width: 44px;
- min-width: 44px;
- height: 44px;
- min-height: 44px;
- margin: 0;
- line-height: 28px;
-
- md-icon {
- width: 28px;
- height: 28px;
- font-size: 28px;
-
- svg {
- width: inherit;
- height: inherit;
- }
- }
- }
-
- md-select {
- margin: 0;
- }
- }
-
- .panel-timer {
- max-width: none;
- padding-right: 250px;
- padding-left: 90px;
- margin-top: -20px;
- font-size: 12px;
- font-weight: 500;
- text-align: center;
- }
- }
-}
diff --git a/ui/src/app/widget/lib/tripAnimation/trip-animation-widget.tpl.html b/ui/src/app/widget/lib/tripAnimation/trip-animation-widget.tpl.html
deleted file mode 100644
index 70ef09a59f..0000000000
--- a/ui/src/app/widget/lib/tripAnimation/trip-animation-widget.tpl.html
+++ /dev/null
@@ -1,71 +0,0 @@
-
-
diff --git a/ui/src/app/widget/lib/web-camera-input-widget.js b/ui/src/app/widget/lib/web-camera-input-widget.js
deleted file mode 100644
index e66c88b5f7..0000000000
--- a/ui/src/app/widget/lib/web-camera-input-widget.js
+++ /dev/null
@@ -1,223 +0,0 @@
-/*
- * Copyright © 2016-2020 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 './web-camera-input-widget.scss';
-
-/* eslint-disable import/no-unresolved, import/default */
-import webCameraWidgetTemplate from './web-camera-input-widget.tpl.html';
-/* eslint-enable import/no-unresolved, import/default */
-
-export default angular.module('thingsboard.widgets.webCameraWidget', [])
- .directive('tbWebCameraWidget', webCameraWidget)
- .name;
-
-/*@ngInject*/
-function webCameraWidget() {
- return {
- restrict: "E",
- scope: true,
- bindToController: {
- ctx: '='
- },
- controller: WebCameraWidgetController,
- controllerAs: 'vm',
- templateUrl: webCameraWidgetTemplate
- };
-}
-
-function WebCameraWidgetController($element, $scope, $window, types, utils, attributeService, Fullscreen) {
- let vm = this;
-
- vm.videoInput = [];
- vm.videoDevice = "";
- vm.previewPhoto = "";
- vm.isShowCamera = false;
- vm.isPreviewPhoto = false;
-
- let streamDevice = null;
- let indexWebCamera = 0;
- let videoElement = null;
- let canvas = null;
- let photoCamera = null;
- let dataKeyType = "";
- let width = 640;
- let height = 480;
-
- const DEFAULT_IMAGE_TYPE = 'image/jpeg';
- const DEFAULT_IMAGE_QUALITY = 0.92;
-
- vm.getStream = getStream;
- vm.createPhoto = createPhoto;
- vm.takePhoto = takePhoto;
- vm.switchWebCamera = switchWebCamera;
- vm.cancelPhoto = cancelPhoto;
- vm.closeCamera = closeCamera;
- vm.savePhoto = savePhoto;
-
- vm.isEntityDetected = false;
- vm.dataKeyDetected = false;
- vm.isCameraSupport = false;
- vm.isDeviceDetect = false;
-
- $scope.$watch('vm.ctx', function () {
- if (vm.ctx && vm.ctx.datasources && vm.ctx.datasources.length) {
- let datasource = vm.ctx.datasources[0];
- if (datasource.type === types.datasourceType.entity) {
- if (datasource.entityType && datasource.entityId) {
- if (vm.ctx.settings.widgetTitle && vm.ctx.settings.widgetTitle.length) {
- $scope.titleTemplate = utils.customTranslation(vm.ctx.settings.widgetTitle, vm.ctx.settings.widgetTitle);
- } else {
- $scope.titleTemplate = vm.ctx.widgetConfig.title;
- }
- vm.isEntityDetected = true;
- }
- }
- width = vm.ctx.settings.maxWidth ? vm.ctx.settings.maxWidth : 640;
- height = vm.ctx.settings.maxHeight ? vm.ctx.settings.maxWidth : 480;
- if (datasource.dataKeys.length) {
- $scope.currentKey = datasource.dataKeys[0].name;
- dataKeyType = datasource.dataKeys[0].type;
- vm.dataKeyDetected = true;
- }
- if (hasGetUserMedia()) {
- vm.isCameraSupport = true;
- getDevices().then(gotDevices).then(() => {
- vm.isDeviceDetect = !!vm.videoInput.length;
- });
- }
- }
- });
-
- function getVideoAspectRatio() {
- if (videoElement.videoWidth && videoElement.videoWidth > 0 &&
- videoElement.videoHeight && videoElement.videoHeight > 0) {
- return videoElement.videoWidth / videoElement.videoHeight;
- }
- return width / height;
- }
-
- vm.videoWidth = function() {
- const videoRatio = getVideoAspectRatio();
- return Math.min(width, height * videoRatio);
- }
-
- vm.videoHeight = function() {
- const videoRatio = getVideoAspectRatio();
- return Math.min(height, width / videoRatio);
- }
-
- function hasGetUserMedia() {
- return !!($window.navigator.mediaDevices && $window.navigator.mediaDevices.getUserMedia);
- }
-
- function takePhoto(){
- vm.isShowCamera = true;
- videoElement = $element[0].querySelector('#videoStream');
- photoCamera = $element[0].querySelector('#photoCamera');
- canvas = $element[0].querySelector('canvas');
- Fullscreen.enable(photoCamera);
- getStream();
- }
-
- function cancelPhoto() {
- vm.isPreviewPhoto = false;
- vm.previewPhoto = "";
- }
-
- function switchWebCamera() {
- indexWebCamera = (indexWebCamera+1)%vm.videoInput.length;
- vm.videoDevice = vm.videoInput[indexWebCamera].deviceId;
- getStream();
- }
-
- function getDevices() {
- return $window.navigator.mediaDevices.enumerateDevices();
- }
-
- function gotDevices(deviceInfos) {
- for (const deviceInfo of deviceInfos) {
- let device = {
- deviceId: deviceInfo.deviceId,
- label: ""
- };
- if (deviceInfo.kind === 'videoinput') {
- device.label = deviceInfo.label || `Camera ${vm.videoInput.length + 1}`;
- vm.videoInput.push(device);
- }
- }
- }
-
- function getStream() {
- if (streamDevice !== null) {
- streamDevice.getTracks().forEach(track => {
- track.stop();
- });
- }
- const constraints = {
- video: {deviceId: vm.videoDevice !== "" ? {exact: vm.videoDevice} : undefined}
- };
- return $window.navigator.mediaDevices.getUserMedia(constraints).then(gotStream);
- }
-
- function gotStream(stream) {
- streamDevice = stream;
- if(vm.videoDevice === ""){
- indexWebCamera = vm.videoInput.findIndex(option => option.label === stream.getVideoTracks()[0].label);
- indexWebCamera = indexWebCamera === -1 ? 0 : indexWebCamera;
- vm.videoDevice = vm.videoInput[indexWebCamera].deviceId;
- }
- videoElement.srcObject = stream;
- }
-
- function createPhoto() {
- canvas.width = vm.videoWidth();
- canvas.height = vm.videoHeight();
- canvas.getContext('2d').drawImage(videoElement, 0, 0, vm.videoWidth(), vm.videoHeight());
- const mimeType = vm.ctx.settings.imageFormat ? vm.ctx.settings.imageFormat : DEFAULT_IMAGE_TYPE;
- const quality = vm.ctx.settings.imageQuality ? vm.ctx.settings.imageQuality : DEFAULT_IMAGE_QUALITY;
- vm.previewPhoto = canvas.toDataURL(mimeType, quality);
- vm.isPreviewPhoto = true;
- }
-
- function closeCamera(){
- Fullscreen.cancel(photoCamera);
- vm.isShowCamera = false;
- if (streamDevice !== null) {
- streamDevice.getTracks().forEach(track => {
- track.stop();
- });
- }
- streamDevice = null;
- videoElement.srcObject = null;
- }
-
- function savePhoto(){
- let promiseData = null;
- let datasource = vm.ctx.datasources[0];
- let saveData = [{
- key: datasource.dataKeys[0].name,
- value: vm.previewPhoto
- }];
- if(dataKeyType === types.dataKeyType.attribute){
- promiseData = attributeService.saveEntityAttributes(datasource.entityType, datasource.entityId, types.attributesScope.server.value, saveData);
- } else if(dataKeyType === types.dataKeyType.timeseries){
- promiseData = attributeService.saveEntityTimeseries(datasource.entityType, datasource.entityId, "scope", saveData);
- }
- promiseData.then(()=>{
- vm.isPreviewPhoto = false;
- closeCamera();
- })
- }
-}
diff --git a/ui/src/app/widget/lib/web-camera-input-widget.scss b/ui/src/app/widget/lib/web-camera-input-widget.scss
deleted file mode 100644
index 7d2d8747ec..0000000000
--- a/ui/src/app/widget/lib/web-camera-input-widget.scss
+++ /dev/null
@@ -1,66 +0,0 @@
-/**
- * Copyright © 2016-2020 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-web-camera {
- height: 100%;
-
- &__last-photo{
- width: 100%;
- margin: 5px 0;
- text-align: center;
- border: solid 1px;
-
- &_text{
- position: absolute;
- top: 50%;
- left: 50%;
- margin-top: -.625em;
- transform: translate(-50%, -50%);
- }
-
- &_img{
- width: 100%;
- height: 100%;
- object-fit: contain;
- }
- }
-
- .camera {
- position: relative;
- width: 100%;
- height: 100%;
- overflow: hidden;
-
- .camera-stream{
- display: block;
- width: 100%;
- height: 100%;
- object-fit: contain;
- }
-
- .camera-controls {
- position: absolute;
- bottom: 0;
- width: 100%;
- padding: 0 5px 5px;
- }
- }
-
- .message-text{
- font-size: 18px;
- color: #a0a0a0;
- text-align: center;
- }
-}
diff --git a/ui/src/app/widget/lib/web-camera-input-widget.tpl.html b/ui/src/app/widget/lib/web-camera-input-widget.tpl.html
deleted file mode 100644
index c6923cf11e..0000000000
--- a/ui/src/app/widget/lib/web-camera-input-widget.tpl.html
+++ /dev/null
@@ -1,73 +0,0 @@
-
-
-
-
-
-
widgets.input-widgets.no-image
-
![]()
-
-
{{ "widgets.input-widgets.take-photo" | translate }}
-
-
-
-
-
-
-
- switch_camera
-
-
- photo_camera
-
-
- close
-
-
-
-
-
-
![]()
-
-
-
-
- close
-
-
- check
-
-
-
-
-
-
-
- {{ 'widgets.input-widgets.no-entity-selected' | translate }}
-
-
- {{ 'widgets.input-widgets.no-datakey-selected' | translate }}
-
-
- {{ 'widgets.input-widgets.no-support-web-camera' | translate }}
-
-
- {{ 'widgets.input-widgets.no-support-web-camera' | translate }}
-
-
diff --git a/ui/src/app/widget/lib/widget-utils.js b/ui/src/app/widget/lib/widget-utils.js
deleted file mode 100644
index a8d87a84d8..0000000000
--- a/ui/src/app/widget/lib/widget-utils.js
+++ /dev/null
@@ -1,216 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-const varsRegex = /\$\{([^}]*)\}/g;
-
-const linkActionRegex = /([^<]*)<\/link-act>/g;
-const buttonActionRegex = /([^<]*)<\/button-act>/g;
-
-export function processPattern(pattern, datasources, dsIndex) {
- var match = varsRegex.exec(pattern);
- var replaceInfo = {};
- replaceInfo.variables = [];
- while (match !== null) {
- var variableInfo = {};
- variableInfo.dataKeyIndex = -1;
- var variable = match[0];
- var label = match[1];
- var valDec = 2;
- var splitVals = label.split(':');
- if (splitVals.length > 1) {
- label = splitVals[0];
- valDec = parseFloat(splitVals[1]);
- }
- variableInfo.variable = variable;
- variableInfo.valDec = valDec;
-
- var keyIndex = -1;
-
- if (label.startsWith('#')) {
- var keyIndexStr = label.substring(1);
- var n = Math.floor(Number(keyIndexStr));
- if (String(n) === keyIndexStr && n >= 0) {
- keyIndex = n;
- }
- }
- var offset = 0;
- for (var i=0;i -1) {
- if (keyIndex < datasource.dataKeys.length) {
- variableInfo.dataKeyIndex = offset + keyIndex;
- }
- } else {
- for (var k = 0; k < datasource.dataKeys.length; k++) {
- var dataKey = datasource.dataKeys[k];
- if (dataKey.label === label) {
- variableInfo.dataKeyIndex = offset + k;
- break;
- }
- }
- }
- }
- offset += datasource.dataKeys.length;
- }
- replaceInfo.variables.push(variableInfo);
- match = varsRegex.exec(pattern);
- }
- return replaceInfo;
-}
-
-export function fillPattern(pattern, replaceInfo, data) {
- var text = angular.copy(pattern);
- if (replaceInfo) {
- for (var v = 0; v < replaceInfo.variables.length; v++) {
- var variableInfo = replaceInfo.variables[v];
- var txtVal = '';
- if (variableInfo.dataKeyIndex > -1 && data[variableInfo.dataKeyIndex]) {
- var varData = data[variableInfo.dataKeyIndex].data;
- if (varData.length > 0) {
- var val = varData[varData.length - 1][1];
- if (isNumber(val)) {
- txtVal = padValue(val, variableInfo.valDec, 0);
- } else {
- txtVal = val;
- }
- }
- }
- text = text.split(variableInfo.variable).join(txtVal);
- }
- }
- return text;
-}
-
-function createLink(actionName, actionText, actionCallbackName, additionalArgs) {
- var args = 'event,\''+actionName+'\'';
- if (additionalArgs && additionalArgs.length) {
- args += ','+additionalArgs.join();
- }
- return ''+actionText+'';
-}
-
-function createButton(actionName, actionText, actionCallbackName, additionalArgs) {
- var args = 'event,\''+actionName+'\'';
- if (additionalArgs && additionalArgs.length) {
- args += ','+additionalArgs.join();
- }
- return '';
-}
-
-export function fillPatternWithActions(pattern, actionCallbackName, additionalArgs) {
- var text = angular.copy(pattern);
- var match = linkActionRegex.exec(pattern);
- var actionTags;
- var actionName;
- var actionText;
- var actionHtml;
- while (match !== null) {
- actionTags = match[0];
- actionName = match[1];
- actionText = match[2];
- actionHtml = createLink(actionName, actionText, actionCallbackName, additionalArgs);
- text = text.split(actionTags).join(actionHtml);
- match = linkActionRegex.exec(pattern);
- }
- match = buttonActionRegex.exec(pattern);
- while (match !== null) {
- actionTags = match[0];
- actionName = match[1];
- actionText = match[2];
- actionHtml = createButton(actionName, actionText, actionCallbackName, additionalArgs);
- text = text.split(actionTags).join(actionHtml);
- match = buttonActionRegex.exec(pattern);
- }
- return text;
-}
-
-export function toLabelValueMap(data, datasources) {
- var dataMap = {};
- var dsDataMap = [];
- for (var d=0;d 0) {
- ts = keyData[keyData.length-1][0];
- val = keyData[keyData.length-1][1];
- }
- dataMap[label+'|ts'] = ts;
- dataMap[label] = val;
- var dsIndex = datasources.indexOf(data[i].datasource);
- dsDataMap[dsIndex][label+'|ts'] = ts;
- dsDataMap[dsIndex][label] = val;
- }
- return {
- dataMap: dataMap,
- dsDataMap: dsDataMap
- };
-}
-
-export function isNumber(n) {
- return !isNaN(parseFloat(n)) && isFinite(n);
-}
-
-export function padValue(val, dec, int) {
- var i = 0;
- var s, strVal, n;
-
- val = parseFloat(val);
- n = (val < 0);
- val = Math.abs(val);
-
- if (dec > 0) {
- strVal = val.toFixed(dec).toString().split('.');
- s = int - strVal[0].length;
-
- for (; i < s; ++i) {
- strVal[0] = '0' + strVal[0];
- }
-
- strVal = (n ? '-' : '') + strVal[0] + '.' + strVal[1];
- }
-
- else {
- strVal = Math.round(val).toString();
- s = int - strVal.length;
-
- for (; i < s; ++i) {
- strVal = '0' + strVal;
- }
-
- strVal = (n ? '-' : '') + strVal;
- }
-
- return strVal;
-}
-
-export function arraysEqual(a, b) {
- if (a === b) return true;
- if (a === null || b === null) return false;
- if (a.length != b.length) return false;
-
- for (var i = 0; i < a.length; ++i) {
- if (!arraysEqual(a[i],b[i])) return false;
- }
- return true;
-}
diff --git a/ui/src/app/widget/save-widget-type-as.controller.js b/ui/src/app/widget/save-widget-type-as.controller.js
deleted file mode 100644
index b6feb444cf..0000000000
--- a/ui/src/app/widget/save-widget-type-as.controller.js
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-/*@ngInject*/
-export default function SaveWidgetTypeAsController($mdDialog, $q, userService) {
-
- var vm = this;
-
- vm.saveAs = saveAs;
- vm.cancel = cancel;
-
- vm.widgetName;
- vm.widgetsBundle;
-
- vm.bundlesScope = 'system';
-
- if (userService.getAuthority() === 'TENANT_ADMIN') {
- vm.bundlesScope = 'tenant';
- }
-
- function cancel () {
- $mdDialog.cancel();
- }
-
- function saveAs () {
- $mdDialog.hide({widgetName: vm.widgetName, bundleId: vm.widgetsBundle.id.id, bundleAlias: vm.widgetsBundle.alias});
- }
-
-}
diff --git a/ui/src/app/widget/save-widget-type-as.tpl.html b/ui/src/app/widget/save-widget-type-as.tpl.html
deleted file mode 100644
index b41903d344..0000000000
--- a/ui/src/app/widget/save-widget-type-as.tpl.html
+++ /dev/null
@@ -1,60 +0,0 @@
-
-
-
-
diff --git a/ui/src/app/widget/select-widget-type.controller.js b/ui/src/app/widget/select-widget-type.controller.js
deleted file mode 100644
index c0530ae486..0000000000
--- a/ui/src/app/widget/select-widget-type.controller.js
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-/*@ngInject*/
-export default function SelectWidgetTypeController($mdDialog, types) {
-
- var vm = this;
-
- vm.types = types;
-
- vm.cancel = cancel;
- vm.typeSelected = typeSelected;
-
- function cancel() {
- $mdDialog.cancel();
- }
-
- function typeSelected(widgetType) {
- $mdDialog.hide(widgetType);
- }
-
-}
diff --git a/ui/src/app/widget/select-widget-type.tpl.html b/ui/src/app/widget/select-widget-type.tpl.html
deleted file mode 100644
index c19bfffae8..0000000000
--- a/ui/src/app/widget/select-widget-type.tpl.html
+++ /dev/null
@@ -1,81 +0,0 @@
-
-
-
-
diff --git a/ui/src/app/widget/widget-editor.controller.js b/ui/src/app/widget/widget-editor.controller.js
deleted file mode 100644
index 1fa6838b42..0000000000
--- a/ui/src/app/widget/widget-editor.controller.js
+++ /dev/null
@@ -1,666 +0,0 @@
-/*
- * Copyright © 2016-2020 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 $ from 'jquery';
-import ace from 'brace';
-import 'brace/ext/language_tools';
-import 'brace/ext/searchbox';
-import 'brace/mode/javascript';
-import 'brace/mode/html';
-import 'brace/mode/css';
-import 'brace/mode/json';
-import 'brace/snippets/javascript';
-import 'brace/snippets/text';
-import 'brace/snippets/html';
-import 'brace/snippets/css';
-import 'brace/snippets/json';
-
-/* eslint-disable import/no-unresolved, import/default */
-
-import saveWidgetTypeAsTemplate from './save-widget-type-as.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-import Split from 'split.js';
-import beautify from 'js-beautify';
-
-const js_beautify = beautify.js;
-const html_beautify = beautify.html;
-const css_beautify = beautify.css;
-
-/* eslint-disable angular/angularelement */
-
-/*@ngInject*/
-export default function WidgetEditorController(widgetService, userService, types, toast, hotkeys,
- $element, $rootScope, $scope, $state, $stateParams, $timeout,
- $window, $document, $translate, $mdDialog) {
-
- var Range = ace.acequire("ace/range").Range;
- var ace_editors = [];
- var js_editor;
- var iframe = $('iframe', $element);
- var gotError = false;
- var errorMarkers = [];
- var errorAnnotationId = -1;
- var elem = $($element);
-
- var widgetsBundleId = $stateParams.widgetsBundleId;
-
- var vm = this;
-
- vm.widgetsBundle;
- vm.isDirty = false;
- vm.fullscreen = false;
- vm.widgetType = null;
- vm.widget = null;
- vm.origWidget = null;
- vm.widgetTypes = types.widgetType;
- vm.iframeWidgetEditModeInited = false;
- vm.layoutInited = false;
- vm.htmlEditorOptions = {
- useWrapMode: true,
- mode: 'html',
- advanced: {
- enableSnippets: true,
- enableBasicAutocompletion: true,
- enableLiveAutocompletion: true
- },
- onLoad: function (_ace) {
- ace_editors.push(_ace);
- }
- };
- vm.cssEditorOptions = {
- useWrapMode: true,
- mode: 'css',
- advanced: {
- enableSnippets: true,
- enableBasicAutocompletion: true,
- enableLiveAutocompletion: true
- },
- onLoad: function (_ace) {
- ace_editors.push(_ace);
- }
- };
- vm.jsonSettingsEditorOptions = {
- useWrapMode: true,
- mode: 'json',
- advanced: {
- enableSnippets: true,
- enableBasicAutocompletion: true,
- enableLiveAutocompletion: true
- },
- onLoad: function (_ace) {
- ace_editors.push(_ace);
- }
- };
- vm.dataKeyJsonSettingsEditorOptions = {
- useWrapMode: true,
- mode: 'json',
- advanced: {
- enableSnippets: true,
- enableBasicAutocompletion: true,
- enableLiveAutocompletion: true
- },
- onLoad: function (_ace) {
- ace_editors.push(_ace);
- }
- };
- vm.jsEditorOptions = {
- useWrapMode: true,
- mode: 'javascript',
- advanced: {
- enableSnippets: true,
- enableBasicAutocompletion: true,
- enableLiveAutocompletion: true
- },
- onLoad: function (_ace) {
- ace_editors.push(_ace);
- js_editor = _ace;
- js_editor.session.on("change", function () {
- cleanupJsErrors();
- });
- }
- };
-
- vm.addResource = addResource;
- vm.applyWidgetScript = applyWidgetScript;
- vm.beautifyCss = beautifyCss;
- vm.beautifyDataKeyJson = beautifyDataKeyJson;
- vm.beautifyHtml = beautifyHtml;
- vm.beautifyJs = beautifyJs;
- vm.beautifyJson = beautifyJson;
- vm.removeResource = removeResource;
- vm.undoDisabled = undoDisabled;
- vm.undoWidget = undoWidget;
- vm.saveDisabled = saveDisabled;
- vm.saveWidget = saveWidget;
- vm.saveAsDisabled = saveAsDisabled;
- vm.saveWidgetAs = saveWidgetAs;
- vm.toggleFullscreen = toggleFullscreen;
- vm.isReadOnly = isReadOnly;
-
- initWidgetEditor();
-
- function initWidgetEditor() {
-
- $rootScope.loading = true;
-
- widgetService.getWidgetsBundle(widgetsBundleId).then(
- function success(widgetsBundle) {
- vm.widgetsBundle = widgetsBundle;
- if ($stateParams.widgetTypeId) {
- widgetService.getWidgetTypeById($stateParams.widgetTypeId).then(
- function success(widgetType) {
- setWidgetType(widgetType)
- widgetTypeLoaded();
- },
- function fail() {
- toast.showError($translate.instant('widget.widget-type-load-failed-error'));
- widgetTypeLoaded();
- }
- );
- } else {
- var type = $stateParams.widgetType;
- if (!type) {
- type = types.widgetType.timeseries.value;
- }
- widgetService.getWidgetTemplate(type).then(
- function success(widgetTemplate) {
- vm.widget = angular.copy(widgetTemplate);
- vm.widget.widgetName = null;
- vm.origWidget = angular.copy(vm.widget);
- vm.isDirty = true;
- widgetTypeLoaded();
- },
- function fail() {
- toast.showError($translate.instant('widget.widget-template-load-failed-error'));
- widgetTypeLoaded();
- }
- );
- }
- },
- function fail() {
- toast.showError($translate.instant('widget.widget-type-load-failed-error'));
- widgetTypeLoaded();
- }
- );
-
- }
-
- function setWidgetType(widgetType) {
- vm.widgetType = widgetType;
- vm.widget = widgetService.toWidgetInfo(vm.widgetType);
- var config = angular.fromJson(vm.widget.defaultConfig);
- vm.widget.defaultConfig = angular.toJson(config)
- vm.origWidget = angular.copy(vm.widget);
- vm.isDirty = false;
- }
-
- function widgetTypeLoaded() {
- initHotKeys();
-
- initWatchers();
-
- angular.element($document[0]).ready(function () {
- var w = elem.width();
- if (w > 0) {
- initSplitLayout();
- } else {
- $scope.$watch(
- function () {
- return elem[0].offsetWidth || parseInt(elem.css('width'), 10);
- },
- function (newSize) {
- if (newSize > 0) {
- initSplitLayout();
- }
- }
- );
- }
- });
-
- iframe.attr('data-widget', angular.toJson(vm.widget));
- iframe.attr('src', '/widget-editor');
- }
-
- function undoDisabled() {
- return $scope.loading
- || !vm.isDirty
- || !vm.iframeWidgetEditModeInited
- || vm.saveWidgetPending
- || vm.saveWidgetAsPending;
- }
-
- function saveDisabled() {
- return vm.isReadOnly()
- || $scope.loading
- || !vm.isDirty
- || !vm.iframeWidgetEditModeInited
- || vm.saveWidgetPending
- || vm.saveWidgetAsPending;
- }
-
- function saveAsDisabled() {
- return $scope.loading
- || !vm.iframeWidgetEditModeInited
- || vm.saveWidgetPending
- || vm.saveWidgetAsPending;
- }
-
- function initHotKeys() {
- $translate(['widget.undo', 'widget.save', 'widget.saveAs', 'widget.toggle-fullscreen', 'widget.run']).then(function (translations) {
- hotkeys.bindTo($scope)
- .add({
- combo: 'ctrl+q',
- description: translations['widget.undo'],
- allowIn: ['INPUT', 'SELECT', 'TEXTAREA'],
- callback: function (event) {
- if (!undoDisabled()) {
- event.preventDefault();
- undoWidget();
- }
- }
- })
- .add({
- combo: 'ctrl+s',
- description: translations['widget.save'],
- allowIn: ['INPUT', 'SELECT', 'TEXTAREA'],
- callback: function (event) {
- if (!saveDisabled()) {
- event.preventDefault();
- saveWidget();
- }
- }
- })
- .add({
- combo: 'shift+ctrl+s',
- description: translations['widget.saveAs'],
- allowIn: ['INPUT', 'SELECT', 'TEXTAREA'],
- callback: function (event) {
- if (!saveAsDisabled()) {
- event.preventDefault();
- saveWidgetAs();
- }
- }
- })
- .add({
- combo: 'shift+ctrl+f',
- description: translations['widget.toggle-fullscreen'],
- allowIn: ['INPUT', 'SELECT', 'TEXTAREA'],
- callback: function (event) {
- event.preventDefault();
- toggleFullscreen();
- }
- })
- .add({
- combo: 'ctrl+enter',
- description: translations['widget.run'],
- allowIn: ['INPUT', 'SELECT', 'TEXTAREA'],
- callback: function (event) {
- event.preventDefault();
- applyWidgetScript();
- }
- });
- });
- }
-
- function initWatchWidget() {
- $scope.widgetWatcher = $scope.$watch('vm.widget', function (newVal, oldVal) {
- if (!angular.equals(newVal, oldVal)) {
- vm.isDirty = true;
- }
- }, true);
- }
-
- function initWatchers() {
- initWatchWidget();
-
- $scope.$watch('vm.widget.type', function (newVal, oldVal) {
- if (!angular.equals(newVal, oldVal)) {
- var config = angular.fromJson(vm.widget.defaultConfig);
- if (vm.widget.type !== types.widgetType.rpc.value
- && vm.widget.type !== types.widgetType.alarm.value) {
- if (config.targetDeviceAliases) {
- delete config.targetDeviceAliases;
- }
- if (config.alarmSource) {
- delete config.alarmSource;
- }
- if (!config.datasources) {
- config.datasources = [];
- }
- if (!config.timewindow) {
- config.timewindow = {
- realtime: {
- timewindowMs: 60000
- }
- };
- }
- for (var i = 0; i < config.datasources.length; i++) {
- var datasource = config.datasources[i];
- datasource.type = vm.widget.type;
- }
- } else if (vm.widget.type == types.widgetType.rpc.value) {
- if (config.datasources) {
- delete config.datasources;
- }
- if (config.alarmSource) {
- delete config.alarmSource;
- }
- if (config.timewindow) {
- delete config.timewindow;
- }
- if (!config.targetDeviceAliases) {
- config.targetDeviceAliases = [];
- }
- } else { // alarm
- if (config.datasources) {
- delete config.datasources;
- }
- if (config.targetDeviceAliases) {
- delete config.targetDeviceAliases;
- }
- if (!config.alarmSource) {
- config.alarmSource = {};
- config.alarmSource.type = vm.widget.type
- }
- if (!config.timewindow) {
- config.timewindow = {
- realtime: {
- timewindowMs: 24 * 60 * 60 * 1000
- }
- };
- }
- }
- vm.widget.defaultConfig = angular.toJson(config);
- }
- });
-
- $scope.$on('widgetEditModeInited', function () {
- vm.iframeWidgetEditModeInited = true;
- if (vm.saveWidgetPending || vm.saveWidgetAsPending) {
- if (!vm.saveWidgetTimeout) {
- vm.saveWidgetTimeout = $timeout(function () {
- if (!gotError) {
- if (vm.saveWidgetPending) {
- commitSaveWidget();
- } else if (vm.saveWidgetAsPending) {
- commitSaveWidgetAs();
- }
- } else {
- toast.showError($translate.instant('widget.unable-to-save-widget-error'));
- vm.saveWidgetPending = false;
- vm.saveWidgetAsPending = false;
- initWatchWidget();
- }
- vm.saveWidgetTimeout = undefined;
- }, 1500);
- }
- }
- });
-
- $scope.$on('widgetEditUpdated', function (event, widget) {
- vm.widget.sizeX = widget.sizeX / 2;
- vm.widget.sizeY = widget.sizeY / 2;
- vm.widget.defaultConfig = angular.toJson(widget.config);
- iframe.attr('data-widget', angular.toJson(vm.widget));
- });
-
- $scope.$on('widgetException', function (event, details) {
- if (!gotError) {
- gotError = true;
- var errorInfo = 'Error:';
- if (details.name) {
- errorInfo += ' ' + details.name + ':';
- }
- if (details.message) {
- errorInfo += ' ' + details.message;
- }
- if (details.lineNumber) {
- errorInfo += '
Line ' + details.lineNumber;
- if (details.columnNumber) {
- errorInfo += ' column ' + details.columnNumber;
- }
- errorInfo += ' of script.';
- }
- if (!vm.saveWidgetPending && !vm.saveWidgetAsPending) {
- toast.showError(errorInfo, $('#javascript_panel', $element)[0]);
- }
- if (js_editor && details.lineNumber) {
- var line = details.lineNumber - 1;
- var column = 0;
- if (details.columnNumber) {
- column = details.columnNumber;
- }
-
- var errorMarkerId = js_editor.session.addMarker(new Range(line, 0, line, Infinity), "ace_active-line", "screenLine");
- errorMarkers.push(errorMarkerId);
- var annotations = js_editor.session.getAnnotations();
- var errorAnnotation = {
- row: line,
- column: column,
- text: details.message,
- type: "error"
- };
- errorAnnotationId = annotations.push(errorAnnotation) - 1;
- js_editor.session.setAnnotations(annotations);
- }
- }
- });
- }
-
- function cleanupJsErrors() {
- toast.hide();
- for (var i = 0; i < errorMarkers.length; i++) {
- js_editor.session.removeMarker(errorMarkers[i]);
- }
- errorMarkers = [];
- if (errorAnnotationId && errorAnnotationId > -1) {
- var annotations = js_editor.session.getAnnotations();
- annotations.splice(errorAnnotationId, 1);
- js_editor.session.setAnnotations(annotations);
- errorAnnotationId = -1;
- }
- }
-
- function onDividerDrag() {
- for (var i = 0; i < ace_editors.length; i++) {
- var ace = ace_editors[i];
- ace.resize();
- ace.renderer.updateFull();
- }
- }
-
- function initSplitLayout() {
- if (!vm.layoutInited) {
- Split([$('#top_panel', $element)[0], $('#bottom_panel', $element)[0]], {
- sizes: [35, 65],
- gutterSize: 8,
- cursor: 'row-resize',
- direction: 'vertical',
- onDrag: function () {
- onDividerDrag()
- }
- });
-
- Split([$('#top_left_panel', $element)[0], $('#top_right_panel', $element)[0]], {
- sizes: [50, 50],
- gutterSize: 8,
- cursor: 'col-resize',
- onDrag: function () {
- onDividerDrag()
- }
- });
-
- Split([$('#javascript_panel', $element)[0], $('#frame_panel', $element)[0]], {
- sizes: [50, 50],
- gutterSize: 8,
- cursor: 'col-resize',
- onDrag: function () {
- onDividerDrag()
- }
- });
-
- onDividerDrag();
-
- $scope.$applyAsync(function () {
- vm.layoutInited = true;
- $rootScope.loading = false;
- var w = angular.element($window);
- $timeout(function () {
- w.triggerHandler('resize')
- });
- });
-
- }
- }
-
- function removeResource(index) {
- if (index > -1) {
- vm.widget.resources.splice(index, 1);
- }
- }
-
- function addResource() {
- vm.widget.resources.push({url: ''});
- }
-
- function applyWidgetScript() {
- cleanupJsErrors();
- gotError = false;
- vm.iframeWidgetEditModeInited = false;
- var config = angular.fromJson(vm.widget.defaultConfig);
- config.title = vm.widget.widgetName;
- vm.widget.defaultConfig = angular.toJson(config);
- iframe.attr('data-widget', angular.toJson(vm.widget));
- iframe[0].contentWindow.location.reload(true);
- }
-
- function toggleFullscreen() {
- vm.fullscreen = !vm.fullscreen;
- }
-
- function isReadOnly() {
- if (userService.getAuthority() === 'TENANT_ADMIN') {
- return !vm.widgetsBundle || vm.widgetsBundle.tenantId.id === types.id.nullUid;
- } else {
- return userService.getAuthority() != 'SYS_ADMIN';
- }
- }
-
- function undoWidget() {
- if ($scope.widgetWatcher) {
- $scope.widgetWatcher();
- }
- vm.widget = angular.copy(vm.origWidget);
- vm.isDirty = false;
- initWatchWidget();
- applyWidgetScript();
- }
-
- function saveWidget() {
- if (!vm.widget.widgetName) {
- toast.showError($translate.instant('widget.missing-widget-title-error'));
- } else {
- $scope.widgetWatcher();
- vm.saveWidgetPending = true;
- applyWidgetScript();
- }
- }
-
- function saveWidgetAs($event) {
- $scope.widgetWatcher();
- vm.saveWidgetAsPending = true;
- vm.saveWidgetAsEvent = $event;
- applyWidgetScript();
- }
-
- function commitSaveWidget() {
- var id = (vm.widgetType && vm.widgetType.id) ? vm.widgetType.id : undefined;
- widgetService.saveWidgetType(vm.widget, id, vm.widgetsBundle.alias).then(
- function success(widgetType) {
- setWidgetType(widgetType)
- vm.saveWidgetPending = false;
- initWatchWidget();
- toast.showSuccess($translate.instant('widget.widget-saved'), 500);
- }, function fail() {
- vm.saveWidgetPending = false;
- initWatchWidget();
- }
- );
- }
-
- function commitSaveWidgetAs() {
- $mdDialog.show({
- controller: 'SaveWidgetTypeAsController',
- controllerAs: 'vm',
- templateUrl: saveWidgetTypeAsTemplate,
- parent: angular.element($document[0].body),
- fullscreen: true,
- targetEvent: vm.saveWidgetAsEvent
- }).then(function (saveWidgetAsData) {
- vm.widget.widgetName = saveWidgetAsData.widgetName;
- vm.widget.alias = undefined;
- var config = angular.fromJson(vm.widget.defaultConfig);
- config.title = vm.widget.widgetName;
- vm.widget.defaultConfig = angular.toJson(config);
-
- vm.saveWidgetAsPending = false;
- vm.isDirty = false;
- initWatchWidget();
- widgetService.saveWidgetType(vm.widget, undefined, saveWidgetAsData.bundleAlias).then(
- function success(widgetType) {
- $state.go('home.widgets-bundles.widget-types.widget-type',
- {widgetsBundleId: saveWidgetAsData.bundleId, widgetTypeId: widgetType.id.id});
- },
- function fail() {
- vm.saveWidgetAsPending = false;
- initWatchWidget();
- }
- );
- }, function () {
- vm.saveWidgetAsPending = false;
- initWatchWidget();
- });
- }
-
- function beautifyJs() {
- var res = js_beautify(vm.widget.controllerScript, {indent_size: 4, wrap_line_length: 60});
- vm.widget.controllerScript = res;
- }
-
- function beautifyHtml() {
- var res = html_beautify(vm.widget.templateHtml, {indent_size: 4, wrap_line_length: 60});
- vm.widget.templateHtml = res;
- }
-
- function beautifyCss() {
- var res = css_beautify(vm.widget.templateCss, {indent_size: 4});
- vm.widget.templateCss = res;
- }
-
- function beautifyJson() {
- var res = js_beautify(vm.widget.settingsSchema, {indent_size: 4});
- vm.widget.settingsSchema = res;
- }
-
- function beautifyDataKeyJson() {
- var res = js_beautify(vm.widget.dataKeySettingsSchema, {indent_size: 4});
- vm.widget.dataKeySettingsSchema = res;
- }
-
-}
-
-/* eslint-enable angular/angularelement */
diff --git a/ui/src/app/widget/widget-editor.scss b/ui/src/app/widget/widget-editor.scss
deleted file mode 100644
index 55c69ca13c..0000000000
--- a/ui/src/app/widget/widget-editor.scss
+++ /dev/null
@@ -1,155 +0,0 @@
-/**
- * Copyright © 2016-2020 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 "~compass-sass-mixins/lib/compass";
-
-$edit-toolbar-height: 40px !default;
-
-.tb-editor {
- .tb-split {
- box-sizing: border-box;
- overflow-x: hidden;
- overflow-y: auto;
- }
-
- .ace_editor {
- font-size: 14px !important;
- }
-
- .tb-content {
- border: 1px solid #c0c0c0;
- }
-
- .gutter {
- background-color: transparent;
-
- background-repeat: no-repeat;
- background-position: 50%;
- }
-
- .gutter.gutter-horizontal {
- cursor: col-resize;
- background-image: url("../../../node_modules/split.js/grips/vertical.png");
- }
-
- .gutter.gutter-vertical {
- cursor: row-resize;
- background-image: url("../../../node_modules/split.js/grips/horizontal.png");
- }
-
- .tb-split.tb-split-horizontal,
- .gutter.gutter-horizontal {
- float: left;
- height: 100%;
- }
-
- .tb-split.tb-split-vertical {
- display: flex;
-
- .tb-split.tb-content {
- height: 100%;
- }
- }
-}
-
-.tb-split-vertical {
- md-tabs {
- md-tabs-content-wrapper {
- height: calc(100% - 49px);
-
- md-tab-content {
- height: 100%;
-
- & > div {
- height: 100%;
- }
- }
- }
- }
-}
-
-div.tb-editor-area-title-panel {
- position: absolute;
- top: 5px;
- right: 20px;
- z-index: 5;
- font-size: .8rem;
- font-weight: 500;
-
- label {
- padding: 4px;
- color: #00acc1;
- text-transform: uppercase;
- background: rgba(220, 220, 220, .35);
- border-radius: 5px;
- }
-
- .md-button {
- min-width: 32px;
- min-height: 15px;
- padding: 4px;
- margin: 0;
- font-size: .8rem;
- line-height: 15px;
- color: #7b7b7b;
- background: rgba(220, 220, 220, .35);
- }
-}
-
-.tb-resize-container {
- position: relative;
- width: 100%;
- height: 100%;
- overflow-y: auto;
-
- .ace_editor {
- height: 100%;
- }
-}
-
-md-toolbar.tb-edit-toolbar {
-
- min-height: $edit-toolbar-height !important;
- max-height: $edit-toolbar-height !important;
-
- .md-toolbar-tools {
- min-height: $edit-toolbar-height !important;
- max-height: $edit-toolbar-height !important;
-
- .md-button {
- min-width: 65px;
- min-height: 30px;
- font-size: 12px;
- line-height: 30px;
-
- md-icon {
- font-size: 20px;
- }
-
- span {
- padding-right: 6px;
- }
- }
-
- md-input-container {
- input {
- height: 28px;
- font-size: 1.2rem;
- font-weight: 400;
- letter-spacing: .005em;
- }
- }
- }
-}
diff --git a/ui/src/app/widget/widget-editor.tpl.html b/ui/src/app/widget/widget-editor.tpl.html
deleted file mode 100644
index 8c6662e81b..0000000000
--- a/ui/src/app/widget/widget-editor.tpl.html
+++ /dev/null
@@ -1,258 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
- {{ type.name | translate }}
-
-
-
-
-
-
- {{ 'widget.run' | translate }} (CTRL + Return)
-
- play_arrow
- action.run
-
-
-
- {{ 'widget.undo' | translate }} (CTRL + Q)
-
- undo
- action.undo
-
-
-
- {{ 'widget.save' | translate }} (CTRL + S)
-
- save
- action.save
-
-
-
- {{ 'widget.saveAs' | translate }} (Shift + CTRL + S)
-
- save
- action.saveAs
-
-
-
- {{ 'widget.toggle-fullscreen' | translate }} (Shift + CTRL + F)
-
-
- fullscreen
-
-
- fullscreen_exit
-
- widget.toggle-fullscreen
-
-
-
- more_vert
-
-
-
-
- play_arrow
- action.run
-
-
-
-
- undo
- action.undo
-
-
-
-
- save
- action.save
-
-
-
-
- save
- action.saveAs
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {{ 'widget.remove-resource' | translate }}
-
-
- close
-
-
-
-
-
-
- {{ 'widget.add-resource' | translate }}
-
- action.add
-
-
-
-
-
-
-
-
- {{ 'widget.tidy' | translate }}
-
-
-
-
-
-
-
-
-
- {{ 'widget.tidy' | translate }}
-
-
-
-
-
-
-
-
-
-
-
-
-
- {{ 'widget.tidy' | translate }}
-
-
-
-
-
-
-
-
-
- {{ 'widget.tidy' | translate }}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {{
- 'widget.tidy' | translate }}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/ui/src/app/widget/widget-library.controller.js b/ui/src/app/widget/widget-library.controller.js
deleted file mode 100644
index 913cb587d1..0000000000
--- a/ui/src/app/widget/widget-library.controller.js
+++ /dev/null
@@ -1,221 +0,0 @@
-/*
- * Copyright © 2016-2020 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 AliasController from '../api/alias-controller';
-
-/* eslint-disable import/no-unresolved, import/default */
-
-import selectWidgetTypeTemplate from './select-widget-type.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-/*@ngInject*/
-export default function WidgetLibraryController($scope, $rootScope, $q, widgetService, userService, importExport,
- $state, $stateParams, $document, $mdDialog, $translate, $filter,
- utils, types, entityService) {
-
- var vm = this;
-
- var widgetsBundleId = $stateParams.widgetsBundleId;
-
- vm.widgetsBundle;
- vm.widgetTypes = [];
- vm.dashboardInitComplete = false;
-
- var stateController = {
- getStateParams: function() {
- return {};
- }
- };
- vm.aliasController = new AliasController($scope, $q, $filter, utils,
- types, entityService, stateController, {});
-
- vm.noData = noData;
- vm.dashboardInited = dashboardInited;
- vm.dashboardInitFailed = dashboardInitFailed;
- vm.addWidgetType = addWidgetType;
- vm.openWidgetType = openWidgetType;
- vm.exportWidgetType = exportWidgetType;
- vm.importWidgetType = importWidgetType;
- vm.removeWidgetType = removeWidgetType;
- vm.loadWidgetLibrary = loadWidgetLibrary;
- vm.addWidgetType = addWidgetType;
- vm.isReadOnly = isReadOnly;
-
- function loadWidgetLibrary() {
- var deferred = $q.defer();
- $rootScope.loading = true;
- widgetService.getWidgetsBundle(widgetsBundleId).then(
- function success(widgetsBundle) {
- vm.widgetsBundle = widgetsBundle;
- if (vm.widgetsBundle) {
- var bundleAlias = vm.widgetsBundle.alias;
- var isSystem = vm.widgetsBundle.tenantId.id === types.id.nullUid;
-
- widgetService.getBundleWidgetTypes(bundleAlias, isSystem).then(
- function (widgetTypes) {
-
- widgetTypes = $filter('orderBy')(widgetTypes, ['-descriptor.type','-createdTime']);
-
- var top = 0;
- var lastTop = [0, 0, 0];
- var col = 0;
- var column = 0;
-
- if (widgetTypes.length > 0) {
- loadNext(0);
- } else {
- $rootScope.loading = false;
- deferred.resolve();
- }
-
- function loadNextOrComplete(i) {
- i++;
- if (i < widgetTypes.length) {
- loadNext(i);
- } else {
- $rootScope.loading = false;
- deferred.resolve();
- }
- }
-
- function loadNext(i) {
- var widgetType = widgetTypes[i];
- $scope.$applyAsync(function() {
- var widgetTypeInfo = widgetService.toWidgetInfo(widgetType);
- var sizeX = 8;
- var sizeY = Math.floor(widgetTypeInfo.sizeY);
- var widget = {
- typeId: widgetType.id,
- isSystemType: isSystem,
- bundleAlias: bundleAlias,
- typeAlias: widgetTypeInfo.alias,
- type: widgetTypeInfo.type,
- title: widgetTypeInfo.widgetName,
- sizeX: sizeX,
- sizeY: sizeY,
- row: top,
- col: col,
- config: angular.fromJson(widgetTypeInfo.defaultConfig)
- };
- widget.config.title = widgetTypeInfo.widgetName;
- vm.widgetTypes.push(widget);
- top+=sizeY;
- if (top > lastTop[column] + 10) {
- lastTop[column] = top;
- column++;
- if (column > 2) {
- column = 0;
- }
- top = lastTop[column];
- col = column * 8;
- }
- loadNextOrComplete(i);
- });
- }
- }
- );
- } else {
- $rootScope.loading = false;
- deferred.resolve();
- }
- }, function fail() {
- $rootScope.loading = false;
- deferred.reject();
- }
- );
- return deferred.promise;
- }
-
- function noData() {
- return vm.dashboardInitComplete && vm.widgetTypes.length == 0;
- }
-
- function dashboardInitFailed() {
- vm.dashboardInitComplete = true;
- }
-
- function dashboardInited() {
- vm.dashboardInitComplete = true;
- }
-
- function addWidgetType($event) {
- vm.openWidgetType($event);
- }
-
- function isReadOnly() {
- if (userService.getAuthority() === 'TENANT_ADMIN') {
- return !vm.widgetsBundle || vm.widgetsBundle.tenantId.id === types.id.nullUid;
- } else {
- return userService.getAuthority() != 'SYS_ADMIN';
- }
- }
-
- function openWidgetType(event, widget) {
- if (event) {
- event.stopPropagation();
- }
- if (widget) {
- $state.go('home.widgets-bundles.widget-types.widget-type',
- {widgetTypeId: widget.typeId.id});
- } else {
- $mdDialog.show({
- controller: 'SelectWidgetTypeController',
- controllerAs: 'vm',
- templateUrl: selectWidgetTypeTemplate,
- parent: angular.element($document[0].body),
- fullscreen: true,
- targetEvent: event
- }).then(function (widgetType) {
- $state.go('home.widgets-bundles.widget-types.widget-type',
- {widgetType: widgetType});
- }, function () {
- });
- }
- }
-
- function exportWidgetType(event, widget) {
- event.stopPropagation();
- importExport.exportWidgetType(widget.typeId.id);
- }
-
- function importWidgetType($event) {
- $event.stopPropagation();
- importExport.importWidgetType($event, vm.widgetsBundle.alias).then(
- function success() {
- $state.go($state.current, $state.params, {reload: true});
- },
- function fail() {}
- );
- }
-
- function removeWidgetType(event, widget) {
- var confirm = $mdDialog.confirm()
- .targetEvent(event)
- .title($translate.instant('widget.remove-widget-type-title', {widgetName: widget.config.title}))
- .htmlContent($translate.instant('widget.remove-widget-type-text'))
- .ariaLabel($translate.instant('widget.remove-widget-type'))
- .cancel($translate.instant('action.no'))
- .ok($translate.instant('action.yes'));
- $mdDialog.show(confirm).then(function () {
- widgetService.deleteWidgetType(widget.bundleAlias, widget.typeAlias, widget.isSystemType).then(
- function success() {
- vm.widgetTypes.splice(vm.widgetTypes.indexOf(widget), 1);
- },
- function fail() {}
- );
- });
- }
-}
diff --git a/ui/src/app/widget/widget-library.routes.js b/ui/src/app/widget/widget-library.routes.js
deleted file mode 100644
index 28217ac7da..0000000000
--- a/ui/src/app/widget/widget-library.routes.js
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-/* eslint-disable import/no-unresolved, import/default */
-
-import widgetLibraryTemplate from './widget-library.tpl.html';
-import widgetEditorTemplate from './widget-editor.tpl.html';
-import dashboardTemplate from '../dashboard/dashboard.tpl.html';
-import widgetsBundlesTemplate from './widgets-bundles.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-/*@ngInject*/
-export default function WidgetLibraryRoutes($stateProvider) {
- $stateProvider
- .state('home.widgets-bundles', {
- url: '/widgets-bundles',
- params: {'topIndex': 0},
- module: 'private',
- auth: ['SYS_ADMIN', 'TENANT_ADMIN'],
- views: {
- "content@home": {
- templateUrl: widgetsBundlesTemplate,
- controller: 'WidgetsBundleController',
- controllerAs: 'vm'
- }
- },
- data: {
- searchEnabled: true,
- pageTitle: 'widgets-bundle.widgets-bundles'
- },
- ncyBreadcrumb: {
- label: '{"icon": "now_widgets", "label": "widgets-bundle.widgets-bundles"}'
- }
- })
- .state('home.widgets-bundles.widget-types', {
- url: '/:widgetsBundleId/widgetTypes',
- params: {'topIndex': 0},
- module: 'private',
- auth: ['SYS_ADMIN', 'TENANT_ADMIN'],
- views: {
- "content@home": {
- templateUrl: widgetLibraryTemplate,
- controller: 'WidgetLibraryController',
- controllerAs: 'vm'
- }
- },
- data: {
- searchEnabled: false,
- pageTitle: 'widget.widget-library'
- },
- ncyBreadcrumb: {
- label: '{"icon": "now_widgets", "label": "{{ vm.widgetsBundle.title }}", "translate": "false"}'
- }
- })
- .state('home.widgets-bundles.widget-types.widget-type', {
- url: '/:widgetTypeId',
- module: 'private',
- auth: ['SYS_ADMIN', 'TENANT_ADMIN'],
- views: {
- "content@home": {
- templateUrl: widgetEditorTemplate,
- controller: 'WidgetEditorController',
- controllerAs: 'vm'
- }
- },
- params: {
- widgetType: null
- },
- data: {
- searchEnabled: false,
- pageTitle: 'widget.editor'
- },
- ncyBreadcrumb: {
- label: '{"icon": "insert_chart", "label": "{{ vm.widget.widgetName }}", "translate": "false"}'
- }
- })
- .state('widgetEditor', {
- url: '/widget-editor',
- module: 'private',
- auth: ['SYS_ADMIN', 'TENANT_ADMIN'],
- views: {
- "@": {
- templateUrl: dashboardTemplate,
- controller: 'DashboardController',
- controllerAs: 'vm'
- }
- },
- data: {
- widgetEditMode: true,
- searchEnabled: false,
- pageTitle: 'widget.editor'
- }
- })
-}
diff --git a/ui/src/app/widget/widget-library.tpl.html b/ui/src/app/widget/widget-library.tpl.html
deleted file mode 100644
index c496430282..0000000000
--- a/ui/src/app/widget/widget-library.tpl.html
+++ /dev/null
@@ -1,76 +0,0 @@
-
-
-
- add
- {{ 'widget.add-widget-type' | translate }}
-
- widgets-bundle.empty
-
-
-
-
diff --git a/ui/src/app/widget/widgets-bundle-card.tpl.html b/ui/src/app/widget/widgets-bundle-card.tpl.html
deleted file mode 100644
index 20d7d12c88..0000000000
--- a/ui/src/app/widget/widgets-bundle-card.tpl.html
+++ /dev/null
@@ -1,18 +0,0 @@
-
-widgets-bundle.system
diff --git a/ui/src/app/widget/widgets-bundle-fieldset.tpl.html b/ui/src/app/widget/widgets-bundle-fieldset.tpl.html
deleted file mode 100644
index c88a1e8d45..0000000000
--- a/ui/src/app/widget/widgets-bundle-fieldset.tpl.html
+++ /dev/null
@@ -1,35 +0,0 @@
-
-{{ 'widgets-bundle.export' | translate }}
-{{ 'widgets-bundle.delete' | translate }}
-
-
-
-
diff --git a/ui/src/app/widget/widgets-bundle.controller.js b/ui/src/app/widget/widgets-bundle.controller.js
deleted file mode 100644
index da9a8b37f2..0000000000
--- a/ui/src/app/widget/widgets-bundle.controller.js
+++ /dev/null
@@ -1,187 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-/* eslint-disable import/no-unresolved, import/default */
-
-import addWidgetsBundleTemplate from './add-widgets-bundle.tpl.html';
-import widgetsBundleCard from './widgets-bundle-card.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-/*@ngInject*/
-export default function WidgetsBundleController(widgetService, userService, importExport, $state, $stateParams, $filter, $translate, types) {
-
- var widgetsBundleActionsList = [
- {
- onAction: function ($event, item) {
- exportWidgetsBundle($event, item);
- },
- name: function() { $translate.instant('action.export') },
- details: function() { return $translate.instant('widgets-bundle.export') },
- icon: "file_download"
- },
- {
- onAction: function ($event, item) {
- vm.grid.openItem($event, item);
- },
- name: function() { return $translate.instant('widgets-bundle.details') },
- details: function() { return $translate.instant('widgets-bundle.widgets-bundle-details') },
- icon: "edit"
- },
- {
- onAction: function ($event, item) {
- vm.grid.deleteItem($event, item);
- },
- name: function() { return $translate.instant('action.delete') },
- details: function() { return $translate.instant('widgets-bundle.delete') },
- icon: "delete",
- isEnabled: isWidgetsBundleEditable
- }
- ];
-
- var widgetsBundleAddItemActionsList = [
- {
- onAction: function ($event) {
- vm.grid.addItem($event);
- },
- name: function() { return $translate.instant('action.create') },
- details: function() { return $translate.instant('widgets-bundle.create-new-widgets-bundle') },
- icon: "insert_drive_file"
- },
- {
- onAction: function ($event) {
- importExport.importWidgetsBundle($event).then(
- function() {
- vm.grid.refreshList();
- }
- );
- },
- name: function() { return $translate.instant('action.import') },
- details: function() { return $translate.instant('widgets-bundle.import') },
- icon: "file_upload"
- }
- ];
-
- var vm = this;
-
- vm.types = types;
-
- vm.widgetsBundleGridConfig = {
-
- refreshParamsFunc: null,
-
- deleteItemTitleFunc: deleteWidgetsBundleTitle,
- deleteItemContentFunc: deleteWidgetsBundleText,
- deleteItemsTitleFunc: deleteWidgetsBundlesTitle,
- deleteItemsActionTitleFunc: deleteWidgetsBundlesActionTitle,
- deleteItemsContentFunc: deleteWidgetsBundlesText,
-
- fetchItemsFunc: fetchWidgetsBundles,
- saveItemFunc: saveWidgetsBundle,
- clickItemFunc: openWidgetsBundle,
- deleteItemFunc: deleteWidgetsBundle,
-
- getItemTitleFunc: getWidgetsBundleTitle,
- itemCardTemplateUrl: widgetsBundleCard,
- parentCtl: vm,
-
- actionsList: widgetsBundleActionsList,
- addItemActions: widgetsBundleAddItemActionsList,
-
- onGridInited: gridInited,
-
- addItemTemplateUrl: addWidgetsBundleTemplate,
-
- addItemText: function() { return $translate.instant('widgets-bundle.add-widgets-bundle-text') },
- noItemsText: function() { return $translate.instant('widgets-bundle.no-widgets-bundles-text') },
- itemDetailsText: function() { return $translate.instant('widgets-bundle.widgets-bundle-details') },
- isSelectionEnabled: isWidgetsBundleEditable,
- isDetailsReadOnly: function(widgetsBundle) {
- return !isWidgetsBundleEditable(widgetsBundle);
- }
-
- };
-
- if (angular.isDefined($stateParams.items) && $stateParams.items !== null) {
- vm.widgetsBundleGridConfig.items = $stateParams.items;
- }
-
- if (angular.isDefined($stateParams.topIndex) && $stateParams.topIndex > 0) {
- vm.widgetsBundleGridConfig.topIndex = $stateParams.topIndex;
- }
-
- vm.exportWidgetsBundle = exportWidgetsBundle;
-
- function deleteWidgetsBundleTitle(widgetsBundle) {
- return $translate.instant('widgets-bundle.delete-widgets-bundle-title', {widgetsBundleTitle: widgetsBundle.title});
- }
-
- function deleteWidgetsBundleText() {
- return $translate.instant('widgets-bundle.delete-widgets-bundle-text');
- }
-
- function deleteWidgetsBundlesTitle(selectedCount) {
- return $translate.instant('widgets-bundle.delete-widgets-bundles-title', {count: selectedCount}, 'messageformat');
- }
-
- function deleteWidgetsBundlesActionTitle(selectedCount) {
- return $translate.instant('widgets-bundle.delete-widgets-bundles-action-title', {count: selectedCount}, 'messageformat');
- }
-
- function deleteWidgetsBundlesText() {
- return $translate.instant('widgets-bundle.delete-widgets-bundles-text');
- }
-
- function gridInited(grid) {
- vm.grid = grid;
- }
-
- function fetchWidgetsBundles(pageLink) {
- return widgetService.getAllWidgetsBundlesByPageLink(pageLink);
- }
-
- function saveWidgetsBundle(widgetsBundle) {
- return widgetService.saveWidgetsBundle(widgetsBundle);
- }
-
- function deleteWidgetsBundle(widgetsBundleId) {
- return widgetService.deleteWidgetsBundle(widgetsBundleId);
- }
-
- function getWidgetsBundleTitle(widgetsBundle) {
- return widgetsBundle ? widgetsBundle.title : '';
- }
-
- function isWidgetsBundleEditable(widgetsBundle) {
- if (userService.getAuthority() === 'TENANT_ADMIN') {
- return widgetsBundle && widgetsBundle.tenantId.id != types.id.nullUid;
- } else {
- return userService.getAuthority() === 'SYS_ADMIN';
- }
- }
-
- function exportWidgetsBundle($event, widgetsBundle) {
- $event.stopPropagation();
- importExport.exportWidgetsBundle(widgetsBundle.id.id);
- }
-
- function openWidgetsBundle($event, widgetsBundle) {
- if ($event) {
- $event.stopPropagation();
- }
- $state.go('home.widgets-bundles.widget-types', {widgetsBundleId: widgetsBundle.id.id});
- }
-
-}
diff --git a/ui/src/app/widget/widgets-bundle.directive.js b/ui/src/app/widget/widgets-bundle.directive.js
deleted file mode 100644
index 24dd72f8e4..0000000000
--- a/ui/src/app/widget/widgets-bundle.directive.js
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-/* eslint-disable import/no-unresolved, import/default */
-
-import widgetsBundleFieldsetTemplate from './widgets-bundle-fieldset.tpl.html';
-
-/* eslint-enable import/no-unresolved, import/default */
-
-/*@ngInject*/
-export default function WidgetsBundleDirective($compile, $templateCache) {
- var linker = function (scope, element) {
- var template = $templateCache.get(widgetsBundleFieldsetTemplate);
- element.html(template);
- $compile(element.contents())(scope);
- }
- return {
- restrict: "E",
- link: linker,
- scope: {
- widgetsBundle: '=',
- isEdit: '=',
- isReadOnly: '=',
- theForm: '=',
- onExportWidgetsBundle: '&',
- onDeleteWidgetsBundle: '&'
- }
- };
-}
diff --git a/ui/src/app/widget/widgets-bundles.tpl.html b/ui/src/app/widget/widgets-bundles.tpl.html
deleted file mode 100644
index 2aa56f3211..0000000000
--- a/ui/src/app/widget/widgets-bundles.tpl.html
+++ /dev/null
@@ -1,26 +0,0 @@
-
-
-
-
-
diff --git a/ui/src/index.html b/ui/src/index.html
deleted file mode 100644
index 070de5d17a..0000000000
--- a/ui/src/index.html
+++ /dev/null
@@ -1,35 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/ui/src/png/jstree/32px.png b/ui/src/png/jstree/32px.png
deleted file mode 100644
index 719a6bcdbd..0000000000
Binary files a/ui/src/png/jstree/32px.png and /dev/null differ
diff --git a/ui/src/png/jstree/40px.png b/ui/src/png/jstree/40px.png
deleted file mode 100644
index 1959347aea..0000000000
Binary files a/ui/src/png/jstree/40px.png and /dev/null differ
diff --git a/ui/src/scss/animations.scss b/ui/src/scss/animations.scss
deleted file mode 100644
index 1c47c59c60..0000000000
--- a/ui/src/scss/animations.scss
+++ /dev/null
@@ -1,48 +0,0 @@
-/**
- * Copyright © 2016-2020 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 "~compass-sass-mixins/lib/animate";
-
-@keyframes tbMoveFromTopFade {
- from {
- opacity: 0;
-
- transform: translate(0, -100%);
- }
-}
-
-@keyframes tbMoveToTopFade {
- to {
- opacity: 0;
-
- transform: translate(0, -100%);
- }
-}
-
-@keyframes tbMoveFromBottomFade {
- from {
- opacity: 0;
-
- transform: translate(0, 100%);
- }
-}
-
-@keyframes tbMoveToBottomFade {
- to {
- opacity: 0;
-
- transform: translate(0, 150%);
- }
-}
diff --git a/ui/src/scss/constants.scss b/ui/src/scss/constants.scss
deleted file mode 100644
index 98865623c1..0000000000
--- a/ui/src/scss/constants.scss
+++ /dev/null
@@ -1,45 +0,0 @@
-/**
- * Copyright © 2016-2020 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 "~sass-material-colors/sass/sass-material-colors";
-
-// Colors
-
-$gray: #eee !default;
-
-$primary-palette-color: "indigo" !default;
-$default: "500" !default;
-$hue-1: "300" !default;
-$hue-2: "800" !default;
-$hue-3: "a100" !default;
-
-$primary-default: #305680 !default; //material-color($primary-palette-color, $default);
-$primary-hue-1: material-color($primary-palette-color, $hue-1) !default;
-$primary-hue-2: material-color($primary-palette-color, $hue-2) !default;
-$primary-hue-3: rgb(207, 216, 220) !default;
-
-// Layout
-
-$layout-breakpoint-xs: 600px !default;
-$layout-breakpoint-sm: 960px !default;
-$layout-breakpoint-md: 1280px !default;
-$layout-breakpoint-xmd: 1600px !default;
-$layout-breakpoint-lg: 1920px !default;
-
-$layout-breakpoint-gt-xs: 601px !default;
-$layout-breakpoint-gt-sm: 961px !default;
-$layout-breakpoint-gt-md: 1281px !default;
-$layout-breakpoint-gt-xmd: 1601px !default;
-$layout-breakpoint-gt-lg: 1921px !default;
diff --git a/ui/src/scss/fonts.scss b/ui/src/scss/fonts.scss
deleted file mode 100644
index ddc68cf904..0000000000
--- a/ui/src/scss/fonts.scss
+++ /dev/null
@@ -1,21 +0,0 @@
-/**
- * Copyright © 2016-2020 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.
- */
-@font-face {
- font-family: "Segment7Standard";
- font-style: italic;
- font-weight: 400;
- src: url("data:font/opentype;charset=utf-8;base64,T1RUTwAOAIAAAwBgQkFTRQAJAAQAACasAAAADkNGRiC5m9MSAAAH7AAAHbpGRlRNa6XwRAAAJrwAAAAcR0RFRgKxAqIAACWoAAAASkdQT1Ou773UAAAmLAAAAH5HU1VCRNhM5gAAJfQAAAA4T1MvMljUYiwAAAFQAAAAYGNtYXAxVzUsAAAFhAAAAkZoZWFkAmNATwAAAOwAAAA2aGhlYQdTAF8AAAEkAAAAJGhtdHgW0g5oAAAm2AAAAgZtYXhwAQFQAAAAAUgAAAAGbmFtZYoOx10AAAGwAAAD0nBvc3QAAAABAAAHzAAAACAAAQAAAAEAAOVWl1RfDzz1AAsD6AAAAADPuH6JAAAAAM+4fokAAP84A9EDIAACAAgAAgAAAAAAAAABAAADIP84AFoCSQAA/ngD0QBkAAUAAAAAAAAAAAAAAAAAAgAAUAABAQAAAAMCSQJYAAUACAKKArsABwCMAooCu//nAd8AMQECAAACAAUJAAAAAAAAAAAAAwAAAAAAAAAAAAAAAFBmRWQAAQAAAP8DIP84AFoDIADIAAAAAQAAAAABwgHCACAAIAACAAAADgCuAAEAAAAAAAAAsQFkAAEAAAAAAAEACAIoAAEAAAAAAAIACAJDAAEAAAAAAAMAIwKUAAEAAAAAAAQACALKAAEAAAAAAAUACQLnAAEAAAAAAAYAEAMTAAMAAQQJAAABYgAAAAMAAQQJAAEAEAIWAAMAAQQJAAIAEAIxAAMAAQQJAAMARgJMAAMAAQQJAAQAEAK4AAMAAQQJAAUAEgLTAAMAAQQJAAYAIALxAFMAdAByAGkAYwB0AGwAeQAgAHMAZQB2AGUAbgAtAHMAZQBnAG0AZQBuAHQAIAAoAHAAbAB1AHMAIABwAG8AaQBuAHQAKQAgAGMAYQBsAGMAdQBsAGEAdABvAHIAIABkAGkAcwBwAGwAYQB5ACAAZgBhAGMAZQAsACAAZgBpAHgAZQBkAC0AdwBpAGQAdABoACAAYQBuAGQAIABmAHIAZQBlAC4AIAAgACgAYwApACAAQwBlAGQAcgBpAGMAIABLAG4AaQBnAGgAdAAgADIAMAAxADQALgAgACAATABpAGMAZQBuAHMAZQBkACAAdQBuAGQAZQByACAAUwBJAEwAIABPAHAAZQBuACAARgBvAG4AdAAgAEwAaQBjAGUAbgBjAGUAIAB2ADEALgAxAC4AIAAgAFIAZQBzAGUAcgB2AGUAZAAgAG4AYQBtAGUAOgAgAFMAZQBnAG0AZQBuAHQANwAuAABTdHJpY3RseSBzZXZlbi1zZWdtZW50IChwbHVzIHBvaW50KSBjYWxjdWxhdG9yIGRpc3BsYXkgZmFjZSwgZml4ZWQtd2lkdGggYW5kIGZyZWUuICAoYykgQ2VkcmljIEtuaWdodCAyMDE0LiAgTGljZW5zZWQgdW5kZXIgU0lMIE9wZW4gRm9udCBMaWNlbmNlIHYxLjEuICBSZXNlcnZlZCBuYW1lOiBTZWdtZW50Ny4AAFMAZQBnAG0AZQBuAHQANwAAU2VnbWVudDcAAFMAdABhAG4AZABhAHIAZAAAU3RhbmRhcmQAAEYAbwBuAHQARgBvAHIAZwBlACAAMgAuADAAIAA6ACAAUwBlAGcAbQBlAG4AdAA3ACAAOgAgADcALQA2AC0AMgAwADEANAAARm9udEZvcmdlIDIuMCA6IFNlZ21lbnQ3IDogNy02LTIwMTQAAFMAZQBnAG0AZQBuAHQANwAAU2VnbWVudDcAAFYAZQByAHMAaQBvAG4AIAAgAABWZXJzaW9uICAAAFMAZQBnAG0AZQBuAHQANwBTAHQAYQBuAGQAYQByAGQAAFNlZ21lbnQ3U3RhbmRhcmQAAAAAAAADAAAAAwAAABwAAQAAAAAAPAADAAEAAAAcAAQAIAAAAAQABAABAAAA////AAAAAP//AAEAAQAAAAAABgIKAAAAAAEAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPABAAEQASABMAFAAVABYAFwAYABkAGgAbABwAHQAeAB8AIAAhACIAIwAkACUAJgAnACgAKQAqACsALAAtAC4ALwAwADEAMgAzADQANQA2ADcAOAA5ADoAOwA8AD0APgA/AEAAQQBCAEMARABFAEYARwBIAEkASgBLAEwATQBOAE8AUABRAFIAUwBUAFUAVgBXAFgAWQBaAFsAXABdAF4AXwBgAGEAYgBjAGQAZQBmAGcAaABpAGoAawBsAG0AbgBvAHAAcQByAHMAdAB1AHYAdwB4AHkAegB7AHwAfQB+AH8AgADFAMYAyADKANIA1wDdAOIA4QDjAOUA5ADmAOgA6gDpAOsA7ADuAO0A7wDwAPIA9ADzAPUA9wD2APsA+gD8AP0AAACxAKMApACoAAAAtwDgAK8AqgAAALUAqQAAAMcA2QAAALIAAAAAAKYAtgAAAAAAAAAAAAAAqwC7AAAA5wD5AMAAogCtAAAAAAAAAAAArAC8AAAAoQDBAMQA1gAAAAAAAAAAAAAAAAAAAAAA+AAAAQAAAAAAAAAAAAAAAAAAAAAAALgAAAAAAAAAwwDLAMIAzADJAM4AzwDQAM0A1ADVAAAA0wDbANwA2gAAAAAAAACwAAAAAAAAALkAAAAAAAAAAAADAAD//QAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAQAEBAABAQERU2VnbWVudDdTdGFuZGFyZAABAgABADf4YgD4YwH4ZAL4ZQP4ZgSMDAGIDAKLDAOLDASL+1z6Zfm0BRwDrw8cAAAQHAWwERwAMRwbyBIATAIAAQAIAA8AFgAdACQAKwAyADkAQABHAE4AVQBcAGMAagBxAHgAfwCGAI0AlACbAKIAqQCwALcAvgDFAMwA0wDaAOEA6ADvAPYA/QEEAQsBEgEZASABJwEuATUBPAFDAUoBUQFYAV8BZgFtAXQBewGCAYkBkAGXAZ4BpQGsAbMBugHBAcgBzwHWAd0B5AHrAfIB8gKjAqsCswK7dW5pMDAwMHVuaTAwMDF1bmkwMDAydW5pMDAwM3VuaTAwMDR1bmkwMDA1dW5pMDAwNnVuaTAwMDd1bmkwMDA4dW5pMDAwOXVuaTAwMEF1bmkwMDBCdW5pMDAwQ3VuaTAwMER1bmkwMDBFdW5pMDAwRnVuaTAwMTB1bmkwMDExdW5pMDAxMnVuaTAwMTN1bmkwMDE0dW5pMDAxNXVuaTAwMTZ1bmkwMDE3dW5pMDAxOHVuaTAwMTl1bmkwMDFBdW5pMDAxQnVuaTAwMUN1bmkwMDFEdW5pMDAxRXVuaTAwMUZ1bmkwMDdGdW5pMDA4MHVuaTAwODF1bmkwMDgydW5pMDA4M3VuaTAwODR1bmkwMDg1dW5pMDA4NnVuaTAwODd1bmkwMDg4dW5pMDA4OXVuaTAwOEF1bmkwMDhCdW5pMDA4Q3VuaTAwOER1bmkwMDhFdW5pMDA4RnVuaTAwOTB1bmkwMDkxdW5pMDA5MnVuaTAwOTN1bmkwMDk0dW5pMDA5NXVuaTAwOTZ1bmkwMDk3dW5pMDA5OHVuaTAwOTl1bmkwMDlBdW5pMDA5QnVuaTAwOUN1bmkwMDlEdW5pMDA5RXVuaTAwOUZ1bmkwMEEwdW5pMDBBRHVuaTAwQjJ1bmkwMEIzdW5pMDBCNXVuaTAwQjlTdHJpY3RseSBzZXZlbi1zZWdtZW50IChwbHVzIHBvaW50KSBjYWxjdWxhdG9yIGRpc3BsYXkgZmFjZSwgZml4ZWQtd2lkdGggYW5kIGZyZWUuICAoYykgQ2VkcmljIEtuaWdodCAyMDE0LiAgTGljZW5zZWQgdW5kZXIgU0lMIE9wZW4gRm9udCBMaWNlbmNlIHYxLjEuICBSZXNlcnZlZCBuYW1lOiBTZWdtZW50Ny5TZWdtZW50N1NlZ21lbnQ3U3RhbmRhcmQAAAABhwGIAYkBigGLAYwBjQGOAY8BkAGRAZIBkwGUAZUBlgGXAZgBmQGaAZsBnAGdAZ4BnwGgAaEBogGjAaQBpQGmAAEAAgADAAQABQAGAAcAaAAJAAoACwAMAA0ADgAPABAAEQASABMAFAAVABYAFwAYABkAGgAbABwAHQAeAB8AIAAhACIAIwAkACUAJgAnACgAKQAqACsALAAtAC4ALwAwADEAMgAzADQANQA2ADcAOAA5ADoAOwA8AD0APgA/AEAAfABCAEMARABFAEYARwBIAEkASgBLAEwATQBOAE8AUABRAFIAUwBUAFUAVgBXAFgAWQBaAFsAXABdAF4AXwGnAagBqQGqAasBrAGtAa4BrwGwAbEBsgGzAbQBtQG2AbcBuAG5AboBuwG8Ab0BvgG/AcABwQHCAcMBxAHFAcYBxwHIAGAAYQBiAGcAZACgAGYAgwCqAIsAagCXAckApQCAAKEAnAHKAcsAfQHMAHMAcgCFAc0AjwB4AJ4AmwCjAHsArgCrAKwAsACtAK8AigCxALUAsgCzALQAuQC2ALcAuACaALoAvgC7ALwAvwC9AKgAjQDEAMEAwgDDAMUAnQCVAMsAyADJAM0AygDMAJAAzgDSAM8A0ADRANYA0wDUANUApwDXANsA2ADZANwA2gCfAJMA4QDeAN8A4ADiAKIA4wEBAgABACIANgA3ADgAOQA6ADsAPAA9AD4APwBAAEEAQgBDAEQARQBGAEcASABJAEoASwBMAE0ATgBPAFAAUQBSAFMAVABVAFYAdgCQALYA7QEmAUgBXgGRAcoB8gIWAjQCQAJOAncCxgLnAyQDZwOWA+AEPARhBMEFDgUaBToFTgViBYAFsgX/BkEGhwa6Bv4HOgdrB7AH7QgJCEIIegihCLkI8QlACXwJsgnLCg0KQgqECsYLGAs2C3gLqgvdDAAMNwxcDGgMewzIDQ4NIg1mDa0N3g4pDloOaQ6iDtoPAQ84D1gPjQ/JEAEQGhBeEJMQwREDEVURkhHWEf8SABIcEh0STxJQElESUhJTElQSVRJWElcSWBJZEloSWxJcEl0SXhJfEmASYRJiEmMSZBJlEmYSZxJoEmkSahJrEmwSbRJuEm8ScBJxEnIScxJ0EnUSdhJ3EngSeRJ6EnsSfBJ9En4SfxKAEq8SsBKxErISsxLqEusS7BLtEu4S7xLwEvES8hLzEvQS9RL2EvcS+BL5EvoS+xL8Ev0S/hL/EwATARMCEwMTBBMFEwYTBxMIEwkTChMLEwwTDRMOEw8TEBMRExITExMUE2ETrhOvE7ATsROyE7MTtBO1E/wT/RP+E/8UABQBFAIUAxQEFAUUBhQHFAgUCRQKFAsUDBQNFA4UDxQQFBEUEou9+EW9Ab29+BW9A70W+Hn4qfx5Br38dxX4RfgV/EUHDvtc+nwBi/plA/tcBPpl+nz+ZQYODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg527/floPfFnxL4O/Z66hNw+KH5jhUgChOIsf0/FSEKDvhJdvfBd593zHcSE9Dd+WEVIgr3+fAVIwoOien3m+ppoPfFnxITgPcf5xUkChPA+3j3+hUlChOw9wz3zBUgCg6J6VOg9/ug94zqOJ8SE6D3H+cVE2AmChOgJwoTKPvS+QUVIgoTMH73CxUoCmT8FxUpChNgKgoOielodvgldveh6kx3n3cSE6D3H+cVE2AmChOgJwoTKPvS+QUVIgoTMH73CxUoCmT8FxUpChNgKgoOr6D3vuppoPfFnxITwPdA+FYVJQrRTRUrChOwm/gwFSAKDvhJdvfud593Evg79hPQ+KH5jhUgCg6J6X929+N3ynb3oepMdxITsPcf5xUkCvvX98IVLAoTcC0KEzRG+AsVIgoTOH73CxUoCg6J6Wh2+CV296HqeXefdxIToPcf5xUTYCYKE6AnChMw+4n5RBUoCmT8FxUpChNgKgoTKJv4MBUgCg6J6feb6n529+53n3cSE4D3H+cVJAoTwPt49/oVJQoTsPcM98wVIAoOxHb30+p+dvfud593EhPA90D4VhUlCtFNFSsKE7Cb+DAVIAoOielodhITgPcf5xUTQCYKE4AnCtb3vBUpChNAKgoO9/fqAfdA+FYVJQoOdu8B+JXqA/jH2hUhCg7bdve86lN3ynb37ncSE6jY+B4VLgoTyKD3ABUlCvcM98wVLwoTmDAKDonpaHa3dvfjd8p296HqTHfMdxITmPcf5xUTWCYKE5gnCvvX98IVLAoTOC0KExpG+AsVIgoTHH73CxUoCmT8FxUpChNYKgoTGZv4MBUgCg7Edvgldvfud593Evgq9xATyPhv+BgVKwoT6Jv4MBUgCg6J6X9297zqU3fKdveh6nl3EhOA9x/nFSQKE1D71/fCFS4KEwSP+EoVKAoTIPvq+9kVJQoTCvcM98wVIAoOielodvfT6n5296HqeXefdxITgPcf5xUTQCYKE4AnChMI+4n5RBUoChMg++r72RUlCtFNFSkKE0AqChMUm/gwFSAKDsR299Pqfnb3wXefd8x3EhO03flhFSIKE8SP+2cVJQrRTRUrCpv4MBUvChOkMAoOielodvfU6X5296HmUHefdxITQPhw+BkVUlx++3jNPZylnve1BRMg++XuFTEK+4333RVJYAUTCDIKExT8Q1AVMwoTgG38zhU0Cg6J6Wh2tnb3vulndrd296HmUHcSE4D3HucVNAoTBfvS+QUVMwp+9wkVSWAFEwIyChMQ++r72hUxCtNOFVJcfvt4BRNANQoTKPxEtRWHgYaBh4EIe/vF576X930FDsR2+CV296HqeXefdxIT4Pcv+aAVKApk/BcVKwoT0Jv4MBUgCg6J6Wh2t3b3vOpTd8p296HqTHfMdxITgAD3H+cVE0AAJgoTgAAnChMoAPvX98IVLgoTBQBG+AsVIgoTAgB+9wsVKAoTEAD76vvZFSUK0U0VKQoTQAAqChMEgJv4MBUgCg6J6Wh299Pqfnb3oepMd593zHcSE4D3H+cVE0AmChOAJwoTFPvS+QUVIgoTCH73CxUoChMg++r72RUlCtFNFSkKE0AqChMRm/gwFSAKDvf36gH3QPhWFSUKDnbv9+Wg98WfEvg79nrqE3D4ofmOFSAKE4ix/T8VIQoO9x/nFSQK+9f3whUuCqD3ABUlCg6J6feb6gH3H+cVJAr7ePf6FSUKDonpU6ASE4D3H+cVE0AmChOAJwrW97wVKQoTQCoKDtt297zqU3fKdveh6nl3EhOg2PgeFS4KE4iP+EoVKAoTwPvq+9kVJQoTlPcM98wVIAoOielToI2g96fqP5+hoPeM6mWfEhOA9x/nFRNAJgoTgCcKEyj71/fCFS4KEwKP+EoVKAoTEPvq+9kVJQrRTRUpChNAKgoTBZv4MBUgCg7Edrd297zqU3fKdveh6kx3zHcSE9DY+B4VLgoTykb4CxUiChPEfvcLFSgKE+D76vvZFSUK0U0VKwoTyZv4MBUgCg6J6VOgjaD3p+o/n6Gg95ifEhOC9x/nFRNCJgoTgicKEyr71/fCFS4KRvgLFXv7qQUTBjYKExKP+2cVJQrRTRUpChNCKgoOielqoPe6n6Gg94zqOJ8SE7D3H+cVJAr71/fCFSwKE3AtChM0RvgLFSIKEzh+9wsVKAoOielToI2g96fqP5+hoPfFnxITgvcf5xUTQiYKE4InChMq+9f3whUuChMSoPcAFSUK0U0VKQoTQioKm/gwFS8KEwYwCg6J6X9297zqU3fKdveh6kx3EhOA9x/nFSQKE1D71/fCFS4KEwpG+AsVIgoTBH73CxUoChMg++r72RUlCg7GoPen6j+foaD3jOo4nxIToNj4HhUuChOURvgLFSIKE4h+9wsVKAoTwPvq+9kVJQoOielodrd29+N3ynb3oepMdxITmPcf5xUTWCYKE5gnCvvX98IVLAoTOC0KExpG+AsVIgoTHH73CxUoCmT8FxUpChNYKgoOr6CNoPen6j+foaD3mJ+knxIT1tj4HhUuCkb4CxV7+6kFE842ChPmj/tnFSUK0U0VKwqb+DAVLwoTzjAKDq+g9/ug98WfAfgq9xAD+G/4GBUrCpv4MBUgCg6J6VOgjaD3up+hoPfFnxITnPcf5xUTXCYKE5wnCvvX98IVLAoTPC0K99i5FSkKE1wqCpv4MBUjCg6voI2g96fqP5+hoPeM6jifEhPQ2PgeFS4KE8pG+AsVIgoTxH73CxUoChPg++r72RUlCtFNFSsKDonpaqD3up+hoPeYnxITuPcf5xUkCvvX98IVLAoTeC0KRvgLFSIKDtj4HhUuCqD3ABUlCtFNFSsKm/gwFSMKDsR2t3b343fKdveh6kx3zHcSE/DY+B4VLgoT9Eb4CxUiChP4fvcLFSgKZPwXFSsKE/Kb+DAVIAoOielToI2g97qfoaD3jOo4n6SfEhOY9x/nFRNYJgoTmCcK+9f3whUsChM4LQoTGkb4CxUiChMcfvcLFSgKZPwXFSkKE1gqChMZm/gwFSAKDsag96fqP5+hoPeM6jifpJ8SE6DY+B4VLgoTlEb4CxUiChOIfvcLFSgKE8D76vvZFSUKE5L3DPfMFSAKDq+g977qaaD3jOo4n6SfEhOo3flhFSIKE5B+9wsVKAoTwPvq+9kVJQrRTRUrChOkm/gwFSAKDsag96fqP58SE6DY+B4VLgoTwKD3ABUlCg6J6VOg97/paaD3jOY8nxITgPce5xU0ChMU+9L5BRUzCn73CRVJYAUTCDIKEyD76vvaFTEK004VUlx++3gFE0A1Cg6J6Wqg96fqP5+hoPeYnxIThPcf5xUkChNU+9f3whUuCkb4CxV7+6kFEww2ChMkj/tnFSUKDonpU6CNoPe6n6Gg95ifpJ8SE573H+cVE14mChOeJwr71/fCFSwKEz4tCkb4CxUiCvfH+6UVKQoTXioKm/gwFSMKDonpU6CNoPe6n6Gg95ifpJ8SE573H+cVE14mChOeJwr71/fCFSwKEz4tCkb4CxUiCvfH+6UVKQoTXioKm/gwFSMKDonpU6CNoPen6j+foaD3mJ+knxITg/cf5xUTQyYKE4MnChMr+9f3whUuCkb4CxV7+6kFEwc2ChMTj/tnFSUK0U0VKQoTQyoKm/gwFS8KEwcwCg6J6feb6vd/6gH3H+cVJAr7iflEFSgK++r72RUlCg6J6VOg977qaaD3mJ+knxIThPcf5xUTRCYKE4QnChMc+9L5BRUiChMkj/tnFSUK0U0VKQoTRCoKm/gwFS8KExQwCg7GoPen6j+foaD3jOplnxIToNj4HhUuChOIj/hKFSgKE8D76vvZFSUKE5T3DPfMFSAKDonpaqD3up+hoPeM6jifEhOw9x/nFSQK+9f3whUsChNwLQoTNEb4CxUiChM4fvcLFSgKDsR299Pqfnb3wXefdxITsN35YRUiChPAj/tnFSUK0U0VKwoOielToPf7oPeM6mWfEhOg9x/nFRNgJgoToCcKEzD7iflEFSgKZPwXFSkKE2AqChMom/gwFSAKDvhJdveh6kx3n3fMdxIToN35YRUiChPAfvcLFSgKE4iWfhUgCg739+oB90D4VhUlCg74NKD3xZ8B+Dv2A/ih+Y4VIAoOielodrd297zqU3fKdveh6nl3EhOA9x/nFRNAJgoTgCcKEyj71/fCFS4KEwKP+EoVKAoTEPvq+9kVJQrRTRUpChNAKgoTBZv4MBUgCg6J6Wh2t3b3vOpTd8p298F3EhOC9x/nFRNCJgoTgicKEyr71/fCFS4KRvgLFXv7qQUTBjYKExKP+2cVJQrRTRUpChNCKgoO9x/nFSQK+9f3whUuCqD3ABUlCg6J6Wh2t3b3vOpTd8p29+53EhOC9x/nFRNCJgoTgicKEyr71/fCFS4KExKg9wAVJQrRTRUpChNCKgqb+DAVLwoTBjAKDonpf3b3vOpTd8p296HqTHfMdxITgPcf5xUkChNQ+9f3whUuChMKRvgLFSIKEwR+9wsVKAoTIPvq+9kVJQoTCfcM98wVIAoO23b3vOpTd8p296HqTHcSE6DY+B4VLgoTlEb4CxUiChOIfvcLFSgKE8D76vvZFSUKDonpU6D3vuppoPeM6jifpJ8SE4D3H+cVE0AmChOAJwoTFPvS+QUVIgoTCH73CxUoChMg++r72RUlCtFNFSkKE0AqChMSm/gwFSAKDsR2t3b3vOpTd8p298F3EhPU2PgeFS4KRvgLFXv7qQUTzDYKE+SP+2cVJQrRTRUrCg7EdgH4KvID+G/4GBUrCg6J6Wh2t3b343fKdvfudxITnPcf5xUTXCYKE5wnCvvX98IVLAoTPC0K99i5FSkKE1wqCpv4MBUjCg7Edrd297zqU3fKdveh6kx3EhPQ2PgeFS4KE8pG+AsVIgoTxH73CxUoChPg++r72RUlCtFNFSsKDonpf3b343fKdvfBdxITuPcf5xUkCvvX98IVLAoTeC0KRvgLFSIKDtt297zqU3fKdvfBd8x3EhOs2PgeFS4KRvgLFXv7qQUTnDYKE8yP+2cVJQr3DPfMFS8KE5wwCg7Edrd297zqU3cSE9DY+B4VLgoT4KD3ABUlCtFNFSsKDonpaHa3dve86lN3EhOA9x/nFRNAJgoTgCcKEyj71/fCFS4KExCg9wAVJQrRTRUpChNAKgoO23b3vOpTd8p296HqTHfMdxIToNj4HhUuChOURvgLFSIKE4h+9wsVKAoTwPvq+9kVJQoTkvcM98wVIAoOxHb30+p+dveh6kx3n3fMdxITqN35YRUiChOQfvcLFSgKE8D76vvZFSUK0U0VKwoTopv4MBUgCg7bdve86lN3EhOg2PgeFS4KE8Cg9wAVJQoOielodvfU6X5296HmUHefdxITgPce5xU0ChMU+9L5BRUzCn73CRVJYAUTCDIKEyD76vvaFTEK004VUlx++3gFE0A1Cg6J6X9297zqU3fKdvfBdxIThPcf5xUkChNU+9f3whUuCkb4CxV7+6kFEww2ChMkj/tnFSUKDonpaHa3dvfjdxITkPcf5xUTUCYKE5AnCvvX98IVLAoTMC0K99i5FSkKE1AqCg6J6Wh2t3b343fKdvfBd8x3EhOe9x/nFRNeJgoTnicK+9f3whUsChM+LQpG+AsVIgr3x/ulFSkKE14qCpv4MBUjCg6J6Wh2t3b3vOpTd8p298F3zHcSE4P3H+cVE0MmChODJwoTK/vX98IVLgpG+AsVe/upBRMHNgoTE4/7ZxUlCtFNFSkKE0MqCpv4MBUvChMHMAoOxHa3dve86lN3ynb3wXfMdxIT1tj4HhUuCkb4CxV7+6kFE842ChPmj/tnFSUK0U0VKwqb+DAVLwoTzjAKDonpaHb30+p+dvfBd593zHcSE4L3H+cVE0ImChOCJwoTGvvS+QUVIgoTIo/7ZxUlCtFNFSkKE0IqCpv4MBUvChMSMAoOxqD3p+o/n6Gg98WfEhOo2PgeFS4KE8ig9wAVJQr3DPfMFS8KE5gwCg4Or6D3+6D3xZ8B+Cr3EAP4b/gYFSsKm/gwFSAKDg6J6X929+N3ynb3oep5dxITsPcf5xUkCvvX98IVLAoTcC0KEziP+EoVKAoTNJZ+FSAKDg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg739+ppoPeM6jifpJ8SE4D3QPhWFSUKE1D71/efFSIKE2B+9wsVKAoTSJZ+FSAKDg4ODg7GoPen6j+foaD3mJ+knxITrNj4HhUuCkb4CxV7+6kFE5w2ChPMj/tnFSUK9wz3zBUvChOcMAoODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OielToI2g96fqP5+hoPeM6mWfEhOA9x/nFRNAJgoTgCcKEyj71/fCFS4KEwKP+EoVKAoTEPvq+9kVJQrRTRUpChNAKgoTBZv4MBUgCg6J6VOgjaD3p+o/n6Gg94zqZZ8SE4D3H+cVE0AmChOAJwoTKPvX98IVLgoTAo/4ShUoChMQ++r72RUlCtFNFSkKE0AqChMFm/gwFSAKDg4ODg4ODg6J6Wqg96fqP5+hoPeM6jifpJ8SE4D3H+cVJAoTUPvX98IVLgoTCkb4CxUiChMEfvcLFSgKEyD76vvZFSUKEwn3DPfMFSAKDg4ODg4ODg4ODg4ODg4ODg4ODg4ODg743RSLFYmx+T24nIwGHgoCLwwJiwwK6gqfjNGOjJD6GAwM+mUL6pOPnPnpDA0cADETABcCAAEAGgAsADgAUAB+AJEAngDBAMwA0wDcAOoA8gD8AQ0BFAEnAToBQwFPAX0BhgGPMTF/+2rDYa6wBZDukeqQ7giLkIiRiZAIC291dm1voHakp6Cgqad3oHIfC3v7qZZz2rqX91oFCzExf/tqw2GusAWQ7pHqkO6LkIiRiZAICy9Ti4oFi4aPiI6IkoKSg5KCCNKL9yKL90CLBZKOjY4fi42JjYiOdqV0qXalCAs7XwWgeqN8oHgI94yLy7dKvgULL1OLigWLho+IjogIC5KCkoOSggjSi/cii/dAiwWSjo2OH4uNiY2IjnaldKl2pQgLSF7bWfeTi+blBQtSXX/7dwULzTydpZ73tAULUl1/+3fNPJ2lnve0BQuIgYOAiIEIC3v7xOe9l/d9BQuIgYOAiIEIe/vE572X930FCzExf/tqBQvDYa6wBZDukeqQ7ouQiJGJkAgLPF8FoXqhfKF5CPeMi8u2Sb4FC9tY95KL5eYFC3z7qJVy27qW91sFCy9Ui4kFi4aQiI6HkoOSgpKDCNOL9yGL90CLBZKPjY4fi42JjYiOdqZzp3amCAvNPZylnve1BQuWc9q6l/daBQsAAAABAAAAAAAAAA4AFgAAAAQAAAACAAAAAgAIADEAOgABAEAAQAACAEIAQgACAEYARgACAE8ATwACAFkAWQACAGIAcwACAHUAegACAAAAAQAAAAoAHAAeAAFERkxUAAgABAAAAAD//wAAAAAAAQAEAAEACAABAAgAAQAGACAAAQACAEcASwABAAAACgAeACwAAURGTFQACAAEAAAAAP//AAEAAAABa2VybgAIAAAAAQABAAIABgAOAAEAAAABABAAAgAAAAEAFgABAAgABP22AAEAAQAvAAEAJAAEAAAACgAeAB4AHgAeAB4AHgAeAB4AHgAeAAEAL/22AAIAAQAxADoAAAAAAAEAAAAIAAAAAAAEAAAAAAAAAAEAAAAAzD2izwAAAADPr89TAAAAAM+4fiECSQAAAkkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABpwBCAC8ALwAvAFwBpwAvAC8ALwBcAC8AXAIBAC8ALwGWAC8ALwBCAC4ALgBYAC8ALwBcAacALwAvAC8ALwAvAC8ALwAvAC8ALwAvAC8ALwGWAC8ALwAvAC8ALwAvAC8AQgAvAC4ALwAvAC8ALwAvAC8ALwAvAEIALwBCAFwBpwAvAC8ALwAvAC8ALwAvAC8BlgAvAC8ALwAvAC8ALwAvAEIALwAuAC8ALwAvAC8ALwAvAC8AAAGWAAAALwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEIAAAAAAAAAAAAvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC8ALwAAAAAAAAAAAAAAAAAAAC8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA") format("opentype");
-}
diff --git a/ui/src/scss/main.scss b/ui/src/scss/main.scss
deleted file mode 100644
index 835df73894..0000000000
--- a/ui/src/scss/main.scss
+++ /dev/null
@@ -1,749 +0,0 @@
-/**
- * Copyright © 2016-2020 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 "~compass-sass-mixins/lib/compass";
-
-@import "constants";
-
-@import "animations";
-
-@import "mixins";
-
-@import "fonts";
-
-/***************
- * TYPE DEFAULTS
- ***************/
-
-button,
-html,
-input,
-select,
-textarea {
- font-family: Roboto, "Helvetica Neue", sans-serif;
-}
-
-.mdi-set {
- line-height: 1;
- text-transform: none;
- letter-spacing: normal;
- word-wrap: normal;
- white-space: nowrap;
- direction: ltr;
- -webkit-font-feature-settings: "liga"; /* stylelint-disable-line property-no-vendor-prefix */
-}
-
-a {
- font-weight: 400;
- color: #106cc8;
- text-decoration: none;
- border-bottom: 1px solid rgba(64, 84, 178, .25);
-
- transition: border-bottom .35s;
-}
-
-a:hover,
-a:focus {
- border-bottom: 1px solid #4054b2;
-}
-
-h1,
-h2,
-h3,
-h4,
-h5,
-h6 {
- margin-top: 1rem;
- margin-bottom: 1rem;
-}
-
-h1 {
- font-size: 3.4rem;
- font-weight: 400;
- line-height: 4rem;
-}
-
-h2 {
- font-size: 2.4rem;
- font-weight: 400;
- line-height: 3.2rem;
-}
-
-h3 {
- font-size: 2rem;
- font-weight: 500;
- letter-spacing: .005em;
-}
-
-h4 {
- font-size: 1.6rem;
- font-weight: 400;
- line-height: 2.4rem;
- letter-spacing: .01em;
-}
-
-p {
- margin: .8em 0 1.6em;
- font-size: 1.6rem;
- font-weight: 400;
- line-height: 1.6em;
- letter-spacing: .01em;
-}
-
-strong {
- font-weight: 500;
-}
-
-blockquote {
- padding-left: 16px;
- margin-left: 0;
- font-style: italic;
- border-left: 3px solid rgba(0, 0, 0, .12);
-}
-
-fieldset {
- padding: 0;
- margin: 0;
- border: none;
-}
-
-/*********************************
- * MATERIAL DESIGN CUSTOMIZATIONS
- ********************************/
-
-a.md-button {
- border-bottom: none;
-}
-
-form {
- md-content {
- background-color: #fff;
- }
-}
-
-md-bottom-sheet .md-subheader {
- font-family: Roboto, "Helvetica Neue", sans-serif;
-}
-
-.md-chips {
- font-family: Roboto, "Helvetica Neue", sans-serif;
-}
-
-md-content.md-default-theme,
-md-content {
- background-color: $gray;
-}
-
-md-card {
- background-color: #fff;
-
- h2:first-of-type {
- margin-top: 0;
- }
-}
-
-.md-button:not([disabled]).md-icon-button:hover {
- background-color: rgba(158, 158, 158, .2);
-}
-
-md-toolbar:not(.md-hue-1),
-.md-fab {
- fill: #fff;
-}
-
-md-toolbar md-input-container .md-errors-spacer {
- min-height: 0;
-}
-
-md-toolbar {
- md-select.md-default-theme:not([disabled]):focus .md-select-value,
- md-select:not([disabled]):focus .md-select-value {
- color: #fff;
- }
-}
-
-md-menu-item {
- overflow: hidden;
- fill: #737373;
-
- .md-button {
- display: block;
-
- .tb-alt-text {
- float: right;
- }
- }
-}
-
-div.md-toast-text {
- width: 100%;
- max-width: 500px;
- max-height: inherit;
- word-wrap: break-word;
-}
-
-md-toast .md-button {
- min-width: 88px;
-}
-
-md-sidenav {
- overflow: hidden;
- fill: #737373;
-}
-
-.md-panel-outer-wrapper {
- overflow-y: auto;
-}
-
-.md-radio-interactive input,
-button {
- pointer-events: all;
-}
-
-.md-color-picker-input-container {
- md-input-container {
- margin-bottom: 0;
- }
-}
-
-/***********************
- * THINGSBOARD SPECIFIC
- ***********************/
-
-$swift-ease-out-duration: .4s !default;
-$swift-ease-out-timing-function: cubic-bezier(.25, .8, .25, 1) !default;
-
-$input-label-float-offset: 6px !default;
-$input-label-float-scale: .75 !default;
-
-label {
- &.tb-title {
- padding-bottom: 15px;
- font-size: 13px;
- font-weight: 400;
- color: #666;
- pointer-events: none;
-
- &.no-padding {
- padding-bottom: 0;
- }
-
- &.tb-required::after {
- font-size: 13px;
- color: rgba(0, 0, 0, .54);
- vertical-align: top;
- content: " *";
- }
-
- &.tb-error {
- color: rgb(221, 44, 0);
-
- &.tb-required::after {
- color: rgb(221, 44, 0);
- }
- }
- }
-}
-
-.tb-noselect {
- user-select: none;
-}
-
-.tb-readonly-label {
- color: rgba(0, 0, 0, .54);
-}
-
-.tb-disabled-label {
- color: rgba(0, 0, 0, .44);
-}
-
-/* stylelint-disable-next-line no-duplicate-selectors */
-label {
- &.tb-small {
- font-size: 12px;
- color: rgba(0, 0, 0, .54);
- pointer-events: none;
- }
-}
-
-div {
- &.tb-small {
- font-size: 14px;
- color: rgba(0, 0, 0, .54);
- }
-}
-
-.tb-hint {
- padding-bottom: 15px;
- font-size: 12px;
- line-height: 14px;
- color: #808080;
- transition: all .3s cubic-bezier(.55, 0, .55, .2);
-
- &.ng-hide,
- &.ng-enter,
- &.ng-leave.ng-leave-active {
- bottom: 26px;
- opacity: 0;
- }
-
- &.ng-leave,
- &.ng-enter.ng-enter-active {
- bottom: 7px;
- opacity: 1;
- }
-}
-
-.md-caption {
- &.tb-required::after {
- font-size: 10px;
- color: rgba(0, 0, 0, .54);
- vertical-align: top;
- content: " *";
- }
-}
-
-pre.tb-highlight {
- display: block;
- padding: 15px;
- margin: 20px 0;
- overflow-x: auto;
- background-color: #f7f7f7;
-
- code {
- box-sizing: border-box;
- display: inline-block;
- padding: 0;
- font-family: monospace;
- font-size: 16px;
- font-weight: 700;
- color: #303030;
- vertical-align: bottom;
- }
-}
-
-.tb-notice {
- padding: 15px;
- font-size: 16px;
- background-color: #f7f7f7;
- border: 1px solid #ccc;
-}
-
-.tb-data-table {
- md-toolbar {
- z-index: 0;
- }
-
- md-toolbar.md-table-toolbar.md-default-theme:not(.md-menu-toolbar).md-default .md-button[disabled],
- md-toolbar.md-table-toolbar:not(.md-menu-toolbar).md-default .md-button[disabled] {
- color: rgba(0, 0, 0, .38);
- }
-
- md-toolbar.md-default-theme:not(.md-menu-toolbar) .md-button[disabled] md-icon,
- md-toolbar:not(.md-menu-toolbar) .md-button[disabled] md-icon {
- color: rgba(0, 0, 0, .28);
- }
-
- span.no-data-found {
- position: relative;
- display: flex;
- height: calc(100% - 57px);
- text-transform: uppercase;
- }
-
- table.md-table {
- &.md-row-select td.md-cell,
- &.md-row-select th.md-column {
- &:first-child {
- width: 20px;
- padding: 0 0 0 12px;
- }
-
- &:nth-child(2) {
- padding: 0 12px;
- }
-
- &:nth-child(n+3):nth-last-child(n+2) {
- padding: 0 28px 0 0;
- }
- }
-
- &:not(.md-row-select) td.md-cell,
- &:not(.md-row-select) th.md-column {
- &:first-child {
- padding: 0 12px;
- }
-
- &:nth-child(n+2):nth-last-child(n+2) {
- padding: 0 28px 0 0;
- }
- }
-
- td.md-cell,
- th.md-column {
- &:last-child {
- padding: 0 12px 0 0;
- }
- }
- }
-
- table.md-table,
- table.md-table.md-row-select {
- tbody {
- &.md-body {
- tr {
- &.md-row:not([disabled]) {
- outline: none;
-
- &:hover {
- background-color: rgba(221, 221, 221, .3) !important;
- }
-
- &.md-selected {
- background-color: rgba(221, 221, 221, .5) !important;
- }
-
- &.tb-current,
- &.tb-current:hover{
- background-color: rgba(221, 221, 221, .65) !important;
- }
- }
- }
- }
-
- tr {
- td {
- &.tb-action-cell {
- width: 72px;
- min-width: 72px;
- max-width: 72px;
- white-space: nowrap;
-
- .md-button {
- &.md-icon-button {
- width: 36px;
- height: 36px;
- padding: 6px;
- margin: 0;
- }
- }
-
- .tb-spacer {
- padding-left: 38px;
- }
- }
- }
- }
- }
- }
-}
-
-.tb-severity {
- font-weight: 700;
-
- &.tb-critical {
- color: #f00 !important;
- }
-
- &.tb-major {
- color: #ffa500 !important;
- }
-
- &.tb-minor {
- color: #ffca3d !important;
- }
-
- &.tb-warning {
- color: #abab00 !important;
- }
-
- &.tb-indeterminate {
- color: #008000 !important;
- }
-}
-
-.tb-card-description {
- font-size: 13px;
- color: rgba(0, 0, 0, .54);
-
- @include line-clamp(2, 1.1);
-}
-
-.tb-tooltip-multiline {
- max-width: 400px;
- height: auto !important;
- padding-top: 6px;
- padding-bottom: 6px;
- line-height: 1.5;
- white-space: normal !important;
-}
-
-/***********************
- * Flow
- ***********************/
-$previewSize: 100px !default;
-
-.file-input {
- display: none;
-}
-
-.tb-flow-drop {
- position: relative;
- height: $previewSize;
- overflow: hidden;
- border: dashed 2px;
-
- label {
- display: flex;
- flex-direction: column;
- justify-content: center;
- width: 100%;
- height: 100%;
- font-size: 16px;
- text-align: center;
-
- @media (min-width: $layout-breakpoint-sm) {
- font-size: 24px;
- }
- }
-}
-
-.tb-container {
- position: relative;
- padding: 10px 0;
- margin-top: 32px;
-}
-
-/***********************
- * Prompt
- ***********************/
-
-.tb-prompt {
- display: flex;
- font-size: 18px;
- font-weight: 400;
- line-height: 18px;
- color: rgba(0, 0, 0, .38);
- text-transform: uppercase;
-}
-
-/***********************
- * Errors
- ***********************/
-
-.tb-error-messages {
- height: 24px; //30px
-}
-
-.tb-error-message {
- padding: 10px 0 0 10px;
- margin-top: -6px;
- overflow: hidden;
- font-size: 12px;
- line-height: 14px;
- color: rgb(221, 44, 0);
-}
-
-.tb-error-message.ng-animate {
- transition: all .3s cubic-bezier(.55, 0, .55, .2);
-}
-
-.tb-error-message.ng-enter-prepare,
-.tb-error-message.ng-enter {
- margin-top: -24px;
- opacity: 0;
-}
-
-.tb-error-message.ng-enter.ng-enter-active {
- margin-top: -6px;
- opacity: 1;
-}
-
-.tb-error-message.ng-leave {
- margin-top: -6px;
- opacity: 1;
-}
-
-.tb-error-message.ng-leave.ng-leave-active {
- margin-top: -24px;
- opacity: 0;
-}
-
-/***********************
- * Tabs
- ***********************/
-
-md-tabs.tb-headless {
- margin-top: -50px;
-}
-
-/***********************
- * Buttons
- ***********************/
-
-.md-button.tb-card-button {
- width: 100%;
- max-width: 240px;
- height: 100%;
-
- span {
- height: 18px;
- min-height: 18px;
- max-height: 18px;
- padding: 0 0 20px 0;
- margin: auto;
- font-size: 18px;
- font-weight: 400;
- line-height: 18px;
- white-space: normal;
- }
-}
-
-.md-button.tb-layout-button {
- width: 100%;
- max-width: 240px;
- height: 100%;
-
- span {
- padding: 40px;
- font-size: 18px;
- font-weight: 400;
- line-height: 18px;
- white-space: normal;
- }
-}
-
-.md-button.tb-add-new-widget {
- padding-right: 12px;
- font-size: 24px;
- border-style: dashed;
- border-width: 2px;
-}
-
-/***********************
- * Header buttons
- ***********************/
-
-section.tb-header-buttons {
- position: absolute;
- top: 86px;
- right: 0;
- z-index: 3;
- pointer-events: none;
-
- @media (min-width: $layout-breakpoint-sm) {
- top: 86px;
- }
-}
-
-section.tb-top-header-buttons {
- top: 23px;
-}
-
-.tb-header-buttons .tb-btn-header {
- position: relative !important;
- display: inline-block;
- animation: tbMoveFromTopFade .3s ease both;
-}
-
-.tb-header-buttons .tb-btn-header.ng-hide {
- animation: tbMoveToTopFade .3s ease both;
-}
-
-/***********************
- * Footer buttons
- ***********************/
-
-section.tb-footer-buttons {
- position: fixed;
- right: 20px;
- bottom: 20px;
- z-index: 30;
- pointer-events: none;
-}
-
-.tb-footer-buttons .tb-btn-footer {
- position: relative !important;
- display: inline-block !important;
- animation: tbMoveFromBottomFade .3s ease both;
-}
-
-.tb-footer-buttons .tb-btn-footer.ng-hide {
- animation: tbMoveToBottomFade .3s ease both;
-}
-
-._md-toast-open-bottom .tb-footer-buttons {
- transition: all .4s cubic-bezier(.25, .8, .25, 1);
-
- transform: translate3d(0, -42px, 0);
-}
-
-/***********************
- * Icons
- ***********************/
-
-.md-icon-button.tb-md-32 {
- width: 32px;
- min-width: 32px;
- height: 32px;
- min-height: 32px;
- padding: 0 !important;
- margin: 0 !important;
- vertical-align: middle;
-}
-
-.material-icons.tb-md-20 {
- width: 20px;
- min-width: 20px;
- height: 20px;
- min-height: 20px;
- font-size: 20px;
-}
-
-.material-icons.tb-md-96 {
- width: 96px;
- height: 96px;
- font-size: 96px;
-}
-
-/***********************
- * Layout
- ***********************/
-
-.tb-absolute-fill {
- position: absolute;
- top: 0;
- right: 0;
- bottom: 0;
- left: 0;
-}
-
-.tb-progress-cover {
- position: absolute;
- top: 0;
- right: 0;
- bottom: 0;
- left: 0;
- z-index: 6;
- opacity: 1;
-}
-
-/***********************
- * ACE
- ***********************/
-
-.ace_editor {
- font-size: 16px !important;
-}
diff --git a/ui/src/scss/mixins.scss b/ui/src/scss/mixins.scss
deleted file mode 100644
index 59728593b0..0000000000
--- a/ui/src/scss/mixins.scss
+++ /dev/null
@@ -1,67 +0,0 @@
-/**
- * Copyright © 2016-2020 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 "~compass-sass-mixins/lib/compass";
-
-/* stylelint-disable selector-no-vendor-prefix */
-@mixin input-placeholder {
- // replaces compass/css/user-interface/input-placeholder()
-
- &::-webkit-input-placeholder {
- @content;
- }
-
- &:-moz-placeholder {
- @content;
- opacity: 1;
- }
-
- &::-moz-placeholder {
- @content;
- opacity: 1;
- }
-
- &:-ms-input-placeholder {
- @content;
- }
-}
-/* stylelint-enable selector-no-vendor-prefix */
-
-@mixin line-clamp($numLines: 1, $lineHeight: 1.412) {
- position: relative;
- max-height: ($numLines * $lineHeight * 1em);
- padding-right: 2em;
- margin-right: -1em;
- overflow: hidden;
- line-height: $lineHeight;
- text-align: justify;
-
- &::before {
- position: absolute;
- right: 1em;
- bottom: 0;
- content: "...";
- }
-
- &::after {
- position: absolute;
- right: 1em;
- width: 1em;
- height: 1em;
- margin-top: .2em;
- content: "";
- background: #fff;
- }
-}
diff --git a/ui/src/svg/logo_title_white.svg b/ui/src/svg/logo_title_white.svg
deleted file mode 100644
index 3e6d570b47..0000000000
--- a/ui/src/svg/logo_title_white.svg
+++ /dev/null
@@ -1,37 +0,0 @@
-
diff --git a/ui/src/svg/logo_white.svg b/ui/src/svg/logo_white.svg
deleted file mode 100644
index 52a38c9a3a..0000000000
--- a/ui/src/svg/logo_white.svg
+++ /dev/null
@@ -1,10 +0,0 @@
-
diff --git a/ui/src/svg/mdi.svg b/ui/src/svg/mdi.svg
deleted file mode 100644
index bb8fa1c08b..0000000000
--- a/ui/src/svg/mdi.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/ui/src/thingsboard.ico b/ui/src/thingsboard.ico
deleted file mode 100644
index 8564792b75..0000000000
Binary files a/ui/src/thingsboard.ico and /dev/null differ
diff --git a/ui/src/vendor/css.js/css.js b/ui/src/vendor/css.js/css.js
deleted file mode 100644
index d8ee7160ba..0000000000
--- a/ui/src/vendor/css.js/css.js
+++ /dev/null
@@ -1,673 +0,0 @@
-/* eslint-disable */
-
-/* jshint unused:false */
-/* global base64_decode, CSSWizardView, window, console, jQuery */
-var fi = function () {
-
- this.cssImportStatements = [];
- this.cssKeyframeStatements = [];
-
- this.cssRegex = new RegExp('([\\s\\S]*?){([\\s\\S]*?)}', 'gi');
- this.cssMediaQueryRegex = '((@media [\\s\\S]*?){([\\s\\S]*?}\\s*?)})';
- this.cssKeyframeRegex = '((@.*?keyframes [\\s\\S]*?){([\\s\\S]*?}\\s*?)})';
- this.combinedCSSRegex = '((\\s*?@media[\\s\\S]*?){([\\s\\S]*?)}\\s*?})|(([\\s\\S]*?){([\\s\\S]*?)})'; //to match css & media queries together
- this.cssCommentsRegex = '(\\/\\*[\\s\\S]*?\\*\\/)';
- this.cssImportStatementRegex = new RegExp('@import .*?;', 'gi');
-};
-
-/*
- Strip outs css comments and returns cleaned css string
-
- @param css, the original css string to be stipped out of comments
-
- @return cleanedCSS contains no css comments
- */
-fi.prototype.stripComments = function (cssString) {
- var regex = new RegExp(this.cssCommentsRegex, 'gi');
-
- return cssString.replace(regex, '');
-};
-
-/*
- Parses given css string, and returns css object
- keys as selectors and values are css rules
- eliminates all css comments before parsing
-
- @param source css string to be parsed
-
- @return object css
- */
-fi.prototype.parseCSS = function (source) {
-
- if (source === undefined) {
- return [];
- }
-
- var css = [];
- //strip out comments
- //source = this.stripComments(source);
-
- //get import statements
-
- while (true) {
- var imports = this.cssImportStatementRegex.exec(source);
- if (imports !== null) {
- this.cssImportStatements.push(imports[0]);
- css.push({
- selector: '@imports',
- type: 'imports',
- styles: imports[0]
- });
- } else {
- break;
- }
- }
- source = source.replace(this.cssImportStatementRegex, '');
- //get keyframe statements
- var keyframesRegex = new RegExp(this.cssKeyframeRegex, 'gi');
- var arr;
- while (true) {
- arr = keyframesRegex.exec(source);
- if (arr === null) {
- break;
- }
- css.push({
- selector: '@keyframes',
- type: 'keyframes',
- styles: arr[0]
- });
- }
- source = source.replace(keyframesRegex, '');
-
- //unified regex
- var unified = new RegExp(this.combinedCSSRegex, 'gi');
-
- while (true) {
- arr = unified.exec(source);
- if (arr === null) {
- break;
- }
- var selector = '';
- if (arr[2] === undefined) {
- selector = arr[5].split('\r\n').join('\n').trim();
- } else {
- selector = arr[2].split('\r\n').join('\n').trim();
- }
-
- /*
- fetch comments and associate it with current selector
- */
- var commentsRegex = new RegExp(this.cssCommentsRegex, 'gi');
- var comments = commentsRegex.exec(selector);
- if (comments !== null) {
- selector = selector.replace(commentsRegex, '').trim();
- }
-
- //determine the type
- if (selector.indexOf('@media') !== -1) {
- //we have a media query
- var cssObject = {
- selector: selector,
- type: 'media',
- subStyles: this.parseCSS(arr[3] + '\n}') //recursively parse media query inner css
- };
- if (comments !== null) {
- cssObject.comments = comments[0];
- }
- css.push(cssObject);
- } else {
- //we have standart css
- var rules = this.parseRules(arr[6]);
- var style = {
- selector: selector,
- rules: rules
- };
- if (selector === '@font-face') {
- style.type = 'font-face';
- }
- if (comments !== null) {
- style.comments = comments[0];
- }
- css.push(style);
- }
- }
-
- return css;
-};
-
-/*
- parses given string containing css directives
- and returns an array of objects containing ruleName:ruleValue pairs
-
- @param rules, css directive string example
- \n\ncolor:white;\n font-size:18px;\n
- */
-fi.prototype.parseRules = function (rules) {
- //convert all windows style line endings to unix style line endings
- rules = rules.split('\r\n').join('\n');
- var ret = [];
-
- // Split all rules but keep semicolon for base64 url data
- rules = rules.split(/;(?![^\(]*\))/);
-
- //proccess rules line by line
- for (var i = 0; i < rules.length; i++) {
- var line = rules[i];
-
- //determine if line is a valid css directive, ie color:white;
- line = line.trim();
- if (line.indexOf(':') !== -1) {
- //line contains :
- line = line.split(':');
- var cssDirective = line[0].trim();
- var cssValue = line.slice(1).join(':').trim();
-
- //more checks
- if (cssDirective.length < 1 || cssValue.length < 1) {
- continue; //there is no css directive or value that is of length 1 or 0
- // PLAIN WRONG WHAT ABOUT margin:0; ?
- }
-
- //push rule
- ret.push({
- directive: cssDirective,
- value: cssValue
- });
- } else {
- //if there is no ':', but what if it was mis splitted value which starts with base64
- if (line.trim().substr(0, 7) == 'base64,') { //hack :)
- ret[ret.length - 1].value += line.trim();
- } else {
- //add rule, even if it is defective
- if (line.length > 0) {
- ret.push({
- directive: '',
- value: line,
- defective: true
- });
- }
- }
- }
- }
-
- return ret; //we are done!
-};
-/*
- just returns the rule having given directive
- if not found returns false;
- */
-fi.prototype.findCorrespondingRule = function (rules, directive, value) {
- if (value === undefined) {
- value = false;
- }
- var ret = false;
- for (var i = 0; i < rules.length; i++) {
- if (rules[i].directive == directive) {
- ret = rules[i];
- if (value === rules[i].value) {
- break;
- }
- }
- }
- return ret;
-};
-
-/*
- Finds styles that have given selector, compress them,
- and returns them
- */
-fi.prototype.findBySelector = function (cssObjectArray, selector, contains) {
- if (contains === undefined) {
- contains = false;
- }
-
- var found = [];
- for (var i = 0; i < cssObjectArray.length; i++) {
- if (contains === false) {
- if (cssObjectArray[i].selector === selector) {
- found.push(cssObjectArray[i]);
- }
- } else {
- if (cssObjectArray[i].selector.indexOf(selector) !== -1) {
- found.push(cssObjectArray[i]);
- }
- }
-
- }
- if (found.length < 2) {
- return found;
- } else {
- var base = found[0];
- for (i = 1; i < found.length; i++) {
- this.intelligentCSSPush([base], found[i]);
- }
- return [base]; //we are done!! all properties merged into base!
- }
-};
-
-/*
- deletes cssObjects having given selector, and returns new array
- */
-fi.prototype.deleteBySelector = function (cssObjectArray, selector) {
- var ret = [];
- for (var i = 0; i < cssObjectArray.length; i++) {
- if (cssObjectArray[i].selector !== selector) {
- ret.push(cssObjectArray[i]);
- }
- }
- return ret;
-};
-
-/*
- Compresses given cssObjectArray and tries to minimize
- selector redundence.
- */
-fi.prototype.compressCSS = function (cssObjectArray) {
- var compressed = [];
- var done = {};
- for (var i = 0; i < cssObjectArray.length; i++) {
- var obj = cssObjectArray[i];
- if (done[obj.selector] === true) {
- continue;
- }
-
- var found = this.findBySelector(cssObjectArray, obj.selector); //found compressed
- if (found.length !== 0) {
- compressed.push(found[0]);
- done[obj.selector] = true;
- }
- }
- return compressed;
-};
-
-/*
- Received 2 css objects with following structure
- {
- rules : [{directive:"", value:""}, {directive:"", value:""}, ...]
- selector : "SOMESELECTOR"
- }
-
- returns the changed(new,removed,updated) values on css1 parameter, on same structure
-
- if two css objects are the same, then returns false
-
- if a css directive exists in css1 and css2, and its value is different, it is included in diff
- if a css directive exists in css1 and not css2, it is then included in diff
- if a css directive exists in css2 but not css1, then it is deleted in css1, it would be included in diff but will be marked as type='DELETED'
-
- @object css1 css object
- @object css2 css object
-
- @return diff css object contains changed values in css1 in regards to css2 see test input output in /test/data/css.js
- */
-fi.prototype.cssDiff = function (css1, css2) {
- if (css1.selector !== css2.selector) {
- return false;
- }
-
- //if one of them is media query return false, because diff function can not operate on media queries
- if ((css1.type === 'media' || css2.type === 'media')) {
- return false;
- }
-
- var diff = {
- selector: css1.selector,
- rules: []
- };
- var rule1, rule2;
- for (var i = 0; i < css1.rules.length; i++) {
- rule1 = css1.rules[i];
- //find rule2 which has the same directive as rule1
- rule2 = this.findCorrespondingRule(css2.rules, rule1.directive, rule1.value);
- if (rule2 === false) {
- //rule1 is a new rule in css1
- diff.rules.push(rule1);
- } else {
- //rule2 was found only push if its value is different too
- if (rule1.value !== rule2.value) {
- diff.rules.push(rule1);
- }
- }
- }
-
- //now for rules exists in css2 but not in css1, which means deleted rules
- for (var ii = 0; ii < css2.rules.length; ii++) {
- rule2 = css2.rules[ii];
- //find rule2 which has the same directive as rule1
- rule1 = this.findCorrespondingRule(css1.rules, rule2.directive);
- if (rule1 === false) {
- //rule1 is a new rule
- rule2.type = 'DELETED'; //mark it as a deleted rule, so that other merge operations could be true
- diff.rules.push(rule2);
- }
- }
-
-
- if (diff.rules.length === 0) {
- return false;
- }
- return diff;
-};
-
-/*
- Merges 2 different css objects together
- using intelligentCSSPush,
-
- @param cssObjectArray, target css object array
- @param newArray, source array that will be pushed into cssObjectArray parameter
- @param reverse, [optional], if given true, first parameter will be traversed on reversed order
- effectively giving priority to the styles in newArray
- */
-fi.prototype.intelligentMerge = function (cssObjectArray, newArray, reverse) {
- if (reverse === undefined) {
- reverse = false;
- }
-
-
- for (var i = 0; i < newArray.length; i++) {
- this.intelligentCSSPush(cssObjectArray, newArray[i], reverse);
- }
- for (i = 0; i < cssObjectArray.length; i++) {
- var cobj = cssObjectArray[i];
- if (cobj.type === 'media' || (cobj.type === 'keyframes')) {
- continue;
- }
- cobj.rules = this.compactRules(cobj.rules);
- }
-};
-
-/*
- inserts new css objects into a bigger css object
- with same selectors groupped together
-
- @param cssObjectArray, array of bigger css object to be pushed into
- @param minimalObject, single css object
- @param reverse [optional] default is false, if given, cssObjectArray will be reversly traversed
- resulting more priority in minimalObject's styles
- */
-fi.prototype.intelligentCSSPush = function (cssObjectArray, minimalObject, reverse) {
- var pushSelector = minimalObject.selector;
- //find correct selector if not found just push minimalObject into cssObject
- var cssObject = false;
-
- if (reverse === undefined) {
- reverse = false;
- }
-
- if (reverse === false) {
- for (var i = 0; i < cssObjectArray.length; i++) {
- if (cssObjectArray[i].selector === minimalObject.selector) {
- cssObject = cssObjectArray[i];
- break;
- }
- }
- } else {
- for (var j = cssObjectArray.length - 1; j > -1; j--) {
- if (cssObjectArray[j].selector === minimalObject.selector) {
- cssObject = cssObjectArray[j];
- break;
- }
- }
- }
-
- if (cssObject === false) {
- cssObjectArray.push(minimalObject); //just push, because cssSelector is new
- } else {
- if (minimalObject.type !== 'media') {
- for (var ii = 0; ii < minimalObject.rules.length; ii++) {
- var rule = minimalObject.rules[ii];
- //find rule inside cssObject
- var oldRule = this.findCorrespondingRule(cssObject.rules, rule.directive);
- if (oldRule === false) {
- cssObject.rules.push(rule);
- } else if (rule.type == 'DELETED') {
- oldRule.type = 'DELETED';
- } else {
- //rule found just update value
-
- oldRule.value = rule.value;
- }
- }
- } else {
- cssObject.subStyles = minimalObject.subStyles; //TODO, make this intelligent too
- }
-
- }
-};
-
-/*
- filter outs rule objects whose type param equal to DELETED
-
- @param rules, array of rules
-
- @returns rules array, compacted by deleting all unneccessary rules
- */
-fi.prototype.compactRules = function (rules) {
- var newRules = [];
- for (var i = 0; i < rules.length; i++) {
- if (rules[i].type !== 'DELETED') {
- newRules.push(rules[i]);
- }
- }
- return newRules;
-};
-/*
- computes string for ace editor using this.css or given cssBase optional parameter
-
- @param [optional] cssBase, if given computes cssString from cssObject array
- */
-fi.prototype.getCSSForEditor = function (cssBase, depth) {
- if (depth === undefined) {
- depth = 0;
- }
- var ret = '';
- if (cssBase === undefined) {
- cssBase = this.css;
- }
- //append imports
- for (var i = 0; i < cssBase.length; i++) {
- if (cssBase[i].type == 'imports') {
- ret += cssBase[i].styles + '\n\n';
- }
- }
- for (i = 0; i < cssBase.length; i++) {
- var tmp = cssBase[i];
- if (tmp.selector === undefined) { //temporarily omit media queries
- continue;
- }
- var comments = "";
- if (tmp.comments !== undefined) {
- comments = tmp.comments + '\n';
- }
-
- if (tmp.type == 'media') { //also put media queries to output
- ret += comments + tmp.selector + '{\n';
- ret += this.getCSSForEditor(tmp.subStyles, depth + 1);
- ret += '}\n\n';
- } else if (tmp.type !== 'keyframes' && tmp.type !== 'imports') {
- ret += this.getSpaces(depth) + comments + tmp.selector + ' {\n';
- ret += this.getCSSOfRules(tmp.rules, depth + 1);
- ret += this.getSpaces(depth) + '}\n\n';
- }
- }
-
- //append keyFrames
- for (i = 0; i < cssBase.length; i++) {
- if (cssBase[i].type == 'keyframes') {
- ret += cssBase[i].styles + '\n\n';
- }
- }
-
- return ret;
-};
-
-fi.prototype.getImports = function (cssObjectArray) {
- var imps = [];
- for (var i = 0; i < cssObjectArray.length; i++) {
- if (cssObjectArray[i].type == 'imports') {
- imps.push(cssObjectArray[i].styles);
- }
- }
- return imps;
-};
-/*
- given rules array, returns visually formatted css string
- to be used inside editor
- */
-fi.prototype.getCSSOfRules = function (rules, depth) {
- var ret = '';
- for (var i = 0; i < rules.length; i++) {
- if (rules[i] === undefined) {
- continue;
- }
- if (rules[i].defective === undefined) {
- ret += this.getSpaces(depth) + rules[i].directive + ' : ' + rules[i].value + ';\n';
- } else {
- ret += this.getSpaces(depth) + rules[i].value + ';\n';
- }
-
- }
- return ret || '\n';
-};
-
-/*
- A very simple helper function returns number of spaces appended in a single string,
- the number depends input parameter, namely input*2
- */
-fi.prototype.getSpaces = function (num) {
- var ret = '';
- for (var i = 0; i < num * 4; i++) {
- ret += ' ';
- }
- return ret;
-};
-
-/*
- Given css string or objectArray, parses it and then for every selector,
- prepends this.cssPreviewNamespace to prevent css collision issues
-
- @returns css string in which this.cssPreviewNamespace prepended
- */
-fi.prototype.applyNamespacing = function (css, forcedNamespace) {
- var cssObjectArray = css;
- var namespaceClass = '.' + this.cssPreviewNamespace;
- if (forcedNamespace !== undefined) {
- namespaceClass = forcedNamespace;
- }
-
- if (typeof css === 'string') {
- cssObjectArray = this.parseCSS(css);
- }
-
- for (var i = 0; i < cssObjectArray.length; i++) {
- var obj = cssObjectArray[i];
-
- //bypass namespacing for @font-face @keyframes @import
- if (obj.selector.indexOf('@font-face') > -1 || obj.selector.indexOf('keyframes') > -1 || obj.selector.indexOf('@import') > -1 || obj.selector.indexOf('.form-all') > -1 || obj.selector.indexOf('#stage') > -1) {
- continue;
- }
-
- if (obj.type !== 'media') {
- var selector = obj.selector.split(',');
- var newSelector = [];
- for (var j = 0; j < selector.length; j++) {
- if (selector[j].indexOf('.supernova') === -1) { //do not apply namespacing to selectors including supernova
- newSelector.push(namespaceClass + ' ' + selector[j]);
- } else {
- newSelector.push(selector[j]);
- }
- }
- obj.selector = newSelector.join(',');
- } else {
- obj.subStyles = this.applyNamespacing(obj.subStyles, forcedNamespace); //handle media queries as well
- }
- }
-
- return cssObjectArray;
-};
-
-/*
- given css string or object array, clears possible namespacing from
- all of the selectors inside the css
- */
-fi.prototype.clearNamespacing = function (css, returnObj) {
- if (returnObj === undefined) {
- returnObj = false;
- }
- var cssObjectArray = css;
- var namespaceClass = '.' + this.cssPreviewNamespace;
- if (typeof css === 'string') {
- cssObjectArray = this.parseCSS(css);
- }
-
- for (var i = 0; i < cssObjectArray.length; i++) {
- var obj = cssObjectArray[i];
-
- if (obj.type !== 'media') {
- var selector = obj.selector.split(',');
- var newSelector = [];
- for (var j = 0; j < selector.length; j++) {
- newSelector.push(selector[j].split(namespaceClass + ' ').join(''));
- }
- obj.selector = newSelector.join(',');
- } else {
- obj.subStyles = this.clearNamespacing(obj.subStyles, true); //handle media queries as well
- }
- }
- if (returnObj === false) {
- return this.getCSSForEditor(cssObjectArray);
- } else {
- return cssObjectArray;
- }
-
-};
-
-/*
- creates a new style tag (also destroys the previous one)
- and injects given css string into that css tag
- */
-fi.prototype.createStyleElement = function (id, css, format) {
- if (format === undefined) {
- format = false;
- }
-
- if (this.testMode === false && format !== 'nonamespace') {
- //apply namespacing classes
- css = this.applyNamespacing(css);
- }
-
- if (typeof css != 'string') {
- css = this.getCSSForEditor(css);
- }
- //apply formatting for css
- if (format === true) {
- css = this.getCSSForEditor(this.parseCSS(css));
- }
-
- if (this.testMode !== false) {
- return this.testMode('create style #' + id, css); //if test mode, just pass result to callback
- }
-
- var __el = document.getElementById(id);
- if (__el) {
- __el.parentNode.removeChild(__el);
- }
-
- var head = document.head || document.getElementsByTagName('head')[0],
- style = document.createElement('style');
-
- style.id = id;
- style.type = 'text/css';
-
- head.appendChild(style);
-
- if (style.styleSheet && !style.sheet) {
- style.styleSheet.cssText = css;
- } else {
- style.appendChild(document.createTextNode(css));
- }
-};
-
-export default fi;
-
-/* eslint-enable */
\ No newline at end of file
diff --git a/ui/src/vendor/css.js/css.min.js b/ui/src/vendor/css.js/css.min.js
deleted file mode 100644
index b0e02da6f2..0000000000
--- a/ui/src/vendor/css.js/css.min.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/*! css.js 19-04-2016 */
-!function(a){"use strict";var b=function(){this.cssImportStatements=[],this.cssKeyframeStatements=[],this.cssRegex=new RegExp("([\\s\\S]*?){([\\s\\S]*?)}","gi"),this.cssMediaQueryRegex="((@media [\\s\\S]*?){([\\s\\S]*?}\\s*?)})",this.cssKeyframeRegex="((@.*?keyframes [\\s\\S]*?){([\\s\\S]*?}\\s*?)})",this.combinedCSSRegex="((\\s*?(?:\\/\\*[\\s\\S]*?\\*\\/)?\\s*?@media[\\s\\S]*?){([\\s\\S]*?)}\\s*?})|(([\\s\\S]*?){([\\s\\S]*?)})",this.cssCommentsRegex="(\\/\\*[\\s\\S]*?\\*\\/)",this.cssImportStatementRegex=new RegExp("@import .*?;","gi")};b.prototype.stripComments=function(a){var b=new RegExp(this.cssCommentsRegex,"gi");return a.replace(b,"")},b.prototype.parseCSS=function(a){if(void 0===a)return[];for(var b=[];;){var c=this.cssImportStatementRegex.exec(a);if(null===c)break;this.cssImportStatements.push(c[0]),b.push({selector:"@imports",type:"imports",styles:c[0]})}a=a.replace(this.cssImportStatementRegex,"");for(var d,e=new RegExp(this.cssKeyframeRegex,"gi");;){if(d=e.exec(a),null===d)break;b.push({selector:"@keyframes",type:"keyframes",styles:d[0]})}a=a.replace(e,"");for(var f=new RegExp(this.combinedCSSRegex,"gi");;){if(d=f.exec(a),null===d)break;var g="";g=void 0===d[2]?d[5].split("\r\n").join("\n").trim():d[2].split("\r\n").join("\n").trim();var h=new RegExp(this.cssCommentsRegex,"gi"),i=h.exec(g);if(null!==i&&(g=g.replace(h,"").trim()),g=g.replace(/\n+/,"\n"),-1!==g.indexOf("@media")){var j={selector:g,type:"media",subStyles:this.parseCSS(d[3]+"\n}")};null!==i&&(j.comments=i[0]),b.push(j)}else{var k=this.parseRules(d[6]),l={selector:g,rules:k};"@font-face"===g&&(l.type="font-face"),null!==i&&(l.comments=i[0]),b.push(l)}}return b},b.prototype.parseRules=function(a){a=a.split("\r\n").join("\n");var b=[];a=a.split(";");for(var c=0;c0&&b.push({directive:"",value:d,defective:!0})}return b},b.prototype.findCorrespondingRule=function(a,b,c){void 0===c&&(c=!1);for(var d=!1,e=0;e-1;f--)if(a[f].selector===b.selector){d=a[f];break}if(d===!1)a.push(b);else if("media"!==b.type)for(var g=0;gc;c++)b+=" ";return b},b.prototype.applyNamespacing=function(a,b){var c=a,d="."+this.cssPreviewNamespace;void 0!==b&&(d=b),"string"==typeof a&&(c=this.parseCSS(a));for(var e=0;e-1||f.selector.indexOf("keyframes")>-1||f.selector.indexOf("@import")>-1||f.selector.indexOf(".form-all")>-1||f.selector.indexOf("#stage")>-1))if("media"!==f.type){for(var g=f.selector.split(","),h=[],i=0;i {
- /* It is expected what the name of a locale file has the following format: */
- /* 'locale.constant-LANG_CODE[_REGION_CODE].json', e.g. locale.constant-es.json or locale.constant-zh_CN.json*/
- langs.push(item.name.slice(item.name.lastIndexOf('-') + 1, -5));
-});
-
-/* devtool: 'cheap-module-eval-source-map', */
-
-module.exports = {
- mode: 'development',
- devtool: 'source-map',
- entry: [
- './src/app/app.js',
- 'webpack-hot-middleware/client?reload=true',
- 'webpack-material-design-icons'
- ],
- output: {
- path: path.resolve(__dirname, 'target/generated-resources/public/static'),
- publicPath: PUBLIC_RESOURCE_PATH,
- filename: 'bundle.js',
- },
- plugins: [
- new webpack.ProvidePlugin({
- $: "jquery",
- jQuery: "jquery",
- "window.jQuery": "jquery",
- tinycolor: "tinycolor2",
- tv4: "tv4",
- moment: "moment"
- }),
- new CopyWebpackPlugin([
- {
- from: './src/thingsboard.ico',
- to: 'thingsboard.ico'
- },
- {
- from: './src/app/locale',
- to: 'locale',
- ignore: [ '*.js' ],
- transform: function(content, path) {
- return Buffer.from(jsonminify(content.toString()));
- }
- }
- ]),
- new webpack.HotModuleReplacementPlugin(),
- new HtmlWebpackPlugin({
- template: './src/index.html',
- filename: 'index.html',
- title: 'ThingsBoard',
- inject: 'body',
- }),
- new StyleLintPlugin(),
- new MiniCssExtractPlugin({
- filename: 'style.[contentHash].css'
- }),
- new webpack.DefinePlugin({
- THINGSBOARD_VERSION: JSON.stringify(require('./package.json').version),
- '__DEVTOOLS__': false,
- PUBLIC_PATH: JSON.stringify(PUBLIC_RESOURCE_PATH),
- SUPPORTED_LANGS: JSON.stringify(langs)
- })
- ],
- node: {
- tls: "empty",
- fs: "empty"
- },
- module: {
- rules: [
- {
- test: /\.jsx$/,
- use: [
- {
- loader: 'babel-loader',
- options: {
- cacheDirectory: true
- }
- }
- ],
- exclude: /node_modules/,
- include: __dirname,
- },
- {
- test: /\.js$/,
- use: [
- {
- loader: 'ng-annotate-loader',
- options: {
- ngAnnotate: 'ng-annotate-patched',
- es6: true,
- explicitOnly: false
- }
- },
- {
- loader: 'babel-loader',
- options: {
- cacheDirectory: true
- }
- }
- ],
- exclude: /node_modules/,
- include: __dirname,
- },
- {
- test: /\.js$/,
- use: [
- {
- loader: 'eslint-loader',
- options: {
- parser: 'babel-eslint'
- }
- }
- ],
- exclude: /node_modules|vendor/,
- include: __dirname,
- },
- {
- test: /\.css$/,
- use: [
- MiniCssExtractPlugin.loader,
- 'css-loader'
- ]
- },
- {
- test: /\.scss$/,
- use: [
- MiniCssExtractPlugin.loader,
- 'css-loader',
- 'postcss-loader',
- 'sass-loader'
- ]
- },
- {
- test: /\.less$/,
- use: [
- MiniCssExtractPlugin.loader,
- 'css-loader',
- 'postcss-loader',
- 'less-loader'
- ]
- },
- {
- test: /\.tpl\.html$/,
- use: [
- {
- loader: 'ngtemplate-loader',
- options: {
- relativeTo: path.resolve(__dirname, './src/app')
- }
- },
- {
- loader: 'html-loader'
- },
- {
- loader: 'html-minifier-loader',
- options: {
- caseSensitive: true,
- removeComments: true,
- collapseWhitespace: false,
- preventAttributesEscaping: true,
- removeEmptyAttributes: false
- }
- }
- ]
- },
- {
- test: /\.(svg)(\?v=[0-9]+\.[0-9]+\.[0-9]+)?$/,
- use: [
- {
- loader: 'url-loader',
- options: {
- limit: 8192
- }
- }
- ]
- },
- {
- test: /\.(png|jpe?g|gif|woff|woff2|ttf|otf|eot|ico)(\?v=[0-9]+\.[0-9]+\.[0-9]+)?$/,
- use: [
- {
- loader: 'url-loader',
- options: {
- limit: 8192
- }
- },
- {
- loader: 'img-loader',
- options: {
- minimize: true
- }
- }
- ]
- }
- ],
- }
-};
diff --git a/ui/webpack.config.js b/ui/webpack.config.js
deleted file mode 100644
index 848712b9ad..0000000000
--- a/ui/webpack.config.js
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-/* eslint-disable */
-
-if (process.env.NODE_ENV === 'production') {
- module.exports = require('./webpack.config.prod');
-} else {
- module.exports = require('./webpack.config.dev');
-}
diff --git a/ui/webpack.config.prod.js b/ui/webpack.config.prod.js
deleted file mode 100644
index 5985ba1876..0000000000
--- a/ui/webpack.config.prod.js
+++ /dev/null
@@ -1,227 +0,0 @@
-/*
- * Copyright © 2016-2020 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.
- */
-/* eslint-disable */
-
-const HtmlWebpackPlugin = require('html-webpack-plugin');
-const MiniCssExtractPlugin = require('mini-css-extract-plugin');
-const CopyWebpackPlugin = require('copy-webpack-plugin');
-const CompressionPlugin = require('compression-webpack-plugin');
-
-const webpack = require('webpack');
-const path = require('path');
-const dirTree = require('directory-tree');
-const jsonminify = require("jsonminify");
-
-const PUBLIC_RESOURCE_PATH = '/static/';
-
-var langs = [];
-dirTree('./src/app/locale/', {extensions:/\.json$/}, (item) => {
- /* It is expected what the name of a locale file has the following format: */
- /* 'locale.constant-LANG_CODE[_REGION_CODE].json', e.g. locale.constant-es.json or locale.constant-zh_CN.json*/
- langs.push(item.name.slice(item.name.lastIndexOf('-') + 1, -5));
-});
-
-module.exports = {
- mode: 'production',
- entry: [
- './src/app/app.js',
- 'webpack-material-design-icons'
- ],
- output: {
- path: path.resolve(__dirname, 'target/generated-resources/public/static'),
- publicPath: PUBLIC_RESOURCE_PATH,
- filename: 'bundle.[hash].js',
- pathinfo: false
- },
- plugins: [
- new webpack.ProvidePlugin({
- $: "jquery",
- jQuery: "jquery",
- "window.jQuery": "jquery",
- tinycolor: "tinycolor2",
- tv4: "tv4",
- moment: "moment"
- }),
- new CopyWebpackPlugin([
- {
- from: './src/thingsboard.ico',
- to: 'thingsboard.ico'
- },
- {
- from: './src/app/locale',
- to: 'locale',
- ignore: [ '*.js' ],
- transform: function(content, path) {
- return Buffer.from(jsonminify(content.toString()));
- }
- }
- ]),
- new HtmlWebpackPlugin({
- template: './src/index.html',
- filename: '../index.html',
- title: 'ThingsBoard',
- inject: 'body',
- }),
- new MiniCssExtractPlugin({
- filename: 'style.[contentHash].css'
- }),
- new webpack.DefinePlugin({
- THINGSBOARD_VERSION: JSON.stringify(require('./package.json').version),
- '__DEVTOOLS__': false,
- PUBLIC_PATH: PUBLIC_RESOURCE_PATH,
- SUPPORTED_LANGS: JSON.stringify(langs)
- }),
- new CompressionPlugin({
- filename: "[path].gz[query]",
- algorithm: "gzip",
- test: /\.js$|\.css$|\.svg$|\.ttf$|\.woff$|\.woff2$|\.eot$|\.json$/,
- threshold: 10240,
- minRatio: 0.8
- })
- ],
- node: {
- tls: "empty",
- fs: "empty"
- },
- module: {
- rules: [
- {
- test: /\.jsx$/,
- use: [
- {
- loader: 'babel-loader',
- options: {
- cacheDirectory: true
- }
- }
- ],
- exclude: /node_modules/,
- include: __dirname,
- },
- {
- test: /\.js$/,
- use: [
- {
- loader: 'ng-annotate-loader',
- options: {
- ngAnnotate: 'ng-annotate-patched',
- es6: true,
- explicitOnly: false
- }
- },
- {
- loader: 'babel-loader',
- options: {
- cacheDirectory: true
- }
- }
- ],
- exclude: /node_modules/,
- include: __dirname,
- },
- {
- test: /\.js$/,
- use: [
- {
- loader: 'eslint-loader',
- options: {
- parser: 'babel-eslint'
- }
- }
- ],
- exclude: /node_modules|vendor/,
- include: __dirname,
- },
- {
- test: /\.css$/,
- use: [
- MiniCssExtractPlugin.loader,
- 'css-loader'
- ]
- },
- {
- test: /\.scss$/,
- use: [
- MiniCssExtractPlugin.loader,
- 'css-loader',
- 'postcss-loader',
- 'sass-loader'
- ]
- },
- {
- test: /\.less$/,
- use: [
- MiniCssExtractPlugin.loader,
- 'css-loader',
- 'postcss-loader',
- 'less-loader'
- ]
- },
- {
- test: /\.tpl\.html$/,
- use: [
- {
- loader: 'ngtemplate-loader',
- options: {
- relativeTo: path.resolve(__dirname, './src/app')
- }
- },
- {
- loader: 'html-loader'
- },
- {
- loader: 'html-minifier-loader',
- options: {
- caseSensitive: true,
- removeComments: true,
- collapseWhitespace: false,
- preventAttributesEscaping: true,
- removeEmptyAttributes: false
- }
- }
- ]
- },
- {
- test: /\.(svg)(\?v=[0-9]+\.[0-9]+\.[0-9]+)?$/,
- use: [
- {
- loader: 'url-loader',
- options: {
- limit: 8192
- }
- }
- ]
- },
- {
- test: /\.(png|jpe?g|gif|woff|woff2|ttf|otf|eot|ico)(\?v=[0-9]+\.[0-9]+\.[0-9]+)?$/,
- use: [
- {
- loader: 'url-loader',
- options: {
- limit: 8192
- }
- },
- {
- loader: 'img-loader',
- options: {
- minimize: true
- }
- }
- ]
- }
- ],
- }
-};