aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--debug.xml22
-rw-r--r--src/org/traccar/database/DataManager.java8
-rw-r--r--src/org/traccar/web/DeviceServlet.java24
-rw-r--r--web/app/Application.js19
-rw-r--r--web/app/view/UserDevices.js4
-rw-r--r--web/app/view/UserDevicesController.js35
6 files changed, 98 insertions, 14 deletions
diff --git a/debug.xml b/debug.xml
index b5ff02981..5c1600bf1 100644
--- a/debug.xml
+++ b/debug.xml
@@ -101,7 +101,7 @@
address VARCHAR(512),
attributes VARCHAR(4096) NOT NULL,
FOREIGN KEY (deviceId) REFERENCES device (id) ON DELETE CASCADE);
-
+
CREATE INDEX position_deviceId_fixTime ON position (deviceId, fixTime);
CREATE TABLE server (
@@ -184,7 +184,7 @@
<entry key='database.updateUserPassword'>
UPDATE "user" SET hashedPassword = :hashedPassword, salt = :salt WHERE id = :id;
</entry>
-
+
<entry key='database.deleteUser'>
DELETE FROM "user" WHERE id = :id;
</entry>
@@ -192,33 +192,37 @@
<entry key='database.getPermissionsAll'>
SELECT userId, deviceId FROM user_device;
</entry>
-
+
<entry key='database.selectDevicesAll'>
SELECT * FROM device;
</entry>
-
+
<entry key='database.selectDevices'>
SELECT * FROM device d INNER JOIN user_device ud ON d.id = ud.deviceId WHERE ud.userId = :userId;
</entry>
-
+
<entry key='database.insertDevice'>
INSERT INTO device (name, uniqueId) VALUES (:name, :uniqueId);
</entry>
-
+
<entry key='database.updateDevice'>
UPDATE device SET name = :name, uniqueId = :uniqueId WHERE id = :id;
</entry>
-
+
<entry key='database.deleteDevice'>
DELETE FROM device WHERE id = :id;
</entry>
-
+
<entry key='database.linkDevice'>
INSERT INTO user_device (userId, deviceId) VALUES (:userId, :deviceId);
</entry>
+ <entry key='database.unlinkDevice'>
+ DELETE FROM user_device WHERE userId = :userId AND deviceId = :deviceId;
+ </entry>
+
<entry key='database.selectPositions'>
- SELECT * FROM position WHERE deviceId = :deviceId AND fixTime BETWEEN :from AND :to ORDER BY fixTime;
+ SELECT * FROM position WHERE deviceId = :deviceId AND fixTime BETWEEN :from AND :to ORDER BY fixTime;
</entry>
<entry key='database.insertPosition'>
diff --git a/src/org/traccar/database/DataManager.java b/src/org/traccar/database/DataManager.java
index e249a7591..af2dd559a 100644
--- a/src/org/traccar/database/DataManager.java
+++ b/src/org/traccar/database/DataManager.java
@@ -321,6 +321,14 @@ public class DataManager implements IdentityManager {
AsyncServlet.sessionRefreshUser(userId);
}
+ public void unlinkDevice(long userId, long deviceId) throws SQLException {
+ QueryBuilder.create(dataSource, getQuery("database.unlinkDevice"))
+ .setLong("userId", userId)
+ .setLong("deviceId", deviceId)
+ .executeUpdate();
+ AsyncServlet.sessionRefreshUser(userId);
+ }
+
public Collection<Position> getPositions(long userId, long deviceId, Date from, Date to) throws SQLException {
return QueryBuilder.create(dataSource, getQuery("database.selectPositions"))
.setLong("deviceId", deviceId)
diff --git a/src/org/traccar/web/DeviceServlet.java b/src/org/traccar/web/DeviceServlet.java
index 1ae94c1d0..8f983ad78 100644
--- a/src/org/traccar/web/DeviceServlet.java
+++ b/src/org/traccar/web/DeviceServlet.java
@@ -38,6 +38,12 @@ public class DeviceServlet extends BaseServlet {
case "/remove":
remove(req, resp);
break;
+ case "/link":
+ link(req, resp);
+ break;
+ case "/unlink":
+ unlink(req, resp);
+ break;
default:
return false;
}
@@ -87,4 +93,22 @@ public class DeviceServlet extends BaseServlet {
sendResponse(resp.getWriter(), true);
}
+ private void link(HttpServletRequest req, HttpServletResponse resp) throws Exception {
+ Context.getPermissionsManager().checkAdmin(getUserId(req));
+ Context.getDataManager().linkDevice(
+ Long.parseLong(req.getParameter("userId")),
+ Long.parseLong(req.getParameter("deviceId")));
+ Context.getPermissionsManager().refresh();
+ sendResponse(resp.getWriter(), true);
+ }
+
+ private void unlink(HttpServletRequest req, HttpServletResponse resp) throws Exception {
+ Context.getPermissionsManager().checkAdmin(getUserId(req));
+ Context.getDataManager().unlinkDevice(
+ Long.parseLong(req.getParameter("userId")),
+ Long.parseLong(req.getParameter("deviceId")));
+ Context.getPermissionsManager().refresh();
+ sendResponse(resp.getWriter(), true);
+ }
+
}
diff --git a/web/app/Application.js b/web/app/Application.js
index e710b7ea2..83ca9e860 100644
--- a/web/app/Application.js
+++ b/web/app/Application.js
@@ -76,5 +76,24 @@ Ext.define('Traccar.Application', {
getPreference: function (key, defaultValue) {
return this.getUser().get(key) || this.getServer().get(key) || defaultValue;
+ },
+
+ getErrorHandler: function (scope, handler) {
+ return function (options, success, response) {
+ var result;
+ if (success) {
+ result = Ext.decode(response.responseText);
+ if (!result.success) {
+ Ext.Msg.alert(Strings.errorTitle, result.error);
+ }
+ handler.call(scope, options, success, response);
+ } else {
+ if (response.statusText) {
+ Ext.Msg.alert(Strings.errorTitle, response.statusText);
+ } else {
+ Ext.Msg.alert(Strings.errorTitle, response.status.toString()); // TODO: text message
+ }
+ }
+ }
}
});
diff --git a/web/app/view/UserDevices.js b/web/app/view/UserDevices.js
index df03bca84..f9ab48266 100644
--- a/web/app/view/UserDevices.js
+++ b/web/app/view/UserDevices.js
@@ -32,7 +32,8 @@ Ext.define('Traccar.view.UserDevices', {
},
listeners: {
- selectionchange: 'onSelectionChange'
+ beforedeselect: 'onBeforeDeselect',
+ beforeselect: 'onBeforeSelect'
},
columns: [{
@@ -43,4 +44,3 @@ Ext.define('Traccar.view.UserDevices', {
dataIndex: 'uniqueId', flex: 1
}]
});
-32 \ No newline at end of file
diff --git a/web/app/view/UserDevicesController.js b/web/app/view/UserDevicesController.js
index 20fb47f85..a50ab8c80 100644
--- a/web/app/view/UserDevicesController.js
+++ b/web/app/view/UserDevicesController.js
@@ -19,6 +19,7 @@ Ext.define('Traccar.view.UserDevicesController', {
alias: 'controller.userDevices',
init: function () {
+ this.userId = this.getView().user.getData().id;
this.getView().getStore().load({
scope: this,
callback: function (records, operation, success) {
@@ -26,7 +27,7 @@ Ext.define('Traccar.view.UserDevicesController', {
userStore.load({
params: {
- userId: this.getView().user.getData().id
+ userId: this.userId
},
scope: this,
callback: function (records, operation, success) {
@@ -43,7 +44,35 @@ Ext.define('Traccar.view.UserDevicesController', {
});
},
- onSelectionChange: function (selected) {
- console.log(selected); // TODO
+ onBeforeSelect: function (object, record, index) {
+ Ext.Ajax.request({
+ scope: this,
+ url: '/api/device/link',
+ params: {
+ userId: this.userId,
+ deviceId: record.getData().id
+ },
+ callback: Traccar.app.getErrorHandler(this, function (options, success, response) {
+ if (!success) {
+ // TODO deselect again
+ }
+ })
+ });
+ },
+
+ onBeforeDeselect: function (object, record, index) {
+ Ext.Ajax.request({
+ scope: this,
+ url: '/api/device/unlink',
+ params: {
+ userId: this.userId,
+ deviceId: record.getData().id
+ },
+ callback: Traccar.app.getErrorHandler(this, function (options, success, response) {
+ if (!success) {
+ // TODO select again
+ }
+ })
+ });
}
});