aboutsummaryrefslogtreecommitdiff
path: root/web
diff options
context:
space:
mode:
Diffstat (limited to 'web')
-rw-r--r--web/app.css48
-rw-r--r--web/app/Style.js10
-rw-r--r--web/app/controller/Root.js29
-rw-r--r--web/app/model/Device.js6
-rw-r--r--web/app/view/Devices.js29
-rw-r--r--web/app/view/Login.js2
-rw-r--r--web/app/view/Main.js5
-rw-r--r--web/app/view/Map.js32
-rw-r--r--web/app/view/MapController.js79
-rw-r--r--web/blank.html0
-rw-r--r--web/debug.html7
-rw-r--r--web/l10n/en.json2
-rw-r--r--web/l10n/hu.json1
-rw-r--r--web/l10n/no.json79
-rw-r--r--web/l10n/ro.json80
-rw-r--r--web/l10n/si.json16
-rw-r--r--web/locale.js2
-rw-r--r--web/release.html7
-rw-r--r--web/tests.html11
-rw-r--r--web/tests/010_sanity.t.js2
-rw-r--r--web/tests/index.js6
21 files changed, 394 insertions, 59 deletions
diff --git a/web/app.css b/web/app.css
index 897fd0cbc..eb0fdf136 100644
--- a/web/app.css
+++ b/web/app.css
@@ -1,3 +1,13 @@
+.status-color-online {
+ background-color: rgba(77, 250, 144, 0.3);
+}
+.status-color-unknown {
+ background-color: rgba(250, 190, 77, 0.3);
+}
+.status-color-offline {
+ background-color: rgba(255, 84, 104, 0.3);
+}
+
.state-indicator {
position: absolute;
top: -999em;
@@ -12,8 +22,44 @@
}
#attribution {
- position: fixed;
+ position: absolute;
bottom: 10px;
right: 15px;
font-size: x-small;
}
+
+#spinner {
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ height: 60px;
+ width: 60px;
+ margin-top: -30px;
+ margin-left: -30px;
+ -webkit-animation: rotation .8s infinite linear;
+ -moz-animation: rotation .8s infinite linear;
+ -o-animation: rotation .8s infinite linear;
+ animation: rotation .8s infinite linear;
+ border-left: 6px solid rgba(56, 146, 212, .15);
+ border-right: 6px solid rgba(56, 146, 212, .15);
+ border-bottom: 6px solid rgba(56, 146, 212, .15);
+ border-top: 6px solid rgba(56, 146, 212, .8);
+ border-radius: 100%;
+}
+
+@-webkit-keyframes rotation {
+ from { -webkit-transform: rotate(0deg); }
+ to { -webkit-transform: rotate(359deg); }
+}
+@-moz-keyframes rotation {
+ from { -moz-transform: rotate(0deg); }
+ to { -moz-transform: rotate(359deg); }
+}
+@-o-keyframes rotation {
+ from { -o-transform: rotate(0deg); }
+ to { -o-transform: rotate(359deg); }
+}
+@keyframes rotation {
+ from { transform: rotate(0deg); }
+ to { transform: rotate(359deg); }
+}
diff --git a/web/app/Style.js b/web/app/Style.js
index 58ab059ad..5202a3fb2 100644
--- a/web/app/Style.js
+++ b/web/app/Style.js
@@ -48,13 +48,13 @@ Ext.define('Traccar.Style', {
mapTextOffset: 10,
mapTextFont: 'bold 12px sans-serif',
- mapColorOnline: '#4DFA90',
- mapColorUnknown: '#FABE4D',
- mapColorOffline: '#FF5468',
+ mapColorOnline: 'rgba(77, 250, 144, 1.0)',
+ mapColorUnknown: 'rgba(250, 190, 77, 1.0)',
+ mapColorOffline: 'rgba(255, 84, 104, 1.0)',
mapColorReport: 'rgba(21, 127, 204, 1.0)',
- mapRadiusNormal: 10,
- mapRadiusSelected: 15,
+ mapRadiusNormal: 9,
+ mapRadiusSelected: 14,
mapMaxZoom: 19,
mapDelay: 500
diff --git a/web/app/controller/Root.js b/web/app/controller/Root.js
index 79827b8a6..733055cdf 100644
--- a/web/app/controller/Root.js
+++ b/web/app/controller/Root.js
@@ -40,6 +40,7 @@ Ext.define('Traccar.controller.Root', {
onServerReturn: function (options, success, response) {
var result;
+ Ext.get('spinner').remove();
if (Traccar.ErrorManager.check(success, response)) {
result = Ext.decode(response.responseText);
if (result.success) {
@@ -96,19 +97,35 @@ Ext.define('Traccar.controller.Root', {
first: first
},
callback: Traccar.app.getErrorHandler(this, function (options, success, response) {
- var i, store, data, position;
+ var i, deviceStore, positionStore, data, devices, positions, device, position;
if (success) {
- store = Ext.getStore('LatestPositions');
+ deviceStore = Ext.getStore('Devices');
+ positionStore = Ext.getStore('LatestPositions');
data = Ext.decode(response.responseText).data;
+ devices = data.devices;
+ positions = data.positions;
- for (i = 0; i < data.length; i++) {
- position = store.findRecord('deviceId', data[i].deviceId, 0, false, false, true);
+ for (i = 0; i < devices.length; i++) {
+ device = deviceStore.findRecord('id', devices[i].id, 0, false, false, true);
+ if (device) {
+ device.set({
+ status: devices[i].status,
+ lastUpdate: devices[i].lastUpdate
+ }, {
+ dirty: false
+ });
+ }
+ }
+
+ for (i = 0; i < positions.length; i++) {
+ position = positionStore.findRecord('deviceId', positions[i].deviceId, 0, false, false, true);
if (position) {
- position.set(data[i]);
+ position.set(positions[i]);
} else {
- store.add(Ext.create('Traccar.model.Position', data[i]));
+ positionStore.add(Ext.create('Traccar.model.Position', positions[i]));
}
}
+
this.asyncUpdate(false);
}
})
diff --git a/web/app/model/Device.js b/web/app/model/Device.js
index e9ed1f680..983e3e62e 100644
--- a/web/app/model/Device.js
+++ b/web/app/model/Device.js
@@ -27,5 +27,11 @@ Ext.define('Traccar.model.Device', {
}, {
name: 'uniqueId',
type: 'string'
+ }, {
+ name: 'status',
+ type: 'string'
+ }, {
+ name: 'lastUpdate',
+ type: 'date'
}]
});
diff --git a/web/app/view/Devices.js b/web/app/view/Devices.js
index 9dcd76a55..21bea6980 100644
--- a/web/app/view/Devices.js
+++ b/web/app/view/Devices.js
@@ -42,6 +42,12 @@ Ext.define('Traccar.view.Devices', {
}, {
xtype: 'tbfill'
}, {
+ id:'deviceFollowButton',
+ glyph: 'xf05b@FontAwesome',
+ tooltip: Strings.deviceFollow,
+ tooltipType: 'title',
+ enableToggle: true
+ }, {
xtype: 'settingsMenu'
}]
},
@@ -52,10 +58,27 @@ Ext.define('Traccar.view.Devices', {
columns: [{
text: Strings.deviceName,
- dataIndex: 'name', flex: 1
+ dataIndex: 'name',
+ flex: 1
}, {
- text: Strings.deviceIdentifier,
- dataIndex: 'uniqueId', flex: 1
+ text: Strings.deviceLastUpdate,
+ dataIndex: 'lastUpdate',
+ flex: 1,
+ renderer: function (value, metaData, record) {
+ var status = record.get('status');
+ switch (status) {
+ case 'online':
+ metaData.tdCls = 'status-color-online';
+ break;
+ case 'offline':
+ metaData.tdCls = 'status-color-offline';
+ break;
+ default:
+ metaData.tdCls = 'status-color-unknown';
+ break;
+ }
+ return Ext.Date.format(value, Traccar.Style.dateTimeFormat);
+ }
}]
});
diff --git a/web/app/view/Login.js b/web/app/view/Login.js
index 14a3fa41f..9c8187ed6 100644
--- a/web/app/view/Login.js
+++ b/web/app/view/Login.js
@@ -35,7 +35,7 @@ Ext.define('Traccar.view.Login', {
autoEl: {
tag: 'form',
method: 'GET',
- action: 'favicon.ico',
+ action: 'blank.html',
target: 'submitTarget'
},
diff --git a/web/app/view/Main.js b/web/app/view/Main.js
index 3bd7256f7..6b4daf138 100644
--- a/web/app/view/Main.js
+++ b/web/app/view/Main.js
@@ -54,7 +54,10 @@ Ext.define('Traccar.view.Main', {
}, {
region: 'south',
xtype: 'reportView',
- height: Traccar.Style.reportHeight
+ height: Traccar.Style.reportHeight,
+ collapsed: true,
+ titleCollapse: true,
+ floatable: false
}, {
region: 'center',
xtype: 'mapView',
diff --git a/web/app/view/Map.js b/web/app/view/Map.js
index 7d81699a3..b8c0d8dc5 100644
--- a/web/app/view/Map.js
+++ b/web/app/view/Map.js
@@ -35,13 +35,21 @@ Ext.define('Traccar.view.Map', {
return this.mapView;
},
- getVectorSource: function () {
- return this.vectorSource;
+ getLatestSource: function () {
+ return this.latestSource;
+ },
+
+ getRouteSource: function () {
+ return this.routeSource;
+ },
+
+ getReportSource: function () {
+ return this.reportSource;
},
listeners: {
afterrender: function () {
- var user, server, layer, type, bingKey, vectorLayer, lat, lon, zoom, target;
+ var user, server, layer, type, bingKey, latestLayer, routeLayer, reportLayer, lat, lon, zoom, target;
user = Traccar.app.getUser();
server = Traccar.app.getServer();
@@ -78,9 +86,19 @@ Ext.define('Traccar.view.Map', {
});
}
- this.vectorSource = new ol.source.Vector({});
- vectorLayer = new ol.layer.Vector({
- source: this.vectorSource
+ this.latestSource = new ol.source.Vector({});
+ latestLayer = new ol.layer.Vector({
+ source: this.latestSource
+ });
+
+ this.routeSource = new ol.source.Vector({});
+ routeLayer = new ol.layer.Vector({
+ source: this.routeSource
+ });
+
+ this.reportSource = new ol.source.Vector({});
+ reportLayer = new ol.layer.Vector({
+ source: this.reportSource
});
lat = user.get('latitude') || server.get('latitude') || Traccar.Style.mapDefaultLat;
@@ -95,7 +113,7 @@ Ext.define('Traccar.view.Map', {
this.map = new ol.Map({
target: this.body.dom.id,
- layers: [layer, vectorLayer],
+ layers: [layer, routeLayer, reportLayer, latestLayer],
view: this.mapView
});
diff --git a/web/app/view/MapController.js b/web/app/view/MapController.js
index c153ebd45..e4ce53b57 100644
--- a/web/app/view/MapController.js
+++ b/web/app/view/MapController.js
@@ -27,6 +27,10 @@ Ext.define('Traccar.view.MapController', {
}
},
store: {
+ '#Devices': {
+ add: 'updateDevice',
+ update: 'updateDevice'
+ },
'#LatestPositions': {
add: 'updateLatest',
update: 'updateLatest'
@@ -49,6 +53,54 @@ Ext.define('Traccar.view.MapController', {
this.reportMarkers = {};
},
+ getDeviceColor: function (device) {
+ switch (device.get('status')) {
+ case 'online':
+ return Traccar.Style.mapColorOnline;
+ case 'offline':
+ return Traccar.Style.mapColorOffline;
+ default:
+ return Traccar.Style.mapColorUnknown;
+ }
+ },
+
+ changeMarkerColor: function (style, color) {
+ return new ol.style.Style({
+ image: new ol.style.Arrow({
+ radius: style.getImage().getRadius(),
+ fill: new ol.style.Fill({
+ color: color
+ }),
+ stroke: style.getImage().getStroke(),
+ rotation: style.getImage().getRotation()
+ }),
+ text: style.getText()
+ });
+ },
+
+ updateDevice: function (store, data) {
+ var i, device, deviceId;
+
+ if (!Ext.isArray(data)) {
+ data = [data];
+ }
+
+ for (i = 0; i < data.length; i++) {
+ device = data[i];
+ deviceId = device.get('id');
+
+ if (deviceId in this.latestMarkers) {
+ marker = this.latestMarkers[deviceId];
+ marker.setStyle(
+ this.changeMarkerColor(marker.getStyle(), this.getDeviceColor(device)));
+ }
+ }
+ },
+
+ followSelected: function () {
+ return Ext.getCmp('deviceFollowButton') && Ext.getCmp('deviceFollowButton').pressed;
+ },
+
updateLatest: function (store, data) {
var i, position, geometry, device, deviceId, marker, style;
@@ -73,14 +125,18 @@ Ext.define('Traccar.view.MapController', {
marker = new ol.Feature(geometry);
marker.set('record', device);
this.latestMarkers[deviceId] = marker;
- this.getView().getVectorSource().addFeature(marker);
+ this.getView().getLatestSource().addFeature(marker);
- style = this.getLatestMarker();
+ style = this.getLatestMarker(this.getDeviceColor(device));
style.getText().setText(device.get('name'));
marker.setStyle(style);
}
marker.getStyle().getImage().setRotation(position.get('course') * Math.PI / 180);
+
+ if (marker === this.selectedMarker && this.followSelected()) {
+ this.getView().getMapView().setCenter(marker.getGeometry().getCoordinates());
+ }
}
},
@@ -93,7 +149,7 @@ Ext.define('Traccar.view.MapController', {
geometry: new ol.geom.LineString([])
});
this.reportRoute.setStyle(this.getRouteStyle());
- this.getView().getVectorSource().addFeature(this.reportRoute);
+ this.getView().getRouteSource().addFeature(this.reportRoute);
for (i = 0; i < data.length; i++) {
position = data[i];
@@ -107,12 +163,12 @@ Ext.define('Traccar.view.MapController', {
marker = new ol.Feature(geometry);
marker.set('record', position);
this.reportMarkers[position.get('id')] = marker;
- this.getView().getVectorSource().addFeature(marker);
+ this.getView().getReportSource().addFeature(marker);
style = this.getReportMarker();
style.getImage().setRotation(position.get('course') * Math.PI / 180);
- style.getText().setText(
- Ext.Date.format(position.get('fixTime'), Traccar.Style.dateTimeFormat));
+ /*style.getText().setText(
+ Ext.Date.format(position.get('fixTime'), Traccar.Style.dateTimeFormat));*/
marker.setStyle(style);
@@ -121,18 +177,17 @@ Ext.define('Traccar.view.MapController', {
},
clearReport: function (store) {
- var vectorSource, key;
- vectorSource = this.getView().getVectorSource();
+ var key;
if (this.reportRoute) {
- vectorSource.removeFeature(this.reportRoute);
+ this.getView().getRouteSource().removeFeature(this.reportRoute);
this.reportRoute = null;
}
if (this.reportMarkers) {
for (key in this.reportMarkers) {
if (this.reportMarkers.hasOwnProperty(key)) {
- vectorSource.removeFeature(this.reportMarkers[key]);
+ this.getView().getReportSource().removeFeature(this.reportMarkers[key]);
}
}
this.reportMarkers = {};
@@ -175,9 +230,9 @@ Ext.define('Traccar.view.MapController', {
});
},
- getLatestMarker: function () {
+ getLatestMarker: function (color) {
return this.getMarkerStyle(
- Traccar.Style.mapRadiusNormal, Traccar.Style.mapColorUnknown);
+ Traccar.Style.mapRadiusNormal, color);
},
getReportMarker: function () {
diff --git a/web/blank.html b/web/blank.html
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/web/blank.html
diff --git a/web/debug.html b/web/debug.html
index de63d32a2..c4340af97 100644
--- a/web/debug.html
+++ b/web/debug.html
@@ -8,14 +8,15 @@
<link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/ol3/3.11.1/ol.css">
<link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/font-awesome/4.4.0/css/font-awesome.min.css">
<link rel="stylesheet" href="app.css">
+</head>
+<body>
+<div id="spinner"></div>
+<div id="attribution">Powered by <a href="https://www.traccar.org/">Traccar GPS Tracking System</a></div>
<script src="//cdnjs.cloudflare.com/ajax/libs/extjs/6.0.0/ext-all-debug.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/extjs/6.0.0/classic/theme-neptune/theme-neptune.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/ol3/3.11.1/ol-debug.js"></script>
<script src="arrowstyle.js"></script>
<script src="locale.js"></script>
<script src="app.js"></script>
-</head>
-<body>
-<div id="attribution">Powered by <a href="https://www.traccar.org/">Traccar GPS Tracking System</a></div>
</body>
</html>
diff --git a/web/l10n/en.json b/web/l10n/en.json
index a3489fbe1..d70e97a07 100644
--- a/web/l10n/en.json
+++ b/web/l10n/en.json
@@ -31,7 +31,9 @@
"deviceTitle": "Devices",
"deviceName": "Name",
"deviceIdentifier": "Identifier",
+ "deviceLastUpdate": "Last Update",
"deviceCommand": "Command",
+ "deviceFollow": "Follow",
"settingsTitle": "Settings",
"settingsUser": "Account",
"settingsServer": "Server",
diff --git a/web/l10n/hu.json b/web/l10n/hu.json
index 8fb48a830..56ba28ae9 100644
--- a/web/l10n/hu.json
+++ b/web/l10n/hu.json
@@ -31,6 +31,7 @@
"deviceTitle": "Eszközök",
"deviceName": "Eszköznév",
"deviceIdentifier": "Azonosító",
+ "deviceLastUpdate": "Utolsó frissítés",
"deviceCommand": "Parancs",
"settingsTitle": "Beállítások",
"settingsUser": "Fiók",
diff --git a/web/l10n/no.json b/web/l10n/no.json
new file mode 100644
index 000000000..8a53e1213
--- /dev/null
+++ b/web/l10n/no.json
@@ -0,0 +1,79 @@
+{
+ "sharedLoading": "Laster...",
+ "sharedSave": "Lagre",
+ "sharedCancel": "Avbryte",
+ "sharedAdd": "Legg til",
+ "sharedEdit": "Endre",
+ "sharedRemove": "Fjerne",
+ "sharedRemoveConfirm": "Fjerne element?",
+ "sharedKm": "km",
+ "sharedMi": "mi",
+ "sharedKmh": "km/t",
+ "sharedMph": "mph",
+ "sharedHour": "Time",
+ "sharedMinute": "Minutt",
+ "sharedSecond": "Sekund",
+ "errorTitle": "Feil",
+ "errorUnknown": "Ukjent feil",
+ "errorConnection": "Forbindelse feilet",
+ "userName": "Navn",
+ "userEmail": "Epost",
+ "userPassword": "Passord",
+ "userAdmin": "Admin",
+ "loginTitle": "Logg inn",
+ "loginLanguage": "Språk",
+ "loginRegister": "Registrere",
+ "loginLogin": "Logg inn",
+ "loginFailed": "Feil epost eller passord",
+ "loginCreated": "Ny bruker har blitt registrert",
+ "loginLogout": "Logg ut",
+ "deviceDialog": "Enhet",
+ "deviceTitle": "Enheter",
+ "deviceName": "Navn",
+ "deviceIdentifier": "Identitet",
+ "deviceCommand": "Kommando",
+ "settingsTitle": "Innstillinger",
+ "settingsUser": "Konto",
+ "settingsServer": "Server",
+ "settingsUsers": "Brukere",
+ "settingsDistanceUnit": "Avstand",
+ "settingsSpeedUnit": "Hastighet",
+ "reportTitle": "Rapporter",
+ "reportDevice": "Enhet",
+ "reportFrom": "Fra",
+ "reportTo": "Til",
+ "reportShow": "Vis",
+ "reportClear": "Nullstille",
+ "positionFixTime": "Tid",
+ "positionValid": "Gyldig",
+ "positionLatitude": "Latitude",
+ "positionLongitude": "Longitude",
+ "positionAltitude": "Altitude",
+ "positionSpeed": "Hastighet",
+ "positionCourse": "Retning",
+ "positionAddress": "Adresse",
+ "positionProtocol": "Protokoll",
+ "serverTitle": "Server Instillinger",
+ "serverZoom": "Zoom",
+ "serverRegistration": "Registere",
+ "mapTitle": "Kart",
+ "mapLayer": "Kart Lag",
+ "mapCustom": "Egendefinert Kart",
+ "mapOsm": "Open Street Kart",
+ "mapBingKey": "Bing Maps Nøkkel",
+ "mapBingRoad": "Bing Maps Vei",
+ "mapBingAerial": "Bing Maps Fly",
+ "stateTitle": "Stat",
+ "stateName": "Egenskap",
+ "stateValue": "Verdi",
+ "commandTitle": "Kommando",
+ "commandSend": "Sende",
+ "commandType": "Type",
+ "commandSent": "Kommando har blitt sendt",
+ "commandPositionPeriodic": "Periodisk Rapportering",
+ "commandPositionStop": "Stoppe Rapportering",
+ "commandEngineStop": "Motor Stop",
+ "commandEngineResume": "Motor Restarte",
+ "commandFrequency": "Frekvens",
+ "commandUnit": "Enhet"
+} \ No newline at end of file
diff --git a/web/l10n/ro.json b/web/l10n/ro.json
new file mode 100644
index 000000000..ba1d4b0a6
--- /dev/null
+++ b/web/l10n/ro.json
@@ -0,0 +1,80 @@
+{
+ "sharedLoading": "Încărcare...",
+ "sharedSave": "Salvare",
+ "sharedCancel": "Anulare",
+ "sharedAdd": "Adăuga",
+ "sharedEdit": "Edita",
+ "sharedRemove": "Elimina",
+ "sharedRemoveConfirm": "Eliminati?",
+ "sharedKm": "km",
+ "sharedMi": "mi",
+ "sharedKmh": "km/h",
+ "sharedMph": "mph",
+ "sharedHour": "Oră",
+ "sharedMinute": "Minut",
+ "sharedSecond": "Secundă",
+ "errorTitle": "Eroare",
+ "errorUnknown": "Eroare necunoscută",
+ "errorConnection": "Eroare de conexiune",
+ "userName": "Nume",
+ "userEmail": "Email",
+ "userPassword": "Parolă",
+ "userAdmin": "Admin",
+ "loginTitle": "Intră in cont",
+ "loginLanguage": "Limbă",
+ "loginRegister": "Înregistrare",
+ "loginLogin": "Intră in cont",
+ "loginFailed": "E-mail sau parolă incorectă",
+ "loginCreated": "Nou utilizator a fost înregistrată",
+ "loginLogout": "Deconectare",
+ "deviceDialog": "Dispozitiv",
+ "deviceTitle": "Dispozitive",
+ "deviceName": "Nume",
+ "deviceIdentifier": "Identifier",
+ "deviceLastUpdate": "Ultima modificare",
+ "deviceCommand": "Comandă",
+ "settingsTitle": "Setări",
+ "settingsUser": "Cont",
+ "settingsServer": "Server",
+ "settingsUsers": "Utilizatori",
+ "settingsDistanceUnit": "Distanţă",
+ "settingsSpeedUnit": "Viteză",
+ "reportTitle": "Rapoarte",
+ "reportDevice": "Dispozitiv",
+ "reportFrom": "De la ",
+ "reportTo": "Până la",
+ "reportShow": "Arată",
+ "reportClear": "șterge",
+ "positionFixTime": "Timp",
+ "positionValid": "Valabil",
+ "positionLatitude": "Latitudine",
+ "positionLongitude": "Longitudine",
+ "positionAltitude": "Altitudine",
+ "positionSpeed": "Viteză",
+ "positionCourse": "Curs",
+ "positionAddress": "Adresă",
+ "positionProtocol": "Protocol",
+ "serverTitle": "Setări server",
+ "serverZoom": "Zoom",
+ "serverRegistration": "Înregistrare",
+ "mapTitle": "Hartă",
+ "mapLayer": "Stratul de Hartă",
+ "mapCustom": "Hartă Editare",
+ "mapOsm": "Open Street Map",
+ "mapBingKey": "Bing Maps Key",
+ "mapBingRoad": "Bing Maps Road",
+ "mapBingAerial": "Bing Maps aeriene",
+ "stateTitle": "Stare",
+ "stateName": "Proprietate",
+ "stateValue": "Valoare",
+ "commandTitle": "Comandă",
+ "commandSend": "Trimite",
+ "commandType": "Tip",
+ "commandSent": "Comandă a fost trimis",
+ "commandPositionPeriodic": "Raportarea Periodică",
+ "commandPositionStop": "Oprire de raportare",
+ "commandEngineStop": "Oprire Motor",
+ "commandEngineResume": "Motor Continuă",
+ "commandFrequency": "Frecvenţă",
+ "commandUnit": "Unitate"
+} \ No newline at end of file
diff --git a/web/l10n/si.json b/web/l10n/si.json
index 8e565423b..db6381586 100644
--- a/web/l10n/si.json
+++ b/web/l10n/si.json
@@ -1,5 +1,5 @@
{
- "sharedLoading": "පූරණය ...",
+ "sharedLoading": "පූරණය කරමින් ...",
"sharedSave": "සුරකින්න",
"sharedCancel": "අවලංගු කරන්න",
"sharedAdd": "එක් කරන්න",
@@ -13,19 +13,19 @@
"sharedHour": "පැය",
"sharedMinute": "මිනිත්තු",
"sharedSecond": "තත්පර",
- "errorTitle": "දෝෂයක්",
- "errorUnknown": "නොදන්නා දෝෂයක්",
- "errorConnection": "සම්බන්ධතා දෝෂයක්",
+ "errorTitle": "දෝෂයක් ",
+ "errorUnknown": "නොදන්නා දෝෂයක් !",
+ "errorConnection": "සම්බන්ධතා දෝෂයක් !",
"userName": "නම",
"userEmail": "විද්යුත් තැපෑල",
"userPassword": "මුරපදය",
"userAdmin": "පරිපාලක",
- "loginTitle": "පිවිසුම",
+ "loginTitle": "පිවිසුම් ගිණුම",
"loginLanguage": "භාෂාව",
"loginRegister": "ලියාපදිංචි කරන්න",
"loginLogin": "පිවිසුම",
- "loginFailed": "ඊ-මේල් ලිපිනය හෝ මුරපදය වැරදිය",
- "loginCreated": "නව පරිශීලක ලියාපදිංචි කරන ලදි",
+ "loginFailed": "ඊ-මේල් ලිපිනය හෝ මුරපදය වැරදිය !",
+ "loginCreated": "නව පරිශීලක ලියාපදිංචි කරන ලදි !",
"loginLogout": "ඉවත්වන්න",
"deviceDialog": "උපාංගය",
"deviceTitle": "උපාංග",
@@ -69,7 +69,7 @@
"commandTitle": "විධානය",
"commandSend": "යවන්න",
"commandType": "වර්ගය",
- "commandSent": "අණ යවා ඇත",
+ "commandSent": "විධානය යවා ඇත",
"commandPositionPeriodic": "ආවර්තිතව වාර්තා කරන්න",
"commandPositionStop": "වාර්තා කිරීම නවත්වන්න",
"commandEngineStop": "එන්ජිම නවත්වන්න",
diff --git a/web/locale.js b/web/locale.js
index a5acb0ad3..a4bc9918d 100644
--- a/web/locale.js
+++ b/web/locale.js
@@ -33,9 +33,11 @@ Locale.languages = {
'hu': { name: 'Magyar', code: 'hu' },
'lt': { name: 'Lietuvių', code: 'lt' },
'nl': { name: 'Nederlands', code: 'nl' },
+ 'no': { name: 'Norsk', code: 'no_NB' },
'pl': { name: 'Polski', code: 'pl' },
'pt': { name: 'Português', code: 'pt' },
'pt_BR': { name: 'Português (Brasil)', code: 'pt_BR' },
+ 'ro': { name: 'Română', code: 'ro' },
'ru': { name: 'Русский', code: 'ru' },
'si': { name: 'සිංහල', code: 'en' },
'sk': { name: 'Slovenčina', code: 'sk' },
diff --git a/web/release.html b/web/release.html
index 27200b142..100849130 100644
--- a/web/release.html
+++ b/web/release.html
@@ -8,6 +8,10 @@
<link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/ol3/3.11.1/ol.min.css">
<link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/font-awesome/4.4.0/css/font-awesome.min.css">
<link rel="stylesheet" href="app.css">
+</head>
+<body>
+<div id="spinner"></div>
+<div id="attribution">Powered by <a href="https://www.traccar.org/">Traccar GPS Tracking System</a></div>
<script src="//cdnjs.cloudflare.com/ajax/libs/extjs/6.0.0/ext-all.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/extjs/6.0.0/classic/theme-neptune/theme-neptune.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/ol3/3.11.1/ol-debug.min.js"></script>
@@ -16,8 +20,5 @@
<script type="text/javascript">
Ext.Loader.loadScript('app.min.js');
</script>
-</head>
-<body>
-<div id="attribution">Powered by <a href="https://www.traccar.org/">Traccar GPS Tracking System</a></div>
</body>
</html>
diff --git a/web/tests.html b/web/tests.html
index 2e89e5e58..5df01347d 100644
--- a/web/tests.html
+++ b/web/tests.html
@@ -1,11 +1,12 @@
<!DOCTYPE html>
<html>
<head>
-<link rel="stylesheet" type="text/css" href="//cdn.sencha.com/ext/gpl/5.1.0/packages/ext-theme-crisp/build/resources/ext-theme-crisp-all.css" />
-<link rel="stylesheet" type="text/css" href="//cdn.traccar.org/siesta/siesta-3.1.0-lite/resources/css/siesta-all.css">
-<script type="text/javascript" src="//cdn.sencha.com/ext/gpl/5.1.0/build/ext-all.js"></script>
-<script type="text/javascript" src="//cdn.traccar.org/siesta/siesta-3.1.0-lite/siesta-all.js"></script>
-<script type="text/javascript" src="tests/index.js"></script>
+<link rel="stylesheet" type="text/css" href="http://bryntum.com/examples/extjs-6.0.1/build/classic/theme-triton/resources/theme-triton-all.css">
+<link rel="stylesheet" type="text/css" href="//cdn.traccar.org/siesta/siesta-4.0.0-lite/resources/css/siesta-all.css">
+<script src="http://bryntum.com/examples/extjs-6.0.1/build/classic/theme-triton/theme-triton.js" type="text/javascript"></script>
+<script src="http://bryntum.com/examples/extjs-6.0.1/build/ext-all.js" type="text/javascript"></script>
+<script src="//cdn.traccar.org/siesta/siesta-4.0.0-lite/siesta-all.js"></script>
+<script src="tests/index.js"></script>
</head>
<body>
</body>
diff --git a/web/tests/010_sanity.t.js b/web/tests/010_sanity.t.js
index b2773ee19..a7c732c20 100644
--- a/web/tests/010_sanity.t.js
+++ b/web/tests/010_sanity.t.js
@@ -8,7 +8,7 @@ StartTest(function (t) {
t.ok(Traccar.Application, 'Traccar.Application is defined');
t.ok(Strings, 'Strings are defined');
- t.ok(Traccar.Styles, 'Traccar.Styles are defined');
+ t.ok(Traccar.Style, 'Traccar.Style are defined');
t.done();
});
diff --git a/web/tests/index.js b/web/tests/index.js
index a75d6e4df..8e502c269 100644
--- a/web/tests/index.js
+++ b/web/tests/index.js
@@ -1,6 +1,6 @@
-var Harness = Siesta.Harness.Browser.ExtJS;
+var harness = new Siesta.Harness.Browser.ExtJS();
-Harness.configure({
+harness.configure({
title: 'Traccar Test Suite',
preload: [
'//cdnjs.cloudflare.com/ajax/libs/extjs/6.0.0/ext-all.js',
@@ -9,6 +9,6 @@ Harness.configure({
]
});
-Harness.start(
+harness.start(
'tests/010_sanity.t.js'
);