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 2020/02/11 17:36:55 UTC

[openmeetings] branch csp updated: [OPENMEETINGS-2165] more work on file tree and friends

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

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


The following commit(s) were added to refs/heads/csp by this push:
     new b9e3075  [OPENMEETINGS-2165] more work on file tree and friends
b9e3075 is described below

commit b9e3075e4a37eae038080876d83dd84eb827f1f5
Author: Maxim Solodovnik <so...@gmail.com>
AuthorDate: Wed Feb 12 00:36:40 2020 +0700

    [OPENMEETINGS-2165] more work on file tree and friends
---
 .../openmeetings/web/admin/email/EmailForm.java    | 39 +++++----
 .../openmeetings/web/admin/email/EmailPanel.html   |  6 +-
 .../openmeetings/web/admin/email/EmailPanel.java   |  2 +-
 .../web/admin/users/PasswordDialog.java            |  2 +-
 .../openmeetings/web/common/InvitationDialog.java  |  6 +-
 .../apache/openmeetings/web/common/NameDialog.java |  2 +-
 .../web/common/UploadableImagePanel.java           | 12 +--
 .../web/common/tree/DownloadMenuItem.java          | 60 --------------
 .../web/common/tree/FileTreePanel.java             | 80 +++++++++++++-----
 .../openmeetings/web/common/tree/FolderPanel.java  |  4 +-
 .../apache/openmeetings/web/pages/HashPage.java    |  2 +-
 .../web/pages/auth/ForgetPasswordDialog.java       |  4 +-
 .../web/pages/auth/RegisterDialog.java             |  4 +-
 .../web/pages/auth/ResetPasswordDialog.java        |  2 +-
 .../openmeetings/web/pages/auth/SignInDialog.html  |  2 +-
 .../openmeetings/web/pages/auth/SignInDialog.java  | 29 ++++---
 .../web/room/activities/ActivitiesPanel.java       | 23 +++---
 .../web/user/InviteUserMessageDialog.java          |  4 +-
 .../web/user/InviteUserToRoomDialog.java           |  2 +-
 .../openmeetings/web/user/MessageDialog.java       |  4 +-
 .../openmeetings/web/user/UserInfoDialog.java      |  6 +-
 .../dashboard/admin/AdminCleanupInfoDialog.java    |  2 +-
 .../web/user/dashboard/admin/AdminWidgetView.java  |  2 +-
 .../openmeetings/web/user/record/VideoInfo.html    |  4 +-
 .../openmeetings/web/user/record/VideoInfo.java    | 96 +++++++++++-----------
 .../src/main/webapp/css/raw-general.css            | 20 ++++-
 openmeetings-web/src/main/webapp/css/raw-tree.css  |  2 +
 .../src/main/webapp/css/raw-variables.css          |  4 +-
 28 files changed, 214 insertions(+), 211 deletions(-)

diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/email/EmailForm.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/email/EmailForm.java
index 694c54d..cccb431 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/email/EmailForm.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/email/EmailForm.java
@@ -18,25 +18,29 @@
  */
 package org.apache.openmeetings.web.admin.email;
 
+import static org.apache.openmeetings.web.util.CallbackFunctionHelper.newOkCancelDangerConfirm;
+
 import org.apache.openmeetings.db.dao.basic.MailMessageDao;
 import org.apache.openmeetings.db.entity.basic.MailMessage;
-import org.apache.openmeetings.web.common.confirmation.ConfirmableAjaxBorder;
 import org.apache.openmeetings.web.util.DateLabel;
 import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.ajax.markup.html.form.AjaxButton;
 import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.markup.html.form.Form;
 import org.apache.wicket.model.CompoundPropertyModel;
 import org.apache.wicket.model.Model;
+import org.apache.wicket.model.ResourceModel;
 import org.apache.wicket.spring.injection.annot.SpringBean;
 
-import com.googlecode.wicket.jquery.ui.form.button.AjaxButton;
+import de.agilecoders.wicket.core.markup.html.bootstrap.button.BootstrapAjaxButton;
+import de.agilecoders.wicket.core.markup.html.bootstrap.button.Buttons;
 
 public class EmailForm extends Form<MailMessage> {
 	private static final long serialVersionUID = 1L;
-	private final Label status;
-	private final AjaxButton reset;
-	private ConfirmableAjaxBorder delBtn;
+	private final Label status = new Label("status", Model.of(""));
+	private BootstrapAjaxButton reset;
+	private AjaxButton delBtn;
 	private final WebMarkupContainer list;
 	@SpringBean
 	private MailMessageDao emailDao;
@@ -44,7 +48,12 @@ public class EmailForm extends Form<MailMessage> {
 	public EmailForm(String id, final WebMarkupContainer list, MailMessage m) {
 		super(id, new CompoundPropertyModel<>(m));
 		this.list = list;
-		add(status = new Label("status", Model.of("")));
+	}
+
+	@Override
+	protected void onInitialize() {
+		super.onInitialize();
+		add(status);
 		add(new Label("subject"));
 		add(new Label("recipients"));
 		add(new Label("body").setEscapeModelStrings(false));
@@ -52,7 +61,7 @@ public class EmailForm extends Form<MailMessage> {
 		add(new DateLabel("updated"));
 		add(new Label("errorCount"));
 		add(new Label("lastError"));
-		add(reset = new AjaxButton("reset") {
+		add(reset = new BootstrapAjaxButton("reset", new ResourceModel("admin.email.reset.status"), Buttons.Type.Outline_Primary) {
 			private static final long serialVersionUID = 1L;
 
 			@Override
@@ -62,30 +71,26 @@ public class EmailForm extends Form<MailMessage> {
 			}
 		});
 		reset.setEnabled(false);
-	}
-
-	@Override
-	protected void onInitialize() {
-		super.onInitialize();
 		// add a cancel button that can be used to submit the form via ajax
-		delBtn = new ConfirmableAjaxBorder("ajax-cancel-button", getString("80"), getString("833"), this) {
+		delBtn = new AjaxButton("btn-delete", this) {
 			private static final long serialVersionUID = 1L;
 
 			@Override
 			protected void onSubmit(AjaxRequestTarget target) {
-				emailDao.delete(getModelObject().getId());
-				setModelObject(new MailMessage());
+				emailDao.delete(EmailForm.this.getModelObject().getId());
+				EmailForm.this.setModelObject(new MailMessage());
 				target.add(list, EmailForm.this);
 			}
 		};
-		add(delBtn.setOutputMarkupId(true).setEnabled(false));
+		delBtn.add(newOkCancelDangerConfirm(this, getString("833")));
+		add(delBtn.setOutputMarkupPlaceholderTag(true).setOutputMarkupId(true).setVisible(false));
 	}
 
 	@Override
 	protected void onModelChanged() {
 		super.onModelChanged();
 		MailMessage m = getModelObject();
-		delBtn.setEnabled(m.getId() != null);
+		delBtn.setVisible(m.getId() != null);
 		status.setDefaultModelObject(getString("admin.email.status." + m.getStatus().name()));
 		reset.setEnabled(m.getId() != null && MailMessage.Status.ERROR == m.getStatus());
 	}
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 c34ceec..de64b20 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
@@ -43,8 +43,8 @@
 	<div class="adminPanelColumnForm">
 		<form wicket:id="form" class="adminForm">
 			<div class="actions ui-widget-header">
-				<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 class="btn btn-outline-warning btn-sm" wicket:id="btn-delete" wicket:message="title:157,data-original-title:157">
+					<i class="fas fa-times"></i>
 				</div>
 			</div>
 			<div class="scrollcontent" id="adminForm">
@@ -84,7 +84,7 @@
 							<div class="col-8 d-inline-block text-pre" wicket:id="lastError"></div>
 						</div>
 					</div>
-					<button wicket:id="reset" class="align-right mr-3"><wicket:message key="admin.email.reset.status"/></button>
+					<button wicket:id="reset" class="align-right mr-3"></button>
 				</fieldset>
 				<div class="bottom-bumper"></div>
 			</div>
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/email/EmailPanel.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/email/EmailPanel.java
index caf3373..0d825fc 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/email/EmailPanel.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/email/EmailPanel.java
@@ -88,7 +88,7 @@ public class EmailPanel extends AdminBasePanel {
 	private StringBuilder getRowClass(final MailMessage m) {
 		StringBuilder sb = getRowClass(m.getId(), form.getModelObject().getId());
 		if (MailMessage.Status.ERROR == m.getStatus()) {
-			sb.append(" ui-state-error");
+			sb.append(" bg-warning");
 		}
 		return sb;
 	}
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/PasswordDialog.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/PasswordDialog.java
index c8a911a..f3876c2 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/PasswordDialog.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/PasswordDialog.java
@@ -58,7 +58,7 @@ public class PasswordDialog extends Modal<String> {
 		setCloseOnEscapeKey(true);
 		setBackdrop(Backdrop.STATIC);
 
-		addButton(new BootstrapAjaxButton("button", new ResourceModel("54"), form, Buttons.Type.Primary) {
+		addButton(new BootstrapAjaxButton("button", new ResourceModel("54"), form, Buttons.Type.Outline_Primary) {
 			private static final long serialVersionUID = 1L;
 
 			@Override
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/InvitationDialog.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/InvitationDialog.java
index 02ba355..f31ccc9 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/InvitationDialog.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/InvitationDialog.java
@@ -45,7 +45,7 @@ public class InvitationDialog extends Modal<Invitation> {
 		setCloseOnEscapeKey(true);
 		setBackdrop(Backdrop.STATIC);
 
-		addButton(generate = new BootstrapAjaxButton("button", new ResourceModel("1526"), form, Buttons.Type.Primary) {
+		addButton(generate = new BootstrapAjaxButton("button", new ResourceModel("1526"), form, Buttons.Type.Outline_Primary) {
 			private static final long serialVersionUID = 1L;
 
 			@Override
@@ -58,7 +58,7 @@ public class InvitationDialog extends Modal<Invitation> {
 				InvitationDialog.this.onClick(target, InvitationForm.Action.GENERATE);
 			}
 		});
-		addButton(send = new BootstrapAjaxButton("button", new ResourceModel("218"), form, Buttons.Type.Primary) {
+		addButton(send = new BootstrapAjaxButton("button", new ResourceModel("218"), form, Buttons.Type.Outline_Primary) {
 			private static final long serialVersionUID = 1L;
 
 			@Override
@@ -71,7 +71,7 @@ public class InvitationDialog extends Modal<Invitation> {
 				InvitationDialog.this.onClick(target, InvitationForm.Action.SEND);
 			}
 		});
-		addButton(new BootstrapAjaxLink<>("button", Model.of(""), Buttons.Type.Secondary, new ResourceModel("lbl.cancel")) {
+		addButton(new BootstrapAjaxLink<>("button", Model.of(""), Buttons.Type.Outline_Secondary, new ResourceModel("lbl.cancel")) {
 			private static final long serialVersionUID = 1L;
 
 			public void onClick(AjaxRequestTarget target) {
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/NameDialog.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/NameDialog.java
index ef6c7a3..6ed3271 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/NameDialog.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/NameDialog.java
@@ -57,7 +57,7 @@ public abstract class NameDialog extends Modal<String> {
 		setBackdrop(Backdrop.STATIC);
 
 		addCloseButton(new ResourceModel("lbl.cancel"));
-		addButton(new BootstrapAjaxButton("button", getAddBtnLabel(), form, Buttons.Type.Primary) {
+		addButton(new BootstrapAjaxButton("button", getAddBtnLabel(), form, Buttons.Type.Outline_Primary) {
 			private static final long serialVersionUID = 1L;
 
 			@Override
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/UploadableImagePanel.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/UploadableImagePanel.java
index d3b32e4..ff2f174 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/UploadableImagePanel.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/UploadableImagePanel.java
@@ -30,8 +30,6 @@ import org.apache.wicket.AttributeModifier;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.ajax.form.AjaxFormSubmitBehavior;
 import org.apache.wicket.extensions.ajax.markup.html.form.upload.UploadProgressBar;
-import org.apache.wicket.markup.head.IHeaderResponse;
-import org.apache.wicket.markup.head.OnDomReadyHeaderItem;
 import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.markup.html.form.Form;
 import org.apache.wicket.markup.html.form.upload.FileUpload;
@@ -48,7 +46,6 @@ import de.agilecoders.wicket.extensions.markup.html.bootstrap.icon.FontAwesome5I
 public abstract class UploadableImagePanel extends ImagePanel {
 	private static final long serialVersionUID = 1L;
 	private static final Logger log = LoggerFactory.getLogger(UploadableImagePanel.class);
-	private static final String HOVER = "$('.profile .ui-button-icon.ui-icon.ui-icon-closethick.remove').hover(function (e) {$(this).toggleClass('ui-widget-content', e.type === 'mouseenter');});";
 	private final FileUploadField fileUploadField = new FileUploadField("image", new ListModel<FileUpload>());
 	private final Form<Void> form = new Form<>("form");
 	private final boolean delayed;
@@ -75,7 +72,7 @@ public abstract class UploadableImagePanel extends ImagePanel {
 			add(new WebMarkupContainer("remove").add(AttributeModifier.append("onclick"
 					, "$(this).parent().find('.fileinput').fileinput('clear');")));
 		} else {
-			BootstrapAjaxLink<String> remove = new BootstrapAjaxLink<>("remove", Buttons.Type.Secondary) {
+			BootstrapAjaxLink<String> remove = new BootstrapAjaxLink<>("remove", Buttons.Type.Outline_Secondary) {
 				private static final long serialVersionUID = 1L;
 
 				@Override
@@ -105,12 +102,6 @@ public abstract class UploadableImagePanel extends ImagePanel {
 	}
 
 	@Override
-	public void renderHead(IHeaderResponse response) {
-		super.renderHead(response);
-		response.render(OnDomReadyHeaderItem.forScript(HOVER));
-	}
-
-	@Override
 	public void update() {
 		profile.addOrReplace(new WebMarkupContainer("img").setVisible(false));
 		form.addOrReplace(getImage());
@@ -120,7 +111,6 @@ public abstract class UploadableImagePanel extends ImagePanel {
 		update();
 		target.ifPresent(t -> {
 			t.add(profile, form);
-			t.appendJavaScript(HOVER);
 		});
 	}
 
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/DownloadMenuItem.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/DownloadMenuItem.java
deleted file mode 100644
index 56e87ad..0000000
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/DownloadMenuItem.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * 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.
- */
-package org.apache.openmeetings.web.common.tree;
-
-import java.io.File;
-
-import org.apache.openmeetings.db.entity.file.BaseFileItem;
-import org.apache.openmeetings.db.entity.file.BaseFileItem.Type;
-import org.apache.wicket.ajax.AjaxRequestTarget;
-
-import com.googlecode.wicket.jquery.ui.JQueryIcon;
-import com.googlecode.wicket.jquery.ui.widget.menu.MenuItem;
-
-public class DownloadMenuItem extends MenuItem {
-	private static final long serialVersionUID = 1L;
-	private final String ext;
-	private final FileTreePanel tree;
-
-	public DownloadMenuItem(String title, FileTreePanel tree, String ext) {
-		super(title, JQueryIcon.ARROWTHICKSTOP_1_S);
-		this.ext = ext;
-		this.tree = tree;
-	}
-
-	@Override
-	public boolean isEnabled() {
-		File f = null;
-		if (tree.getSelected().size() == 1) {
-			f = tree.getLastSelected().getFile(ext);
-		}
-		return f != null && f.exists();
-	}
-
-	@Override
-	public void onClick(AjaxRequestTarget target) {
-		BaseFileItem fi = tree.getLastSelected();
-		File f = ext == null && (Type.Image == fi.getType() || Type.Presentation == fi.getType())
-				? fi.getOriginal() : fi.getFile(ext);
-		if (f != null && f.exists()) {
-			tree.dwnldFile = f;
-			tree.downloader.initiate(target);
-		}
-	}
-}
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileTreePanel.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileTreePanel.java
index ddbcfcc..6879ff0 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileTreePanel.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileTreePanel.java
@@ -29,7 +29,6 @@ import static org.apache.openmeetings.web.common.BasePanel.EVT_CLICK;
 
 import java.io.File;
 import java.nio.file.Path;
-import java.util.ArrayList;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
@@ -57,9 +56,11 @@ import org.apache.wicket.markup.head.JavaScriptHeaderItem;
 import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.markup.html.form.Form;
+import org.apache.wicket.markup.html.link.AbstractLink;
 import org.apache.wicket.markup.html.panel.Panel;
 import org.apache.wicket.model.IModel;
 import org.apache.wicket.model.Model;
+import org.apache.wicket.model.ResourceModel;
 import org.apache.wicket.request.resource.IResource;
 import org.apache.wicket.request.resource.JavaScriptResourceReference;
 import org.apache.wicket.resource.FileSystemResource;
@@ -69,10 +70,15 @@ import com.googlecode.wicket.jquery.core.JQueryBehavior;
 import com.googlecode.wicket.jquery.core.Options;
 import com.googlecode.wicket.jquery.core.ajax.IJQueryAjaxAware;
 import com.googlecode.wicket.jquery.core.ajax.JQueryAjaxBehavior;
-import com.googlecode.wicket.jquery.ui.form.button.AjaxSplitButton;
 import com.googlecode.wicket.jquery.ui.interaction.droppable.Droppable;
 import com.googlecode.wicket.jquery.ui.interaction.droppable.DroppableBehavior;
-import com.googlecode.wicket.jquery.ui.widget.menu.IMenuItem;
+
+import de.agilecoders.wicket.core.markup.html.bootstrap.button.BootstrapAjaxLink;
+import de.agilecoders.wicket.core.markup.html.bootstrap.button.ButtonBehavior;
+import de.agilecoders.wicket.core.markup.html.bootstrap.button.Buttons;
+import de.agilecoders.wicket.core.markup.html.bootstrap.button.dropdown.SplitButton;
+import de.agilecoders.wicket.core.markup.html.bootstrap.image.IconType;
+import de.agilecoders.wicket.extensions.markup.html.bootstrap.icon.FontAwesome5IconType;
 
 public abstract class FileTreePanel extends Panel {
 	private static final long serialVersionUID = 1L;
@@ -87,7 +93,7 @@ public abstract class FileTreePanel extends Panel {
 	private final WebMarkupContainer sizes = new WebMarkupContainer("sizes");
 	private BaseFileItem lastSelected = null;
 	private Map<String, BaseFileItem> selected = new HashMap<>();
-	File dwnldFile;
+	private File dwnldFile;
 	final AjaxDownloadBehavior downloader = new AjaxDownloadBehavior(new IResource() {
 		private static final long serialVersionUID = 1L;
 
@@ -109,12 +115,57 @@ public abstract class FileTreePanel extends Panel {
 	protected final IModel<String> publicSize = Model.of((String)null);
 	final ConvertingErrorsDialog errorsDialog = new ConvertingErrorsDialog("errors", Model.of((Recording)null));
 	final FileItemTree tree;
-	final AjaxSplitButton download = new AjaxSplitButton("download", new ArrayList<IMenuItem>()) {
+	private final SplitButton download = new SplitButton("download", Model.of("")) {
 		private static final long serialVersionUID = 1L;
 
+		private AbstractLink createLink(String markupId, IModel<String> model, String ext) {
+			return new BootstrapAjaxLink<>(markupId, model, Buttons.Type.Outline_Primary, model) {
+				private static final long serialVersionUID = 1L;
+
+				@Override
+				public boolean isEnabled() {
+					File f = null;
+					if (getSelected().size() == 1) {
+						f = getLastSelected().getFile(ext);
+					}
+					return f != null && f.exists();
+				}
+
+				@Override
+				public void onClick(AjaxRequestTarget target) {
+					onDownlownClick(target, ext);
+				}
+			}.setIconType(FontAwesome5IconType.download_s);
+		}
+
 		@Override
-		protected void onSubmit(AjaxRequestTarget target, IMenuItem item) {
-			item.onClick(target);
+		protected List<AbstractLink> newSubMenuButtons(String buttonMarkupId) {
+			return List.of(
+					createLink(buttonMarkupId, new ResourceModel("files.download.original"), null)
+					, createLink(buttonMarkupId, new ResourceModel("files.download.pdf"), EXTENSION_PDF)
+					, createLink(buttonMarkupId, new ResourceModel("files.download.jpg"), EXTENSION_JPG)
+					);
+		}
+
+		@Override
+		protected void addButtonBehavior(ButtonBehavior buttonBehavior) {
+			buttonBehavior.setSize(Buttons.Size.Small).setType(Buttons.Type.Outline_Secondary);
+			super.addButtonBehavior(buttonBehavior);
+		}
+
+		@Override
+		protected AbstractLink newBaseButton(String markupId, IModel<String> labelModel, IModel<IconType> iconTypeModel) {
+			return createLink(markupId, new ResourceModel("files.download.original"), null);
+		}
+
+		public void onDownlownClick(AjaxRequestTarget target, String ext) {
+			BaseFileItem fi = getLastSelected();
+			File f = ext == null && (Type.Image == fi.getType() || Type.Presentation == fi.getType())
+					? fi.getOriginal() : fi.getFile(ext);
+			if (f != null && f.exists()) {
+				dwnldFile = f;
+				downloader.initiate(target);
+			}
 		}
 	};
 	private final Form<Void> form = new Form<>("form");
@@ -152,14 +203,13 @@ public abstract class FileTreePanel extends Panel {
 	@Override
 	protected void onInitialize() {
 		super.onInitialize();
-		download.setDefaultModelObject(newDownloadMenuList());
 		Droppable<BaseFileItem> trashToolbar = new Droppable<>("trash-toolbar") {
 			private static final long serialVersionUID = 1L;
 
 			@Override
 			public void onConfigure(JQueryBehavior behavior) {
 				super.onConfigure(behavior);
-				behavior.setOption("hoverClass", Options.asString("ui-state-hover trash-toolbar-hover"));
+				behavior.setOption("hoverClass", Options.asString("bg-light trash-toolbar-hover"));
 				behavior.setOption("accept", Options.asString(".recorditem, .fileitem"));
 			}
 
@@ -424,16 +474,4 @@ public abstract class FileTreePanel extends Panel {
 		publicSize.detach();
 		super.onDetach();
 	}
-
-	private List<IMenuItem> newDownloadMenuList() {
-		List<IMenuItem> list = new ArrayList<>();
-
-		//original
-		list.add(new DownloadMenuItem(getString("files.download.original"), this, null));
-		//pdf
-		list.add(new DownloadMenuItem(getString("files.download.pdf"), this, EXTENSION_PDF));
-		//jpg
-		list.add(new DownloadMenuItem(getString("files.download.jpg"), this, EXTENSION_JPG));
-		return list;
-	}
 }
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FolderPanel.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FolderPanel.java
index 717c058..ec3461c 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FolderPanel.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FolderPanel.java
@@ -83,7 +83,7 @@ public class FolderPanel extends Panel implements IDraggableListener, IDroppable
 			add(new DroppableBehavior(
 					selector
 					, new Options()
-						.set("hoverClass", Options.asString("ui-state-hover"))
+						.set("hoverClass", Options.asString("bg-light"))
 						.set("accept", Options.asString(getDefaultModelObject() instanceof Recording ? ".recorditem" : ".fileitem"))
 					, this));
 		}
@@ -221,7 +221,7 @@ public class FolderPanel extends Panel implements IDraggableListener, IDroppable
 			}
 		}
 		if (treePanel.isSelected(f)) {
-			style.append("ui-state-active ");
+			style.append("bg-info ");
 		}
 		String cls = f instanceof Recording ? "recorditem " : "fileitem ";
 		style.append(f.isReadOnly() ? "readonlyitem " : cls);
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/HashPage.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/HashPage.java
index 8bc7ca7..c1ce91a 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/HashPage.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/HashPage.java
@@ -69,7 +69,7 @@ public class HashPage extends BaseInitedPage implements IUpdatable {
 	static final String HASH = "secure";
 	static final String LANG = "language";
 	private final WebMarkupContainer recContainer = new WebMarkupContainer(PANEL_RECORDING);
-	private final VideoInfo vi = new VideoInfo("info", null);
+	private final VideoInfo vi = new VideoInfo("info");
 	private final VideoPlayer vp = new VideoPlayer("player");
 	private boolean error = true;
 	private MainPanel mp = null;
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/ForgetPasswordDialog.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/ForgetPasswordDialog.java
index 1814d4b..8d33aea 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/ForgetPasswordDialog.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/ForgetPasswordDialog.java
@@ -97,10 +97,10 @@ public class ForgetPasswordDialog extends Modal<String> {
 		setUseCloseHandler(true);
 		setBackdrop(Backdrop.STATIC);
 
-		addButton(new BootstrapAjaxButton("button", new ResourceModel("317"), form, Buttons.Type.Primary) {
+		addButton(new BootstrapAjaxButton("button", new ResourceModel("317"), form, Buttons.Type.Outline_Primary) {
 			private static final long serialVersionUID = 1L;
 		}); // Send
-		addButton(new BootstrapAjaxLink<>("button", Model.of(""), Buttons.Type.Secondary, new ResourceModel("lbl.cancel")) {
+		addButton(new BootstrapAjaxLink<>("button", Model.of(""), Buttons.Type.Outline_Secondary, new ResourceModel("lbl.cancel")) {
 			private static final long serialVersionUID = 1L;
 
 			public void onClick(AjaxRequestTarget target) {
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/RegisterDialog.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/RegisterDialog.java
index 4f267d0..3b22aba 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/RegisterDialog.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/RegisterDialog.java
@@ -95,8 +95,8 @@ public class RegisterDialog extends Modal<String> {
 		setUseCloseHandler(true);
 		setBackdrop(Backdrop.STATIC);
 
-		addButton(new SpinnerAjaxButton("button", new ResourceModel("121"), form, Buttons.Type.Primary)); // register
-		addButton(new BootstrapAjaxLink<>("button", Model.of(""), Buttons.Type.Secondary, new ResourceModel("lbl.cancel")) {
+		addButton(new SpinnerAjaxButton("button", new ResourceModel("121"), form, Buttons.Type.Outline_Primary)); // register
+		addButton(new BootstrapAjaxLink<>("button", Model.of(""), Buttons.Type.Outline_Secondary, new ResourceModel("lbl.cancel")) {
 			private static final long serialVersionUID = 1L;
 
 			public void onClick(AjaxRequestTarget target) {
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/ResetPasswordDialog.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/ResetPasswordDialog.java
index 1d945bc..917cc54 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/ResetPasswordDialog.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/ResetPasswordDialog.java
@@ -61,7 +61,7 @@ public class ResetPasswordDialog extends Modal<String> {
 		show(true);
 
 		add(form);
-		addButton(new BootstrapAjaxButton("button", new ResourceModel("327"), form, Buttons.Type.Primary) {
+		addButton(new BootstrapAjaxButton("button", new ResourceModel("327"), form, Buttons.Type.Outline_Primary) {
 			private static final long serialVersionUID = 1L;
 		}); // Reset
 
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/SignInDialog.html b/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/SignInDialog.html
index 36e48c9..419e744 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/SignInDialog.html
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/SignInDialog.html
@@ -64,7 +64,7 @@
 				<i><wicket:message key="lbl.or"/></i>
 			</div>
 			<div wicket:id="oauthList">
-				<button wicket:id="oauthBtn" class="btn btn-outline-info"><span class="provider" wicket:id="label"></span></button>
+				<a wicket:id="oauthBtn"></a>
 			</div>
 		</div>
 		<div wicket:id="feedback" class="error"></div>
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/SignInDialog.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/SignInDialog.java
index 9b72502..5ee5805 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/SignInDialog.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/SignInDialog.java
@@ -47,7 +47,6 @@ import org.apache.wicket.ajax.markup.html.form.AjaxButton;
 import org.apache.wicket.markup.head.CssHeaderItem;
 import org.apache.wicket.markup.head.IHeaderResponse;
 import org.apache.wicket.markup.html.WebMarkupContainer;
-import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.markup.html.form.CheckBox;
 import org.apache.wicket.markup.html.form.ChoiceRenderer;
 import org.apache.wicket.markup.html.form.DropDownChoice;
@@ -68,12 +67,12 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import com.googlecode.wicket.jquery.ui.effect.JQueryEffectBehavior;
-import com.googlecode.wicket.jquery.ui.form.button.Button;
 
 import de.agilecoders.wicket.core.markup.html.bootstrap.button.BootstrapAjaxLink;
 import de.agilecoders.wicket.core.markup.html.bootstrap.button.Buttons;
 import de.agilecoders.wicket.core.markup.html.bootstrap.common.NotificationPanel;
 import de.agilecoders.wicket.core.markup.html.bootstrap.dialog.Modal;
+import de.agilecoders.wicket.core.markup.html.bootstrap.image.IconType;
 import de.agilecoders.wicket.extensions.markup.html.bootstrap.spinner.SpinnerAjaxButton;
 
 public class SignInDialog extends Modal<String> {
@@ -106,7 +105,7 @@ public class SignInDialog extends Modal<String> {
 		show(true);
 		setCloseOnEscapeKey(false);
 		setBackdrop(Backdrop.STATIC);
-		addButton(new BootstrapAjaxLink<>("button", Model.of(""), Buttons.Type.Secondary, new ResourceModel("123")) {
+		addButton(new BootstrapAjaxLink<>("button", Model.of(""), Buttons.Type.Outline_Secondary, new ResourceModel("123")) {
 			private static final long serialVersionUID = 1L;
 
 			public void onClick(AjaxRequestTarget target) {
@@ -115,7 +114,7 @@ public class SignInDialog extends Modal<String> {
 				register.show(target);
 			}
 		});
-		addButton(new SpinnerAjaxButton("button", new ResourceModel("112"), form, Buttons.Type.Primary)); // Login
+		addButton(new SpinnerAjaxButton("button", new ResourceModel("112"), form, Buttons.Type.Outline_Primary)); // Login
 
 		super.onInitialize();
 	}
@@ -197,24 +196,34 @@ public class SignInDialog extends Modal<String> {
 					@Override
 					protected void populateItem(final ListItem<OAuthServer> item) {
 						final OAuthServer s = item.getModelObject();
-						Button btn = new Button("oauthBtn") {
+
+						BootstrapAjaxLink<String> btn = new BootstrapAjaxLink<>("oauthBtn", null, Buttons.Type.Outline_Info, Model.of(s.getName())) {
 							private static final long serialVersionUID = 1L;
+							{
+								setMarkupId("om-oauth-btn-" + s.getId());
+								setOutputMarkupId(true);
+							}
 
 							@Override
-							public void onSubmit() {
+							public void onClick(AjaxRequestTarget target) {
 								showAuth(s);
 							}
 
 							@Override
 							public void renderHead(IHeaderResponse response) {
 								if (!Strings.isEmpty(s.getIconUrl())) {
-									response.render(CssHeaderItem.forCSS("#" + this.getMarkupId() + " .provider {background-image: url(" + s.getIconUrl() + ")}", this.getMarkupId()));
+									response.render(CssHeaderItem.forCSS("#" + this.getMarkupId() + " .provider {background-image: url(" + s.getIconUrl() + ")}", "oauth-btn-css-" + this.getMarkupId()));
 								}
 							}
 						};
-						Component lbl = new Label("label", s.getName());
-						btn.add(lbl);
-						item.add(btn.setDefaultFormProcessing(false)); //skip all rules, go to redirect
+						item.add(btn.setIconType(new IconType("provider") {
+							private static final long serialVersionUID = 1L;
+
+							@Override
+							public String cssClassName() {
+								return "provider";
+							}
+						}));
 						item.setRenderBodyOnly(true);
 					}
 				}).setVisible(showOauth));
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/activities/ActivitiesPanel.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/activities/ActivitiesPanel.java
index 8e851ac..184910d 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/activities/ActivitiesPanel.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/activities/ActivitiesPanel.java
@@ -18,8 +18,14 @@
  */
 package org.apache.openmeetings.web.room.activities;
 
-import com.github.openjson.JSONArray;
-import com.github.openjson.JSONObject;
+import static org.apache.openmeetings.core.util.WebSocketHelper.sendRoom;
+import static org.apache.openmeetings.web.app.WebSession.getUserId;
+import static org.apache.openmeetings.web.util.CallbackFunctionHelper.getNamedFunction;
+import static org.apache.wicket.ajax.attributes.CallbackParameter.explicit;
+
+import java.util.LinkedHashMap;
+import java.util.Map;
+
 import org.apache.commons.lang3.time.FastDateFormat;
 import org.apache.openmeetings.db.entity.basic.Client;
 import org.apache.openmeetings.db.entity.room.Room.Right;
@@ -42,13 +48,8 @@ import org.apache.wicket.spring.injection.annot.SpringBean;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.util.LinkedHashMap;
-import java.util.Map;
-
-import static org.apache.openmeetings.core.util.WebSocketHelper.sendRoom;
-import static org.apache.openmeetings.web.app.WebSession.getUserId;
-import static org.apache.openmeetings.web.util.CallbackFunctionHelper.getNamedFunction;
-import static org.apache.wicket.ajax.attributes.CallbackParameter.explicit;
+import com.github.openjson.JSONArray;
+import com.github.openjson.JSONObject;
 
 public class ActivitiesPanel extends Panel {
 	private static final long serialVersionUID = 1L;
@@ -277,11 +278,11 @@ public class ActivitiesPanel extends Panel {
 			case reqRightAv:
 			case reqRightMuteOthers:
 			case haveQuestion:
-				cls.append("ui-state-highlight");
+				cls.append("bg-warning");
 				break;
 			case roomEnter:
 			case roomExit:
-				cls.append("ui-state-default auto-clean");
+				cls.append("bg-white auto-clean");
 		}
 		return cls;
 	}
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/InviteUserMessageDialog.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/InviteUserMessageDialog.java
index d99a3dc..f211460 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/InviteUserMessageDialog.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/InviteUserMessageDialog.java
@@ -56,7 +56,7 @@ public class InviteUserMessageDialog extends Modal<String> {
 		setCloseOnEscapeKey(true);
 		setBackdrop(Backdrop.STATIC);
 
-		addButton(new BootstrapAjaxButton("button", new ResourceModel("213"), form, Buttons.Type.Primary) {
+		addButton(new BootstrapAjaxButton("button", new ResourceModel("213"), form, Buttons.Type.Outline_Primary) {
 			private static final long serialVersionUID = 1L;
 
 			@Override
@@ -69,7 +69,7 @@ public class InviteUserMessageDialog extends Modal<String> {
 				InviteUserMessageDialog.this.close(target);
 			}
 		}); //send
-		addButton(new BootstrapAjaxLink<>("button", Model.of(""), Buttons.Type.Secondary, new ResourceModel("lbl.cancel")) {
+		addButton(new BootstrapAjaxLink<>("button", Model.of(""), Buttons.Type.Outline_Secondary, new ResourceModel("lbl.cancel")) {
 			private static final long serialVersionUID = 1L;
 
 			public void onClick(AjaxRequestTarget target) {
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/InviteUserToRoomDialog.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/InviteUserToRoomDialog.java
index 1353f55..4aab3ff 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/InviteUserToRoomDialog.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/InviteUserToRoomDialog.java
@@ -72,7 +72,7 @@ public class InviteUserToRoomDialog extends Modal<String> {
 		setCloseOnEscapeKey(true);
 		setBackdrop(Backdrop.STATIC);
 
-		addButton(new BootstrapAjaxLink<>("button", Model.of(""), Buttons.Type.Secondary, new ResourceModel("lbl.cancel")) {
+		addButton(new BootstrapAjaxLink<>("button", Model.of(""), Buttons.Type.Outline_Secondary, new ResourceModel("lbl.cancel")) {
 			private static final long serialVersionUID = 1L;
 
 			public void onClick(AjaxRequestTarget target) {
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/MessageDialog.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/MessageDialog.java
index f719017..0aab9d7 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/MessageDialog.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/MessageDialog.java
@@ -119,7 +119,7 @@ public class MessageDialog extends Modal<PrivateMessage> {
 		setBackdrop(Backdrop.STATIC);
 		size(Modal.Size.Large);
 
-		addButton(new BootstrapAjaxButton("button", new ResourceModel("218"), form, Buttons.Type.Primary) {
+		addButton(new BootstrapAjaxButton("button", new ResourceModel("218"), form, Buttons.Type.Outline_Primary) {
 			private static final long serialVersionUID = 1L;
 
 			@Override
@@ -210,7 +210,7 @@ public class MessageDialog extends Modal<PrivateMessage> {
 				onSend(target);
 			}
 		}); // send
-		addButton(new BootstrapAjaxLink<>("button", Model.of(""), Buttons.Type.Secondary, new ResourceModel("lbl.cancel")) {
+		addButton(new BootstrapAjaxLink<>("button", Model.of(""), Buttons.Type.Outline_Secondary, new ResourceModel("lbl.cancel")) {
 			private static final long serialVersionUID = 1L;
 
 			public void onClick(AjaxRequestTarget target) {
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/UserInfoDialog.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/UserInfoDialog.java
index 87926c6..9787758 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/UserInfoDialog.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/UserInfoDialog.java
@@ -54,7 +54,7 @@ public class UserInfoDialog extends Modal<String> {
 		header(new ResourceModel("1235"));
 		setCloseOnEscapeKey(true);
 		setBackdrop(Backdrop.STATIC);
-		addButton(contacts = new BootstrapAjaxLink<>("button", Model.of(""), Buttons.Type.Info, new ResourceModel("1186")) {
+		addButton(contacts = new BootstrapAjaxLink<>("button", Model.of(""), Buttons.Type.Outline_Info, new ResourceModel("1186")) {
 			private static final long serialVersionUID = 1L;
 
 			public void onClick(AjaxRequestTarget target) {
@@ -62,7 +62,7 @@ public class UserInfoDialog extends Modal<String> {
 				UserInfoDialog.this.close(target);
 			}
 		});
-		addButton(message = new BootstrapAjaxLink<>("button", Model.of(""), Buttons.Type.Primary, new ResourceModel("1253")) {
+		addButton(message = new BootstrapAjaxLink<>("button", Model.of(""), Buttons.Type.Outline_Primary, new ResourceModel("1253")) {
 			private static final long serialVersionUID = 1L;
 
 			public void onClick(AjaxRequestTarget target) {
@@ -70,7 +70,7 @@ public class UserInfoDialog extends Modal<String> {
 				UserInfoDialog.this.close(target);
 			}
 		});
-		addButton(new BootstrapAjaxLink<>("button", Model.of(""), Buttons.Type.Secondary, new ResourceModel("lbl.cancel")) {
+		addButton(new BootstrapAjaxLink<>("button", Model.of(""), Buttons.Type.Outline_Secondary, new ResourceModel("lbl.cancel")) {
 			private static final long serialVersionUID = 1L;
 
 			public void onClick(AjaxRequestTarget target) {
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/dashboard/admin/AdminCleanupInfoDialog.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/dashboard/admin/AdminCleanupInfoDialog.java
index f89f06a..d84ccf9 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/dashboard/admin/AdminCleanupInfoDialog.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/dashboard/admin/AdminCleanupInfoDialog.java
@@ -92,7 +92,7 @@ public class AdminCleanupInfoDialog extends Modal<String> {
 			@Override
 			protected void onInitialize() {
 				super.onInitialize();
-				SpinnerAjaxButton cleanup = new SpinnerAjaxButton("cleanup", new ResourceModel("dashboard.widget.admin.cleanup.cleanup"), this, Buttons.Type.Danger) {
+				SpinnerAjaxButton cleanup = new SpinnerAjaxButton("cleanup", new ResourceModel("dashboard.widget.admin.cleanup.cleanup"), this, Buttons.Type.Outline_Danger) {
 					private static final long serialVersionUID = 1L;
 
 					@Override
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/dashboard/admin/AdminWidgetView.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/dashboard/admin/AdminWidgetView.java
index 499715a..29ed6a0 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/dashboard/admin/AdminWidgetView.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/dashboard/admin/AdminWidgetView.java
@@ -44,7 +44,7 @@ public class AdminWidgetView extends WidgetView {
 		super.onInitialize();
 		add(form);
 		form.add(cleanupDialog = new AdminCleanupInfoDialog("cleanup-dialog"));
-		form.add(new SpinnerAjaxButton("show-cleanup-dialog", new ResourceModel("dashboard.widget.admin.cleanup.show"), form, Buttons.Type.Primary) {
+		form.add(new SpinnerAjaxButton("show-cleanup-dialog", new ResourceModel("dashboard.widget.admin.cleanup.show"), form, Buttons.Type.Outline_Primary) {
 			private static final long serialVersionUID = 1L;
 
 			@Override
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/VideoInfo.html b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/VideoInfo.html
index 1cd4126..8fb4d72 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/VideoInfo.html
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/VideoInfo.html
@@ -41,8 +41,8 @@
 			</div>
 		</div>
 		<span wicket:id="downloadBtn"></span>
-		<button wicket:id="re-convert"><wicket:message key="1600"/></button>
-		<button wicket:id="share"><wicket:message key="button.label.share"/></button>
+		<button wicket:id="re-convert"></button>
+		<button wicket:id="share"></button>
 	</form>
 	<div wicket:id="invitation"></div>
 </wicket:panel>
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/VideoInfo.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/VideoInfo.java
index 602837a..a7f0811 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/VideoInfo.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/VideoInfo.java
@@ -25,7 +25,6 @@ import static org.apache.openmeetings.web.app.WebSession.getUserId;
 
 import java.io.File;
 import java.nio.file.Path;
-import java.util.ArrayList;
 import java.util.List;
 import java.util.stream.Collectors;
 
@@ -44,31 +43,58 @@ import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.extensions.ajax.AjaxDownloadBehavior;
 import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.markup.html.form.Form;
+import org.apache.wicket.markup.html.link.AbstractLink;
 import org.apache.wicket.markup.html.panel.Panel;
 import org.apache.wicket.model.CompoundPropertyModel;
 import org.apache.wicket.model.IModel;
 import org.apache.wicket.model.Model;
+import org.apache.wicket.model.ResourceModel;
 import org.apache.wicket.request.resource.IResource;
 import org.apache.wicket.resource.FileSystemResource;
 import org.apache.wicket.spring.injection.annot.SpringBean;
 
-import com.googlecode.wicket.jquery.ui.JQueryIcon;
-import com.googlecode.wicket.jquery.ui.form.button.AjaxButton;
-import com.googlecode.wicket.jquery.ui.form.button.AjaxSplitButton;
-import com.googlecode.wicket.jquery.ui.widget.menu.IMenuItem;
-import com.googlecode.wicket.jquery.ui.widget.menu.MenuItem;
+import de.agilecoders.wicket.core.markup.html.bootstrap.button.BootstrapAjaxButton;
+import de.agilecoders.wicket.core.markup.html.bootstrap.button.BootstrapAjaxLink;
+import de.agilecoders.wicket.core.markup.html.bootstrap.button.Buttons;
+import de.agilecoders.wicket.core.markup.html.bootstrap.button.dropdown.SplitButton;
+import de.agilecoders.wicket.core.markup.html.bootstrap.image.IconType;
+import de.agilecoders.wicket.extensions.markup.html.bootstrap.icon.FontAwesome5IconType;
 
 public class VideoInfo extends Panel {
 	private static final long serialVersionUID = 1L;
 	private final Form<Void> form = new Form<>("form");
-	private final AjaxSplitButton downloadBtn = new AjaxSplitButton("downloadBtn", new ArrayList<IMenuItem>());
-	private final AjaxButton reConvert = new AjaxButton("re-convert") {
+	private final SplitButton downloadBtn = new SplitButton("downloadBtn", Model.of("")) {
 		private static final long serialVersionUID = 1L;
 
+		private AbstractLink createLink(String markupId, IModel<String> model, String ext) {
+			return new BootstrapAjaxLink<>(markupId, model, Buttons.Type.Outline_Primary, model) {
+				private static final long serialVersionUID = 1L;
+
+				@Override
+				public boolean isEnabled() {
+					BaseFileItem r = rm.getObject();
+					return r != null && r.exists(EXTENSION_MP4) && !r.isReadOnly();
+				}
+
+				@Override
+				public void onClick(AjaxRequestTarget target) {
+					download.initiate(target);
+				}
+			}.setIconType(FontAwesome5IconType.download_s);
+		}
+
+		@Override
+		protected List<AbstractLink> newSubMenuButtons(String buttonMarkupId) {
+			return List.of(createLink(buttonMarkupId, Model.of(EXTENSION_MP4), EXTENSION_MP4));
+		}
+
 		@Override
-		protected String getIcon() {
-			return JQueryIcon.REFRESH;
+		protected AbstractLink newBaseButton(String markupId, IModel<String> labelModel, IModel<IconType> iconTypeModel) {
+			return createLink(markupId, Model.of(EXTENSION_MP4), EXTENSION_MP4);
 		}
+	};
+	private final BootstrapAjaxButton reConvert = new BootstrapAjaxButton("re-convert", new ResourceModel("1600"), form, Buttons.Type.Outline_Warning) {
+		private static final long serialVersionUID = 1L;
 
 		@Override
 		protected void onSubmit(AjaxRequestTarget target) {
@@ -102,9 +128,9 @@ public class VideoInfo extends Panel {
 	private final IModel<Recording> rm = new CompoundPropertyModel<>(new Recording());
 	private final IModel<String> roomName = Model.of((String)null);
 	private boolean isInterview = false;
-	private final InvitationDialog invite;
+	private InvitationDialog invite;
 	RecordingInvitationForm rif = new RecordingInvitationForm("form");
-	private final AjaxButton share = new AjaxButton("share") {
+	private final BootstrapAjaxButton share = new BootstrapAjaxButton("share", new ResourceModel("button.label.share"), form, Buttons.Type.Outline_Success) {
 		private static final long serialVersionUID = 1L;
 
 		@Override
@@ -124,21 +150,8 @@ public class VideoInfo extends Panel {
 	private RecordingChunkDao chunkDao;
 
 	public VideoInfo(String id) {
-		this(id, null);
-	}
-
-	public VideoInfo(String id, Recording r) {
 		super(id);
-		add(form.setOutputMarkupId(true));
 		setDefaultModel(rm);
-
-		form.add(new Label("name"), new Label("duration"), new Label("recordEnd"), new Label("roomName", roomName),
-				downloadBtn.setEnabled(false), reConvert.setEnabled(false), share.setEnabled(false));
-		add(download);
-		add(invite = new InvitationDialog("invitation", rif));
-		rif.setDialog(invite);
-
-		update(null, r);
 	}
 
 	public VideoInfo update(AjaxRequestTarget target, BaseFileItem _r) {
@@ -190,28 +203,19 @@ public class VideoInfo extends Panel {
 	@Override
 	protected void onInitialize() {
 		super.onInitialize();
-		downloadBtn.setDefaultModelObject(newDownloadMenuList());
-	}
-
-	private List<IMenuItem> newDownloadMenuList() {
-		List<IMenuItem> list = new ArrayList<>();
-
-		//mp4
-		list.add(new MenuItem(EXTENSION_MP4, JQueryIcon.ARROWTHICKSTOP_1_S) {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public boolean isEnabled() {
-				BaseFileItem r = rm.getObject();
-				return r != null && r.exists(EXTENSION_MP4) && !r.isReadOnly();
-			}
+		add(form.setOutputMarkupId(true));
+		form.add(new Label("name")
+				, new Label("duration")
+				, new Label("recordEnd")
+				, new Label("roomName", roomName)
+				, downloadBtn.setEnabled(false)
+				, reConvert.setIconType(FontAwesome5IconType.sync_alt_s).setEnabled(false)
+				, share.setIconType(FontAwesome5IconType.share_alt_s).setEnabled(false));
+		add(download);
+		add(invite = new InvitationDialog("invitation", rif));
+		rif.setDialog(invite);
 
-			@Override
-			public void onClick(AjaxRequestTarget target) {
-				download.initiate(target);
-			}
-		});
-		return list;
+		update(null, null);
 	}
 
 	public VideoInfo setShowShare(boolean visible) {
diff --git a/openmeetings-web/src/main/webapp/css/raw-general.css b/openmeetings-web/src/main/webapp/css/raw-general.css
index 614b898..fbfa3da 100644
--- a/openmeetings-web/src/main/webapp/css/raw-general.css
+++ b/openmeetings-web/src/main/webapp/css/raw-general.css
@@ -19,9 +19,12 @@ html, body {
 }
 .signin .oauth-section .provider {
 	background-position: 0 0;
-	background-size: 16px;
+	background-size: 24px;
 	background-repeat: no-repeat;
+	height: 24px;
+	display: inline-block;
 	padding-left: 20px;
+	vertical-align: bottom;
 }
 .signin .or-seperator {
 	margin-top: 20px;
@@ -235,7 +238,7 @@ html, body {
 	vertical-align: text-top;
 }
 .om-icon.big::before {
-	font-size: 2.4em;
+	font-size: 2.2em;
 }
 .cross.om-icon {
 	background-image: url(images/cross.png);
@@ -424,12 +427,23 @@ select.messages.selector {
 	height: 100%;
 }
 .recording-panel .file-tree {
-	width: 325px;
 	height: 100%;
 }
 .recording-panel .tree-panel {
 	height: calc(100% - var(--info-height));
 }
+.recording-panel .file-tree
+, .recording-panel .tree-panel
+, .recording-panel .info
+{
+	width: 325px;
+}
+.recording-panel .info .details .value {
+	padding: 0;
+	overflow: hidden;
+	white-space: nowrap;
+	text-overflow: ellipsis;
+}
 .recording-panel .file-tree .info {
 	height: var(--info-height);
 }
diff --git a/openmeetings-web/src/main/webapp/css/raw-tree.css b/openmeetings-web/src/main/webapp/css/raw-tree.css
index 0055dec..f73c578 100644
--- a/openmeetings-web/src/main/webapp/css/raw-tree.css
+++ b/openmeetings-web/src/main/webapp/css/raw-tree.css
@@ -31,6 +31,8 @@
 	line-height: 20px;
 	color: transparent;
 	height: var(--tree-header-height);
+	padding-top: 5px;
+	overflow: hidden;
 }
 .trash-toolbar .om-icon.fileitem, .trash-toolbar .om-icon.recorditem {
 	display: none !important;
diff --git a/openmeetings-web/src/main/webapp/css/raw-variables.css b/openmeetings-web/src/main/webapp/css/raw-variables.css
index bad1738..ea8ed65 100644
--- a/openmeetings-web/src/main/webapp/css/raw-variables.css
+++ b/openmeetings-web/src/main/webapp/css/raw-variables.css
@@ -34,11 +34,11 @@ body.no-menu {
 	--actions-height: 40px;
 }
 .recording-panel {
-	--info-height: 115px;
+	--info-height: 125px;
 }
 .file-tree {
 	--tree-header-height: 36px;
-	--tree-footer-height: 40px;
+	--tree-footer-height: 80px;
 }
 .main.room {
 	--header-height: 0px;