From ebcedc38812405ba1cd03c518317bcf0cd52f925 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Mon, 25 Feb 2013 21:06:38 +1300 Subject: Added user management --- .../web/client/controller/SettingsController.java | 58 ++++++++++- src/org/traccar/web/client/model/DataService.java | 6 ++ .../traccar/web/client/model/DataServiceAsync.java | 6 ++ src/org/traccar/web/client/view/DeviceView.java | 19 +++- src/org/traccar/web/client/view/DeviceView.ui.xml | 6 +- src/org/traccar/web/client/view/UsersDialog.java | 110 +++++++++++++++++++++ src/org/traccar/web/client/view/UsersDialog.ui.xml | 50 ++++++++++ .../traccar/web/server/model/DataServiceImpl.java | 59 +++++++++++ src/org/traccar/web/shared/model/User.java | 2 +- 9 files changed, 308 insertions(+), 8 deletions(-) create mode 100644 src/org/traccar/web/client/view/UsersDialog.java create mode 100644 src/org/traccar/web/client/view/UsersDialog.ui.xml (limited to 'src/org/traccar/web') diff --git a/src/org/traccar/web/client/controller/SettingsController.java b/src/org/traccar/web/client/controller/SettingsController.java index a1892ae..f8fcc72 100644 --- a/src/org/traccar/web/client/controller/SettingsController.java +++ b/src/org/traccar/web/client/controller/SettingsController.java @@ -15,17 +15,27 @@ */ package org.traccar.web.client.controller; +import java.util.List; + import org.traccar.web.client.Application; import org.traccar.web.client.ApplicationContext; import org.traccar.web.client.model.BaseAsyncCallback; +import org.traccar.web.client.model.UserProperties; import org.traccar.web.client.view.ApplicationSettingsDialog; import org.traccar.web.client.view.DeviceView; import org.traccar.web.client.view.UserDialog; import org.traccar.web.client.view.UserSettingsDialog; +import org.traccar.web.client.view.UsersDialog; import org.traccar.web.shared.model.ApplicationSettings; import org.traccar.web.shared.model.User; import org.traccar.web.shared.model.UserSettings; +import com.google.gwt.core.client.GWT; +import com.sencha.gxt.data.shared.ListStore; +import com.sencha.gxt.widget.core.client.Dialog.PredefinedButton; +import com.sencha.gxt.widget.core.client.box.ConfirmMessageBox; +import com.sencha.gxt.widget.core.client.event.HideEvent; + public class SettingsController implements DeviceView.SettingsHandler { @Override @@ -66,8 +76,54 @@ public class SettingsController implements DeviceView.SettingsHandler { @Override public void onUsersSelected() { - // TODO Auto-generated method stub + Application.getDataService().getUsers(new BaseAsyncCallback>() { + @Override + public void onSuccess(List result) { + UserProperties userProperties = GWT.create(UserProperties.class); + final ListStore userStore = new ListStore(userProperties.id()); + userStore.addAll(result); + new UsersDialog(userStore, new UsersDialog.UserHandler() { + + @Override + public void onAdd() { + new UserDialog( + new User(), + new UserDialog.UserHandler() { + @Override + public void onSave(User user) { + Application.getDataService().addUser(user, new BaseAsyncCallback() { + @Override + public void onSuccess(User result) { + userStore.add(result); + } + }); + } + }).show(); + } + + @Override + public void onRemove(final User user) { + final ConfirmMessageBox dialog = new ConfirmMessageBox("Confirm", "Are you sure you want remove user?"); + dialog.addHideHandler(new HideEvent.HideHandler() { + @Override + public void onHide(HideEvent event) { + if (dialog.getHideButton() == dialog.getButtonById(PredefinedButton.YES.name())) { + Application.getDataService().removeUser(user, new BaseAsyncCallback() { + @Override + public void onSuccess(User result) { + userStore.remove(user); + } + }); + } + } + }); + dialog.show(); + } + + }).show(); + } + }); } @Override diff --git a/src/org/traccar/web/client/model/DataService.java b/src/org/traccar/web/client/model/DataService.java index 3e64971..2bb7883 100644 --- a/src/org/traccar/web/client/model/DataService.java +++ b/src/org/traccar/web/client/model/DataService.java @@ -37,8 +37,14 @@ public interface DataService extends RemoteService { User register(String login, String password); + List getUsers(); + + User addUser(User user); + User updateUser(User user); + User removeUser(User user); + List getDevices(); Device addDevice(Device device); diff --git a/src/org/traccar/web/client/model/DataServiceAsync.java b/src/org/traccar/web/client/model/DataServiceAsync.java index 559545d..b183063 100644 --- a/src/org/traccar/web/client/model/DataServiceAsync.java +++ b/src/org/traccar/web/client/model/DataServiceAsync.java @@ -35,8 +35,14 @@ public interface DataServiceAsync { void register(String login, String password, AsyncCallback callback); + void getUsers(AsyncCallback> callback); + + void addUser(User user, AsyncCallback callback); + void updateUser(User user, AsyncCallback callback); + void removeUser(User user, AsyncCallback callback); + void getDevices(AsyncCallback> callback); void addDevice(Device device, AsyncCallback callback); diff --git a/src/org/traccar/web/client/view/DeviceView.java b/src/org/traccar/web/client/view/DeviceView.java index 341b508..21d906c 100644 --- a/src/org/traccar/web/client/view/DeviceView.java +++ b/src/org/traccar/web/client/view/DeviceView.java @@ -19,6 +19,7 @@ import java.util.LinkedList; import java.util.List; import org.traccar.web.client.Application; +import org.traccar.web.client.ApplicationContext; import org.traccar.web.client.model.BaseAsyncCallback; import org.traccar.web.client.model.DeviceProperties; import org.traccar.web.shared.model.Device; @@ -39,6 +40,7 @@ import com.sencha.gxt.widget.core.client.grid.ColumnConfig; import com.sencha.gxt.widget.core.client.grid.ColumnModel; import com.sencha.gxt.widget.core.client.grid.Grid; import com.sencha.gxt.widget.core.client.menu.Item; +import com.sencha.gxt.widget.core.client.menu.MenuItem; import com.sencha.gxt.widget.core.client.selection.SelectionChangedEvent; public class DeviceView implements SelectionChangedEvent.SelectionChangedHandler { @@ -82,6 +84,12 @@ public class DeviceView implements SelectionChangedEvent.SelectionChangedHandler @UiField Grid grid; + @UiField + MenuItem settingsUsers; + + @UiField + MenuItem settingsGlobal; + public DeviceView(DeviceHandler deviceHandler, SettingsHandler settingsHandler, ListStore deviceStore) { this.deviceHandler = deviceHandler; this.settingsHandler = settingsHandler; @@ -98,6 +106,11 @@ public class DeviceView implements SelectionChangedEvent.SelectionChangedHandler grid.getSelectionModel().addSelectionChangedHandler(this); grid.getSelectionModel().setSelectionMode(SelectionMode.SINGLE); + + if (ApplicationContext.getInstance().getUser().getAdmin()) { + settingsUsers.enable(); + settingsGlobal.enable(); + } } @Override @@ -155,17 +168,17 @@ public class DeviceView implements SelectionChangedEvent.SelectionChangedHandler settingsHandler.onAccountSelected(); } - @UiHandler("preferencesAccount") + @UiHandler("settingsPreferences") public void onSettingsPreferencesSelected(SelectionEvent event) { settingsHandler.onPreferencesSelected(); } - @UiHandler("usersAccount") + @UiHandler("settingsUsers") public void onSettingsUsersSelected(SelectionEvent event) { settingsHandler.onUsersSelected(); } - @UiHandler("globalAccount") + @UiHandler("settingsGlobal") public void onSettingsGlobalSelected(SelectionEvent event) { settingsHandler.onApplicationSelected(); } diff --git a/src/org/traccar/web/client/view/DeviceView.ui.xml b/src/org/traccar/web/client/view/DeviceView.ui.xml index f612957..38721ca 100644 --- a/src/org/traccar/web/client/view/DeviceView.ui.xml +++ b/src/org/traccar/web/client/view/DeviceView.ui.xml @@ -37,9 +37,9 @@ - - - + + + diff --git a/src/org/traccar/web/client/view/UsersDialog.java b/src/org/traccar/web/client/view/UsersDialog.java new file mode 100644 index 0000000..3da8979 --- /dev/null +++ b/src/org/traccar/web/client/view/UsersDialog.java @@ -0,0 +1,110 @@ +/* + * Copyright 2013 Anton Tananaev (anton.tananaev@gmail.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.traccar.web.client.view; + +import java.util.LinkedList; +import java.util.List; + +import org.traccar.web.client.model.UserProperties; +import org.traccar.web.shared.model.User; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.uibinder.client.UiBinder; +import com.google.gwt.uibinder.client.UiField; +import com.google.gwt.uibinder.client.UiHandler; +import com.google.gwt.user.client.ui.Widget; +import com.sencha.gxt.core.client.Style.SelectionMode; +import com.sencha.gxt.data.shared.ListStore; +import com.sencha.gxt.widget.core.client.Window; +import com.sencha.gxt.widget.core.client.button.TextButton; +import com.sencha.gxt.widget.core.client.event.SelectEvent; +import com.sencha.gxt.widget.core.client.grid.ColumnConfig; +import com.sencha.gxt.widget.core.client.grid.ColumnModel; +import com.sencha.gxt.widget.core.client.grid.Grid; +import com.sencha.gxt.widget.core.client.selection.SelectionChangedEvent; + +public class UsersDialog implements SelectionChangedEvent.SelectionChangedHandler { + + private static UsersDialogUiBinder uiBinder = GWT.create(UsersDialogUiBinder.class); + + interface UsersDialogUiBinder extends UiBinder { + } + + public interface UserHandler { + public void onAdd(); + public void onRemove(User user); + } + + private UserHandler userHandler; + + @UiField + Window window; + + @UiField + TextButton addButton; + + @UiField + TextButton removeButton; + + @UiField(provided = true) + ColumnModel columnModel; + + @UiField(provided = true) + ListStore userStore; + + @UiField + Grid grid; + + public UsersDialog(ListStore userStore, UserHandler userHandler) { + this.userStore = userStore; + this.userHandler = userHandler; + + UserProperties userProperties = GWT.create(UserProperties.class); + + List> columnConfigList = new LinkedList>(); + columnConfigList.add(new ColumnConfig(userProperties.login(), 0, "Name")); + columnConfigList.add(new ColumnConfig(userProperties.admin(), 0, "Administrator")); + columnModel = new ColumnModel(columnConfigList); + + uiBinder.createAndBindUi(this); + + grid.getSelectionModel().addSelectionChangedHandler(this); + grid.getSelectionModel().setSelectionMode(SelectionMode.SINGLE); + } + + public void show() { + window.show(); + } + + public void hide() { + window.hide(); + } + + @Override + public void onSelectionChanged(SelectionChangedEvent event) { + removeButton.setEnabled(!event.getSelection().isEmpty()); + } + @UiHandler("addButton") + public void onAddClicked(SelectEvent event) { + userHandler.onAdd(); + } + + @UiHandler("removeButton") + public void onRemoveClicked(SelectEvent event) { + userHandler.onRemove(grid.getSelectionModel().getSelectedItem()); + } + +} diff --git a/src/org/traccar/web/client/view/UsersDialog.ui.xml b/src/org/traccar/web/client/view/UsersDialog.ui.xml new file mode 100644 index 0000000..2110e76 --- /dev/null +++ b/src/org/traccar/web/client/view/UsersDialog.ui.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/org/traccar/web/server/model/DataServiceImpl.java b/src/org/traccar/web/server/model/DataServiceImpl.java index c2d9f72..663f0e4 100644 --- a/src/org/traccar/web/server/model/DataServiceImpl.java +++ b/src/org/traccar/web/server/model/DataServiceImpl.java @@ -146,6 +146,41 @@ public class DataServiceImpl extends RemoteServiceServlet implements DataService } } + @Override + public List getUsers() { + List users = new LinkedList(); + EntityManager entityManager = entityManagerFactory.createEntityManager(); + try { + users.addAll(entityManager.createQuery("SELECT x FROM User x", User.class).getResultList()); + return users; + } finally { + entityManager.close(); + } + } + + @Override + public User addUser(User user) { + User currentUser = getUser(); + if (currentUser.getAdmin()) { + EntityManager entityManager = entityManagerFactory.createEntityManager(); + try { + entityManager.getTransaction().begin(); + try { + entityManager.persist(user); + entityManager.getTransaction().commit(); + return user; + } catch (RuntimeException e) { + entityManager.getTransaction().rollback(); + throw e; + } + } finally { + entityManager.close(); + } + } else { + throw new SecurityException(); + } + } + @Override public User updateUser(User user) { User currentUser = getUser(); @@ -181,6 +216,30 @@ public class DataServiceImpl extends RemoteServiceServlet implements DataService } } + @Override + public User removeUser(User user) { + User currentUser = getUser(); + if (currentUser.getAdmin()) { + EntityManager entityManager = entityManagerFactory.createEntityManager(); + try { + entityManager.getTransaction().begin(); + try { + user = entityManager.merge(user); + entityManager.remove(user); + entityManager.getTransaction().commit(); + return user; + } catch (RuntimeException e) { + entityManager.getTransaction().rollback(); + throw e; + } + } finally { + entityManager.close(); + } + } else { + throw new SecurityException(); + } + } + private void createUser(User user) { EntityManager entityManager = entityManagerFactory.createEntityManager(); try { diff --git a/src/org/traccar/web/shared/model/User.java b/src/org/traccar/web/shared/model/User.java index f94f884..805c4a6 100644 --- a/src/org/traccar/web/shared/model/User.java +++ b/src/org/traccar/web/shared/model/User.java @@ -87,7 +87,7 @@ public class User implements Serializable, Cloneable { } @GwtTransient - @OneToMany(fetch = FetchType.EAGER) + @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL) private List devices = new LinkedList(); public void setDevices(List devices) { -- cgit v1.2.3