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/08/23 10:28:03 UTC

[openmeetings] branch OPENMEETINGS-2402-reworked-upload updated (4218027 -> 4f3bb87)

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

solomax pushed a change to branch OPENMEETINGS-2402-reworked-upload
in repository https://gitbox.apache.org/repos/asf/openmeetings.git.


    from 4218027  [OPENMEETINGS-2402] file upload is re-worked (incomplete)
     add 106d7c9  [OPENMEETINGS-2412] video setup mini app should work better
     add 9831094  [OPENMEETINGS-2296] libraries are updated
     add e0af436  [OPENMEETINGS-2292] labels are merged
     add 0bb487d  no jira: link to build server is updated
     add 4a5e199  release preparation: documentation update
     add 84a6522  Update Javascript and Build Instructions.
     add e81ccb4  Reword some typos.
     add bd8f7b0  Rename to previous section heading.
     add 8ebfec8  Merge pull request #105 from apache/feature/update-javascript-and-build-instructions
     add e808165  [OPENMEETINGS-2296] wicket-bootstrap is downgraded
     add 63c8a61  Release preparation: typos are fixed
     add 77e75da  no jira: weird comment is removed
     add 626d982  Switching to the next development version (#106)
     new 319a105  Merge branch 'master' into OPENMEETINGS-2402-reworked-upload
     new 4f3bb87  [OPENMEETINGS-2402] upload seems to work

The 2 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:
 CHANGELOG.md                                       |  90 +++++++++++
 README.md                                          |  43 ++++-
 openmeetings-core/pom.xml                          |   2 +-
 openmeetings-db/pom.xml                            |   2 +-
 openmeetings-install/pom.xml                       |   2 +-
 openmeetings-screenshare/pom.xml                   |   2 +-
 openmeetings-server/pom.xml                        |   2 +-
 .../src/site/xdoc/BuildInstructions.xml            |  17 +-
 openmeetings-server/src/site/xdoc/NewsArchive.xml  |  51 ++++++
 openmeetings-server/src/site/xdoc/demo.xml         |   3 -
 openmeetings-server/src/site/xdoc/downloads.xml    |  31 ++--
 openmeetings-server/src/site/xdoc/index.xml        |  52 +++---
 openmeetings-service/pom.xml                       |   2 +-
 openmeetings-util/pom.xml                          |   2 +-
 openmeetings-web/pom.xml                           |   4 +-
 .../web/app/Application.properties.xml             |   5 +-
 .../web/app/Application_ar.properties.xml          |   5 +-
 .../web/app/Application_bg.properties.xml          |   5 +-
 .../web/app/Application_bn.properties.xml          |   5 +-
 .../web/app/Application_ca.properties.xml          |   5 +-
 .../web/app/Application_cs.properties.xml          |   5 +-
 .../web/app/Application_da.properties.xml          |   5 +-
 .../web/app/Application_de.properties.xml          | 178 ++++++++++-----------
 .../web/app/Application_el.properties.xml          |   5 +-
 .../web/app/Application_es.properties.xml          |   9 +-
 .../web/app/Application_fa.properties.xml          |   5 +-
 .../web/app/Application_fi.properties.xml          |   5 +-
 .../web/app/Application_fr.properties.xml          |   5 +-
 .../web/app/Application_gl.properties.xml          |   5 +-
 .../web/app/Application_hi.properties.xml          | 117 +++++++-------
 .../web/app/Application_hu.properties.xml          |   5 +-
 .../web/app/Application_in.properties.xml          |   5 +-
 .../web/app/Application_it.properties.xml          |   5 +-
 .../web/app/Application_iw.properties.xml          |   5 +-
 .../web/app/Application_ja.properties.xml          |   5 +-
 .../web/app/Application_ko.properties.xml          |   5 +-
 ...roperties.xml => Application_lo.properties.xml} |  91 +++++------
 .../web/app/Application_nl.properties.xml          |   5 +-
 .../web/app/Application_pl.properties.xml          |   5 +-
 .../web/app/Application_pt.properties.xml          |   5 +-
 .../web/app/Application_pt_BR.properties.xml       |   5 +-
 .../web/app/Application_ru.properties.xml          |  13 +-
 .../web/app/Application_sk.properties.xml          |   5 +-
 .../web/app/Application_sv.properties.xml          |   5 +-
 .../web/app/Application_ta.properties.xml          |   5 +-
 .../web/app/Application_th.properties.xml          |   5 +-
 .../web/app/Application_tr.properties.xml          |   5 +-
 .../web/app/Application_uk.properties.xml          |   5 +-
 .../web/app/Application_zh_CN.properties.xml       |   5 +-
 .../web/app/Application_zh_TW.properties.xml       |   5 +-
 .../web/common/tree/FileTreePanel.java             |   6 +-
 .../apache/openmeetings/web/pages/HashPage.java    |  24 ++-
 .../sidebar/RoomFileUploadResourceReference.java   |  25 +--
 .../web/room/sidebar/UploadDialog.html             |   3 +
 .../web/room/sidebar/UploadDialog.java             |   5 +-
 .../apache/openmeetings/web/room/sidebar/upload.js | 167 ++++++++++++-------
 .../src/main/webapp/languages/languages.xml        |   1 +
 openmeetings-webservice/pom.xml                    |   2 +-
 pom.xml                                            |  16 +-
 59 files changed, 619 insertions(+), 493 deletions(-)
 copy openmeetings-web/src/main/java/org/apache/openmeetings/web/app/{Application.properties.xml => Application_lo.properties.xml} (89%)


[openmeetings] 01/02: Merge branch 'master' into OPENMEETINGS-2402-reworked-upload

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

solomax pushed a commit to branch OPENMEETINGS-2402-reworked-upload
in repository https://gitbox.apache.org/repos/asf/openmeetings.git

commit 319a1057dd30eb475935a9c666965a13591ea026
Merge: 4218027 626d982
Author: Maxim Solodovnik <so...@gmail.com>
AuthorDate: Sun Aug 23 13:35:05 2020 +0700

    Merge branch 'master' into OPENMEETINGS-2402-reworked-upload

 CHANGELOG.md                                       |  90 +++++++++++
 README.md                                          |  43 ++++-
 openmeetings-core/pom.xml                          |   2 +-
 openmeetings-db/pom.xml                            |   2 +-
 openmeetings-install/pom.xml                       |   2 +-
 openmeetings-screenshare/pom.xml                   |   2 +-
 openmeetings-server/pom.xml                        |   2 +-
 .../src/site/xdoc/BuildInstructions.xml            |  17 +-
 openmeetings-server/src/site/xdoc/NewsArchive.xml  |  51 ++++++
 openmeetings-server/src/site/xdoc/demo.xml         |   3 -
 openmeetings-server/src/site/xdoc/downloads.xml    |  31 ++--
 openmeetings-server/src/site/xdoc/index.xml        |  52 +++---
 openmeetings-service/pom.xml                       |   2 +-
 openmeetings-util/pom.xml                          |   2 +-
 openmeetings-web/pom.xml                           |   4 +-
 .../web/app/Application.properties.xml             |   5 +-
 .../web/app/Application_ar.properties.xml          |   5 +-
 .../web/app/Application_bg.properties.xml          |   5 +-
 .../web/app/Application_bn.properties.xml          |   5 +-
 .../web/app/Application_ca.properties.xml          |   5 +-
 .../web/app/Application_cs.properties.xml          |   5 +-
 .../web/app/Application_da.properties.xml          |   5 +-
 .../web/app/Application_de.properties.xml          | 178 ++++++++++-----------
 .../web/app/Application_el.properties.xml          |   5 +-
 .../web/app/Application_es.properties.xml          |   9 +-
 .../web/app/Application_fa.properties.xml          |   5 +-
 .../web/app/Application_fi.properties.xml          |   5 +-
 .../web/app/Application_fr.properties.xml          |   5 +-
 .../web/app/Application_gl.properties.xml          |   5 +-
 .../web/app/Application_hi.properties.xml          | 117 +++++++-------
 .../web/app/Application_hu.properties.xml          |   5 +-
 .../web/app/Application_in.properties.xml          |   5 +-
 .../web/app/Application_it.properties.xml          |   5 +-
 .../web/app/Application_iw.properties.xml          |   5 +-
 .../web/app/Application_ja.properties.xml          |   5 +-
 .../web/app/Application_ko.properties.xml          |   5 +-
 ...roperties.xml => Application_lo.properties.xml} |  91 +++++------
 .../web/app/Application_nl.properties.xml          |   5 +-
 .../web/app/Application_pl.properties.xml          |   5 +-
 .../web/app/Application_pt.properties.xml          |   5 +-
 .../web/app/Application_pt_BR.properties.xml       |   5 +-
 .../web/app/Application_ru.properties.xml          |  13 +-
 .../web/app/Application_sk.properties.xml          |   5 +-
 .../web/app/Application_sv.properties.xml          |   5 +-
 .../web/app/Application_ta.properties.xml          |   5 +-
 .../web/app/Application_th.properties.xml          |   5 +-
 .../web/app/Application_tr.properties.xml          |   5 +-
 .../web/app/Application_uk.properties.xml          |   5 +-
 .../web/app/Application_zh_CN.properties.xml       |   5 +-
 .../web/app/Application_zh_TW.properties.xml       |   5 +-
 .../apache/openmeetings/web/pages/HashPage.java    |  24 ++-
 .../src/main/webapp/languages/languages.xml        |   1 +
 openmeetings-webservice/pom.xml                    |   2 +-
 pom.xml                                            |  16 +-
 54 files changed, 488 insertions(+), 418 deletions(-)


[openmeetings] 02/02: [OPENMEETINGS-2402] upload seems to work

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

solomax pushed a commit to branch OPENMEETINGS-2402-reworked-upload
in repository https://gitbox.apache.org/repos/asf/openmeetings.git

commit 4f3bb87822f8c6295ebc2d652330d17eed1d5150
Author: Maxim Solodovnik <so...@gmail.com>
AuthorDate: Sun Aug 23 17:27:39 2020 +0700

    [OPENMEETINGS-2402] upload seems to work
---
 .../web/common/tree/FileTreePanel.java             |   6 +-
 .../sidebar/RoomFileUploadResourceReference.java   |  25 +--
 .../web/room/sidebar/UploadDialog.html             |   3 +
 .../web/room/sidebar/UploadDialog.java             |   5 +-
 .../apache/openmeetings/web/room/sidebar/upload.js | 167 +++++++++++++--------
 5 files changed, 131 insertions(+), 75 deletions(-)

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 1d96d1e..d60e6a7 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
@@ -88,9 +88,9 @@ import de.agilecoders.wicket.extensions.markup.html.bootstrap.icon.FontAwesome5I
 public abstract class FileTreePanel extends Panel {
 	private static final long serialVersionUID = 1L;
 	private static final String BASE_CLASS = " om-icon big clickable";
-	private static final String UPLOAD_CLASS = "add" + BASE_CLASS + ALIGN_LEFT;
-	private static final String CREATE_DIR_CLASS = "folder-create" + BASE_CLASS + ALIGN_LEFT;
-	private static final String TRASH_CLASS = "trash" + BASE_CLASS + ALIGN_RIGHT;
+	private static final String UPLOAD_CLASS = "add" + BASE_CLASS + " " + ALIGN_LEFT;
+	private static final String CREATE_DIR_CLASS = "folder-create" + BASE_CLASS + " " + ALIGN_LEFT;
+	private static final String TRASH_CLASS = "trash" + BASE_CLASS + " " + ALIGN_RIGHT;
 	private static final String DISABLED_CLASS = " disabled";
 	final WebMarkupContainer trees = new WebMarkupContainer("tree-container");
 	private final WebMarkupContainer sizes = new WebMarkupContainer("sizes");
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomFileUploadResourceReference.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomFileUploadResourceReference.java
index 1c9c94a..35d2943 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomFileUploadResourceReference.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomFileUploadResourceReference.java
@@ -18,6 +18,7 @@
  */
 package org.apache.openmeetings.web.room.sidebar;
 
+import static java.util.UUID.randomUUID;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.getMaxUploadSize;
 import static org.apache.openmeetings.web.app.WebSession.getUserId;
 import static org.apache.openmeetings.web.util.ThreadHelper.startRunnable;
@@ -156,6 +157,7 @@ public class RoomFileUploadResourceReference extends ResourceReference {
 		final BaseFileItem parent = fileDao.get(lastSelected);
 		final long langId = getLangId(c);
 		final long totalSize = files.stream().mapToLong(FileItem::getSize).sum();
+		final String uuid = randomUUID().toString();
 		final AtomicInteger progress = new AtomicInteger(0);
 		long currentSize = 0;
 		for (FileItem curItem : files) {
@@ -177,12 +179,12 @@ public class RoomFileUploadResourceReference extends ResourceReference {
 				f.setInsertedBy(getUserId());
 
 				ProcessResultList logs = processor.processFile(f, curItem.getInputStream()
-						, Optional.<DoubleConsumer>of(part -> sendProgress(c, progress, progress.get() + (int)(100 * part * size / totalSize))));
+						, Optional.<DoubleConsumer>of(part -> sendProgress(c, uuid, progress, progress.get() + (int)(100 * part * size / totalSize))));
 				for (ProcessResult res : logs.getJobs()) {
 					fileLogDao.add(res.getProcess(), f, res);
 				}
 				if (logs.hasError()) {
-					sendError(c, Application.getString("convert.errors.file", langId));
+					sendError(c, uuid, Application.getString("convert.errors.file", langId));
 				} else {
 					if (toWb) {
 						//FIXME TODO room.getWb().sendFileToWb(f, clean);
@@ -191,26 +193,31 @@ public class RoomFileUploadResourceReference extends ResourceReference {
 				}
 			} catch (Exception e) {
 				log.error("Unexpected error while processing uploaded file", e);
-				sendError(c, e.getMessage() == null ? "Unexpected error" : e.getMessage());
+				sendError(c, uuid, e.getMessage() == null ? "Unexpected error" : e.getMessage());
 			} finally {
 				curItem.delete();
 			}
 			currentSize += size;
-			sendProgress(c, progress, (int)(100 * currentSize / totalSize));
+			sendProgress(c, uuid, progress, (int)(100 * currentSize / totalSize));
 		}
-		sendProgress(c, progress, 100);
+		sendProgress(c, uuid, progress, 100);
 	}
 
-	private void sendError(Client c, String msg) {
-		WebSocketHelper.sendClient(c, new JSONObject()
+	private JSONObject getBaseMessage(String uuid) {
+		return new JSONObject()
+				.put("uuid", uuid)
+				.put("type", "room-upload");
+	}
+	private void sendError(Client c, String uuid, String msg) {
+		WebSocketHelper.sendClient(c, getBaseMessage(uuid)
 				.put("status", Status.ERROR.name())
 				.put("message", msg));
 	}
 
-	private void sendProgress(Client c, AtomicInteger progress, int cur) {
+	private void sendProgress(Client c, String uuid, AtomicInteger progress, int cur) {
 		if (cur > progress.get()) {
 			progress.set(cur);
-			WebSocketHelper.sendClient(c, new JSONObject()
+			WebSocketHelper.sendClient(c, getBaseMessage(uuid)
 					.put("status", Status.PROGRESS.name())
 					.put("progress", cur));
 		}
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/UploadDialog.html b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/UploadDialog.html
index 81c9a4e..26441e3 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/UploadDialog.html
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/UploadDialog.html
@@ -40,6 +40,9 @@
 		<input wicket:id="sid" name="room-upload-sid" type="hidden"/>
 		<input wicket:id="lastSelected" name="room-upload-last-selected" type="hidden" value=""/>
 	</form>
+	<div class="progress d-none">
+		<div class="progress-bar" role="progressbar" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100">0%</div>
+	</div>
 	<div id="progress"></div>
 </wicket:extend>
 </html>
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/UploadDialog.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/UploadDialog.java
index 1651cc8..b2b23fe 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/UploadDialog.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/UploadDialog.java
@@ -37,14 +37,11 @@ import org.apache.wicket.request.mapper.parameter.PageParameters;
 import org.apache.wicket.request.resource.JavaScriptResourceReference;
 import org.apache.wicket.spring.injection.annot.SpringBean;
 import org.apache.wicket.util.lang.Bytes;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 import de.agilecoders.wicket.core.markup.html.bootstrap.dialog.Modal;
 
 public class UploadDialog extends Modal<String> {
 	private static final long serialVersionUID = 1L;
-	private static final Logger log = LoggerFactory.getLogger(UploadDialog.class);
 	private final WebMarkupContainer form = new WebMarkupContainer("form");
 	private final RoomFilePanel roomFiles;
 	private final RoomPanel room;
@@ -86,7 +83,7 @@ public class UploadDialog extends Modal<String> {
 	public Modal<String> show(IPartialPageRequestHandler handler) {
 		lastSelected.add(AttributeAppender.replace("value", roomFiles.getLastSelected().getId()));
 		handler.add(form.setVisible(true));
-		handler.appendJavaScript(String.format("bindUpload();"));
+		handler.appendJavaScript(String.format("Upload.bindUpload();"));
 		return super.show(handler);
 	}
 
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/upload.js b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/upload.js
index 0791978..d378dc6 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/upload.js
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/upload.js
@@ -1,63 +1,112 @@
 /* Licensed under the Apache License, Version 2.0 (the "License") http://www.apache.org/licenses/LICENSE-2.0 */
-function bindUpload() {
-	const form = $('#room-upload-form')
-			, fi = form.find('.fileinput')
-	let uploadBtn = $('#room-upload-btn');
-	if (uploadBtn.length === 0) {
-		uploadBtn = $('<button id="room-upload-btn" class="btn btn-outline-primary"></button>')
-			.text(form.data('upload-lbl'));
-		form.parents('.modal-content').find('.modal-footer').prepend(uploadBtn);
-		uploadBtn.click(function() {
-			$.ajax({
-				url: form.attr('action')
-				, type: 'POST'
-				, data: new FormData($('#room-upload-form')[0])
-				, processData: false
-				, contentType: false
-			}).done(function(data) {
-				let i = 0;
-			}).fail(function(e) {
-				let i = 0;
-			});
-		});
-	}
-	uploadBtn.attr('disabled', 'disabled');
-	if (!fi.eventAdded) {
-		fi.on('change.bs.fileinput', function(event) {
-			event.stopPropagation();
-			const th = $(this)
-				, fInput = th.find('input[type=file]')
-				, fn = th.find('.fileinput-filename')
-				, files = fInput[0].files
-				, errors = form.find('.error');
-			errors.html('');
-			let	valid = files !== undefined && files.length > 0;
-			if (valid) {
-				const size = Array.from(files).map(f => f.size).reduce((a, b) => a + b, 0);
-				valid = size < +form.data('max-size');
-				if (!valid) {
-					errors.html($('<div class="alert alert-danger" role="alert"></div>').text(form.data('max-upload-lbl') + ' ' + form.data('max-size-lbl')));
-				}
-			}
-			if (valid) {
-				fn.text(Array.from(files).map(f => f.name).join(', '));
-				uploadBtn.removeAttr('disabled');
-			} else {
-				fn.text('');
-				uploadBtn.attr('disabled', 'disabled');
-				$('#room-upload-file').val('');
+var Upload = (function() {
+	let progress, progressBar, curUid;
+
+	function _onWsMessage(jqEvent, msg) {
+		try {
+			if (msg instanceof Blob) {
+				return; //ping
 			}
-			fInput.attr('title', fn.text());
-			return false;
-		});
-		$('#room-upload-to-wb').click(function() {
-			const clnBlock = $('#room-upload-clean-block');
-			if ($(this).prop('checked')) {
-				clnBlock.removeClass('d-none');
-			} else {
-				clnBlock.addClass('d-none');
+			const m = JSON.parse(msg);
+			if (m && 'room-upload' === m.type && curUid === m.uuid) {
+				switch (m.status) {
+					case 'ERROR':
+						OmUtil.error(m.message);
+						break;
+					case 'PROGRESS': {
+							const progressP = m.progress + '%';
+							progressBar.css('width', progressP).attr('aria-valuenow', m.progress).text(progressP);
+							if (m.progress === 100) {
+								$('#room-upload-form').parents('.modal').modal('hide');
+								_cleanup();
+							}
+						}
+						break;
+					default:
+						//no-op
+				}
 			}
-		});
-		fi.eventAdded = true;
+		} catch (err) {
+			OmUtil.error(err);
+		}
+	}
+	function _cleanup() {
+		Wicket.Event.unsubscribe('/websocket/message', _onWsMessage);
+	}
+	function _bindUpload() {
+		const form = $('#room-upload-form')
+				, fi = form.find('.fileinput')
+		progress = form.parent().find('.progress');
+		progressBar = form.parent().find('.progress-bar');
+		_cleanup();
+		form.show();
+		progress.addClass('d-none');
+		let uploadBtn = $('#room-upload-btn');
+		if (uploadBtn.length === 0) {
+			uploadBtn = $('<button id="room-upload-btn" class="btn btn-outline-primary"></button>')
+				.text(form.data('upload-lbl'));
+			form.parents('.modal-content').find('.modal-footer').prepend(uploadBtn);
+			uploadBtn.click(function() {
+				const form = $('#room-upload-form');
+				$.ajax({
+					url: form.attr('action')
+					, type: 'POST'
+					, data: new FormData($('#room-upload-form')[0])
+					, processData: false
+					, contentType: false
+				}).done(function(data) {
+					curUid = data.uuid;
+					uploadBtn.attr('disabled', 'disabled');
+					form.hide();
+					progress.removeClass('d-none');
+					Wicket.Event.subscribe('/websocket/message', _onWsMessage);
+				}).fail(function(e) {
+					OmUtil.error(e.message);
+				});
+			});
+		}
+		uploadBtn.attr('disabled', 'disabled');
+		if (!fi.eventAdded) {
+			fi.on('change.bs.fileinput', function(event) {
+				event.stopPropagation();
+				const th = $(this)
+					, fInput = th.find('input[type=file]')
+					, fn = th.find('.fileinput-filename')
+					, files = fInput[0].files
+					, errors = form.find('.error');
+				errors.html('');
+				let	valid = files !== undefined && files.length > 0;
+				if (valid) {
+					const size = Array.from(files).map(f => f.size).reduce((a, b) => a + b, 0);
+					valid = size < +form.data('max-size');
+					if (!valid) {
+						errors.html($('<div class="alert alert-danger" role="alert"></div>').text(form.data('max-upload-lbl') + ' ' + form.data('max-size-lbl')));
+					}
+				}
+				if (valid) {
+					fn.text(Array.from(files).map(f => f.name).join(', '));
+					uploadBtn.removeAttr('disabled');
+				} else {
+					fn.text('');
+					uploadBtn.attr('disabled', 'disabled');
+					$('#room-upload-file').val('');
+				}
+				fInput.attr('title', fn.text());
+				return false;
+			});
+			$('#room-upload-to-wb').click(function() {
+				const clnBlock = $('#room-upload-clean-block');
+				if ($(this).prop('checked')) {
+					clnBlock.removeClass('d-none');
+				} else {
+					clnBlock.addClass('d-none');
+				}
+			});
+			fi.eventAdded = true;
+		}
 	}
-}
+	
+	return {
+		bindUpload: _bindUpload
+	};
+})();