From 97ea464a839e5d0cfc81b80acb81bc5c832b02e7 Mon Sep 17 00:00:00 2001 From: srosse <none@none> Date: Tue, 14 Oct 2014 14:52:29 +0200 Subject: [PATCH] OO-1235: show the business path to the current file ( with QR code ) --- .../modules/bc/commands/CmdEditMeta.java | 29 ++++++++++++++----- .../modules/bc/meta/MetaInfoController.java | 28 +++++++++++++----- .../modules/bc/meta/MetaInfoFileImpl.java | 4 +-- .../bc/meta/MetaInfoFormController.java | 21 ++++++++++---- .../bc/meta/_content/external_url.html | 8 +++++ .../bc/meta/_i18n/LocalStrings_de.properties | 1 + .../bc/meta/_i18n/LocalStrings_en.properties | 1 + .../course/run/CourseRuntimeController.java | 10 +++++-- 8 files changed, 78 insertions(+), 24 deletions(-) create mode 100644 src/main/java/org/olat/core/commons/modules/bc/meta/_content/external_url.html diff --git a/src/main/java/org/olat/core/commons/modules/bc/commands/CmdEditMeta.java b/src/main/java/org/olat/core/commons/modules/bc/commands/CmdEditMeta.java index e5feb875d30..35995dea582 100644 --- a/src/main/java/org/olat/core/commons/modules/bc/commands/CmdEditMeta.java +++ b/src/main/java/org/olat/core/commons/modules/bc/commands/CmdEditMeta.java @@ -42,8 +42,11 @@ import org.olat.core.gui.control.Event; import org.olat.core.gui.control.WindowControl; import org.olat.core.gui.control.controller.BasicController; import org.olat.core.gui.translator.Translator; +import org.olat.core.id.OLATResourceable; +import org.olat.core.id.context.BusinessControlFactory; import org.olat.core.util.StringHelper; import org.olat.core.util.Util; +import org.olat.core.util.resource.OresHelper; import org.olat.core.util.vfs.VFSConstants; import org.olat.core.util.vfs.VFSContainer; import org.olat.core.util.vfs.VFSItem; @@ -75,10 +78,11 @@ public class CmdEditMeta extends BasicController implements FolderCommand { * * @see org.olat.core.commons.modules.bc.commands.FolderCommand#execute(org.olat.core.commons.modules.bc.components.FolderComponent, org.olat.core.gui.UserRequest, org.olat.core.gui.control.WindowControl, org.olat.core.gui.translator.Translator) */ - public Controller execute(FolderComponent folderComponent, + @Override + public Controller execute(FolderComponent fComponent, UserRequest ureq, WindowControl wControl, Translator trans) { this.translator = trans; - this.folderComponent = folderComponent; + this.folderComponent = fComponent; String pos = ureq.getParameter(ListRenderer.PARAM_EDTID); if (!StringHelper.containsNonWhitespace(pos)) { // somehow parameter did not make it to us @@ -87,9 +91,9 @@ public class CmdEditMeta extends BasicController implements FolderCommand { return null; } - status = FolderCommandHelper.sanityCheck(wControl, folderComponent); + status = FolderCommandHelper.sanityCheck(wControl, fComponent); if(status == FolderCommandStatus.STATUS_SUCCESS) { - currentItem = folderComponent.getCurrentContainerChildren().get(Integer.parseInt(pos)); + currentItem = fComponent.getCurrentContainerChildren().get(Integer.parseInt(pos)); } if(status == FolderCommandStatus.STATUS_FAILED) { return null; @@ -97,19 +101,30 @@ public class CmdEditMeta extends BasicController implements FolderCommand { removeAsListenerAndDispose(metaCtr); removeAsListenerAndDispose(metaInfoCtr); - if(vfsLockManager.isLockedForMe(currentItem, getIdentity(), ureq.getUserSession().getRoles())) { //readonly - metaCtr = new MetaInfoController(ureq, wControl, currentItem); + String resourceUrl = getResourceURL(wControl); + metaCtr = new MetaInfoController(ureq, wControl, currentItem, resourceUrl); listenTo(metaCtr); putInitialPanel(metaCtr.getInitialComponent()); } else { - metaInfoCtr = new MetaInfoFormController(ureq, wControl, currentItem); + String resourceUrl = getResourceURL(wControl); + metaInfoCtr = new MetaInfoFormController(ureq, wControl, currentItem, resourceUrl); listenTo(metaInfoCtr); putInitialPanel(metaInfoCtr.getInitialComponent()); } return this; } + + private String getResourceURL(WindowControl wControl) { + String path = "path=" + folderComponent.getCurrentContainerPath(); + if(currentItem != null) { + path += "/" + currentItem.getName(); + } + OLATResourceable ores = OresHelper.createOLATResourceableTypeWithoutCheck(path); + WindowControl bwControl = BusinessControlFactory.getInstance().createBusinessWindowControl(ores, null, wControl); + return BusinessControlFactory.getInstance().getAsURIString(bwControl.getBusinessControl(), false); + } @Override public int getStatus() { diff --git a/src/main/java/org/olat/core/commons/modules/bc/meta/MetaInfoController.java b/src/main/java/org/olat/core/commons/modules/bc/meta/MetaInfoController.java index b4e279034a0..373afdacd02 100644 --- a/src/main/java/org/olat/core/commons/modules/bc/meta/MetaInfoController.java +++ b/src/main/java/org/olat/core/commons/modules/bc/meta/MetaInfoController.java @@ -46,6 +46,7 @@ import org.olat.core.util.vfs.VFSLeaf; import org.olat.core.util.vfs.VFSLockManager; import org.olat.core.util.vfs.lock.LockInfo; import org.olat.user.UserManager; +import org.springframework.beans.factory.annotation.Autowired; /** * Read only variant to show the meta datas of a file @@ -56,12 +57,15 @@ import org.olat.user.UserManager; public class MetaInfoController extends FormBasicController { private VFSItem item; private FormLink moreMetaDataLink; - private StaticTextElement publisher, creator, source, city, pages, language, url; + private StaticTextElement publisher, creator, sourceEl, city, pages, language, url; private SingleSelection locked; private Set<FormItem> metaFields; + private String resourceUrl; - private final UserManager userManager; - private final VFSLockManager vfsLockManager; + @Autowired + private UserManager userManager; + @Autowired + private VFSLockManager vfsLockManager; /** * Use this controller for editing meta data of an existing file. @@ -69,11 +73,10 @@ public class MetaInfoController extends FormBasicController { * @param ureq * @param control */ - public MetaInfoController(UserRequest ureq, WindowControl control, VFSItem item) { + public MetaInfoController(UserRequest ureq, WindowControl control, VFSItem item, String resourceUrl) { super(ureq, control); this.item = item; - userManager = CoreSpringFactory.getImpl(UserManager.class); - vfsLockManager = CoreSpringFactory.getImpl(VFSLockManager.class); + this.resourceUrl = resourceUrl; initForm(ureq); } @@ -150,7 +153,7 @@ public class MetaInfoController extends FormBasicController { // source/origin String sourceVal = StringHelper.escapeHtml(meta != null ? meta.getSource() : null); - source = uifactory.addStaticTextElement("mf.source", sourceVal, formLayout); + sourceEl = uifactory.addStaticTextElement("mf.source", sourceVal, formLayout); // city String cityVal = StringHelper.escapeHtml(meta != null ? meta.getCity() : null); @@ -192,7 +195,7 @@ public class MetaInfoController extends FormBasicController { metaFields = new HashSet<FormItem>(); metaFields.add(creator); metaFields.add(publisher); - metaFields.add(source); + metaFields.add(sourceEl); metaFields.add(city); metaFields.add(publicationDate); metaFields.add(pages); @@ -260,6 +263,15 @@ public class MetaInfoController extends FormBasicController { moreMetaDataLink.setVisible(false); } } + + if(StringHelper.containsNonWhitespace(resourceUrl)) { + String externalUrlPage = velocity_root + "/external_url.html"; + FormLayoutContainer extUrlCont = FormLayoutContainer.createCustomFormLayout("external.url", getTranslator(), externalUrlPage); + extUrlCont.setLabel("external.url", null); + extUrlCont.contextPut("resourceUrl", resourceUrl); + extUrlCont.setRootForm(mainForm); + formLayout.add(extUrlCont); + } // cancel buttons final FormLayoutContainer buttonLayout = FormLayoutContainer.createButtonLayout("buttonLayout", getTranslator()); diff --git a/src/main/java/org/olat/core/commons/modules/bc/meta/MetaInfoFileImpl.java b/src/main/java/org/olat/core/commons/modules/bc/meta/MetaInfoFileImpl.java index c8c6a070788..82069ba8b7a 100644 --- a/src/main/java/org/olat/core/commons/modules/bc/meta/MetaInfoFileImpl.java +++ b/src/main/java/org/olat/core/commons/modules/bc/meta/MetaInfoFileImpl.java @@ -844,9 +844,9 @@ public class MetaInfoFileImpl extends DefaultHandler implements MetaInfo { String name = originFile.getName(); String extension = FileUtils.getFileSuffix(name); String nameOnly = name.substring(0, name.length() - extension.length() - 1); - String uuid = UUID.randomUUID().toString(); + String randuuid = UUID.randomUUID().toString(); String thumbnailExtension = preferedThumbnailType(extension); - File thumbnailFile = new File(metaLoc, nameOnly + "_" + uuid + "_" + maxHeight + "x" + maxWidth + (fill ? "xfill" : "") + "." + thumbnailExtension); + File thumbnailFile = new File(metaLoc, nameOnly + "_" + randuuid + "_" + maxHeight + "x" + maxWidth + (fill ? "xfill" : "") + "." + thumbnailExtension); //generate thumbnail long start = 0l; diff --git a/src/main/java/org/olat/core/commons/modules/bc/meta/MetaInfoFormController.java b/src/main/java/org/olat/core/commons/modules/bc/meta/MetaInfoFormController.java index f7accf6913c..b455fb0b996 100644 --- a/src/main/java/org/olat/core/commons/modules/bc/meta/MetaInfoFormController.java +++ b/src/main/java/org/olat/core/commons/modules/bc/meta/MetaInfoFormController.java @@ -70,11 +70,12 @@ public class MetaInfoFormController extends FormBasicController { //private MetaInfo meta; private FormLink moreMetaDataLink; private String initialFilename; - private TextElement filename, title, publisher, creator, source, city, pages, language, url, comment, publicationMonth, publicationYear; + private TextElement filename, title, publisher, creator, sourceEl, city, pages, language, url, comment, publicationMonth, publicationYear; private SingleSelection locked; // Fields needed for upload dialog private boolean isSubform; private Set<FormItem> metaFields; + private String resourceUrl; private final Roles roles; private final UserManager userManager; @@ -87,10 +88,11 @@ public class MetaInfoFormController extends FormBasicController { * @param ureq * @param control */ - public MetaInfoFormController(UserRequest ureq, WindowControl control, VFSItem item) { + public MetaInfoFormController(UserRequest ureq, WindowControl control, VFSItem item, String resourceUrl) { super(ureq, control); isSubform = false; this.item = item; + this.resourceUrl = resourceUrl; // load the metainfo roles = ureq.getUserSession().getRoles(); userManager = CoreSpringFactory.getImpl(UserManager.class); @@ -217,7 +219,7 @@ public class MetaInfoFormController extends FormBasicController { // source/origin String sourceVal = (meta != null ? meta.getSource() : null); - source = uifactory.addTextElement("source", "mf.source", -1, sourceVal, formLayout); + sourceEl = uifactory.addTextElement("source", "mf.source", -1, sourceVal, formLayout); // city String cityVal = (meta != null ? meta.getCity() : null); @@ -263,7 +265,7 @@ public class MetaInfoFormController extends FormBasicController { metaFields = new HashSet<FormItem>(); metaFields.add(creator); metaFields.add(publisher); - metaFields.add(source); + metaFields.add(sourceEl); metaFields.add(city); metaFields.add(publicationDate); metaFields.add(pages); @@ -324,6 +326,15 @@ public class MetaInfoFormController extends FormBasicController { String downloads = meta == null ? "" : String.valueOf(meta.getDownloadCount()); uifactory.addStaticTextElement("mf.downloads", downloads, formLayout); } + + if(StringHelper.containsNonWhitespace(resourceUrl)) { + String externalUrlPage = velocity_root + "/external_url.html"; + FormLayoutContainer extUrlCont = FormLayoutContainer.createCustomFormLayout("external.url", getTranslator(), externalUrlPage); + extUrlCont.setLabel("external.url", null); + extUrlCont.contextPut("resourceUrl", resourceUrl); + extUrlCont.setRootForm(mainForm); + formLayout.add(extUrlCont); + } if (!isSubform && meta != null && meta.isDirectory()) { // Don't show any meta data except title and comment if the item is @@ -393,7 +404,7 @@ public class MetaInfoFormController extends FormBasicController { meta.setPublicationDate(publicationMonth.getValue(), publicationYear.getValue()); meta.setCity(city.getValue()); meta.setLanguage(language.getValue()); - meta.setSource(source.getValue()); + meta.setSource(sourceEl.getValue()); meta.setUrl(url.getValue()); meta.setPages(pages.getValue()); return meta; diff --git a/src/main/java/org/olat/core/commons/modules/bc/meta/_content/external_url.html b/src/main/java/org/olat/core/commons/modules/bc/meta/_content/external_url.html new file mode 100644 index 00000000000..8c45abd1045 --- /dev/null +++ b/src/main/java/org/olat/core/commons/modules/bc/meta/_content/external_url.html @@ -0,0 +1,8 @@ +<div class="o_copy_code form-control-static"><a href="javascript:;" id="o_extlink"><i class="o_icon o_icon-lg o_icon-fw o_icon_qrcode"></i></a>$resourceUrl</div> +<script type="text/javascript"> +/* <![CDATA[ */ + jQuery(function() { + o_QRCodePopup('o_extlink', '$resourceUrl', 'right'); + }); +/* ]]> */ +</script> \ No newline at end of file diff --git a/src/main/java/org/olat/core/commons/modules/bc/meta/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/core/commons/modules/bc/meta/_i18n/LocalStrings_de.properties index a86966ddd48..f233cebc8a3 100644 --- a/src/main/java/org/olat/core/commons/modules/bc/meta/_i18n/LocalStrings_de.properties +++ b/src/main/java/org/olat/core/commons/modules/bc/meta/_i18n/LocalStrings_de.properties @@ -39,6 +39,7 @@ mf.locked.description={0} am {1} mf.lockedBy=Gesperrt von mf.unlocked=Freigegeben mf.unlocked.description=Dokument momentan nicht gesperrt +external.url=External link to this resource chelp.bc-metainfo.title = Metadaten chelp.bc-metainfo.hover=Hilfe zu den Metadaten von Dateien chelp.meta.intro = Jede Datei kann mit Metadaten versehen werden. Die Metadaten orientieren sich am Dublin Core Simple Standard. Weitere Informationen zu Dublin Core finden Sie hier: {0}. diff --git a/src/main/java/org/olat/core/commons/modules/bc/meta/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/core/commons/modules/bc/meta/_i18n/LocalStrings_en.properties index 312ed15d090..3d23114977a 100644 --- a/src/main/java/org/olat/core/commons/modules/bc/meta/_i18n/LocalStrings_en.properties +++ b/src/main/java/org/olat/core/commons/modules/bc/meta/_i18n/LocalStrings_en.properties @@ -6,6 +6,7 @@ chelp.meta.locked=Here you can decide if you want to lock this file. Other users chelp.meta.optional=Metadata are optional. However, several meta data cannot be modified\: name of person who has uploaded a certain document, size of document, file type, and time of document upload. chelp.meta.purpose=Metadata additionally describe a file, e.g. its title, author or publisher. They serve as a means to clarify a document's purpose and are particularly suitable for file names that would otherwise be too long or for document titles containing special characters. chelp.meta.search=Metadata are indexed by the full-text search. Therefore you can search for metadata by means of keywords when trying to find relevant documents. +external.url=External link to this resource file.name.notvalid=This file name contains invalid characters. Please remove all special characters such as /, \:, etc. mf.author=Created by mf.cancel=Cancel diff --git a/src/main/java/org/olat/course/run/CourseRuntimeController.java b/src/main/java/org/olat/course/run/CourseRuntimeController.java index 537e66b2cd5..663adc9a28f 100644 --- a/src/main/java/org/olat/course/run/CourseRuntimeController.java +++ b/src/main/java/org/olat/course/run/CourseRuntimeController.java @@ -782,7 +782,12 @@ public class CourseRuntimeController extends RepositoryEntryRuntimeController im //the wrong link to the wrong person } } - } + } else if(type != null && type.startsWith("path=")) { + if (reSecurity.isEntryAdmin() || hasCourseRight(CourseRights.RIGHT_COURSEEDITOR)) { + String path = BusinessControlFactory.getInstance().getPath(entries.get(0)); + doCourseFolder(ureq).activatePath(ureq, path); + } + } } if(getRunMainController() != null) { @@ -889,7 +894,7 @@ public class CourseRuntimeController extends RepositoryEntryRuntimeController im } } - private void doCourseFolder(UserRequest ureq) { + private FolderRunController doCourseFolder(UserRequest ureq) { removeCustomCSS(ureq); // Folder for course with custom link model to jump to course nodes ICourse course = CourseFactory.loadCourse(getOlatResourceable()); @@ -901,6 +906,7 @@ public class CourseRuntimeController extends RepositoryEntryRuntimeController im courseFolderCtrl = pushController(ureq, translate("command.coursefolder"), ctrl); setActiveTool(folderLink); currentToolCtr = courseFolderCtrl; + return courseFolderCtrl; } private void doCourseAreas(UserRequest ureq) { -- GitLab