diff --git a/src/main/java/org/olat/core/commons/services/vfs/ui/editor/VFSLeafEditorController.java b/src/main/java/org/olat/core/commons/services/vfs/ui/editor/VFSLeafEditorController.java index 3b1e8dc00fe4fc2b9634ee5fadc9cc829f5d1e84..ec06af0f5458768b39e49b596ad4764f2e5bc121 100644 --- a/src/main/java/org/olat/core/commons/services/vfs/ui/editor/VFSLeafEditorController.java +++ b/src/main/java/org/olat/core/commons/services/vfs/ui/editor/VFSLeafEditorController.java @@ -70,6 +70,10 @@ public class VFSLeafEditorController extends BasicController { putInitialPanel(mainVC); } + public VFSLeaf getVfsLeaf() { + return vfsLeaf; + } + @Override protected void event(UserRequest ureq, Controller source, Event event) { if (source == configCtrl) { diff --git a/src/main/java/org/olat/course/nodes/gta/ui/EditHTMLController.java b/src/main/java/org/olat/course/nodes/gta/ui/EditHTMLController.java index 56d846aadfe2b0a73ebd39ac093825df9bf9d8bd..ea9182eb70869b4d2126da67d6d18f1d053b4cee 100644 --- a/src/main/java/org/olat/course/nodes/gta/ui/EditHTMLController.java +++ b/src/main/java/org/olat/course/nodes/gta/ui/EditHTMLController.java @@ -47,10 +47,12 @@ public class EditHTMLController extends BasicController { private VelocityContainer mainVC; private Link backButton; private Controller editorCtrl; + private final VFSLeaf vfsLeaf; public EditHTMLController(UserRequest ureq, WindowControl wControl, VFSContainer tasksContainer, VFSLeaf vfsLeaf, Long courseRepoKey, boolean readOnly) { super(ureq, wControl); + this.vfsLeaf = vfsLeaf; mainVC = createVelocityContainer("edit_html"); @@ -59,7 +61,9 @@ public class EditHTMLController extends BasicController { if (readOnly) { editorCtrl = new HTMLReadOnlyController(ureq, getWindowControl(), vfsLeaf.getParentContainer(), vfsLeaf.getName(), true); } else { - VFSEdusharingProvider edusharingProvider = new LazyRepositoryEdusharingProvider(courseRepoKey); + VFSEdusharingProvider edusharingProvider = courseRepoKey != null + ? new LazyRepositoryEdusharingProvider(courseRepoKey) + : null; HTMLEditorController htmlCtrl = WysiwygFactory.createWysiwygController(ureq, getWindowControl(), tasksContainer, vfsLeaf.getName(), "media", true, true, edusharingProvider); htmlCtrl.getRichTextConfiguration().disableMedia(); @@ -73,6 +77,10 @@ public class EditHTMLController extends BasicController { putInitialPanel(mainVC); } + public VFSLeaf getVfsLeaf() { + return vfsLeaf; + } + @Override protected void event(UserRequest ureq, Controller source, Event event) { if (source == editorCtrl) { diff --git a/src/main/java/org/olat/course/nodes/gta/ui/NewDocumentController.java b/src/main/java/org/olat/course/nodes/gta/ui/NewDocumentController.java index 19c46ae49511582c6661b45ee7dee4b60f491579..e7d287d8d3718700d438320eb3ff5d22108fa365 100644 --- a/src/main/java/org/olat/course/nodes/gta/ui/NewDocumentController.java +++ b/src/main/java/org/olat/course/nodes/gta/ui/NewDocumentController.java @@ -19,8 +19,15 @@ */ package org.olat.course.nodes.gta.ui; +import java.util.List; + +import org.olat.core.commons.services.filetemplate.FileType; +import org.olat.core.commons.services.filetemplate.FileTypes; +import org.olat.core.commons.services.vfs.VFSMetadata; +import org.olat.core.commons.services.vfs.VFSRepositoryService; import org.olat.core.gui.UserRequest; import org.olat.core.gui.components.form.flexible.FormItemContainer; +import org.olat.core.gui.components.form.flexible.elements.SingleSelection; import org.olat.core.gui.components.form.flexible.elements.TextElement; import org.olat.core.gui.components.form.flexible.impl.FormBasicController; import org.olat.core.gui.components.form.flexible.impl.FormLayoutContainer; @@ -29,7 +36,12 @@ import org.olat.core.gui.control.Event; import org.olat.core.gui.control.WindowControl; import org.olat.core.util.FileUtils; import org.olat.core.util.StringHelper; +import org.olat.core.util.vfs.VFSConstants; import org.olat.core.util.vfs.VFSContainer; +import org.olat.core.util.vfs.VFSItem; +import org.olat.core.util.vfs.VFSLeaf; +import org.olat.core.util.vfs.VFSManager; +import org.springframework.beans.factory.annotation.Autowired; /** * @@ -40,17 +52,42 @@ import org.olat.core.util.vfs.VFSContainer; public class NewDocumentController extends FormBasicController { private TextElement filenameEl; + private SingleSelection fileTypeEl; private final VFSContainer documentContainer; + private final List<FileType> fileTypes; + + @Autowired + private VFSRepositoryService vfsService; - public NewDocumentController(UserRequest ureq, WindowControl wControl, VFSContainer documentContainer) { + public NewDocumentController(UserRequest ureq, WindowControl wControl, VFSContainer documentContainer, + FileTypes fileTypes) { super(ureq, wControl); this.documentContainer = documentContainer; + this.fileTypes = fileTypes.getFileTypes(); initForm(ureq); } @Override protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) { formLayout.setElementCssClass("o_sel_course_gta_new_doc_form"); + + String[] fileTypeKeys = new String[fileTypes.size()]; + String[] fileTypeValues = new String[fileTypes.size()]; + String[] fileTypeSuffix = new String[fileTypes.size()]; + for (int i = 0; i < fileTypes.size(); i++) { + FileType fileType = fileTypes.get(i); + String name = fileType.getName() + " (." + fileType.getSuffix() + ")"; + fileTypeKeys[i] = String.valueOf(i); + fileTypeValues[i] = name; + fileTypeSuffix[i] = fileType.getSuffix(); + } + fileTypeEl = uifactory.addDropdownSingleselect("file.type", formLayout, fileTypeKeys, fileTypeValues, fileTypeSuffix); + fileTypeEl.setElementCssClass("o_sel_course_gta_doc_filetype"); + fileTypeEl.setMandatory(true); + if (fileTypes.size() == 1) { + fileTypeEl.setVisible(false); + } + filenameEl = uifactory.addTextElement("fileName", "file.name", -1, "", formLayout); filenameEl.setElementCssClass("o_sel_course_gta_doc_filename"); filenameEl.setExampleKey("file.name.example", null); @@ -69,14 +106,17 @@ public class NewDocumentController extends FormBasicController { } public String getFilename() { - String value = filenameEl.getValue(); - String lowerCased = value.toLowerCase(); - if(!lowerCased.endsWith(".xhtm") - && !lowerCased.endsWith(".html") - && !lowerCased.endsWith(".htm")) { - value += ".html"; - } - return value; + String fileName = filenameEl.getValue().toLowerCase(); + FileType fileType = getSelectedFileType(); + String suffix = fileType != null? fileType.getSuffix(): ""; + return fileName.endsWith("." + suffix) + ? fileName + : fileName + "." + suffix; + } + + private FileType getSelectedFileType() { + int index = fileTypeEl.getSelected(); + return index >= 0? fileTypes.get(index): fileTypes.get(0); } @Override @@ -104,6 +144,24 @@ public class NewDocumentController extends FormBasicController { @Override protected void formOK(UserRequest ureq) { + String documentName = getFilename(); + VFSItem item = documentContainer.resolve(documentName); + VFSLeaf vfsLeaf = null; + if(item == null) { + vfsLeaf = documentContainer.createChildLeaf(documentName); + } else { + documentName = VFSManager.rename(documentContainer, documentName); + vfsLeaf = documentContainer.createChildLeaf(documentName); + } + FileType fileType = getSelectedFileType(); + if (fileType != null) { + VFSManager.copyContent(fileType.getContentProvider().getContent(), vfsLeaf); + } + if(vfsLeaf.canMeta() == VFSConstants.YES) { + VFSMetadata metaInfo = vfsLeaf.getMetaInfo(); + metaInfo.setAuthor(getIdentity()); + vfsService.updateMetadata(metaInfo); + } fireEvent(ureq, Event.DONE_EVENT); } diff --git a/src/main/java/org/olat/course/nodes/gta/ui/SubmitDocumentsController.java b/src/main/java/org/olat/course/nodes/gta/ui/SubmitDocumentsController.java index 060b7e99c4b4b7f90aed802aebcffd00a8933ed2..a9ddf1aaa609393b8a7c1c77b44d7b5f01663c60 100644 --- a/src/main/java/org/olat/course/nodes/gta/ui/SubmitDocumentsController.java +++ b/src/main/java/org/olat/course/nodes/gta/ui/SubmitDocumentsController.java @@ -19,6 +19,8 @@ */ package org.olat.course.nodes.gta.ui; +import static org.olat.core.commons.services.vfs.VFSLeafEditor.Mode.EDIT; + import java.io.File; import java.io.IOException; import java.nio.file.Files; @@ -29,11 +31,15 @@ import java.util.Calendar; import java.util.Date; import java.util.List; -import org.olat.core.commons.editor.htmleditor.HTMLEditorController; -import org.olat.core.commons.editor.htmleditor.WysiwygFactory; import org.olat.core.commons.modules.singlepage.SinglePageController; +import org.olat.core.commons.services.filetemplate.FileTypes; +import org.olat.core.commons.services.filetemplate.FileTypes.Builder; +import org.olat.core.commons.services.vfs.VFSLeafEditor.Mode; +import org.olat.core.commons.services.vfs.VFSLeafEditorSecurityCallback; +import org.olat.core.commons.services.vfs.VFSLeafEditorSecurityCallbackBuilder; import org.olat.core.commons.services.vfs.VFSMetadata; import org.olat.core.commons.services.vfs.VFSRepositoryService; +import org.olat.core.commons.services.vfs.ui.editor.VFSLeafEditorController; import org.olat.core.gui.UserRequest; import org.olat.core.gui.components.form.flexible.FormItem; import org.olat.core.gui.components.form.flexible.FormItemContainer; @@ -41,29 +47,31 @@ import org.olat.core.gui.components.form.flexible.elements.FlexiTableElement; import org.olat.core.gui.components.form.flexible.elements.FormLink; import org.olat.core.gui.components.form.flexible.impl.FormBasicController; import org.olat.core.gui.components.form.flexible.impl.FormEvent; -import org.olat.core.gui.components.form.flexible.impl.elements.table.BooleanCellRenderer; import org.olat.core.gui.components.form.flexible.impl.elements.table.DefaultFlexiColumnModel; import org.olat.core.gui.components.form.flexible.impl.elements.table.DefaultFlexiTableDataModel; import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableColumnModel; import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableDataModelFactory; import org.olat.core.gui.components.form.flexible.impl.elements.table.SelectionEvent; -import org.olat.core.gui.components.form.flexible.impl.elements.table.StaticFlexiCellRenderer; import org.olat.core.gui.components.link.Link; +import org.olat.core.gui.control.ChiefController; import org.olat.core.gui.control.Controller; import org.olat.core.gui.control.Event; +import org.olat.core.gui.control.ScreenMode; import org.olat.core.gui.control.WindowControl; import org.olat.core.gui.control.generic.closablewrapper.CloseableModalController; import org.olat.core.gui.control.generic.modal.DialogBoxController; import org.olat.core.gui.control.generic.modal.DialogBoxUIFactory; import org.olat.core.util.CodeHelper; +import org.olat.core.util.FileUtils; import org.olat.core.util.io.SystemFileFilter; import org.olat.core.util.vfs.VFSConstants; import org.olat.core.util.vfs.VFSContainer; import org.olat.core.util.vfs.VFSItem; -import org.olat.core.util.vfs.VFSManager; +import org.olat.core.util.vfs.VFSLeaf; import org.olat.course.nodes.GTACourseNode; import org.olat.course.nodes.gta.GTAManager; import org.olat.course.nodes.gta.Task; +import org.olat.course.nodes.gta.ui.component.ModeCellRenderer; import org.olat.course.nodes.gta.ui.events.SubmitEvent; import org.olat.course.run.environment.CourseEnvironment; import org.olat.modules.ModuleConfiguration; @@ -87,7 +95,8 @@ class SubmitDocumentsController extends FormBasicController { private DocumentUploadController uploadCtrl, replaceCtrl; private DialogBoxController confirmDeleteCtrl; private SinglePageController viewDocCtrl; - private HTMLEditorController newDocumentEditorCtrl, editDocumentEditorCtrl; + private EditHTMLController editHtmlCtrl; + private VFSLeafEditorController vfsLeafEditorCtrl; private final int maxDocs; private final String docI18nKey; @@ -107,7 +116,7 @@ class SubmitDocumentsController extends FormBasicController { @Autowired private UserManager userManager; @Autowired - private VFSRepositoryService vfsRepositoryService; + private VFSRepositoryService vfsService; public SubmitDocumentsController(UserRequest ureq, WindowControl wControl, Task assignedTask, File documentsDir, VFSContainer documentsContainer, int maxDocs, GTACourseNode cNode, @@ -159,12 +168,12 @@ class SubmitDocumentsController extends FormBasicController { columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(docI18nKey, DocCols.document.ordinal())); columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(DocCols.date.i18nKey(), DocCols.date.ordinal())); columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(DocCols.uploadedBy.i18nKey(), DocCols.uploadedBy.ordinal())); + + String openI18n = readOnly? "table.header.view": "table.header.edit"; + columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(openI18n, DocCols.mode.ordinal(), "open", new ModeCellRenderer("open"))); if(!readOnly) { - columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel("edit", DocCols.edit.ordinal(), "edit", - new BooleanCellRenderer( - new StaticFlexiCellRenderer(translate("edit"), "edit"), - new StaticFlexiCellRenderer(translate("replace"), "edit")))); - columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel("delete", translate("delete"), "delete")); + columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel("table.header.metadata", translate("table.header.metadata"), "metadata")); + columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel("table.header.delete", translate("table.header.delete"), "delete")); } model = new DocumentTableModel(columnsModel); @@ -185,6 +194,8 @@ class SubmitDocumentsController extends FormBasicController { for(File document:documents) { String filename = document.getName(); String uploadedBy = null; + Mode openMode = null; + VFSItem item = documentsContainer.resolve(filename); if(item.canMeta() == VFSConstants.YES) { VFSMetadata metaInfo = item.getMetaInfo(); @@ -200,7 +211,12 @@ class SubmitDocumentsController extends FormBasicController { } else { download = uifactory.addDownloadLink("view-" + CodeHelper.getRAMUniqueID(), filename, null, document, tableEl); } - docList.add(new SubmittedSolution(document, uploadedBy, download)); + + if(item instanceof VFSLeaf) { + VFSLeaf vfsLeaf = (VFSLeaf)item; + openMode = getOpenMode(vfsLeaf); + } + docList.add(new SubmittedSolution(document, uploadedBy, download, openMode)); } model.setObjects(docList); tableEl.reset(); @@ -227,6 +243,21 @@ class SubmitDocumentsController extends FormBasicController { flc.contextPut("hasDocuments", Boolean.valueOf(hasUploadDocuments())); } + private Mode getOpenMode(VFSLeaf vfsLeaf) { + if (FileUtils.getFileSuffix(vfsLeaf.getName()).equals("html")) { + if (!readOnly) { + return Mode.EDIT; + } + return Mode.VIEW; + } + if (!readOnly && vfsService.hasEditor(vfsLeaf, Mode.EDIT)) { + return Mode.EDIT; + } else if (vfsService.hasEditor(vfsLeaf, Mode.VIEW)) { + return Mode.VIEW; + } + return null; + } + @Override protected void doDispose() { // @@ -268,28 +299,29 @@ class SubmitDocumentsController extends FormBasicController { String filename = newDocCtrl.getFilename(); cmc.deactivate(); cleanUp(); - if(event == Event.DONE_EVENT) { - doCreateDocumentEditor(ureq, filename); + fireEvent(ureq, new SubmitEvent(SubmitEvent.CREATE, filename)); + gtaManager.markNews(courseEnv, gtaNode); + doOpen(ureq, filename, EDIT); updateModel(); } checkDeadline(ureq); - } else if(newDocumentEditorCtrl == source) { + } else if(editHtmlCtrl == source) { if(event == Event.DONE_EVENT) { - updateModel(); - fireEvent(ureq, new SubmitEvent(SubmitEvent.CREATE, newDocumentEditorCtrl.getFilename())); + fireEvent(ureq, new SubmitEvent(SubmitEvent.UPDATE, editHtmlCtrl.getVfsLeaf().getName())); gtaManager.markNews(courseEnv, gtaNode); } - cmc.deactivate(); + updateModel(); + doCloseFullscreen(); cleanUp(); checkDeadline(ureq); - } else if(editDocumentEditorCtrl == source) { + } else if (source == vfsLeafEditorCtrl) { if(event == Event.DONE_EVENT) { - updateModel(); - fireEvent(ureq, new SubmitEvent(SubmitEvent.UPDATE, editDocumentEditorCtrl.getFilename())); + fireEvent(ureq, new SubmitEvent(SubmitEvent.UPDATE, vfsLeafEditorCtrl.getVfsLeaf().getName())); gtaManager.markNews(courseEnv, gtaNode); } - cmc.deactivate(); + updateModel(); + doCloseFullscreen(); cleanUp(); checkDeadline(ureq); } else if(cmc == source) { @@ -299,19 +331,28 @@ class SubmitDocumentsController extends FormBasicController { } private void cleanUp() { - removeAsListenerAndDispose(newDocumentEditorCtrl); removeAsListenerAndDispose(confirmDeleteCtrl); + removeAsListenerAndDispose(vfsLeafEditorCtrl); + removeAsListenerAndDispose(editHtmlCtrl); removeAsListenerAndDispose(viewDocCtrl); removeAsListenerAndDispose(uploadCtrl); removeAsListenerAndDispose(newDocCtrl); removeAsListenerAndDispose(cmc); - newDocumentEditorCtrl = null; confirmDeleteCtrl = null; + vfsLeafEditorCtrl = null; + editHtmlCtrl = null; viewDocCtrl = null; uploadCtrl = null; newDocCtrl = null; cmc = null; } + + private void doCloseFullscreen() { + getWindowControl().pop(); + String businessPath = getWindowControl().getBusinessControl().getAsString(); + getWindowControl().getWindowBackOffice().getChiefController().getScreenMode().setMode(ScreenMode.Mode.standard, businessPath); + cleanUp(); + } @Override protected void formOK(UserRequest ureq) { @@ -326,7 +367,7 @@ class SubmitDocumentsController extends FormBasicController { } } else if(createDocButton == source) { if(checkOpen(ureq) && checkDeadline(ureq)) { - doChooseFilename(ureq); + doCreateDocument(ureq); } } else if(tableEl == source) { if(checkOpen(ureq) && checkDeadline(ureq) && event instanceof SelectionEvent) { @@ -334,8 +375,12 @@ class SubmitDocumentsController extends FormBasicController { SubmittedSolution row = model.getObject(se.getIndex()); if("delete".equals(se.getCommand())) { doConfirmDelete(ureq, row); - } else if("edit".equals(se.getCommand())) { - doEdit(ureq, row); + } else if("open".equals(se.getCommand())) { + String filename = row.getFile().getName(); + Mode mode = row.getMode(); + doOpen(ureq, filename, mode); + } else if("metadata".equals(se.getCommand())) { + doReplaceDocument(ureq, row); } } } else if(source instanceof FormLink) { @@ -387,11 +432,47 @@ class SubmitDocumentsController extends FormBasicController { updateModel(); } - private void doEdit(UserRequest ureq, SubmittedSolution row) { - if(row.getFile().getName().endsWith(".html")) { - doEditDocumentEditor(ureq, row); + private void doOpen(UserRequest ureq, String filename, Mode mode) { + if(filename.endsWith(".html")) { + doEditHtml(ureq, filename); + } else { + doEditVfsEditor(ureq, filename, mode); + } + } + + @SuppressWarnings("deprecation") + private void doEditHtml(UserRequest ureq, String filename) { + VFSItem htmlDocument = documentsContainer.resolve(filename); + if(htmlDocument == null || !(htmlDocument instanceof VFSLeaf)) { + showError("error.missing.file"); } else { - doReplaceDocument(ureq, row); + editHtmlCtrl = new EditHTMLController(ureq, getWindowControl(), documentsContainer, + (VFSLeaf) htmlDocument, null, readOnly); + listenTo(editHtmlCtrl); + + ChiefController cc = getWindowControl().getWindowBackOffice().getChiefController(); + String businessPath = editHtmlCtrl.getWindowControlForDebug().getBusinessControl().getAsString(); + cc.getScreenMode().setMode(ScreenMode.Mode.full, businessPath); + getWindowControl().pushToMainArea(editHtmlCtrl.getInitialComponent()); + } + } + + @SuppressWarnings("deprecation") + private void doEditVfsEditor(UserRequest ureq, String filename, Mode mode) { + VFSItem vfsItem = documentsContainer.resolve(filename); + if(vfsItem == null || !(vfsItem instanceof VFSLeaf)) { + showError("error.missing.file"); + } else { + VFSLeafEditorSecurityCallback secCallback = VFSLeafEditorSecurityCallbackBuilder.builder() + .withMode(mode) + .build(); + vfsLeafEditorCtrl = new VFSLeafEditorController(ureq, getWindowControl(), (VFSLeaf)vfsItem, null, secCallback); + listenTo(vfsLeafEditorCtrl); + + ChiefController cc = getWindowControl().getWindowBackOffice().getChiefController(); + String businessPath = vfsLeafEditorCtrl.getWindowControlForDebug().getBusinessControl().getAsString(); + cc.getScreenMode().setMode(ScreenMode.Mode.full, businessPath); + getWindowControl().pushToMainArea(vfsLeafEditorCtrl.getInitialComponent()); } } @@ -422,7 +503,7 @@ class SubmitDocumentsController extends FormBasicController { if(downloadedFile != null && downloadedFile.canMeta() == VFSConstants.YES) { VFSMetadata metadata = downloadedFile.getMetaInfo(); metadata.setAuthor(ureq.getIdentity()); - vfsRepositoryService.updateMetadata(metadata); + vfsService.updateMetadata(metadata); } } catch (IOException e) { logError("", e); @@ -447,13 +528,13 @@ class SubmitDocumentsController extends FormBasicController { } } - private void doChooseFilename(UserRequest ureq) { + private void doCreateDocument(UserRequest ureq) { if(newDocCtrl != null) return; if(maxDocs > 0 && maxDocs <= model.getRowCount()) { showWarning("error.max.documents"); } else { - newDocCtrl = new NewDocumentController(ureq, getWindowControl(), documentsContainer); + newDocCtrl = new NewDocumentController(ureq, getWindowControl(), documentsContainer, htmlOffice()); listenTo(newDocCtrl); cmc = new CloseableModalController(getWindowControl(), "close", newDocCtrl.getInitialComponent()); @@ -462,59 +543,25 @@ class SubmitDocumentsController extends FormBasicController { } } - private void doCreateDocumentEditor(UserRequest ureq, String documentName) { - if(newDocumentEditorCtrl != null) return; - - if(maxDocs > 0 && maxDocs <= model.getRowCount()) { - showWarning("error.max.documents"); - } else { - VFSItem item = documentsContainer.resolve(documentName); - if(item == null) { - documentsContainer.createChildLeaf(documentName); - } else { - documentName = VFSManager.rename(documentsContainer, documentName); - documentsContainer.createChildLeaf(documentName); - } - // add missing identity in meta info - item = documentsContainer.resolve(documentName); - if(item != null && item.canMeta() == VFSConstants.YES) { - VFSMetadata metadata = item.getMetaInfo(); - metadata.setAuthor(ureq.getIdentity()); - vfsRepositoryService.updateMetadata(metadata); - } - - newDocumentEditorCtrl = WysiwygFactory.createWysiwygController(ureq, getWindowControl(), - documentsContainer, documentName, "media", true, true); - newDocumentEditorCtrl.getRichTextConfiguration().disableMedia(); - newDocumentEditorCtrl.getRichTextConfiguration().setAllowCustomMediaFactory(false); - newDocumentEditorCtrl.setNewFile(true); - listenTo(newDocumentEditorCtrl); - - cmc = new CloseableModalController(getWindowControl(), "close", newDocumentEditorCtrl.getInitialComponent()); - listenTo(cmc); - cmc.activate(); + private FileTypes htmlOffice() { + Builder builder = FileTypes.builder(getLocale()); + if (vfsService.hasEditor("html", EDIT)) { + builder.addHtml(); } - } - - private void doEditDocumentEditor(UserRequest ureq, SubmittedSolution row) { - String documentName = row.getFile().getName(); - - editDocumentEditorCtrl = WysiwygFactory.createWysiwygController(ureq, getWindowControl(), - documentsContainer, documentName, "media", true, true); - editDocumentEditorCtrl.getRichTextConfiguration().disableMedia(); - editDocumentEditorCtrl.getRichTextConfiguration().setAllowCustomMediaFactory(false); - listenTo(editDocumentEditorCtrl); - - cmc = new CloseableModalController(getWindowControl(), "close", editDocumentEditorCtrl.getInitialComponent()); - listenTo(cmc); - cmc.activate(); + if (vfsService.hasEditor("docx", EDIT)) { + builder.addDocx(); + } + if (vfsService.hasEditor("xlsx", EDIT)) { + builder.addXlsx(); + } + return builder.build(); } public enum DocCols { document("document"), date("document.date"), uploadedBy("table.header.uploaded.by"), - edit("edit"); + mode("edit"); private final String i18nKey; @@ -532,11 +579,13 @@ class SubmitDocumentsController extends FormBasicController { private final File file; private final String uploadedBy; private final FormItem downloadLink; + private final Mode mode; - public SubmittedSolution(File file, String uploadedBy, FormItem downloadLink) { + public SubmittedSolution(File file, String uploadedBy, FormItem downloadLink, Mode mode) { this.file = file; this.uploadedBy = uploadedBy; this.downloadLink = downloadLink; + this.mode = mode; } public File getFile() { @@ -550,6 +599,11 @@ class SubmitDocumentsController extends FormBasicController { public FormItem getDownloadLink() { return downloadLink; } + + public Mode getMode() { + return mode; + } + } private static class DocumentTableModel extends DefaultFlexiTableDataModel<SubmittedSolution> { @@ -574,7 +628,7 @@ class SubmitDocumentsController extends FormBasicController { return cal.getTime(); } case uploadedBy: return solution.getUploadedBy(); - case edit: return solution.getFile().getName().endsWith(".html"); + case mode: return solution.getMode(); default: return "ERROR"; } }