From 7032c42fb017582f1343128466b8df51c155f78d Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Wed, 2 Jan 2013 14:44:52 +1300 Subject: Finished devices panel --- src/main/java/org/traccar/web/client/Style.java | 4 + src/main/java/org/traccar/web/client/Traccar.java | 120 +++++++++--------- .../web/client/controller/ArchiveController.java | 14 +++ .../web/client/controller/DeviceController.java | 94 ++++++++++++++ .../web/client/controller/LoginController.java | 84 +++++++++++++ .../web/client/controller/MapController.java | 14 +++ .../web/client/controller/PanelController.java | 9 ++ .../web/client/database/BaseAsyncCallback.java | 19 +++ .../web/client/database/DatabaseService.java | 6 + .../web/client/database/DatabaseServiceAsync.java | 6 + .../web/client/database/GlobalDatabaseService.java | 13 -- .../web/client/i18n/ApplicationConstants.java | 14 ++- .../traccar/web/client/login/LoginController.java | 87 ------------- .../org/traccar/web/client/login/LoginDialog.java | 81 ------------ .../org/traccar/web/client/view/DeviceDialog.java | 87 +++++++++++++ .../org/traccar/web/client/view/DevicePanel.java | 140 ++++++++++++++------- .../org/traccar/web/client/view/LoginDialog.java | 82 ++++++++++++ .../java/org/traccar/web/client/view/MapPanel.java | 10 +- .../web/server/database/DatabaseServiceImpl.java | 53 ++++++-- .../java/org/traccar/web/shared/model/Device.java | 19 +++ .../org/traccar/web/shared/model/Position.java | 2 + .../java/org/traccar/web/shared/model/User.java | 2 + 22 files changed, 657 insertions(+), 303 deletions(-) create mode 100644 src/main/java/org/traccar/web/client/controller/ArchiveController.java create mode 100644 src/main/java/org/traccar/web/client/controller/DeviceController.java create mode 100644 src/main/java/org/traccar/web/client/controller/LoginController.java create mode 100644 src/main/java/org/traccar/web/client/controller/MapController.java create mode 100644 src/main/java/org/traccar/web/client/controller/PanelController.java create mode 100644 src/main/java/org/traccar/web/client/database/BaseAsyncCallback.java delete mode 100644 src/main/java/org/traccar/web/client/database/GlobalDatabaseService.java delete mode 100644 src/main/java/org/traccar/web/client/login/LoginController.java delete mode 100644 src/main/java/org/traccar/web/client/login/LoginDialog.java create mode 100644 src/main/java/org/traccar/web/client/view/DeviceDialog.java create mode 100644 src/main/java/org/traccar/web/client/view/LoginDialog.java (limited to 'src') diff --git a/src/main/java/org/traccar/web/client/Style.java b/src/main/java/org/traccar/web/client/Style.java index 83673906..4f2c1fd4 100644 --- a/src/main/java/org/traccar/web/client/Style.java +++ b/src/main/java/org/traccar/web/client/Style.java @@ -10,4 +10,8 @@ public class Style { return 5; } + public static String getNoBorder() { + return "0px"; + } + } diff --git a/src/main/java/org/traccar/web/client/Traccar.java b/src/main/java/org/traccar/web/client/Traccar.java index 2bb84f4a..6da9e011 100644 --- a/src/main/java/org/traccar/web/client/Traccar.java +++ b/src/main/java/org/traccar/web/client/Traccar.java @@ -1,15 +1,19 @@ package org.traccar.web.client; -import java.util.LinkedList; -import java.util.List; - -import org.traccar.web.client.login.LoginController; -import org.traccar.web.client.view.ArchivePanel; -import org.traccar.web.client.view.DevicePanel; -import org.traccar.web.client.view.MapPanel; -import org.traccar.web.shared.model.Device; +import org.traccar.web.client.controller.ArchiveController; +import org.traccar.web.client.controller.DeviceController; +import org.traccar.web.client.controller.LoginController; +import org.traccar.web.client.controller.MapController; +import org.traccar.web.client.database.DatabaseService; +import org.traccar.web.client.database.DatabaseServiceAsync; +import org.traccar.web.client.i18n.ApplicationConstants; import com.google.gwt.core.client.EntryPoint; +import com.google.gwt.core.client.GWT; +import com.smartgwt.client.util.SC; +import com.smartgwt.client.widgets.Canvas; +import com.smartgwt.client.widgets.events.ClickEvent; +import com.smartgwt.client.widgets.events.ClickHandler; import com.smartgwt.client.widgets.layout.HLayout; import com.smartgwt.client.widgets.layout.VLayout; @@ -18,9 +22,17 @@ import com.smartgwt.client.widgets.layout.VLayout; */ public class Traccar implements EntryPoint, LoginController.LoginHandler { - private DevicePanel devicePanel; - private ArchivePanel archivePanel; - private MapPanel mapPanel; + private static final ApplicationConstants constants = GWT.create(ApplicationConstants.class); + + public static ApplicationConstants getConstants() { + return constants; + } + + private static final DatabaseServiceAsync databaseService = GWT.create(DatabaseService.class); + + public static DatabaseServiceAsync getDatabaseService() { + return databaseService; + } /** * Entry point method @@ -28,69 +40,53 @@ public class Traccar implements EntryPoint, LoginController.LoginHandler { @Override public void onModuleLoad() { new LoginController().login(this); - //onLogin(); // TODO: remove from production - - /*try { - GlobalDatabaseService.getInstance().getPositions( - new Device(1), new Date(1325430000000L), new Date(1325437200000L), - new AsyncCallback>() { - @Override - public void onFailure(Throwable throwable) { - SC.warn("onFailure"); - } - @Override - public void onSuccess(List positions) { - SC.warn("onSuccess"); - } - }); - } catch (Exception error) { - SC.warn(error.getMessage()); - }*/ - - } - - private List testDevices() { - List devices = new LinkedList(); - - Device device = new Device(1); - device.setName("test1"); - device.setUniqueId("11111"); - devices.add(device); - - device = new Device(2); - device.setName("test2"); - device.setUniqueId("22222"); - devices.add(device); - - return devices; } @Override public void onLogin() { - devicePanel = new DevicePanel(); - devicePanel.setWidth("20%"); - devicePanel.setShowResizeBar(true); + createLayout(); + } + + private MapController mapController; + private DeviceController deviceController; + private ArchiveController archiveController; - //devicePanel.updateDevices(testDevices()); // TODO: remove from production + private void createLayout() { + mapController = new MapController(); + deviceController = new DeviceController(); + archiveController = new ArchiveController(); - mapPanel = new MapPanel(); - mapPanel.setWidth("80%"); + Canvas mainPanel = mapController.getView(); + mainPanel.setWidth("80%"); - HLayout hLayout = new HLayout(); - hLayout.setHeight("70%"); - hLayout.addMember(devicePanel); - hLayout.addMember(mapPanel); - hLayout.setShowResizeBar(true); - hLayout.setResizeBarTarget("next"); + Canvas leftPanel = deviceController.getView(); + leftPanel.setWidth("20%"); + leftPanel.setShowResizeBar(true); - archivePanel = new ArchivePanel(); - archivePanel.setHeight("30%"); + Canvas bottomPanel = archiveController.getView(); + bottomPanel.setHeight("30%"); + + HLayout topLayout = new HLayout(); + topLayout.setHeight("70%"); + topLayout.addMember(leftPanel); + topLayout.addMember(mainPanel); + topLayout.setShowResizeBar(true); + topLayout.setResizeBarTarget("next"); VLayout mainLayout = new VLayout(); mainLayout.setWidth100(); mainLayout.setHeight100(); - mainLayout.addMember(hLayout); - mainLayout.addMember(archivePanel); + mainLayout.addMember(topLayout); + mainLayout.addMember(bottomPanel); + + deviceController.setSettingsClickHandler(new ClickHandler() { + @Override + public void onClick(ClickEvent event) { + SC.say("Coming soon..."); + } + }); + mainLayout.draw(); } + } diff --git a/src/main/java/org/traccar/web/client/controller/ArchiveController.java b/src/main/java/org/traccar/web/client/controller/ArchiveController.java new file mode 100644 index 00000000..acd8252e --- /dev/null +++ b/src/main/java/org/traccar/web/client/controller/ArchiveController.java @@ -0,0 +1,14 @@ +package org.traccar.web.client.controller; + +import org.traccar.web.client.view.ArchivePanel; + +import com.smartgwt.client.widgets.Canvas; + +public class ArchiveController implements PanelController { + + @Override + public Canvas getView() { + return new ArchivePanel(); + } + +} diff --git a/src/main/java/org/traccar/web/client/controller/DeviceController.java b/src/main/java/org/traccar/web/client/controller/DeviceController.java new file mode 100644 index 00000000..6bf73b01 --- /dev/null +++ b/src/main/java/org/traccar/web/client/controller/DeviceController.java @@ -0,0 +1,94 @@ +package org.traccar.web.client.controller; + +import java.util.List; + +import org.traccar.web.client.Traccar; +import org.traccar.web.client.database.BaseAsyncCallback; +import org.traccar.web.client.view.DeviceDialog; +import org.traccar.web.client.view.DevicePanel; +import org.traccar.web.shared.model.Device; + +import com.google.gwt.user.client.rpc.AsyncCallback; +import com.smartgwt.client.widgets.Canvas; +import com.smartgwt.client.widgets.events.ClickHandler; + +public class DeviceController implements PanelController, DevicePanel.DeviceHandler, DeviceDialog.SaveHandler { + + public interface DeviceHandler { + public void onChanged(); + } + + private DeviceHandler deviceHandler; + + public void setHandler(DeviceHandler deviceHandler) { + this.deviceHandler = deviceHandler; + } + + private final DevicePanel devicePanel; + + public DeviceController() { + devicePanel = new DevicePanel(); + devicePanel.setDeviceHandler(this); + Traccar.getDatabaseService().getDevices(updateCallback); + } + + @Override + public Canvas getView() { + return devicePanel; + } + + public void setSettingsClickHandler(ClickHandler handler) { + if (devicePanel != null) { + devicePanel.setSettingsClickHandler(handler); + } + } + + DeviceDialog dialog; + + @Override + public void onAdd() { + onEdit(new Device()); + } + + @Override + public void onEdit(Device device) { + dialog = new DeviceDialog(); + dialog.setSaveHandler(this); + dialog.setDevice(device); + dialog.draw(); + dialog.centerInPage(); + } + + @Override + public void onRemove(Device device) { + Traccar.getDatabaseService().removeDevice(device, saveCallback); + } + + @Override + public void onSave(Device device) { + Traccar.getDatabaseService().storeDevice(device, saveCallback); + } + + private AsyncCallback saveCallback = new BaseAsyncCallback() { + @Override + public void onSuccess(Boolean result) { + if (result) { + if (dialog != null) { + dialog.destroy(); + dialog = null; + } + Traccar.getDatabaseService().getDevices(updateCallback); + } + } + }; + + private AsyncCallback> updateCallback = new BaseAsyncCallback>() { + @Override + public void onSuccess(List result) { + devicePanel.updateDevices(result); + if (deviceHandler != null) { + deviceHandler.onChanged(); + } + } + }; +} diff --git a/src/main/java/org/traccar/web/client/controller/LoginController.java b/src/main/java/org/traccar/web/client/controller/LoginController.java new file mode 100644 index 00000000..b3193a19 --- /dev/null +++ b/src/main/java/org/traccar/web/client/controller/LoginController.java @@ -0,0 +1,84 @@ +package org.traccar.web.client.controller; + +import org.traccar.web.client.Traccar; +import org.traccar.web.client.database.BaseAsyncCallback; +import org.traccar.web.client.view.LoginDialog; + +import com.smartgwt.client.util.SC; + +public class LoginController implements LoginDialog.LoginHandler { + + private LoginDialog dialog; + + public interface LoginHandler { + public void onLogin(); + } + + private LoginHandler loginHandler; + + public void login(final LoginHandler loginHandler) { + this.loginHandler = loginHandler; + + Traccar.getDatabaseService().authenticated(new BaseAsyncCallback() { + @Override + public void onSuccess(Boolean result) { + + if (result) { + loginHandler.onLogin(); + } else { + dialog = new LoginDialog(); + dialog.setLoginHandler(LoginController.this); + dialog.draw(); + dialog.centerInPage(); + } + } + }); + } + + private boolean validate(String login, String password) { + if (login == null || login.isEmpty() || password == null || password.isEmpty()) { + SC.warn(Traccar.getConstants().blankLoginPassword()); + return false; + } + return true; + } + + @Override + public void onLogin(String login, String password) { + if (validate(login, password)) { + Traccar.getDatabaseService().authenticate(login, password, new BaseAsyncCallback() { + @Override + public void onSuccess(Boolean result) { + if (result) { + if (loginHandler != null) { + dialog.destroy(); + loginHandler.onLogin(); + } + } else { + SC.warn(Traccar.getConstants().invalidLoginPassword()); + } + } + }); + } + } + + @Override + public void onRegister(String login, String password) { + if (validate(login, password)) { + Traccar.getDatabaseService().register(login, password, new BaseAsyncCallback() { + @Override + public void onSuccess(Boolean result) { + if (result) { + if (loginHandler != null) { + dialog.destroy(); + loginHandler.onLogin(); + } + } else { + SC.warn(Traccar.getConstants().registrationError()); + } + } + }); + } + } + +} diff --git a/src/main/java/org/traccar/web/client/controller/MapController.java b/src/main/java/org/traccar/web/client/controller/MapController.java new file mode 100644 index 00000000..64938830 --- /dev/null +++ b/src/main/java/org/traccar/web/client/controller/MapController.java @@ -0,0 +1,14 @@ +package org.traccar.web.client.controller; + +import org.traccar.web.client.view.MapPanel; + +import com.smartgwt.client.widgets.Canvas; + +public class MapController implements PanelController { + + @Override + public Canvas getView() { + return new MapPanel(); + } + +} diff --git a/src/main/java/org/traccar/web/client/controller/PanelController.java b/src/main/java/org/traccar/web/client/controller/PanelController.java new file mode 100644 index 00000000..6f2492aa --- /dev/null +++ b/src/main/java/org/traccar/web/client/controller/PanelController.java @@ -0,0 +1,9 @@ +package org.traccar.web.client.controller; + +import com.smartgwt.client.widgets.Canvas; + +public interface PanelController { + + Canvas getView(); + +} diff --git a/src/main/java/org/traccar/web/client/database/BaseAsyncCallback.java b/src/main/java/org/traccar/web/client/database/BaseAsyncCallback.java new file mode 100644 index 00000000..bcc8c370 --- /dev/null +++ b/src/main/java/org/traccar/web/client/database/BaseAsyncCallback.java @@ -0,0 +1,19 @@ +package org.traccar.web.client.database; + +import org.traccar.web.client.Traccar; + +import com.google.gwt.user.client.rpc.AsyncCallback; +import com.smartgwt.client.util.SC; + +public class BaseAsyncCallback implements AsyncCallback { + + @Override + public void onFailure(Throwable caught) { + SC.warn(Traccar.getConstants().remoteProcedureCallError()); + } + + @Override + public void onSuccess(T result) { + } + +} diff --git a/src/main/java/org/traccar/web/client/database/DatabaseService.java b/src/main/java/org/traccar/web/client/database/DatabaseService.java index 3c6cf095..646f7a62 100644 --- a/src/main/java/org/traccar/web/client/database/DatabaseService.java +++ b/src/main/java/org/traccar/web/client/database/DatabaseService.java @@ -12,12 +12,18 @@ import com.google.gwt.user.client.rpc.RemoteServiceRelativePath; @RemoteServiceRelativePath("databaseService") public interface DatabaseService extends RemoteService { + boolean authenticated(); + boolean authenticate(String login, String password); boolean register(String login, String password); List getDevices(); + boolean storeDevice(Device device); + + boolean removeDevice(Device device); + List getPositions(Device device, Date from, Date to); } diff --git a/src/main/java/org/traccar/web/client/database/DatabaseServiceAsync.java b/src/main/java/org/traccar/web/client/database/DatabaseServiceAsync.java index c68a35f7..7a700beb 100644 --- a/src/main/java/org/traccar/web/client/database/DatabaseServiceAsync.java +++ b/src/main/java/org/traccar/web/client/database/DatabaseServiceAsync.java @@ -10,12 +10,18 @@ import com.google.gwt.user.client.rpc.AsyncCallback; public interface DatabaseServiceAsync { + void authenticated(AsyncCallback callback); + void authenticate(String login, String password, AsyncCallback callback); void register(String login, String password, AsyncCallback callback); void getDevices(AsyncCallback> callback); + void storeDevice(Device device, AsyncCallback callback); + + void removeDevice(Device device, AsyncCallback callback); + void getPositions(Device device, Date from, Date to, AsyncCallback> callback); } diff --git a/src/main/java/org/traccar/web/client/database/GlobalDatabaseService.java b/src/main/java/org/traccar/web/client/database/GlobalDatabaseService.java deleted file mode 100644 index 138fa48b..00000000 --- a/src/main/java/org/traccar/web/client/database/GlobalDatabaseService.java +++ /dev/null @@ -1,13 +0,0 @@ -package org.traccar.web.client.database; - -import com.google.gwt.core.client.GWT; - -public class GlobalDatabaseService { - - private static final DatabaseServiceAsync databaseService = GWT.create(DatabaseService.class); - - public static DatabaseServiceAsync getInstance() { - return databaseService; - } - -} diff --git a/src/main/java/org/traccar/web/client/i18n/ApplicationConstants.java b/src/main/java/org/traccar/web/client/i18n/ApplicationConstants.java index d11781b0..2e7c0067 100644 --- a/src/main/java/org/traccar/web/client/i18n/ApplicationConstants.java +++ b/src/main/java/org/traccar/web/client/i18n/ApplicationConstants.java @@ -31,6 +31,9 @@ public interface ApplicationConstants extends Constants { @DefaultStringValue("Devices") String devices(); + @DefaultStringValue("Device") + String device(); + @DefaultStringValue("Add") String add(); @@ -43,13 +46,22 @@ public interface ApplicationConstants extends Constants { @DefaultStringValue("Settings") String settings(); + @DefaultStringValue("Are you sure you want to remove selected device?") + String removeDeviceConfirmation(); + @DefaultStringValue("Object") String object(); @DefaultStringValue("Unique Identifier") - String id(); + String uniqueId(); @DefaultStringValue("Name") String name(); + @DefaultStringValue("Save") + String save(); + + @DefaultStringValue("Cancel") + String cancel(); + } diff --git a/src/main/java/org/traccar/web/client/login/LoginController.java b/src/main/java/org/traccar/web/client/login/LoginController.java deleted file mode 100644 index 840bde5e..00000000 --- a/src/main/java/org/traccar/web/client/login/LoginController.java +++ /dev/null @@ -1,87 +0,0 @@ -package org.traccar.web.client.login; - -import org.traccar.web.client.database.GlobalDatabaseService; -import org.traccar.web.client.i18n.ApplicationConstants; - -import com.google.gwt.core.client.GWT; -import com.google.gwt.user.client.rpc.AsyncCallback; -import com.smartgwt.client.util.SC; - -public class LoginController implements LoginDialog.LoginHandler { - - private static final ApplicationConstants constants = GWT.create(ApplicationConstants.class); - - private LoginDialog dialog; - - public interface LoginHandler { - public void onLogin(); - } - - private LoginHandler loginHandler; - - public void login(LoginHandler loginHandler) { - this.loginHandler = loginHandler; - - dialog = new LoginDialog(); - dialog.setLoginHandler(this); - dialog.draw(); - dialog.centerInPage(); - } - - private boolean validate(String login, String password) { - if (login == null || login.isEmpty() || password == null || password.isEmpty()) { - SC.warn(constants.blankLoginPassword()); - return false; - } - return true; - } - - private static abstract class AsyncCallbackHandler implements AsyncCallback { - @Override - public void onFailure(Throwable caught) { - SC.warn(constants.remoteProcedureCallError()); - } - } - - private final AsyncCallback loginCallback = new AsyncCallbackHandler() { - @Override - public void onSuccess(Boolean result) { - if (result) { - if (loginHandler != null) { - dialog.destroy(); - loginHandler.onLogin(); - } - } else { - SC.warn(constants.invalidLoginPassword()); - } - } - }; - - @Override - public void onLogin(String login, String password) { - if (validate(login, password)) { - GlobalDatabaseService.getInstance().authenticate(login, password, loginCallback); - } - } - - private final AsyncCallback registerCallback = new AsyncCallbackHandler() { - @Override - public void onSuccess(Boolean result) { - if (result) { - if (loginHandler != null) { - dialog.destroy(); - loginHandler.onLogin(); - } - } else { - SC.warn(constants.registrationError()); - } - } - }; - - @Override - public void onRegister(String login, String password) { - if (validate(login, password)) { - GlobalDatabaseService.getInstance().register(login, password, registerCallback); - } - } -} diff --git a/src/main/java/org/traccar/web/client/login/LoginDialog.java b/src/main/java/org/traccar/web/client/login/LoginDialog.java deleted file mode 100644 index 4e40f699..00000000 --- a/src/main/java/org/traccar/web/client/login/LoginDialog.java +++ /dev/null @@ -1,81 +0,0 @@ -package org.traccar.web.client.login; - -import org.traccar.web.client.Style; -import org.traccar.web.client.i18n.ApplicationConstants; - -import com.google.gwt.core.client.GWT; -import com.smartgwt.client.widgets.IButton; -import com.smartgwt.client.widgets.Window; -import com.smartgwt.client.widgets.events.ClickEvent; -import com.smartgwt.client.widgets.events.ClickHandler; -import com.smartgwt.client.widgets.form.DynamicForm; -import com.smartgwt.client.widgets.form.fields.PasswordItem; -import com.smartgwt.client.widgets.form.fields.TextItem; -import com.smartgwt.client.widgets.form.fields.ToolbarItem; -import com.smartgwt.client.widgets.layout.Layout; - -public class LoginDialog extends Window { - - private static final ApplicationConstants constants = GWT.create(ApplicationConstants.class); - - public LoginDialog() { - - // Window properties - setTitle(constants.userAuthentication()); - setShowCloseButton(false); - setShowMinimizeButton(false); - setAutoSize(true); - - // Login form - final DynamicForm form = new DynamicForm(); - form.setHeight100(); - form.setWidth100(); - final TextItem loginEdit = new TextItem(); - loginEdit.setTitle(constants.login()); - final PasswordItem passwordEdit = new PasswordItem(); - passwordEdit.setTitle(constants.password()); - - final ToolbarItem toolbarItem = new ToolbarItem(); - toolbarItem.setButtons( - new IButton(constants.login(), new ClickHandler() { - @Override - public void onClick(ClickEvent event) { - if (loginHandler != null) { - loginHandler.onLogin( - loginEdit.getValueAsString(), passwordEdit.getValueAsString()); - } - } - }), - new IButton(constants.register(), new ClickHandler() { - @Override - public void onClick(ClickEvent event) { - if (loginHandler != null) { - loginHandler.onRegister( - loginEdit.getValueAsString(), passwordEdit.getValueAsString()); - } - } - })); - - form.setFields(loginEdit, passwordEdit, toolbarItem); - form.setCellPadding(Style.getCellPadding()); - - final Layout layout = new Layout(); - layout.setPadding(Style.getPadding()); - - layout.addMember(form); - - addItem(layout); - } - - public interface LoginHandler { - public void onLogin(String login, String password); - public void onRegister(String login, String password); - } - - private LoginHandler loginHandler; - - public void setLoginHandler(LoginHandler loginHandler) { - this.loginHandler = loginHandler; - } - -} diff --git a/src/main/java/org/traccar/web/client/view/DeviceDialog.java b/src/main/java/org/traccar/web/client/view/DeviceDialog.java new file mode 100644 index 00000000..119564ad --- /dev/null +++ b/src/main/java/org/traccar/web/client/view/DeviceDialog.java @@ -0,0 +1,87 @@ +package org.traccar.web.client.view; + +import org.traccar.web.client.Style; +import org.traccar.web.client.Traccar; +import org.traccar.web.shared.model.Device; + +import com.smartgwt.client.types.Alignment; +import com.smartgwt.client.widgets.IButton; +import com.smartgwt.client.widgets.Window; +import com.smartgwt.client.widgets.events.ClickEvent; +import com.smartgwt.client.widgets.events.ClickHandler; +import com.smartgwt.client.widgets.form.DynamicForm; +import com.smartgwt.client.widgets.form.fields.TextItem; +import com.smartgwt.client.widgets.form.fields.ToolbarItem; +import com.smartgwt.client.widgets.layout.Layout; + +public class DeviceDialog extends Window { + + public interface SaveHandler { + public void onSave(Device device); + } + + private SaveHandler saveHandler; + + public void setSaveHandler(SaveHandler saveHandler) { + this.saveHandler = saveHandler; + } + + private Device device; + + TextItem nameEdit; + TextItem uniqueIdEdit; + + public void setDevice(Device device) { + this.device = device; + nameEdit.setValue(device.getName()); + uniqueIdEdit.setValue(device.getUniqueId()); + } + + public DeviceDialog() { + setTitle(Traccar.getConstants().device()); + setAutoSize(true); + setIsModal(true); + + // Form + final DynamicForm form = new DynamicForm(); + form.setHeight100(); + form.setWidth100(); + + nameEdit = new TextItem(); + nameEdit.setTitle(Traccar.getConstants().name()); + uniqueIdEdit = new TextItem(); + uniqueIdEdit.setTitle(Traccar.getConstants().uniqueId()); + + final ToolbarItem toolbarItem = new ToolbarItem(); + toolbarItem.setButtons( + new IButton(Traccar.getConstants().save(), new ClickHandler() { + @Override + public void onClick(ClickEvent event) { + if (saveHandler != null) { + device.setName(nameEdit.getValueAsString()); + device.setUniqueId(uniqueIdEdit.getValueAsString()); + saveHandler.onSave(device); + } + } + }), + new IButton(Traccar.getConstants().cancel(), new ClickHandler() { + @Override + public void onClick(ClickEvent event) { + destroy(); + } + })); + toolbarItem.setAlign(Alignment.RIGHT); + toolbarItem.setColSpan(3); + + form.setFields(nameEdit, uniqueIdEdit, toolbarItem); + form.setCellPadding(Style.getCellPadding()); + + final Layout layout = new Layout(); + layout.setPadding(Style.getPadding()); + + layout.addMember(form); + + addItem(layout); + } + +} diff --git a/src/main/java/org/traccar/web/client/view/DevicePanel.java b/src/main/java/org/traccar/web/client/view/DevicePanel.java index 4296a25a..2052c996 100644 --- a/src/main/java/org/traccar/web/client/view/DevicePanel.java +++ b/src/main/java/org/traccar/web/client/view/DevicePanel.java @@ -4,14 +4,18 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import org.traccar.web.client.i18n.ApplicationConstants; +import org.traccar.web.client.Traccar; import org.traccar.web.shared.model.Device; -import com.google.gwt.core.client.GWT; import com.smartgwt.client.data.Record; +import com.smartgwt.client.util.BooleanCallback; +import com.smartgwt.client.util.SC; +import com.smartgwt.client.widgets.events.ClickEvent; import com.smartgwt.client.widgets.events.ClickHandler; import com.smartgwt.client.widgets.grid.ListGrid; import com.smartgwt.client.widgets.grid.ListGridField; +import com.smartgwt.client.widgets.grid.events.SelectionChangedHandler; +import com.smartgwt.client.widgets.grid.events.SelectionEvent; import com.smartgwt.client.widgets.layout.SectionStack; import com.smartgwt.client.widgets.layout.SectionStackSection; import com.smartgwt.client.widgets.toolbar.ToolStrip; @@ -22,90 +26,134 @@ import com.smartgwt.client.widgets.toolbar.ToolStripButton; */ public class DevicePanel extends SectionStack { - private static final ApplicationConstants constants = GWT.create(ApplicationConstants.class); - - private static final String COLUMN_OBJECT = "object"; - private static final String COLUMN_NAME = "name"; private static final String COLUMN_ID = "id"; + private static final String COLUMN_NAME = "name"; + private static final String COLUMN_UNIQUE_ID = "uniqueId"; + + public interface DeviceHandler { + public void onAdd(); + public void onEdit(Device device); + public void onRemove(Device device); + } - private ToolStrip toolbar; + private DeviceHandler deviceHandler; - private ToolStripButton buttonAdd; - private ToolStripButton buttonRemove; - private ToolStripButton buttonEdit; - private ToolStripButton buttonSettings; + public void setDeviceHandler(DeviceHandler deviceHandler) { + this.deviceHandler = deviceHandler; + } + + ToolStripButton addButton; + ToolStripButton removeButton; + ToolStripButton editButton; + private ToolStripButton settingsButton; private ListGrid list; + private Map deviceMap = new HashMap(); + public DevicePanel() { - SectionStackSection section = new SectionStackSection(constants.devices()); + SectionStackSection section = new SectionStackSection(Traccar.getConstants().devices()); section.setCanCollapse(false); section.setExpanded(true); - toolbar = new ToolStrip(); + ToolStrip toolbar = new ToolStrip(); toolbar.setWidth100(); - buttonAdd = new ToolStripButton(); - buttonAdd.setTitle(constants.add()); - toolbar.addButton(buttonAdd); - - buttonRemove = new ToolStripButton(); - buttonRemove.setTitle(constants.remove()); - toolbar.addButton(buttonRemove); - - buttonEdit = new ToolStripButton(); - buttonEdit.setTitle(constants.edit()); - toolbar.addButton(buttonEdit); + addButton = new ToolStripButton(); + addButton.setTitle(Traccar.getConstants().add()); + addButton.addClickHandler(new ClickHandler() { + @Override + public void onClick(ClickEvent event) { + if (deviceHandler != null) { + deviceHandler.onAdd(); + } + } + }); + + removeButton = new ToolStripButton(); + removeButton.setTitle(Traccar.getConstants().remove()); + removeButton.setVisible(false); + removeButton.addClickHandler(new ClickHandler() { + @Override + public void onClick(ClickEvent event) { + SC.ask(Traccar.getConstants().removeDeviceConfirmation(), new BooleanCallback() { + @Override + public void execute(Boolean value) { + if (value && deviceHandler != null && list.anySelected()) { + deviceHandler.onRemove(deviceMap.get(list.getSelectedRecord().getAttributeAsLong(COLUMN_ID))); + } + } + }); + } + }); + + editButton = new ToolStripButton(); + editButton.setVisible(false); + editButton.setTitle(Traccar.getConstants().edit()); + editButton.addClickHandler(new ClickHandler() { + @Override + public void onClick(ClickEvent event) { + if (deviceHandler != null && list.anySelected()) { + deviceHandler.onEdit(deviceMap.get(list.getSelectedRecord().getAttributeAsLong(COLUMN_ID))); + } + } + }); + + toolbar.addButton(addButton); + toolbar.addButton(removeButton); + toolbar.addButton(editButton); toolbar.addFill(); toolbar.addSeparator(); - buttonSettings = new ToolStripButton(); - buttonSettings.setTitle(constants.settings()); - toolbar.addButton(buttonSettings); + settingsButton = new ToolStripButton(); + settingsButton.setTitle(Traccar.getConstants().settings()); + toolbar.addButton(settingsButton); list = new ListGrid(); list.setFields( - new ListGridField(COLUMN_NAME, constants.name()), - new ListGridField(COLUMN_ID, constants.id())); + new ListGridField(COLUMN_NAME, Traccar.getConstants().name()), + new ListGridField(COLUMN_UNIQUE_ID, Traccar.getConstants().uniqueId())); list.setCanSort(false); list.setShowHeaderContextMenu(false); list.setShowHeaderMenuButton(false); + list.addSelectionChangedHandler(new SelectionChangedHandler() { + @Override + public void onSelectionChanged(SelectionEvent event) { + removeButton.setVisible(list.anySelected()); + editButton.setVisible(list.anySelected()); + } + }); + section.setItems(toolbar, list); setSections(section); } - public void setAddClickHandler(ClickHandler handler) { - buttonAdd.addClickHandler(handler); - } - - public void setRemoveClickHandler(ClickHandler handler) { - buttonRemove.addClickHandler(handler); - } - - public void setEditClickHandler(ClickHandler handler) { - buttonEdit.addClickHandler(handler); - } - public void setSettingsClickHandler(ClickHandler handler) { - buttonSettings.addClickHandler(handler); + settingsButton.addClickHandler(handler); } public void updateDevices(List devices) { - // TODO: clear + deviceMap.clear(); + for (Record record : list.getRecords()) { + list.removeData(record); + } + removeButton.setVisible(list.anySelected()); + editButton.setVisible(list.anySelected()); for (Device device : devices) { + deviceMap.put(device.getId(), device); + Map map = new HashMap(); - //map.put(COLUMN_OBJECT, device); + map.put(COLUMN_ID, device.getId()); map.put(COLUMN_NAME, device.getName()); - map.put(COLUMN_ID, device.getUniqueId()); + map.put(COLUMN_UNIQUE_ID, device.getUniqueId()); Record record = new Record(map); list.addData(record); } } - } diff --git a/src/main/java/org/traccar/web/client/view/LoginDialog.java b/src/main/java/org/traccar/web/client/view/LoginDialog.java new file mode 100644 index 00000000..625a29b5 --- /dev/null +++ b/src/main/java/org/traccar/web/client/view/LoginDialog.java @@ -0,0 +1,82 @@ +package org.traccar.web.client.view; + +import org.traccar.web.client.Style; +import org.traccar.web.client.Traccar; + +import com.smartgwt.client.types.Alignment; +import com.smartgwt.client.widgets.IButton; +import com.smartgwt.client.widgets.Window; +import com.smartgwt.client.widgets.events.ClickEvent; +import com.smartgwt.client.widgets.events.ClickHandler; +import com.smartgwt.client.widgets.form.DynamicForm; +import com.smartgwt.client.widgets.form.fields.PasswordItem; +import com.smartgwt.client.widgets.form.fields.TextItem; +import com.smartgwt.client.widgets.form.fields.ToolbarItem; +import com.smartgwt.client.widgets.layout.Layout; + +public class LoginDialog extends Window { + + public interface LoginHandler { + public void onLogin(String login, String password); + public void onRegister(String login, String password); + } + + private LoginHandler loginHandler; + + public void setLoginHandler(LoginHandler loginHandler) { + this.loginHandler = loginHandler; + } + + public LoginDialog() { + + // Window properties + setTitle(Traccar.getConstants().userAuthentication()); + setShowCloseButton(false); + setShowMinimizeButton(false); + setAutoSize(true); + setIsModal(true); + + // Login form + final DynamicForm form = new DynamicForm(); + form.setHeight100(); + form.setWidth100(); + final TextItem loginEdit = new TextItem(); + loginEdit.setTitle(Traccar.getConstants().login()); + final PasswordItem passwordEdit = new PasswordItem(); + passwordEdit.setTitle(Traccar.getConstants().password()); + + final ToolbarItem toolbarItem = new ToolbarItem(); + toolbarItem.setButtons( + new IButton(Traccar.getConstants().login(), new ClickHandler() { + @Override + public void onClick(ClickEvent event) { + if (loginHandler != null) { + loginHandler.onLogin( + loginEdit.getValueAsString(), passwordEdit.getValueAsString()); + } + } + }), + new IButton(Traccar.getConstants().register(), new ClickHandler() { + @Override + public void onClick(ClickEvent event) { + if (loginHandler != null) { + loginHandler.onRegister( + loginEdit.getValueAsString(), passwordEdit.getValueAsString()); + } + } + })); + toolbarItem.setAlign(Alignment.RIGHT); + toolbarItem.setColSpan(3); + + form.setFields(loginEdit, passwordEdit, toolbarItem); + form.setCellPadding(Style.getCellPadding()); + + final Layout layout = new Layout(); + layout.setPadding(Style.getPadding()); + + layout.addMember(form); + + addItem(layout); + } + +} diff --git a/src/main/java/org/traccar/web/client/view/MapPanel.java b/src/main/java/org/traccar/web/client/view/MapPanel.java index 1b883760..06bf45cc 100644 --- a/src/main/java/org/traccar/web/client/view/MapPanel.java +++ b/src/main/java/org/traccar/web/client/view/MapPanel.java @@ -23,7 +23,7 @@ import com.smartgwt.client.widgets.layout.SectionStackSection; */ public class MapPanel extends SectionStack { - private final static int BORDER_SIZE = 1; + //private final static int BORDER_SIZE = 1; private MapWidget mapWidget; private WidgetCanvas mapWrapper; @@ -35,10 +35,10 @@ public class MapPanel extends SectionStack { MapWidget mapWidget = new MapWidget("100%", "100%", defaultMapOptions); // Google layer - /*GoogleV3Options layerOptiond = new GoogleV3Options(); - layerOptiond.setIsBaseLayer(true); - layerOptiond.setType(GoogleV3MapType.G_NORMAL_MAP); - GoogleV3 layer = new GoogleV3("Google", layerOptiond);*/ + /*GoogleV3Options layerOptions = new GoogleV3Options(); + layerOptions.setIsBaseLayer(true); + layerOptions.setType(GoogleV3MapType.G_NORMAL_MAP); + GoogleV3 layer = new GoogleV3("Google", layerOptions);*/ // Open Street Map layer OSM layer = OSM.Mapnik("Mapnik"); diff --git a/src/main/java/org/traccar/web/server/database/DatabaseServiceImpl.java b/src/main/java/org/traccar/web/server/database/DatabaseServiceImpl.java index 8ee9d63d..335cc171 100644 --- a/src/main/java/org/traccar/web/server/database/DatabaseServiceImpl.java +++ b/src/main/java/org/traccar/web/server/database/DatabaseServiceImpl.java @@ -19,6 +19,8 @@ import com.google.gwt.user.server.rpc.RemoteServiceServlet; public class DatabaseServiceImpl extends RemoteServiceServlet implements DatabaseService { + private static final long serialVersionUID = 1; + private static final String PERSISTENCE_UNIT = "traccar"; private static final String ATTRIBUTE_USER = "user"; @@ -40,6 +42,11 @@ public class DatabaseServiceImpl extends RemoteServiceServlet implements Databas return (User) session.getAttribute(ATTRIBUTE_USER); } + @Override + public boolean authenticated() { + return (getUser() != null); + } + @Override public boolean authenticate(String login, String password) { TypedQuery query = entityManager.createQuery( @@ -60,8 +67,11 @@ public class DatabaseServiceImpl extends RemoteServiceServlet implements Databas user.setLogin(login); user.setPassword(password); entityManager.getTransaction().begin(); - entityManager.persist(user); - entityManager.getTransaction().commit(); + try { + entityManager.persist(user); + } finally { + entityManager.getTransaction().commit(); + } setUser(user); return true; } @@ -69,14 +79,41 @@ public class DatabaseServiceImpl extends RemoteServiceServlet implements Databas @Override public List getDevices() { User user = getUser(); - if (user != null) { - List devices = new LinkedList(); - for (Device device : user.getDevices()) { - devices.add(device); + List devices = new LinkedList(); + for (Device device : user.getDevices()) { + devices.add(device); + } + return devices; + } + + @Override + public boolean storeDevice(Device device) { + User user = getUser(); + boolean isNew = device.getId() == 0; + entityManager.getTransaction().begin(); + try { + device = entityManager.merge(device); + if (isNew) { + user.getDevices().add(device); } - return devices; + } finally { + entityManager.getTransaction().commit(); } - return null; + return true; + } + + @Override + public boolean removeDevice(Device device) { + User user = getUser(); + entityManager.getTransaction().begin(); + try { + device = entityManager.merge(device); + user.getDevices().remove(device); + entityManager.remove(device); + } finally { + entityManager.getTransaction().commit(); + } + return true; } @Override diff --git a/src/main/java/org/traccar/web/shared/model/Device.java b/src/main/java/org/traccar/web/shared/model/Device.java index 3a7b05eb..32f1c1f0 100644 --- a/src/main/java/org/traccar/web/shared/model/Device.java +++ b/src/main/java/org/traccar/web/shared/model/Device.java @@ -12,6 +12,21 @@ import javax.persistence.Table; @Table(name = "devices") public class Device implements Serializable { + private static final long serialVersionUID = 1; + + @Override + public boolean equals(Object obj) { + if (obj == null || obj.getClass() != this.getClass()) { + return false; + } + return id == ((Device) obj).id; + } + + @Override + public int hashCode() { + return (int) id; + } + public Device() { } @@ -24,6 +39,10 @@ public class Device implements Serializable { @GeneratedValue private long id; + public long getId() { + return id; + } + @Column(unique = true) private String uniqueId; diff --git a/src/main/java/org/traccar/web/shared/model/Position.java b/src/main/java/org/traccar/web/shared/model/Position.java index 17db3713..5a918cfc 100644 --- a/src/main/java/org/traccar/web/shared/model/Position.java +++ b/src/main/java/org/traccar/web/shared/model/Position.java @@ -15,6 +15,8 @@ import org.hibernate.annotations.Index; @Table(name = "positions") public class Position implements Serializable { + private static final long serialVersionUID = 1; + public Position() { } diff --git a/src/main/java/org/traccar/web/shared/model/User.java b/src/main/java/org/traccar/web/shared/model/User.java index 61d6a364..181a09b6 100644 --- a/src/main/java/org/traccar/web/shared/model/User.java +++ b/src/main/java/org/traccar/web/shared/model/User.java @@ -14,6 +14,8 @@ import javax.persistence.Table; @Table(name="users") public class User implements Serializable { + private static final long serialVersionUID = 1; + public User() { } -- cgit v1.2.3