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 15:57:24 UTC

[openmeetings] branch 4.0.x updated (36e7484 -> 9a51dc8)

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

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


    from 36e7484  no jira: switch to next dev version
     new df7e4fb  [OPENMEETINGS-1864] initial code clean-up
     new 2946bda  [OPENMEETINGS-1864] logback files are improved
     new b4beda5  [OPENMEETINGS-1864] basic work on display deleted users
     new 62dcc54  [OPENMEETINGS-1864] deleted users are somehow displayed
     new d73bbbb  [OPENMEETINGS-1864] admin users count is fixed
     new 4aa2d52  [OPENMEETINGS-1864] admin actions are unified
     new 58ac804  [OPENMEETINGS-1864] restore is implemented
     new 2716d75  [OPENMEETINGS-1872] clean plugin version is updated
     new 9a51dc8  [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 +
 .../src/main/resources/logback.xml                 |  25 +++--
 .../src/main/resources/logback.xsd                 | 109 -------------------
 .../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 |  34 +++---
 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            |  36 +++----
 pom.xml                                            |   5 +-
 55 files changed, 491 insertions(+), 568 deletions(-)
 delete mode 100644 openmeetings-screenshare/src/main/resources/logback.xsd
 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] 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 4.0.x
in repository https://gitbox.apache.org/repos/asf/openmeetings.git

commit d73bbbb83e8984ff08a1ee11b3819af2893f601f
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 de004ad..1adf437 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
@@ -195,6 +195,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
@@ -212,16 +220,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] 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 4.0.x
in repository https://gitbox.apache.org/repos/asf/openmeetings.git

commit 9a51dc811bfc7009dbf66c50f6d32488bbb527f6
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 1adf437..990f99d 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
@@ -25,6 +25,7 @@ import static org.apache.openmeetings.util.OpenmeetingsVariables.getDefaultLang;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.getMinLoginLength;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.getWebAppRootKey;
 
+import java.io.File;
 import java.security.NoSuchAlgorithmException;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -48,6 +49,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;
@@ -55,6 +57,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;
@@ -326,6 +329,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 829cc2f..0d6b1d7 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 7bee061..9c75db7 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
@@ -29,8 +29,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;
@@ -44,11 +46,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;
@@ -191,6 +196,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] 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 4.0.x
in repository https://gitbox.apache.org/repos/asf/openmeetings.git

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

    [OPENMEETINGS-1864] logback files are improved
---
 .../src/main/resources/logback.xml                 |  25 +++--
 .../src/main/resources/logback.xsd                 | 109 ---------------------
 .../main/webapp/WEB-INF/classes/logback-config.xml |  34 +++----
 .../src/test/resources/logback-test.xml            |  36 +++----
 4 files changed, 39 insertions(+), 165 deletions(-)

diff --git a/openmeetings-screenshare/src/main/resources/logback.xml b/openmeetings-screenshare/src/main/resources/logback.xml
index 8b6c297..a55fccb 100644
--- a/openmeetings-screenshare/src/main/resources/logback.xml
+++ b/openmeetings-screenshare/src/main/resources/logback.xml
@@ -19,26 +19,25 @@
 
 -->
 
-<configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-	xsi:noNamespaceSchemaLocation="logback.xsd">
+<configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
 	<contextName>${current_openmeetings_context_name}</contextName>
 
 	<jmxConfigurator contextName="${current_openmeetings_context_name}" />
 
 	<appender name="FILE" class="ch.qos.logback.core.FileAppender">
-		<File>screensharing.log</File>
-		<Append>false</Append>
-		<Encoding>UTF-8</Encoding>
-		<BufferedIO>false</BufferedIO>
-		<ImmediateFlush>true</ImmediateFlush>
-		<layout class="ch.qos.logback.classic.PatternLayout">
-			<pattern>%5p %d{MM-dd HH:mm:ss.SSS } %L %c{10} [%t] - %m%n</pattern>
-		</layout>
+		<file>screensharing.log</file>
+		<append>false</append>
+		<immediateFlush>true</immediateFlush>
+		<encoder>
+			<charset>UTF-8</charset>
+			<pattern>%5p %d{MM-dd HH:mm:ss.SSS } %c{15}:%L [%.15thread] - %m%n</pattern>
+		</encoder>
 	</appender>
 	<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
-		<layout class="ch.qos.logback.classic.PatternLayout">
-			<pattern>%5p %d{MM-dd HH:mm:ss.SSS } %L %c{10} [%t] - %m%n</pattern>
-		</layout>
+		<encoder>
+			<charset>UTF-8</charset>
+			<pattern>%highlight(%-5level) %d{MM-dd HH:mm:ss.SSS } %cyan(%c{15}:%L [%.15thread]) - %m%n</pattern>
+		</encoder>
 	</appender>
 	<logger name="org.apache.openmeetings" level="DEBUG"/>
 	<logger name="org.red5.server.net.rtmp.codec.RTMPProtocolDecoder" level="OFF"/>
diff --git a/openmeetings-screenshare/src/main/resources/logback.xsd b/openmeetings-screenshare/src/main/resources/logback.xsd
deleted file mode 100644
index cc5ad1c..0000000
--- a/openmeetings-screenshare/src/main/resources/logback.xsd
+++ /dev/null
@@ -1,109 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-  
-      http://www.apache.org/licenses/LICENSE-2.0
-    	  
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied.  See the License for the
-  specific language governing permissions and limitations
-  under the License.
-  
--->
-<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
-  <xs:element name="configuration">
-    <xs:complexType>
-      <xs:sequence>
-        <xs:element ref="contextName"/>
-        <xs:element ref="jmxConfigurator"/>
-        <xs:element maxOccurs="unbounded" ref="appender"/>
-        <xs:element maxOccurs="unbounded" ref="logger"/>
-        <xs:element ref="root"/>
-      </xs:sequence>
-    </xs:complexType>
-  </xs:element>
-  <xs:element name="contextName" type="xs:string"/>
-  <xs:element name="jmxConfigurator">
-    <xs:complexType>
-      <xs:attribute name="contextName" use="required"/>
-    </xs:complexType>
-  </xs:element>
-  <xs:element name="appender">
-    <xs:complexType>
-      <xs:sequence>
-        <xs:sequence minOccurs="0">
-          <xs:element ref="File"/>
-          <xs:element ref="Append"/>
-          <xs:element ref="Encoding"/>
-          <xs:element ref="BufferedIO"/>
-          <xs:element ref="ImmediateFlush"/>
-        </xs:sequence>
-        <xs:element ref="layout"/>
-      </xs:sequence>
-      <xs:attribute name="class" use="required"/>
-      <xs:attribute name="name" use="required" type="xs:NCName"/>
-    </xs:complexType>
-  </xs:element>
-  <xs:element name="File" type="xs:string"/>
-  <xs:element name="Append" type="xs:boolean"/>
-  <xs:element name="Encoding" type="xs:NCName"/>
-  <xs:element name="BufferedIO" type="xs:boolean"/>
-  <xs:element name="ImmediateFlush" type="xs:boolean"/>
-  <xs:element name="layout">
-    <xs:complexType>
-      <xs:choice>
-        <xs:element ref="Pattern"/>
-        <xs:element ref="pattern"/>
-      </xs:choice>
-      <xs:attribute name="class" use="required"/>
-    </xs:complexType>
-  </xs:element>
-  <xs:element name="Pattern" type="xs:string"/>
-  <xs:element name="pattern" type="xs:string"/>
-  <xs:element name="logger">
-    <xs:complexType>
-      <xs:sequence>
-        <xs:element maxOccurs="unbounded" minOccurs="0" ref="appender-ref"/>
-        <xs:element maxOccurs="1" minOccurs="0" ref="level"/>
-      </xs:sequence>
-      <xs:attribute name="name" use="required" type="xs:NCName"/>
-      <xs:attribute name="level" type="LoggerLevels" use="optional"/>
-    </xs:complexType>
-  </xs:element>
-  <xs:element name="root">
-    <xs:complexType>
-      <xs:sequence>
-        <xs:element minOccurs="0" maxOccurs="unbounded" ref="appender-ref"/>
-      </xs:sequence>
-      <xs:attribute name="level" type="LoggerLevels" use="optional"/>
-    </xs:complexType>
-  </xs:element>
-  <xs:element name="appender-ref">
-    <xs:complexType>
-      <xs:attribute name="ref" use="required" type="xs:NCName"/>
-    </xs:complexType>
-  </xs:element>
-  <xs:complexType name="level">
-    <xs:sequence>
-      <xs:element ref="level"/>
-    </xs:sequence>
-  </xs:complexType>
-  <xs:element name="level">
-    <xs:complexType>
-      <xs:attribute name="value" use="required" type="xs:NCName"/>
-    </xs:complexType>
-  </xs:element>
-  <xs:simpleType name="LoggerLevels">
-    <xs:restriction base="xs:string">
-      <xs:pattern value="off|OFF|all|ALL|inherited|INHERITED|null|NULL|error|ERROR|warn|WARN|info|INFO|debug|DEBUG|trace|TRACE"/>
-    </xs:restriction>
-  </xs:simpleType>
-</xs:schema>
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 3d841a5..d965572 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
@@ -24,31 +24,23 @@
 	<jmxConfigurator contextName="${current_openmeetings_context_name}" />
 
 	<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
-		<File>log/${current_openmeetings_context_name}.log</File>
-		<Append>false</Append>
-		<Encoding>UTF-8</Encoding>
-		<BufferedIO>false</BufferedIO>
-		<ImmediateFlush>true</ImmediateFlush>
-		<layout class="ch.qos.logback.classic.PatternLayout">
-			<Pattern>
-				%5p %d{MM-dd HH:mm:ss.SSS } %c{15}:%L [%.15thread] - %m%n
-			</Pattern>
-		</layout>
-		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
-			<!-- daily rollover -->
-			<fileNamePattern>log\${current_openmeetings_context_name}.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
-			<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
-				<!-- or whenever the file size reaches 100MB -->
-				<maxFileSize>50MB</maxFileSize>
-			</timeBasedFileNamingAndTriggeringPolicy>
-			<!-- keep 30 days' worth of history -->
-			<maxHistory>50</maxHistory>
+		<file>log/${current_openmeetings_context_name}.log</file>
+		<immediateFlush>true</immediateFlush>
+		<encoder>
+			<charset>UTF-8</charset>
+			<pattern>%5p %d{MM-dd HH:mm:ss.SSS } %c{15}:%L [%.15thread] - %m%n</pattern>
+		</encoder>
+		<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
+			<fileNamePattern>log/${current_openmeetings_context_name}.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
+			<maxFileSize>50MB</maxFileSize>
+			<maxHistory>7</maxHistory>
 		</rollingPolicy>
 	</appender>
 	<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
-		<layout class="ch.qos.logback.classic.PatternLayout">
+		<encoder>
+			<charset>UTF-8</charset>
 			<pattern>%highlight(%-5level) %d{MM-dd HH:mm:ss.SSS } %cyan(%c{15}:%L [%.15thread]) - %m%n</pattern>
-		</layout>
+		</encoder>
 	</appender>
 	<logger name="com.mchange.v2" level="ERROR" />
 	<logger name="org.apache.axiom" level="ERROR" />
diff --git a/openmeetings-web/src/test/resources/logback-test.xml b/openmeetings-web/src/test/resources/logback-test.xml
index 6463b06..d965572 100644
--- a/openmeetings-web/src/test/resources/logback-test.xml
+++ b/openmeetings-web/src/test/resources/logback-test.xml
@@ -24,31 +24,23 @@
 	<jmxConfigurator contextName="${current_openmeetings_context_name}" />
 
 	<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
-		<File>log/${current_openmeetings_context_name}.log</File>
-		<Append>false</Append>
-		<Encoding>UTF-8</Encoding>
-		<BufferedIO>false</BufferedIO>
-		<ImmediateFlush>true</ImmediateFlush>
-		<layout class="ch.qos.logback.classic.PatternLayout">
-			<Pattern>
-				%5p %d{MM-dd HH:mm:ss.SSS } %c{15}:%L [%.15thread] - %m%n
-			</Pattern>
-		</layout>
-		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
-			<!-- daily rollover -->
-			<fileNamePattern>log\${current_openmeetings_context_name}.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
-			<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
-				<!-- or whenever the file size reaches 100MB -->
-				<maxFileSize>50MB</maxFileSize>
-			</timeBasedFileNamingAndTriggeringPolicy>
-			<!-- keep 30 days' worth of history -->
-			<maxHistory>50</maxHistory>
+		<file>log/${current_openmeetings_context_name}.log</file>
+		<immediateFlush>true</immediateFlush>
+		<encoder>
+			<charset>UTF-8</charset>
+			<pattern>%5p %d{MM-dd HH:mm:ss.SSS } %c{15}:%L [%.15thread] - %m%n</pattern>
+		</encoder>
+		<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
+			<fileNamePattern>log/${current_openmeetings_context_name}.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
+			<maxFileSize>50MB</maxFileSize>
+			<maxHistory>7</maxHistory>
 		</rollingPolicy>
 	</appender>
 	<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
-		<layout class="ch.qos.logback.classic.PatternLayout">
-			<pattern>%5p %d{MM-dd HH:mm:ss.SSS } %r %L %c{15} [%.15thread] - %m%n</pattern>
-		</layout>
+		<encoder>
+			<charset>UTF-8</charset>
+			<pattern>%highlight(%-5level) %d{MM-dd HH:mm:ss.SSS } %cyan(%c{15}:%L [%.15thread]) - %m%n</pattern>
+		</encoder>
 	</appender>
 	<logger name="com.mchange.v2" level="ERROR" />
 	<logger name="org.apache.axiom" level="ERROR" />

-- 
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 4.0.x
in repository https://gitbox.apache.org/repos/asf/openmeetings.git

commit 4aa2d52516bcc7140915bb705603b78cee26bc8f
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 ee874ef..3578ae7 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(getBean(ConfigurationDao.class).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 aa30b4f..6ad8fd4 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
@@ -131,11 +131,6 @@ public class GroupForm extends AdminBaseForm<Group> {
 	}
 
 	@Override
-	protected boolean isNewBtnVisible() {
-		return !hasGroupAdminLevel(getRights());
-	}
-
-	@Override
 	protected boolean isDelBtnVisible() {
 		return !hasGroupAdminLevel(getRights());
 	}
@@ -144,6 +139,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);
@@ -220,7 +216,7 @@ public class GroupForm extends AdminBaseForm<Group> {
 		for (GroupUser grpUser : usersPanel.getUsers2add()) {
 			GroupUsersPanel.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 677e656..ab39873 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
@@ -92,7 +92,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>(
@@ -123,7 +123,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 477ea0e..a54535f 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
@@ -71,7 +71,7 @@ public class LdapForm extends AdminBaseForm<LdapConfig> {
 	@Override
 	protected void onSaveSubmit(AjaxRequestTarget target, Form<?> form) {
 		setModelObject(getBean(LdapConfigDao.class).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 1e693c2..a567899 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
@@ -83,7 +83,7 @@ public class OAuthForm extends AdminBaseForm<OAuthServer> {
 		oAuth2Dao.update(getModelObject(), WebSession.getUserId());
 		OAuthServer oauthServer = oAuth2Dao.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 e6e0709..d44ea3e 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
@@ -432,7 +432,7 @@ public class RoomForm extends AdminBaseForm<Room> {
 			}
 			getBean(RoomDao.class).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 4016b30..b147015 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
@@ -60,7 +60,7 @@ public class RoomsPanel extends AdminBasePanel {
 
 					@Override
 					protected void onEvent(AjaxRequestTarget target) {
-						form.hideNewRecord();
+						form.setNewVisible(false);
 						form.setModelObject(getBean(RoomDao.class).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 9dfae69..b450e01 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
@@ -86,6 +86,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 = Red5LoggerFactory.getLogger(UserForm.class, getWebAppRootKey());
+	private final WebMarkupContainer mainContainer = new WebMarkupContainer("adminForm");
 	private final WebMarkupContainer listContainer;
 	private final WebMarkupContainer domain = new WebMarkupContainer("domain");
 	private GeneralUserForm generalForm;
@@ -101,18 +102,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
@@ -121,14 +123,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
@@ -162,19 +164,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());
@@ -219,7 +220,7 @@ public class UserForm extends AdminBaseForm<User> {
 			getBean(EmailManager.class).sendMail(login.getValue(), email, u.getActivatehash(), false, null);
 		}
 		setModelObject(dao.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 1ac2c79..569a19f 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
@@ -71,7 +71,7 @@ public class UsersPanel extends AdminBasePanel {
 					@Override
 					protected void onEvent(AjaxRequestTarget target) {
 						form.setModelObject(getBean(UserDao.class).get(userId));
-						form.hideNewRecord();
+						form.setNewVisible(false);
 						form.update(target);
 					}
 				});
@@ -113,7 +113,7 @@ public class UsersPanel extends AdminBasePanel {
 
 		UserDao userDao = getBean(UserDao.class);
 		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 51a69e8..81cec34 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
@@ -124,7 +124,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);
@@ -296,7 +296,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 1d4f227..5db2a9a 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 773c061..3eb7262 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] 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 4.0.x
in repository https://gitbox.apache.org/repos/asf/openmeetings.git

commit b4beda5064826ba61fbff0bbea0d731c12709d21
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 f98e5ec..743b4cd 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
@@ -137,7 +137,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);
@@ -159,7 +159,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 4970ca3..431ed9a 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
@@ -158,7 +158,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);
@@ -192,7 +192,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 a9ad590..54a6ff9 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
@@ -152,7 +152,7 @@ public class RoomForm extends AdminBaseForm<Room> {
 		add(new CheckBox("ispublic").setEnabled(!isGroupAdmin));
 
 		List<Group> orgList = isGroupAdmin
-				? getBean(GroupDao.class).get(null, getUserId(), 0, Integer.MAX_VALUE, null)
+				? getBean(GroupDao.class).adminGet(null, getUserId(), 0, Integer.MAX_VALUE, null)
 				: getBean(GroupDao.class).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 4c6eaed..3209c13 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
@@ -156,7 +156,7 @@ public class GeneralUserForm extends Form<User> {
 		grpUsers.addAll(u.getGroupUsers());
 		if (isAdminForm) {
 			List<Group> grpList = hasGroupAdminLevel(getRights())
-					? getBean(GroupDao.class).get(null, getUserId(), 0, Integer.MAX_VALUE, null)
+					? getBean(GroupDao.class).adminGet(null, getUserId(), 0, Integer.MAX_VALUE, null)
 					: getBean(GroupDao.class).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] 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 4.0.x
in repository https://gitbox.apache.org/repos/asf/openmeetings.git

commit 2716d75af0b11b6f75cf434664c1ce6badae8d61
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 4a6b29b..59e2abe 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>
@@ -1029,7 +1030,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] 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 4.0.x
in repository https://gitbox.apache.org/repos/asf/openmeetings.git

commit 62dcc549108be724cb3695312a0f8ee81b0f1c28
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 431ed9a..de004ad 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
@@ -147,19 +147,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);
@@ -199,25 +227,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 f091a53..ee874ef 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
@@ -31,7 +31,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;
@@ -44,7 +43,6 @@ import org.apache.wicket.markup.html.form.TextField;
 import org.apache.wicket.model.CompoundPropertyModel;
 import org.apache.wicket.model.IModel;
 import org.apache.wicket.model.Model;
-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;
@@ -80,10 +78,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 e453240..aa30b4f 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
@@ -39,7 +39,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.RequiredTextField;
 import org.apache.wicket.markup.html.form.TextField;
 import org.apache.wicket.model.CompoundPropertyModel;
 import org.apache.wicket.model.Model;
-import org.apache.wicket.util.time.Duration;
 import org.wicketstuff.select2.Select2Choice;
 
 public class GroupForm extends AdminBaseForm<Group> {
@@ -126,9 +124,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 c1276b2..477ea0e 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
@@ -26,7 +26,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;
@@ -36,7 +35,6 @@ import org.apache.wicket.markup.html.form.TextArea;
 import org.apache.wicket.markup.html.form.TextField;
 import org.apache.wicket.model.CompoundPropertyModel;
 import org.apache.wicket.model.Model;
-import org.apache.wicket.util.time.Duration;
 
 /**
  * Form components to insert/update/delete {@link LdapConfig}
@@ -61,10 +59,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 4a4608e..1e693c2 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
@@ -29,7 +29,6 @@ import org.apache.openmeetings.web.admin.AdminBaseForm;
 import org.apache.openmeetings.web.app.Application;
 import org.apache.openmeetings.web.app.WebSession;
 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.RequiredTextField;
 import org.apache.wicket.markup.html.form.TextField;
 import org.apache.wicket.model.CompoundPropertyModel;
 import org.apache.wicket.model.Model;
-import org.apache.wicket.util.time.Duration;
 
 public class OAuthForm extends AdminBaseForm<OAuthServer> {
 	private static final long serialVersionUID = 1L;
@@ -53,10 +51,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 54a6ff9..e6e0709 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
@@ -56,7 +56,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.Model;
 import org.apache.wicket.model.PropertyModel;
 import org.apache.wicket.model.util.CollectionModel;
 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;
@@ -411,10 +409,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 bc527d5..9dfae69 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
@@ -55,7 +55,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;
@@ -70,7 +69,6 @@ import org.apache.wicket.markup.html.panel.PanelMarkupSourcingStrategy;
 import org.apache.wicket.model.CompoundPropertyModel;
 import org.apache.wicket.model.Model;
 import org.apache.wicket.util.string.Strings;
-import org.apache.wicket.util.time.Duration;
 import org.danekja.java.util.function.serializable.SerializableConsumer;
 import org.red5.logging.Red5LoggerFactory;
 import org.slf4j.Logger;
@@ -165,16 +163,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 6162088..1ac2c79 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
@@ -75,7 +75,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 5314833..69402be 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
@@ -243,6 +243,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 6908ae6..4a6b29b 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] 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 4.0.x
in repository https://gitbox.apache.org/repos/asf/openmeetings.git

commit df7e4fb59fa265d617acb3e3d3a9909a1f8ac29d
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 d0f72d0..ae14a44 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
@@ -123,7 +123,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] 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 4.0.x
in repository https://gitbox.apache.org/repos/asf/openmeetings.git

commit 58ac804ea60d6710a11747a4f41db1b57270499c
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 6ad8fd4..e0c6ae8 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
@@ -131,11 +131,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());
@@ -166,6 +161,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 b450e01..7bee061 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
@@ -173,15 +173,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 5db2a9a..70aeeb3 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.