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:28 UTC

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

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.