Added: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/UploadDialog.html URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/UploadDialog.html?rev=1739871&view=auto ============================================================================== --- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/UploadDialog.html (added) +++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/UploadDialog.html Tue Apr 19 08:58:04 2016 @@ -0,0 +1,40 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. + +--> +<html xmlns:wicket="http://wicket.apache.org"> +<wicket:panel> + <form wicket:id="form"> + <div style="margin-bottom: 30px;"><wicket:message key="594"/></div> + <div class="fileinput fileinput-new" data-provides="fileinput" style="margin: 0;"> + <div style="display: block;" class="fileinput-filename"></div> + <span class="btn btn-file ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only" style="width: 120px;"> + <span class="ui-button-text"><wicket:message key="596"/></span> + <input type="file" wicket:id="file"/> + </span> + </div> + <div wicket:id="feedback"></div> + <span wicket:id="progress">[progressbar]</span> + <div style="margin-top: 30px;"><input type="checkbox"/><label><wicket:message key="1312"/></label></div> + </form> + <form wicket:id="name-form"> + <input type="hidden" wicket:id="name"/> + </form> +</wicket:panel> +</html>
Added: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/UploadDialog.java URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/UploadDialog.java?rev=1739871&view=auto ============================================================================== --- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/UploadDialog.java (added) +++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/UploadDialog.java Tue Apr 19 08:58:04 2016 @@ -0,0 +1,194 @@ +/* + * 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.room.sidebar; + +import static org.apache.openmeetings.web.app.Application.getBean; +import static org.apache.openmeetings.web.app.WebSession.getUserId; + +import java.util.Arrays; +import java.util.List; + +import org.apache.openmeetings.core.data.file.FileProcessor; +import org.apache.openmeetings.db.dao.basic.ConfigurationDao; +import org.apache.openmeetings.db.entity.file.FileExplorerItem; +import org.apache.openmeetings.db.entity.file.FileItem; +import org.apache.openmeetings.util.StoredFile; +import org.apache.openmeetings.util.process.ConverterProcessResultList; +import org.apache.openmeetings.web.app.Application; +import org.apache.openmeetings.web.room.RoomPanel; +import org.apache.openmeetings.web.util.BootstrapFileUploadBehavior; +import org.apache.wicket.ajax.AjaxRequestTarget; +import org.apache.wicket.ajax.form.AjaxFormSubmitBehavior; +import org.apache.wicket.behavior.AttributeAppender; +import org.apache.wicket.core.request.handler.IPartialPageRequestHandler; +import org.apache.wicket.extensions.ajax.markup.html.form.upload.UploadProgressBar; +import org.apache.wicket.markup.head.IHeaderResponse; +import org.apache.wicket.markup.head.JavaScriptHeaderItem; +import org.apache.wicket.markup.head.PriorityHeaderItem; +import org.apache.wicket.markup.html.form.Form; +import org.apache.wicket.markup.html.form.HiddenField; +import org.apache.wicket.markup.html.form.upload.FileUpload; +import org.apache.wicket.markup.html.form.upload.FileUploadField; +import org.apache.wicket.model.IModel; +import org.apache.wicket.model.Model; +import org.apache.wicket.request.resource.JavaScriptResourceReference; +import org.apache.wicket.util.lang.Bytes; +import org.apache.wicket.util.string.Strings; + +import com.googlecode.wicket.jquery.core.Options; +import com.googlecode.wicket.jquery.ui.widget.dialog.AbstractFormDialog; +import com.googlecode.wicket.jquery.ui.widget.dialog.DialogButton; +import com.googlecode.wicket.kendo.ui.panel.KendoFeedbackPanel; + +public class UploadDialog extends AbstractFormDialog<String> { + private static final long serialVersionUID = 1L; + private final KendoFeedbackPanel feedback = new KendoFeedbackPanel("feedback", new Options("button", true)); + private final Form<String> form; + private final DialogButton upload; + private final DialogButton cancel; + private final FileUploadField uploadField; + private final HiddenField<String> fileName; + private final RoomFilePanel roomFiles; + private final RoomPanel room; + + public UploadDialog(String id, RoomPanel room, RoomFilePanel roomFiles) { + super(id, Application.getString(304)); + this.roomFiles = roomFiles; + this.room = room; + add(form = new Form<>("form")); + upload = new DialogButton("upload", Application.getString(593), false) { + private static final long serialVersionUID = 1L; + + @Override + public boolean isIndicating() { + return true; + } + }; + cancel = new DialogButton("close", Application.getString(85)); + form.add(feedback.setOutputMarkupId(true)); + + form.setMultiPart(true); + form.setMaxSize(Bytes.bytes(getBean(ConfigurationDao.class).getMaxUploadSize())); + // Model is necessary here to avoid writing image to the User object + form.add(uploadField = new FileUploadField("file", new IModel<List<FileUpload>>() { + private static final long serialVersionUID = 1L; + + //FIXME this need to be eliminated + @Override + public void detach() { + } + + @Override + public void setObject(List<FileUpload> object) { + } + + @Override + public List<FileUpload> getObject() { + return null; + } + })); + uploadField.add(AttributeAppender.append("accept", StoredFile.getAcceptAttr())); + Form<String> nameForm = new Form<>("name-form"); + fileName = new HiddenField<>("name", Model.of("")); + fileName.add(new AjaxFormSubmitBehavior(nameForm, "change") { + private static final long serialVersionUID = 1L; + + @Override + protected void onSubmit(AjaxRequestTarget target) { + if (!Strings.isEmpty(getComponent().getDefaultModelObjectAsString())) { + upload.setEnabled(true, target); + } + } + }).setOutputMarkupId(true); + form.add(new UploadProgressBar("progress", form, uploadField)); + add(nameForm.add(fileName.setOutputMarkupId(true))); + add(BootstrapFileUploadBehavior.INSTANCE); + } + + @Override + public void onClick(AjaxRequestTarget target, DialogButton button) { + if (button == null || button.match("close")) { + super.onClick(target, button); + } + } + + @Override + protected List<DialogButton> getButtons() { + return Arrays.asList(upload, cancel); + } + + @Override + public DialogButton getSubmitButton() { + return upload; + } + + @Override + public Form<?> getForm() { + return form; + } + + @Override + protected void onOpen(IPartialPageRequestHandler handler) { + super.onOpen(handler); + handler.appendJavaScript(String.format("bindUpload('%s', '%s');", form.getMarkupId(), fileName.getMarkupId())); + } + + @Override + protected void onError(AjaxRequestTarget target) { + target.add(feedback); + } + + @Override + protected void onSubmit(AjaxRequestTarget target) { + FileUpload fu = uploadField.getFileUpload(); + if (fu != null) { + FileExplorerItem f = new FileExplorerItem(); + f.setSize(fu.getSize()); + f.setName(fu.getClientFileName()); + FileItem parent = roomFiles.getSelectedFile(); + if (parent == null || !(parent instanceof FileExplorerItem)) { + f.setOwnerId(getUserId()); + } else { + f.setRoomId(parent.getRoomId()); + f.setOwnerId(parent.getOwnerId()); + if (parent.getId() > 0) { + f.setParentId(FileItem.Type.Folder == parent.getType() ? parent.getId() : parent.getParentId()); + } + } + f.setInsertedBy(getUserId()); + + try { + ConverterProcessResultList result = getBean(FileProcessor.class).processFile(getUserId(), f, fu.getInputStream()); + if (result.hasError()) { + error(result.getLogMessage()); + } else { + close(target, null); + } + } catch (Exception e) { + error(e.getMessage()); + } + } + } + + @Override + public void renderHead(IHeaderResponse response) { + super.renderHead(response); + response.render(new PriorityHeaderItem(JavaScriptHeaderItem.forReference(new JavaScriptResourceReference(UploadDialog.class, "upload.js")))); + } +} Added: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/upload.js URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/upload.js?rev=1739871&view=auto ============================================================================== --- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/upload.js (added) +++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/upload.js Tue Apr 19 08:58:04 2016 @@ -0,0 +1,31 @@ +/** + * 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. + */ +function bindUpload(markupId, hiddenId) { + var fi = $('#' + markupId + ' .fileinput'); + if (!fi.eventAdded) { + $('#' + markupId + ' .fileinput').on('change.bs.fileinput', function(event) { + event.stopPropagation(); + var hi = $('#' + hiddenId); + hi.val($('#' + markupId + ' .fileinput .fileinput-filename').text()); + hi.trigger('change'); + return false; + }); + fi.eventAdded = true; + } +} Copied: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/AviRecordingResourceReference.java (from r1739688, openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/AviRecordingResourceReference.java) URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/AviRecordingResourceReference.java?p2=openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/AviRecordingResourceReference.java&p1=openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/AviRecordingResourceReference.java&r1=1739688&r2=1739871&rev=1739871&view=diff ============================================================================== --- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/AviRecordingResourceReference.java (original) +++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/AviRecordingResourceReference.java Tue Apr 19 08:58:04 2016 @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.openmeetings.web.util; +package org.apache.openmeetings.web.user.record; import static org.apache.openmeetings.util.OmFileHelper.getRecording; @@ -37,12 +37,12 @@ public class AviRecordingResourceReferen } @Override - String getFileName(Recording r) { + protected String getFileName(Recording r) { return r.getAlternateDownload(); } @Override - File getFile(Recording r) { + protected File getFile(Recording r) { return getRecording(r.getAlternateDownload()); } } Copied: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/FlvRecordingResourceReference.java (from r1739688, openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/FlvRecordingResourceReference.java) URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/FlvRecordingResourceReference.java?p2=openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/FlvRecordingResourceReference.java&p1=openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/FlvRecordingResourceReference.java&r1=1739688&r2=1739871&rev=1739871&view=diff ============================================================================== --- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/FlvRecordingResourceReference.java (original) +++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/FlvRecordingResourceReference.java Tue Apr 19 08:58:04 2016 @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.openmeetings.web.util; +package org.apache.openmeetings.web.user.record; import static org.apache.openmeetings.util.OmFileHelper.getRecording; @@ -37,12 +37,12 @@ public class FlvRecordingResourceReferen } @Override - String getFileName(Recording r) { + protected String getFileName(Recording r) { return r.getHash(); } @Override - File getFile(Recording r) { + protected File getFile(Recording r) { return getRecording(r.getHash()); } } Copied: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/JpgRecordingResourceReference.java (from r1739688, openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/JpgRecordingResourceReference.java) URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/JpgRecordingResourceReference.java?p2=openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/JpgRecordingResourceReference.java&p1=openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/JpgRecordingResourceReference.java&r1=1739688&r2=1739871&rev=1739871&view=diff ============================================================================== --- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/JpgRecordingResourceReference.java (original) +++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/JpgRecordingResourceReference.java Tue Apr 19 08:58:04 2016 @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.openmeetings.web.util; +package org.apache.openmeetings.web.user.record; import static org.apache.openmeetings.util.OmFileHelper.getRecording; @@ -37,12 +37,12 @@ public class JpgRecordingResourceReferen } @Override - String getFileName(Recording r) { + protected String getFileName(Recording r) { return r.getPreviewImage(); } @Override - File getFile(Recording r) { + protected File getFile(Recording r) { return getRecording(r.getPreviewImage()); } } Copied: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/Mp4RecordingResourceReference.java (from r1739688, openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/Mp4RecordingResourceReference.java) URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/Mp4RecordingResourceReference.java?p2=openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/Mp4RecordingResourceReference.java&p1=openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/Mp4RecordingResourceReference.java&r1=1739688&r2=1739871&rev=1739871&view=diff ============================================================================== --- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/Mp4RecordingResourceReference.java (original) +++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/Mp4RecordingResourceReference.java Tue Apr 19 08:58:04 2016 @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.openmeetings.web.util; +package org.apache.openmeetings.web.user.record; import static org.apache.openmeetings.util.OmFileHelper.MP4_EXTENSION; import static org.apache.openmeetings.util.OmFileHelper.getMp4Recording; @@ -38,12 +38,12 @@ public class Mp4RecordingResourceReferen } @Override - String getFileName(Recording r) { + protected String getFileName(Recording r) { return r.getHash() + MP4_EXTENSION; } @Override - File getFile(Recording r) { + protected File getFile(Recording r) { return getMp4Recording(r.getHash()); } } Copied: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/OggRecordingResourceReference.java (from r1739688, openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/OggRecordingResourceReference.java) URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/OggRecordingResourceReference.java?p2=openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/OggRecordingResourceReference.java&p1=openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/OggRecordingResourceReference.java&r1=1739688&r2=1739871&rev=1739871&view=diff ============================================================================== --- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/OggRecordingResourceReference.java (original) +++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/OggRecordingResourceReference.java Tue Apr 19 08:58:04 2016 @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.openmeetings.web.util; +package org.apache.openmeetings.web.user.record; import static org.apache.openmeetings.util.OmFileHelper.OGG_EXTENSION; import static org.apache.openmeetings.util.OmFileHelper.getOggRecording; @@ -38,12 +38,12 @@ public class OggRecordingResourceReferen } @Override - String getFileName(Recording r) { + protected String getFileName(Recording r) { return r.getHash() + OGG_EXTENSION; } @Override - File getFile(Recording r) { + protected File getFile(Recording r) { return getOggRecording(r.getHash()); } } Copied: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/RecordingResourceReference.java (from r1739688, openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/RecordingResourceReference.java) URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/RecordingResourceReference.java?p2=openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/RecordingResourceReference.java&p1=openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/RecordingResourceReference.java&r1=1739688&r2=1739871&rev=1739871&view=diff ============================================================================== --- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/RecordingResourceReference.java (original) +++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/RecordingResourceReference.java Tue Apr 19 08:58:04 2016 @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.openmeetings.web.util; +package org.apache.openmeetings.web.user.record; import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey; import static org.apache.openmeetings.web.app.Application.getBean; @@ -25,26 +25,19 @@ import static org.apache.openmeetings.we import static org.apache.openmeetings.web.app.WebSession.getUserId; import static org.red5.logging.Red5LoggerFactory.getLogger; -import java.io.File; -import java.io.IOException; - -import javax.servlet.http.HttpServletResponse; - import org.apache.openmeetings.db.dao.record.RecordingDao; import org.apache.openmeetings.db.dao.user.GroupUserDao; import org.apache.openmeetings.db.dao.user.UserDao; import org.apache.openmeetings.db.entity.record.Recording; import org.apache.openmeetings.db.entity.user.User; import org.apache.openmeetings.web.app.WebSession; +import org.apache.openmeetings.web.util.FileItemResourceReference; import org.apache.wicket.request.mapper.parameter.PageParameters; -import org.apache.wicket.request.resource.IResource; import org.apache.wicket.request.resource.IResource.Attributes; -import org.apache.wicket.resource.FileSystemResource; -import org.apache.wicket.resource.FileSystemResourceReference; import org.apache.wicket.util.string.StringValue; import org.slf4j.Logger; -public abstract class RecordingResourceReference extends FileSystemResourceReference { +public abstract class RecordingResourceReference extends FileItemResourceReference<Recording> { private static final long serialVersionUID = 1L; private static final Logger log = getLogger(RecordingResourceReference.class, webAppRootKey); @@ -53,36 +46,27 @@ public abstract class RecordingResourceR } @Override - public IResource getResource() { - return new FileSystemResource() { - private static final long serialVersionUID = 1L; - private File file; - - @Override - protected String getMimeType() throws IOException { - return RecordingResourceReference.this.getMimeType(); - } - - @Override - protected ResourceResponse newResourceResponse(Attributes attributes) { - Recording r = getRecording(attributes); - if (r != null) { - file = getFile(r); - return createResourceResponse(file.toPath()); - } else { - log.debug("No recording was found"); - ResourceResponse rr = new ResourceResponse(); - rr.setError(HttpServletResponse.SC_NOT_FOUND); - return rr; - } + protected Recording getFileItem(Attributes attributes) { + PageParameters params = attributes.getParameters(); + StringValue _id = params.get("id"); + Long id = null; + try { + id = _id.toOptionalLong(); + } catch (NumberFormatException e) { + //no-op expected + } + WebSession ws = WebSession.get(); + if (id != null && ws.isSignedIn()) { + return getRecording(id); + } else { + ws.invalidate(); + if (ws.signIn(_id.toString(), true)) { + return getRecording(getRecordingId()); } - }; + } + return null; } - abstract String getMimeType(); - abstract String getFileName(Recording r); - abstract File getFile(Recording r); - private static Recording getRecording(Long id) { Recording r = getBean(RecordingDao.class).get(id); // TODO should we process public? @@ -99,32 +83,12 @@ public abstract class RecordingResourceR //TODO external group check was added for plugin recording download String extType = getExternalType(); if (extType != null) { + log.debug("External recording requested: " + extType); User creator = getBean(UserDao.class).get(r.getInsertedBy()); if (extType.equals(creator.getExternalType())) { return r; } } return null; - } - - private static Recording getRecording(Attributes attributes) { - PageParameters params = attributes.getParameters(); - StringValue _id = params.get("id"); - Long id = null; - try { - id = _id.toOptionalLong(); - } catch (NumberFormatException e) { - //no-op expected - } - WebSession ws = WebSession.get(); - if (id != null && ws.isSignedIn()) { - return getRecording(id); - } else { - ws.invalidate(); - if (ws.signIn(_id.toString(), true)) { - return getRecording(getRecordingId()); - } - } - return null; } } Modified: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/VideoPlayer.java URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/VideoPlayer.java?rev=1739871&r1=1739870&r2=1739871&view=diff ============================================================================== --- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/VideoPlayer.java (original) +++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/VideoPlayer.java Tue Apr 19 08:58:04 2016 @@ -21,8 +21,6 @@ package org.apache.openmeetings.web.user import static org.apache.openmeetings.util.OmFileHelper.getMp4Recording; import org.apache.openmeetings.db.entity.record.Recording; -import org.apache.openmeetings.web.util.Mp4RecordingResourceReference; -import org.apache.openmeetings.web.util.OggRecordingResourceReference; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.markup.html.media.Source; Modified: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/BootstrapFileUploadBehavior.java URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/BootstrapFileUploadBehavior.java?rev=1739871&r1=1739870&r2=1739871&view=diff ============================================================================== --- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/BootstrapFileUploadBehavior.java (original) +++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/BootstrapFileUploadBehavior.java Tue Apr 19 08:58:04 2016 @@ -25,13 +25,14 @@ import org.apache.wicket.markup.head.IHe import org.apache.wicket.markup.head.JavaScriptHeaderItem; import org.apache.wicket.request.resource.CssResourceReference; import org.apache.wicket.request.resource.JavaScriptResourceReference; +import org.apache.wicket.request.resource.ResourceReference; public class BootstrapFileUploadBehavior extends Behavior { private static final long serialVersionUID = 1L; - private final static JavaScriptResourceReference BOOTSTRAP_FILEUPLOAD_JS_REFERENCE - = new JavaScriptResourceReference(BootstrapFileUploadBehavior.class, "bootstrap-fileupload.js"); - private final static CssResourceReference BOOTSTRAP_FILEUPLOAD_CSS_REFERENCE - = new CssResourceReference(BootstrapFileUploadBehavior.class, "bootstrap-fileupload.css"); + private final static ResourceReference BOOTSTRAP_FILEINPUT_JS_REFERENCE + = new JavaScriptResourceReference(BootstrapFileUploadBehavior.class, "fileinput.js"); + private final static ResourceReference BOOTSTRAP_FILEINPUT_CSS_REFERENCE + = new CssResourceReference(BootstrapFileUploadBehavior.class, "fileinput.css"); public final static BootstrapFileUploadBehavior INSTANCE = new BootstrapFileUploadBehavior(); private BootstrapFileUploadBehavior() { @@ -40,7 +41,7 @@ public class BootstrapFileUploadBehavior @Override public void renderHead(Component component, IHeaderResponse response) { super.renderHead(component, response); - response.render(JavaScriptHeaderItem.forReference(BOOTSTRAP_FILEUPLOAD_JS_REFERENCE)); - response.render(CssHeaderItem.forReference(BOOTSTRAP_FILEUPLOAD_CSS_REFERENCE)); + response.render(JavaScriptHeaderItem.forReference(BOOTSTRAP_FILEINPUT_JS_REFERENCE)); + response.render(CssHeaderItem.forReference(BOOTSTRAP_FILEINPUT_CSS_REFERENCE)); } } Added: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/FileItemResourceReference.java URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/FileItemResourceReference.java?rev=1739871&view=auto ============================================================================== --- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/FileItemResourceReference.java (added) +++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/FileItemResourceReference.java Tue Apr 19 08:58:04 2016 @@ -0,0 +1,77 @@ +/* + * 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.util; + +import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey; +import static org.red5.logging.Red5LoggerFactory.getLogger; + +import java.io.File; +import java.io.IOException; + +import javax.servlet.http.HttpServletResponse; + +import org.apache.openmeetings.db.entity.file.FileItem; +import org.apache.wicket.request.resource.IResource; +import org.apache.wicket.request.resource.IResource.Attributes; +import org.apache.wicket.resource.FileSystemResource; +import org.apache.wicket.resource.FileSystemResourceReference; +import org.slf4j.Logger; + +public abstract class FileItemResourceReference<T extends FileItem> extends FileSystemResourceReference { + private static final long serialVersionUID = 1L; + private static final Logger log = getLogger(FileItemResourceReference.class, webAppRootKey); + + public FileItemResourceReference(String name) { + super(name); + } + + @Override + public IResource getResource() { + return new FileSystemResource() { + private static final long serialVersionUID = 1L; + private File file; + + @Override + protected String getMimeType() throws IOException { + return FileItemResourceReference.this.getMimeType(); + } + + @Override + protected ResourceResponse newResourceResponse(Attributes attributes) { + T r = getFileItem(attributes); + if (r != null) { + file = getFile(r); + ResourceResponse rr = createResourceResponse(file.toPath()); + rr.setFileName(getFileName(r)); + return rr; + } else { + log.debug("No file item was found"); + ResourceResponse rr = new ResourceResponse(); + rr.setError(HttpServletResponse.SC_NOT_FOUND); + return rr; + } + } + }; + } + + protected abstract String getMimeType(); + protected abstract String getFileName(T r); + protected abstract File getFile(T r); + protected abstract T getFileItem(Attributes attributes); +} Copied: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/fileinput.css (from r1739688, openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/bootstrap-fileupload.css) URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/fileinput.css?p2=openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/fileinput.css&p1=openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/bootstrap-fileupload.css&r1=1739688&r2=1739871&rev=1739871&view=diff ============================================================================== --- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/bootstrap-fileupload.css (original) +++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/fileinput.css Tue Apr 19 08:58:04 2016 @@ -1,124 +1,234 @@ /*! - * Bootstrap v2.3.1 - * - * Copyright 2012 Twitter, Inc - * Licensed under the Apache License v2.0 - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Designed and built with all the love in the world @twitter by @mdo and @fat. + * Jasny Bootstrap v3.1.0 (http://jasny.github.com/bootstrap) + * Copyright 2011-2014 Arnold Daniels. + * Licensed under the Apache License, Version 2.0 (the "License"); (https://github.com/jasny/bootstrap/blob/master/LICENSE) */ -.btn-file { - position: relative; - overflow: hidden; - vertical-align: middle; -} - -.btn-file>input { - position: absolute; - top: 0; - right: 0; - margin: 0; - font-size: 23px; - cursor: pointer; - opacity: 0; - filter: alpha(opacity = 0); - transform: translate(-300px, 0) scale(4); - direction: ltr; -} - -.fileupload { - margin-bottom: 9px; -} - -.fileupload .uneditable-input { - display: inline-block; - margin-bottom: 0; - vertical-align: middle; - cursor: text; -} - -.fileupload .thumbnail { - display: inline-block; - margin-bottom: 5px; - overflow: hidden; - text-align: center; - vertical-align: middle; -} - -.fileupload .thumbnail>img { - display: inline-block; - max-height: 100%; - vertical-align: middle; -} - -.fileupload .btn { - vertical-align: middle; -} - -.fileupload-exists .fileupload-new,.fileupload-new .fileupload-exists { - display: none; -} - -.fileupload-inline .fileupload-controls { - display: inline; -} -.fileupload-new .input-append .btn-file { - -webkit-border-radius: 0 3px 3px 0; - -moz-border-radius: 0 3px 3px 0; - border-radius: 0 3px 3px 0; +.btn-labeled { + padding-top: 0; + padding-bottom: 0; +} +.btn-label { + position: relative; + background: transparent; + background: rgba(0, 0, 0, 0.15); + display: inline-block; + padding: 6px 12px; + left: -12px; + border-radius: 3px 0 0 3px; +} +.btn-label.btn-label-right { + left: auto; + right: -12px; + border-radius: 0 3px 3px 0; +} +.btn-lg .btn-label { + padding: 10px 16px; + left: -16px; + border-radius: 5px 0 0 5px; +} +.btn-lg .btn-label.btn-label-right { + left: auto; + right: -16px; + border-radius: 0 5px 5px 0; +} +.btn-sm .btn-label { + padding: 5px 10px; + left: -10px; + border-radius: 2px 0 0 2px; +} +.btn-sm .btn-label.btn-label-right { + left: auto; + right: -10px; + border-radius: 0 2px 2px 0; +} +.btn-xs .btn-label { + padding: 1px 5px; + left: -5px; + border-radius: 2px 0 0 2px; +} +.btn-xs .btn-label.btn-label-right { + left: auto; + right: -5px; + border-radius: 0 2px 2px 0; +} +.nav-tabs-bottom { + border-bottom: 0; + border-top: 1px solid #dddddd; +} +.nav-tabs-bottom > li { + margin-bottom: 0; + margin-top: -1px; +} +.nav-tabs-bottom > li > a { + border-radius: 0 0 4px 4px; +} +.nav-tabs-bottom > li > a:hover, +.nav-tabs-bottom > li > a:focus, +.nav-tabs-bottom > li.active > a, +.nav-tabs-bottom > li.active > a:hover, +.nav-tabs-bottom > li.active > a:focus { + border: 1px solid #dddddd; + border-top-color: transparent; +} +.nav-tabs-left { + border-bottom: 0; + border-right: 1px solid #dddddd; +} +.nav-tabs-left > li { + margin-bottom: 0; + margin-right: -1px; + float: none; +} +.nav-tabs-left > li > a { + border-radius: 4px 0 0 4px; + margin-right: 0; + margin-bottom: 2px; +} +.nav-tabs-left > li > a:hover, +.nav-tabs-left > li > a:focus, +.nav-tabs-left > li.active > a, +.nav-tabs-left > li.active > a:hover, +.nav-tabs-left > li.active > a:focus { + border: 1px solid #dddddd; + border-right-color: transparent; +} +.row > .nav-tabs-left { + padding-right: 0; + padding-left: 15px; + margin-right: -1px; + position: relative; + z-index: 1; +} +.row > .nav-tabs-left + .tab-content { + border-left: 1px solid #dddddd; +} +.nav-tabs-right { + border-bottom: 0; + border-left: 1px solid #dddddd; +} +.nav-tabs-right > li { + margin-bottom: 0; + margin-left: -1px; + float: none; +} +.nav-tabs-right > li > a { + border-radius: 0 4px 4px 0; + margin-left: 0; + margin-bottom: 2px; +} +.nav-tabs-right > li > a:hover, +.nav-tabs-right > li > a:focus, +.nav-tabs-right > li.active > a, +.nav-tabs-right > li.active > a:hover, +.nav-tabs-right > li.active > a:focus { + border: 1px solid #dddddd; + border-left-color: transparent; +} +.row > .nav-tabs-right { + padding-left: 0; + padding-right: 15px; } - -.thumbnail-borderless .thumbnail { - padding: 0; - border: none; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; -} - -.fileupload-new.thumbnail-borderless .thumbnail { - border: 1px solid #ddd; -} - -.control-group.warning .fileupload .uneditable-input { - color: #a47e3c; - border-color: #a47e3c; -} - -.control-group.warning .fileupload .fileupload-preview { - color: #a47e3c; -} - -.control-group.warning .fileupload .thumbnail { - border-color: #a47e3c; +.btn-file { + overflow: hidden; + position: relative; + vertical-align: middle; +} +.btn-file > input { + position: absolute; + top: 0; + right: 0; + margin: 0; + opacity: 0; + filter: alpha(opacity=0); + font-size: 23px; + height: 100%; + width: 100%; + direction: ltr; + cursor: pointer; +} +.fileinput { + margin-bottom: 9px; + display: inline-block; +} +.fileinput .form-control { + padding-top: 7px; + padding-bottom: 5px; + display: inline-block; + margin-bottom: 0px; + vertical-align: middle; + cursor: text; +} +.fileinput .thumbnail { + overflow: hidden; + display: inline-block; + margin-bottom: 5px; + vertical-align: middle; + text-align: center; +} +.fileinput .thumbnail > img { + max-height: 100%; +} +.fileinput .btn { + vertical-align: middle; +} +.fileinput-exists .fileinput-new, +.fileinput-new .fileinput-exists { + display: none; +} +.fileinput-inline .fileinput-controls { + display: inline; +} +.fileinput-filename { + vertical-align: middle; + display: inline-block; + overflow: hidden; +} +.form-control .fileinput-filename { + vertical-align: bottom; +} +.fileinput.input-group { + display: table; +} +.fileinput.input-group > * { + position: relative; + z-index: 2; +} +.fileinput.input-group > .btn-file { + z-index: 1; +} +.fileinput-new.input-group .btn-file, +.fileinput-new .input-group .btn-file { + border-radius: 0 4px 4px 0; +} +.fileinput-new.input-group .btn-file.btn-xs, +.fileinput-new .input-group .btn-file.btn-xs, +.fileinput-new.input-group .btn-file.btn-sm, +.fileinput-new .input-group .btn-file.btn-sm { + border-radius: 0 3px 3px 0; +} +.fileinput-new.input-group .btn-file.btn-lg, +.fileinput-new .input-group .btn-file.btn-lg { + border-radius: 0 6px 6px 0; +} +.form-group.has-warning .fileinput .fileinput-preview { + color: #8a6d3b; +} +.form-group.has-warning .fileinput .thumbnail { + border-color: #faebcc; +} +.form-group.has-error .fileinput .fileinput-preview { + color: #a94442; +} +.form-group.has-error .fileinput .thumbnail { + border-color: #ebccd1; } - -.control-group.error .fileupload .uneditable-input { - color: #b94a48; - border-color: #b94a48; +.form-group.has-success .fileinput .fileinput-preview { + color: #3c763d; } - -.control-group.error .fileupload .fileupload-preview { - color: #b94a48; +.form-group.has-success .fileinput .thumbnail { + border-color: #d6e9c6; } - -.control-group.error .fileupload .thumbnail { - border-color: #b94a48; +.input-group-addon:not(:first-child) { + border-left: 0; } - -.control-group.success .fileupload .uneditable-input { - color: #468847; - border-color: #468847; -} - -.control-group.success .fileupload .fileupload-preview { - color: #468847; -} - -.control-group.success .fileupload .thumbnail { - border-color: #468847; -} \ No newline at end of file Copied: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/fileinput.js (from r1739688, openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/bootstrap-fileupload.js) URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/fileinput.js?p2=openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/fileinput.js&p1=openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/bootstrap-fileupload.js&r1=1739688&r2=1739871&rev=1739871&view=diff ============================================================================== --- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/bootstrap-fileupload.js (original) +++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/fileinput.js Tue Apr 19 08:58:04 2016 @@ -1,8 +1,8 @@ /* =========================================================== - * bootstrap-fileupload.js j2 - * http://jasny.github.com/bootstrap/javascript.html#fileupload + * Bootstrap: fileinput.js v3.1.3 + * http://jasny.github.com/bootstrap/javascript/#fileinput * =========================================================== - * Copyright 2012 Jasny BV, Netherlands. + * Copyright 2012-2014 Arnold Daniels * * Licensed under the Apache License, Version 2.0 (the "License") * you may not use this file except in compliance with the License. @@ -17,152 +17,181 @@ * limitations under the License. * ========================================================== */ -!function ($) { ++function ($) { "use strict"; - "use strict"; // jshint ;_ + var isIE = window.navigator.appName == 'Microsoft Internet Explorer' - /* FILEUPLOAD PUBLIC CLASS DEFINITION - * ================================= */ + // FILEUPLOAD PUBLIC CLASS DEFINITION + // ================================= - var Fileupload = function (element, options) { + var Fileinput = function (element, options) { this.$element = $(element) - this.type = this.$element.data('uploadtype') || (this.$element.find('.thumbnail').length > 0 ? "image" : "file") - + this.$input = this.$element.find(':file') if (this.$input.length === 0) return this.name = this.$input.attr('name') || options.name - this.$hidden = this.$element.find('input[type=hidden][name="'+this.name+'"]') + this.$hidden = this.$element.find('input[type=hidden][name="' + this.name + '"]') if (this.$hidden.length === 0) { - this.$hidden = $('<input type="hidden" />') - this.$element.prepend(this.$hidden) + this.$hidden = $('<input type="hidden">').insertBefore(this.$input) } - this.$preview = this.$element.find('.fileupload-preview') + this.$preview = this.$element.find('.fileinput-preview') var height = this.$preview.css('height') - if (this.$preview.css('display') != 'inline' && height != '0px' && height != 'none') this.$preview.css('line-height', height) - + if (this.$preview.css('display') !== 'inline' && height !== '0px' && height !== 'none') { + this.$preview.css('line-height', height) + } + this.original = { - 'exists': this.$element.hasClass('fileupload-exists'), - 'preview': this.$preview.html(), - 'hiddenVal': this.$hidden.val() + exists: this.$element.hasClass('fileinput-exists'), + preview: this.$preview.html(), + hiddenVal: this.$hidden.val() } - this.$remove = this.$element.find('[data-dismiss="fileupload"]') - - this.$element.find('[data-trigger="fileupload"]').on('click.fileupload', $.proxy(this.trigger, this)) - this.listen() } - Fileupload.prototype = { + Fileinput.prototype.listen = function() { + this.$input.on('change.bs.fileinput', $.proxy(this.change, this)) + $(this.$input[0].form).on('reset.bs.fileinput', $.proxy(this.reset, this)) - listen: function() { - this.$input.on('change.fileupload', $.proxy(this.change, this)) - $(this.$input[0].form).on('reset.fileupload', $.proxy(this.reset, this)) - if (this.$remove) this.$remove.on('click.fileupload', $.proxy(this.clear, this)) - }, + this.$element.find('[data-trigger="fileinput"]').on('click.bs.fileinput', $.proxy(this.trigger, this)) + this.$element.find('[data-dismiss="fileinput"]').on('click.bs.fileinput', $.proxy(this.clear, this)) + }, + + Fileinput.prototype.change = function(e) { + var files = e.target.files === undefined ? (e.target && e.target.value ? [{ name: e.target.value.replace(/^.+\\/, '')}] : []) : e.target.files - change: function(e, invoked) { - if (invoked === 'clear') return - - var file = e.target.files !== undefined ? e.target.files[0] : (e.target.value ? { name: e.target.value.replace(/^.+\\/, '') } : null) - - if (!file) { - this.clear() - return - } - - this.$hidden.val('') - this.$hidden.attr('name', '') - this.$input.attr('name', this.name) - - if (this.type === "image" && this.$preview.length > 0 && (typeof file.type !== "undefined" ? file.type.match('image.*') : file.name.match(/\.(gif|png|jpe?g)$/i)) && typeof FileReader !== "undefined") { - var reader = new FileReader() - var preview = this.$preview - var element = this.$element - - reader.onload = function(e) { - preview.html('<img src="' + e.target.result + '" ' + (preview.css('max-height') != 'none' ? 'style="max-height: ' + preview.css('max-height') + ';"' : '') + ' />') - element.addClass('fileupload-exists').removeClass('fileupload-new') - } - - reader.readAsDataURL(file) - } else { - this.$preview.text(file.name) - this.$element.addClass('fileupload-exists').removeClass('fileupload-new') - } - }, + e.stopPropagation() - clear: function(e) { - this.$hidden.val('') - this.$hidden.attr('name', this.name) - this.$input.attr('name', '') - - //ie8+ doesn't support changing the value of input with type=file so clone instead - if (navigator.userAgent.match(/msie/i)){ - var inputClone = this.$input.clone(true); - this.$input.after(inputClone); - this.$input.remove(); - this.$input = inputClone; - }else{ - this.$input.val('') - } + if (files.length === 0) { + this.clear() + return + } - this.$preview.html('') - this.$element.addClass('fileupload-new').removeClass('fileupload-exists') + this.$hidden.val('') + this.$hidden.attr('name', '') + this.$input.attr('name', this.name) + + var file = files[0] + + if (this.$preview.length > 0 && (typeof file.type !== "undefined" ? file.type.match(/^image\/(gif|png|jpeg)$/) : file.name.match(/\.(gif|png|jpe?g)$/i)) && typeof FileReader !== "undefined") { + var reader = new FileReader() + var preview = this.$preview + var element = this.$element + + reader.onload = function(re) { + var $img = $('<img>') + $img[0].src = re.target.result + files[0].result = re.target.result + + element.find('.fileinput-filename').text(file.name) + + // if parent has max-height, using `(max-)height: 100%` on child doesn't take padding and border into account + if (preview.css('max-height') != 'none') $img.css('max-height', parseInt(preview.css('max-height'), 10) - parseInt(preview.css('padding-top'), 10) - parseInt(preview.css('padding-bottom'), 10) - parseInt(preview.css('border-top'), 10) - parseInt(preview.css('border-bottom'), 10)) + + preview.html($img) + element.addClass('fileinput-exists').removeClass('fileinput-new') - if (e) { - this.$input.trigger('change', [ 'clear' ]) - e.preventDefault() + element.trigger('change.bs.fileinput', files) } - }, - - reset: function(e) { - this.clear() + + reader.readAsDataURL(file) + } else { + this.$element.find('.fileinput-filename').text(file.name) + this.$preview.text(file.name) - this.$hidden.val(this.original.hiddenVal) - this.$preview.html(this.original.preview) + this.$element.addClass('fileinput-exists').removeClass('fileinput-new') - if (this.original.exists) this.$element.addClass('fileupload-exists').removeClass('fileupload-new') - else this.$element.addClass('fileupload-new').removeClass('fileupload-exists') - }, + this.$element.trigger('change.bs.fileinput') + } + }, + + Fileinput.prototype.clear = function(e) { + if (e) e.preventDefault() - trigger: function(e) { - this.$input.trigger('click') - e.preventDefault() + this.$hidden.val('') + this.$hidden.attr('name', this.name) + this.$input.attr('name', '') + + //ie8+ doesn't support changing the value of input with type=file so clone instead + if (isIE) { + var inputClone = this.$input.clone(true); + this.$input.after(inputClone); + this.$input.remove(); + this.$input = inputClone; + } else { + this.$input.val('') } + + this.$preview.html('') + this.$element.find('.fileinput-filename').text('') + this.$element.addClass('fileinput-new').removeClass('fileinput-exists') + + if (e !== undefined) { + this.$input.trigger('change') + this.$element.trigger('clear.bs.fileinput') + } + }, + + Fileinput.prototype.reset = function() { + this.clear() + + this.$hidden.val(this.original.hiddenVal) + this.$preview.html(this.original.preview) + this.$element.find('.fileinput-filename').text('') + + if (this.original.exists) this.$element.addClass('fileinput-exists').removeClass('fileinput-new') + else this.$element.addClass('fileinput-new').removeClass('fileinput-exists') + + this.$element.trigger('reset.bs.fileinput') + }, + + Fileinput.prototype.trigger = function(e) { + this.$input.trigger('click') + e.preventDefault() } - /* FILEUPLOAD PLUGIN DEFINITION - * =========================== */ + // FILEUPLOAD PLUGIN DEFINITION + // =========================== - $.fn.fileupload = function (options) { + var old = $.fn.fileinput + + $.fn.fileinput = function (options) { return this.each(function () { - var $this = $(this) - , data = $this.data('fileupload') - if (!data) $this.data('fileupload', (data = new Fileupload(this, options))) + var $this = $(this), + data = $this.data('bs.fileinput') + if (!data) $this.data('bs.fileinput', (data = new Fileinput(this, options))) if (typeof options == 'string') data[options]() }) } - $.fn.fileupload.Constructor = Fileupload + $.fn.fileinput.Constructor = Fileinput + + + // FILEINPUT NO CONFLICT + // ==================== + + $.fn.fileinput.noConflict = function () { + $.fn.fileinput = old + return this + } - /* FILEUPLOAD DATA-API - * ================== */ + // FILEUPLOAD DATA-API + // ================== - $(document).on('click.fileupload.data-api', '[data-provides="fileupload"]', function (e) { + $(document).on('click.fileinput.data-api', '[data-provides="fileinput"]', function (e) { var $this = $(this) - if ($this.data('fileupload')) return - $this.fileupload($this.data()) + if ($this.data('bs.fileinput')) return + $this.fileinput($this.data()) - var $target = $(e.target).closest('[data-dismiss="fileupload"],[data-trigger="fileupload"]'); + var $target = $(e.target).closest('[data-dismiss="fileinput"],[data-trigger="fileinput"]'); if ($target.length > 0) { - $target.trigger('click.fileupload') e.preventDefault() + $target.trigger('click.bs.fileinput') } }) Added: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/fileinput.min.css URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/fileinput.min.css?rev=1739871&view=auto ============================================================================== --- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/fileinput.min.css (added) +++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/fileinput.min.css Tue Apr 19 08:58:04 2016 @@ -0,0 +1,7 @@ +/*! + * Jasny Bootstrap v3.1.0 (http://jasny.github.com/bootstrap) + * Copyright 2011-2014 Arnold Daniels. + * Licensed under the Apache License, Version 2.0 (the "License"); (https://github.com/jasny/bootstrap/blob/master/LICENSE) + */ + +.btn-labeled{padding-top:0;padding-bottom:0}.btn-label{position:relative;background:transparent;background:rgba(0,0,0,0.15);display:inline-block;padding:6px 12px;left:-12px;border-radius:3px 0 0 3px}.btn-label.btn-label-right{left:auto;right:-12px;border-radius:0 3px 3px 0}.btn-lg .btn-label{padding:10px 16px;left:-16px;border-radius:5px 0 0 5px}.btn-lg .btn-label.btn-label-right{left:auto;right:-16px;border-radius:0 5px 5px 0}.btn-sm .btn-label{padding:5px 10px;left:-10px;border-radius:2px 0 0 2px}.btn-sm .btn-label.btn-label-right{left:auto;right:-10px;border-radius:0 2px 2px 0}.btn-xs .btn-label{padding:1px 5px;left:-5px;border-radius:2px 0 0 2px}.btn-xs .btn-label.btn-label-right{left:auto;right:-5px;border-radius:0 2px 2px 0}.nav-tabs-bottom{border-bottom:0;border-top:1px solid #ddd}.nav-tabs-bottom>li{margin-bottom:0;margin-top:-1px}.nav-tabs-bottom>li>a{border-radius:0 0 4px 4px}.nav-tabs-bottom>li>a:hover,.nav-tabs-bottom>li>a:focus,.nav-tabs-bottom>li.active>a,.nav-tabs-bot tom>li.active>a:hover,.nav-tabs-bottom>li.active>a:focus{border:1px solid #ddd;border-top-color:transparent}.nav-tabs-left{border-bottom:0;border-right:1px solid #ddd}.nav-tabs-left>li{margin-bottom:0;margin-right:-1px;float:none}.nav-tabs-left>li>a{border-radius:4px 0 0 4px;margin-right:0;margin-bottom:2px}.nav-tabs-left>li>a:hover,.nav-tabs-left>li>a:focus,.nav-tabs-left>li.active>a,.nav-tabs-left>li.active>a:hover,.nav-tabs-left>li.active>a:focus{border:1px solid #ddd;border-right-color:transparent}.row>.nav-tabs-left{padding-right:0;padding-left:15px;margin-right:-1px;position:relative;z-index:1}.row>.nav-tabs-left+.tab-content{border-left:1px solid #ddd}.nav-tabs-right{border-bottom:0;border-left:1px solid #ddd}.nav-tabs-right>li{margin-bottom:0;margin-left:-1px;float:none}.nav-tabs-right>li>a{border-radius:0 4px 4px 0;margin-left:0;margin-bottom:2px}.nav-tabs-right>li>a:hover,.nav-tabs-right>li>a:focus,.nav-tabs-right>li.active>a,.nav-tabs-right>li.active>a:hover,.nav-tabs-rig ht>li.active>a:focus{border:1px solid #ddd;border-left-color:transparent}.row>.nav-tabs-right{padding-left:0;padding-right:15px}.btn-file{overflow:hidden;position:relative;vertical-align:middle}.btn-file>input{position:absolute;top:0;right:0;margin:0;opacity:0;filter:alpha(opacity=0);font-size:23px;height:100%;width:100%;direction:ltr;cursor:pointer}.fileinput{margin-bottom:9px;display:inline-block}.fileinput .form-control{padding-top:7px;padding-bottom:5px;display:inline-block;margin-bottom:0px;vertical-align:middle;cursor:text}.fileinput .thumbnail{overflow:hidden;display:inline-block;margin-bottom:5px;vertical-align:middle;text-align:center}.fileinput .thumbnail>img{max-height:100%}.fileinput .btn{vertical-align:middle}.fileinput-exists .fileinput-new,.fileinput-new .fileinput-exists{display:none}.fileinput-inline .fileinput-controls{display:inline}.fileinput-filename{vertical-align:middle;display:inline-block;overflow:hidden}.form-control .fileinput-filename{vertical-align:botto m}.fileinput.input-group{display:table}.fileinput.input-group>*{position:relative;z-index:2}.fileinput.input-group>.btn-file{z-index:1}.fileinput-new.input-group .btn-file,.fileinput-new .input-group .btn-file{border-radius:0 4px 4px 0}.fileinput-new.input-group .btn-file.btn-xs,.fileinput-new .input-group .btn-file.btn-xs,.fileinput-new.input-group .btn-file.btn-sm,.fileinput-new .input-group .btn-file.btn-sm{border-radius:0 3px 3px 0}.fileinput-new.input-group .btn-file.btn-lg,.fileinput-new .input-group .btn-file.btn-lg{border-radius:0 6px 6px 0}.form-group.has-warning .fileinput .fileinput-preview{color:#8a6d3b}.form-group.has-warning .fileinput .thumbnail{border-color:#faebcc}.form-group.has-error .fileinput .fileinput-preview{color:#a94442}.form-group.has-error .fileinput .thumbnail{border-color:#ebccd1}.form-group.has-success .fileinput .fileinput-preview{color:#3c763d}.form-group.has-success .fileinput .thumbnail{border-color:#d6e9c6}.input-group-addon:not(:first-child){bord er-left:0} Added: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/fileinput.min.js URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/fileinput.min.js?rev=1739871&view=auto ============================================================================== --- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/fileinput.min.js (added) +++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/fileinput.min.js Tue Apr 19 08:58:04 2016 @@ -0,0 +1,7 @@ +/*! + * Jasny Bootstrap v3.1.0 (http://jasny.github.com/bootstrap) + * Copyright 2011-2014 Arnold Daniels. + * Licensed under the Apache License, Version 2.0 (the "License"); (https://github.com/jasny/bootstrap/blob/master/LICENSE) + */ + ++function(a){"use strict";var b=window.navigator.appName=="Microsoft Internet Explorer",c=function(b,c){this.$element=a(b),this.$input=this.$element.find(":file");if(this.$input.length===0)return;this.name=this.$input.attr("name")||c.name,this.$hidden=this.$element.find('input[type=hidden][name="'+this.name+'"]'),this.$hidden.length===0&&(this.$hidden=a('<input type="hidden">').insertBefore(this.$input)),this.$preview=this.$element.find(".fileinput-preview");var d=this.$preview.css("height");this.$preview.css("display")!=="inline"&&d!=="0px"&&d!=="none"&&this.$preview.css("line-height",d),this.original={exists:this.$element.hasClass("fileinput-exists"),preview:this.$preview.html(),hiddenVal:this.$hidden.val()},this.listen()};c.prototype.listen=function(){this.$input.on("change.bs.fileinput",a.proxy(this.change,this)),a(this.$input[0].form).on("reset.bs.fileinput",a.proxy(this.reset,this)),this.$element.find('[data-trigger="fileinput"]').on("click.bs.fileinput",a.proxy(this.trigger,t his)),this.$element.find('[data-dismiss="fileinput"]').on("click.bs.fileinput",a.proxy(this.clear,this))},c.prototype.change=function(b){var c=b.target.files===undefined?b.target&&b.target.value?[{name:b.target.value.replace(/^.+\\/,"")}]:[]:b.target.files;b.stopPropagation();if(c.length===0){this.clear();return}this.$hidden.val(""),this.$hidden.attr("name",""),this.$input.attr("name",this.name);var d=c[0];if(this.$preview.length>0&&(typeof d.type!="undefined"?d.type.match(/^image\/(gif|png|jpeg)$/):d.name.match(/\.(gif|png|jpe?g)$/i))&&typeof FileReader!="undefined"){var e=new FileReader,f=this.$preview,g=this.$element;e.onload=function(b){var e=a("<img>");e[0].src=b.target.result,c[0].result=b.target.result,g.find(".fileinput-filename").text(d.name),f.css("max-height")!="none"&&e.css("max-height",parseInt(f.css("max-height"),10)-parseInt(f.css("padding-top"),10)-parseInt(f.css("padding-bottom"),10)-parseInt(f.css("border-top"),10)-parseInt(f.css("border-bottom"),10)),f.html(e),g.a ddClass("fileinput-exists").removeClass("fileinput-new"),g.trigger("change.bs.fileinput",c)},e.readAsDataURL(d)}else this.$element.find(".fileinput-filename").text(d.name),this.$preview.text(d.name),this.$element.addClass("fileinput-exists").removeClass("fileinput-new"),this.$element.trigger("change.bs.fileinput")},c.prototype.clear=function(a){a&&a.preventDefault(),this.$hidden.val(""),this.$hidden.attr("name",this.name),this.$input.attr("name","");if(b){var c=this.$input.clone(!0);this.$input.after(c),this.$input.remove(),this.$input=c}else this.$input.val("");this.$preview.html(""),this.$element.find(".fileinput-filename").text(""),this.$element.addClass("fileinput-new").removeClass("fileinput-exists"),a!==undefined&&(this.$input.trigger("change"),this.$element.trigger("clear.bs.fileinput"))},c.prototype.reset=function(){this.clear(),this.$hidden.val(this.original.hiddenVal),this.$preview.html(this.original.preview),this.$element.find(".fileinput-filename").text(""),this.original .exists?this.$element.addClass("fileinput-exists").removeClass("fileinput-new"):this.$element.addClass("fileinput-new").removeClass("fileinput-exists"),this.$element.trigger("reset.bs.fileinput")},c.prototype.trigger=function(a){this.$input.trigger("click"),a.preventDefault()};var d=a.fn.fileinput;a.fn.fileinput=function(b){return this.each(function(){var d=a(this),e=d.data("bs.fileinput");e||d.data("bs.fileinput",e=new c(this,b)),typeof b=="string"&&e[b]()})},a.fn.fileinput.Constructor=c,a.fn.fileinput.noConflict=function(){return a.fn.fileinput=d,this},a(document).on("click.fileinput.data-api",'[data-provides="fileinput"]',function(b){var c=a(this);if(c.data("bs.fileinput"))return;c.fileinput(c.data());var d=a(b.target).closest('[data-dismiss="fileinput"],[data-trigger="fileinput"]');d.length>0&&(b.preventDefault(),d.trigger("click.bs.fileinput"))})}(window.jQuery)
