diff --git a/ui/src/app/locale/locale.constant-de_DE.json b/ui/src/app/locale/locale.constant-de_DE.json
index dd462a383f..bc241e28a5 100644
--- a/ui/src/app/locale/locale.constant-de_DE.json
+++ b/ui/src/app/locale/locale.constant-de_DE.json
@@ -1559,6 +1559,7 @@
"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"
}
diff --git a/ui/src/app/locale/locale.constant-en_US.json b/ui/src/app/locale/locale.constant-en_US.json
index f8b4b3d4f2..9e38c55aaa 100644
--- a/ui/src/app/locale/locale.constant-en_US.json
+++ b/ui/src/app/locale/locale.constant-en_US.json
@@ -1564,6 +1564,7 @@
"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"
}
diff --git a/ui/src/app/locale/locale.constant-es_ES.json b/ui/src/app/locale/locale.constant-es_ES.json
index afb96ceb0c..48ace08e6b 100644
--- a/ui/src/app/locale/locale.constant-es_ES.json
+++ b/ui/src/app/locale/locale.constant-es_ES.json
@@ -1559,7 +1559,8 @@
"widget-action": {
"action-cell-button": "Botón de acción de celda",
"row-click": "Clic en la fila",
- "marker-click": "Clic en el marcador",
+ "polygon-click": "Clic en la fila",
+ "marker-click": "Clic en el polígono",
"tooltip-tag-action": "Acción de etiqueta para globo de ayuda"
}
},
diff --git a/ui/src/app/locale/locale.constant-fr_FR.json b/ui/src/app/locale/locale.constant-fr_FR.json
index 651b695779..f22f90548b 100644
--- a/ui/src/app/locale/locale.constant-fr_FR.json
+++ b/ui/src/app/locale/locale.constant-fr_FR.json
@@ -336,6 +336,7 @@
"action-cell-button": "Action cell button",
"marker-click": "On marker click",
"row-click": "On row click",
+ "polygon-click": "On polygon click",
"tooltip-tag-action": "Tooltip tag action"
}
},
diff --git a/ui/src/app/locale/locale.constant-it_IT.json b/ui/src/app/locale/locale.constant-it_IT.json
index 1d3a84fe25..986fdc19a0 100644
--- a/ui/src/app/locale/locale.constant-it_IT.json
+++ b/ui/src/app/locale/locale.constant-it_IT.json
@@ -133,8 +133,13 @@
"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-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",
@@ -145,7 +150,7 @@
"filter-type-single-entity": "Singola entità",
"filter-type-entity-list": "Lista Entità",
"filter-type-entity-name": "Nome Entità",
- "filter-type-state-entity": "Entity from dashboard state",
+ "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}}'",
@@ -153,26 +158,31 @@
"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-relations-query": "Relations query",
- "filter-type-relations-query-description": "{{entities}} that have {{relationType}} relation {{direction}} {{rootEntity}}",
+ "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": "Assets with types {{assetTypes}} that have {{relationType}} relation {{direction}} {{rootEntity}}",
+ "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": "Devices with types {{deviceTypes}} that have {{relationType}} relation {{direction}} {{rootEntity}}",
+ "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": "Resolve as multiple entities",
+ "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": "Use dashboard state entity as root",
+ "root-state-entity": "Usa l'entità di stato della dashboard come radice",
"root-entity": "Entità radice",
- "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",
+ "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"
},
@@ -212,10 +222,10 @@
"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 {# assets} } al cliente",
+ "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": "Unassign { count, plural, 1 {1 asset} other {# assets} } from customer",
+ "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.",
@@ -234,7 +244,7 @@
"copyId": "Copia Id asset",
"idCopiedMessage": "Id Asset copiato negli Appunti",
"select-asset": "Seleziona asset",
- "no-assets-matching": "Nessun asset corrispondente a '{{entity}}' é stato trovato.",
+ "no-assets-matching": "Nessun asset corrispondente a '{{entity}}' è stato trovato.",
"asset-required": "Asset obbligatorio",
"name-starts-with": "Asset con nome che inizia per"
},
@@ -288,12 +298,17 @@
"type-suspended": "Sospeso",
"type-credentials-read": "Credenziali lette",
"type-attributes-read": "Attributi letti",
- "status-success": "Success",
- "status-failure": "Failure",
+ "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",
+ "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": "Failure details",
+ "failure-details": "Dettagli fallimento",
"search": "Cerca log audit",
"clear-search": "Cancella ricerca"
},
@@ -333,10 +348,12 @@
"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",
@@ -388,14 +405,14 @@
"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": "Unassign from customer",
+ "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": "Unassign Dashboard(s) From Customers",
+ "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",
@@ -412,10 +429,10 @@
"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 {# dashboards} } 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 {# dashboards} } al cliente",
+ "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} }?",
@@ -425,7 +442,7 @@
"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 dashboards selezionate e queste non saranno più accessibili dal cliente.",
+ "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.",
@@ -461,12 +478,12 @@
"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": "Auto fill layout height",
+ "autofill-height": "Riempi automaticamente altezza layout",
"mobile-layout": "Impostazioni layout mobile",
- "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.",
+ "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",
@@ -527,18 +544,23 @@
"units": "Simbolo speciale da mostrare accanto al valore",
"decimals": "Numero cifre decimali",
"data-generation-func": "Funzione generazione dati",
- "use-data-post-processing-func": "Use data post-processing function",
+ "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": "Entity timeseries are required.",
- "timeseries-or-attributes-required": "Entity timeseries/attributes are required.",
+ "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} }"
+ "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",
@@ -563,11 +585,11 @@
"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.",
+ "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.",
+ "no-devices-matching": "Nessun dispositivo corrispondente a '{{entity}}' è stato trovato.",
"alias": "Alias",
- "alias-required": "Alias dispositivo richesto.",
+ "alias-required": "Alias dispositivo richiesto.",
"remove-alias": "Rimuovi alias dispositivo",
"add-alias": "Aggiungi alias dispositivo",
"name-starts-with": "Dispositivo il cui nome inizia per",
@@ -639,8 +661,8 @@
"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": "E' un gateway",
+ "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"
@@ -659,9 +681,9 @@
"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": "Filter is missing for alias '{{alias}}'.",
+ "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.",
@@ -701,6 +723,10 @@
"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} }",
@@ -711,7 +737,7 @@
"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 {List of # 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",
@@ -719,7 +745,7 @@
"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 of # 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",
@@ -730,16 +756,117 @@
"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 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-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"
+ "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",
@@ -795,8 +922,8 @@
"token": "Token di sicurezza",
"add-converter": "Aggiungi convertitore",
"add-config": "Aggiungi configurazione convertitore",
- "device-name-expression": "Device name expression",
- "device-type-expression": "Device type expression",
+ "device-name-expression": "Espressione nome dispositivo",
+ "device-type-expression": "Espressione tipo dispositivo",
"custom": "Custom",
"to-double": "To Double",
"transformer": "Transformer",
@@ -817,7 +944,7 @@
"credentials": "Credenziali",
"username": "Nome utente",
"password": "Password",
- "retry-interval": "Retry interval in milliseconds",
+ "retry-interval": "Intervallo di ripetizione in millisecondi",
"anonymous": "Anonimo",
"basic": "Basic",
"pem": "PEM",
@@ -886,6 +1013,8 @@
"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à",
@@ -1077,9 +1206,9 @@
"name-required": "Nome obbligatorio.",
"description": "Descrizione",
"add": "Aggiungi 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.",
+ "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} }?",
@@ -1110,33 +1239,38 @@
"events": "Eventi",
"search": "Ricerca nodi",
"open-node-library": "Apri libreria nodi",
- "add": "Add rule node",
+ "add": "Aggiungi nodo regola",
"name": "Nome",
"name-required": "Nome obbligatorio.",
"type": "Tipo",
"description": "Descrizione",
- "delete": "Delete rule node",
+ "delete": "Elimina nodo regola",
"select-all-objects": "Seleziona tutti i nodi e le connessioni",
- "deselect-all-objects": "Deselect all nodes and connections",
+ "deselect-all-objects": "Deseleziona tutti i nodi e le connessioni",
"delete-selected-objects": "Cancella nodi e connessioni selezionate",
- "delete-selected": "Delete selected",
+ "delete-selected": "Elimina selezionati",
"select-all": "Seleziona tutto",
"copy-selected": "Copia selezionata",
"deselect-all": "Deseleziona tutto",
- "rulenode-details": "Rule node details",
+ "rulenode-details": "Dettagli nodo regola",
"debug-mode": "Modalità debug",
"configuration": "Configurazione",
"link": "Link",
- "link-details": "Rule node link details",
+ "link-details": "Dettagli link nodo regola",
"add-link": "Aggiungi link",
"link-label": "Etichetta link",
"link-label-required": "Etichetta link obbligatoria.",
- "custom-link-label": "Custom link label",
- "custom-link-label-required": "Custom link label is required.",
+ "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": "Filter incoming messages with configured conditions",
+ "type-filter-details": "Filtra i messaggi in arrivo con le condizioni configurate",
"type-enrichment": "Enrichment",
- "type-enrichment-details": "Add additional information into Message Metadata",
+ "type-enrichment-details": "Aggiungi informazioni addizionali nei metadati del messaggio",
"type-transformation": "Transformation",
"type-transformation-details": "Change Message payload and Metadata",
"type-action": "Azioni",
@@ -1147,12 +1281,15 @@
"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.",
@@ -1200,13 +1337,13 @@
},
"timewindow": {
"days": "{ days, plural, 1 { giorno } other {# giorni } }",
- "hours": "{ hours, plural, 0 { hour } 1 {1 ora } other {# ore } }",
- "minutes": "{ minutes, plural, 0 { minute } 1 {1 minuto } other {# minuti } }",
- "seconds": "{ seconds, plural, 0 { second } 1 {1 secondo } other {# secondi } }",
+ "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": "from {{ startTime }} to {{ endTime }}",
+ "period": "da {{ startTime }} a {{ endTime }}",
"edit": "Modifica intervallo temporale",
"date-range": "Intervallo date",
"last": "Ultimo",
@@ -1215,7 +1352,7 @@
"user": {
"user": "Utente",
"users": "Utenti",
- "customer-users": "Customer Users",
+ "customer-users": "Utente cliente",
"tenant-admins": "Amministratori Tenant",
"sys-admin": "Amministratore di sistema",
"tenant-admin": "Amministratore tenant",
@@ -1232,7 +1369,7 @@
"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": "Resend activation",
+ "resend-activation": "Invia di nuovo attivazione",
"email": "Email",
"email-required": "Email obbligatoria.",
"invalid-email-format": "Formato email non valido.",
@@ -1251,7 +1388,9 @@
"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"
+ "details": "Dettagli",
+ "login-as-tenant-admin": "Accedi come Amministratore tenant",
+ "login-as-customer-user": "Accedi come Utente cliente"
},
"value": {
"type": "Tipo valore",
@@ -1274,7 +1413,7 @@
"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-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",
@@ -1295,7 +1434,7 @@
"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": "Toggle fullscreen",
+ "toggle-fullscreen": "Commuta modalità schermo intero",
"run": "Esegui widget",
"title": "Titolo widget",
"title-required": "Titolo widget obbligatorio.",
@@ -1308,7 +1447,7 @@
"tidy": "Tidy",
"css": "CSS",
"settings-schema": "Impostazioni schema",
- "datakey-settings-schema": "Data key settings 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.",
@@ -1367,7 +1506,7 @@
"general-settings": "Impostazioni generali",
"display-title": "Mostra titolo",
"drop-shadow": "Drop shadow",
- "enable-fullscreen": "Abilita fullscreen",
+ "enable-fullscreen": "Abilita schermo intero",
"background-color": "Colore sfondo",
"text-color": "Colore testo",
"padding": "Padding",
@@ -1412,7 +1551,7 @@
"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": "Widget type file",
+ "widget-type-file": "File tipo di widget",
"invalid-widget-type-file-error": "Impossibile importare un tipo di widget: struttura dati del widget non valida."
},
"icon": {
@@ -1423,10 +1562,11 @@
},
"custom": {
"widget-action": {
- "action-cell-button": "Action cell button",
- "row-click": "On row click",
- "marker-click": "On marker click",
- "tooltip-tag-action": "Tooltip tag 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"
}
},
"language": {
@@ -1435,9 +1575,9 @@
"de_DE": "Tedesco",
"fr_FR": "Francese",
"zh_CN": "Cinese",
- "ko_KR": "Coreano",
"en_US": "Inglese",
"it_IT": "Italiano",
+ "ko_KR": "Coreano",
"ru_RU": "Russo",
"es_ES": "Spagnolo",
"ja_JA": "Giapponese",
@@ -1445,4 +1585,4 @@
"fa_IR": "Persiana"
}
}
-}
\ No newline at end of file
+}
diff --git a/ui/src/app/locale/locale.constant-ja_JA.json b/ui/src/app/locale/locale.constant-ja_JA.json
index ce4d849216..9fe6971ff9 100644
--- a/ui/src/app/locale/locale.constant-ja_JA.json
+++ b/ui/src/app/locale/locale.constant-ja_JA.json
@@ -1442,6 +1442,7 @@
"widget-action": {
"action-cell-button": "アクションセルボタン",
"row-click": "行のクリック",
+ "polygon-click": "ポリゴンクリック",
"marker-click": "マーカークリック",
"tooltip-tag-action": "ツールチップのタグアクション"
}
diff --git a/ui/src/app/locale/locale.constant-ko_KR.json b/ui/src/app/locale/locale.constant-ko_KR.json
index 57aef0e525..87f92dc3e4 100644
--- a/ui/src/app/locale/locale.constant-ko_KR.json
+++ b/ui/src/app/locale/locale.constant-ko_KR.json
@@ -1318,6 +1318,7 @@
"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"
}
diff --git a/ui/src/app/locale/locale.constant-ru_RU.json b/ui/src/app/locale/locale.constant-ru_RU.json
index d31d8666bc..3ad4371cc1 100644
--- a/ui/src/app/locale/locale.constant-ru_RU.json
+++ b/ui/src/app/locale/locale.constant-ru_RU.json
@@ -1558,6 +1558,7 @@
"action-cell-button": "Кнопка действия ячейки",
"row-click": "Действий при щелчке на строку",
"marker-click": "Действия при щелчке на указателе",
+ "polygon-click": "Действия при щелчке на полигон",
"tooltip-tag-action": "Действие при подсказке"
}
},
diff --git a/ui/src/app/locale/locale.constant-tr_TR.json b/ui/src/app/locale/locale.constant-tr_TR.json
index b96eaaf3ce..e65d07bd83 100644
--- a/ui/src/app/locale/locale.constant-tr_TR.json
+++ b/ui/src/app/locale/locale.constant-tr_TR.json
@@ -1524,7 +1524,8 @@
"widget-action": {
"action-cell-button": "Eylem hücre butonu",
"row-click": "Satır tıklama eylemi",
- "marker-click": "İşaretçi tıklama eylemi",
+ "polygon-click": "Satır tıklama eylemi",
+ "marker-click": "Çokgen tıklama eylemi",
"tooltip-tag-action": "İpucu etiket eylemi"
}
},
diff --git a/ui/src/app/locale/locale.constant-zh_CN.json b/ui/src/app/locale/locale.constant-zh_CN.json
index 141c613065..eaf810c986 100644
--- a/ui/src/app/locale/locale.constant-zh_CN.json
+++ b/ui/src/app/locale/locale.constant-zh_CN.json
@@ -1429,6 +1429,7 @@
"action-cell-button": "动作单元格按钮",
"row-click": "点击行",
"marker-click": "点击标记",
+ "polygon-click": "单击多边形",
"tooltip-tag-action": "提示标签动作"
}
},
diff --git a/ui/src/app/widget/lib/google-map.js b/ui/src/app/widget/lib/google-map.js
index 157e656aac..ba1ae1f65e 100644
--- a/ui/src/app/widget/lib/google-map.js
+++ b/ui/src/app/widget/lib/google-map.js
@@ -315,7 +315,7 @@ export default class TbGoogleMap {
}
- createPolygon(latLangs, settings) {
+ createPolygon(latLangs, settings, location, onClickListener, markerArgs) {
let polygon = new google.maps.Polygon({
map: this.map,
paths: latLangs,
@@ -325,6 +325,32 @@ export default class TbGoogleMap {
fillOpacity: settings.polygonOpacity,
strokeWeight: settings.polygonStrokeWeight
});
+
+ //initialize-tooltip
+
+ let popup = new google.maps.InfoWindow({
+ content: ''
+ });
+ if (!this.tooltips) this.tooltips = [];
+ this.tooltips.push({
+ markerArgs: markerArgs,
+ popup: popup,
+ locationSettings: settings,
+ dsIndex: location.dsIndex
+ });
+
+ if (onClickListener) {
+ google.maps.event.addListener(polygon, 'click', function (event) {
+ if (settings.displayTooltip) {
+ if (!polygon.anchor) {
+ polygon.anchor = new google.maps.MVCObject();
+ }
+ polygon.anchor.set("position", event.latLng);
+ popup.open(this.map, polygon.anchor);
+ }
+ onClickListener();
+ });
+ }
return polygon;
}
/* eslint-disable no-undef */
diff --git a/ui/src/app/widget/lib/map-widget2.js b/ui/src/app/widget/lib/map-widget2.js
index 85e94b7183..42e9cdb463 100644
--- a/ui/src/app/widget/lib/map-widget2.js
+++ b/ui/src/app/widget/lib/map-widget2.js
@@ -233,7 +233,6 @@ export default class TbMapWidgetV2 {
}
update() {
-
var tbMap = this;
@@ -381,6 +380,17 @@ export default class TbMapWidgetV2 {
tbMap.ctx.actionsApi.handleWidgetAction($event, descriptors[0], entityId, entityName);
}
}
+ 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;
+ tbMap.ctx.actionsApi.handleWidgetAction($event, descriptors[0], entityId, entityName);
+ }
+ }
function updateLocation(location, data, dataMap) {
var locationChanged = false;
@@ -427,21 +437,6 @@ export default class TbMapWidgetV2 {
locationChanged = true;
}
}
-
-
- 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);
- tbMap.polygons.push(location.polygon);
- } 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.marker) {
updateLocationStyle(location, dataMap);
@@ -451,6 +446,25 @@ export default class TbMapWidgetV2 {
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);
+ } else if (polygonLatLngs.length > 0) {
+ let prevPolygonArr = tbMap.map.getPolygonLatLngs(location.polygon);
+ if (!prevPolygonArr || !arraysEqual(prevPolygonArr, polygonLatLngs)) {
+ tbMap.map.setPolygonLatLngs(location.polygon, polygonLatLngs);
+ }
+ }
+ }
+ }
+
function loadLocations(data, datasources) {
var bounds = tbMap.map.createBounds();
tbMap.locations = [];
@@ -459,7 +473,6 @@ export default class TbMapWidgetV2 {
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;
@@ -480,7 +493,6 @@ export default class TbMapWidgetV2 {
} else if (nameToCheck === tbMap.locationSettings.lngKeyName) {
lngIndex = i;
}
-
if (latIndex > -1 && lngIndex > -1) {
var location = {
latIndex: latIndex,
@@ -499,6 +511,7 @@ export default class TbMapWidgetV2 {
}
tbMap.locations.push(location);
updateLocation(location, data, dataMap);
+
if (location.polyline) {
tbMap.map.extendBounds(bounds, location.polyline);
} else if (location.marker) {
@@ -507,8 +520,28 @@ export default class TbMapWidgetV2 {
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);
+ tbMap.map.extendBounds(bounds, location.polygon);
+ }
+ });
+
tbMap.map.fitBounds(bounds);
}
@@ -532,10 +565,13 @@ export default class TbMapWidgetV2 {
for (var p = 0; p < tbMap.locations.length; p++) {
var location = tbMap.locations[p];
locationsChanged |= updateLocation(location, data, dataMap);
+ createUpdatePolygon(location, dataMap);
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) {
@@ -585,23 +621,30 @@ export default class TbMapWidgetV2 {
}
}
}
-
}
resize() {
if (this.map && this.map.inited()) {
- this.map.invalidateSize();
+ let map = this.map;
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]);
+ map.invalidateSize();
+ var bounds = map.createBounds();
+ if (this.markers && this.markers.length>0) {
+ this.markers.forEach(function (marker) {
+ map.extendBoundsWithMarker(bounds, marker);
+ });
}
- if (this.polylines) {
- for (var p = 0; p < this.polylines.length; p++) {
- this.map.extendBounds(bounds, this.polylines[p]);
- }
+ 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);
+ })
}
- this.map.fitBounds(bounds);
+ map.fitBounds(bounds);
}
}
}
@@ -638,6 +681,10 @@ export default class TbMapWidgetV2 {
name: 'widget-action.marker-click',
multiple: false
},
+ 'polygonClick': {
+ name: 'widget-action.polygon-click',
+ multiple: false
+ },
'tooltipAction': {
name: 'widget-action.tooltip-tag-action',
multiple: true
diff --git a/ui/src/app/widget/lib/openstreet-map.js b/ui/src/app/widget/lib/openstreet-map.js
index eea7e86490..33f9ae09e2 100644
--- a/ui/src/app/widget/lib/openstreet-map.js
+++ b/ui/src/app/widget/lib/openstreet-map.js
@@ -190,7 +190,7 @@ export default class TbOpenStreetMap {
this.map.removeLayer(polyline);
}
- createPolygon(latLangs, settings) {
+ createPolygon(latLangs, settings, location, onClickListener, markerArgs) {
let polygon = L.polygon(latLangs, {
fill: true,
fillColor: settings.polygonColor,
@@ -199,6 +199,13 @@ export default class TbOpenStreetMap {
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;
}
@@ -224,6 +231,7 @@ export default class TbOpenStreetMap {
setPolygonLatLngs(polygon, latLngs) {
polygon.setLatLngs(latLngs);
+ polygon.redraw();
}
fitBounds(bounds) {
@@ -272,7 +280,7 @@ export default class TbOpenStreetMap {
}
extendBounds(bounds, polyline) {
- if (polyline && polyline.getLatLngs()) {
+ if (polyline && polyline.getLatLngs() && polyline.getBounds()) {
bounds.extend(polyline.getBounds());
}
}
diff --git a/ui/src/app/widget/lib/tencent-map.js b/ui/src/app/widget/lib/tencent-map.js
index 28f9e98268..6ce387e46a 100644
--- a/ui/src/app/widget/lib/tencent-map.js
+++ b/ui/src/app/widget/lib/tencent-map.js
@@ -331,7 +331,7 @@ export default class TbTencentMap {
}
/* eslint-disable no-undef */
- createPolygon(latLangs, settings) {
+ createPolygon(latLangs, settings, location, onClickListener, markerArgs) {
let polygon = new qq.maps.Polygon({
map: this.map,
path: latLangs,
@@ -339,8 +339,31 @@ export default class TbTencentMap {
fillColor: settings.polygonColor,
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.displayTooltip) {
+ popup.setMap(this.map);
+ popup.setPosition(event.latLng);
+ popup.open();
+ }
+ onClickListener();
+ });
+ }
return polygon;
}
+
/* eslint-disable no-undef */
removePolygon (polygon) {
diff --git a/ui/src/app/widget/lib/widget-utils.js b/ui/src/app/widget/lib/widget-utils.js
index 190660c1b1..36bc6565e8 100644
--- a/ui/src/app/widget/lib/widget-utils.js
+++ b/ui/src/app/widget/lib/widget-utils.js
@@ -73,22 +73,24 @@ export function processPattern(pattern, datasources, dsIndex) {
export function fillPattern(pattern, replaceInfo, data) {
var text = angular.copy(pattern);
- 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);
- }
+ 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;
}
diff --git a/ui/webpack.config.prod.js b/ui/webpack.config.prod.js
index f7093e7273..446b48a848 100644
--- a/ui/webpack.config.prod.js
+++ b/ui/webpack.config.prod.js
@@ -96,7 +96,7 @@ module.exports = {
new CompressionPlugin({
asset: "[path].gz[query]",
algorithm: "gzip",
- test: /\.js$|\.css$|\.svg$|\.ttf$|\.woff$|\.woff2|\.eot$\.json$/,
+ test: /\.js$|\.css$|\.svg$|\.ttf$|\.woff$|\.woff2$|\.eot$|\.json$/,
threshold: 10240,
minRatio: 0.8
}),