diff options
22 files changed, 598 insertions, 243 deletions
@@ -154,7 +154,8 @@ <target>1.6</target> </configuration> </plugin> - + + <!-- Debug and release configuration --> <plugin> <artifactId>maven-antrun-plugin</artifactId> <version>1.7</version> diff --git a/src/main/java/org/traccar/web/client/Style.java b/src/main/java/org/traccar/web/client/Style.java index 8367390..4f2c1fd 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 2bb84f4..6da9e01 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<List<Position>>() { - @Override - public void onFailure(Throwable throwable) { - SC.warn("onFailure"); - } - @Override - public void onSuccess(List<Position> positions) { - SC.warn("onSuccess"); - } - }); - } catch (Exception error) { - SC.warn(error.getMessage()); - }*/ - - } - - private List<Device> testDevices() { - List<Device> devices = new LinkedList<Device>(); - - 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 0000000..acd8252 --- /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 0000000..6bf73b0 --- /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<Boolean> saveCallback = new BaseAsyncCallback<Boolean>() { + @Override + public void onSuccess(Boolean result) { + if (result) { + if (dialog != null) { + dialog.destroy(); + dialog = null; + } + Traccar.getDatabaseService().getDevices(updateCallback); + } + } + }; + + private AsyncCallback<List<Device>> updateCallback = new BaseAsyncCallback<List<Device>>() { + @Override + public void onSuccess(List<Device> 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 0000000..b3193a1 --- /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<Boolean>() { + @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<Boolean>() { + @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<Boolean>() { + @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 0000000..6493883 --- /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 0000000..6f2492a --- /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 0000000..bcc8c37 --- /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<T> implements AsyncCallback<T> { + + @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 3c6cf09..646f7a6 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<Device> getDevices(); + boolean storeDevice(Device device); + + boolean removeDevice(Device device); + List<Position> 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 c68a35f..7a700be 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<Boolean> callback); + void authenticate(String login, String password, AsyncCallback<Boolean> callback); void register(String login, String password, AsyncCallback<Boolean> callback); void getDevices(AsyncCallback<List<Device>> callback); + void storeDevice(Device device, AsyncCallback<Boolean> callback); + + void removeDevice(Device device, AsyncCallback<Boolean> callback); + void getPositions(Device device, Date from, Date to, AsyncCallback<List<Position>> 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 138fa48..0000000 --- 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 d11781b..2e7c006 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 840bde5..0000000 --- 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<Boolean> { - @Override - public void onFailure(Throwable caught) { - SC.warn(constants.remoteProcedureCallError()); - } - } - - private final AsyncCallback<Boolean> 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<Boolean> 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/view/DeviceDialog.java b/src/main/java/org/traccar/web/client/view/DeviceDialog.java new file mode 100644 index 0000000..119564a --- /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 4296a25..2052c99 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<Long, Device> deviceMap = new HashMap<Long, Device>(); + 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<Device> 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<String, Object> map = new HashMap<String, Object>(); - //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/login/LoginDialog.java b/src/main/java/org/traccar/web/client/view/LoginDialog.java index 4e40f69..625a29b 100644 --- a/src/main/java/org/traccar/web/client/login/LoginDialog.java +++ b/src/main/java/org/traccar/web/client/view/LoginDialog.java @@ -1,9 +1,9 @@ -package org.traccar.web.client.login; +package org.traccar.web.client.view; import org.traccar.web.client.Style; -import org.traccar.web.client.i18n.ApplicationConstants; +import org.traccar.web.client.Traccar; -import com.google.gwt.core.client.GWT; +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; @@ -16,28 +16,38 @@ import com.smartgwt.client.widgets.layout.Layout; public class LoginDialog extends Window { - private static final ApplicationConstants constants = GWT.create(ApplicationConstants.class); + 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(constants.userAuthentication()); + 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(constants.login()); + loginEdit.setTitle(Traccar.getConstants().login()); final PasswordItem passwordEdit = new PasswordItem(); - passwordEdit.setTitle(constants.password()); + passwordEdit.setTitle(Traccar.getConstants().password()); final ToolbarItem toolbarItem = new ToolbarItem(); toolbarItem.setButtons( - new IButton(constants.login(), new ClickHandler() { + new IButton(Traccar.getConstants().login(), new ClickHandler() { @Override public void onClick(ClickEvent event) { if (loginHandler != null) { @@ -46,7 +56,7 @@ public class LoginDialog extends Window { } } }), - new IButton(constants.register(), new ClickHandler() { + new IButton(Traccar.getConstants().register(), new ClickHandler() { @Override public void onClick(ClickEvent event) { if (loginHandler != null) { @@ -55,6 +65,8 @@ public class LoginDialog extends Window { } } })); + toolbarItem.setAlign(Alignment.RIGHT); + toolbarItem.setColSpan(3); form.setFields(loginEdit, passwordEdit, toolbarItem); form.setCellPadding(Style.getCellPadding()); @@ -67,15 +79,4 @@ public class LoginDialog extends Window { 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/MapPanel.java b/src/main/java/org/traccar/web/client/view/MapPanel.java index 1b88376..06bf45c 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 8ee9d63..335cc17 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"; @@ -41,6 +43,11 @@ public class DatabaseServiceImpl extends RemoteServiceServlet implements Databas } @Override + public boolean authenticated() { + return (getUser() != null); + } + + @Override public boolean authenticate(String login, String password) { TypedQuery<User> query = entityManager.createQuery( "SELECT x FROM User x WHERE x.login = :login", User.class); @@ -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<Device> getDevices() { User user = getUser(); - if (user != null) { - List<Device> devices = new LinkedList<Device>(); - for (Device device : user.getDevices()) { - devices.add(device); + List<Device> devices = new LinkedList<Device>(); + 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 3a7b05e..32f1c1f 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 17db371..5a918cf 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 61d6a36..181a09b 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() { } |