You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openmeetings.apache.org by so...@apache.org on 2018/04/16 16:14:33 UTC

[openmeetings] branch master updated (93717b9 -> 751df91)

This is an automated email from the ASF dual-hosted git repository.

solomax pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/openmeetings.git.


    from 93717b9  Documentation is corrected
     new 86ea725  [OPENMEETINGS-1864] initial code clean-up
     new 839e055  [OPENMEETINGS-1864] logback files are improved
     new 03778f6  [OPENMEETINGS-1864] basic work on display deleted users
     new b403cb0  [OPENMEETINGS-1864] deleted users are somehow displayed
     new b2f6ab1  [OPENMEETINGS-1864] admin users count is fixed
     new 8e07dba  [OPENMEETINGS-1864] admin actions are unified
     new 20d0e1f  [OPENMEETINGS-1864] restore is implemented
     new ec716ba  [OPENMEETINGS-1872] clean plugin version is updated
     new 751df91  [OPENMEETINGS-1864] basic purge is implemented

The 9 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../db/dao/IGroupAdminDataProviderDao.java         |  27 ++++-
 .../apache/openmeetings/db/dao/room/RoomDao.java   |   4 +-
 .../apache/openmeetings/db/dao/user/GroupDao.java  |   4 +-
 .../apache/openmeetings/db/dao/user/UserDao.java   | 118 +++++++++++++++------
 .../openmeetings/db/entity/basic/ChatMessage.java  |   1 +
 .../openmeetings/db/entity/basic/MailMessage.java  |   1 +
 .../openmeetings/service/user/UserManager.java     |   2 +-
 .../org/apache/openmeetings/util/OmFileHelper.java |   6 +-
 .../openmeetings/web/admin/AdminBaseForm.java      |  95 +++++++----------
 .../openmeetings/web/admin/AdminSavePanel.html     |  14 ++-
 .../openmeetings/web/admin/AdminSavePanel.java     |  83 +++++++++++----
 .../web/admin/configurations/ConfigForm.java       |   8 +-
 .../web/admin/configurations/ConfigsPanel.java     |   4 +-
 .../openmeetings/web/admin/email/EmailPanel.html   |   4 +-
 .../openmeetings/web/admin/groups/GroupForm.java   |  24 ++---
 .../web/admin/groups/GroupUsersPanel.html          |   6 +-
 .../openmeetings/web/admin/groups/GroupsPanel.java |   2 +-
 .../openmeetings/web/admin/labels/LabelsForm.java  |   2 +-
 .../openmeetings/web/admin/labels/LangPanel.html   |  44 ++++----
 .../openmeetings/web/admin/labels/LangPanel.java   |   4 +-
 .../openmeetings/web/admin/ldaps/LdapForm.java     |   8 +-
 .../openmeetings/web/admin/ldaps/LdapsPanel.java   |   4 +-
 .../openmeetings/web/admin/oauth/OAuthForm.java    |   8 +-
 .../openmeetings/web/admin/oauth/OAuthPanel.java   |   4 +-
 .../openmeetings/web/admin/rooms/RoomForm.java     |  10 +-
 .../openmeetings/web/admin/rooms/RoomsPanel.html   |  18 +++-
 .../openmeetings/web/admin/rooms/RoomsPanel.java   |   2 +-
 .../openmeetings/web/admin/users/UserForm.html     |   2 +-
 .../openmeetings/web/admin/users/UserForm.java     |  72 +++++++++----
 .../openmeetings/web/admin/users/UsersPanel.java   |  10 +-
 .../apache/openmeetings/web/app/Application.java   |   1 +
 .../web/app/Application.properties.xml             |   2 +
 .../web/common/FormSaveRefreshPanel.html           |   8 +-
 .../web/common/FormSaveRefreshPanel.java           |  34 +++---
 .../openmeetings/web/common/GeneralUserForm.java   |   2 +-
 .../web/data/SearchableGroupAdminDataProvider.java |   8 +-
 .../web/room/sidebar/RoomClientPanel.html          |   4 +-
 .../web/user/calendar/AppointmentDialog.java       |   4 +-
 .../openmeetings/web/user/chat/ChatToolbar.html    |   4 +-
 .../web/user/dashboard/StartWidgetView.java        |   4 +-
 .../openmeetings/web/user/rooms/RoomListPanel.html |   2 +-
 .../main/webapp/WEB-INF/classes/logback-config.xml |   2 +-
 openmeetings-web/src/main/webapp/css/admin.css     | 108 +++++++------------
 openmeetings-web/src/main/webapp/css/calendar.css  |   5 -
 openmeetings-web/src/main/webapp/css/chat.css      |   3 -
 openmeetings-web/src/main/webapp/css/general.css   |  64 +----------
 .../main/webapp/css/images/arrow_refresh_small.png | Bin 506 -> 0 bytes
 .../src/main/webapp/css/images/cancel_icon.png     | Bin 986 -> 0 bytes
 .../src/main/webapp/css/images/plus_icon.png       | Bin 463 -> 0 bytes
 .../main/webapp/css/images/plus_icon_disabled.png  | Bin 411 -> 0 bytes
 openmeetings-web/src/main/webapp/css/room.css      |   6 +-
 .../src/test/resources/logback-test.xml            |   2 +-
 pom.xml                                            |   5 +-
 53 files changed, 454 insertions(+), 405 deletions(-)
 delete mode 100644 openmeetings-web/src/main/webapp/css/images/arrow_refresh_small.png
 delete mode 100644 openmeetings-web/src/main/webapp/css/images/cancel_icon.png
 delete mode 100644 openmeetings-web/src/main/webapp/css/images/plus_icon.png
 delete mode 100644 openmeetings-web/src/main/webapp/css/images/plus_icon_disabled.png

-- 
To stop receiving notification emails like this one, please contact
solomax@apache.org.

[openmeetings] 03/09: [OPENMEETINGS-1864] basic work on display deleted users

Posted by so...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

solomax pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/openmeetings.git

commit 03778f6619be01c89d993f235f4ca0c88c095423
Author: Maxim Solodovnik <so...@gmail.com>
AuthorDate: Thu Apr 12 07:54:19 2018 +0700

    [OPENMEETINGS-1864] basic work on display deleted users
---
 .../db/dao/IGroupAdminDataProviderDao.java         | 27 ++++++++++++++++++++--
 .../apache/openmeetings/db/dao/room/RoomDao.java   |  4 ++--
 .../apache/openmeetings/db/dao/user/GroupDao.java  |  4 ++--
 .../apache/openmeetings/db/dao/user/UserDao.java   |  4 ++--
 .../openmeetings/web/admin/rooms/RoomForm.java     |  2 +-
 .../openmeetings/web/common/GeneralUserForm.java   |  2 +-
 .../web/data/SearchableGroupAdminDataProvider.java |  4 ++--
 7 files changed, 35 insertions(+), 12 deletions(-)

diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/IGroupAdminDataProviderDao.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/IGroupAdminDataProviderDao.java
index 6946af4..504fc7e 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/IGroupAdminDataProviderDao.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/IGroupAdminDataProviderDao.java
@@ -33,7 +33,20 @@ public interface IGroupAdminDataProviderDao<T extends IDataProviderEntity> exten
 	 * @param order - column and sort order
 	 * @return list of instances in the range specified
 	 */
-	List<T> get(String search, Long adminId, int start, int count, String order);
+	List<T> adminGet(String search, Long adminId, int start, int count, String order);
+
+	/**
+	 * Get a list of instances of {@link T}
+	 *
+	 * @param search - string search criteria to filter entities
+	 * @param start - the start to range to retrieve
+	 * @param count - maximum instance count to retrieve
+	 * @param order - column and sort order
+	 * @return list of instances in the range specified
+	 */
+	default List<T> adminGet(String search, int start, int count, String order) {
+		return get(search, start, count, order);
+	}
 
 	/**
 	 * Count the number of instances of {@link T}
@@ -42,5 +55,15 @@ public interface IGroupAdminDataProviderDao<T extends IDataProviderEntity> exten
 	 * @param adminId - id of group admin user
 	 * @return count of instances satisfying given search criteria
 	 */
-	long count(String search, Long adminId);
+	long adminCount(String search, Long adminId);
+
+	/**
+	 * Count the number of instances of {@link T}
+	 *
+	 * @param search - string search criteria to filter entities
+	 * @return count of instances satisfying given search criteria
+	 */
+	default long adminCount(String search) {
+		return count(search);
+	}
 }
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/room/RoomDao.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/room/RoomDao.java
index 0a3d0b1..962eb17 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/room/RoomDao.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/room/RoomDao.java
@@ -136,7 +136,7 @@ public class RoomDao implements IGroupAdminDataProviderDao<Room> {
 	}
 
 	@Override
-	public List<Room> get(String search, Long adminId, int start, int count, String order) {
+	public List<Room> adminGet(String search, Long adminId, int start, int count, String order) {
 		TypedQuery<Room> q = em.createQuery(DaoHelper.getSearchQuery("RoomGroup rg, IN(rg.room)", "r", null, search, true, true, false
 				, "rg.group.id IN (SELECT gu1.group.id FROM GroupUser gu1 WHERE gu1.moderator = true AND gu1.user.id = :adminId)", order, searchFields), Room.class);
 		q.setParameter("adminId", adminId);
@@ -158,7 +158,7 @@ public class RoomDao implements IGroupAdminDataProviderDao<Room> {
 	}
 
 	@Override
-	public long count(String search, Long adminId) {
+	public long adminCount(String search, Long adminId) {
 		TypedQuery<Long> q = em.createQuery(DaoHelper.getSearchQuery("RoomGroup rg, IN(rg.room)", "r", null, search, true, true, true
 				, "rg.group.id IN (SELECT gu1.group.id FROM GroupUser gu1 WHERE gu1.moderator = true AND gu1.user.id = :adminId)", null, searchFields), Long.class);
 		q.setParameter("adminId", adminId);
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/GroupDao.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/GroupDao.java
index c4f2a43..c44966f 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/GroupDao.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/GroupDao.java
@@ -73,7 +73,7 @@ public class GroupDao implements IGroupAdminDataProviderDao<Group> {
 	}
 
 	@Override
-	public List<Group> get(String search, Long adminId, int start, int count, String order) {
+	public List<Group> adminGet(String search, Long adminId, int start, int count, String order) {
 		TypedQuery<Group> q = em.createQuery(DaoHelper.getSearchQuery("GroupUser gu, IN(gu.group)", "g", null, search, true, true, false
 				, "gu.user.id = :adminId AND gu.moderator = true", order, searchFields), Group.class);
 		q.setParameter("adminId", adminId);
@@ -95,7 +95,7 @@ public class GroupDao implements IGroupAdminDataProviderDao<Group> {
 	}
 
 	@Override
-	public long count(String search, Long adminId) {
+	public long adminCount(String search, Long adminId) {
 		TypedQuery<Long> q = em.createQuery(DaoHelper.getSearchQuery("GroupUser gu, IN(gu.group)", "g", null, search, true, true, true
 				, "gu.user.id = :adminId AND gu.moderator = true", null, searchFields), Long.class);
 		q.setParameter("adminId", adminId);
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/UserDao.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/UserDao.java
index 397ba6e..7a36806 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/UserDao.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/UserDao.java
@@ -157,7 +157,7 @@ public class UserDao implements IGroupAdminDataProviderDao<User> {
 	}
 
 	@Override
-	public List<User> get(String search, Long adminId, int start, int count, String order) {
+	public List<User> adminGet(String search, Long adminId, int start, int count, String order) {
 		TypedQuery<User> q = em.createQuery(DaoHelper.getSearchQuery("GroupUser gu, IN(gu.user)", "u", null, search, true, true, false
 				, "gu.group.id IN (SELECT gu1.group.id FROM GroupUser gu1 WHERE gu1.moderator = true AND gu1.user.id = :adminId)", order, searchFields), User.class);
 		q.setParameter("adminId", adminId);
@@ -191,7 +191,7 @@ public class UserDao implements IGroupAdminDataProviderDao<User> {
 	}
 
 	@Override
-	public long count(String search, Long adminId) {
+	public long adminCount(String search, Long adminId) {
 		TypedQuery<Long> q = em.createQuery(DaoHelper.getSearchQuery("GroupUser gu, IN(gu.user)", "u", null, search, true, true, true
 				, "gu.group.id IN (SELECT gu1.group.id FROM GroupUser gu1 WHERE gu1.moderator = true AND gu1.user.id = :adminId)", null, searchFields), Long.class);
 		q.setParameter("adminId", adminId);
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/rooms/RoomForm.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/rooms/RoomForm.java
index ac4d4a0..b225268 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/rooms/RoomForm.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/rooms/RoomForm.java
@@ -162,7 +162,7 @@ public class RoomForm extends AdminBaseForm<Room> {
 		add(new CheckBox("ispublic").setEnabled(!isGroupAdmin));
 
 		List<Group> orgList = isGroupAdmin
-				? groupDao.get(null, getUserId(), 0, Integer.MAX_VALUE, null)
+				? groupDao.adminGet(null, getUserId(), 0, Integer.MAX_VALUE, null)
 				: groupDao.get(0, Integer.MAX_VALUE);
 		final List<RoomGroup> orgRooms = new ArrayList<>(orgList.size());
 		for (Group org : orgList) {
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/GeneralUserForm.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/GeneralUserForm.java
index 62ce1ac..9c2267e 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/GeneralUserForm.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/GeneralUserForm.java
@@ -160,7 +160,7 @@ public class GeneralUserForm extends Form<User> {
 		grpUsers.addAll(u.getGroupUsers());
 		if (isAdminForm) {
 			List<Group> grpList = hasGroupAdminLevel(getRights())
-					? groupDao.get(null, getUserId(), 0, Integer.MAX_VALUE, null)
+					? groupDao.adminGet(null, getUserId(), 0, Integer.MAX_VALUE, null)
 					: groupDao.get(0, Integer.MAX_VALUE);
 			for (Group g : grpList) {
 				GroupUser gu = new GroupUser(g, u);
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/data/SearchableGroupAdminDataProvider.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/data/SearchableGroupAdminDataProvider.java
index 4e65b41..9198c78 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/data/SearchableGroupAdminDataProvider.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/data/SearchableGroupAdminDataProvider.java
@@ -42,14 +42,14 @@ public class SearchableGroupAdminDataProvider<T extends IDataProviderEntity> ext
 	@Override
 	public Iterator<? extends T> iterator(long first, long count) {
 		return (hasGroupAdminLevel(getRights())
-				? getDao().get(search, getUserId(), (int)first, (int)count, getSortStr())
+				? getDao().adminGet(search, getUserId(), (int)first, (int)count, getSortStr())
 				: getDao().get(search, (int)first, (int)count, getSortStr())).iterator();
 	}
 
 	@Override
 	public long size() {
 		return hasGroupAdminLevel(getRights())
-				? getDao().count(search, getUserId())
+				? getDao().adminCount(search, getUserId())
 				: getDao().count(search);
 	}
 }

-- 
To stop receiving notification emails like this one, please contact
solomax@apache.org.

[openmeetings] 04/09: [OPENMEETINGS-1864] deleted users are somehow displayed

Posted by so...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

solomax pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/openmeetings.git

commit b403cb0b63aed99cccc8b4ab55c3ed41d657e667
Author: Maxim Solodovnik <so...@gmail.com>
AuthorDate: Thu Apr 12 23:38:42 2018 +0700

    [OPENMEETINGS-1864] deleted users are somehow displayed
---
 .../apache/openmeetings/db/dao/user/UserDao.java   |  59 ++++++-----
 .../openmeetings/web/admin/AdminBaseForm.java      |  13 +++
 .../web/admin/configurations/ConfigForm.java       |   6 --
 .../openmeetings/web/admin/groups/GroupForm.java   |   5 -
 .../openmeetings/web/admin/ldaps/LdapForm.java     |   6 --
 .../openmeetings/web/admin/oauth/OAuthForm.java    |   6 --
 .../openmeetings/web/admin/rooms/RoomForm.java     |   6 --
 .../openmeetings/web/admin/users/UserForm.java     |  12 +--
 .../openmeetings/web/admin/users/UsersPanel.java   |   6 +-
 .../apache/openmeetings/web/app/Application.java   |   1 +
 .../web/data/SearchableGroupAdminDataProvider.java |   4 +-
 .../web/user/dashboard/StartWidgetView.java        |   4 +-
 openmeetings-web/src/main/webapp/css/admin.css     | 108 ++++++++-------------
 pom.xml                                            |   2 +-
 14 files changed, 103 insertions(+), 135 deletions(-)

diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/UserDao.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/UserDao.java
index 7a36806..fea0529 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/UserDao.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/UserDao.java
@@ -146,19 +146,47 @@ public class UserDao implements IGroupAdminDataProviderDao<User> {
 		}
 	}
 
-	public List<User> get(String search, int start, int count, String sort, boolean filterContacts, Long currentUserId) {
+	private List<User> get(String search, Integer start, Integer count, String order, boolean filterContacts, Long currentUserId, boolean filterDeleted) {
 		Map<String, Object> params = new HashMap<>();
-		TypedQuery<User> q = em.createQuery(DaoHelper.getSearchQuery("User", "u", getAdditionalJoin(filterContacts), search, true, true, false
-				, getAdditionalWhere(filterContacts, currentUserId, params), sort, searchFields), User.class);
-		q.setFirstResult(start);
-		q.setMaxResults(count);
+		TypedQuery<User> q = em.createQuery(DaoHelper.getSearchQuery("User", "u", getAdditionalJoin(filterContacts), search, true, filterDeleted, false
+				, getAdditionalWhere(filterContacts, currentUserId, params), order, searchFields), User.class);
+		if (start != null) {
+			q.setFirstResult(start);
+		}
+		if (count != null) {
+			q.setMaxResults(count);
+		}
 		setAdditionalParams(q, params);
 		return q.getResultList();
 	}
 
+	//This is AdminDao method
+	public List<User> get(String search, boolean excludeContacts, int first, int count) {
+		Map<String, Object> params = new HashMap<>();
+		TypedQuery<User> q = em.createQuery(DaoHelper.getSearchQuery("User", "u", null, search, true, true, false
+				, getAdditionalWhere(excludeContacts, params), null, searchFields), User.class);
+		setAdditionalParams(q, params);
+		q.setFirstResult(first);
+		q.setMaxResults(count);
+		return q.getResultList();
+	}
+
+	public List<User> get(String search, boolean filterContacts, Long currentUserId) {
+		return get(search, null, null, null, filterContacts, currentUserId, true);
+	}
+
+	public List<User> get(String search, int start, int count, String sort, boolean filterContacts, Long currentUserId) {
+		return get(search, start, count, sort, filterContacts, currentUserId, true);
+	}
+
+	@Override
+	public List<User> adminGet(String search, int start, int count, String order) {
+		return get(search, start, count, order, false, null, false);
+	}
+
 	@Override
 	public List<User> adminGet(String search, Long adminId, int start, int count, String order) {
-		TypedQuery<User> q = em.createQuery(DaoHelper.getSearchQuery("GroupUser gu, IN(gu.user)", "u", null, search, true, true, false
+		TypedQuery<User> q = em.createQuery(DaoHelper.getSearchQuery("GroupUser gu, IN(gu.user)", "u", null, search, true, false, false
 				, "gu.group.id IN (SELECT gu1.group.id FROM GroupUser gu1 WHERE gu1.moderator = true AND gu1.user.id = :adminId)", order, searchFields), User.class);
 		q.setParameter("adminId", adminId);
 		q.setFirstResult(start);
@@ -198,25 +226,6 @@ public class UserDao implements IGroupAdminDataProviderDao<User> {
 		return q.getSingleResult();
 	}
 
-	//This is AdminDao method
-	public List<User> get(String search, boolean excludeContacts, int first, int count) {
-		Map<String, Object> params = new HashMap<>();
-		TypedQuery<User> q = em.createQuery(DaoHelper.getSearchQuery("User", "u", null, search, true, true, false
-				, getAdditionalWhere(excludeContacts, params), null, searchFields), User.class);
-		setAdditionalParams(q, params);
-		q.setFirstResult(first);
-		q.setMaxResults(count);
-		return q.getResultList();
-	}
-
-	public List<User> get(String search, boolean filterContacts, Long currentUserId) {
-		Map<String, Object> params = new HashMap<>();
-		TypedQuery<User> q = em.createQuery(DaoHelper.getSearchQuery("User", "u", getAdditionalJoin(filterContacts), search, true, true, false
-				, getAdditionalWhere(filterContacts, currentUserId, params), null, searchFields), User.class);
-		setAdditionalParams(q, params);
-		return q.getResultList();
-	}
-
 	@Override
 	public User update(User u, Long userId) {
 		if (u.getId() == null) {
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/AdminBaseForm.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/AdminBaseForm.java
index 3273d1f..ef850fb 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/AdminBaseForm.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/AdminBaseForm.java
@@ -19,9 +19,11 @@
 package org.apache.openmeetings.web.admin;
 
 import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.ajax.form.AjaxFormValidatingBehavior;
 import org.apache.wicket.core.request.handler.IPartialPageRequestHandler;
 import org.apache.wicket.markup.html.form.Form;
 import org.apache.wicket.model.IModel;
+import org.apache.wicket.util.time.Duration;
 
 /**
  * provides basic functionality to insert, update, remove, refresh record in
@@ -34,6 +36,8 @@ import org.apache.wicket.model.IModel;
 public abstract class AdminBaseForm<T> extends Form<T> {
 	private static final long serialVersionUID = 1L;
 	private AdminSavePanel<T> savePanel;
+	protected final AjaxFormValidatingBehavior validationBehavior
+			= new AjaxFormValidatingBehavior("keydown", Duration.ONE_SECOND);
 
 	public AdminBaseForm(String id, IModel<T> object) {
 		super(id, object);
@@ -94,6 +98,15 @@ public abstract class AdminBaseForm<T> extends Form<T> {
 		add(savePanel);
 	}
 
+	@Override
+	protected void onInitialize() {
+		super.onInitialize();
+
+		// attach an ajax validation behavior to all form component's keydown
+		// event and throttle it down to once per second
+		add(validationBehavior);
+	}
+
 	/**
 	 * @see AdminBaseForm#hideNewRecord()
 	 */
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/configurations/ConfigForm.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/configurations/ConfigForm.java
index 66d877c..7b1b132 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/configurations/ConfigForm.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/configurations/ConfigForm.java
@@ -29,7 +29,6 @@ import org.apache.openmeetings.web.app.WebSession;
 import org.apache.openmeetings.web.util.DateLabel;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
-import org.apache.wicket.ajax.form.AjaxFormValidatingBehavior;
 import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.markup.html.form.CheckBox;
@@ -43,7 +42,6 @@ import org.apache.wicket.model.CompoundPropertyModel;
 import org.apache.wicket.model.IModel;
 import org.apache.wicket.model.Model;
 import org.apache.wicket.spring.injection.annot.SpringBean;
-import org.apache.wicket.util.time.Duration;
 import org.apache.wicket.validation.IValidatable;
 import org.apache.wicket.validation.IValidator;
 import org.apache.wicket.validation.ValidationError;
@@ -81,10 +79,6 @@ public class ConfigForm extends AdminBaseForm<Configuration> {
 		add(new Label("user.login"));
 		add(new TextArea<String>("comment"));
 		update(null);
-
-		// attach an ajax validation behavior to all form component's keydown
-		// event and throttle it down to once per second
-		add(new AjaxFormValidatingBehavior("keydown", Duration.ONE_SECOND));
 	}
 
 	private void refresh(AjaxRequestTarget target) {
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/groups/GroupForm.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/groups/GroupForm.java
index a6a5701..388b958 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/groups/GroupForm.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/groups/GroupForm.java
@@ -38,7 +38,6 @@ import org.apache.openmeetings.web.admin.AdminUserChoiceProvider;
 import org.apache.openmeetings.web.common.UploadableImagePanel;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
-import org.apache.wicket.ajax.form.AjaxFormValidatingBehavior;
 import org.apache.wicket.ajax.markup.html.form.AjaxCheckBox;
 import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.markup.html.form.CheckBox;
@@ -49,7 +48,6 @@ import org.apache.wicket.markup.html.form.TextField;
 import org.apache.wicket.model.CompoundPropertyModel;
 import org.apache.wicket.model.Model;
 import org.apache.wicket.spring.injection.annot.SpringBean;
-import org.apache.wicket.util.time.Duration;
 import org.wicketstuff.select2.Select2Choice;
 
 public class GroupForm extends AdminBaseForm<Group> {
@@ -132,9 +130,6 @@ public class GroupForm extends AdminBaseForm<Group> {
 				}
 			}
 		});
-		// attach an ajax validation behavior to all form component's keydown
-		// event and throttle it down to once per second
-		add(new AjaxFormValidatingBehavior("keydown", Duration.ONE_SECOND));
 	}
 
 	static String formatUser(User choice) {
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/ldaps/LdapForm.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/ldaps/LdapForm.java
index 05ed843..a305eab 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/ldaps/LdapForm.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/ldaps/LdapForm.java
@@ -24,7 +24,6 @@ import org.apache.openmeetings.web.admin.AdminBaseForm;
 import org.apache.openmeetings.web.app.WebSession;
 import org.apache.openmeetings.web.util.DateLabel;
 import org.apache.wicket.ajax.AjaxRequestTarget;
-import org.apache.wicket.ajax.form.AjaxFormValidatingBehavior;
 import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.markup.html.form.CheckBox;
@@ -35,7 +34,6 @@ import org.apache.wicket.markup.html.form.TextField;
 import org.apache.wicket.model.CompoundPropertyModel;
 import org.apache.wicket.model.Model;
 import org.apache.wicket.spring.injection.annot.SpringBean;
-import org.apache.wicket.util.time.Duration;
 
 /**
  * Form components to insert/update/delete {@link LdapConfig}
@@ -62,10 +60,6 @@ public class LdapForm extends AdminBaseForm<LdapConfig> {
 		add(new CheckBox("addDomainToUserName"));
 		add(new TextField<String>("domain"));
 		add(new TextArea<String>("comment"));
-
-		// attach an ajax validation behavior to all form component's keydown
-		// event and throttle it down to once per second
-		add(new AjaxFormValidatingBehavior("keydown", Duration.ONE_SECOND));
 	}
 
 	@Override
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/oauth/OAuthForm.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/oauth/OAuthForm.java
index bb45bd8..0320683 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/oauth/OAuthForm.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/oauth/OAuthForm.java
@@ -28,7 +28,6 @@ import org.apache.openmeetings.db.entity.server.OAuthServer;
 import org.apache.openmeetings.db.entity.server.OAuthServer.RequestMethod;
 import org.apache.openmeetings.web.admin.AdminBaseForm;
 import org.apache.wicket.ajax.AjaxRequestTarget;
-import org.apache.wicket.ajax.form.AjaxFormValidatingBehavior;
 import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.markup.html.form.CheckBox;
 import org.apache.wicket.markup.html.form.ChoiceRenderer;
@@ -39,7 +38,6 @@ import org.apache.wicket.markup.html.form.TextField;
 import org.apache.wicket.model.CompoundPropertyModel;
 import org.apache.wicket.model.Model;
 import org.apache.wicket.spring.injection.annot.SpringBean;
-import org.apache.wicket.util.time.Duration;
 
 public class OAuthForm extends AdminBaseForm<OAuthServer> {
 	private static final long serialVersionUID = 1L;
@@ -55,10 +53,6 @@ public class OAuthForm extends AdminBaseForm<OAuthServer> {
 
 		add(new CheckBox("isEnabled"));
 		add(new DropDownChoice<>("requestTokenMethod", Arrays.asList(RequestMethod.values()), new ChoiceRenderer<RequestMethod>("name", "name")));
-
-		// attach an ajax validation behavior to all form component's keydown
-		// event and throttle it down to once per second
-		add(new AjaxFormValidatingBehavior("keydown", Duration.ONE_SECOND));
 	}
 
 	@Override
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/rooms/RoomForm.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/rooms/RoomForm.java
index b225268..2801f7c 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/rooms/RoomForm.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/rooms/RoomForm.java
@@ -55,7 +55,6 @@ import org.apache.openmeetings.web.util.RoomTypeDropDown;
 import org.apache.wicket.AttributeModifier;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
-import org.apache.wicket.ajax.form.AjaxFormValidatingBehavior;
 import org.apache.wicket.ajax.markup.html.form.AjaxCheckBox;
 import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.markup.html.basic.Label;
@@ -75,7 +74,6 @@ import org.apache.wicket.model.PropertyModel;
 import org.apache.wicket.model.util.CollectionModel;
 import org.apache.wicket.spring.injection.annot.SpringBean;
 import org.apache.wicket.util.string.Strings;
-import org.apache.wicket.util.time.Duration;
 import org.wicketstuff.select2.ChoiceProvider;
 import org.wicketstuff.select2.Response;
 import org.wicketstuff.select2.Select2Choice;
@@ -421,10 +419,6 @@ public class RoomForm extends AdminBaseForm<Room> {
 				updateView(target);
 			}
 		}.setOutputMarkupId(true));
-
-		// attach an ajax validation behavior to all form component's keydown
-		// event and throttle it down to once per second
-		add(new AjaxFormValidatingBehavior("keydown", Duration.ONE_SECOND));
 	}
 
 	void updateClients(AjaxRequestTarget target) {
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/UserForm.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/UserForm.java
index 880c411..fbd6e17 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/UserForm.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/UserForm.java
@@ -53,7 +53,6 @@ import org.apache.openmeetings.web.common.GeneralUserForm;
 import org.apache.openmeetings.web.util.DateLabel;
 import org.apache.openmeetings.web.util.RestrictiveChoiceProvider;
 import org.apache.wicket.ajax.AjaxRequestTarget;
-import org.apache.wicket.ajax.form.AjaxFormValidatingBehavior;
 import org.apache.wicket.ajax.form.OnChangeAjaxBehavior;
 import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.markup.html.basic.Label;
@@ -69,7 +68,6 @@ import org.apache.wicket.model.CompoundPropertyModel;
 import org.apache.wicket.model.Model;
 import org.apache.wicket.spring.injection.annot.SpringBean;
 import org.apache.wicket.util.string.Strings;
-import org.apache.wicket.util.time.Duration;
 import org.danekja.java.util.function.serializable.SerializableConsumer;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -174,16 +172,18 @@ public class UserForm extends AdminBaseForm<User> {
 			}
 		}));
 		add(new ComunityUserForm("comunity", getModel()));
-
-		// attach an ajax validation behavior to all form component's keydown
-		// event and throttle it down to once per second
-		add(new AjaxFormValidatingBehavior("keydown", Duration.ONE_SECOND));
 		add(adminPass);
 	}
 
 	@Override
 	protected void onModelChanged() {
 		super.onModelChanged();
+		setEnabled(!getModelObject().isDeleted());
+		if (getModelObject().isDeleted()) {
+			remove(validationBehavior);
+		} else {
+			add(validationBehavior);
+		}
 		password.setModelObject(null);
 		generalForm.updateModelObject(getModelObject(), true);
 		passValidator.setUser(getModelObject());
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/UsersPanel.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/UsersPanel.java
index 38794c2..d10f919 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/UsersPanel.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/UsersPanel.java
@@ -77,7 +77,11 @@ public class UsersPanel extends AdminBasePanel {
 						form.update(target);
 					}
 				});
-				item.add(AttributeModifier.append(ATTR_CLASS, getRowClass(u.getId(), form.getModelObject().getId())));
+				StringBuilder cl = getRowClass(u.getId(), form.getModelObject().getId());
+				if (u.isDeleted()) {
+					cl.append(" deleted");
+				}
+				item.add(AttributeModifier.append(ATTR_CLASS, cl));
 			}
 		};
 		add(listContainer.add(dataView).setOutputMarkupId(true));
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java
index 2c67458..9f5f530 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java
@@ -269,6 +269,7 @@ public class Application extends AuthenticatedWebApplication implements IApplica
 
 		getRootRequestMapperAsCompound().add(new NoVersionMapper(getHomePage()));
 		getRootRequestMapperAsCompound().add(new NoVersionMapper(NOTINIT_MAPPING, NotInitedPage.class));
+		getRootRequestMapperAsCompound().add(new NoVersionMapper("denied", AccessDeniedPage.class));
 		getRootRequestMapperAsCompound().add(new NoVersionMapper(HASH_MAPPING, HashPage.class));
 		getRootRequestMapperAsCompound().add(new NoVersionMapper(SIGNIN_MAPPING, getSignInPageClass()));
 		getRootRequestMapperAsCompound().add(new NoVersionMapper("oauth/${oauthid}", getSignInPageClass()));
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/data/SearchableGroupAdminDataProvider.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/data/SearchableGroupAdminDataProvider.java
index 9198c78..af12e51 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/data/SearchableGroupAdminDataProvider.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/data/SearchableGroupAdminDataProvider.java
@@ -43,13 +43,13 @@ public class SearchableGroupAdminDataProvider<T extends IDataProviderEntity> ext
 	public Iterator<? extends T> iterator(long first, long count) {
 		return (hasGroupAdminLevel(getRights())
 				? getDao().adminGet(search, getUserId(), (int)first, (int)count, getSortStr())
-				: getDao().get(search, (int)first, (int)count, getSortStr())).iterator();
+				: getDao().adminGet(search, (int)first, (int)count, getSortStr())).iterator();
 	}
 
 	@Override
 	public long size() {
 		return hasGroupAdminLevel(getRights())
 				? getDao().adminCount(search, getUserId())
-				: getDao().count(search);
+				: getDao().adminCount(search);
 	}
 }
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/dashboard/StartWidgetView.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/dashboard/StartWidgetView.java
index 5d801de..f7caad7 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/dashboard/StartWidgetView.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/dashboard/StartWidgetView.java
@@ -22,6 +22,7 @@ import static org.apache.openmeetings.web.common.BasePanel.EVT_CLICK;
 import static org.apache.openmeetings.web.util.OmUrlFragment.CALENDAR;
 import static org.apache.openmeetings.web.util.OmUrlFragment.ROOMS_PUBLIC;
 
+import org.apache.openmeetings.web.app.Application;
 import org.apache.openmeetings.web.pages.MainPage;
 import org.apache.wicket.ajax.AjaxEventBehavior;
 import org.apache.wicket.ajax.AjaxRequestTarget;
@@ -46,7 +47,8 @@ public class StartWidgetView extends WidgetView {
 		add(new WebMarkupContainer("step2").add(new PublicRoomsEventBehavior()));
 		add(new WebMarkupContainer("step3").add(new PublicRoomsEventBehavior()));
 		add(new WebMarkupContainer("step4").add(new PublicRoomsEventBehavior()));
-		add(new Label("123msg", getString("widget.start.desc")).setEscapeModelStrings(false));
+		add(new Label("123msg", Application.getString("widget.start.desc")) //Application here is used to substitute {0}
+				.setEscapeModelStrings(false));
 		add(new Button("start").add(new PublicRoomsEventBehavior()));
 		add(new Button("calendar").add(new AjaxEventBehavior(EVT_CLICK) {
 			private static final long serialVersionUID = 1L;
diff --git a/openmeetings-web/src/main/webapp/css/admin.css b/openmeetings-web/src/main/webapp/css/admin.css
index 91323fb..a863b4e 100644
--- a/openmeetings-web/src/main/webapp/css/admin.css
+++ b/openmeetings-web/src/main/webapp/css/admin.css
@@ -28,168 +28,136 @@
 	display: inline-block;
 	vertical-align: top;
 }
-
-table.adminListTable {
+.adminListTable {
 	max-width: 518px;
 	min-width: 518px;
 }
-
-table.adminListTable tr:nth-child(odd), table.adminListTableSmall tr:nth-child(odd) {
+.adminListTable tr:nth-child(odd), .adminListTableSmall tr:nth-child(odd) {
 	opacity: .8;
 }
-
-table.adminListTable tr:hover, table.adminListTableSmall tr:hover, .room-row:hover {
+.adminListTable tr.deleted {
+	background-image: repeating-linear-gradient(-45deg, transparent, transparent 5px, /* gap */ #cccccc 6px, /* overall width incluing gap */ #cccccc 6px);
+}
+.adminListTable tr:hover, .adminListTableSmall tr:hover, .room-row:hover {
 	/*SHOULD BE MANUALLY IN SYNC WITH THEME .ui-state-hover */
 	border: 1px solid #74b2e2;
-	background: #e4f1fb;
+	background-color: #e4f1fb;
 	font-weight: normal;
 	color: #0070a3;
 }
-
-table.adminListTable th.two_column_layout_column1 {
+.adminListTable th.two_column_layout_column1 {
 	width: 136px;
 }
-
-table.adminListTable th.two_column_layout_column2 {
+.adminListTable th.two_column_layout_column2 {
 	width: 354px;
 }
-
-table.adminListTable td.two_column_layout_column1 {
+.adminListTable td.two_column_layout_column1 {
 	width: 136px;
 }
-
-table.adminListTable td.two_column_layout_column2 {
+.adminListTable td.two_column_layout_column2 {
 	width: 354px;
 }
-
-table.adminListTable td div.two_column_layout_divcolumn1 {
+.adminListTable td div.two_column_layout_divcolumn1 {
 	word-wrap: break-word;
 	width: 136px;
 }
-
-table.adminListTable td div.two_column_layout_divcolumn2 {
+.adminListTable td div.two_column_layout_divcolumn2 {
 	word-wrap: break-word;
 	width: 354px;
 }
-
-table.adminListTable th.three_column_layout_column1 {
+.adminListTable th.three_column_layout_column1 {
 	width: 96px;
 }
-
-table.adminListTable th.three_column_layout_column2 {
+.adminListTable th.three_column_layout_column2 {
 	width: 150px;
 }
-
-table.adminListTable th.three_column_layout_column3 {
+.adminListTable th.three_column_layout_column3 {
 	width: 244px;
 }
-
-.rooms table.adminListTable th.three_column_layout_column1 {
+.rooms .adminListTable th.three_column_layout_column1 {
 	width: 46px;
 }
-
-.rooms table.adminListTable th.three_column_layout_column2 {
+.rooms .adminListTable th.three_column_layout_column2 {
 	width: 370px;
 }
-
-.rooms table.adminListTable th.three_column_layout_column3 {
+.rooms .adminListTable th.three_column_layout_column3 {
 	width: 74px;
 }
-
-table.adminListTableSmall th.three_column_layout_column1 {
+.adminListTableSmall th.three_column_layout_column1 {
 	width: 50px;
 }
-
-table.adminListTableSmall th.three_column_layout_column2 {
+.adminListTableSmall th.three_column_layout_column2 {
 	width: 50px;
 }
-
-table.adminListTableSmall th.three_column_layout_column3 {
+.adminListTableSmall th.three_column_layout_column3 {
 	width: 218px;
 }
-table.adminListTableSmall th.three_column_layout_column4 {
+.adminListTableSmall th.three_column_layout_column4 {
 	width: 150px;
 }
-table.adminListTableSmall th.three_column_layout_column5 {
+.adminListTableSmall th.three_column_layout_column5 {
 	width: 50px;
 }
-
-table.adminListTable td.three_column_layout_column1 {
+.adminListTable td.three_column_layout_column1 {
 	width: 96px;
 }
-
-table.adminListTable td.three_column_layout_column2 {
+.adminListTable td.three_column_layout_column2 {
 	width: 150px;
 }
-
-table.adminListTable td.three_column_layout_column3 {
+.adminListTable td.three_column_layout_column3 {
 	width: 244px;
 }
-
-table.adminListTableSmall td.three_column_layout_column1 {
+.adminListTableSmall td.three_column_layout_column1 {
 	width: 50px;
 }
-
-table.adminListTableSmall td.three_column_layout_column2 {
+.adminListTableSmall td.three_column_layout_column2 {
 	width: 50px;
 }
-
-table.adminListTableSmall td.three_column_layout_column3 {
+.adminListTableSmall td.three_column_layout_column3 {
 	width: 218px;
 }
-table.adminListTableSmall td.three_column_layout_column4 {
+.adminListTableSmall td.three_column_layout_column4 {
 	width: 150px;
 }
-table.adminListTableSmall td.three_column_layout_column5 {
+.adminListTableSmall td.three_column_layout_column5 {
 	width: 50px;
 }
-
-table.adminListTable td div.three_column_layout_divcolumn1 {
+.adminListTable td div.three_column_layout_divcolumn1 {
 	word-wrap: break-word;
 	width: 96px;
 }
-
-table.adminListTable td div.three_column_layout_divcolumn2 {
+.adminListTable td div.three_column_layout_divcolumn2 {
 	word-wrap: break-word;
 	width: 150px;
 }
-
-table.adminListTable td div.three_column_layout_divcolumn3 {
+.adminListTable td div.three_column_layout_divcolumn3 {
 	word-wrap: break-word;
 	width: 244px;
 }
-
-.rooms table.adminListTable td div.three_column_layout_divcolumn1 {
+.rooms .adminListTable td div.three_column_layout_divcolumn1 {
 	word-wrap: break-word;
 	width: 44px;
 }
-
-.rooms table.adminListTable td div.three_column_layout_divcolumn2 {
+.rooms .adminListTable td div.three_column_layout_divcolumn2 {
 	word-wrap: break-word;
 	width: 382px;
 }
-
-.rooms table.adminListTable td div.three_column_layout_divcolumn3 {
+.rooms .adminListTable td div.three_column_layout_divcolumn3 {
 	word-wrap: break-word;
 	width: 74px;
 }
-
 table.adminListTableSmall td div.three_column_layout_divcolumn1 {
 	width: 50px;
 }
-
 table.adminListTableSmall td div.three_column_layout_divcolumn2 {
 	width: 50px;
 }
-
 table.adminListTableSmall td div.three_column_layout_divcolumn3 {
 	width: 218px;
 }
-
 table.adminListTableSmall td div.three_column_layout_divcolumn4 {
 	width: 150px;
 }
-
 table.adminListTableSmall td div.three_column_layout_divcolumn5 {
 	width: 50px;
 }
diff --git a/pom.xml b/pom.xml
index db382dd..ad6e61d 100644
--- a/pom.xml
+++ b/pom.xml
@@ -51,7 +51,7 @@
 		<reflow-skin.version>1.3.6</reflow-skin.version>
 		<maven-compiler-plugin.version>3.7.0</maven-compiler-plugin.version>
 		<maven-project-info-reports-plugin.version>2.9</maven-project-info-reports-plugin.version>
-		<maven-jar-plugin.version>3.0.2</maven-jar-plugin.version>
+		<maven-jar-plugin.version>3.1.0</maven-jar-plugin.version>
 		<maven-assembly-plugin.version>3.1.0</maven-assembly-plugin.version>
 		<maven-dependency-plugin.version>3.0.2</maven-dependency-plugin.version>
 		<maven-bundle-plugin.version>3.5.0</maven-bundle-plugin.version>

-- 
To stop receiving notification emails like this one, please contact
solomax@apache.org.

[openmeetings] 06/09: [OPENMEETINGS-1864] admin actions are unified

Posted by so...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

solomax pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/openmeetings.git

commit 8e07dbab160c3381b2f85cbbb4e638b5248e8720
Author: Maxim Solodovnik <so...@gmail.com>
AuthorDate: Sun Apr 15 12:25:13 2018 +0700

    [OPENMEETINGS-1864] admin actions are unified
---
 .../openmeetings/web/admin/AdminBaseForm.java      |  28 +++--------
 .../openmeetings/web/admin/AdminSavePanel.html     |  14 +++++-
 .../openmeetings/web/admin/AdminSavePanel.java     |  26 ++++------
 .../web/admin/configurations/ConfigForm.java       |   2 +-
 .../web/admin/configurations/ConfigsPanel.java     |   4 +-
 .../openmeetings/web/admin/email/EmailPanel.html   |   4 +-
 .../openmeetings/web/admin/groups/GroupForm.java   |   8 +--
 .../web/admin/groups/GroupUsersPanel.html          |   6 ++-
 .../openmeetings/web/admin/groups/GroupsPanel.java |   2 +-
 .../openmeetings/web/admin/labels/LabelsForm.java  |   2 +-
 .../openmeetings/web/admin/labels/LangPanel.html   |   4 +-
 .../openmeetings/web/admin/labels/LangPanel.java   |   4 +-
 .../openmeetings/web/admin/ldaps/LdapForm.java     |   2 +-
 .../openmeetings/web/admin/ldaps/LdapsPanel.java   |   4 +-
 .../openmeetings/web/admin/oauth/OAuthForm.java    |   2 +-
 .../openmeetings/web/admin/oauth/OAuthPanel.java   |   4 +-
 .../openmeetings/web/admin/rooms/RoomForm.java     |   2 +-
 .../openmeetings/web/admin/rooms/RoomsPanel.html   |  18 +++++--
 .../openmeetings/web/admin/rooms/RoomsPanel.java   |   2 +-
 .../openmeetings/web/admin/users/UserForm.html     |   2 +-
 .../openmeetings/web/admin/users/UserForm.java     |  37 +++++++-------
 .../openmeetings/web/admin/users/UsersPanel.java   |   4 +-
 .../web/common/FormSaveRefreshPanel.html           |   8 +--
 .../web/common/FormSaveRefreshPanel.java           |  17 +++++--
 .../web/room/sidebar/RoomClientPanel.html          |   4 +-
 .../web/user/calendar/AppointmentDialog.java       |   4 +-
 .../openmeetings/web/user/chat/ChatToolbar.html    |   4 +-
 .../openmeetings/web/user/rooms/RoomListPanel.html |   2 +-
 openmeetings-web/src/main/webapp/css/calendar.css  |   5 --
 openmeetings-web/src/main/webapp/css/chat.css      |   3 --
 openmeetings-web/src/main/webapp/css/general.css   |  55 +--------------------
 .../main/webapp/css/images/arrow_refresh_small.png | Bin 506 -> 0 bytes
 .../src/main/webapp/css/images/cancel_icon.png     | Bin 986 -> 0 bytes
 .../src/main/webapp/css/images/plus_icon.png       | Bin 463 -> 0 bytes
 .../main/webapp/css/images/plus_icon_disabled.png  | Bin 411 -> 0 bytes
 openmeetings-web/src/main/webapp/css/room.css      |   6 +--
 36 files changed, 121 insertions(+), 168 deletions(-)

diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/AdminBaseForm.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/AdminBaseForm.java
index ef850fb..c6f300c 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/AdminBaseForm.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/AdminBaseForm.java
@@ -84,16 +84,6 @@ public abstract class AdminBaseForm<T> extends Form<T> {
 			protected void onDeleteError(AjaxRequestTarget target, Form<?> form) {
 				AdminBaseForm.this.onDeleteError(target, form);
 			}
-
-			@Override
-			protected boolean isNewBtnVisible() {
-				return AdminBaseForm.this.isNewBtnVisible();
-			}
-
-			@Override
-			protected boolean isDelBtnVisible() {
-				return AdminBaseForm.this.isDelBtnVisible();
-			}
 		};
 		add(savePanel);
 	}
@@ -107,22 +97,16 @@ public abstract class AdminBaseForm<T> extends Form<T> {
 		add(validationBehavior);
 	}
 
-	/**
-	 * @see AdminBaseForm#hideNewRecord()
-	 */
-	public void hideNewRecord() {
-		savePanel.hideNewRecord();
+	public void setNewVisible(boolean visible) {
+		savePanel.setNewVisible(visible);
 	}
 
-	/**
-	 * @see AdminBaseForm#showNewRecord()
-	 */
-	public void showNewRecord() {
-		savePanel.showNewRecord();
+	public void setDelVisible(boolean visible) {
+		savePanel.setDelVisible(visible);
 	}
 
-	protected boolean isNewBtnVisible() {
-		return true;
+	public void setSaveVisible(boolean visible) {
+		savePanel.setSaveVisible(visible);
 	}
 
 	protected boolean isDelBtnVisible() {
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/AdminSavePanel.html b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/AdminSavePanel.html
index 875191b..6f79aca 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/AdminSavePanel.html
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/AdminSavePanel.html
@@ -20,8 +20,18 @@
 -->
 <html xmlns:wicket="http://wicket.apache.org">
 	<wicket:extend>
-		<div class="formNewButton" wicket:id="ajax-new-button" wicket:message="title:155"></div>
-		<div class="formCancelButton" wicket:id="ajax-cancel-button" wicket:message="title:157"></div>
+		<div class="ui-button ui-widget ui-corner-all ui-button-icon-only" wicket:id="ajax-new-button" wicket:message="title:155">
+			<span class="ui-button-icon ui-icon ui-icon-plusthick"></span>&nbsp;
+		</div>
+		<div class="ui-button ui-widget ui-corner-all ui-button-icon-only ui-state-highlight" wicket:id="ajax-cancel-button" wicket:message="title:157">
+			<span class="ui-button-icon ui-icon ui-icon-closethick"></span>&nbsp;
+		</div>
+		<div class="ui-button ui-widget ui-corner-all ui-button-icon-only ui-state-error">
+			<span class="ui-button-icon ui-icon ui-icon-trash"></span>&nbsp;
+		</div>
+		<div class="ui-button ui-widget ui-corner-all ui-button-icon-only">
+			<span class="ui-button-icon ui-icon ui-icon-circle-check"></span>&nbsp;
+		</div>
 		<span wicket:id="newRecord"></span>
 		<form wicket:id="form"></form>
 	</wicket:extend>
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/AdminSavePanel.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/AdminSavePanel.java
index 109e9b5..867a06c 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/AdminSavePanel.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/AdminSavePanel.java
@@ -30,6 +30,7 @@ public abstract class AdminSavePanel<T> extends FormSaveRefreshPanel<T> {
 	private static final long serialVersionUID = 1L;
 	private final Label newRecord = new Label("newRecord", Model.of(""));
 	private final Form<T> form;
+	private ConfirmableAjaxBorder delBtn;
 
 	public AdminSavePanel(String id, final Form<T> form) {
 		super(id, form);
@@ -64,14 +65,14 @@ public abstract class AdminSavePanel<T> extends FormSaveRefreshPanel<T> {
 		final Form<?> cForm = new Form<>("form");
 		cForm.setMultiPart(form.isMultiPart());
 		add(cForm);
-		final ConfirmableAjaxBorder delBtn = new ConfirmableAjaxBorder("ajax-cancel-button", getString("80"), getString("833"), cForm) {
+		delBtn = new ConfirmableAjaxBorder("ajax-cancel-button", getString("80"), getString("833"), cForm) {
 			private static final long serialVersionUID = 1L;
 
 			@Override
 			protected void onError(AjaxRequestTarget target) {
 				// repaint the feedback panel so errors are shown
 				target.add(feedback);
-				hideNewRecord();
+				setNewVisible(false);
 				onDeleteError(target, form);
 			}
 
@@ -79,32 +80,23 @@ public abstract class AdminSavePanel<T> extends FormSaveRefreshPanel<T> {
 			protected void onSubmit(AjaxRequestTarget target) {
 				// repaint the feedback panel so that it is hidden
 				target.add(feedback);
-				hideNewRecord();
+				setNewVisible(false);
 				onDeleteSubmit(target, form);
 			}
 		};
-		add(newBtn.setVisible(isNewBtnVisible()), delBtn.setVisible(isDelBtnVisible()));
+		add(newBtn, delBtn);
 		super.onInitialize();
 	}
 
-	/**
-	 * Hide the new record text
-	 */
 	@Override
-	public void hideNewRecord() {
-		newRecord.setVisible(false);
+	public void setNewVisible(boolean visible) {
+		newRecord.setVisible(visible);
 	}
 
-	/**
-	 * Hide the new record text
-	 */
-	public void showNewRecord() {
-		newRecord.setVisible(true);
+	public void setDelVisible(boolean visible) {
+		delBtn.setVisible(visible);
 	}
 
-	protected abstract boolean isNewBtnVisible();
-	protected abstract boolean isDelBtnVisible();
-
 	protected abstract void onNewSubmit(AjaxRequestTarget target, Form<?> form);
 	protected abstract void onNewError(AjaxRequestTarget target, Form<?> form);
 
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/configurations/ConfigForm.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/configurations/ConfigForm.java
index 7b1b132..42ad377 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/configurations/ConfigForm.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/configurations/ConfigForm.java
@@ -158,7 +158,7 @@ public class ConfigForm extends AdminBaseForm<Configuration> {
 			getModelObject().setId(c.getId());
 		}
 		setModelObject(cfgDao.update(getModelObject(), WebSession.getUserId()));
-		hideNewRecord();
+		setNewVisible(false);
 		target.add(listContainer);
 		refresh(target);
 	}
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/configurations/ConfigsPanel.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/configurations/ConfigsPanel.java
index 21f23c8..f5ca110 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/configurations/ConfigsPanel.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/configurations/ConfigsPanel.java
@@ -67,7 +67,7 @@ public class ConfigsPanel extends AdminBasePanel {
 
 					@Override
 					protected void onEvent(AjaxRequestTarget target) {
-						form.hideNewRecord();
+						form.setNewVisible(false);
 						form.setModelObject(c);
 						target.add(form, listContainer);
 						reinitJs(target);
@@ -93,7 +93,7 @@ public class ConfigsPanel extends AdminBasePanel {
 		add(navigator);
 
 		form = new ConfigForm("form", listContainer, new Configuration());
-		form.showNewRecord();
+		form.setNewVisible(true);
 		add(form);
 		super.onInitialize();
 	}
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/email/EmailPanel.html b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/email/EmailPanel.html
index 05888b8..6fe4935 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/email/EmailPanel.html
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/email/EmailPanel.html
@@ -46,7 +46,9 @@
 	<div class="adminPanelColumnForm">
 		<form wicket:id="form" class="adminForm">
 			<div class="formSaveBar ui-widget-header">
-				<div class="formCancelButton" wicket:id="ajax-cancel-button" wicket:message="title:157"></div>
+				<div class="ui-button ui-widget ui-corner-all ui-button-icon-only ui-state-error" wicket:id="ajax-cancel-button" wicket:message="title:157">
+					<span class="ui-button-icon ui-icon ui-icon-closethick"></span>&nbsp;
+				</div>
 			</div>
 			<div class="scrollcontent" id="adminForm">
 				<fieldset class="ui-widget-content">
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/groups/GroupForm.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/groups/GroupForm.java
index 388b958..4cc8aae 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/groups/GroupForm.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/groups/GroupForm.java
@@ -137,11 +137,6 @@ public class GroupForm extends AdminBaseForm<Group> {
 	}
 
 	@Override
-	protected boolean isNewBtnVisible() {
-		return !hasGroupAdminLevel(getRights());
-	}
-
-	@Override
 	protected boolean isDelBtnVisible() {
 		return !hasGroupAdminLevel(getRights());
 	}
@@ -150,6 +145,7 @@ public class GroupForm extends AdminBaseForm<Group> {
 	protected void onInitialize() {
 		super.onInitialize();
 		final boolean isGroupAdmin = hasGroupAdminLevel(getRights());
+		setNewVisible(!isGroupAdmin);
 		userToadd.setEnabled(!isGroupAdmin);
 		add(new RequiredTextField<String>("name").setLabel(Model.of(getString("165"))));
 		add(logo);
@@ -226,7 +222,7 @@ public class GroupForm extends AdminBaseForm<Group> {
 		for (GroupUser grpUser : usersPanel.getUsers2add()) {
 			usersPanel.update(grpUser);
 		}
-		hideNewRecord();
+		setNewVisible(false);
 		updateView(target);
 	}
 }
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/groups/GroupUsersPanel.html b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/groups/GroupUsersPanel.html
index 570b111..0f0309e 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/groups/GroupUsersPanel.html
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/groups/GroupUsersPanel.html
@@ -34,7 +34,11 @@
 						<tr wicket:id="userList" class="ui-widget-content">
 							<td style="width: 34px"><input type="checkbox" wicket:id="isModerator"/></td>
 							<td style="width: 360px"><div style="width: 360px"><span wicket:id="label"></span></div></td>
-							<td style="width: 34px"><div style="width: 34px"><div class="formCancelButton" wicket:id="deleteUserBtn" wicket:message="title:274"></div></div></td>
+							<td style="width: 34px">
+								<div class="ui-button ui-widget ui-corner-all ui-button-icon-only ui-state-error" wicket:id="deleteUserBtn" wicket:message="title:274">
+									<span class="ui-button-icon ui-icon ui-icon-closethick"></span>&nbsp;
+								</div>
+							</td>
 						</tr>
 					</tbody>
 				</table>
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/groups/GroupsPanel.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/groups/GroupsPanel.java
index cce84cd..e7b3067 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/groups/GroupsPanel.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/groups/GroupsPanel.java
@@ -71,7 +71,7 @@ public class GroupsPanel extends AdminBasePanel {
 
 					@Override
 					protected void onEvent(AjaxRequestTarget target) {
-						form.hideNewRecord();
+						form.setNewVisible(false);
 						form.setModelObject(g);
 						form.updateView(target);
 						target.add(listContainer);
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/labels/LabelsForm.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/labels/LabelsForm.java
index ca67add..00db2e6 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/labels/LabelsForm.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/labels/LabelsForm.java
@@ -72,7 +72,7 @@ public class LabelsForm extends AdminBaseForm<StringLabel> {
 		} catch (Exception e) {
 			error("Unexpected error while saving label:" + e.getMessage());
 		}
-		hideNewRecord();
+		setNewVisible(false);
 		target.add(panel.listContainer);
 		reinitJs(target);
 	}
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/labels/LangPanel.html b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/labels/LangPanel.html
index bf359eb..78af381 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/labels/LangPanel.html
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/labels/LangPanel.html
@@ -35,7 +35,9 @@
 	<div class="adminPanelColumnTable">
 		<div>
 		<div wicket:id="addLangBtn" class="addButton" wicket:message="title:362" ></div>
-		<div wicket:id="deleteLangBtn" class="delButton" wicket:message="title:363"></div>
+		<div class="ui-button ui-widget ui-corner-all ui-button-icon-only ui-state-error" wicket:id="deleteLangBtn" wicket:message="title:363">
+			<span class="ui-button-icon ui-icon ui-icon-closethick"></span>&nbsp;
+		</div>
 		<form wicket:id="langForm" class="addLanguagePanel">
 			<table>
 				<tr>
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/labels/LangPanel.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/labels/LangPanel.java
index fc8bdb9..dd2562d 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/labels/LangPanel.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/labels/LangPanel.java
@@ -91,7 +91,7 @@ public class LangPanel extends AdminBasePanel {
 		language = new AbstractMap.SimpleEntry<>(1L, Locale.ENGLISH);
 
 		final LabelsForm form = new LabelsForm("form", this, new StringLabel(null, null));
-		form.showNewRecord();
+		form.setNewVisible(true);
 		add(form);
 
 		final SearchableDataView<StringLabel> dataView = new SearchableDataView<StringLabel>(
@@ -122,7 +122,7 @@ public class LangPanel extends AdminBasePanel {
 					@Override
 					protected void onEvent(AjaxRequestTarget target) {
 						form.setModelObject(fv);
-						form.hideNewRecord();
+						form.setNewVisible(false);
 						target.add(form, listContainer);
 						reinitJs(target);
 					}
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/ldaps/LdapForm.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/ldaps/LdapForm.java
index a305eab..bbb7b06 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/ldaps/LdapForm.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/ldaps/LdapForm.java
@@ -72,7 +72,7 @@ public class LdapForm extends AdminBaseForm<LdapConfig> {
 	@Override
 	protected void onSaveSubmit(AjaxRequestTarget target, Form<?> form) {
 		setModelObject(ldapDao.update(getModelObject(), WebSession.getUserId()));
-		hideNewRecord();
+		setNewVisible(false);
 		target.add(this, listContainer);
 		reinitJs(target);
 	}
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/ldaps/LdapsPanel.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/ldaps/LdapsPanel.java
index 4819948..29f836a 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/ldaps/LdapsPanel.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/ldaps/LdapsPanel.java
@@ -68,7 +68,7 @@ public class LdapsPanel extends AdminBasePanel {
 					@Override
 					protected void onEvent(AjaxRequestTarget target) {
 						form.setModelObject(lc);
-						form.hideNewRecord();
+						form.setNewVisible(false);
 						target.add(form, listContainer);
 						reinitJs(target);
 					}
@@ -93,7 +93,7 @@ public class LdapsPanel extends AdminBasePanel {
 		add(navigator);
 
 		form = new LdapForm("form", listContainer, new LdapConfig());
-		form.showNewRecord();
+		form.setNewVisible(true);
 		add(form);
 
 		super.onInitialize();
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/oauth/OAuthForm.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/oauth/OAuthForm.java
index 0320683..555c941 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/oauth/OAuthForm.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/oauth/OAuthForm.java
@@ -84,7 +84,7 @@ public class OAuthForm extends AdminBaseForm<OAuthServer> {
 		oauthDao.update(getModelObject(), getUserId());
 		OAuthServer oauthServer = oauthDao.get(getModelObject().getId());
 		this.setModelObject(oauthServer);
-		hideNewRecord();
+		setNewVisible(false);
 		target.add(this);
 		target.add(listContainer);
 		reinitJs(target);
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/oauth/OAuthPanel.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/oauth/OAuthPanel.java
index b2e675a..43c1b99 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/oauth/OAuthPanel.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/oauth/OAuthPanel.java
@@ -62,7 +62,7 @@ public class OAuthPanel extends AdminBasePanel {
 					@Override
 					protected void onEvent(AjaxRequestTarget target) {
 						form.setModelObject(server);
-						form.hideNewRecord();
+						form.setNewVisible(false);
 						target.add(form, listContainer);
 						reinitJs(target);
 					}
@@ -88,7 +88,7 @@ public class OAuthPanel extends AdminBasePanel {
 		add(navigator);
 
 		form = new OAuthForm("form", listContainer, new OAuthServer());
-		form.showNewRecord();
+		form.setNewVisible(true);
 		add(form);
 		super.onInitialize();
 	}
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/rooms/RoomForm.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/rooms/RoomForm.java
index 2801f7c..8fd1610 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/rooms/RoomForm.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/rooms/RoomForm.java
@@ -442,7 +442,7 @@ public class RoomForm extends AdminBaseForm<Room> {
 			}
 			roomDao.update(getModelObject(), getUserId());
 		}
-		hideNewRecord();
+		setNewVisible(false);
 		updateView(target);
 	}
 
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/rooms/RoomsPanel.html b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/rooms/RoomsPanel.html
index ba11b08..626820e 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/rooms/RoomsPanel.html
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/rooms/RoomsPanel.html
@@ -169,7 +169,11 @@
 								<tr wicket:id="files">
 									<td style="width: 380px"><div class="three_column_layout_divcolumn1" style="width: auto"><span wicket:id="name"></span></div></td>
 									<td style="width: 80px"><span wicket:id="wbIdx"></span></td>
-									<td style="width: 50px"><div class="formCancelButton" wicket:id="delete" wicket:message="title:80"></div></td>
+									<td style="width: 50px">
+										<div class="ui-button ui-widget ui-corner-all ui-button-icon-only ui-state-error" wicket:id="delete" wicket:message="title:80">
+											<span class="ui-button-icon ui-icon ui-icon-closethick"></span>&nbsp;
+										</div>
+									</td>
 								</tr>
 							</tbody>
 						</table>
@@ -194,7 +198,11 @@
 								<tr wicket:id="clients">
 									<td class="three_column_layout_column1"><div class="three_column_layout_divcolumn1"><span wicket:id="clientId"></span></div></td>
 									<td class="three_column_layout_column2"><div class="three_column_layout_divcolumn2"><span wicket:id="clientLogin"></span></div></td>
-									<td class="three_column_layout_column3"><div class="formCancelButton" wicket:id="clientDelete" wicket:message="title:603"></div></td>
+									<td class="three_column_layout_column3">
+										<div class="ui-button ui-widget ui-corner-all ui-button-icon-only ui-state-error" wicket:id="clientDelete" wicket:message="title:603">
+											<span class="ui-button-icon ui-icon ui-icon-closethick"></span>&nbsp;
+										</div>
+									</td>
 								</tr>
 							</tbody>
 						</table>
@@ -230,7 +238,11 @@
 										<td class="three_column_layout_column2"><div class="three_column_layout_divcolumn2"><span wicket:id="userId"></span></div></td>
 										<td class="three_column_layout_column3"><div class="three_column_layout_divcolumn3"><span wicket:id="uName"></span></div></td>
 										<td class="three_column_layout_column4"><div class="three_column_layout_divcolumn4" style="overflow: hidden;"><span wicket:id="email"></span></div></td>
-										<td style="width: 50px"><div style="width: 50px"><div class="formCancelButton" wicket:id="delete" wicket:message="title:80"></div></div></td>
+										<td style="width: 50px">
+											<div class="ui-button ui-widget ui-corner-all ui-button-icon-only ui-state-error" wicket:id="delete" wicket:message="title:80">
+												<span class="ui-button-icon ui-icon ui-icon-closethick"></span>&nbsp;
+											</div>
+										</td>
 									</tr>
 								</tbody>
 							</table>
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/rooms/RoomsPanel.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/rooms/RoomsPanel.java
index 0a02f0a..93c229a 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/rooms/RoomsPanel.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/rooms/RoomsPanel.java
@@ -62,7 +62,7 @@ public class RoomsPanel extends AdminBasePanel {
 
 					@Override
 					protected void onEvent(AjaxRequestTarget target) {
-						form.hideNewRecord();
+						form.setNewVisible(false);
 						form.setModelObject(roomDao.get(roomId));
 						form.updateView(target);
 						target.add(form, listContainer);
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/UserForm.html b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/UserForm.html
index 7ba2103..b351db2 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/UserForm.html
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/UserForm.html
@@ -20,7 +20,7 @@
 <html xmlns:wicket="http://wicket.apache.org">
 <wicket:panel>
 	<div wicket:id="buttons"></div>
-	<div class="scrollcontent" id="adminForm">
+	<div class="scrollcontent" wicket:id="adminForm" id="adminForm">
 		<fieldset class="ui-widget-content">
 			<legend class="ui-widget-header">
 				<wicket:message key="143" />
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/UserForm.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/UserForm.java
index fbd6e17..adcdbaf 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/UserForm.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/UserForm.java
@@ -85,6 +85,7 @@ import com.googlecode.wicket.jquery.ui.widget.dialog.MessageDialog;
 public class UserForm extends AdminBaseForm<User> {
 	private static final long serialVersionUID = 1L;
 	private static final Logger log = LoggerFactory.getLogger(UserForm.class);
+	private final WebMarkupContainer mainContainer = new WebMarkupContainer("adminForm");
 	private final WebMarkupContainer listContainer;
 	private final WebMarkupContainer domain = new WebMarkupContainer("domain");
 	private GeneralUserForm generalForm;
@@ -110,18 +111,19 @@ public class UserForm extends AdminBaseForm<User> {
 		setOutputMarkupId(true);
 		this.listContainer = listContainer;
 		this.warning = warning;
-		add(generalForm = new GeneralUserForm("general", getModel(), true));
 	}
 
 	@Override
 	protected void onInitialize() {
 		super.onInitialize();
-		add(password.setResetPassword(false).setLabel(Model.of(getString("110"))).setRequired(false)
+		add(mainContainer);
+		mainContainer.add(generalForm = new GeneralUserForm("general", getModel(), true));
+		mainContainer.add(password.setResetPassword(false).setLabel(Model.of(getString("110"))).setRequired(false)
 				.add(passValidator = new StrongPasswordValidator(getModelObject())));
 		login.setLabel(Model.of(getString("108")));
-		add(login.add(minimumLength(getMinLoginLength())));
+		mainContainer.add(login.add(minimumLength(getMinLoginLength())));
 
-		add(new DropDownChoice<>("type", Arrays.asList(Type.values())).add(new OnChangeAjaxBehavior() {
+		mainContainer.add(new DropDownChoice<>("type", Arrays.asList(Type.values())).add(new OnChangeAjaxBehavior() {
 			private static final long serialVersionUID = 1L;
 
 			@Override
@@ -130,14 +132,14 @@ public class UserForm extends AdminBaseForm<User> {
 			}
 		}));
 		update(null);
-		add(domain.add(domainId).setOutputMarkupId(true).setOutputMarkupPlaceholderTag(true));
-		add(new Label("ownerId"));
-		add(new DateLabel("inserted"));
-		add(new DateLabel("updated"));
+		mainContainer.add(domain.add(domainId).setOutputMarkupId(true).setOutputMarkupPlaceholderTag(true));
+		mainContainer.add(new Label("ownerId"));
+		mainContainer.add(new DateLabel("inserted"));
+		mainContainer.add(new DateLabel("updated"));
 
-		add(new CheckBox("forceTimeZoneCheck"));
+		mainContainer.add(new CheckBox("forceTimeZoneCheck"));
 
-		add(new Select2MultiChoice<>("rights", null, new RestrictiveChoiceProvider<Right>() {
+		mainContainer.add(new Select2MultiChoice<>("rights", null, new RestrictiveChoiceProvider<Right>() {
 			private static final long serialVersionUID = 1L;
 
 			@Override
@@ -171,19 +173,18 @@ public class UserForm extends AdminBaseForm<User> {
 				return Right.valueOf(id);
 			}
 		}));
-		add(new ComunityUserForm("comunity", getModel()));
+		mainContainer.add(new ComunityUserForm("comunity", getModel()));
 		add(adminPass);
+		remove(validationBehavior);
 	}
 
 	@Override
 	protected void onModelChanged() {
 		super.onModelChanged();
-		setEnabled(!getModelObject().isDeleted());
-		if (getModelObject().isDeleted()) {
-			remove(validationBehavior);
-		} else {
-			add(validationBehavior);
-		}
+		boolean nd = !getModelObject().isDeleted();
+		mainContainer.setEnabled(nd);
+		setSaveVisible(nd);
+		setDelVisible(nd && getModelObject().getId() != null);
 		password.setModelObject(null);
 		generalForm.updateModelObject(getModelObject(), true);
 		passValidator.setUser(getModelObject());
@@ -226,7 +227,7 @@ public class UserForm extends AdminBaseForm<User> {
 			emainManager.sendMail(login.getValue(), email, u.getActivatehash(), false, null);
 		}
 		setModelObject(userDao.get(u.getId()));
-		hideNewRecord();
+		setNewVisible(false);
 		target.add(this, listContainer);
 		reinitJs(target);
 		if (u.getGroupUsers().isEmpty()) {
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/UsersPanel.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/UsersPanel.java
index d10f919..156b196 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/UsersPanel.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/UsersPanel.java
@@ -73,7 +73,7 @@ public class UsersPanel extends AdminBasePanel {
 					@Override
 					protected void onEvent(AjaxRequestTarget target) {
 						form.setModelObject(userDao.get(userId));
-						form.hideNewRecord();
+						form.setNewVisible(false);
 						form.update(target);
 					}
 				});
@@ -114,7 +114,7 @@ public class UsersPanel extends AdminBasePanel {
 		};
 
 		form = new UserForm("form", listContainer, getNewUserInstance(userDao.get(getUserId())), warning);
-		form.showNewRecord();
+		form.setNewVisible(true);
 		add(form, warning);
 		super.onInitialize();
 	}
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/FormSaveRefreshPanel.html b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/FormSaveRefreshPanel.html
index 78bc0e0..6790cbb 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/FormSaveRefreshPanel.html
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/FormSaveRefreshPanel.html
@@ -21,9 +21,11 @@
 <html xmlns:wicket="http://wicket.apache.org">
 <wicket:panel>
 	<div class="formSaveBar ui-widget-header">
-		<div class="formSaveButton" wicket:id="ajax-save-button" wicket:message="title:144"></div>
-		<div class="formRefreshButton">
-			<input type="submit" value="" wicket:id="ajax-refresh-button" wicket:message="title:lbl.refresh" />
+		<div class="ui-button ui-widget ui-corner-all ui-button-icon-only" wicket:id="ajax-save-button" wicket:message="title:144">
+			<span class="ui-button-icon ui-icon ui-icon-disk"></span>&nbsp;
+		</div>
+		<div class="ui-button ui-widget ui-corner-all ui-button-icon-only" wicket:id="ajax-refresh-button" wicket:message="title:lbl.refresh">
+			<span class="ui-button-icon ui-icon ui-icon-refresh"></span>&nbsp;
 		</div>
 		<wicket:child/>
 	</div>
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/FormSaveRefreshPanel.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/FormSaveRefreshPanel.java
index 27118ef..1719e41 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/FormSaveRefreshPanel.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/FormSaveRefreshPanel.java
@@ -30,6 +30,7 @@ public abstract class FormSaveRefreshPanel<T> extends Panel {
 	private static final long serialVersionUID = 1L;
 	private final Form<T> form;
 	protected final KendoFeedbackPanel feedback = new KendoFeedbackPanel("feedback", new Options("button", true));
+	private AjaxButton saveBtn;
 
 	public FormSaveRefreshPanel(String id, Form<T> form) {
 		super(id);
@@ -42,7 +43,7 @@ public abstract class FormSaveRefreshPanel<T> extends Panel {
 		add(feedback.setOutputMarkupId(true));
 
 		// add a save button that can be used to submit the form via ajax
-		add(new AjaxButton("ajax-save-button", form) {
+		add(saveBtn = new AjaxButton("ajax-save-button", form) {
 			private static final long serialVersionUID = 1L;
 
 			@Override
@@ -68,7 +69,7 @@ public abstract class FormSaveRefreshPanel<T> extends Panel {
 			protected void onSubmit(AjaxRequestTarget target) {
 				// repaint the feedback panel so that it is hidden
 				target.add(feedback);
-				hideNewRecord();
+				setNewVisible(false);
 				onRefreshSubmit(target, form);
 			}
 
@@ -76,17 +77,23 @@ public abstract class FormSaveRefreshPanel<T> extends Panel {
 			protected void onError(AjaxRequestTarget target) {
 				// repaint the feedback panel so errors are shown
 				target.add(feedback);
-				hideNewRecord();
+				setNewVisible(false);
 				onRefreshError(target, form);
 			}
 		});
 		super.onInitialize();
 	}
 
+	public void setSaveVisible(boolean visible) {
+		saveBtn.setVisible(visible);
+	}
+
 	/**
-	 * Hide the new record text
+	 * Change visibility the new record text
+	 *
+	 * @param visible - new visibility
 	 */
-	public void hideNewRecord() {
+	public void setNewVisible(boolean visible) {
 		// for admin only, will be implemented in admin
 	}
 
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomClientPanel.html b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomClientPanel.html
index 78e963c..4234176 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomClientPanel.html
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomClientPanel.html
@@ -27,7 +27,9 @@
 	<span wicket:id="user-speaks"></span>
 	<div wicket:id="actions" class="user actions">
 		<span wicket:id="icons"></span>
-		<span wicket:id="kick"></span>
+		<div class="ui-button ui-widget ui-corner-all ui-button-icon-only ui-state-error" wicket:id="kick">
+			<span class="ui-button-icon ui-icon ui-icon-closethick"></span>&nbsp;
+		</div>
 		<span wicket:id="privateChat" class="ui-icon align-right clickable private-chat" wicket:message="title:1493" onclick="startPrivateChat($(this));"></span>
 		<div class="clear"></div>
 	</div>
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/calendar/AppointmentDialog.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/calendar/AppointmentDialog.java
index 160646c..47fa5e5 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/calendar/AppointmentDialog.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/calendar/AppointmentDialog.java
@@ -135,7 +135,7 @@ public class AppointmentDialog extends AbstractFormDialog<Appointment> {
 
 	public AppointmentDialog(String id, CalendarPanel calendarPanel, CompoundPropertyModel<Appointment> model) {
 		super(id, "", model, true);
-		log.debug(" -- AppointmentDialog -- Current model " + getModel().getObject());
+		log.debug(" -- AppointmentDialog -- Current model {}", getModel().getObject());
 		this.calendarPanel = calendarPanel;
 		setOutputMarkupId(true);
 		form = new AppointmentForm("appForm", model);
@@ -307,7 +307,7 @@ public class AppointmentDialog extends AbstractFormDialog<Appointment> {
 		private static final long serialVersionUID = 1L;
 		private final boolean myRoomsAllowed;
 		private boolean createRoom = true;
-		private Room appRoom = null;
+		private Room appRoom = new Room();
 		private final DateTimePicker start = new OmDateTimePicker("start", Model.of(LocalDateTime.now()));
 		private final DateTimePicker end = new OmDateTimePicker("end", Model.of(LocalDateTime.now()));
 		private final PasswordTextField pwd = new PasswordTextField("password");
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/ChatToolbar.html b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/ChatToolbar.html
index 4c217f0..d09e597 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/ChatToolbar.html
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/ChatToolbar.html
@@ -77,7 +77,9 @@
 			</a>
 			<ul class="dropdown-menu btns-only">
 				<li><a class="chat-btn chat-tool-icon btn btn-default save" wicket:message="title:197" wicket:id="save"></a></li>
-				<li><a class="chat-btn chat-tool-icon btn btn-default delete" wicket:message="title:442" wicket:id="delete"></a></li>
+				<li><a class="chat-btn chat-tool-icon btn btn-default ui-state-error" wicket:message="title:442" wicket:id="delete">
+					<span class="ui-button-icon ui-icon ui-icon-closethick"></span>
+				</a></li>
 				<li><a class="chat-btn chat-tool-icon btn btn-default audio" wicket:message="data-sound-enabled:sound.mute,data-sound-muted:sound.enable">&nbsp;</a></li>
 				<li><a class="chat-btn chat-tool-icon btn btn-default send-btn" wicket:message="data-send-enter:send.on.enter,data-send-ctrl:send.on.ctrl.enter"><b>&crarr;</b></a></li>
 			</ul>
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/rooms/RoomListPanel.html b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/rooms/RoomListPanel.html
index 2aef6d1..2bed732 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/rooms/RoomListPanel.html
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/rooms/RoomListPanel.html
@@ -26,7 +26,7 @@
 				<div><span wicket:id="roomName">[room name]</span>&nbsp;<span wicket:id="info" class="info-text">&nbsp;</span></div>
 				<div>
 					<wicket:message key="398" />&nbsp;<span wicket:id="curUsers"></span>&nbsp;/&nbsp;<span
-						wicket:id="totalUsers"></span>&nbsp;&nbsp;<span wicket:id="refresh">&nbsp;</span>
+						wicket:id="totalUsers"></span>&nbsp;&nbsp;<span wicket:id="refresh"><wicket:message key="lbl.refresh"/></span>
 				</div>
 			</div>
 			<button wicket:id="btn"><span wicket:id="label"></span></button>
diff --git a/openmeetings-web/src/main/webapp/css/calendar.css b/openmeetings-web/src/main/webapp/css/calendar.css
index f49c366..5c8d296 100644
--- a/openmeetings-web/src/main/webapp/css/calendar.css
+++ b/openmeetings-web/src/main/webapp/css/calendar.css
@@ -36,11 +36,6 @@
 .appointmentPopUp select {
 	width: 426px;
 }
-
-.appointmentPopUp .formNewButton {
-	float: left;
-}
-
 .appointmentPopUp td {
 	vertical-align: middle;
 }
diff --git a/openmeetings-web/src/main/webapp/css/chat.css b/openmeetings-web/src/main/webapp/css/chat.css
index 5ee814c..922f887 100644
--- a/openmeetings-web/src/main/webapp/css/chat.css
+++ b/openmeetings-web/src/main/webapp/css/chat.css
@@ -111,9 +111,6 @@
 .sound-mute.chat-tool-icon {
 	background-image: url(images/sound_mute.png);
 }
-.delete.chat-tool-icon {
-	background-image: url(images/cancel_icon.png);
-}
 .save.chat-tool-icon {
 	background-image: url(images/file_save_as.png);
 }
diff --git a/openmeetings-web/src/main/webapp/css/general.css b/openmeetings-web/src/main/webapp/css/general.css
index 1c25fb6..4dd9632 100644
--- a/openmeetings-web/src/main/webapp/css/general.css
+++ b/openmeetings-web/src/main/webapp/css/general.css
@@ -566,9 +566,9 @@ form .input {
 }
  /**** TODO need to be unified with other icons used ****/
 div.formSaveBar {
-	height: 22px;
+	height: 35px;
 }
-.addButton, .delButton {
+.addButton {
 	display: inline-block;
 	cursor: pointer;
 	width: 18px;
@@ -577,58 +577,7 @@ div.formSaveBar {
 	margin-left: 2px;
 	margin-top: 2px;
 	vertical-align: super;
-}
-div.formSaveButton {
-	background-image: url(images/file_save_as.png);
-	background-repeat: no-repeat;
-	background-size: 18px 18px;
-	float: left;
-	cursor: pointer;
-	width: 18px;
-	height: 18px;
-	border: none;
-	margin-left: 2px;
-	margin-top: 2px;
-}
-.addButton {
-	background: url(images/plus_icon.png) no-repeat;
-}
-.delButton {
-	background: url(images/cancel_icon.png) no-repeat;
-}
-.formNewButton {
 	background: url(images/plus_icon.png) no-repeat;
-	float: left;
-	cursor: pointer;
-	width: 18px;
-	height: 18px;
-	border: none;
-	margin-left: 2px;
-	margin-top: 2px;
-}
-.formNewButton.disabled {
-	background: url(images/plus_icon_disabled.png) no-repeat;
-}
-div.formRefreshButton input {
-	background: url(images/arrow_refresh_small.png) no-repeat;
-	float: left;
-	cursor: pointer;
-	width: 18px;
-	height: 18px;
-	border: none;
-	margin-left: 2px;
-	margin-top: 2px;
-}
-.formCancelButton {
-	background: url(images/cancel_icon.png) no-repeat;
-	display: inline-block;
-	float: left;
-	cursor: pointer;
-	width: 18px;
-	height: 18px;
-	border: none;
-	margin-left: 2px;
-	margin-top: 2px;
 }
 .hash-panel-main {
 	width: 100%;
diff --git a/openmeetings-web/src/main/webapp/css/images/arrow_refresh_small.png b/openmeetings-web/src/main/webapp/css/images/arrow_refresh_small.png
deleted file mode 100644
index d3087df..0000000
Binary files a/openmeetings-web/src/main/webapp/css/images/arrow_refresh_small.png and /dev/null differ
diff --git a/openmeetings-web/src/main/webapp/css/images/cancel_icon.png b/openmeetings-web/src/main/webapp/css/images/cancel_icon.png
deleted file mode 100644
index 2d26062..0000000
Binary files a/openmeetings-web/src/main/webapp/css/images/cancel_icon.png and /dev/null differ
diff --git a/openmeetings-web/src/main/webapp/css/images/plus_icon.png b/openmeetings-web/src/main/webapp/css/images/plus_icon.png
deleted file mode 100644
index acec291..0000000
Binary files a/openmeetings-web/src/main/webapp/css/images/plus_icon.png and /dev/null differ
diff --git a/openmeetings-web/src/main/webapp/css/images/plus_icon_disabled.png b/openmeetings-web/src/main/webapp/css/images/plus_icon_disabled.png
deleted file mode 100644
index cfb4776..0000000
Binary files a/openmeetings-web/src/main/webapp/css/images/plus_icon_disabled.png and /dev/null differ
diff --git a/openmeetings-web/src/main/webapp/css/room.css b/openmeetings-web/src/main/webapp/css/room.css
index 510d981..54cf8e4 100644
--- a/openmeetings-web/src/main/webapp/css/room.css
+++ b/openmeetings-web/src/main/webapp/css/room.css
@@ -252,12 +252,8 @@
 .exclsv-audio.ui-icon {
 	background-image: url(images/microphone_exclusive.png);
 }
-.kick.ui-icon {
-	background-image: url(images/cancel_icon.png);
-	background-size: 16px;
-}
 .restart.ui-icon {
-	background-image: url(images/arrow_refresh_small.png);
+	background-size: initial !important;
 }
 .settings.ui-icon, .settings.om-icon {
 	background-image: url(images/settings.png);

-- 
To stop receiving notification emails like this one, please contact
solomax@apache.org.

[openmeetings] 09/09: [OPENMEETINGS-1864] basic purge is implemented

Posted by so...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

solomax pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/openmeetings.git

commit 751df91356447ee3df48a0f34d7a65b1ba651114
Author: Maxim Solodovnik <so...@gmail.com>
AuthorDate: Mon Apr 16 22:33:33 2018 +0700

    [OPENMEETINGS-1864] basic purge is implemented
---
 .../apache/openmeetings/db/dao/user/UserDao.java   | 34 ++++++++++++++++++++++
 .../openmeetings/db/entity/basic/ChatMessage.java  |  1 +
 .../openmeetings/db/entity/basic/MailMessage.java  |  1 +
 .../org/apache/openmeetings/util/OmFileHelper.java |  6 +++-
 .../openmeetings/web/admin/AdminSavePanel.java     |  4 +--
 .../openmeetings/web/admin/users/UserForm.java     | 26 +++++++++++++++++
 6 files changed, 69 insertions(+), 3 deletions(-)

diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/UserDao.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/UserDao.java
index fe8cd60..b0221c0 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/UserDao.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/UserDao.java
@@ -24,6 +24,7 @@ import static org.apache.openmeetings.util.OpenmeetingsVariables.PARAM_USER_ID;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.getDefaultLang;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.getMinLoginLength;
 
+import java.io.File;
 import java.security.NoSuchAlgorithmException;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -47,6 +48,7 @@ import org.apache.openjpa.persistence.OpenJPAQuery;
 import org.apache.openmeetings.db.dao.IGroupAdminDataProviderDao;
 import org.apache.openmeetings.db.dao.label.LabelDao;
 import org.apache.openmeetings.db.entity.user.Address;
+import org.apache.openmeetings.db.entity.user.AsteriskSipUser;
 import org.apache.openmeetings.db.entity.user.User;
 import org.apache.openmeetings.db.entity.user.User.Right;
 import org.apache.openmeetings.db.entity.user.User.Salutation;
@@ -54,6 +56,7 @@ import org.apache.openmeetings.db.entity.user.User.Type;
 import org.apache.openmeetings.db.util.AuthLevelUtil;
 import org.apache.openmeetings.util.DaoHelper;
 import org.apache.openmeetings.util.OmException;
+import org.apache.openmeetings.util.OmFileHelper;
 import org.apache.openmeetings.util.crypt.CryptProvider;
 import org.apache.openmeetings.util.crypt.ICrypt;
 import org.apache.wicket.util.string.Strings;
@@ -325,6 +328,37 @@ public class UserDao implements IGroupAdminDataProviderDao<User> {
 		}
 	}
 
+	// created here so this action would be executed in Transaction
+	public void purge(User u, Long userId) {
+		if (u != null && u.getId() != null) {
+			em.createNamedQuery("purgeChatUserName")
+				.setParameter("purged", "Purged User")
+				.setParameter("userId", u.getId())
+				.executeUpdate();
+			if (!Strings.isEmpty(u.getAddress().getEmail())) {
+				em.createNamedQuery("purgeMailMessages")
+					.setParameter("email", String.format("%%%s%%", u.getAddress().getEmail()))
+					.executeUpdate();
+			}
+			u.setDeleted(true);
+			u.setSipUser(new AsteriskSipUser());
+			u.setAddress(new Address());
+			u.setAge(new Date());
+			u.setExternalId(null);
+			final String purged = String.format("Purged %s", UUID.randomUUID());
+			u.setFirstname(purged);
+			u.setLastname(purged);
+			u.setLogin(purged);
+			File pic = OmFileHelper.getUserProfilePicture(u.getId(), u.getPictureuri(), null);
+			u.setPictureuri(null);
+			update(u, userId);
+			// this should be last action, so file will be deleted in case there were no errors
+			if (pic != null) {
+				pic.delete();
+			}
+		}
+	}
+
 	public List<User> get(Collection<Long> ids) {
 		return em.createNamedQuery("getUsersByIds", User.class).setParameter("ids", ids).getResultList();
 	}
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/ChatMessage.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/ChatMessage.java
index 13d6824..8c812f7 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/ChatMessage.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/ChatMessage.java
@@ -53,6 +53,7 @@ import org.simpleframework.xml.Root;
 	, @NamedQuery(name = "deleteChatGlobal", query = "DELETE FROM ChatMessage c WHERE c.toUser IS NULL AND c.toRoom IS NULL")
 	, @NamedQuery(name = "deleteChatRoom", query = "DELETE FROM ChatMessage c WHERE c.toUser IS NULL AND c.toRoom.id = :roomId")
 	, @NamedQuery(name = "deleteChatUser", query = "DELETE FROM ChatMessage c WHERE c.toRoom IS NULL AND c.toUser.id = :userId")
+	, @NamedQuery(name = "purgeChatUserName", query = "UPDATE ChatMessage c SET c.fromName = :purged WHERE c.toUser.id = :userId")
 })
 @Table(name = "chat")
 @Root(name = "ChatMessage")
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/MailMessage.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/MailMessage.java
index 671a060..bff9218 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/MailMessage.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/MailMessage.java
@@ -40,6 +40,7 @@ import org.apache.openmeetings.db.entity.HistoricalEntity;
 	, @NamedQuery(name = "countMailMessages", query = "SELECT COUNT(m) FROM MailMessage m")
 	, @NamedQuery(name = "resetMailStatusByDate", query = "UPDATE MailMessage m SET m.status = :noneStatus WHERE m.status = :sendingStatus AND m.updated < :date")
 	, @NamedQuery(name = "resetMailStatusById", query = "UPDATE MailMessage m SET m.errorCount = 0, m.status = :noneStatus WHERE m.id = :id")
+	, @NamedQuery(name = "purgeMailMessages", query = "DELETE FROM MailMessage m WHERE m.recipients LIKE :email OR m.replyTo LIKE :email")
 })
 @Table(name = "email_queue")
 public class MailMessage extends HistoricalEntity {
diff --git a/openmeetings-util/src/main/java/org/apache/openmeetings/util/OmFileHelper.java b/openmeetings-util/src/main/java/org/apache/openmeetings/util/OmFileHelper.java
index 00fd05f..ea4b10e 100644
--- a/openmeetings-util/src/main/java/org/apache/openmeetings/util/OmFileHelper.java
+++ b/openmeetings-util/src/main/java/org/apache/openmeetings/util/OmFileHelper.java
@@ -143,6 +143,10 @@ public class OmFileHelper {
 	}
 
 	public static File getUserProfilePicture(Long userId, String uri) {
+		return getUserProfilePicture(userId, uri, getDefaultProfilePicture());
+	}
+
+	public static File getUserProfilePicture(Long userId, String uri, File def) {
 		File img = null;
 		if (SIP_USER_ID.equals(userId)) {
 			img = new File(getImagesDir(), SIP_PICTURE_URI);
@@ -150,7 +154,7 @@ public class OmFileHelper {
 			img = new File(getUploadProfilesUserDir(userId), uri == null ? "" : uri);
 		}
 		if (img == null || !img.exists() || img.isDirectory()) {
-			img = getDefaultProfilePicture();
+			img = def;
 		}
 		return img;
 	}
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/AdminSavePanel.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/AdminSavePanel.java
index 21eaf7e..24098c4 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/AdminSavePanel.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/AdminSavePanel.java
@@ -31,7 +31,7 @@ public abstract class AdminSavePanel<T> extends FormSaveRefreshPanel<T> {
 	private final Label newRecord = new Label("newRecord", Model.of(""));
 	private final Form<T> form;
 	private ConfirmableAjaxBorder delBtn;
-	private AjaxButton purgeBtn;
+	private ConfirmableAjaxBorder purgeBtn;
 	private AjaxButton restoreBtn;
 
 	public AdminSavePanel(String id, final Form<T> form) {
@@ -86,7 +86,7 @@ public abstract class AdminSavePanel<T> extends FormSaveRefreshPanel<T> {
 				onDeleteSubmit(target, form);
 			}
 		};
-		purgeBtn = new AjaxButton("btn-purge", form) {
+		purgeBtn = new ConfirmableAjaxBorder("btn-purge", getString("80"), getString("833"), cForm) {
 			private static final long serialVersionUID = 1L;
 
 			@Override
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/UserForm.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/UserForm.java
index 2083660..f179143 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/UserForm.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/UserForm.java
@@ -27,8 +27,10 @@ import static org.apache.openmeetings.web.app.WebSession.getRights;
 import static org.apache.openmeetings.web.app.WebSession.getUserId;
 import static org.apache.wicket.validation.validator.StringValidator.minimumLength;
 
+import java.io.File;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -42,11 +44,14 @@ import org.apache.openmeetings.db.dao.server.OAuth2Dao;
 import org.apache.openmeetings.db.dao.user.UserDao;
 import org.apache.openmeetings.db.entity.server.LdapConfig;
 import org.apache.openmeetings.db.entity.server.OAuthServer;
+import org.apache.openmeetings.db.entity.user.Address;
+import org.apache.openmeetings.db.entity.user.AsteriskSipUser;
 import org.apache.openmeetings.db.entity.user.User;
 import org.apache.openmeetings.db.entity.user.User.Right;
 import org.apache.openmeetings.db.entity.user.User.Type;
 import org.apache.openmeetings.db.util.AuthLevelUtil;
 import org.apache.openmeetings.service.mail.EmailManager;
+import org.apache.openmeetings.util.OmFileHelper;
 import org.apache.openmeetings.web.admin.AdminBaseForm;
 import org.apache.openmeetings.web.common.ComunityUserForm;
 import org.apache.openmeetings.web.common.GeneralUserForm;
@@ -200,6 +205,27 @@ public class UserForm extends AdminBaseForm<User> {
 	}
 
 	@Override
+	protected void onPurgeSubmit(AjaxRequestTarget target, Form<?> form) {
+		User u = getModelObject();
+		u.setDeleted(true);
+		u.setSipUser(new AsteriskSipUser());
+		u.setAddress(new Address());
+		u.setAge(new Date());
+		u.setExternalId(null);
+		final String purged = String.format("Purged %s", UUID.randomUUID());
+		u.setFirstname(purged);
+		u.setLastname(purged);
+		u.setLogin(purged);
+		File pic = OmFileHelper.getUserProfilePicture(u.getId(), u.getPictureuri(), null);
+		if (pic != null) {
+			pic.delete();
+		}
+		//u.
+		//User fields "age, externaluserid, firstname, lastname, login, pictureuri" will be replaced with "Purged_some_hash"
+		//onSaveSubmit(target, form);
+	}
+
+	@Override
 	protected void onSaveSubmit(AjaxRequestTarget target, Form<?> form) {
 		if (isAdminPassRequired()) {
 			adminPass.setAction((SerializableConsumer<AjaxRequestTarget>)t -> saveUser(t, password.getModelObject()));

-- 
To stop receiving notification emails like this one, please contact
solomax@apache.org.

[openmeetings] 08/09: [OPENMEETINGS-1872] clean plugin version is updated

Posted by so...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

solomax pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/openmeetings.git

commit ec716baa0dbdc05f4020775bcce261df5721e62a
Author: Maxim Solodovnik <so...@gmail.com>
AuthorDate: Sun Apr 15 20:50:56 2018 +0700

    [OPENMEETINGS-1872] clean plugin version is updated
---
 pom.xml | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/pom.xml b/pom.xml
index ad6e61d..84d7896 100644
--- a/pom.xml
+++ b/pom.xml
@@ -56,6 +56,7 @@
 		<maven-dependency-plugin.version>3.0.2</maven-dependency-plugin.version>
 		<maven-bundle-plugin.version>3.5.0</maven-bundle-plugin.version>
 		<maven-war-plugin.version>3.2.0</maven-war-plugin.version>
+		<maven-clean-plugin.version>3.1.0</maven-clean-plugin.version>
 		<!-- dependency versions -->
 		<junit.version>4.12</junit.version>
 		<wicket.version>8.0.0-M9</wicket.version>
@@ -1026,7 +1027,7 @@
 				<plugin>
 					<groupId>org.apache.maven.plugins</groupId>
 					<artifactId>maven-clean-plugin</artifactId>
-					<version>3.0.0</version>
+					<version>${maven-clean-plugin.version}</version>
 				</plugin>
 				<plugin>
 					<groupId>org.apache.rat</groupId>

-- 
To stop receiving notification emails like this one, please contact
solomax@apache.org.

[openmeetings] 07/09: [OPENMEETINGS-1864] restore is implemented

Posted by so...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

solomax pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/openmeetings.git

commit 20d0e1fe62e7906213a4eaec5f7ca906bc055929
Author: Maxim Solodovnik <so...@gmail.com>
AuthorDate: Sun Apr 15 20:49:08 2018 +0700

    [OPENMEETINGS-1864] restore is implemented
---
 .../openmeetings/web/admin/AdminBaseForm.java      | 58 +++++++++-----------
 .../openmeetings/web/admin/AdminSavePanel.html     |  8 +--
 .../openmeetings/web/admin/AdminSavePanel.java     | 63 +++++++++++++++++++---
 .../openmeetings/web/admin/groups/GroupForm.java   | 11 ++--
 .../openmeetings/web/admin/labels/LangPanel.html   | 46 ++++++++--------
 .../openmeetings/web/admin/users/UserForm.java     | 11 +++-
 .../web/app/Application.properties.xml             |  2 +
 .../web/common/FormSaveRefreshPanel.java           | 17 ++----
 openmeetings-web/src/main/webapp/css/general.css   | 11 ----
 9 files changed, 128 insertions(+), 99 deletions(-)

diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/AdminBaseForm.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/AdminBaseForm.java
index c6f300c..9fb1dc2 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/AdminBaseForm.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/AdminBaseForm.java
@@ -51,8 +51,8 @@ public abstract class AdminBaseForm<T> extends Form<T> {
 			}
 
 			@Override
-			protected void onSaveError(AjaxRequestTarget target, Form<?> form) {
-				AdminBaseForm.this.onSaveError(target, form);
+			protected void onError(AjaxRequestTarget target, Form<?> form) {
+				AdminBaseForm.this.onError(target, form);
 			}
 
 			@Override
@@ -61,28 +61,23 @@ public abstract class AdminBaseForm<T> extends Form<T> {
 			}
 
 			@Override
-			protected void onNewError(AjaxRequestTarget target, Form<?> form) {
-				AdminBaseForm.this.onNewError(target, form);
-			}
-
-			@Override
 			protected void onRefreshSubmit(AjaxRequestTarget target, Form<?> form) {
 				AdminBaseForm.this.onRefreshSubmit(target, form);
 			}
 
 			@Override
-			protected void onRefreshError(AjaxRequestTarget target, Form<?> form) {
-				AdminBaseForm.this.onRefreshError(target, form);
+			protected void onDeleteSubmit(AjaxRequestTarget target, Form<?> form) {
+				AdminBaseForm.this.onDeleteSubmit(target, form);
 			}
 
 			@Override
-			protected void onDeleteSubmit(AjaxRequestTarget target, Form<?> form) {
-				AdminBaseForm.this.onDeleteSubmit(target, form);
+			protected void onPurgeSubmit(AjaxRequestTarget target, Form<?> form) {
+				AdminBaseForm.this.onPurgeSubmit(target, form);
 			}
 
 			@Override
-			protected void onDeleteError(AjaxRequestTarget target, Form<?> form) {
-				AdminBaseForm.this.onDeleteError(target, form);
+			protected void onRestoreSubmit(AjaxRequestTarget target, Form<?> form) {
+				AdminBaseForm.this.onRestoreSubmit(target, form);
 			}
 		};
 		add(savePanel);
@@ -109,9 +104,14 @@ public abstract class AdminBaseForm<T> extends Form<T> {
 		savePanel.setSaveVisible(visible);
 	}
 
-	protected boolean isDelBtnVisible() {
-		return true;
+	public void setPurgeVisible(boolean visible) {
+		savePanel.setPurgeVisible(visible);
 	}
+
+	public void setRestoreVisible(boolean visible) {
+		savePanel.setRestoreVisible(visible);
+	}
+
 	/**
 	 * invoked when user press save button
 	 *
@@ -126,7 +126,7 @@ public abstract class AdminBaseForm<T> extends Form<T> {
 	 * @param target - ajax target to update form component
 	 * @param form - Form being processed
 	 */
-	protected void onSaveError(AjaxRequestTarget target, Form<?> form) {
+	protected void onError(AjaxRequestTarget target, Form<?> form) {
 		//no-op
 	}
 
@@ -139,16 +139,6 @@ public abstract class AdminBaseForm<T> extends Form<T> {
 	protected abstract void onNewSubmit(AjaxRequestTarget target, Form<?> form);
 
 	/**
-	 * invoked if new has error
-	 *
-	 * @param target - ajax target to update form component
-	 * @param form - Form being processed
-	 */
-	protected void onNewError(AjaxRequestTarget target, Form<?> form) {
-		//no-op
-	}
-
-	/**
 	 * invoked when refresh button is pressed
 	 *
 	 * @param target - ajax target to update form component
@@ -157,30 +147,30 @@ public abstract class AdminBaseForm<T> extends Form<T> {
 	protected abstract void onRefreshSubmit(AjaxRequestTarget target, Form<?> form);
 
 	/**
-	 * invoked when refresh has error
+	 * invoked when delete button is pressed
 	 *
 	 * @param target - ajax target to update form component
 	 * @param form - Form being processed
 	 */
-	protected void onRefreshError(AjaxRequestTarget target, Form<?> form) {
-		//no-op
-	}
+	protected abstract void onDeleteSubmit(AjaxRequestTarget target, Form<?> form);
 
 	/**
-	 * invoked when delete button is pressed
+	 * invoked when purge button is pressed
 	 *
 	 * @param target - ajax target to update form component
 	 * @param form - Form being processed
 	 */
-	protected abstract void onDeleteSubmit(AjaxRequestTarget target, Form<?> form);
+	protected void onPurgeSubmit(AjaxRequestTarget target, Form<?> form) {
+		//no-op
+	}
 
 	/**
-	 * invoked when delete has error
+	 * invoked when restore button is pressed
 	 *
 	 * @param target - ajax target to update form component
 	 * @param form - Form being processed
 	 */
-	protected void onDeleteError(AjaxRequestTarget target, Form<?> form) {
+	protected void onRestoreSubmit(AjaxRequestTarget target, Form<?> form) {
 		//no-op
 	}
 
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/AdminSavePanel.html b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/AdminSavePanel.html
index 6f79aca..a930582 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/AdminSavePanel.html
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/AdminSavePanel.html
@@ -20,16 +20,16 @@
 -->
 <html xmlns:wicket="http://wicket.apache.org">
 	<wicket:extend>
-		<div class="ui-button ui-widget ui-corner-all ui-button-icon-only" wicket:id="ajax-new-button" wicket:message="title:155">
+		<div class="ui-button ui-widget ui-corner-all ui-button-icon-only" wicket:id="btn-new" wicket:message="title:155">
 			<span class="ui-button-icon ui-icon ui-icon-plusthick"></span>&nbsp;
 		</div>
-		<div class="ui-button ui-widget ui-corner-all ui-button-icon-only ui-state-highlight" wicket:id="ajax-cancel-button" wicket:message="title:157">
+		<div class="ui-button ui-widget ui-corner-all ui-button-icon-only ui-state-highlight" wicket:id="btn-delete" wicket:message="title:157">
 			<span class="ui-button-icon ui-icon ui-icon-closethick"></span>&nbsp;
 		</div>
-		<div class="ui-button ui-widget ui-corner-all ui-button-icon-only ui-state-error">
+		<div class="ui-button ui-widget ui-corner-all ui-button-icon-only ui-state-error" wicket:id="btn-purge" wicket:message="title:admin.purge">
 			<span class="ui-button-icon ui-icon ui-icon-trash"></span>&nbsp;
 		</div>
-		<div class="ui-button ui-widget ui-corner-all ui-button-icon-only">
+		<div class="ui-button ui-widget ui-corner-all ui-button-icon-only" wicket:id="btn-restore" wicket:message="title:admin.restore">
 			<span class="ui-button-icon ui-icon ui-icon-circle-check"></span>&nbsp;
 		</div>
 		<span wicket:id="newRecord"></span>
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/AdminSavePanel.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/AdminSavePanel.java
index 867a06c..21eaf7e 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/AdminSavePanel.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/AdminSavePanel.java
@@ -31,6 +31,8 @@ public abstract class AdminSavePanel<T> extends FormSaveRefreshPanel<T> {
 	private final Label newRecord = new Label("newRecord", Model.of(""));
 	private final Form<T> form;
 	private ConfirmableAjaxBorder delBtn;
+	private AjaxButton purgeBtn;
+	private AjaxButton restoreBtn;
 
 	public AdminSavePanel(String id, final Form<T> form) {
 		super(id, form);
@@ -42,7 +44,7 @@ public abstract class AdminSavePanel<T> extends FormSaveRefreshPanel<T> {
 		newRecord.setDefaultModelObject(getString("155"));
 		add(newRecord.setVisible(false).setOutputMarkupId(true));
 
-		final AjaxButton newBtn = new AjaxButton("ajax-new-button", form) {
+		final AjaxButton newBtn = new AjaxButton("btn-new", form) {
 			private static final long serialVersionUID = 1L;
 
 			@Override
@@ -58,14 +60,14 @@ public abstract class AdminSavePanel<T> extends FormSaveRefreshPanel<T> {
 			protected void onError(AjaxRequestTarget target) {
 				// repaint the feedback panel so errors are shown
 				target.add(feedback);
-				onNewError(target, form);
+				AdminSavePanel.this.onError(target, form);
 			}
 		};
 		// add a cancel button that can be used to submit the form via ajax
 		final Form<?> cForm = new Form<>("form");
 		cForm.setMultiPart(form.isMultiPart());
 		add(cForm);
-		delBtn = new ConfirmableAjaxBorder("ajax-cancel-button", getString("80"), getString("833"), cForm) {
+		delBtn = new ConfirmableAjaxBorder("btn-delete", getString("80"), getString("833"), cForm) {
 			private static final long serialVersionUID = 1L;
 
 			@Override
@@ -73,7 +75,7 @@ public abstract class AdminSavePanel<T> extends FormSaveRefreshPanel<T> {
 				// repaint the feedback panel so errors are shown
 				target.add(feedback);
 				setNewVisible(false);
-				onDeleteError(target, form);
+				AdminSavePanel.this.onError(target, form);
 			}
 
 			@Override
@@ -84,7 +86,45 @@ public abstract class AdminSavePanel<T> extends FormSaveRefreshPanel<T> {
 				onDeleteSubmit(target, form);
 			}
 		};
-		add(newBtn, delBtn);
+		purgeBtn = new AjaxButton("btn-purge", form) {
+			private static final long serialVersionUID = 1L;
+
+			@Override
+			protected void onSubmit(AjaxRequestTarget target) {
+				// repaint the feedback panel so that it is hidden
+				target.add(feedback);
+				setNewVisible(false);
+				onPurgeSubmit(target, form);
+			}
+
+			@Override
+			protected void onError(AjaxRequestTarget target) {
+				// repaint the feedback panel so errors are shown
+				target.add(feedback);
+				AdminSavePanel.this.onError(target, form);
+			}
+		};
+		restoreBtn = new AjaxButton("btn-restore", form) {
+			private static final long serialVersionUID = 1L;
+
+			@Override
+			protected void onSubmit(AjaxRequestTarget target) {
+				// repaint the feedback panel so that it is hidden
+				target.add(feedback);
+				setNewVisible(false);
+				onRestoreSubmit(target, form);
+			}
+
+			@Override
+			protected void onError(AjaxRequestTarget target) {
+				// repaint the feedback panel so errors are shown
+				target.add(feedback);
+				AdminSavePanel.this.onError(target, form);
+			}
+		};
+		add(newBtn, delBtn
+				, purgeBtn.setOutputMarkupPlaceholderTag(true).setVisible(false)
+				, restoreBtn.setOutputMarkupPlaceholderTag(true).setVisible(false));
 		super.onInitialize();
 	}
 
@@ -97,9 +137,16 @@ public abstract class AdminSavePanel<T> extends FormSaveRefreshPanel<T> {
 		delBtn.setVisible(visible);
 	}
 
-	protected abstract void onNewSubmit(AjaxRequestTarget target, Form<?> form);
-	protected abstract void onNewError(AjaxRequestTarget target, Form<?> form);
+	public void setPurgeVisible(boolean visible) {
+		purgeBtn.setVisible(visible);
+	}
+
+	public void setRestoreVisible(boolean visible) {
+		restoreBtn.setVisible(visible);
+	}
 
+	protected abstract void onNewSubmit(AjaxRequestTarget target, Form<?> form);
 	protected abstract void onDeleteSubmit(AjaxRequestTarget target, Form<?> form);
-	protected abstract void onDeleteError(AjaxRequestTarget target, Form<?> form);
+	protected abstract void onPurgeSubmit(AjaxRequestTarget target, Form<?> form);
+	protected abstract void onRestoreSubmit(AjaxRequestTarget target, Form<?> form);
 }
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/groups/GroupForm.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/groups/GroupForm.java
index 4cc8aae..b1531d6 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/groups/GroupForm.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/groups/GroupForm.java
@@ -137,11 +137,6 @@ public class GroupForm extends AdminBaseForm<Group> {
 	}
 
 	@Override
-	protected boolean isDelBtnVisible() {
-		return !hasGroupAdminLevel(getRights());
-	}
-
-	@Override
 	protected void onInitialize() {
 		super.onInitialize();
 		final boolean isGroupAdmin = hasGroupAdminLevel(getRights());
@@ -172,6 +167,12 @@ public class GroupForm extends AdminBaseForm<Group> {
 		add(reminderDays.setLabel(Model.of(getString("admin.group.form.reminderDays"))).setEnabled(false).setOutputMarkupId(true));
 	}
 
+	@Override
+	protected void onConfigure() {
+		super.onConfigure();
+		setDelVisible(!hasGroupAdminLevel(getRights()));
+	}
+
 	public void updateView(AjaxRequestTarget target) {
 		userToadd.setModelObject(null);
 		usersPanel.update(getGroupId());
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/labels/LangPanel.html b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/labels/LangPanel.html
index 78af381..ec40691 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/labels/LangPanel.html
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/labels/LangPanel.html
@@ -34,28 +34,30 @@
 	<div wicket:id="feedback"></div>
 	<div class="adminPanelColumnTable">
 		<div>
-		<div wicket:id="addLangBtn" class="addButton" wicket:message="title:362" ></div>
-		<div class="ui-button ui-widget ui-corner-all ui-button-icon-only ui-state-error" wicket:id="deleteLangBtn" wicket:message="title:363">
-			<span class="ui-button-icon ui-icon ui-icon-closethick"></span>&nbsp;
-		</div>
-		<form wicket:id="langForm" class="addLanguagePanel">
-			<table>
-				<tr>
-					<td>
-						<select wicket:id="language"></select>
-					</td>
-					<td>
-						<span wicket:id="export" class="btn"><wicket:message key="360"/></span>
-					</td>
-					<td>
-						<div class="fileupload fileupload-new" data-provides="fileupload" style="margin: 0;">
-							<span class="btn btn-file ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only"><span class="ui-button-text"><wicket:message key="387"/></span><input type="file" accept="text/xml" wicket:id="fileInput"/></span>
-						</div>
-						<span wicket:id="progress">[progressbar]</span>
-					</td>
-				</tr>
-			</table>
-		</form>
+			<div class="ui-button ui-widget ui-corner-all ui-button-icon-only" style="margin-top: -1.5em;" wicket:id="addLangBtn" wicket:message="title:362">
+				<span class="ui-button-icon ui-icon ui-icon-plusthick"></span>&nbsp;
+			</div>
+			<div class="ui-button ui-widget ui-corner-all ui-button-icon-only ui-state-error" style="margin-top: -1.5em;" wicket:id="deleteLangBtn" wicket:message="title:363">
+				<span class="ui-button-icon ui-icon ui-icon-closethick"></span>&nbsp;
+			</div>
+			<form wicket:id="langForm" class="addLanguagePanel">
+				<table>
+					<tr>
+						<td>
+							<select wicket:id="language"></select>
+						</td>
+						<td>
+							<span wicket:id="export" class="btn"><wicket:message key="360"/></span>
+						</td>
+						<td>
+							<div class="fileupload fileupload-new" data-provides="fileupload" style="margin: 0;">
+								<span class="btn btn-file ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only"><span class="ui-button-text"><wicket:message key="387"/></span><input type="file" accept="text/xml" wicket:id="fileInput"/></span>
+							</div>
+							<span wicket:id="progress">[progressbar]</span>
+						</td>
+					</tr>
+				</table>
+			</form>
 		</div>
 		<span wicket:id="navigator">[dataview navigator]</span>
 		<table class="adminListTable">
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/UserForm.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/UserForm.java
index adcdbaf..2083660 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/UserForm.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/UserForm.java
@@ -182,15 +182,24 @@ public class UserForm extends AdminBaseForm<User> {
 	protected void onModelChanged() {
 		super.onModelChanged();
 		boolean nd = !getModelObject().isDeleted();
+		boolean isNew = getModelObject().getId() == null;
 		mainContainer.setEnabled(nd);
 		setSaveVisible(nd);
-		setDelVisible(nd && getModelObject().getId() != null);
+		setDelVisible(nd && !isNew);
+		setRestoreVisible(!nd);
+		setPurgeVisible(!isNew);
 		password.setModelObject(null);
 		generalForm.updateModelObject(getModelObject(), true);
 		passValidator.setUser(getModelObject());
 	}
 
 	@Override
+	protected void onRestoreSubmit(AjaxRequestTarget target, Form<?> form) {
+		getModelObject().setDeleted(false);
+		onSaveSubmit(target, form);
+	}
+
+	@Override
 	protected void onSaveSubmit(AjaxRequestTarget target, Form<?> form) {
 		if (isAdminPassRequired()) {
 			adminPass.setAction((SerializableConsumer<AjaxRequestTarget>)t -> saveUser(t, password.getModelObject()));
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.properties.xml b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.properties.xml
index 07b2a68..56bfff2 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.properties.xml
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.properties.xml
@@ -1009,4 +1009,6 @@ see http://openmeetings.apache.org/LanguageEditor.html for Details
 	<entry key="menu.polls"><![CDATA[Polls]]></entry>
 	<entry key="menu.polls.quick.title"><![CDATA[Create Quick Poll]]></entry>
 	<entry key="menu.polls.quick.descr"><![CDATA[Gather feedback without creating a poll]]></entry>
+	<entry key="admin.restore"><![CDATA[Restore]]></entry>
+	<entry key="admin.purge"><![CDATA[Purge]]></entry>
 </properties>
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/FormSaveRefreshPanel.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/FormSaveRefreshPanel.java
index 1719e41..cca36cf 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/FormSaveRefreshPanel.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/FormSaveRefreshPanel.java
@@ -57,7 +57,7 @@ public abstract class FormSaveRefreshPanel<T> extends Panel {
 			protected void onError(AjaxRequestTarget target) {
 				// repaint the feedback panel so errors are shown
 				target.add(feedback);
-				onSaveError(target, form);
+				FormSaveRefreshPanel.this.onError(target, form);
 			}
 		});
 
@@ -78,7 +78,7 @@ public abstract class FormSaveRefreshPanel<T> extends Panel {
 				// repaint the feedback panel so errors are shown
 				target.add(feedback);
 				setNewVisible(false);
-				onRefreshError(target, form);
+				FormSaveRefreshPanel.this.onError(target, form);
 			}
 		});
 		super.onInitialize();
@@ -105,20 +105,9 @@ public abstract class FormSaveRefreshPanel<T> extends Panel {
 	 * @param target Ajax target
 	 * @param form form object
 	 */
-	protected void onSaveError(AjaxRequestTarget target, Form<?> form) {
+	protected void onError(AjaxRequestTarget target, Form<?> form) {
 		//no-op
 	}
 
 	protected abstract void onRefreshSubmit(AjaxRequestTarget target, Form<?> form);
-
-
-	/**
-	 * Refresh error handler
-	 *
-	 * @param target Ajax target
-	 * @param form form object
-	 */
-	protected void onRefreshError(AjaxRequestTarget target, Form<?> form) {
-		//no-op
-	}
 }
diff --git a/openmeetings-web/src/main/webapp/css/general.css b/openmeetings-web/src/main/webapp/css/general.css
index 4dd9632..c1c4afe 100644
--- a/openmeetings-web/src/main/webapp/css/general.css
+++ b/openmeetings-web/src/main/webapp/css/general.css
@@ -568,17 +568,6 @@ form .input {
 div.formSaveBar {
 	height: 35px;
 }
-.addButton {
-	display: inline-block;
-	cursor: pointer;
-	width: 18px;
-	height: 18px;
-	border: none;
-	margin-left: 2px;
-	margin-top: 2px;
-	vertical-align: super;
-	background: url(images/plus_icon.png) no-repeat;
-}
 .hash-panel-main {
 	width: 100%;
 	height: 100%;

-- 
To stop receiving notification emails like this one, please contact
solomax@apache.org.

[openmeetings] 01/09: [OPENMEETINGS-1864] initial code clean-up

Posted by so...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

solomax pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/openmeetings.git

commit 86ea725cd92032ae6984040542052a748b1bd624
Author: Maxim Solodovnik <so...@gmail.com>
AuthorDate: Fri Apr 6 23:43:34 2018 +0700

    [OPENMEETINGS-1864] initial code clean-up
---
 .../src/main/java/org/apache/openmeetings/service/user/UserManager.java | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/openmeetings-service/src/main/java/org/apache/openmeetings/service/user/UserManager.java b/openmeetings-service/src/main/java/org/apache/openmeetings/service/user/UserManager.java
index cd1b6de..9117c1f 100644
--- a/openmeetings-service/src/main/java/org/apache/openmeetings/service/user/UserManager.java
+++ b/openmeetings-service/src/main/java/org/apache/openmeetings/service/user/UserManager.java
@@ -108,7 +108,7 @@ public class UserManager implements IUserManager {
 				u.getAddress().setEmail(email);
 				u.setTimeZoneId(getTimeZone(tzId).getID());
 
-				// this is needed cause the language is not a needed data at registering
+				// this is needed cause the language is not a necessary data at registering
 				u.setLanguageId(languageId != 0 ? languageId : 1);
 				u.getGroupUsers().add(new GroupUser(groupDao.get(getDefaultGroup()), u));
 

-- 
To stop receiving notification emails like this one, please contact
solomax@apache.org.

[openmeetings] 05/09: [OPENMEETINGS-1864] admin users count is fixed

Posted by so...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

solomax pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/openmeetings.git

commit b2f6ab121a13689b038d4fea64e281934ccf873c
Author: Maxim Solodovnik <so...@gmail.com>
AuthorDate: Thu Apr 12 23:46:03 2018 +0700

    [OPENMEETINGS-1864] admin users count is fixed
---
 .../apache/openmeetings/db/dao/user/UserDao.java    | 21 +++++++++++++++------
 1 file changed, 15 insertions(+), 6 deletions(-)

diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/UserDao.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/UserDao.java
index fea0529..fe8cd60 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/UserDao.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/UserDao.java
@@ -194,6 +194,14 @@ public class UserDao implements IGroupAdminDataProviderDao<User> {
 		return q.getResultList();
 	}
 
+	private long count(String search, boolean filterContacts, Long currentUserId, boolean filterDeleted) {
+		Map<String, Object> params = new HashMap<>();
+		TypedQuery<Long> q = em.createQuery(DaoHelper.getSearchQuery("User", "u", getAdditionalJoin(filterContacts), search, true, filterDeleted, true
+				, getAdditionalWhere(filterContacts, currentUserId, params), null, searchFields), Long.class);
+		setAdditionalParams(q, params);
+		return q.getSingleResult();
+	}
+
 	@Override
 	public long count() {
 		// get all users
@@ -211,16 +219,17 @@ public class UserDao implements IGroupAdminDataProviderDao<User> {
 	}
 
 	public long count(String search, boolean filterContacts, Long currentUserId) {
-		Map<String, Object> params = new HashMap<>();
-		TypedQuery<Long> q = em.createQuery(DaoHelper.getSearchQuery("User", "u", getAdditionalJoin(filterContacts), search, true, true, true
-				, getAdditionalWhere(filterContacts, currentUserId, params), null, searchFields), Long.class);
-		setAdditionalParams(q, params);
-		return q.getSingleResult();
+		return count(search, filterContacts, currentUserId, true);
+	}
+
+	@Override
+	public long adminCount(String search) {
+		return count(search, false, Long.valueOf(-1), false);
 	}
 
 	@Override
 	public long adminCount(String search, Long adminId) {
-		TypedQuery<Long> q = em.createQuery(DaoHelper.getSearchQuery("GroupUser gu, IN(gu.user)", "u", null, search, true, true, true
+		TypedQuery<Long> q = em.createQuery(DaoHelper.getSearchQuery("GroupUser gu, IN(gu.user)", "u", null, search, true, false, true
 				, "gu.group.id IN (SELECT gu1.group.id FROM GroupUser gu1 WHERE gu1.moderator = true AND gu1.user.id = :adminId)", null, searchFields), Long.class);
 		q.setParameter("adminId", adminId);
 		return q.getSingleResult();

-- 
To stop receiving notification emails like this one, please contact
solomax@apache.org.

[openmeetings] 02/09: [OPENMEETINGS-1864] logback files are improved

Posted by so...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

solomax pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/openmeetings.git

commit 839e0550a5ab78015341e8f3c7a42d11fba6dca1
Author: Maxim Solodovnik <so...@gmail.com>
AuthorDate: Wed Apr 11 18:56:38 2018 +0700

    [OPENMEETINGS-1864] logback files are improved
---
 openmeetings-web/src/main/webapp/WEB-INF/classes/logback-config.xml | 2 +-
 openmeetings-web/src/test/resources/logback-test.xml                | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/openmeetings-web/src/main/webapp/WEB-INF/classes/logback-config.xml b/openmeetings-web/src/main/webapp/WEB-INF/classes/logback-config.xml
index d18ff74..7ea8f69 100644
--- a/openmeetings-web/src/main/webapp/WEB-INF/classes/logback-config.xml
+++ b/openmeetings-web/src/main/webapp/WEB-INF/classes/logback-config.xml
@@ -33,7 +33,7 @@
 		<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
 			<fileNamePattern>${current_openmeetings_log_dir}/${current_openmeetings_context_name}.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
 			<maxFileSize>50MB</maxFileSize>
-			<maxHistory>50</maxHistory>
+			<maxHistory>7</maxHistory>
 		</rollingPolicy>
 	</appender>
 	<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
diff --git a/openmeetings-web/src/test/resources/logback-test.xml b/openmeetings-web/src/test/resources/logback-test.xml
index d18ff74..7ea8f69 100644
--- a/openmeetings-web/src/test/resources/logback-test.xml
+++ b/openmeetings-web/src/test/resources/logback-test.xml
@@ -33,7 +33,7 @@
 		<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
 			<fileNamePattern>${current_openmeetings_log_dir}/${current_openmeetings_context_name}.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
 			<maxFileSize>50MB</maxFileSize>
-			<maxHistory>50</maxHistory>
+			<maxHistory>7</maxHistory>
 		</rollingPolicy>
 	</appender>
 	<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">

-- 
To stop receiving notification emails like this one, please contact
solomax@apache.org.