diff --git a/src/main/java/org/olat/core/commons/services/notifications/_spring/notificationsContext.xml b/src/main/java/org/olat/core/commons/services/notifications/_spring/notificationsContext.xml index 3eeefcd69a1fe89539b3235b3ef5cce9d201a7ed..0faef9070fa566c574ef348867e9be6559ff7d27 100644 --- a/src/main/java/org/olat/core/commons/services/notifications/_spring/notificationsContext.xml +++ b/src/main/java/org/olat/core/commons/services/notifications/_spring/notificationsContext.xml @@ -8,7 +8,6 @@ <!-- List of notifications handlers --> <bean id="org.olat.modules.fo.ForumNotificationsHandler" class="org.olat.modules.fo.ForumNotificationsHandler" /> <bean id="org.olat.core.commons.modules.bc.FolderNotificationsHandler" class="org.olat.core.commons.modules.bc.notifications.FolderNotificationsHandler" /> - <bean id="org.olat.modules.dialog.FileUploadNotificationHandler" class="org.olat.modules.dialog.FileUploadNotificationHandler" /> <bean id="org.olat.course.nodes.ta.DropboxFileUploadNotificationHandler" class="org.olat.course.nodes.ta.DropboxFileUploadNotificationHandler" /> <bean id="org.olat.course.nodes.ta.ReturnboxFileUploadNotificationHandler" class="org.olat.course.nodes.ta.ReturnboxFileUploadNotificationHandler"/> <bean id="org.olat.course.nodes.ta.SolutionFileUploadNotificationHandler" class="org.olat.course.nodes.ta.SolutionFileUploadNotificationHandler"/> diff --git a/src/main/java/org/olat/core/util/vfs/version/VersionsFileManager.java b/src/main/java/org/olat/core/util/vfs/version/VersionsFileManager.java index 56197c8f54273dbfc6bd49764f2687a6ff7f83b7..cb9c5bd90870dbd82274d574813c19be5161a46d 100644 --- a/src/main/java/org/olat/core/util/vfs/version/VersionsFileManager.java +++ b/src/main/java/org/olat/core/util/vfs/version/VersionsFileManager.java @@ -751,11 +751,15 @@ public class VersionsFileManager extends VersionsManager implements Initializabl protected VFSContainer getCanonicalVersionFolder(VFSContainer container, boolean create) { String relPath = getRelPath(container); - File fVersion = new File(getRootVersionsFile(), relPath); - if (fVersion.exists()) { return new LocalFolderImpl(fVersion); } - if (create) { - fVersion.mkdirs(); - return new LocalFolderImpl(fVersion); + if(relPath != null) { + File fVersion = new File(getRootVersionsFile(), relPath); + if (fVersion.exists()) { + return new LocalFolderImpl(fVersion); + } + if (create) { + fVersion.mkdirs(); + return new LocalFolderImpl(fVersion); + } } return null; } diff --git a/src/main/java/org/olat/course/nodes/DialogCourseNode.java b/src/main/java/org/olat/course/nodes/DialogCourseNode.java index 6808044cc6291f91694701585603a8a250b5bf69..60863ee013cb66b5a2cd3899e872e7c247aa4288 100644 --- a/src/main/java/org/olat/course/nodes/DialogCourseNode.java +++ b/src/main/java/org/olat/course/nodes/DialogCourseNode.java @@ -31,6 +31,7 @@ import java.util.List; import java.util.Locale; import java.util.zip.ZipOutputStream; +import org.olat.core.CoreSpringFactory; import org.olat.core.commons.modules.bc.vfs.OlatRootFolderImpl; import org.olat.core.commons.services.notifications.NotificationsManager; import org.olat.core.commons.services.notifications.SubscriptionContext; @@ -55,27 +56,22 @@ import org.olat.course.editor.CourseEditorEnv; import org.olat.course.editor.NodeEditController; import org.olat.course.editor.StatusDescription; import org.olat.course.export.CourseEnvironmentMapper; -import org.olat.course.nodes.dialog.DialogConfigForm; -import org.olat.course.nodes.dialog.DialogCourseNodeEditController; -import org.olat.course.nodes.dialog.DialogCourseNodeRunController; +import org.olat.course.nodes.dialog.DialogElement; +import org.olat.course.nodes.dialog.DialogElementsManager; +import org.olat.course.nodes.dialog.ui.DialogConfigForm; +import org.olat.course.nodes.dialog.ui.DialogCourseNodeEditController; +import org.olat.course.nodes.dialog.ui.DialogCourseNodeRunController; import org.olat.course.run.navigation.NodeRunConstructionResult; import org.olat.course.run.userview.NodeEvaluation; import org.olat.course.run.userview.UserCourseEnvironment; import org.olat.modules.ModuleConfiguration; -import org.olat.modules.dialog.DialogElement; -import org.olat.modules.dialog.DialogElementsPropertyManager; -import org.olat.modules.dialog.DialogPropertyElements; import org.olat.modules.fo.archiver.ForumArchiveManager; import org.olat.modules.fo.archiver.formatters.ForumFormatter; import org.olat.modules.fo.archiver.formatters.ForumRTFFormatter; import org.olat.modules.fo.archiver.formatters.ForumStreamedRTFFormatter; -import org.olat.modules.fo.manager.ForumManager; import org.olat.repository.RepositoryEntry; /** - * Description:<br> - * TODO: guido Class Description for DialogCourseNode - * <P> * Initial Date: 02.11.2005 <br> * * @author Guido Schnider @@ -98,8 +94,7 @@ public class DialogCourseNode extends AbstractAccessableCourseNode { @Override public TabbableController createEditController(UserRequest ureq, WindowControl wControl, BreadcrumbPanel stackPanel, ICourse course, UserCourseEnvironment euce) { updateModuleConfigDefaults(false); - DialogCourseNodeEditController childTabCntrllr = new DialogCourseNodeEditController(ureq, wControl, this, - course, euce); + DialogCourseNodeEditController childTabCntrllr = new DialogCourseNodeEditController(ureq, wControl, this, course, euce); CourseNode chosenNode = course.getEditorTreeModel().getCourseNode(euce.getCourseEditorEnv().getCurrentCourseNodeId()); return new NodeEditController(ureq, wControl, course.getEditorTreeModel(), course, chosenNode, euce, childTabCntrllr); } @@ -110,10 +105,10 @@ public class DialogCourseNode extends AbstractAccessableCourseNode { * org.olat.course.run.userview.UserCourseEnvironment, * org.olat.course.run.userview.NodeEvaluation, java.lang.String) */ + @Override public NodeRunConstructionResult createNodeRunConstructionResult(UserRequest ureq, WindowControl wControl, UserCourseEnvironment userCourseEnv, NodeEvaluation ne, String nodecmd) { - //FIXME:gs:a nodecmd has now the subsubId in it -> pass to DialogCourseNodeRunController below - DialogCourseNodeRunController ctrl = new DialogCourseNodeRunController(ureq, userCourseEnv, wControl, this, ne); + DialogCourseNodeRunController ctrl = new DialogCourseNodeRunController(ureq, wControl, this, userCourseEnv, ne); Controller wrappedCtrl = TitledWrapperHelper.getWrapper(ureq, wControl, ctrl, this, "o_dialog_icon"); return new NodeRunConstructionResult(wrappedCtrl); } @@ -203,23 +198,15 @@ public class DialogCourseNode extends AbstractAccessableCourseNode { public void cleanupOnDelete(ICourse course) { super.cleanupOnDelete(course); - DialogElementsPropertyManager depm = DialogElementsPropertyManager.getInstance(); - - //remove all possible forum subscriptions - DialogPropertyElements findDialogElements = depm.findDialogElements(course.getResourceableId(), getIdent()); - if(findDialogElements != null){ - List<DialogElement> dialogElments = findDialogElements.getDialogPropertyElements(); - for (DialogElement dialogElement : dialogElments) { - Long forumKey = dialogElement.getForumKey(); - SubscriptionContext subsContext = CourseModule.createSubscriptionContext(course.getCourseEnvironment(), this, forumKey.toString()); - NotificationsManager.getInstance().delete(subsContext); - //also delete forum -> was archived in archiveNodeData step - ForumManager.getInstance().deleteForum(forumKey); - } + DialogElementsManager depm = CoreSpringFactory.getImpl(DialogElementsManager.class); + RepositoryEntry entry = course.getCourseEnvironment().getCourseGroupManager().getCourseEntry(); + List<DialogElement> dialogElements = depm.getDialogElements(entry, getIdent()); + for (DialogElement dialogElement : dialogElements) { + Long forumKey = dialogElement.getForum().getKey(); + SubscriptionContext subsContext = CourseModule.createSubscriptionContext(course.getCourseEnvironment(), this, forumKey.toString()); + NotificationsManager.getInstance().delete(subsContext); + depm.deleteDialogElement(dialogElement); } - - //delete property - depm.deleteProperty(course.getResourceableId(), this.getIdent()); } /** @@ -228,13 +215,14 @@ public class DialogCourseNode extends AbstractAccessableCourseNode { * @param exportDirectory */ public void doArchiveElement(DialogElement element, File exportDirectory, Locale locale) { - VFSContainer forumContainer = getForumContainer(element.getForumKey()); + DialogElementsManager depm = CoreSpringFactory.getImpl(DialogElementsManager.class); + VFSContainer dialogContainer = depm.getDialogContainer(element); //there is only one file (leave) in the top forum container - VFSItem dialogFile = forumContainer.getItems(new VFSLeafFilter()).get(0); + VFSItem dialogFile = dialogContainer.getItems(new VFSLeafFilter()).get(0); VFSContainer exportContainer = new LocalFolderImpl(exportDirectory); // append export timestamp to avoid overwriting previous export - String exportDirName = Formatter.makeStringFilesystemSave(getShortTitle())+"_"+element.getForumKey()+"_"+Formatter.formatDatetimeFilesystemSave(new Date(System.currentTimeMillis())); + String exportDirName = Formatter.makeStringFilesystemSave(getShortTitle())+"_"+element.getForum().getKey()+"_"+Formatter.formatDatetimeFilesystemSave(new Date(System.currentTimeMillis())); VFSContainer diaNodeElemExportContainer = exportContainer.createChildContainer(exportDirName); // don't check quota diaNodeElemExportContainer.setLocalSecurityCallback(new FullAccessCallback()); @@ -242,15 +230,15 @@ public class DialogCourseNode extends AbstractAccessableCourseNode { ForumArchiveManager fam = ForumArchiveManager.getInstance(); ForumFormatter ff = new ForumRTFFormatter(diaNodeElemExportContainer, false, locale); - fam.applyFormatter(ff, element.getForumKey(), null); + fam.applyFormatter(ff, element.getForum().getKey(), null); } @Override public boolean archiveNodeData(Locale locale, ICourse course, ArchiveOptions options, ZipOutputStream exportStream, String charset) { boolean dataFound = false; - List<DialogElement> list = DialogElementsPropertyManager.getInstance() - .findDialogElements(course.getCourseEnvironment().getCoursePropertyManager(), this) - .getDialogPropertyElements(); + RepositoryEntry entry = course.getCourseEnvironment().getCourseGroupManager().getCourseEntry(); + List<DialogElement> list = CoreSpringFactory.getImpl(DialogElementsManager.class) + .getDialogElements(entry, getIdent()); if(list.size() > 0) { for (DialogElement element:list) { doArchiveElement(element, exportStream, locale); @@ -266,19 +254,19 @@ public class DialogCourseNode extends AbstractAccessableCourseNode { * @param exportDirectory */ public void doArchiveElement(DialogElement element, ZipOutputStream exportStream, Locale locale) { - // append export timestamp to avoid overwriting previous export + DialogElementsManager depm = CoreSpringFactory.getImpl(DialogElementsManager.class); String exportDirName = Formatter.makeStringFilesystemSave(getShortTitle()) - + "_" + element.getForumKey() - + "_" + Formatter.formatDatetimeFilesystemSave(new Date(System.currentTimeMillis())); + + "_" + element.getForum().getKey() + + "_" + Formatter.formatDatetimeFilesystemSave(new Date()); - VFSContainer forumContainer = getForumContainer(element.getForumKey()); + VFSContainer forumContainer = depm.getDialogContainer(element); for(VFSItem item: forumContainer.getItems(new VFSLeafFilter())) { ZipUtil.addToZip(item, exportDirName, exportStream); } ForumArchiveManager fam = ForumArchiveManager.getInstance(); ForumFormatter ff = new ForumStreamedRTFFormatter(exportStream, exportDirName, false, locale); - fam.applyFormatter(ff, element.getForumKey(), null); + fam.applyFormatter(ff, element.getForum().getKey(), null); } @Override diff --git a/src/main/java/org/olat/course/nodes/dialog/DialogCourseNodeEditController.java b/src/main/java/org/olat/course/nodes/dialog/DialogCourseNodeEditController.java deleted file mode 100644 index 2e0733846096d9915cff36d429b63ec39e4c0c21..0000000000000000000000000000000000000000 --- a/src/main/java/org/olat/course/nodes/dialog/DialogCourseNodeEditController.java +++ /dev/null @@ -1,293 +0,0 @@ -/** -* OLAT - Online Learning and Training<br> -* http://www.olat.org -* <p> -* Licensed under the Apache License, Version 2.0 (the "License"); <br> -* you may not use this file except in compliance with the License.<br> -* You may obtain a copy of the License at -* <p> -* http://www.apache.org/licenses/LICENSE-2.0 -* <p> -* Unless required by applicable law or agreed to in writing,<br> -* software distributed under the License is distributed on an "AS IS" BASIS, <br> -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> -* See the License for the specific language governing permissions and <br> -* limitations under the License. -* <p> -* Copyright (c) since 2004 at Multimedia- & E-Learning Services (MELS),<br> -* University of Zurich, Switzerland. -* <hr> -* <a href="http://www.openolat.org"> -* OpenOLAT - Online Learning and Training</a><br> -* This file has been modified by the OpenOLAT community. Changes are licensed -* under the Apache 2.0 license as the original file. -*/ - -package org.olat.course.nodes.dialog; - -import java.util.ArrayList; -import java.util.Date; -import java.util.List; - -import org.olat.core.commons.modules.bc.FileUploadController; -import org.olat.core.commons.modules.bc.FolderConfig; -import org.olat.core.commons.modules.bc.FolderEvent; -import org.olat.core.commons.modules.bc.vfs.OlatRootFolderImpl; -import org.olat.core.gui.UserRequest; -import org.olat.core.gui.components.Component; -import org.olat.core.gui.components.link.Link; -import org.olat.core.gui.components.link.LinkFactory; -import org.olat.core.gui.components.tabbedpane.TabbedPane; -import org.olat.core.gui.components.table.TableController; -import org.olat.core.gui.components.table.TableGuiConfiguration; -import org.olat.core.gui.components.velocity.VelocityContainer; -import org.olat.core.gui.control.Controller; -import org.olat.core.gui.control.ControllerEventListener; -import org.olat.core.gui.control.Event; -import org.olat.core.gui.control.WindowControl; -import org.olat.core.gui.control.generic.tabbable.ActivateableTabbableDefaultController; -import org.olat.core.gui.translator.Translator; -import org.olat.core.logging.activity.CourseLoggingAction; -import org.olat.core.logging.activity.ThreadLocalUserActivityLogger; -import org.olat.core.util.Util; -import org.olat.core.util.vfs.Quota; -import org.olat.course.ICourse; -import org.olat.course.assessment.AssessmentHelper; -import org.olat.course.condition.Condition; -import org.olat.course.condition.ConditionEditController; -import org.olat.course.editor.NodeEditController; -import org.olat.course.nodes.BCCourseNode; -import org.olat.course.nodes.DialogCourseNode; -import org.olat.course.run.userview.UserCourseEnvironment; -import org.olat.course.tree.CourseEditorTreeModel; -import org.olat.modules.dialog.DialogElement; -import org.olat.modules.dialog.DialogElementsController; -import org.olat.modules.dialog.DialogElementsPropertyManager; -import org.olat.modules.dialog.DialogElementsTableModel; -import org.olat.modules.dialog.DialogPropertyElements; -import org.olat.modules.fo.Forum; -import org.olat.modules.fo.manager.ForumManager; -import org.olat.util.logging.activity.LoggingResourceable; - -/** - * Description:<br> - * controller for the tabbed pane inside the course editor for the course node 'dialog elements' - * <P> - * Initial Date: 02.11.2005 <br> - * - * @author guido - */ -public class DialogCourseNodeEditController extends ActivateableTabbableDefaultController implements ControllerEventListener { - - private static final String PANE_TAB_DIALOGCONFIG = "pane.tab.dialogconfig"; - private static final String PANE_TAB_ACCESSIBILITY = "pane.tab.accessibility"; - - private static final String[] paneKeys = { PANE_TAB_DIALOGCONFIG, PANE_TAB_ACCESSIBILITY }; - - private VelocityContainer content, accessContent; - private DialogCourseNode courseNode; - private ConditionEditController readerCondContr, posterCondContr, moderatorCondContr; - private TabbedPane myTabbedPane; - private BCCourseNode bcNode = new BCCourseNode(); - private ICourse course; - private DialogConfigForm configForumLaunch; - private TableController tableCtr; - private Translator resourceTrans; - private FileUploadController fileUplCtr; - private DialogElement recentElement; - private TableGuiConfiguration tableConf; - private Link uploadButton; - - public DialogCourseNodeEditController(UserRequest ureq, WindowControl wControl, DialogCourseNode node, - ICourse course, UserCourseEnvironment userCourseEnv) { - super(ureq,wControl); - //o_clusterOk by guido: save to hold reference to course inside editor - this.course = course; - this.courseNode = node; - - resourceTrans = Util.createPackageTranslator(DialogElementsTableModel.class, ureq.getLocale(), getTranslator()); - // set name of the folder we use - bcNode.setShortTitle(translate("dialog.folder.name")); - - // dialog specific config tab - content = createVelocityContainer("edit"); - uploadButton = LinkFactory.createButton("dialog.upload.file", content, this); - uploadButton.setElementCssClass("o_sel_dialog_upload"); - - //configure table - tableConf = new TableGuiConfiguration(); - tableConf.setResultsPerPage(10); - showOverviewTable(ureq); - - initConfigForm(ureq); - - // accessability config tab - accessContent = createVelocityContainer("edit_access"); - - CourseEditorTreeModel editorModel = course.getEditorTreeModel(); - // Reader precondition - Condition readerCondition = courseNode.getPreConditionReader(); - // TODO:gs:a getAssessableNodes ist der dialog node assessable oder nicht? - readerCondContr = new ConditionEditController(ureq, getWindowControl(), userCourseEnv, readerCondition, - AssessmentHelper.getAssessableNodes(editorModel, courseNode)); - listenTo(readerCondContr); - accessContent.put("readerCondition", readerCondContr.getInitialComponent()); - - // Poster precondition - Condition posterCondition = courseNode.getPreConditionPoster(); - posterCondContr = new ConditionEditController(ureq, getWindowControl(), userCourseEnv, posterCondition, - AssessmentHelper.getAssessableNodes(editorModel, courseNode)); - this.listenTo(posterCondContr); - accessContent.put("posterCondition", posterCondContr.getInitialComponent()); - - // Moderator precondition - Condition moderatorCondition = courseNode.getPreConditionModerator(); - moderatorCondContr = new ConditionEditController(ureq, getWindowControl(), userCourseEnv, moderatorCondition, - AssessmentHelper.getAssessableNodes(editorModel, courseNode)); - //FIXME:gs: why is firing needed here? - fireEvent(ureq, NodeEditController.NODECONFIG_CHANGED_EVENT); - listenTo(moderatorCondContr); - accessContent.put("moderatorCondition", moderatorCondContr.getInitialComponent()); - } - - private void initConfigForm(UserRequest ureq) { - - removeAsListenerAndDispose(configForumLaunch); - configForumLaunch = new DialogConfigForm(ureq, getWindowControl(), courseNode.getModuleConfiguration()); - listenTo(configForumLaunch); - - content.put("showForumAsPopupConfigForm", configForumLaunch.getInitialComponent()); - } - - - /** - * @see org.olat.core.gui.control.generic.tabbable.ActivateableTabbableDefaultController#getPaneKeys() - */ - public String[] getPaneKeys() { - return paneKeys; - } - - /** - * @see org.olat.core.gui.control.generic.tabbable.ActivateableTabbableDefaultController#getTabbedPane() - */ - public TabbedPane getTabbedPane() { - return myTabbedPane; - } - - /** - * @see org.olat.core.gui.control.DefaultController#event(org.olat.core.gui.UserRequest, - * org.olat.core.gui.components.Component, org.olat.core.gui.control.Event) - */ - @Override - public void event(UserRequest ureq, Component source, Event event) { - if (source == uploadButton) { - Forum forum = ForumManager.getInstance().addAForum(); - OlatRootFolderImpl forumContainer = DialogElementsController.getForumContainer(forum.getKey()); - - removeAsListenerAndDispose(fileUplCtr); - fileUplCtr = new FileUploadController(getWindowControl(),forumContainer, ureq, - FolderConfig.getLimitULKB(), Quota.UNLIMITED, null, false); - listenTo(fileUplCtr); - - recentElement = new DialogElement(); - recentElement.setForumKey(forum.getKey()); - recentElement.setAuthor(ureq.getIdentity().getName()); - content.contextPut("overview", Boolean.FALSE); - content.put("upload", fileUplCtr.getInitialComponent()); - } - } - - /** - * @see org.olat.core.gui.control.DefaultController#event(org.olat.core.gui.UserRequest, - * org.olat.core.gui.components.Component, org.olat.core.gui.control.Event) - */ - public void event(UserRequest ureq, Controller source, Event event) { - if (source == configForumLaunch) { - if (event == Event.CHANGED_EVENT) { - fireEvent(ureq, NodeEditController.NODECONFIG_CHANGED_EVENT); - } - } else if (source == readerCondContr) { - if (event == Event.CHANGED_EVENT) { - Condition cond = readerCondContr.getCondition(); - courseNode.setPreConditionReader(cond); - fireEvent(ureq, NodeEditController.NODECONFIG_CHANGED_EVENT); - } - } else if (source == posterCondContr) { - if (event == Event.CHANGED_EVENT) { - Condition cond = posterCondContr.getCondition(); - courseNode.setPreConditionPoster(cond); - fireEvent(ureq, NodeEditController.NODECONFIG_CHANGED_EVENT); - } - } else if (source == moderatorCondContr) { - if (event == Event.CHANGED_EVENT) { - Condition cond = moderatorCondContr.getCondition(); - courseNode.setPreConditionModerator(cond); - fireEvent(ureq, NodeEditController.NODECONFIG_CHANGED_EVENT); - } - } else if (source == tableCtr) { - // process table events - } else if (source == fileUplCtr) { - // event. - if (event == Event.DONE_EVENT || event == Event.CANCELLED_EVENT) { - // reset recent element - recentElement = null; - showOverviewTable(ureq); - } else if (event.getCommand().equals(FolderEvent.UPLOAD_EVENT)) { - - // new dialog element - DialogElement element = new DialogElement(); - element.setAuthor(recentElement.getAuthor()); - element.setDate(new Date()); - final String filename = ((FolderEvent) event).getFilename(); - element.setFilename(filename); - element.setForumKey(recentElement.getForumKey()); - element.setFileSize(DialogElementsController.getFileSize(recentElement.getForumKey())); - - // save property - DialogElementsPropertyManager.getInstance().addDialogElement(course.getCourseEnvironment().getCoursePropertyManager(), courseNode, element); - - // do logging - ThreadLocalUserActivityLogger.log(CourseLoggingAction.DIALOG_ELEMENT_FILE_UPLOADED, getClass(), - LoggingResourceable.wrapUploadFile(filename)); - } - } - } -/** - * update table with latest elements - * @param ureq - */ - private void showOverviewTable(UserRequest ureq) { - - removeAsListenerAndDispose(tableCtr); - tableCtr = new TableController(tableConf, ureq, getWindowControl(), resourceTrans); - listenTo(tableCtr); - - DialogPropertyElements elements = DialogElementsPropertyManager.getInstance().findDialogElements(this.course.getCourseEnvironment().getCoursePropertyManager(), courseNode); - List<DialogElement> list = new ArrayList<>(); - DialogElementsTableModel tableModel = new DialogElementsTableModel(getTranslator(), null, null); - if (elements != null) list = elements.getDialogPropertyElements(); - tableModel.setEntries(list); - tableModel.addColumnDescriptors(tableCtr); - tableCtr.setTableDataModel(tableModel); - tableCtr.modelChanged(); - tableCtr.setSortColumn(1, true); - content.contextPut("overview", Boolean.TRUE); - content.put("dialogElementsTable", tableCtr.getInitialComponent()); - } - - /** - * @see org.olat.core.gui.control.DefaultController#doDispose(boolean) - */ - protected void doDispose() { - //child controllers registered with listenTo() get disposed in BasicController - } - - /** - * @see org.olat.core.gui.control.generic.tabbable.TabbableController#addTabs(org.olat.core.gui.components.tabbedpane.TabbedPane) - */ - public void addTabs(TabbedPane tabbedPane) { - tabbedPane.addTab(translate(PANE_TAB_ACCESSIBILITY), accessContent); - tabbedPane.addTab(translate(PANE_TAB_DIALOGCONFIG), content); - } - -} diff --git a/src/main/java/org/olat/course/nodes/dialog/DialogCourseNodeRunController.java b/src/main/java/org/olat/course/nodes/dialog/DialogCourseNodeRunController.java deleted file mode 100644 index 7a67508b891d6cce957be153fea220f708504322..0000000000000000000000000000000000000000 --- a/src/main/java/org/olat/course/nodes/dialog/DialogCourseNodeRunController.java +++ /dev/null @@ -1,76 +0,0 @@ -/** -* OLAT - Online Learning and Training<br> -* http://www.olat.org -* <p> -* Licensed under the Apache License, Version 2.0 (the "License"); <br> -* you may not use this file except in compliance with the License.<br> -* You may obtain a copy of the License at -* <p> -* http://www.apache.org/licenses/LICENSE-2.0 -* <p> -* Unless required by applicable law or agreed to in writing,<br> -* software distributed under the License is distributed on an "AS IS" BASIS, <br> -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> -* See the License for the specific language governing permissions and <br> -* limitations under the License. -* <p> -* Copyright (c) since 2004 at Multimedia- & E-Learning Services (MELS),<br> -* University of Zurich, Switzerland. -* <hr> -* <a href="http://www.openolat.org"> -* OpenOLAT - Online Learning and Training</a><br> -* This file has been modified by the OpenOLAT community. Changes are licensed -* under the Apache 2.0 license as the original file. -*/ - -package org.olat.course.nodes.dialog; - -import org.olat.core.gui.UserRequest; -import org.olat.core.gui.components.Component; -import org.olat.core.gui.control.Controller; -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.course.nodes.DialogCourseNode; -import org.olat.course.run.userview.NodeEvaluation; -import org.olat.course.run.userview.UserCourseEnvironment; -import org.olat.modules.dialog.DialogElementsController; -import org.olat.util.logging.activity.LoggingResourceable; - -/** - * Description:<br> - * chief controller for the run mode of the course node 'dialog elements' - * <P> - * Initial Date: 02.11.2005 <br> - * - * @author guido - */ -public class DialogCourseNodeRunController extends BasicController { - - public DialogCourseNodeRunController(UserRequest ureq, UserCourseEnvironment userCourseEnv, WindowControl wControl, - DialogCourseNode dialogCourseNode, NodeEvaluation ne) { - super(ureq, wControl); - addLoggingResourceable(LoggingResourceable.wrap(dialogCourseNode)); - - Controller dialogCtr = new DialogElementsController(ureq, getWindowControl(), dialogCourseNode, userCourseEnv, ne); - listenTo(dialogCtr); - - putInitialPanel(dialogCtr.getInitialComponent()); - } - - /** - * @see org.olat.core.gui.control.DefaultController#event(org.olat.core.gui.UserRequest, - * org.olat.core.gui.components.Component, org.olat.core.gui.control.Event) - */ - public void event(UserRequest ureq, Component source, Event event) { - // no events yet - } - - /** - * @see org.olat.core.gui.control.DefaultController#doDispose(boolean) - */ - protected void doDispose() { - // child controllers disposed by basic controller - } - -} diff --git a/src/main/java/org/olat/course/nodes/dialog/DialogElement.java b/src/main/java/org/olat/course/nodes/dialog/DialogElement.java new file mode 100644 index 0000000000000000000000000000000000000000..1d3f7d7d77365fe3de22bcdb916544c3970a3e47 --- /dev/null +++ b/src/main/java/org/olat/course/nodes/dialog/DialogElement.java @@ -0,0 +1,52 @@ +/** + * <a href="http://www.openolat.org"> + * OpenOLAT - Online Learning and Training</a><br> + * <p> + * Licensed under the Apache License, Version 2.0 (the "License"); <br> + * you may not use this file except in compliance with the License.<br> + * You may obtain a copy of the License at the + * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a> + * <p> + * Unless required by applicable law or agreed to in writing,<br> + * software distributed under the License is distributed on an "AS IS" BASIS, <br> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> + * See the License for the specific language governing permissions and <br> + * limitations under the License. + * <p> + * Initial code contributed and copyrighted by<br> + * frentix GmbH, http://www.frentix.com + * <p> + */ +package org.olat.course.nodes.dialog; + +import java.util.Date; + +import org.olat.core.id.Identity; +import org.olat.modules.fo.Forum; +import org.olat.repository.RepositoryEntry; + +/** + * + * Initial date: 3 janv. 2018<br> + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + * + */ +public interface DialogElement { + + public Long getKey(); + + public Date getCreationDate(); + + public String getFilename(); + + public Long getSize(); + + public Forum getForum(); + + public Identity getAuthor(); + + public RepositoryEntry getEntry(); + + public String getSubIdent(); + +} diff --git a/src/main/java/org/olat/course/nodes/dialog/DialogElementsManager.java b/src/main/java/org/olat/course/nodes/dialog/DialogElementsManager.java new file mode 100644 index 0000000000000000000000000000000000000000..1062a410951e07c700e01e245db816be93ef0199 --- /dev/null +++ b/src/main/java/org/olat/course/nodes/dialog/DialogElementsManager.java @@ -0,0 +1,53 @@ +/** + * <a href="http://www.openolat.org"> + * OpenOLAT - Online Learning and Training</a><br> + * <p> + * Licensed under the Apache License, Version 2.0 (the "License"); <br> + * you may not use this file except in compliance with the License.<br> + * You may obtain a copy of the License at the + * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a> + * <p> + * Unless required by applicable law or agreed to in writing,<br> + * software distributed under the License is distributed on an "AS IS" BASIS, <br> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> + * See the License for the specific language governing permissions and <br> + * limitations under the License. + * <p> + * Initial code contributed and copyrighted by<br> + * frentix GmbH, http://www.frentix.com + * <p> + */ +package org.olat.course.nodes.dialog; + +import java.util.List; + +import org.olat.core.id.Identity; +import org.olat.core.util.vfs.VFSContainer; +import org.olat.core.util.vfs.VFSLeaf; +import org.olat.repository.RepositoryEntry; +import org.olat.repository.RepositoryEntryRef; + +/** + * + * Initial date: 3 janv. 2018<br> + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + * + */ +public interface DialogElementsManager { + + + public DialogElement createDialogElement(RepositoryEntry entry, Identity identity, String filename, Long size, String subIdent); + + public List<DialogElement> getDialogElements(RepositoryEntryRef entry, String subIdent); + + public DialogElement getDialogElementByForum(Long forumKey); + + public DialogElement getDialogElementByKey(Long elementKey); + + public VFSContainer getDialogContainer(DialogElement element); + + public VFSLeaf getDialogLeaf(DialogElement element); + + public void deleteDialogElement(DialogElement element); + +} diff --git a/src/main/java/org/olat/course/nodes/dialog/_content/edit.html b/src/main/java/org/olat/course/nodes/dialog/_content/edit.html deleted file mode 100644 index e5c945bafcc1ec7b7e329dcfff54df8cee45b39d..0000000000000000000000000000000000000000 --- a/src/main/java/org/olat/course/nodes/dialog/_content/edit.html +++ /dev/null @@ -1,17 +0,0 @@ -<fieldset class="o_sel_dialog_settings_upload"> - <legend>$r.contextHelpWithWrapper("Communication and Collaboration#_dateidiskussion") - $r.translate("folder.info")</legend> - #if ($overview) - $r.render("dialogElementsTable") - <div class="o_button_group"> - $r.render("dialog.upload.file") - </div> - #else - $r.render("upload") - #end -</fieldset> -<fieldset class="o_sel_dialog_settings_forum"> - <legend> - $r.translate("dialog.forum.popup.config.title")</legend> - $r.render("showForumAsPopupConfigForm") -</fieldset> diff --git a/src/main/java/org/olat/course/nodes/dialog/_i18n/LocalStrings_bg.properties b/src/main/java/org/olat/course/nodes/dialog/_i18n/LocalStrings_bg.properties deleted file mode 100644 index 8ab189f43dea8f6ad55f450546b00ba6b37c4013..0000000000000000000000000000000000000000 --- a/src/main/java/org/olat/course/nodes/dialog/_i18n/LocalStrings_bg.properties +++ /dev/null @@ -1,33 +0,0 @@ -#Wed Jul 28 13:33:31 CEST 2010 - - - - - - - - - - -command.closesp=\u0417\u0430\u0442\u0432\u043E\u0440\u0435\u0442\u0435 \u043F\u0440\u043E\u0437\u043E\u0440\u0435\u0446 -command.show=\u041F\u043E\u043A\u0430\u0436\u0435\u0442\u0435 \u0443\u0447\u0435\u0431\u043D\u043E \u0441\u044A\u0434\u044A\u0440\u0436\u0430\u043D\u0438\u0435 -command.showpopup=\u041F\u043E\u043A\u0430\u0436\u0435\u0442\u0435 \u0443\u0447\u0435\u0431\u043D\u043E \u0441\u044A\u0434\u044A\u0440\u0436\u0430\u043D\u0438\u0435 \u0432 \u043D\u043E\u0432 \u043F\u0440\u043E\u0437\u043E\u0440\u0435\u0446 -condition.accessModerator.title=\u041A\u0430\u0447\u0435\u0442\u0435 / \u0438\u0437\u0442\u0435\u0433\u043B\u0435\u0442\u0435 \u0444\u0430\u0439\u043B\u043E\u0432\u0435 / \u043C\u043E\u0434\u0435\u0440\u0438\u0440\u0430\u0439\u0442\u0435 \u0444\u043E\u0440\u0443\u043C -condition.accessPoster.title=\u041A\u0430\u0447\u0435\u0442\u0435 / \u0438\u0437\u0442\u0435\u0433\u043B\u0435\u0442\u0435 \u0444\u0430\u0439\u043B\u043E\u0432\u0435 / \u043F\u0440\u043E\u0447\u0435\u0442\u0435\u0442\u0435/\u043F\u0438\u0448\u0435\u0442\u0435 \u0432\u044A\u0432 \u0444\u043E\u0440\u0443\u043C -condition.accessReader.title=\u0418\u0437\u0442\u0435\u0433\u043B\u0435\u0442\u0435 \u0444\u0430\u0439\u043B\u043E\u0432\u0435 / \u043F\u0440\u043E\u0447\u0435\u0442\u0435\u0442\u0435 \u0444\u043E\u0440\u0443\u043C -condition.accessibility.title=\u0414\u043E\u0441\u0442\u044A\u043F -dialog.ablage.config.title=\u0424\u0430\u0439\u043B\u043E\u0432 \u0434\u0438\u0430\u043B\u043E\u0433 -dialog.folder.name=\u041F\u0430\u043F\u043A\u0430 -dialog.forum.config.title=\u0421\u044A\u0445\u0440\u0430\u043D\u0435\u043D\u0438\u0435 -dialog.forum.popup.config.title=\u0424\u043E\u0440\u0443\u043C -dialog.start=\u041E\u0442\u0432\u043E\u0440\u0435\u0442\u0435 -dialog.upload.file=\u041A\u0430\u0447\u0435\u0442\u0435 \u0444\u0430\u0439\u043B -folder.info=\u0424\u0430\u0439\u043B\u043E\u0432 \u0434\u0438\u0430\u043B\u043E\u0433 -folder.open=\u041E\u0442\u0432\u043E\u0440\u0435\u0442\u0435 \u043F\u0430\u043F\u043A\u0430 - - - - -pane.tab.accessibility=\u0414\u043E\u0441\u0442\u044A\u043F -pane.tab.dialogconfig=\u041A\u043E\u043D\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044F \u043D\u0430 \u0444\u043E\u0440\u0443\u043C/\u0441\u044A\u0445\u0440\u0430\u043D\u0435\u043D\u0438\u0435 -selection.forumAsPopup.label=\u041E\u0442\u0432\u043E\u0440\u0435\u0442\u0435 \u0444\u043E\u0440\u0443\u043C\u0430 \u0432 \u0438\u0437\u043A\u0430\u0447\u0430\u0449 \u043F\u0440\u043E\u0437\u043E\u0440\u0435\u0446? diff --git a/src/main/java/org/olat/course/nodes/dialog/_i18n/LocalStrings_da.properties b/src/main/java/org/olat/course/nodes/dialog/_i18n/LocalStrings_da.properties deleted file mode 100644 index f2815eaa34935eb57815720804860611e1644d24..0000000000000000000000000000000000000000 --- a/src/main/java/org/olat/course/nodes/dialog/_i18n/LocalStrings_da.properties +++ /dev/null @@ -1,33 +0,0 @@ -#Wed Jul 28 13:33:31 CEST 2010 - - - - - - - - - - -command.closesp=Luk vindue -command.show=Vis l\u00E6ringsindhold -command.showpopup=Vis l\u00E6ringsindhold i et nyt vindue -condition.accessModerator.title=Upload / download filer / moderer forum -condition.accessPoster.title=Upload / download filer / l\u00E6s og skriv i forum -condition.accessReader.title=Download filer / l\u00E6s forum -condition.accessibility.title=Adgange -dialog.ablage.config.title=Fildialog -dialog.folder.name=Mappe -dialog.forum.config.title=Gemmemapper -dialog.forum.popup.config.title=Forum -dialog.start=Start -dialog.upload.file=Upload af fil -folder.info=Fildialog -folder.open=Open mappe - - - - -pane.tab.accessibility=Adgange -pane.tab.dialogconfig=Forum/gemme konfiguration -selection.forumAsPopup.label=\u00C5ben forum i et popup vindue? diff --git a/src/main/java/org/olat/course/nodes/dialog/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/course/nodes/dialog/_i18n/LocalStrings_de.properties deleted file mode 100644 index 56069bfaec2ffcb91f2cc0339a416368de392204..0000000000000000000000000000000000000000 --- a/src/main/java/org/olat/course/nodes/dialog/_i18n/LocalStrings_de.properties +++ /dev/null @@ -1,38 +0,0 @@ -#Mon Mar 02 09:54:04 CET 2009 -title_dialog=Dateidiskussion - - - - - - - - - - - - - -command.closesp=Fenster schliessen -command.show=Lerninhalt anzeigen -command.showpopup=Lerninhalt in neuem Fenster anzeigen -condition.accessModerator.title=Up- und Download der Dateien / Moderieren im Forum -condition.accessPoster.title=Up- und Download der Dateien / Lesen und Schreiben im Forum -condition.accessReader.title=Nur Download der Dateien / Nur Lesen im Forum -condition.accessibility.title=Access -dialog.ablage.config.title=Dateidiskussion -dialog.folder.name=Dateiablage -dialog.forum.config.title=Ablage -dialog.forum.popup.config.title=Darstellung -dialog.start=Start -dialog.upload.file=Datei hochladen -folder.info=Dateidiskussion -folder.open=Ablage \u00F6ffen - - - - - -pane.tab.accessibility=Zugang -pane.tab.dialogconfig=Ablage- /Forumskonfiguration -selection.forumAsPopup.label=Forum in Popup-Fenster \u00F6ffnen diff --git a/src/main/java/org/olat/course/nodes/dialog/_i18n/LocalStrings_el.properties b/src/main/java/org/olat/course/nodes/dialog/_i18n/LocalStrings_el.properties deleted file mode 100644 index 4538efd0c370ca108069ae251b696a37958608a4..0000000000000000000000000000000000000000 --- a/src/main/java/org/olat/course/nodes/dialog/_i18n/LocalStrings_el.properties +++ /dev/null @@ -1,36 +0,0 @@ -#Wed Sep 15 12:28:22 CEST 2010 - - - - - - - - - - - -command.closesp=\u039A\u03BB\u03B5\u03AF\u03C3\u03B9\u03BC\u03BF \u03C0\u03B1\u03C1\u03B1\u03B8\u03CD\u03C1\u03BF\u03C5 -command.show=\u03A0\u03C1\u03BF\u03B2\u03BF\u03BB\u03AE \u03C0\u03B5\u03C1\u03B9\u03B5\u03C7\u03CC\u03BC\u03B5\u03BD\u03BF\u03C5 \u03BC\u03AC\u03B8\u03B7\u03C3\u03B7\u03C2 -command.showpopup=\u03A0\u03C1\u03BF\u03B2\u03BF\u03BB\u03AE \u03C0\u03B5\u03C1\u03B9\u03B5\u03C7\u03CC\u03BC\u03B5\u03BD\u03BF\u03C5 \u03BC\u03AC\u03B8\u03B7\u03C3\u03B7\u03C2 \u03C3\u03B5 \u03BD\u03AD\u03BF \u03C0\u03B1\u03C1\u03AC\u03B8\u03C5\u03C1\u03BF -condition.accessModerator.title=\u0391\u03BD\u03AD\u03B2\u03B1\u03C3\u03BC\u03B1 \u03AE \u03BB\u03AE\u03C8\u03B7 \u03B1\u03C1\u03C7\u03B5\u03AF\u03C9\u03BD/\u03B5\u03C0\u03BF\u03C0\u03C4\u03B5\u03AF\u03B1 forum -condition.accessPoster.title=\u0391\u03BD\u03AD\u03B2\u03B1\u03C3\u03BC\u03B1 / \u03BA\u03B1\u03C4\u03AD\u03B2\u03B1\u03C3\u03BC\u03B1 \u03B1\u03C1\u03C7\u03B5\u03AF\u03C9\u03BD / \u0391\u03BD\u03AC\u03B3\u03BD\u03C9\u03C3\u03B7-\u03B5\u03B3\u03B3\u03C1\u03B1\u03C6\u03AE forum -condition.accessReader.title=\u039A\u03B1\u03C4\u03AC\u03B2\u03B1\u03C3\u03BC\u03B1 \u03B1\u03C1\u03C7\u03B5\u03AF\u03C9\u03BD / \u0391\u03BD\u03AC\u03B3\u03BD\u03C9\u03C3\u03B7 forum -condition.accessibility.title=\u03A0\u03C1\u03CC\u03C3\u03B2\u03B1\u03C3\u03B7 -dialog.ablage.config.title=\u0394\u03B9\u03AC\u03BB\u03BF\u03B3\u03BF\u03C2 \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF\u03C5 -dialog.folder.name=\u03A6\u03AC\u03BA\u03B5\u03BB\u03BF\u03C2 -dialog.forum.config.title=\u0391\u03C0\u03BF\u03B8\u03AE\u03BA\u03B5\u03C5\u03C3\u03B7 -dialog.forum.popup.config.title=Forum -dialog.start=\u0395\u03BA\u03BA\u03AF\u03BD\u03B7\u03C3\u03B7 -dialog.upload.file=\u0391\u03BD\u03AD\u03B2\u03B1\u03C3\u03BC\u03B1 \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF\u03C5 -folder.info=\u0394\u03B9\u03AC\u03BB\u03BF\u03B3\u03BF\u03C2 \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF\u03C5 -folder.open=\u0386\u03BD\u03BF\u03B9\u03B3\u03BC\u03B1 \u03C6\u03B1\u03BA\u03AD\u03BB\u03BF\u03C5 - - - - - -pane.tab.accessibility=\u03A0\u03C1\u03CC\u03C3\u03B2\u03B1\u03C3\u03B7 -pane.tab.dialogconfig=\u0394\u03B9\u03B1\u03BC\u03CC\u03C1\u03C6\u03C9\u03C3\u03B7 Forum/\u03B1\u03C0\u03BF\u03B8\u03AE\u03BA\u03B5\u03C5\u03C3\u03B7\u03C2 -selection.forumAsPopup.label=\u0386\u03BD\u03BF\u03B9\u03B3\u03BC\u03B1 forum \u03C3\u03B5 \u03B1\u03BD\u03B1\u03B4\u03C5\u03CC\u03BC\u03B5\u03BD\u03BF \u03C0\u03B1\u03C1\u03AC\u03B8\u03C5\u03C1\u03BF? -title_dialog=\u0394\u03B9\u03AC\u03BB\u03BF\u03B3\u03BF\u03C2 \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF\u03C5 diff --git a/src/main/java/org/olat/course/nodes/dialog/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/course/nodes/dialog/_i18n/LocalStrings_en.properties deleted file mode 100644 index 13d93aacd04d5a27f06de2aa09eaf443fb268539..0000000000000000000000000000000000000000 --- a/src/main/java/org/olat/course/nodes/dialog/_i18n/LocalStrings_en.properties +++ /dev/null @@ -1,36 +0,0 @@ -#Fri Jan 21 14:06:32 CET 2011 - - - - - - - - - - - -command.closesp=Close window -command.show=Display learning content -command.showpopup=Display learning content in new window -condition.accessModerator.title=Upload or download files/moderate forum -condition.accessPoster.title=Upload and download files/read and write in forum -condition.accessReader.title=Download files/read in forum only -condition.accessibility.title=Access -dialog.ablage.config.title=File dialog -dialog.folder.name=Storage folder -dialog.forum.config.title=Storage -dialog.forum.popup.config.title=Forum -dialog.start=Start -dialog.upload.file=Upload file -folder.info=File dialog -folder.open=Open folder - - - - - -pane.tab.accessibility=Access -pane.tab.dialogconfig=Forum/storage configuration -selection.forumAsPopup.label=Open forum in pop-up -title_dialog=File dialog diff --git a/src/main/java/org/olat/course/nodes/dialog/_i18n/LocalStrings_fr.properties b/src/main/java/org/olat/course/nodes/dialog/_i18n/LocalStrings_fr.properties deleted file mode 100644 index 31feb6ce136fa9ec2385bb702356becac3cc6e4a..0000000000000000000000000000000000000000 --- a/src/main/java/org/olat/course/nodes/dialog/_i18n/LocalStrings_fr.properties +++ /dev/null @@ -1,36 +0,0 @@ -#Sat Aug 28 13:32:14 CEST 2010 - - - - - - - - - - - -command.closesp=Fermer fen\u00EAtre -command.show=Afficher contenu didactique -command.showpopup=Afficher contenu didactique dans nouvelle fen\u00EAtre -condition.accessModerator.title=Transmission et t\u00E9l\u00E9chargement des fichiers / Animer le forum -condition.accessPoster.title=Transmission et t\u00E9l\u00E9chargement des fichiers / Lire et \u00E9crire dans le forum -condition.accessReader.title=Uniquement t\u00E9l\u00E9chargement des fichiers / Uniquement lire dans le forum -condition.accessibility.title=Acces -dialog.ablage.config.title=Fichier discut\u00E9 -dialog.folder.name=D\u00E9p\u00F4t de fichier -dialog.forum.config.title=Stockage -dialog.forum.popup.config.title=Forum -dialog.start=D\u00E9marrage -dialog.upload.file=T\u00E9l\u00E9charger fichier -folder.info=Fichier discut\u00E9 -folder.open=Ouvrir d\u00E9p\u00F4t - - - - - -pane.tab.accessibility=Acc\u00E8s -pane.tab.dialogconfig=Configuration de d\u00E9p\u00F4t, du forum -selection.forumAsPopup.label=Ouvrir le forum dans une nouvelle fen\u00EAtre? -title_dialog=Discussion de fichier diff --git a/src/main/java/org/olat/course/nodes/dialog/_i18n/LocalStrings_it.properties b/src/main/java/org/olat/course/nodes/dialog/_i18n/LocalStrings_it.properties deleted file mode 100644 index b6422bbd33b944089d348987fd3bd0be396bfa6f..0000000000000000000000000000000000000000 --- a/src/main/java/org/olat/course/nodes/dialog/_i18n/LocalStrings_it.properties +++ /dev/null @@ -1,36 +0,0 @@ -#Fri Aug 27 15:05:27 CEST 2010 - - - - - - - - - - - -command.closesp=Chiudere finestra -command.show=Mostrare contenuto didattico -command.showpopup=Mostrare contenuto didattico in nuova finestra -condition.accessModerator.title=upload / download files / moderatate forum -condition.accessPoster.title=upload / download files / read write forum -condition.accessReader.title=download files / read forum -condition.accessibility.title=Accesso -dialog.ablage.config.title=Discussione documentata -dialog.folder.name=Deposito file -dialog.forum.config.title=Deposito -dialog.forum.popup.config.title=Forum -dialog.start=Avviare -dialog.upload.file=Caricare file -folder.info=Discussione documentata -folder.open=Apri deposito - - - - - -pane.tab.accessibility=Accesso -pane.tab.dialogconfig=Configurazione deposito / forum -selection.forumAsPopup.label=Aprire forum in finestra popup? -title_dialog=Discussione documentata diff --git a/src/main/java/org/olat/course/nodes/dialog/_i18n/LocalStrings_pt_BR.properties b/src/main/java/org/olat/course/nodes/dialog/_i18n/LocalStrings_pt_BR.properties deleted file mode 100644 index 685c49ad323779a9da38ef7b882d71bbe9d45ccf..0000000000000000000000000000000000000000 --- a/src/main/java/org/olat/course/nodes/dialog/_i18n/LocalStrings_pt_BR.properties +++ /dev/null @@ -1,36 +0,0 @@ -#Fri Aug 20 22:46:10 CEST 2010 - - - - - - - - - - - -command.closesp=Fechar janela -command.show=Exibir conte\u00FAdo did\u00E1tico -command.showpopup=Exibir conte\u00FAdo did\u00E1tico em nova janela -condition.accessModerator.title=Carregar/ baixar arquivos/ moderar f\u00F3rum -condition.accessPoster.title=Carregar/ baixar arquivos/ ler-escrever f\u00F3rum -condition.accessReader.title=Baixar arquivos/ ler f\u00F3rum -condition.accessibility.title=Acesso -dialog.ablage.config.title=Arquivo de di\u00E1logo -dialog.folder.name=Pasta -dialog.forum.config.title=Armazenamento -dialog.forum.popup.config.title=F\u00F3rum -dialog.start=Iniciar -dialog.upload.file=Carregar arquivo -folder.info=Arquivo de di\u00E1logo -folder.open=Abrir pasta - - - - - -pane.tab.accessibility=Acesso -pane.tab.dialogconfig=F\u00F3rum/configura\u00E7\u00E3o de armazenamento -selection.forumAsPopup.label=Abrir pasta em janela pop-up? -title_dialog=Arquivo de Di\u00E1logo diff --git a/src/main/java/org/olat/course/nodes/dialog/_i18n/LocalStrings_pt_PT.properties b/src/main/java/org/olat/course/nodes/dialog/_i18n/LocalStrings_pt_PT.properties deleted file mode 100644 index 69d56542d55ef48c7b03ab1b04fcfcd80aaee83f..0000000000000000000000000000000000000000 --- a/src/main/java/org/olat/course/nodes/dialog/_i18n/LocalStrings_pt_PT.properties +++ /dev/null @@ -1,33 +0,0 @@ -#Wed Jul 28 13:33:30 CEST 2010 - - - - - - - - - - -command.closesp=Fechar janela -command.show=Exibir conte\u00FAdo did\u00E1tico -command.showpopup=Exibir conte\u00FAdo did\u00E1tico em nova janela -condition.accessModerator.title=Carregar/ baixar arquivos/ moderar f\u00F3rum -condition.accessPoster.title=Carregar/ baixar arquivos/ ler-escrever f\u00F3rum -condition.accessReader.title=Baixar arquivos/ ler f\u00F3rum -condition.accessibility.title=Acesso -dialog.ablage.config.title=Arquivo de di\u00E1logo -dialog.folder.name=Pasta -dialog.forum.config.title=Armazenamento -dialog.forum.popup.config.title=F\u00F3rum -dialog.start=Iniciar -dialog.upload.file=Carregar arquivo -folder.info=Arquivo de di\u00E1logo -folder.open=Abrir pasta - - - - -pane.tab.accessibility=Acesso -pane.tab.dialogconfig=F\u00F3rum/configura\u00E7\u00E3o de armazenamento -selection.forumAsPopup.label=Abrir pasta em janela pop-up? diff --git a/src/main/java/org/olat/course/nodes/dialog/_i18n/LocalStrings_ru.properties b/src/main/java/org/olat/course/nodes/dialog/_i18n/LocalStrings_ru.properties deleted file mode 100644 index 7bae1bd39f632178cc31cf495260ba55a809300b..0000000000000000000000000000000000000000 --- a/src/main/java/org/olat/course/nodes/dialog/_i18n/LocalStrings_ru.properties +++ /dev/null @@ -1,29 +0,0 @@ -#Wed Jul 28 13:33:33 CEST 2010 - - - - - - -command.closesp=\u0417\u0430\u043A\u0440\u044B\u0442\u044C \u043E\u043A\u043D\u043E -command.show=\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u0443\u0447\u0435\u0431\u043D\u043E\u0435 \u0441\u043E\u0434\u0435\u0440\u0436\u0430\u043D\u0438\u0435 -command.showpopup=\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u0443\u0447\u0435\u0431\u043D\u043E\u0435 \u0441\u043E\u0434\u0435\u0440\u0436\u0430\u043D\u0438\u0435 \u0432 \u043D\u043E\u0432\u043E\u043C \u043E\u043A\u043D\u0435 -condition.accessModerator.title=\u0417\u0430\u0433\u0440\u0443\u0437\u043A\u0430 \u0438 \u0441\u043A\u0430\u0447\u0438\u0432\u0430\u043D\u0438\u0435 \u0444\u0430\u0439\u043B\u043E\u0432 / \u041C\u043E\u0434\u0435\u0440\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u0435 \u0432 \u0444\u043E\u0440\u0443\u043C\u0435 -condition.accessPoster.title=\u0417\u0430\u0433\u0440\u0443\u0437\u043A\u0430 \u0438 \u0441\u043A\u0430\u0447\u0438\u0432\u0430\u043D\u0438\u0435 \u0444\u0430\u0439\u043B\u043E\u0432 / \u0427\u0438\u0442\u0430\u0442\u044C \u0438 \u043F\u0438\u0441\u0430\u0442\u044C \u0432 \u0444\u043E\u0440\u0443\u043C\u0435 -condition.accessReader.title=\u0422\u043E\u043B\u044C\u043A\u043E \u0441\u043A\u0430\u0447\u0438\u0432\u0430\u043D\u0438\u0435 \u0444\u0430\u0439\u043B\u043E\u0432 / \u0422\u043E\u043B\u044C\u043A\u043E \u0447\u0442\u0435\u043D\u0438\u0435 \u0432 \u0444\u043E\u0440\u0443\u043C\u0435 -condition.accessibility.title=\u0414\u043E\u0441\u0442\u0443\u043F -dialog.ablage.config.title=\u041E\u0431\u0441\u0443\u0436\u0434\u0435\u043D\u0438\u0435 \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u0430 -dialog.folder.name=\u041F\u0430\u043F\u043A\u0430 \u0434\u043B\u044F \u0444\u0430\u0439\u043B\u043E\u0432 -dialog.forum.config.title=\u041F\u0430\u043F\u043A\u0430 -dialog.forum.popup.config.title=\u0424\u043E\u0440\u0443\u043C -dialog.start=\u0421\u0442\u0430\u0440\u0442 -dialog.upload.file=\u041F\u0435\u0440\u0435\u0441\u043B\u0430\u0442\u044C \u0444\u0430\u0439\u043B -folder.info=\u041E\u0431\u0441\u0443\u0436\u0434\u0435\u043D\u0438\u0435 \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u0430 -folder.open=\u041E\u0442\u043A\u0440\u044B\u0442\u044C \u043F\u0430\u043F\u043A\u0443 - - - - -pane.tab.accessibility=\u0414\u043E\u0441\u0442\u0443\u043F -pane.tab.dialogconfig=\u041A\u043E\u043D\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044F \u043F\u0430\u043F\u043A\u0438/\u0444\u043E\u0440\u0443\u043C\u0430 -selection.forumAsPopup.label=\u041E\u0442\u043A\u0440\u044B\u0442\u044C \u0444\u043E\u0440\u0443\u043C \u0432\u043E \u0432\u0441\u043F\u043B\u044B\u0432\u0430\u044E\u0449\u0435\u043C \u043E\u043A\u043D\u0435 (pop-up)? diff --git a/src/main/java/org/olat/course/nodes/dialog/_i18n/LocalStrings_sq.properties b/src/main/java/org/olat/course/nodes/dialog/_i18n/LocalStrings_sq.properties deleted file mode 100644 index 1182b2403c2b60c186656f547f7cbdb817c54995..0000000000000000000000000000000000000000 --- a/src/main/java/org/olat/course/nodes/dialog/_i18n/LocalStrings_sq.properties +++ /dev/null @@ -1,33 +0,0 @@ -#Wed Jul 28 13:33:32 CEST 2010 - - - - - - - - - - -command.closesp=Mbylle dritaren -command.show=Shfaq p\u00EBrmbajtje m\u00EBsimi -command.showpopup=Shfaqet p\u00EBrmbajtja e m\u00EBsimit n\u00EB dritare t\u00EB re -condition.accessModerator.title=Ngarko / shkarko skedar\u00EBt / forum moderimi -condition.accessPoster.title=Ngarko / shkarko skedar\u00EBt / forum lexim-shkrimi -condition.accessReader.title=Shkarko skedar\u00EBt / forum leximi -condition.accessibility.title=Qasja -dialog.ablage.config.title=Dialog skedari -dialog.folder.name=Dosja -dialog.forum.config.title=Ruajtja -dialog.forum.popup.config.title=Forumi -dialog.start=Nise -dialog.upload.file=Ngarko skedar -folder.info=Dialog skedari -folder.open=Hap dosje - - - - -pane.tab.accessibility=Qasja -pane.tab.dialogconfig=Konfigurimini i forumit -selection.forumAsPopup.label=Hape forumin n\u00EB dritare k\u00EBrcyese? diff --git a/src/main/java/org/olat/course/nodes/dialog/_i18n/LocalStrings_zh_TW.properties b/src/main/java/org/olat/course/nodes/dialog/_i18n/LocalStrings_zh_TW.properties deleted file mode 100644 index 7aa177267315e7e7a6788d0de049d507dcb6ddab..0000000000000000000000000000000000000000 --- a/src/main/java/org/olat/course/nodes/dialog/_i18n/LocalStrings_zh_TW.properties +++ /dev/null @@ -1,36 +0,0 @@ -#Mon Sep 20 15:17:02 CEST 2010 - - - - - - - - - - - -command.closesp=\u95DC\u9589\u8996\u7A97 -command.show=\u986F\u793A\u5B78\u7FD2\u5167\u5BB9 -command.showpopup=\u5728\u65B0\u8996\u7A97\u986F\u793A\u5B78\u7FD2\u5167\u5BB9 -condition.accessModerator.title=\u4E0A\u50B3 / \u4E0B\u8F09\u6A94\u6848 / \u7BA1\u7406\u8AD6\u58C7 -condition.accessPoster.title=\u4E0A\u50B3 / \u4E0B\u8F09\u6A94\u6848 / \u8B80\u53D6/\u5BEB\u5165\u8AD6\u58C7 -condition.accessReader.title=\u4E0B\u8F09\u6A94\u6848 / \u8B80\u53D6\u8AD6\u58C7 -condition.accessibility.title=\u5B58\u53D6 -dialog.ablage.config.title=\u6A94\u6848\u5C0D\u8A71\u6846 -dialog.folder.name=\u8CC7\u6599\u593E -dialog.forum.config.title=\u5132\u5B58\u5340 -dialog.forum.popup.config.title=\u8AD6\u58C7 -dialog.start=\u958B\u59CB -dialog.upload.file=\u4E0A\u50B3\u6A94\u6848 -folder.info=\u6A94\u6848\u5C0D\u8A71\u6846 -folder.open=\u958B\u555F\u8CC7\u6599\u593E - - - - - -pane.tab.accessibility=\u5B58\u53D6 -pane.tab.dialogconfig=\u8AD6\u58C7/\u5132\u5B58\u5340\u8A2D\u5B9A -selection.forumAsPopup.label=\u5728\u5F48\u51FA\u8996\u7A97\u958B\u555F\u8AD6\u58C7\uFF1F -title_dialog=\u6A94\u6848\u5C0D\u8A71\u6846 diff --git a/src/main/java/org/olat/course/nodes/dialog/_i18n/i18nBundleMetadata.properties b/src/main/java/org/olat/course/nodes/dialog/_i18n/i18nBundleMetadata.properties deleted file mode 100644 index 22371ad650f3fba53af8a8ddacfdb3cfd9a84c76..0000000000000000000000000000000000000000 --- a/src/main/java/org/olat/course/nodes/dialog/_i18n/i18nBundleMetadata.properties +++ /dev/null @@ -1 +0,0 @@ -title_dialog.inlinetranslation=disabled diff --git a/src/main/java/org/olat/course/nodes/dialog/manager/DialogElementsManagerImpl.java b/src/main/java/org/olat/course/nodes/dialog/manager/DialogElementsManagerImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..9d1fcefa898561d629a5595f76a2549eadb89717 --- /dev/null +++ b/src/main/java/org/olat/course/nodes/dialog/manager/DialogElementsManagerImpl.java @@ -0,0 +1,152 @@ +/** + * <a href="http://www.openolat.org"> + * OpenOLAT - Online Learning and Training</a><br> + * <p> + * Licensed under the Apache License, Version 2.0 (the "License"); <br> + * you may not use this file except in compliance with the License.<br> + * You may obtain a copy of the License at the + * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a> + * <p> + * Unless required by applicable law or agreed to in writing,<br> + * software distributed under the License is distributed on an "AS IS" BASIS, <br> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> + * See the License for the specific language governing permissions and <br> + * limitations under the License. + * <p> + * Initial code contributed and copyrighted by<br> + * frentix GmbH, http://www.frentix.com + * <p> + */ +package org.olat.course.nodes.dialog.manager; + +import java.util.Date; +import java.util.List; + +import org.olat.core.commons.modules.bc.vfs.OlatRootFolderImpl; +import org.olat.core.commons.persistence.DB; +import org.olat.core.id.Identity; +import org.olat.core.util.vfs.VFSContainer; +import org.olat.core.util.vfs.VFSItem; +import org.olat.core.util.vfs.VFSLeaf; +import org.olat.course.nodes.dialog.DialogElement; +import org.olat.course.nodes.dialog.DialogElementsManager; +import org.olat.course.nodes.dialog.model.DialogElementImpl; +import org.olat.modules.fo.Forum; +import org.olat.modules.fo.manager.ForumManager; +import org.olat.repository.RepositoryEntry; +import org.olat.repository.RepositoryEntryRef; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * + * Initial date: 3 janv. 2018<br> + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + * + */ +@Service +public class DialogElementsManagerImpl implements DialogElementsManager { + + @Autowired + private DB dbInstance; + @Autowired + private ForumManager forumManager; + + @Override + public DialogElement createDialogElement(RepositoryEntry entry, Identity author, + String filename, Long size, String subIdent) { + DialogElementImpl element = new DialogElementImpl(); + element.setCreationDate(new Date()); + element.setLastModified(element.getCreationDate()); + element.setFilename(filename); + element.setSize(size); + element.setAuthor(author); + element.setEntry(entry); + element.setSubIdent(subIdent); + + Forum forum = forumManager.addAForum(); + element.setForum(forum); + + dbInstance.getCurrentEntityManager().persist(element); + return element; + } + + @Override + public List<DialogElement> getDialogElements(RepositoryEntryRef entry, String subIdent) { + StringBuilder sb = new StringBuilder(); + sb.append("select element from dialogelement as element") + .append(" inner join fetch element.entry entry") + .append(" left join fetch element.author author") + .append(" left join fetch author.user authorUser") + .append(" where element.entry.key=:entryKey and element.subIdent=:subIdent"); + + return dbInstance.getCurrentEntityManager() + .createQuery(sb.toString(), DialogElement.class) + .setParameter("entryKey", entry.getKey()) + .setParameter("subIdent", subIdent) + .getResultList(); + } + + @Override + public DialogElement getDialogElementByForum(Long forumKey) { + StringBuilder sb = new StringBuilder(); + sb.append("select element from dialogelement as element") + .append(" inner join fetch element.entry entry") + .append(" inner join fetch element.forum forum") + .append(" left join fetch element.author author") + .append(" left join fetch author.user authorUser") + .append(" where forum.key=:forumKey"); + + List<DialogElement> elements = dbInstance.getCurrentEntityManager() + .createQuery(sb.toString(), DialogElement.class) + .setParameter("forumKey", forumKey) + .getResultList(); + return elements == null || elements.isEmpty() ? null : elements.get(0); + } + + @Override + public DialogElement getDialogElementByKey(Long elementKey) { + StringBuilder sb = new StringBuilder(); + sb.append("select element from dialogelement as element") + .append(" inner join fetch element.entry entry") + .append(" inner join fetch element.forum forum") + .append(" left join fetch element.author author") + .append(" left join fetch author.user authorUser") + .append(" where element.key=:elementKey"); + + List<DialogElement> elements = dbInstance.getCurrentEntityManager() + .createQuery(sb.toString(), DialogElement.class) + .setParameter("elementKey", elementKey) + .getResultList(); + return elements == null || elements.isEmpty() ? null : elements.get(0); + } + + @Override + public VFSContainer getDialogContainer(DialogElement element) { + Forum forum = element.getForum(); + + StringBuilder sb = new StringBuilder(); + sb.append("/forum/").append(forum.getKey()).append("/"); + String pathToForumDir = sb.toString(); + return new OlatRootFolderImpl(pathToForumDir, null); + } + + @Override + public VFSLeaf getDialogLeaf(DialogElement element) { + VFSContainer container = getDialogContainer(element); + VFSItem item = container.resolve(element.getFilename()); + if(item instanceof VFSLeaf) { + return (VFSLeaf)item; + } + return null; + } + + @Override + public void deleteDialogElement(DialogElement element) { + Forum forum = element.getForum(); + DialogElement reloadedElement = dbInstance.getCurrentEntityManager() + .getReference(DialogElementImpl.class, element.getKey()); + dbInstance.getCurrentEntityManager().remove(reloadedElement); + forumManager.deleteForum(forum.getKey()); + } +} diff --git a/src/main/java/org/olat/modules/dialog/FileUploadNotificationHandler.java b/src/main/java/org/olat/course/nodes/dialog/manager/FileUploadNotificationHandler.java similarity index 70% rename from src/main/java/org/olat/modules/dialog/FileUploadNotificationHandler.java rename to src/main/java/org/olat/course/nodes/dialog/manager/FileUploadNotificationHandler.java index cc6544d5d7aa5dd693c29c6fe79394db85b9c422..8e0f575fc14a0d2086ba31b0df7eea351736e5fa 100644 --- a/src/main/java/org/olat/modules/dialog/FileUploadNotificationHandler.java +++ b/src/main/java/org/olat/course/nodes/dialog/manager/FileUploadNotificationHandler.java @@ -23,13 +23,12 @@ * under the Apache 2.0 license as the original file. */ -package org.olat.modules.dialog; +package org.olat.course.nodes.dialog.manager; import java.util.Date; import java.util.List; import java.util.Locale; -import org.olat.basesecurity.BaseSecurityManager; import org.olat.core.commons.services.notifications.NotificationHelper; import org.olat.core.commons.services.notifications.NotificationsHandler; import org.olat.core.commons.services.notifications.NotificationsManager; @@ -42,13 +41,19 @@ import org.olat.core.commons.services.notifications.model.TitleItem; import org.olat.core.gui.translator.Translator; import org.olat.core.gui.util.CSSHelper; import org.olat.core.id.Identity; +import org.olat.core.id.OLATResourceable; import org.olat.core.id.context.BusinessControlFactory; import org.olat.core.logging.OLog; import org.olat.core.logging.Tracing; import org.olat.core.util.Util; import org.olat.core.util.resource.OresHelper; +import org.olat.course.nodes.dialog.DialogElement; +import org.olat.course.nodes.dialog.DialogElementsManager; +import org.olat.course.nodes.dialog.ui.DialogCourseNodeRunController; import org.olat.repository.RepositoryEntry; import org.olat.repository.RepositoryManager; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; /** * Description:<br> @@ -59,9 +64,17 @@ import org.olat.repository.RepositoryManager; * * @author guido */ +@Service public class FileUploadNotificationHandler implements NotificationsHandler { private static final OLog log = Tracing.createLoggerFor(FileUploadNotificationHandler.class); private static final String CSSS_CLASS_UPLOAD_ICON = "o_dialog_icon"; + + @Autowired + private RepositoryManager repositoryManager; + @Autowired + private DialogElementsManager dialogElementsMgr; + @Autowired + private NotificationsManager notificationsManager; public FileUploadNotificationHandler() { // @@ -71,6 +84,7 @@ public class FileUploadNotificationHandler implements NotificationsHandler { * @see org.olat.core.commons.services.notifications.NotificationsHandler#createSubscriptionInfo(org.olat.core.commons.services.notifications.Subscriber, * java.util.Locale, java.util.Date) */ + @Override public SubscriptionInfo createSubscriptionInfo(Subscriber subscriber, Locale locale, Date compareDate) { Publisher p = subscriber.getPublisher(); final Date latestNews = p.getLatestNewsDate(); @@ -78,48 +92,48 @@ public class FileUploadNotificationHandler implements NotificationsHandler { SubscriptionInfo si; // there could be news for me, investigate deeper try { - if (NotificationsManager.getInstance().isPublisherValid(p) && compareDate.before(latestNews)) { - RepositoryEntry re = RepositoryManager.getInstance().lookupRepositoryEntry(OresHelper.createOLATResourceableInstance(p.getResName(), p.getResId()), false); + if (notificationsManager.isPublisherValid(p) && compareDate.before(latestNews)) { + RepositoryEntry re = repositoryManager.lookupRepositoryEntry(OresHelper.createOLATResourceableInstance(p.getResName(), p.getResId()), false); if(re == null) { if(!checkPublisher(subscriber.getPublisher())) { - return NotificationsManager.getInstance().getNoSubscriptionInfo(); + return notificationsManager.getNoSubscriptionInfo(); } } else if(re.getRepositoryEntryStatus().isClosed() || re.getRepositoryEntryStatus().isUnpublished()) { - return NotificationsManager.getInstance().getNoSubscriptionInfo(); + return notificationsManager.getNoSubscriptionInfo(); } String displayname = re.getDisplayname(); - - DialogElementsPropertyManager mgr = DialogElementsPropertyManager.getInstance(); - DialogPropertyElements elements = mgr.findDialogElements(p.getResId(), p.getSubidentifier()); - final List<DialogElement> dialogElements = elements.getDialogPropertyElements(); - final Translator translator = Util.createPackageTranslator(FileUploadNotificationHandler.class, locale); + OLATResourceable ores = OresHelper.createOLATResourceableInstance("CourseModule", p.getResId()); + RepositoryEntry entry = repositoryManager.lookupRepositoryEntry(ores, false); + List<DialogElement> dialogElements = dialogElementsMgr.getDialogElements(entry, p.getSubidentifier()); + final Translator translator = Util.createPackageTranslator(DialogCourseNodeRunController.class, locale); - si = new SubscriptionInfo(subscriber.getKey(), p.getType(), new TitleItem(translator.translate("notifications.header", new String[]{displayname}), CSSS_CLASS_UPLOAD_ICON), null); - SubscriptionListItem subListItem; + si = new SubscriptionInfo(subscriber.getKey(), p.getType(), new TitleItem(translator.translate("notifications.header", new String[]{ displayname }), CSSS_CLASS_UPLOAD_ICON), null); + for (DialogElement element : dialogElements) { // do only show entries newer then the ones already seen - if (element.getDate().after(compareDate)) { + if (element.getCreationDate().after(compareDate)) { String filename = element.getFilename(); - String creator = element.getAuthor(); - Identity ident = BaseSecurityManager.getInstance().findIdentityByName(creator); - Date modDate = element.getDate(); + Identity author = element.getAuthor(); + Date modDate = element.getCreationDate(); + String[] params = new String[] { + filename, + NotificationHelper.getFormatedName(author) + }; - String desc = translator.translate("notifications.entry", new String[] { filename, NotificationHelper.getFormatedName(ident) }); - String businessPath = p.getBusinessPath(); + String desc = translator.translate("notifications.entry", params); + String businessPath = p.getBusinessPath() + "[Element:" + element.getKey() + "]"; String urlToSend = BusinessControlFactory.getInstance().getURLFromBusinessPathString(businessPath); String cssClass = CSSHelper.createFiletypeIconCssClassFor(filename); - - subListItem = new SubscriptionListItem(desc, urlToSend, businessPath, modDate, cssClass); - si.addSubscriptionListItem(subListItem); + si.addSubscriptionListItem(new SubscriptionListItem(desc, urlToSend, businessPath, modDate, cssClass)); } } } else { - si = NotificationsManager.getInstance().getNoSubscriptionInfo(); + si = notificationsManager.getNoSubscriptionInfo(); } } catch (Exception e) { log.error("Error creating file upload's notifications for subscriber: " + subscriber.getKey(), e); - si = NotificationsManager.getInstance().getNoSubscriptionInfo(); + si = notificationsManager.getNoSubscriptionInfo(); } return si; } @@ -128,7 +142,7 @@ public class FileUploadNotificationHandler implements NotificationsHandler { public String createTitleInfo(Subscriber subscriber, Locale locale) { try { Translator translator = Util.createPackageTranslator(FileUploadNotificationHandler.class, locale); - String displayname = RepositoryManager.getInstance().lookupDisplayNameByOLATResourceableId(subscriber.getPublisher().getResId()); + String displayname = repositoryManager.lookupDisplayNameByOLATResourceableId(subscriber.getPublisher().getResId()); if(displayname == null) { checkPublisher(subscriber.getPublisher()); } diff --git a/src/main/java/org/olat/course/nodes/dialog/model/DialogElementImpl.java b/src/main/java/org/olat/course/nodes/dialog/model/DialogElementImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..05d64ea084efbe9e619f00137ec47335aa6cdf99 --- /dev/null +++ b/src/main/java/org/olat/course/nodes/dialog/model/DialogElementImpl.java @@ -0,0 +1,188 @@ +/** + * <a href="http://www.openolat.org"> + * OpenOLAT - Online Learning and Training</a><br> + * <p> + * Licensed under the Apache License, Version 2.0 (the "License"); <br> + * you may not use this file except in compliance with the License.<br> + * You may obtain a copy of the License at the + * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a> + * <p> + * Unless required by applicable law or agreed to in writing,<br> + * software distributed under the License is distributed on an "AS IS" BASIS, <br> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> + * See the License for the specific language governing permissions and <br> + * limitations under the License. + * <p> + * Initial code contributed and copyrighted by<br> + * frentix GmbH, http://www.frentix.com + * <p> + */ +package org.olat.course.nodes.dialog.model; + +import java.util.Date; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.Table; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; + +import org.olat.basesecurity.IdentityImpl; +import org.olat.core.id.CreateInfo; +import org.olat.core.id.Identity; +import org.olat.core.id.ModifiedInfo; +import org.olat.core.id.Persistable; +import org.olat.course.nodes.dialog.DialogElement; +import org.olat.modules.fo.Forum; +import org.olat.modules.fo.model.ForumImpl; +import org.olat.repository.RepositoryEntry; + +/** + * + * Initial date: 3 janv. 2018<br> + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + * + */ +@Entity(name="dialogelement") +@Table(name="o_dialog_element") +public class DialogElementImpl implements DialogElement, CreateInfo, Persistable, ModifiedInfo { + + private static final long serialVersionUID = -8365816867114648471L; + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name="id", nullable=false, unique=true, insertable=true, updatable=false) + private Long key; + + @Temporal(TemporalType.TIMESTAMP) + @Column(name="creationdate", nullable=false, insertable=true, updatable=false) + private Date creationDate; + @Temporal(TemporalType.TIMESTAMP) + @Column(name="lastmodified", nullable=false, insertable=true, updatable=true) + private Date lastModified; + + @Column(name="d_filename", nullable=false, insertable=true, updatable=true) + private String filename; + @Column(name="d_filesize", nullable=false, insertable=true, updatable=true) + private Long size; + @Column(name="d_subident", nullable=false, insertable=true, updatable=false) + private String subIdent; + + @ManyToOne(targetEntity=RepositoryEntry.class, fetch=FetchType.LAZY, optional=true) + @JoinColumn(name="fk_entry", nullable=false, insertable=true, updatable=false) + private RepositoryEntry entry; + + @ManyToOne(targetEntity=IdentityImpl.class, fetch=FetchType.LAZY, optional=true) + @JoinColumn(name="fk_author", nullable=true, insertable=true, updatable=true) + private Identity author; + + @ManyToOne(targetEntity=ForumImpl.class, fetch=FetchType.LAZY, optional=false) + @JoinColumn(name="fk_forum", nullable=false, insertable=true, updatable=false) + private Forum forum; + + @Override + public Long getKey() { + return key; + } + + @Override + public Date getCreationDate() { + return creationDate; + } + + public void setCreationDate(Date creationDate) { + this.creationDate = creationDate; + } + + @Override + public Date getLastModified() { + return lastModified; + } + + @Override + public void setLastModified(Date date) { + lastModified = date; + } + + @Override + public String getFilename() { + return filename; + } + + public void setFilename(String filename) { + this.filename = filename; + } + + @Override + public String getSubIdent() { + return subIdent; + } + + public void setSubIdent(String subIdent) { + this.subIdent = subIdent; + } + + @Override + public RepositoryEntry getEntry() { + return entry; + } + + public void setEntry(RepositoryEntry entry) { + this.entry = entry; + } + + @Override + public Identity getAuthor() { + return author; + } + + public void setAuthor(Identity author) { + this.author = author; + } + + @Override + public Forum getForum() { + return forum; + } + + public void setForum(Forum forum) { + this.forum = forum; + } + + @Override + public Long getSize() { + return size; + } + + public void setSize(Long size) { + this.size = size; + } + + @Override + public int hashCode() { + return key == null ? 389476589 : key.hashCode(); + } + + @Override + public boolean equals(Object obj) { + if(this == obj) { + return true; + } + if(obj instanceof DialogElementImpl) { + DialogElementImpl element = (DialogElementImpl)obj; + return key != null && key.equals(element.key); + } + return false; + } + + @Override + public boolean equalsByPersistableKey(Persistable persistable) { + return equals(persistable); + } +} diff --git a/src/main/java/org/olat/course/nodes/dialog/DialogConfigForm.java b/src/main/java/org/olat/course/nodes/dialog/ui/DialogConfigForm.java similarity index 73% rename from src/main/java/org/olat/course/nodes/dialog/DialogConfigForm.java rename to src/main/java/org/olat/course/nodes/dialog/ui/DialogConfigForm.java index 574c744175f4ecf9d3298a18c4264077afd95ad7..0e42f37bd86ae5fb39c014abb043f1701fa31697 100644 --- a/src/main/java/org/olat/course/nodes/dialog/DialogConfigForm.java +++ b/src/main/java/org/olat/course/nodes/dialog/ui/DialogConfigForm.java @@ -23,7 +23,7 @@ * under the Apache 2.0 license as the original file. */ -package org.olat.course.nodes.dialog; +package org.olat.course.nodes.dialog.ui; import org.olat.core.gui.UserRequest; import org.olat.core.gui.components.form.flexible.FormItem; @@ -35,6 +35,8 @@ import org.olat.core.gui.control.Controller; import org.olat.core.gui.control.Event; import org.olat.core.gui.control.WindowControl; import org.olat.core.logging.AssertException; +import org.olat.core.util.Util; +import org.olat.course.nodes.dialog.DialogElementsManager; import org.olat.modules.ModuleConfiguration; /** @@ -45,16 +47,16 @@ import org.olat.modules.ModuleConfiguration; public class DialogConfigForm extends FormBasicController { public static final String DIALOG_CONFIG_INTEGRATION = "dialog_integration"; - /** Integration configuration value: integrate it into course showing the course menu **/ - public static final String CONFIG_INTEGRATION_VALUE_INLINE = "inline"; - /** Integration configuration value: integrate it using a modal dialog withoud course menu **/ - public static final String CONFIG_INTEGRATION_VALUE_MODAL = "modal"; - /** Integration configuration value: integrate it as a pop up window **/ - public static final String CONFIG_INTEGRATION_VALUE_POPUP = "popup"; + /** Integration configuration value: integrate it into course showing the course menu **/ + public static final String CONFIG_INTEGRATION_VALUE_INLINE = "inline"; + /** Integration configuration value: integrate it using a modal dialog withoud course menu **/ + public static final String CONFIG_INTEGRATION_VALUE_MODAL = "modal"; + /** Integration configuration value: integrate it as a pop up window **/ + public static final String CONFIG_INTEGRATION_VALUE_POPUP = "popup"; private SelectionElement select; - private ModuleConfiguration config; + private final ModuleConfiguration config; /** * @param name @@ -63,28 +65,14 @@ public class DialogConfigForm extends FormBasicController { */ public DialogConfigForm(UserRequest ureq, WindowControl wControl, ModuleConfiguration config) { super(ureq, wControl); - - if (config == null) throw new AssertException("module configuration is null!"); - + setTranslator(Util.createPackageTranslator(DialogElementsManager.class, getLocale())); this.config = config; - initForm(ureq); } - /** - * @see org.olat.core.gui.components.form.Form#validate(org.olat.core.gui.UserRequest) - */ - public boolean validate() { - return true; - } - @Override protected void formInnerEvent (UserRequest ureq, FormItem source, FormEvent event) { - if (config == null) throw new AssertException("Try to do updateConfiguration() but module configuration is null"); - config.set( - DialogConfigForm.DIALOG_CONFIG_INTEGRATION, - select.isSelected(0)? CONFIG_INTEGRATION_VALUE_POPUP: CONFIG_INTEGRATION_VALUE_INLINE - ); + config.set(DialogConfigForm.DIALOG_CONFIG_INTEGRATION, select.isSelected(0) ? CONFIG_INTEGRATION_VALUE_POPUP : CONFIG_INTEGRATION_VALUE_INLINE); config.setConfigurationVersion(1); fireEvent (ureq, Event.CHANGED_EVENT); } @@ -112,5 +100,4 @@ public class DialogConfigForm extends FormBasicController { protected void doDispose() { // } - } diff --git a/src/main/java/org/olat/course/nodes/dialog/ui/DialogCourseNodeEditController.java b/src/main/java/org/olat/course/nodes/dialog/ui/DialogCourseNodeEditController.java new file mode 100644 index 0000000000000000000000000000000000000000..72983d295a2466bff6c4e99717aa6dd06151f70b --- /dev/null +++ b/src/main/java/org/olat/course/nodes/dialog/ui/DialogCourseNodeEditController.java @@ -0,0 +1,162 @@ +/** +* OLAT - Online Learning and Training<br> +* http://www.olat.org +* <p> +* Licensed under the Apache License, Version 2.0 (the "License"); <br> +* you may not use this file except in compliance with the License.<br> +* You may obtain a copy of the License at +* <p> +* http://www.apache.org/licenses/LICENSE-2.0 +* <p> +* Unless required by applicable law or agreed to in writing,<br> +* software distributed under the License is distributed on an "AS IS" BASIS, <br> +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> +* See the License for the specific language governing permissions and <br> +* limitations under the License. +* <p> +* Copyright (c) since 2004 at Multimedia- & E-Learning Services (MELS),<br> +* University of Zurich, Switzerland. +* <hr> +* <a href="http://www.openolat.org"> +* OpenOLAT - Online Learning and Training</a><br> +* This file has been modified by the OpenOLAT community. Changes are licensed +* under the Apache 2.0 license as the original file. +*/ + +package org.olat.course.nodes.dialog.ui; + +import org.olat.core.gui.UserRequest; +import org.olat.core.gui.components.Component; +import org.olat.core.gui.components.tabbedpane.TabbedPane; +import org.olat.core.gui.components.velocity.VelocityContainer; +import org.olat.core.gui.control.Controller; +import org.olat.core.gui.control.ControllerEventListener; +import org.olat.core.gui.control.Event; +import org.olat.core.gui.control.WindowControl; +import org.olat.core.gui.control.generic.tabbable.ActivateableTabbableDefaultController; +import org.olat.course.ICourse; +import org.olat.course.assessment.AssessmentHelper; +import org.olat.course.condition.Condition; +import org.olat.course.condition.ConditionEditController; +import org.olat.course.editor.NodeEditController; +import org.olat.course.nodes.BCCourseNode; +import org.olat.course.nodes.DialogCourseNode; +import org.olat.course.run.userview.UserCourseEnvironment; +import org.olat.course.tree.CourseEditorTreeModel; + +/** + * Description:<br> + * controller for the tabbed pane inside the course editor for the course node 'dialog elements' + * <P> + * Initial Date: 02.11.2005 <br> + * + * @author guido + */ +public class DialogCourseNodeEditController extends ActivateableTabbableDefaultController implements ControllerEventListener { + + private static final String PANE_TAB_DIALOGCONFIG = "pane.tab.dialogconfig"; + private static final String PANE_TAB_ACCESSIBILITY = "pane.tab.accessibility"; + + private static final String[] paneKeys = { PANE_TAB_DIALOGCONFIG, PANE_TAB_ACCESSIBILITY }; + + private TabbedPane myTabbedPane; + private VelocityContainer accessContent; + private ConditionEditController readerCondContr, posterCondContr, moderatorCondContr; + + private DialogCourseNode courseNode; + private BCCourseNode bcNode = new BCCourseNode(); + + private DialogElementsEditController elementsEditCtrl; + + public DialogCourseNodeEditController(UserRequest ureq, WindowControl wControl, DialogCourseNode node, + ICourse course, UserCourseEnvironment userCourseEnv) { + super(ureq,wControl); + this.courseNode = node; + + // set name of the folder we use + bcNode.setShortTitle(translate("dialog.folder.name")); + + elementsEditCtrl = new DialogElementsEditController(ureq, getWindowControl(), course.getCourseEnvironment(), node); + listenTo(elementsEditCtrl); + + // accessability config tab + accessContent = createVelocityContainer("edit_access"); + + CourseEditorTreeModel editorModel = course.getEditorTreeModel(); + // Reader precondition + Condition readerCondition = courseNode.getPreConditionReader(); + readerCondContr = new ConditionEditController(ureq, getWindowControl(), userCourseEnv, readerCondition, + AssessmentHelper.getAssessableNodes(editorModel, courseNode)); + listenTo(readerCondContr); + accessContent.put("readerCondition", readerCondContr.getInitialComponent()); + + // Poster precondition + Condition posterCondition = courseNode.getPreConditionPoster(); + posterCondContr = new ConditionEditController(ureq, getWindowControl(), userCourseEnv, posterCondition, + AssessmentHelper.getAssessableNodes(editorModel, courseNode)); + this.listenTo(posterCondContr); + accessContent.put("posterCondition", posterCondContr.getInitialComponent()); + + // Moderator precondition + Condition moderatorCondition = courseNode.getPreConditionModerator(); + moderatorCondContr = new ConditionEditController(ureq, getWindowControl(), userCourseEnv, moderatorCondition, + AssessmentHelper.getAssessableNodes(editorModel, courseNode)); + + fireEvent(ureq, NodeEditController.NODECONFIG_CHANGED_EVENT); + listenTo(moderatorCondContr); + accessContent.put("moderatorCondition", moderatorCondContr.getInitialComponent()); + } + + @Override + public String[] getPaneKeys() { + return paneKeys; + } + + @Override + public TabbedPane getTabbedPane() { + return myTabbedPane; + } + + @Override + public void event(UserRequest ureq, Component source, Event event) { + // + } + + @Override + public void event(UserRequest ureq, Controller source, Event event) { + if (source == elementsEditCtrl) { + if (event == Event.CHANGED_EVENT) { + fireEvent(ureq, NodeEditController.NODECONFIG_CHANGED_EVENT); + } + } else if (source == readerCondContr) { + if (event == Event.CHANGED_EVENT) { + Condition cond = readerCondContr.getCondition(); + courseNode.setPreConditionReader(cond); + fireEvent(ureq, NodeEditController.NODECONFIG_CHANGED_EVENT); + } + } else if (source == posterCondContr) { + if (event == Event.CHANGED_EVENT) { + Condition cond = posterCondContr.getCondition(); + courseNode.setPreConditionPoster(cond); + fireEvent(ureq, NodeEditController.NODECONFIG_CHANGED_EVENT); + } + } else if (source == moderatorCondContr) { + if (event == Event.CHANGED_EVENT) { + Condition cond = moderatorCondContr.getCondition(); + courseNode.setPreConditionModerator(cond); + fireEvent(ureq, NodeEditController.NODECONFIG_CHANGED_EVENT); + } + } + } + + @Override + protected void doDispose() { + // + } + + @Override + public void addTabs(TabbedPane tabbedPane) { + tabbedPane.addTab(translate(PANE_TAB_ACCESSIBILITY), accessContent); + tabbedPane.addTab(translate(PANE_TAB_DIALOGCONFIG), elementsEditCtrl.getInitialComponent()); + } +} diff --git a/src/main/java/org/olat/course/nodes/dialog/ui/DialogCourseNodeRunController.java b/src/main/java/org/olat/course/nodes/dialog/ui/DialogCourseNodeRunController.java new file mode 100644 index 0000000000000000000000000000000000000000..56abc8dbfe81b2fa80977138ac4646d7d837dc21 --- /dev/null +++ b/src/main/java/org/olat/course/nodes/dialog/ui/DialogCourseNodeRunController.java @@ -0,0 +1,378 @@ +/** +* OLAT - Online Learning and Training<br> +* http://www.olat.org +* <p> +* Licensed under the Apache License, Version 2.0 (the "License"); <br> +* you may not use this file except in compliance with the License.<br> +* You may obtain a copy of the License at +* <p> +* http://www.apache.org/licenses/LICENSE-2.0 +* <p> +* Unless required by applicable law or agreed to in writing,<br> +* software distributed under the License is distributed on an "AS IS" BASIS, <br> +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> +* See the License for the specific language governing permissions and <br> +* limitations under the License. +* <p> +* Copyright (c) since 2004 at Multimedia- & E-Learning Services (MELS),<br> +* University of Zurich, Switzerland. +* <hr> +* <a href="http://www.openolat.org"> +* OpenOLAT - Online Learning and Training</a><br> +* This file has been modified by the OpenOLAT community. Changes are licensed +* under the Apache 2.0 license as the original file. +*/ + +package org.olat.course.nodes.dialog.ui; + +import java.io.File; +import java.util.List; +import java.util.UUID; + +import org.olat.core.commons.controllers.linkchooser.LinkChooserController; +import org.olat.core.commons.controllers.linkchooser.URLChoosenEvent; +import org.olat.core.commons.modules.bc.FileUploadController; +import org.olat.core.commons.modules.bc.FolderConfig; +import org.olat.core.commons.modules.bc.FolderEvent; +import org.olat.core.commons.services.notifications.NotificationsManager; +import org.olat.core.commons.services.notifications.PublisherData; +import org.olat.core.commons.services.notifications.SubscriptionContext; +import org.olat.core.commons.services.notifications.ui.ContextualSubscriptionController; +import org.olat.core.gui.UserRequest; +import org.olat.core.gui.components.Component; +import org.olat.core.gui.components.link.Link; +import org.olat.core.gui.components.link.LinkFactory; +import org.olat.core.gui.components.velocity.VelocityContainer; +import org.olat.core.gui.control.Controller; +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.control.generic.closablewrapper.CloseableModalController; +import org.olat.core.gui.control.generic.dtabs.Activateable2; +import org.olat.core.id.context.ContextEntry; +import org.olat.core.id.context.StateEntry; +import org.olat.core.util.UserSession; +import org.olat.core.util.Util; +import org.olat.core.util.WebappHelper; +import org.olat.core.util.resource.OresHelper; +import org.olat.core.util.vfs.LocalFolderImpl; +import org.olat.core.util.vfs.Quota; +import org.olat.core.util.vfs.VFSContainer; +import org.olat.core.util.vfs.VFSLeaf; +import org.olat.core.util.vfs.VFSManager; +import org.olat.course.CourseModule; +import org.olat.course.groupsandrights.CourseRights; +import org.olat.course.nodes.DialogCourseNode; +import org.olat.course.nodes.dialog.DialogElement; +import org.olat.course.nodes.dialog.DialogElementsManager; +import org.olat.course.nodes.dialog.DialogNodeForumCallback; +import org.olat.course.nodes.dialog.ReadOnlyDialogNodeForumCallback; +import org.olat.course.run.userview.NodeEvaluation; +import org.olat.course.run.userview.UserCourseEnvironment; +import org.olat.modules.fo.ForumCallback; +import org.olat.modules.fo.Message; +import org.olat.modules.fo.manager.ForumManager; +import org.olat.repository.RepositoryEntry; +import org.olat.repository.RepositoryManager; +import org.olat.util.logging.activity.LoggingResourceable; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * Initial Date: 03.11.2005 <br> + * + * @author guido + */ +public class DialogCourseNodeRunController extends BasicController implements Activateable2 { + + private Link copyButton; + private Link backButton; + private Link uploadButton; + private final VelocityContainer mainVC; + + private boolean isOlatAdmin; + private boolean isGuestOnly; + private DialogCourseNode courseNode; + private final RepositoryEntry entry; + private ForumCallback forumCallback; + private NodeEvaluation nodeEvaluation; + private SubscriptionContext subsContext; + private UserCourseEnvironment userCourseEnv; + + private CloseableModalController cmc; + private FileUploadController fileUplCtr; + private LinkChooserController fileCopyCtr; + private DialogElementController dialogCtr; + private DialogElementListController filesCtrl; + private ContextualSubscriptionController csCtr; + + @Autowired + private ForumManager forumManager; + @Autowired + private RepositoryManager repositoryManager; + @Autowired + private DialogElementsManager dialogElmsMgr; + @Autowired + private NotificationsManager notificationsManager; + + public DialogCourseNodeRunController(UserRequest ureq, WindowControl wControl, DialogCourseNode courseNode, UserCourseEnvironment userCourseEnv, + NodeEvaluation nodeEvaluation) { + super(ureq, wControl); + this.nodeEvaluation = nodeEvaluation; + this.userCourseEnv = userCourseEnv; + this.courseNode = courseNode; + entry = userCourseEnv.getCourseEnvironment().getCourseGroupManager().getCourseEntry(); + + addLoggingResourceable(LoggingResourceable.wrap(courseNode)); + + mainVC = createVelocityContainer("dialog"); + + UserSession usess = ureq.getUserSession(); + isOlatAdmin = usess.getRoles().isOLATAdmin(); + isGuestOnly = usess.getRoles().isGuestOnly(); + subsContext = isGuestOnly ? null : CourseModule.createSubscriptionContext(userCourseEnv.getCourseEnvironment(), courseNode); + forumCallback = userCourseEnv.isCourseReadOnly() ? + new ReadOnlyDialogNodeForumCallback(nodeEvaluation, isOlatAdmin, isGuestOnly, subsContext) : + new DialogNodeForumCallback(nodeEvaluation, isOlatAdmin, isGuestOnly, subsContext); + + if (subsContext != null) { + String businessPath = "[RepositoryEntry:" +entry.getKey() + "][CourseNode:" + courseNode.getIdent() + "]"; + PublisherData pdata = new PublisherData(OresHelper.calculateTypeName(DialogElement.class), "", businessPath); + csCtr = new ContextualSubscriptionController(ureq, getWindowControl(), subsContext, pdata); + listenTo(csCtr); + mainVC.put("subscription", csCtr.getInitialComponent()); + } + + backButton = LinkFactory.createLinkBack(mainVC, this); + + if (!userCourseEnv.isCourseReadOnly() + && (isOlatAdmin + || repositoryManager.isOwnerOfRepositoryEntry(getIdentity(), entry) + || userCourseEnv.getCourseEnvironment().getCourseGroupManager().hasRight(getIdentity(), CourseRights.RIGHT_COURSEEDITOR))) { + copyButton = LinkFactory.createButton("dialog.copy.file", mainVC, this); + } + + if(forumCallback.mayOpenNewThread() && !userCourseEnv.isCourseReadOnly()) { + uploadButton = LinkFactory.createButton("dialog.upload.file", mainVC, this); + uploadButton.setIconLeftCSS("o_icon o_icon-fw o_icon_upload"); + uploadButton.setElementCssClass("o_sel_dialog_upload"); + } + + filesCtrl = new DialogElementListController(ureq, getWindowControl(), userCourseEnv, courseNode, forumCallback, true); + listenTo(filesCtrl); + mainVC.put("files", filesCtrl.getInitialComponent()); + putInitialPanel(mainVC); + } + + @Override + protected void doDispose() { + // + } + + @Override + public void activate(UserRequest ureq, List<ContextEntry> entries, StateEntry state) { + if(entries == null || entries.isEmpty()) return; + + String name = entries.get(0).getOLATResourceable().getResourceableTypeName(); + if("CourseNode".equals(name)) { + back(ureq); + } else if("Message".equals(name)) { + back(ureq); + activateByMessage(ureq, entries); + } else if("Element".equals(name)) { + back(ureq); + activateByDialogElement(ureq, entries.get(0).getOLATResourceable().getResourceableId()); + } + } + + @Override + public void event(UserRequest ureq, Controller source, Event event) { + if(filesCtrl == source) { + if(event instanceof SelectRowEvent) { + SelectRowEvent sde = (SelectRowEvent)event; + doDialog(ureq, sde.getRow()); + } + } else if (source == fileUplCtr) { + if(event instanceof FolderEvent && FolderEvent.UPLOAD_EVENT.equals(event.getCommand())) { + doFinalizeUploadFile(fileUplCtr.getUploadedFile()); + } + cmc.deactivate(); + cleanUp(); + } else if (source == fileCopyCtr) { + if (event == Event.DONE_EVENT || event == Event.CANCELLED_EVENT) { + filesCtrl.loadModel(); + } else if (event instanceof URLChoosenEvent) { + URLChoosenEvent choosenEvent = (URLChoosenEvent)event; + String fileUrl = choosenEvent.getURL(); + if(fileUrl.indexOf("://") < 0) { + doCopySelectedFile(fileUrl); + filesCtrl.loadModel(); + } + } + cmc.deactivate(); + cleanUp(); + } else if (source == cmc) { + cleanUp(); + } + } + + private void cleanUp() { + if(fileUplCtr != null && fileUplCtr.getUploadedFile() != null) { + fileUplCtr.getUploadedFile().getParentContainer().deleteSilently(); + } + removeAsListenerAndDispose(fileCopyCtr); + removeAsListenerAndDispose(fileUplCtr); + removeAsListenerAndDispose(cmc); + fileCopyCtr = null; + fileUplCtr = null; + cmc = null; + } + + @Override + public void event(UserRequest ureq, Component source, Event event) { + if (source == uploadButton){ + doUploadFile(ureq); + } else if (source == copyButton) { + doCopy(ureq); + } else if(backButton == source) { + back(ureq); + } + } + + private void back(UserRequest ureq) { + mainVC.remove("forum"); + if(dialogCtr != null) { + filesCtrl.load(dialogCtr.getElement()); + removeAsListenerAndDispose(dialogCtr); + dialogCtr = null; + } + addToHistory(ureq); + } + + private void activateByMessage(UserRequest ureq, List<ContextEntry> entries) { + if(entries == null || entries.isEmpty()) return; + + Long messageKey = entries.get(0).getOLATResourceable().getResourceableId(); + Message message = forumManager.getMessageById(messageKey); + if(message == null) return; + + DialogElement element = dialogElmsMgr.getDialogElementByForum(message.getForum().getKey()); + if(!checkAccess(element)) { + return; + } + + dialogCtr = new DialogElementController(ureq, getWindowControl(), element, userCourseEnv, courseNode, nodeEvaluation); + listenTo(dialogCtr); + mainVC.put("forum", dialogCtr.getInitialComponent()); + //activate message + dialogCtr.activate(ureq, entries, null); + } + + private void activateByDialogElement(UserRequest ureq, Long elementKey) { + DialogElement element = dialogElmsMgr.getDialogElementByKey(elementKey); + if(!checkAccess(element)) { + return; + } + + dialogCtr = new DialogElementController(ureq, getWindowControl(), element, userCourseEnv, courseNode, nodeEvaluation); + listenTo(dialogCtr); + mainVC.put("forum", dialogCtr.getInitialComponent()); + } + + private boolean checkAccess(DialogElement element) { + return element != null && courseNode.getIdent().equals(element.getSubIdent()) && entry.equals(element.getEntry()); + } + + private void doDialog(UserRequest ureq, DialogElementRow row) { + removeAsListenerAndDispose(dialogCtr); + + DialogElement element = dialogElmsMgr.getDialogElementByKey(row.getDialogElementKey()); + if(element == null) { + showInfo("element.already.deleted"); + filesCtrl.loadModel(); + } else { + dialogCtr = new DialogElementController(ureq, getWindowControl(), element, userCourseEnv, courseNode, nodeEvaluation); + listenTo(dialogCtr); + mainVC.put("forum", dialogCtr.getInitialComponent()); + } + } + + private void doUploadFile(UserRequest ureq) { + removeAsListenerAndDispose(fileUplCtr); + + VFSContainer tmpContainer = new LocalFolderImpl(new File(WebappHelper.getTmpDir(), "poster_" + UUID.randomUUID())); + fileUplCtr = new FileUploadController(getWindowControl(), tmpContainer, ureq, + FolderConfig.getLimitULKB(), Quota.UNLIMITED, null, false, false, false, false, true, false); + listenTo(fileUplCtr); + + cmc = new CloseableModalController(getWindowControl(), "close", fileUplCtr.getInitialComponent(), + true, translate("dialog.upload.file")); + listenTo(cmc); + cmc.activate(); + } + + private void doFinalizeUploadFile(VFSLeaf file) { + //everything when well so save the property + DialogElement element = dialogElmsMgr.createDialogElement(entry, getIdentity(), file.getName(), file.getSize(), courseNode.getIdent()); + VFSContainer dialogContainer = dialogElmsMgr.getDialogContainer(element); + VFSManager.copyContent(file.getParentContainer(), dialogContainer); + + // inform subscription manager about new element + if (subsContext != null) { + notificationsManager.markPublisherNews(subsContext, getIdentity(), true); + } + filesCtrl.loadModel(); + } + + private void doCopy(UserRequest ureq) { + VFSContainer courseContainer = userCourseEnv.getCourseEnvironment().getCourseFolderContainer(); + fileCopyCtr = new MyLinkChooserController(ureq, getWindowControl(), courseContainer, null); + listenTo(fileCopyCtr); + + removeAsListenerAndDispose(cmc); + cmc = new CloseableModalController(getWindowControl(), "close", fileCopyCtr.getInitialComponent(), + true, translate("dialog.copy.file")); + listenTo(cmc); + cmc.activate(); + } + + private void doCopySelectedFile(String fileUrl) { + VFSContainer courseContainer = userCourseEnv.getCourseEnvironment().getCourseFolderContainer(); + VFSLeaf vl = (VFSLeaf) courseContainer.resolve(fileUrl); + DialogElement newElement = dialogElmsMgr.createDialogElement(entry, getIdentity(), + vl.getName(), vl.getSize(), courseNode.getIdent()); + + //copy file + VFSContainer dialogContainer = dialogElmsMgr.getDialogContainer(newElement); + VFSLeaf copyVl = dialogContainer.createChildLeaf(vl.getName()); + if(copyVl == null) { + copyVl = (VFSLeaf)dialogContainer.resolve(vl.getName()); + } + VFSManager.copyContent(vl, copyVl); + + // inform subscription manager about new element + if (subsContext != null) { + notificationsManager.markPublisherNews(subsContext, getIdentity(), true); + } + filesCtrl.loadModel(); + } + + private class MyLinkChooserController extends LinkChooserController { + + public MyLinkChooserController(UserRequest ureq, WindowControl wControl, VFSContainer rootDir, String uploadRelPath) { + super(ureq, wControl, rootDir, uploadRelPath, null, null, false, "", null, true); + } + + @Override + //this is a hack to overwrite the package used by the BasicController + protected VelocityContainer createVelocityContainer(String page) { + setTranslator(Util.createPackageTranslator(LinkChooserController.class, getLocale())); + velocity_root = Util.getPackageVelocityRoot(LinkChooserController.class); + return super.createVelocityContainer(page); + } + + @Override + public void event(UserRequest ureq, Controller source, Event event) { + fireEvent(ureq, event); + } + } +} diff --git a/src/main/java/org/olat/course/nodes/dialog/ui/DialogElementController.java b/src/main/java/org/olat/course/nodes/dialog/ui/DialogElementController.java new file mode 100644 index 0000000000000000000000000000000000000000..50eedc1a65931b604b500a89fec9711353e5ac76 --- /dev/null +++ b/src/main/java/org/olat/course/nodes/dialog/ui/DialogElementController.java @@ -0,0 +1,155 @@ +/** + * <a href="http://www.openolat.org"> + * OpenOLAT - Online Learning and Training</a><br> + * <p> + * Licensed under the Apache License, Version 2.0 (the "License"); <br> + * you may not use this file except in compliance with the License.<br> + * You may obtain a copy of the License at the + * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a> + * <p> + * Unless required by applicable law or agreed to in writing,<br> + * software distributed under the License is distributed on an "AS IS" BASIS, <br> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> + * See the License for the specific language governing permissions and <br> + * limitations under the License. + * <p> + * Initial code contributed and copyrighted by<br> + * frentix GmbH, http://www.frentix.com + * <p> + */ +package org.olat.course.nodes.dialog.ui; + +import java.util.List; + +import org.olat.core.commons.services.notifications.SubscriptionContext; +import org.olat.core.gui.UserRequest; +import org.olat.core.gui.components.Component; +import org.olat.core.gui.components.link.Link; +import org.olat.core.gui.components.link.LinkFactory; +import org.olat.core.gui.components.velocity.VelocityContainer; +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.control.generic.dtabs.Activateable2; +import org.olat.core.gui.media.NotFoundMediaResource; +import org.olat.core.gui.util.CSSHelper; +import org.olat.core.id.context.ContextEntry; +import org.olat.core.id.context.StateEntry; +import org.olat.core.logging.activity.CourseLoggingAction; +import org.olat.core.logging.activity.ThreadLocalUserActivityLogger; +import org.olat.core.util.Formatter; +import org.olat.core.util.StringHelper; +import org.olat.core.util.UserSession; +import org.olat.core.util.resource.OresHelper; +import org.olat.core.util.vfs.VFSLeaf; +import org.olat.core.util.vfs.VFSMediaResource; +import org.olat.course.CourseModule; +import org.olat.course.nodes.CourseNode; +import org.olat.course.nodes.dialog.DialogElement; +import org.olat.course.nodes.dialog.DialogElementsManager; +import org.olat.course.nodes.dialog.DialogNodeForumCallback; +import org.olat.course.nodes.dialog.ReadOnlyDialogNodeForumCallback; +import org.olat.course.run.userview.NodeEvaluation; +import org.olat.course.run.userview.UserCourseEnvironment; +import org.olat.modules.fo.Forum; +import org.olat.modules.fo.ForumCallback; +import org.olat.modules.fo.ui.ForumController; +import org.olat.user.UserManager; +import org.olat.util.logging.activity.LoggingResourceable; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * + * Initial date: 3 janv. 2018<br> + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + * + */ +public class DialogElementController extends BasicController implements Activateable2 { + + private final Link downloadLink; + private final VelocityContainer mainVC; + + private final ForumController forumCtr; + + private final DialogElement element; + + @Autowired + private UserManager userManager; + @Autowired + private DialogElementsManager dialogElmsMgr; + + public DialogElementController(UserRequest ureq, WindowControl wControl, DialogElement element, + UserCourseEnvironment userCourseEnv, CourseNode courseNode, NodeEvaluation nodeEvaluation) { + super(ureq, wControl); + this.element = element; + + Forum forum = element.getForum(); + UserSession usess = ureq.getUserSession(); + boolean isOlatAdmin = usess.getRoles().isOLATAdmin(); + boolean isGuestOnly = usess.getRoles().isGuestOnly(); + + SubscriptionContext subsContext = CourseModule.createSubscriptionContext(userCourseEnv.getCourseEnvironment(), courseNode, forum.getKey().toString()); + ForumCallback forumCallback = userCourseEnv.isCourseReadOnly() ? + new ReadOnlyDialogNodeForumCallback(nodeEvaluation, isOlatAdmin, isGuestOnly, subsContext) : + new DialogNodeForumCallback(nodeEvaluation, isOlatAdmin, isGuestOnly, subsContext); + forumCtr = new ForumController(ureq, wControl, forum, forumCallback, !isGuestOnly); + listenTo(forumCtr); + + mainVC = createVelocityContainer("discussion"); + + downloadLink = LinkFactory.createLink("download", "download", getTranslator(), mainVC, this, Link.LINK | Link.NONTRANSLATED); + downloadLink.setCustomDisplayText(StringHelper.escapeHtml(element.getFilename())); + downloadLink.setIconLeftCSS("o_icon o_icon-fw " + CSSHelper.createFiletypeIconCssClassFor(element.getFilename())); + downloadLink.setTarget("_blank"); + + mainVC.contextPut("filename", StringHelper.escapeHtml(element.getFilename())); + if(element.getSize() != null && element.getSize().longValue() > 0) { + mainVC.contextPut("size", Formatter.formatBytes(element.getSize().longValue())); + } + String author = userManager.getUserDisplayName(element.getAuthor()); + mainVC.contextPut("author", StringHelper.escapeHtml(author)); + + mainVC.put("forum", forumCtr.getInitialComponent()); + putInitialPanel(mainVC); + + addToHistory(ureq, OresHelper.createOLATResourceableInstance("Element", element.getKey()), null); + } + + public DialogElement getElement() { + return element; + } + + @Override + protected void doDispose() { + // + } + + @Override + protected void event(UserRequest ureq, Component source, Event event) { + if(downloadLink == source) { + doDownload(ureq); + } + } + + @Override + public void activate(UserRequest ureq, List<ContextEntry> entries, StateEntry state) { + if(entries == null || entries.isEmpty()) return; + + String name = entries.get(0).getOLATResourceable().getResourceableTypeName(); + if("Message".equals(name)) { + forumCtr.activate(ureq, entries, state); + } + } + + private void doDownload(UserRequest ureq) { + VFSLeaf file = dialogElmsMgr.getDialogLeaf(element); + if(file != null) { + ureq.getDispatchResult().setResultingMediaResource(new VFSMediaResource(file)); + ThreadLocalUserActivityLogger.log(CourseLoggingAction.DIALOG_ELEMENT_FILE_DOWNLOADED, getClass(), + LoggingResourceable.wrapBCFile(element.getFilename())); + } else { + ureq.getDispatchResult().setResultingMediaResource(new NotFoundMediaResource(element.getFilename())); + logError("No file to discuss: " + element, null); + } + } +} \ No newline at end of file diff --git a/src/main/java/org/olat/course/nodes/dialog/ui/DialogElementListController.java b/src/main/java/org/olat/course/nodes/dialog/ui/DialogElementListController.java new file mode 100644 index 0000000000000000000000000000000000000000..386796186a68f558276aa90fa79d724ea51ad349 --- /dev/null +++ b/src/main/java/org/olat/course/nodes/dialog/ui/DialogElementListController.java @@ -0,0 +1,286 @@ +/** + * <a href="http://www.openolat.org"> + * OpenOLAT - Online Learning and Training</a><br> + * <p> + * Licensed under the Apache License, Version 2.0 (the "License"); <br> + * you may not use this file except in compliance with the License.<br> + * You may obtain a copy of the License at the + * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a> + * <p> + * Unless required by applicable law or agreed to in writing,<br> + * software distributed under the License is distributed on an "AS IS" BASIS, <br> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> + * See the License for the specific language governing permissions and <br> + * limitations under the License. + * <p> + * Initial code contributed and copyrighted by<br> + * frentix GmbH, http://www.frentix.com + * <p> + */ +package org.olat.course.nodes.dialog.ui; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; + +import org.olat.basesecurity.BaseSecurityModule; +import org.olat.core.gui.UserRequest; +import org.olat.core.gui.components.form.flexible.FormItem; +import org.olat.core.gui.components.form.flexible.FormItemContainer; +import org.olat.core.gui.components.form.flexible.elements.DownloadLink; +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.DefaultFlexiColumnModel; +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.control.Controller; +import org.olat.core.gui.control.Event; +import org.olat.core.gui.control.WindowControl; +import org.olat.core.gui.control.generic.dtabs.Activateable2; +import org.olat.core.gui.control.generic.modal.DialogBoxController; +import org.olat.core.gui.control.generic.modal.DialogBoxUIFactory; +import org.olat.core.id.context.ContextEntry; +import org.olat.core.id.context.StateEntry; +import org.olat.core.logging.activity.CourseLoggingAction; +import org.olat.core.logging.activity.ThreadLocalUserActivityLogger; +import org.olat.core.util.Util; +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.VFSMediaResource; +import org.olat.core.util.vfs.filters.VFSLeafFilter; +import org.olat.course.CourseFactory; +import org.olat.course.nodes.DialogCourseNode; +import org.olat.course.nodes.dialog.DialogElement; +import org.olat.course.nodes.dialog.DialogElementsManager; +import org.olat.course.nodes.dialog.ui.DialogElementsTableModel.DialogCols; +import org.olat.course.run.userview.UserCourseEnvironment; +import org.olat.modules.fo.ForumCallback; +import org.olat.modules.fo.manager.ForumManager; +import org.olat.repository.RepositoryEntry; +import org.olat.user.UserManager; +import org.olat.user.propertyhandlers.UserPropertyHandler; +import org.olat.util.logging.activity.LoggingResourceable; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * + * The list of files to discuss. + * + * Initial date: 3 janv. 2018<br> + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + * + */ +public class DialogElementListController extends FormBasicController implements Activateable2 { + + public static final int USER_PROPS_OFFSET = 500; + public static final String usageIdentifyer = DialogElementsTableModel.class.getCanonicalName(); + + private FlexiTableElement tableEl; + private DialogElementsTableModel tableModel; + + private int counter = 0; + private final boolean showForum; + private final DialogCourseNode courseNode; + private final ForumCallback forumCallback; + private final UserCourseEnvironment userCourseEnv; + private final boolean isAdministrativeUser; + private final List<UserPropertyHandler> userPropertyHandlers; + + private DialogBoxController confirmDeletionCtr; + + + @Autowired + private UserManager userManager; + @Autowired + private ForumManager forumManager; + @Autowired + private BaseSecurityModule securityModule; + @Autowired + private DialogElementsManager dialogElementsManager; + + public DialogElementListController(UserRequest ureq, WindowControl wControl, UserCourseEnvironment userCourseEnv, + DialogCourseNode courseNode, ForumCallback forumCallback, boolean showForum) { + super(ureq, wControl, "element_list"); + setTranslator(Util.createPackageTranslator(DialogCourseNodeRunController.class, getLocale())); + setTranslator(userManager.getPropertyHandlerTranslator(getTranslator())); + + this.showForum = showForum; + this.courseNode = courseNode; + this.userCourseEnv = userCourseEnv; + this.forumCallback = forumCallback; + + isAdministrativeUser = securityModule.isUserAllowedAdminProps(ureq.getUserSession().getRoles()); + userPropertyHandlers = userManager.getUserPropertyHandlersFor(usageIdentifyer, isAdministrativeUser); + + initForm(ureq); + loadModel(); + } + + @Override + protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) { + FlexiTableColumnModel columnsModel = FlexiTableDataModelFactory.createFlexiTableColumnModel(); + columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(DialogCols.filename)); + + //list of user properties + if(isAdministrativeUser) { + columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(DialogCols.authorUsername)); + } + + int colIndex = USER_PROPS_OFFSET; + for (int i = 0; i < userPropertyHandlers.size(); i++) { + UserPropertyHandler userPropertyHandler = userPropertyHandlers.get(i); + boolean visible = UserManager.getInstance().isMandatoryUserProperty(usageIdentifyer , userPropertyHandler); + columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(visible, userPropertyHandler.i18nColumnDescriptorLabelKey(), colIndex, null, true, "userProp-" + colIndex)); + colIndex++; + } + + columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(DialogCols.date)); + + if(showForum) { + columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(DialogCols.messages)); + columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(DialogCols.newMessages)); + StaticFlexiCellRenderer forumRenderer = new StaticFlexiCellRenderer(translate("dialog.start"), "forum", null, null); + forumRenderer.setIconRightCSS("o_icon o_icon-fw o_icon_start"); + columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel("table.header.forum", -1, "forum", forumRenderer)); + } + + if (!userCourseEnv.isCourseReadOnly() && forumCallback != null && forumCallback.mayDeleteMessageAsModerator()) { + StaticFlexiCellRenderer deleteRenderer = new StaticFlexiCellRenderer(translate("delete"), "delete", null, "o_icon o_icon_delete_item"); + columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel("table.header.action", -1, "delete", deleteRenderer)); + } + + tableModel = new DialogElementsTableModel(columnsModel); + tableEl = uifactory.addTableElement(getWindowControl(), "table", tableModel, getTranslator(), formLayout); + tableEl.setAndLoadPersistedPreferences(ureq, "dialog.elements"); + tableEl.setPageSize(25); + } + + protected void loadModel() { + RepositoryEntry entry = userCourseEnv.getCourseEnvironment().getCourseGroupManager().getCourseEntry(); + List<DialogElement> elements = dialogElementsManager.getDialogElements(entry, courseNode.getIdent()); + List<DialogElementRow> rows = new ArrayList<>(elements.size()); + + for (DialogElement element : elements) { + DialogElementRow row = new DialogElementRow(element, userPropertyHandlers, getLocale()); + + int msgCount = forumManager.countMessagesByForumID(element.getForum().getKey()); + int newMsg = msgCount - forumManager.countReadMessagesByUserAndForum(getIdentity(), element.getForum().getKey()); + row.setNumOfMessages(msgCount); + row.setNumOfUnreadMessages(newMsg); + + VFSLeaf item = dialogElementsManager.getDialogLeaf(element); + if(item != null) { + DownloadLink downloadLink = uifactory.addDownloadLink("file_" + (++counter), row.getFilename(), null, item, flc); + row.setDownloadLink(downloadLink); + } + rows.add(row); + } + tableModel.setObjects(rows); + tableEl.reset(true, true, true); + } + + protected void load(DialogElement element) { + if(element == null) return; + + List<DialogElementRow> rows = tableModel.getObjects(); + for(DialogElementRow row:rows) { + if(element.getKey().equals(row.getDialogElementKey())) { + int msgCount = forumManager.countMessagesByForumID(element.getForum().getKey()); + int newMsg = msgCount - forumManager.countReadMessagesByUserAndForum(getIdentity(), element.getForum().getKey()); + row.setNumOfMessages(msgCount); + row.setNumOfUnreadMessages(newMsg); + tableEl.reset(false, false, true); + } + } + } + + @Override + protected void doDispose() { + // + } + + @Override + public void activate(UserRequest ureq, List<ContextEntry> entries, StateEntry state) { + // + } + + @Override + protected void event(UserRequest ureq, Controller source, Event event) { + if (source == confirmDeletionCtr) { + if (DialogBoxUIFactory.isYesEvent(event) || DialogBoxUIFactory.isOkEvent(event)) { + doDelete((DialogElementRow)confirmDeletionCtr.getUserObject()); + loadModel(); + } + } + super.event(ureq, source, event); + } + + @Override + protected void formOK(UserRequest ureq) { + // + } + + @Override + protected void formInnerEvent(UserRequest ureq, FormItem source, FormEvent event) { + if(source == tableEl) { + if(event instanceof SelectionEvent) { + SelectionEvent se = (SelectionEvent)event; + DialogElementRow row = tableModel.getObject(se.getIndex()); + if("forum".equals(se.getCommand())) { + fireEvent(ureq, new SelectRowEvent(row)); + } else if("delete".equals(se.getCommand())) { + doConfirmDelete(ureq, row); + } + } + } else if(source instanceof FormLink) { + FormLink link = (FormLink)source; + String cmd = link.getCmd(); + if("download".equals(cmd)) { + doFileDelivery(ureq, (DialogElement)link.getUserObject()); + } + } + super.formInnerEvent(ureq, source, event); + } + + private void doConfirmDelete(UserRequest ureq, DialogElementRow row) { + String msg = translate("element.delete", row.getFilename()); + confirmDeletionCtr = activateYesNoDialog(ureq, translate("delete"), msg, confirmDeletionCtr); + confirmDeletionCtr.setUserObject(row); + } + + private void doDelete(DialogElementRow rowToDelete) { + DialogElement elementToDelete = dialogElementsManager.getDialogElementByKey(rowToDelete.getDialogElementKey()); + // archive data to personal folder + File exportDir = CourseFactory.getOrCreateDataExportDirectory(getIdentity(), courseNode.getShortTitle()); + courseNode.doArchiveElement(elementToDelete, exportDir, getLocale()); + + dialogElementsManager.deleteDialogElement(elementToDelete); + //do logging + ThreadLocalUserActivityLogger.log(CourseLoggingAction.DIALOG_ELEMENT_FILE_DELETED, getClass(), + LoggingResourceable.wrapUploadFile(elementToDelete.getFilename())); + } + + /** + * deliver the selected file and show in a popup + * + * @param ureq + * @param command + */ + private void doFileDelivery(UserRequest ureq, DialogElement element) { + VFSContainer forumContainer = dialogElementsManager.getDialogContainer(element); + List<VFSItem> items = forumContainer.getItems(new VFSLeafFilter()); + if(items.size() > 0 && items.get(0) instanceof VFSLeaf) { + VFSLeaf vl = (VFSLeaf)items.get(0); + ureq.getDispatchResult().setResultingMediaResource(new VFSMediaResource(vl)); + ThreadLocalUserActivityLogger.log(CourseLoggingAction.DIALOG_ELEMENT_FILE_DOWNLOADED, getClass(), + LoggingResourceable.wrapBCFile(vl.getName())); + } else { + logError("No file to discuss: " + forumContainer, null); + } + } +} diff --git a/src/main/java/org/olat/course/nodes/dialog/ui/DialogElementListEditController.java b/src/main/java/org/olat/course/nodes/dialog/ui/DialogElementListEditController.java new file mode 100644 index 0000000000000000000000000000000000000000..97d17daccf66a794c0d409391dc847933d3273ff --- /dev/null +++ b/src/main/java/org/olat/course/nodes/dialog/ui/DialogElementListEditController.java @@ -0,0 +1,204 @@ +/** + * <a href="http://www.openolat.org"> + * OpenOLAT - Online Learning and Training</a><br> + * <p> + * Licensed under the Apache License, Version 2.0 (the "License"); <br> + * you may not use this file except in compliance with the License.<br> + * You may obtain a copy of the License at the + * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a> + * <p> + * Unless required by applicable law or agreed to in writing,<br> + * software distributed under the License is distributed on an "AS IS" BASIS, <br> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> + * See the License for the specific language governing permissions and <br> + * limitations under the License. + * <p> + * Initial code contributed and copyrighted by<br> + * frentix GmbH, http://www.frentix.com + * <p> + */ +package org.olat.course.nodes.dialog.ui; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; + +import org.olat.basesecurity.BaseSecurityModule; +import org.olat.core.gui.UserRequest; +import org.olat.core.gui.components.form.flexible.FormItem; +import org.olat.core.gui.components.form.flexible.FormItemContainer; +import org.olat.core.gui.components.form.flexible.elements.DownloadLink; +import org.olat.core.gui.components.form.flexible.elements.FlexiTableElement; +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.DefaultFlexiColumnModel; +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.control.Controller; +import org.olat.core.gui.control.Event; +import org.olat.core.gui.control.WindowControl; +import org.olat.core.gui.control.generic.modal.DialogBoxController; +import org.olat.core.gui.control.generic.modal.DialogBoxUIFactory; +import org.olat.core.logging.activity.CourseLoggingAction; +import org.olat.core.logging.activity.ThreadLocalUserActivityLogger; +import org.olat.core.util.Util; +import org.olat.core.util.vfs.VFSLeaf; +import org.olat.course.CourseFactory; +import org.olat.course.nodes.DialogCourseNode; +import org.olat.course.nodes.dialog.DialogElement; +import org.olat.course.nodes.dialog.DialogElementsManager; +import org.olat.course.nodes.dialog.ui.DialogElementsTableModel.DialogCols; +import org.olat.repository.RepositoryEntry; +import org.olat.user.UserManager; +import org.olat.user.propertyhandlers.UserPropertyHandler; +import org.olat.util.logging.activity.LoggingResourceable; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * + * The list of files to discuss use in the course element editor. + * + * Initial date: 3 janv. 2018<br> + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + * + */ +public class DialogElementListEditController extends FormBasicController { + + public static final int USER_PROPS_OFFSET = 500; + public static final String usageIdentifyer = DialogElementsTableModel.class.getCanonicalName(); + + private FlexiTableElement tableEl; + private DialogElementsTableModel tableModel; + + private int counter = 0; + private final RepositoryEntry entry; + private final DialogCourseNode courseNode; + private final boolean isAdministrativeUser; + private final List<UserPropertyHandler> userPropertyHandlers; + + private DialogBoxController confirmDeletionCtr; + + @Autowired + private UserManager userManager; + @Autowired + private BaseSecurityModule securityModule; + @Autowired + private DialogElementsManager dialogElementsManager; + + public DialogElementListEditController(UserRequest ureq, WindowControl wControl, RepositoryEntry entry, + DialogCourseNode courseNode) { + super(ureq, wControl, "element_list"); + setTranslator(Util.createPackageTranslator(DialogCourseNodeRunController.class, getLocale())); + setTranslator(userManager.getPropertyHandlerTranslator(getTranslator())); + + this.entry = entry; + this.courseNode = courseNode; + + isAdministrativeUser = securityModule.isUserAllowedAdminProps(ureq.getUserSession().getRoles()); + userPropertyHandlers = userManager.getUserPropertyHandlersFor(usageIdentifyer, isAdministrativeUser); + + initForm(ureq); + loadModel(); + } + + @Override + protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) { + FlexiTableColumnModel columnsModel = FlexiTableDataModelFactory.createFlexiTableColumnModel(); + columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(DialogCols.filename)); + + //list of user properties + if(isAdministrativeUser) { + columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(DialogCols.authorUsername)); + } + + int colIndex = USER_PROPS_OFFSET; + for (int i = 0; i < userPropertyHandlers.size(); i++) { + UserPropertyHandler userPropertyHandler = userPropertyHandlers.get(i); + boolean visible = UserManager.getInstance().isMandatoryUserProperty(usageIdentifyer , userPropertyHandler); + columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(visible, userPropertyHandler.i18nColumnDescriptorLabelKey(), colIndex, null, true, "userProp-" + colIndex)); + colIndex++; + } + + columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(DialogCols.date)); + + StaticFlexiCellRenderer deleteRenderer = new StaticFlexiCellRenderer(translate("delete"), "delete", null, "o_icon o_icon_delete_item"); + columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel("table.header.action", -1, "delete", deleteRenderer)); + + tableModel = new DialogElementsTableModel(columnsModel); + tableEl = uifactory.addTableElement(getWindowControl(), "table", tableModel, getTranslator(), formLayout); + tableEl.setAndLoadPersistedPreferences(ureq, "dialog.elements"); + tableEl.setPageSize(25); + } + + protected void loadModel() { + List<DialogElement> elements = dialogElementsManager.getDialogElements(entry, courseNode.getIdent()); + List<DialogElementRow> rows = new ArrayList<>(elements.size()); + + for (DialogElement element : elements) { + DialogElementRow row = new DialogElementRow(element, userPropertyHandlers, getLocale()); + VFSLeaf item = dialogElementsManager.getDialogLeaf(element); + if(item != null) { + DownloadLink downloadLink = uifactory.addDownloadLink("file_" + (++counter), row.getFilename(), null, item, flc); + row.setDownloadLink(downloadLink); + } + rows.add(row); + } + tableModel.setObjects(rows); + tableEl.reset(true, true, true); + } + + @Override + protected void doDispose() { + // + } + + @Override + protected void event(UserRequest ureq, Controller source, Event event) { + if (source == confirmDeletionCtr) { + if (DialogBoxUIFactory.isYesEvent(event) || DialogBoxUIFactory.isOkEvent(event)) { + doDelete((DialogElementRow)confirmDeletionCtr.getUserObject()); + loadModel(); + } + } + super.event(ureq, source, event); + } + + @Override + protected void formOK(UserRequest ureq) { + // + } + + @Override + protected void formInnerEvent(UserRequest ureq, FormItem source, FormEvent event) { + if(source == tableEl) { + if(event instanceof SelectionEvent) { + SelectionEvent se = (SelectionEvent)event; + DialogElementRow row = tableModel.getObject(se.getIndex()); + if("delete".equals(se.getCommand())) { + doConfirmDelete(ureq, row); + } + } + } + super.formInnerEvent(ureq, source, event); + } + + private void doConfirmDelete(UserRequest ureq, DialogElementRow row) { + String msg = translate("element.delete", row.getFilename()); + confirmDeletionCtr = activateYesNoDialog(ureq, translate("delete"), msg, confirmDeletionCtr); + confirmDeletionCtr.setUserObject(row); + } + + private void doDelete(DialogElementRow rowToDelete) { + DialogElement elementToDelete = dialogElementsManager.getDialogElementByKey(rowToDelete.getDialogElementKey()); + // archive data to personal folder + File exportDir = CourseFactory.getOrCreateDataExportDirectory(getIdentity(), courseNode.getShortTitle()); + courseNode.doArchiveElement(elementToDelete, exportDir, getLocale()); + + dialogElementsManager.deleteDialogElement(elementToDelete); + //do logging + ThreadLocalUserActivityLogger.log(CourseLoggingAction.DIALOG_ELEMENT_FILE_DELETED, getClass(), + LoggingResourceable.wrapUploadFile(elementToDelete.getFilename())); + } +} diff --git a/src/main/java/org/olat/course/nodes/dialog/ui/DialogElementRow.java b/src/main/java/org/olat/course/nodes/dialog/ui/DialogElementRow.java new file mode 100644 index 0000000000000000000000000000000000000000..fe455dd98fdecd41f99739d76dfc64c949e140d4 --- /dev/null +++ b/src/main/java/org/olat/course/nodes/dialog/ui/DialogElementRow.java @@ -0,0 +1,90 @@ +/** + * <a href="http://www.openolat.org"> + * OpenOLAT - Online Learning and Training</a><br> + * <p> + * Licensed under the Apache License, Version 2.0 (the "License"); <br> + * you may not use this file except in compliance with the License.<br> + * You may obtain a copy of the License at the + * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a> + * <p> + * Unless required by applicable law or agreed to in writing,<br> + * software distributed under the License is distributed on an "AS IS" BASIS, <br> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> + * See the License for the specific language governing permissions and <br> + * limitations under the License. + * <p> + * Initial code contributed and copyrighted by<br> + * frentix GmbH, http://www.frentix.com + * <p> + */ +package org.olat.course.nodes.dialog.ui; + +import java.util.Date; +import java.util.List; +import java.util.Locale; + +import org.olat.core.gui.components.form.flexible.elements.DownloadLink; +import org.olat.course.nodes.dialog.DialogElement; +import org.olat.user.UserPropertiesRow; +import org.olat.user.propertyhandlers.UserPropertyHandler; + +/** + * + * Initial date: 4 janv. 2018<br> + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + * + */ +public class DialogElementRow extends UserPropertiesRow { + + private final DialogElement element; + + private DownloadLink downloadLink; + + private int numOfMessages; + private int numOfUnreadMessages; + + public DialogElementRow(DialogElement element, List<UserPropertyHandler> userPropertyHandlers, Locale locale) { + super(element.getAuthor(), userPropertyHandlers, locale); + this.element = element; + } + + public Date getCreationDate() { + return element.getCreationDate(); + } + + public String getFilename() { + return element.getFilename(); + } + + public Long getSize() { + return element.getSize(); + } + + public int getNumOfMessages() { + return numOfMessages; + } + + public void setNumOfMessages(int numOfMessages) { + this.numOfMessages = numOfMessages; + } + + public int getNumOfUnreadMessages() { + return numOfUnreadMessages; + } + + public void setNumOfUnreadMessages(int numOfUnreadMessages) { + this.numOfUnreadMessages = numOfUnreadMessages; + } + + public Long getDialogElementKey() { + return element.getKey(); + } + + public DownloadLink getDownloadLink() { + return downloadLink; + } + + public void setDownloadLink(DownloadLink downloadLink) { + this.downloadLink = downloadLink; + } +} diff --git a/src/main/java/org/olat/course/nodes/dialog/ui/DialogElementsEditController.java b/src/main/java/org/olat/course/nodes/dialog/ui/DialogElementsEditController.java new file mode 100644 index 0000000000000000000000000000000000000000..c7979877b5f32c65dad761e7860dce9d168e6c3e --- /dev/null +++ b/src/main/java/org/olat/course/nodes/dialog/ui/DialogElementsEditController.java @@ -0,0 +1,175 @@ +/** + * <a href="http://www.openolat.org"> + * OpenOLAT - Online Learning and Training</a><br> + * <p> + * Licensed under the Apache License, Version 2.0 (the "License"); <br> + * you may not use this file except in compliance with the License.<br> + * You may obtain a copy of the License at the + * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a> + * <p> + * Unless required by applicable law or agreed to in writing,<br> + * software distributed under the License is distributed on an "AS IS" BASIS, <br> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> + * See the License for the specific language governing permissions and <br> + * limitations under the License. + * <p> + * Initial code contributed and copyrighted by<br> + * frentix GmbH, http://www.frentix.com + * <p> + */ +package org.olat.course.nodes.dialog.ui; + +import java.io.File; +import java.util.UUID; + +import org.olat.core.commons.modules.bc.FileUploadController; +import org.olat.core.commons.modules.bc.FolderConfig; +import org.olat.core.commons.modules.bc.FolderEvent; +import org.olat.core.commons.services.notifications.NotificationsManager; +import org.olat.core.commons.services.notifications.SubscriptionContext; +import org.olat.core.gui.UserRequest; +import org.olat.core.gui.components.Component; +import org.olat.core.gui.components.link.Link; +import org.olat.core.gui.components.link.LinkFactory; +import org.olat.core.gui.components.velocity.VelocityContainer; +import org.olat.core.gui.control.Controller; +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.control.generic.closablewrapper.CloseableModalController; +import org.olat.core.logging.activity.CourseLoggingAction; +import org.olat.core.logging.activity.ThreadLocalUserActivityLogger; +import org.olat.core.util.WebappHelper; +import org.olat.core.util.vfs.LocalFolderImpl; +import org.olat.core.util.vfs.Quota; +import org.olat.core.util.vfs.VFSContainer; +import org.olat.core.util.vfs.VFSLeaf; +import org.olat.core.util.vfs.VFSManager; +import org.olat.course.CourseModule; +import org.olat.course.nodes.DialogCourseNode; +import org.olat.course.nodes.dialog.DialogElement; +import org.olat.course.nodes.dialog.DialogElementsManager; +import org.olat.course.run.environment.CourseEnvironment; +import org.olat.repository.RepositoryEntry; +import org.olat.util.logging.activity.LoggingResourceable; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * + * Initial date: 4 janv. 2018<br> + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + * + */ +public class DialogElementsEditController extends BasicController { + + private final Link uploadButton; + private final VelocityContainer mainVC; + + private DialogConfigForm configForumLaunch; + private FileUploadController fileUplCtr; + private CloseableModalController cmc; + private DialogElementListEditController elementListCtrl; + + private final DialogCourseNode courseNode; + private final CourseEnvironment courseEnv; + private final RepositoryEntry entry; + + @Autowired + private DialogElementsManager dialogElmsMgr; + @Autowired + private NotificationsManager notificationsManager; + + public DialogElementsEditController(UserRequest ureq, WindowControl wControl, CourseEnvironment courseEnv, DialogCourseNode courseNode) { + super(ureq, wControl); + this.courseNode = courseNode; + this.courseEnv = courseEnv; + entry = courseEnv.getCourseGroupManager().getCourseEntry(); + + mainVC = createVelocityContainer("edit"); + + uploadButton = LinkFactory.createButton("dialog.upload.file", mainVC, this); + uploadButton.setIconLeftCSS("o_icon o_icon-fw o_icon_upload"); + uploadButton.setElementCssClass("o_sel_dialog_upload"); + + configForumLaunch = new DialogConfigForm(ureq, getWindowControl(), courseNode.getModuleConfiguration()); + listenTo(configForumLaunch); + mainVC.put("showForumAsPopupConfigForm", configForumLaunch.getInitialComponent()); + + elementListCtrl = new DialogElementListEditController(ureq, getWindowControl(), entry, courseNode); + listenTo(elementListCtrl); + mainVC.put("dialogElementsTable", elementListCtrl.getInitialComponent()); + + putInitialPanel(mainVC); + } + + @Override + protected void doDispose() { + // + } + + @Override + protected void event(UserRequest ureq, Component source, Event event) { + if (source == uploadButton) { + doUpload(ureq); + } + } + + @Override + protected void event(UserRequest ureq, Controller source, Event event) { + if(configForumLaunch == source) { + fireEvent(ureq, event); + } else if (source == fileUplCtr) { + if (event == Event.DONE_EVENT || event == Event.CANCELLED_EVENT) { + elementListCtrl.loadModel(); + } else if (event.getCommand().equals(FolderEvent.UPLOAD_EVENT)) { + doFinalizeUploadFile(fileUplCtr.getUploadedFile()); + } + cmc.deactivate(); + cleanUp(); + } else if(cmc == source) { + cleanUp(); + } + super.event(ureq, source, event); + } + + private void cleanUp() { + if(fileUplCtr != null && fileUplCtr.getUploadedFile() != null) { + fileUplCtr.getUploadedFile().getParentContainer().deleteSilently(); + } + removeAsListenerAndDispose(fileUplCtr); + removeAsListenerAndDispose(cmc); + fileUplCtr = null; + cmc = null; + } + + private void doUpload(UserRequest ureq) { + removeAsListenerAndDispose(fileUplCtr); + + VFSContainer tmpContainer = new LocalFolderImpl(new File(WebappHelper.getTmpDir(), "poster_" + UUID.randomUUID())); + fileUplCtr = new FileUploadController(getWindowControl(), tmpContainer, ureq, + FolderConfig.getLimitULKB(), Quota.UNLIMITED, null, false, false, false, false, true, false); + listenTo(fileUplCtr); + + cmc = new CloseableModalController(getWindowControl(), "close", fileUplCtr.getInitialComponent(), + true, translate("dialog.upload.file")); + listenTo(cmc); + cmc.activate(); + } + + private void doFinalizeUploadFile(VFSLeaf file) { + if(file == null) return; + + //everything when well so save the property + DialogElement element = dialogElmsMgr.createDialogElement(entry, getIdentity(), file.getName(), file.getSize(), courseNode.getIdent()); + VFSContainer dialogContainer = dialogElmsMgr.getDialogContainer(element); + VFSManager.copyContent(file.getParentContainer(), dialogContainer); + + // inform subscription manager about new element + SubscriptionContext subsContext = CourseModule.createSubscriptionContext(courseEnv, courseNode); + notificationsManager.markPublisherNews(subsContext, getIdentity(), true); + + ThreadLocalUserActivityLogger.log(CourseLoggingAction.DIALOG_ELEMENT_FILE_UPLOADED, getClass(), + LoggingResourceable.wrapUploadFile(file.getName())); + elementListCtrl.loadModel(); + } +} \ No newline at end of file diff --git a/src/main/java/org/olat/course/nodes/dialog/ui/DialogElementsTableModel.java b/src/main/java/org/olat/course/nodes/dialog/ui/DialogElementsTableModel.java new file mode 100644 index 0000000000000000000000000000000000000000..2db241a637755bf4416ce1563f74f098b0b2eb41 --- /dev/null +++ b/src/main/java/org/olat/course/nodes/dialog/ui/DialogElementsTableModel.java @@ -0,0 +1,93 @@ +/** + * <a href="http://www.openolat.org"> + * OpenOLAT - Online Learning and Training</a><br> + * <p> + * Licensed under the Apache License, Version 2.0 (the "License"); <br> + * you may not use this file except in compliance with the License.<br> + * You may obtain a copy of the License at the + * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a> + * <p> + * Unless required by applicable law or agreed to in writing,<br> + * software distributed under the License is distributed on an "AS IS" BASIS, <br> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> + * See the License for the specific language governing permissions and <br> + * limitations under the License. + * <p> + * Initial code contributed and copyrighted by<br> + * frentix GmbH, http://www.frentix.com + * <p> + */ +package org.olat.course.nodes.dialog.ui; + +import org.olat.core.gui.components.form.flexible.impl.elements.table.DefaultFlexiTableDataModel; +import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiSortableColumnDef; +import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableColumnModel; + +/** + * + * Initial date: 3 janv. 2018<br> + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + * + */ +public class DialogElementsTableModel extends DefaultFlexiTableDataModel<DialogElementRow> { + + public DialogElementsTableModel(FlexiTableColumnModel columnModel) { + super(columnModel); + } + + @Override + public Object getValueAt(int row, int col) { + DialogElementRow entry = getObject(row); + + if(col >= 0 && col < DialogCols.values().length) { + switch (DialogCols.values()[col]) { + case filename: return entry.getDownloadLink(); + case authorUsername: return entry.getIdentityName(); + case filesize: return entry.getSize(); + case date: return entry.getCreationDate(); + case newMessages: return entry.getNumOfUnreadMessages(); + case messages: return entry.getNumOfMessages(); + default: return "ERROR"; + } + } + + int propPos = col - DialogElementListController.USER_PROPS_OFFSET; + return entry.getIdentityProp(propPos); + } + + @Override + public DialogElementsTableModel createCopyWithEmptyList() { + return new DialogElementsTableModel(getTableColumnModel()); + } + + public enum DialogCols implements FlexiSortableColumnDef { + filename("table.header.filename"), + forum("table.header.forum"), + authorUsername("table.header.author"), + filesize("table.header.size"), + date("table.header.date"), + newMessages("table.header.newmessages"), + messages("table.header.messages"); + + private final String i18nKey; + + private DialogCols(String i18nKey) { + this.i18nKey = i18nKey; + } + + @Override + public String i18nHeaderKey() { + return i18nKey; + } + + @Override + public boolean sortable() { + return true; + } + + @Override + public String sortKey() { + return name(); + } + } +} diff --git a/src/main/java/org/olat/course/nodes/dialog/ui/SelectRowEvent.java b/src/main/java/org/olat/course/nodes/dialog/ui/SelectRowEvent.java new file mode 100644 index 0000000000000000000000000000000000000000..10d441aed06e884ab2814d402676f039ab5bafa6 --- /dev/null +++ b/src/main/java/org/olat/course/nodes/dialog/ui/SelectRowEvent.java @@ -0,0 +1,46 @@ +/** + * <a href="http://www.openolat.org"> + * OpenOLAT - Online Learning and Training</a><br> + * <p> + * Licensed under the Apache License, Version 2.0 (the "License"); <br> + * you may not use this file except in compliance with the License.<br> + * You may obtain a copy of the License at the + * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a> + * <p> + * Unless required by applicable law or agreed to in writing,<br> + * software distributed under the License is distributed on an "AS IS" BASIS, <br> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> + * See the License for the specific language governing permissions and <br> + * limitations under the License. + * <p> + * Initial code contributed and copyrighted by<br> + * frentix GmbH, http://www.frentix.com + * <p> + */ +package org.olat.course.nodes.dialog.ui; + +import org.olat.core.gui.control.Event; + +/** + * + * Initial date: 3 janv. 2018<br> + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + * + */ +public class SelectRowEvent extends Event { + + private static final long serialVersionUID = 4917075734706780265L; + + public static final String SELECT_DISCUSSION = "select-discussion"; + + private final DialogElementRow element; + + public SelectRowEvent(DialogElementRow element) { + super(SELECT_DISCUSSION); + this.element = element; + } + + public DialogElementRow getRow() { + return element; + } +} diff --git a/src/main/java/org/olat/course/nodes/dialog/ui/_content/dialog.html b/src/main/java/org/olat/course/nodes/dialog/ui/_content/dialog.html new file mode 100644 index 0000000000000000000000000000000000000000..19986bcfb2528ba8ae557c68aadfb587c9c834a7 --- /dev/null +++ b/src/main/java/org/olat/course/nodes/dialog/ui/_content/dialog.html @@ -0,0 +1,19 @@ +<div class="o_sel_dialog"> +#if($r.available("forum")) + <div class="clearfix">$r.render("backLink")</div> + $r.render("forum") +#else + <div class="clearfix"> + #if($r.available("subscription")) + $r.render("subscription") + #end + #if($r.available("dialog.upload.file")) + $r.render("dialog.upload.file") + #end + #if ($r.available("dialog.copy.file")) + $r.render("dialog.copy.file") + #end + </div> + $r.render("files") +#end +</div> \ No newline at end of file diff --git a/src/main/java/org/olat/course/nodes/dialog/ui/_content/discussion.html b/src/main/java/org/olat/course/nodes/dialog/ui/_content/discussion.html new file mode 100644 index 0000000000000000000000000000000000000000..23be36caa42813aaaf4b05f2d9d2d9ff18933c09 --- /dev/null +++ b/src/main/java/org/olat/course/nodes/dialog/ui/_content/discussion.html @@ -0,0 +1,16 @@ +<div class="panel panel-default o_block_large_top"> + <div class="panel-heading"> + <h3 class="panel-title">$r.translate("dialog.selected.element"): + <i class="o_icon o_icon-fw $r.getFiletypeIconCss($filename)"> </i> $filename</h3> + </div> + <table class="table table-bordered table-condensed"> + <tr><th>$r.translate("table.header.filename")</th><td>$r.render("download")</td></tr> + #if($r.isNotEmpty($size)) + <tr><th>$r.translate("table.header.size")</th><td>$size</td></tr> + #end + #if($r.isNotEmpty($size)) + <tr><th>$r.translate("table.header.author")</th><td>$author</td></tr> + #end + </table> +</div> +$r.render("forum") \ No newline at end of file diff --git a/src/main/java/org/olat/course/nodes/dialog/ui/_content/edit.html b/src/main/java/org/olat/course/nodes/dialog/ui/_content/edit.html new file mode 100644 index 0000000000000000000000000000000000000000..4d5da978b9fb454315f919ac423638c947883a43 --- /dev/null +++ b/src/main/java/org/olat/course/nodes/dialog/ui/_content/edit.html @@ -0,0 +1,7 @@ +<fieldset class="o_sel_dialog_settings_upload"> + <div class="o_button_group o_button_group_right"> + $r.render("dialog.upload.file") + $r.contextHelpWithWrapper("Communication and Collaboration#_dateidiskussion") + </div> + $r.render("dialogElementsTable") +</fieldset> diff --git a/src/main/java/org/olat/course/nodes/dialog/_content/edit_access.html b/src/main/java/org/olat/course/nodes/dialog/ui/_content/edit_access.html similarity index 100% rename from src/main/java/org/olat/course/nodes/dialog/_content/edit_access.html rename to src/main/java/org/olat/course/nodes/dialog/ui/_content/edit_access.html diff --git a/src/main/java/org/olat/course/nodes/dialog/ui/_content/element_list.html b/src/main/java/org/olat/course/nodes/dialog/ui/_content/element_list.html new file mode 100644 index 0000000000000000000000000000000000000000..bade9402acda206e8171adcb2d85adb1b884ea54 --- /dev/null +++ b/src/main/java/org/olat/course/nodes/dialog/ui/_content/element_list.html @@ -0,0 +1 @@ +$r.render("table") \ No newline at end of file diff --git a/src/main/java/org/olat/course/nodes/dialog/_i18n/LocalStrings_ar.properties b/src/main/java/org/olat/course/nodes/dialog/ui/_i18n/LocalStrings_ar.properties similarity index 51% rename from src/main/java/org/olat/course/nodes/dialog/_i18n/LocalStrings_ar.properties rename to src/main/java/org/olat/course/nodes/dialog/ui/_i18n/LocalStrings_ar.properties index 6cbced0195631e70dbda778b87d13d0d1f42a66e..6aa14af5fa9a0ffa3186ee7937c095b81a3f67e6 100644 --- a/src/main/java/org/olat/course/nodes/dialog/_i18n/LocalStrings_ar.properties +++ b/src/main/java/org/olat/course/nodes/dialog/ui/_i18n/LocalStrings_ar.properties @@ -1,15 +1,4 @@ -#Mon Sep 13 20:18:04 CEST 2010 - - - - - - - - - - - +#Thu Jan 04 12:35:06 CET 2018 command.closesp=\u0625\u063A\u0644\u0627\u0642 \u0627\u0644\u0646\u0627\u0641\u0630\u0629 command.show=\u0639\u0631\u0636 \u0645\u062D\u062A\u0648\u0649 \u0627\u0644\u062A\u0639\u0644\u064A\u0645 command.showpopup=\u0639\u0631\u0636 \u0645\u062D\u062A\u0648\u0649 \u0627\u0644\u062A\u0639\u0644\u064A\u0645 \u0641\u0649 \u0646\u0627\u0641\u0630\u0629 \u062C\u062F\u064A\u062F\u0629 @@ -21,16 +10,25 @@ dialog.ablage.config.title=\u0645\u0644\u0641 \u062D\u0648\u0627\u0631 dialog.folder.name=\u0645\u062C\u0644\u062F \u0627\u0644\u062A\u062E\u0632\u064A\u0646 dialog.forum.config.title=\u062A\u062E\u0632\u064A\u0646 dialog.forum.popup.config.title=\u0645\u0646\u062A\u062F\u0649 +dialog.selected.element=\u0645\u0644\u0641 \u0627\u0644\u0645\u0646\u0627\u0642\u0634\u0629 dialog.start=\u0623\u0628\u062F\u0623 dialog.upload.file=\u062A\u062D\u0645\u064A\u0644 \u0645\u0644\u0641 +element.already.deleted=\u0644\u0642\u062F \u062A\u0645 \u062D\u0630\u0641 \u0627\u0644\u0639\u0646\u0635\u0631 \u0627\u0644\u0645\u062D\u062F\u062F \u0645\u0646 \u0642\u0628\u0644 \u0645\u0633\u062A\u062E\u062F\u0645 \u0622\u062E\u0631\u060C \u064A\u0631\u062C\u0649 \u062A\u062D\u062F\u064A\u062B \u0639\u0631\u0636 \u0627\u0644\u062C\u062F\u0648\u0644. +element.delete=\u0648\u0627\u0644\u0645\u0646\u062A\u062F\u0649\u061F(<b>{0}</b>) \u0647\u0644 \u062A\u0631\u064A\u062F \u0641\u0639\u0644\u0627\u064B \u062A\u0631\u064A\u062F \u062D\u0630\u0641 \u0627\u0644\u0645\u0644\u0641\r\n \u0627\u0644\u0628\u064A\u0627\u0646\u0627\u062A \u0633\u0648\u0641 \u064A\u062A\u0645 \u062D\u0641\u0638\u0647\u0627 \u062A\u0644\u0642\u0627\u0626\u064A\u0627\u064B \u0641\u0649 \u0627\u0644\u0645\u062C\u0644\u062F \u0627\u0644\u0634\u062E\u0635\u0649\u060C \u0642\u0633\u0645 \u0627\u0644\u0623\u0631\u0634\u064A\u0641. folder.info=\u0645\u0644\u0641 \u062D\u0648\u0627\u0631 folder.open=\u0641\u062A\u062D \u0645\u062C\u0644\u062F - - - - - +notifications.entry={2} \u0645\u0644\u0641 \u062C\u062F\u064A\u062F \u0628\u0627\u0633\u0645 \:{0} \u0645\u0646 {1} \u0648\u0641\u0649\r\n \u062A\u0645 \u0625\u0646\u0634\u0627\u0626\u0647 +notifications.header="{0}" \u0645\u0644\u0641 \u062D\u0648\u0631 \u0641\u0649 \u0627\u0644\u0645\u0642\u0631\u0631 pane.tab.accessibility=\u0648\u0635\u0648\u0644 pane.tab.dialogconfig=\u0625\u0639\u062F\u0627\u062F\u0627\u062A \u0627\u0644\u0645\u0646\u062A\u062F\u0649/\u0627\u0644\u062A\u062E\u0632\u064A\u0646 selection.forumAsPopup.label=\u0641\u062A\u062D \u0645\u0646\u062A\u062F\u0649 \u0641\u0649 \u0646\u0627\u0641\u0630\u0629 \u0645\u0646\u0628\u062B\u0642\u0629\u061F +table.header.action=\u0645\u0644\u0641 +table.header.author=\u0627\u0644\u0645\u0624\u0644\u0641 +table.header.date=\u0627\u0644\u062A\u0627\u0631\u064A\u062E +table.header.filename=\u0627\u0633\u0645 \u0627\u0644\u0645\u0644\u0641 +table.header.filetype=\u0646\u0648\u0639 \u0627\u0644\u0645\u0644\u0641 +table.header.forum=\u0627\u0644\u0645\u0646\u0627\u0642\u0634\u0629 +table.header.messages=\u0631\u0633\u0627\u0626\u0644 +table.header.newmessages=\u063A\u064A\u0631 \u0645\u0642\u0631\u0624\u0629 +table.header.size=\u062D\u062C\u0645 \u0627\u0644\u0645\u0644\u0641 title_dialog=\u0645\u0644\u0641 \u062D\u0648\u0627\u0631 diff --git a/src/main/java/org/olat/modules/dialog/_i18n/LocalStrings_bg.properties b/src/main/java/org/olat/course/nodes/dialog/ui/_i18n/LocalStrings_bg.properties similarity index 51% rename from src/main/java/org/olat/modules/dialog/_i18n/LocalStrings_bg.properties rename to src/main/java/org/olat/course/nodes/dialog/ui/_i18n/LocalStrings_bg.properties index 65f80a2110ce47c0898902730c899ff522f1ec50..518ffcb42a01a9b09b5bd5e8433afccb4c1aef02 100644 --- a/src/main/java/org/olat/modules/dialog/_i18n/LocalStrings_bg.properties +++ b/src/main/java/org/olat/course/nodes/dialog/ui/_i18n/LocalStrings_bg.properties @@ -1,11 +1,27 @@ -#Wed Jun 03 20:15:31 CEST 2009 +#Thu Jan 04 12:35:06 CET 2018 +command.closesp=\u0417\u0430\u0442\u0432\u043E\u0440\u0435\u0442\u0435 \u043F\u0440\u043E\u0437\u043E\u0440\u0435\u0446 +command.show=\u041F\u043E\u043A\u0430\u0436\u0435\u0442\u0435 \u0443\u0447\u0435\u0431\u043D\u043E \u0441\u044A\u0434\u044A\u0440\u0436\u0430\u043D\u0438\u0435 +command.showpopup=\u041F\u043E\u043A\u0430\u0436\u0435\u0442\u0435 \u0443\u0447\u0435\u0431\u043D\u043E \u0441\u044A\u0434\u044A\u0440\u0436\u0430\u043D\u0438\u0435 \u0432 \u043D\u043E\u0432 \u043F\u0440\u043E\u0437\u043E\u0440\u0435\u0446 +condition.accessModerator.title=\u041A\u0430\u0447\u0435\u0442\u0435 / \u0438\u0437\u0442\u0435\u0433\u043B\u0435\u0442\u0435 \u0444\u0430\u0439\u043B\u043E\u0432\u0435 / \u043C\u043E\u0434\u0435\u0440\u0438\u0440\u0430\u0439\u0442\u0435 \u0444\u043E\u0440\u0443\u043C +condition.accessPoster.title=\u041A\u0430\u0447\u0435\u0442\u0435 / \u0438\u0437\u0442\u0435\u0433\u043B\u0435\u0442\u0435 \u0444\u0430\u0439\u043B\u043E\u0432\u0435 / \u043F\u0440\u043E\u0447\u0435\u0442\u0435\u0442\u0435/\u043F\u0438\u0448\u0435\u0442\u0435 \u0432\u044A\u0432 \u0444\u043E\u0440\u0443\u043C +condition.accessReader.title=\u0418\u0437\u0442\u0435\u0433\u043B\u0435\u0442\u0435 \u0444\u0430\u0439\u043B\u043E\u0432\u0435 / \u043F\u0440\u043E\u0447\u0435\u0442\u0435\u0442\u0435 \u0444\u043E\u0440\u0443\u043C +condition.accessibility.title=\u0414\u043E\u0441\u0442\u044A\u043F +dialog.ablage.config.title=\u0424\u0430\u0439\u043B\u043E\u0432 \u0434\u0438\u0430\u043B\u043E\u0433 +dialog.folder.name=\u041F\u0430\u043F\u043A\u0430 +dialog.forum.config.title=\u0421\u044A\u0445\u0440\u0430\u043D\u0435\u043D\u0438\u0435 +dialog.forum.popup.config.title=\u0424\u043E\u0440\u0443\u043C dialog.selected.element=\u0422\u0435\u043C\u0430 \u0437\u0430 \u0434\u0438\u0441\u043A\u0443\u0441\u0438\u044F dialog.start=\u041E\u0442\u0432\u043E\u0440\u0435\u0442\u0435 dialog.upload.file=\u041A\u0430\u0447\u0435\u0442\u0435 \u0444\u0430\u0439\u043B element.already.deleted=\u0418\u0437\u0431\u0440\u0430\u043D\u0438\u044F\u0442 \u0435\u043B\u0435\u043C\u0435\u043D\u0442 \u0435 \u0438\u0437\u0442\u0440\u0438\u0442 \u043E\u0442 \u0434\u0440\u0443\u0433 \u043F\u043E\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043B. \u041C\u043E\u043B\u044F, \u043F\u0440\u0435\u0437\u0430\u0440\u0435\u0434\u0435\u0442\u0435 \u043F\u0440\u0435\u0433\u043B\u0435\u0434\u0430 \u043D\u0430 \u0442\u0430\u0431\u043B\u0438\u0446\u0430. element.delete=\u041D\u0430\u0438\u0441\u0442\u0438\u043D\u0430 \u043B\u0438 \u0438\u0441\u043A\u0430\u0442\u0435 \u0434\u0430 \u0438\u0437\u0442\u0440\u0438\u0435\u0442\u0435 \u0444\u0430\u0439\u043B\u0430 (<b>{0}</b>) \u0438 \u043D\u0435\u0433\u043E\u0432\u0438\u044F \u0444\u043E\u0440\u0443\u043C? \u0414\u0430\u043D\u043D\u0438\u0442\u0435 \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u043D\u043E \u0449\u0435 \u0431\u044A\u0434\u0430\u0442 \u0430\u0440\u0445\u0438\u0432\u0438\u0440\u0430\u043D\u0438 \u0432\u044A\u0432 \u0432\u0430\u0448\u0430\u0442\u0430 \u043B\u0438\u0447\u043D\u0430 \u043F\u0430\u043F\u043A\u0430, \u0441\u0435\u043A\u0446\u0438\u044F "\u0410\u0440\u0445\u0438\u0432". +folder.info=\u0424\u0430\u0439\u043B\u043E\u0432 \u0434\u0438\u0430\u043B\u043E\u0433 +folder.open=\u041E\u0442\u0432\u043E\u0440\u0435\u0442\u0435 \u043F\u0430\u043F\u043A\u0430 notifications.entry=\u041D\u043E\u0432 \u0444\u0430\u0439\u043B \u0441 \u0444\u0430\u0439\u043B\u043E\u0432\u043E \u0438\u043C\u0435\:{0} \u043E\u0442 {1} \u0441\u044A\u0437\u0434\u0430\u0434\u0435\u043D \u043D\u0430 {2} notifications.header=\u0418\u043C\u0430 \u043D\u043E\u0432\u0438 \u0444\u0430\u0439\u043B\u043E\u0432\u0435 \u0432 \u043A\u0443\u0440\u0441\u043E\u0432\u0438\u044F \u043C\u043E\u0434\u0443\u043B "\u0424\u0430\u0439\u043B\u043E\u0432 \u0434\u0438\u0430\u043B\u043E\u0433" +pane.tab.accessibility=\u0414\u043E\u0441\u0442\u044A\u043F +pane.tab.dialogconfig=\u041A\u043E\u043D\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044F \u043D\u0430 \u0444\u043E\u0440\u0443\u043C/\u0441\u044A\u0445\u0440\u0430\u043D\u0435\u043D\u0438\u0435 +selection.forumAsPopup.label=\u041E\u0442\u0432\u043E\u0440\u0435\u0442\u0435 \u0444\u043E\u0440\u0443\u043C\u0430 \u0432 \u0438\u0437\u043A\u0430\u0447\u0430\u0449 \u043F\u0440\u043E\u0437\u043E\u0440\u0435\u0446? table.header.action=\u0424\u0430\u0439\u043B table.header.author=\u0410\u0432\u0442\u043E\u0440 table.header.date=\u0414\u0430\u0442\u0430 diff --git a/src/main/java/org/olat/course/nodes/dialog/_i18n/LocalStrings_cs.properties b/src/main/java/org/olat/course/nodes/dialog/ui/_i18n/LocalStrings_cs.properties similarity index 52% rename from src/main/java/org/olat/course/nodes/dialog/_i18n/LocalStrings_cs.properties rename to src/main/java/org/olat/course/nodes/dialog/ui/_i18n/LocalStrings_cs.properties index bf93baf2d4fa96ff0b2b8330a82d5e178152c8e9..cd4ad93f42f9c019fa9485eb3465f95c49edd810 100644 --- a/src/main/java/org/olat/course/nodes/dialog/_i18n/LocalStrings_cs.properties +++ b/src/main/java/org/olat/course/nodes/dialog/ui/_i18n/LocalStrings_cs.properties @@ -1,14 +1,4 @@ -#Wed Jul 28 13:33:32 CEST 2010 - - - - - - - - - - +#Thu Jan 04 12:35:06 CET 2018 command.closesp=Zav\u0159\u00EDt okno command.show=Zobrazit studijn\u00ED obsah command.showpopup=Zobrazit studijn\u00ED obsah v nov\u00E9m okn\u011B @@ -20,14 +10,24 @@ dialog.ablage.config.title=Dialog souboru dialog.folder.name=Slo\u017Eka dialog.forum.config.title=Uskladn\u011Bn\u00ED dialog.forum.popup.config.title=F\u00F3rum +dialog.selected.element=T\u00E9ma diskuze dialog.start=Za\u010D\u00EDt dialog.upload.file=Nahr\u00E1t soubor +element.already.deleted=Vybran\u00E9 elementy byly smaz\u00E1ny jin\u00FDm u\u017Eivatelem. Pros\u00EDm obnovte zobrazen\u00ED tabulky. +element.delete=Opravdu chcete smazat soubor (<b>{0}</b>) a jeho diskuzi? Data budou automticky archivov\u00E1na ve Va\u0161\u00ED osobn\u00ED slo\u017Ece, v sekci 'archive'. folder.info=Dialog souboru folder.open=Otev\u0159\u00EDt slo\u017Eku - - - - +notifications.entry=Nov\u00FD soubor jm\u00E9nem {0} od {1} vytvo\u0159en v {2} +notifications.header=V modulu kurzu "Dialog souboru" je nov\u00FD soubor pane.tab.accessibility=P\u0159\u00EDstup pane.tab.dialogconfig=Konfigurace F\u00F3ra selection.forumAsPopup.label=Otev\u0159\u00EDt f\u00F3rum v popup okn\u011B? +table.header.action=Soubor +table.header.author=Autor +table.header.date=Datum +table.header.filename=Jm\u00E9no souboru +table.header.filetype=Typ souboru +table.header.forum=Diskuze +table.header.messages=Zpr\u00E1vy +table.header.newmessages=Nep\u0159e\u010Dteno +table.header.size=Velikost souboru diff --git a/src/main/java/org/olat/modules/dialog/_i18n/LocalStrings_da.properties b/src/main/java/org/olat/course/nodes/dialog/ui/_i18n/LocalStrings_da.properties similarity index 50% rename from src/main/java/org/olat/modules/dialog/_i18n/LocalStrings_da.properties rename to src/main/java/org/olat/course/nodes/dialog/ui/_i18n/LocalStrings_da.properties index a2dd6322913f2b4e61c2f8063c8145f28f370636..2166e44b2328d39598bc168894e2610078e22496 100644 --- a/src/main/java/org/olat/modules/dialog/_i18n/LocalStrings_da.properties +++ b/src/main/java/org/olat/course/nodes/dialog/ui/_i18n/LocalStrings_da.properties @@ -1,11 +1,27 @@ -#Mon Mar 02 09:54:09 CET 2009 +#Thu Jan 04 12:35:06 CET 2018 +command.closesp=Luk vindue +command.show=Vis l\u00E6ringsindhold +command.showpopup=Vis l\u00E6ringsindhold i et nyt vindue +condition.accessModerator.title=Upload / download filer / moderer forum +condition.accessPoster.title=Upload / download filer / l\u00E6s og skriv i forum +condition.accessReader.title=Download filer / l\u00E6s forum +condition.accessibility.title=Adgange +dialog.ablage.config.title=Fildialog +dialog.folder.name=Mappe +dialog.forum.config.title=Gemmemapper +dialog.forum.popup.config.title=Forum dialog.selected.element=Diskussionsemne dialog.start=Start -dialog.upload.file=Upload fil +dialog.upload.file=Upload af fil element.already.deleted=Det valgte element er allerede blevet slettet af en anden bruger. Indl\u00E6s venligst tabeloversigten igen. element.delete=Er du sikker p\u00E5 at du vil slette filen (<b>{0}</b>) og dets forum? Data vil automatisk blive arkiveret i din personlige mappe under "privat". +folder.info=Fildialog +folder.open=Open mappe notifications.entry=Ny fil med filnavnet\:{0} fra {1} oprettet den {2} notifications.header=Der er ny fil(er) i kursusmodulet "Fil dialog" +pane.tab.accessibility=Adgange +pane.tab.dialogconfig=Forum/gemme konfiguration +selection.forumAsPopup.label=\u00C5ben forum i et popup vindue? table.header.action=File table.header.author=Forfatter table.header.date=Dato diff --git a/src/main/java/org/olat/course/nodes/dialog/ui/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/course/nodes/dialog/ui/_i18n/LocalStrings_de.properties new file mode 100644 index 0000000000000000000000000000000000000000..5fc978e5cb52814eb6df3cddaaeffd94bb2c872e --- /dev/null +++ b/src/main/java/org/olat/course/nodes/dialog/ui/_i18n/LocalStrings_de.properties @@ -0,0 +1,35 @@ +#Thu Jan 04 12:35:06 CET 2018 +command.closesp=Fenster schliessen +command.show=Lerninhalt anzeigen +command.showpopup=Lerninhalt in neuem Fenster anzeigen +condition.accessModerator.title=Up- und Download der Dateien / Moderieren im Forum +condition.accessPoster.title=Up- und Download der Dateien / Lesen und Schreiben im Forum +condition.accessReader.title=Nur Download der Dateien / Nur Lesen im Forum +condition.accessibility.title=Access +dialog.ablage.config.title=Dateidiskussion +dialog.copy.file=Datei kopieren +dialog.folder.name=Dateiablage +dialog.forum.config.title=Ablage +dialog.forum.popup.config.title=Darstellung +dialog.selected.element=Diskussion zur Datei +dialog.start=Anzeigen +dialog.upload.file=Datei hochladen +element.already.deleted=Das gew\u00E4hle Element wurde in der Zwischenzeit von einem anderen Benutzer gel\u00F6scht. Bitte die Tabellenansicht neu laden. +element.delete=Wollen Sie die Datei (<b>{0}</b>) inkl. der Diskussionsbeitr\u00E4ge l\u00F6schen? Die Daten werden automatisch in Ihrem pers\u00F6nlichen Ordner unter 'Archiv' abgelegt. +folder.info=Dateidiskussion +folder.open=Ablage \u00F6ffen +notifications.entry=Neue Datei mit dem Namen\:{0} erstellt von {1} +notifications.header=Dateidiskussion in Kurs "{0}" +pane.tab.accessibility=Zugang +pane.tab.dialogconfig=Ablage- /Forumskonfiguration +selection.forumAsPopup.label=Forum in Popup-Fenster \u00F6ffnen +table.header.action=Datei +table.header.author=Autor +table.header.date=Datum +table.header.filename=Dateiname +table.header.filetype=Dateityp +table.header.forum=Diskussion +table.header.messages=Beitr\u00E4ge +table.header.newmessages=Ungelesen +table.header.size=Dateigr\u00F6sse +title_dialog=Dateidiskussion diff --git a/src/main/java/org/olat/modules/dialog/_i18n/LocalStrings_el.properties b/src/main/java/org/olat/course/nodes/dialog/ui/_i18n/LocalStrings_el.properties similarity index 54% rename from src/main/java/org/olat/modules/dialog/_i18n/LocalStrings_el.properties rename to src/main/java/org/olat/course/nodes/dialog/ui/_i18n/LocalStrings_el.properties index 1356d6787d721897141d7e2f23d9f95c0d88b309..006d942e7af74d6a308858e208a4e082287b51f2 100644 --- a/src/main/java/org/olat/modules/dialog/_i18n/LocalStrings_el.properties +++ b/src/main/java/org/olat/course/nodes/dialog/ui/_i18n/LocalStrings_el.properties @@ -1,11 +1,27 @@ -#Mon Mar 02 09:54:16 CET 2009 +#Thu Jan 04 12:35:06 CET 2018 +command.closesp=\u039A\u03BB\u03B5\u03AF\u03C3\u03B9\u03BC\u03BF \u03C0\u03B1\u03C1\u03B1\u03B8\u03CD\u03C1\u03BF\u03C5 +command.show=\u03A0\u03C1\u03BF\u03B2\u03BF\u03BB\u03AE \u03C0\u03B5\u03C1\u03B9\u03B5\u03C7\u03CC\u03BC\u03B5\u03BD\u03BF\u03C5 \u03BC\u03AC\u03B8\u03B7\u03C3\u03B7\u03C2 +command.showpopup=\u03A0\u03C1\u03BF\u03B2\u03BF\u03BB\u03AE \u03C0\u03B5\u03C1\u03B9\u03B5\u03C7\u03CC\u03BC\u03B5\u03BD\u03BF\u03C5 \u03BC\u03AC\u03B8\u03B7\u03C3\u03B7\u03C2 \u03C3\u03B5 \u03BD\u03AD\u03BF \u03C0\u03B1\u03C1\u03AC\u03B8\u03C5\u03C1\u03BF +condition.accessModerator.title=\u0391\u03BD\u03AD\u03B2\u03B1\u03C3\u03BC\u03B1 \u03AE \u03BB\u03AE\u03C8\u03B7 \u03B1\u03C1\u03C7\u03B5\u03AF\u03C9\u03BD/\u03B5\u03C0\u03BF\u03C0\u03C4\u03B5\u03AF\u03B1 forum +condition.accessPoster.title=\u0391\u03BD\u03AD\u03B2\u03B1\u03C3\u03BC\u03B1 / \u03BA\u03B1\u03C4\u03AD\u03B2\u03B1\u03C3\u03BC\u03B1 \u03B1\u03C1\u03C7\u03B5\u03AF\u03C9\u03BD / \u0391\u03BD\u03AC\u03B3\u03BD\u03C9\u03C3\u03B7-\u03B5\u03B3\u03B3\u03C1\u03B1\u03C6\u03AE forum +condition.accessReader.title=\u039A\u03B1\u03C4\u03AC\u03B2\u03B1\u03C3\u03BC\u03B1 \u03B1\u03C1\u03C7\u03B5\u03AF\u03C9\u03BD / \u0391\u03BD\u03AC\u03B3\u03BD\u03C9\u03C3\u03B7 forum +condition.accessibility.title=\u03A0\u03C1\u03CC\u03C3\u03B2\u03B1\u03C3\u03B7 +dialog.ablage.config.title=\u0394\u03B9\u03AC\u03BB\u03BF\u03B3\u03BF\u03C2 \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF\u03C5 +dialog.folder.name=\u03A6\u03AC\u03BA\u03B5\u03BB\u03BF\u03C2 +dialog.forum.config.title=\u0391\u03C0\u03BF\u03B8\u03AE\u03BA\u03B5\u03C5\u03C3\u03B7 +dialog.forum.popup.config.title=Forum dialog.selected.element=\u0398\u03AD\u03BC\u03B1 \u03C3\u03C5\u03B6\u03AE\u03C4\u03B7\u03C3\u03B7\u03C2 dialog.start=\u0395\u03BA\u03BA\u03AF\u03BD\u03B7\u03C3\u03B7 dialog.upload.file=\u0391\u03BD\u03AD\u03B2\u03B1\u03C3\u03BC\u03B1 \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF\u03C5 element.already.deleted=\u03A4\u03BF \u03C3\u03C4\u03BF\u03B9\u03C7\u03B5\u03AF\u03BF \u03B4\u03B9\u03B1\u03B3\u03C1\u03AC\u03C6\u03B7\u03BA\u03B5 \u03B1\u03C0\u03CC \u03AC\u03BB\u03BB\u03BF \u03C7\u03C1\u03AE\u03C3\u03C4\u03B7. \u03A0\u03B1\u03C1\u03B1\u03BA\u03B1\u03BB\u03BF\u03CD\u03BC\u03B5 \u03B1\u03BD\u03B1\u03BD\u03B5\u03CE\u03C3\u03C4\u03B5 \u03C4\u03B7\u03BD \u03C0\u03C1\u03BF\u03B2\u03BF\u03BB\u03AE \u03C4\u03BF\u03C5 \u03C0\u03AF\u03BD\u03B1\u03BA\u03B1. element.delete=\u0398\u03AD\u03BB\u03B5\u03C4\u03B5 \u03C3\u03AF\u03B3\u03BF\u03C5\u03C1\u03B1 \u03BD\u03B1 \u03B4\u03B9\u03B1\u03B3\u03C1\u03AC\u03C8\u03B5\u03C4\u03B5 \u03C4\u03BF \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF (<b>{0}</b>) \u03BA\u03B1\u03B9 \u03C4\u03BF forum \u03C4\u03BF\u03C5? \u03A4\u03B1 \u03B4\u03B5\u03B4\u03BF\u03BC\u03AD\u03BD\u03B1 \u03B8\u03B1 \u03B1\u03C1\u03C7\u03B5\u03B9\u03BF\u03B8\u03B5\u03C4\u03B7\u03B8\u03BF\u03CD\u03BD \u03B1\u03C5\u03C4\u03CC\u03BC\u03B1\u03C4\u03B1 \u03C3\u03C4\u03BF\u03BD \u03C0\u03C1\u03BF\u03C3\u03C9\u03C0\u03B9\u03BA\u03CC \u03C3\u03B1\u03C2 \u03C6\u03AC\u03BA\u03B5\u03BB\u03BF, \u03C3\u03C4\u03BF \u03C3\u03B7\u03BC\u03B5\u03AF\u03BF 'archive'. +folder.info=\u0394\u03B9\u03AC\u03BB\u03BF\u03B3\u03BF\u03C2 \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF\u03C5 +folder.open=\u0386\u03BD\u03BF\u03B9\u03B3\u03BC\u03B1 \u03C6\u03B1\u03BA\u03AD\u03BB\u03BF\u03C5 notifications.entry=\u039D\u03AD\u03BF \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF \u03BC\u03B5 \u03CC\u03BD\u03BF\u03BC\u03B1 \:{0} \u03B1\u03C0\u03CC {1} \u03B4\u03B7\u03BC\u03B9\u03BF\u03C5\u03C1\u03B3\u03AE\u03B8\u03B7\u03BA\u03B5 \u03C3\u03C4\u03B9\u03C2 {2} notifications.header=\u03A5\u03C0\u03AC\u03C1\u03C7\u03BF\u03C5\u03BD \u03BD\u03AD\u03B1 \u03B1\u03C1\u03C7\u03B5\u03AF\u03B1 \u03C3\u03C4\u03B7\u03BD \u03C5\u03C0\u03BF\u03BC\u03BF\u03BD\u03AC\u03B4\u03B1 \u03BC\u03B1\u03B8\u03AE\u03BC\u03B1\u03C4\u03BF\u03C2 "\u0394\u03B9\u03AC\u03BB\u03BF\u03B3\u03BF\u03C2 \u03B1\u03C1\u03C7\u03B5\u03AF\u03C9\u03BD" +pane.tab.accessibility=\u03A0\u03C1\u03CC\u03C3\u03B2\u03B1\u03C3\u03B7 +pane.tab.dialogconfig=\u0394\u03B9\u03B1\u03BC\u03CC\u03C1\u03C6\u03C9\u03C3\u03B7 Forum/\u03B1\u03C0\u03BF\u03B8\u03AE\u03BA\u03B5\u03C5\u03C3\u03B7\u03C2 +selection.forumAsPopup.label=\u0386\u03BD\u03BF\u03B9\u03B3\u03BC\u03B1 forum \u03C3\u03B5 \u03B1\u03BD\u03B1\u03B4\u03C5\u03CC\u03BC\u03B5\u03BD\u03BF \u03C0\u03B1\u03C1\u03AC\u03B8\u03C5\u03C1\u03BF? table.header.action=\u0391\u03C1\u03C7\u03B5\u03AF\u03BF table.header.author=\u03A3\u03C5\u03B3\u03B3\u03C1\u03B1\u03C6\u03AD\u03B1\u03C2 table.header.date=\u0397\u03BC\u03B5\u03C1\u03BF\u03BC\u03B7\u03BD\u03AF\u03B1 @@ -15,3 +31,4 @@ table.header.forum=\u03A3\u03C5\u03B6\u03AE\u03C4\u03B7\u03C3\u03B7 table.header.messages=\u039C\u03B7\u03BD\u03CD\u03BC\u03B1\u03C4\u03B1 table.header.newmessages=\u039C\u03B7 \u03B1\u03BD\u03B1\u03B3\u03BD\u03C9\u03C3\u03BC\u03AD\u03BD\u03B1 table.header.size=\u039C\u03AD\u03B3\u03B5\u03B8\u03BF\u03C2 \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF\u03C5 +title_dialog=\u0394\u03B9\u03AC\u03BB\u03BF\u03B3\u03BF\u03C2 \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF\u03C5 diff --git a/src/main/java/org/olat/course/nodes/dialog/ui/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/course/nodes/dialog/ui/_i18n/LocalStrings_en.properties new file mode 100644 index 0000000000000000000000000000000000000000..518752456cc34e15ca9f8a1ce90e2d1531e8a569 --- /dev/null +++ b/src/main/java/org/olat/course/nodes/dialog/ui/_i18n/LocalStrings_en.properties @@ -0,0 +1,35 @@ +#Thu Jan 04 12:35:06 CET 2018 +command.closesp=Close window +command.show=Display learning content +command.showpopup=Display learning content in new window +condition.accessModerator.title=Upload or download files/moderate forum +condition.accessPoster.title=Upload and download files/read and write in forum +condition.accessReader.title=Download files/read in forum only +condition.accessibility.title=Access +dialog.ablage.config.title=File dialog +dialog.copy.file=Copy file +dialog.folder.name=Storage folder +dialog.forum.config.title=Storage +dialog.forum.popup.config.title=Forum +dialog.selected.element=Dialog regarding file +dialog.start=Show +dialog.upload.file=Upload file +element.already.deleted=The element selected has been deleted by another user. Please refresh the table view. +element.delete=Do you really want to delete the file (<b>{0}</b>) and its forum? Data will automatically be archived in your personal folder, section 'Archive'. +folder.info=File dialog +folder.open=Open folder +notifications.entry=New file with file name\: {0} created by {1} +notifications.header=File dialog in course "{0}" +pane.tab.accessibility=Access +pane.tab.dialogconfig=Forum/storage configuration +selection.forumAsPopup.label=Open forum in pop-up +table.header.action=File +table.header.author=Author +table.header.date=Date +table.header.filename=File name +table.header.filetype=File type +table.header.forum=Discussion +table.header.messages=Contributions +table.header.newmessages=Unread +table.header.size=File size +title_dialog=File dialog diff --git a/src/main/java/org/olat/course/nodes/dialog/_i18n/LocalStrings_es.properties b/src/main/java/org/olat/course/nodes/dialog/ui/_i18n/LocalStrings_es.properties similarity index 51% rename from src/main/java/org/olat/course/nodes/dialog/_i18n/LocalStrings_es.properties rename to src/main/java/org/olat/course/nodes/dialog/ui/_i18n/LocalStrings_es.properties index 3844b75a88a8a8b1aef1d3379b2334c54ee9405e..8b2e035f990caac44774fb84f0375ae28b0ecf7f 100644 --- a/src/main/java/org/olat/course/nodes/dialog/_i18n/LocalStrings_es.properties +++ b/src/main/java/org/olat/course/nodes/dialog/ui/_i18n/LocalStrings_es.properties @@ -1,14 +1,4 @@ -#Wed Jul 28 13:33:33 CEST 2010 - - - - - - - - - - +#Thu Jan 04 12:35:06 CET 2018 command.closesp=Cerrar ventana command.show=Mostrar contenido did\u00E1ctico command.showpopup=Mostar contenido did\u00E1ctico en una nueva ventana @@ -20,14 +10,24 @@ dialog.ablage.config.title=Visualizaci\u00F3n de los elementos de di\u00E1logo dialog.folder.name=Dep\u00F3sito de archivos dialog.forum.config.title=Dep\u00F3sito dialog.forum.popup.config.title=Foro +dialog.selected.element=Discusi\u00F3n de datos dialog.start=Empezar dialog.upload.file=Subir archivo +element.already.deleted=El elemento seleccionado ha sido eliminado por otro usuario en el tiempo intermedio. +element.delete=\u00BFDeseas eliminar el archivo (<b<{0}</b>) y su foro correspondiente? Los datos son archivados autom\u00E1ticamente en tu carpeta personal en 'archivo'. folder.info=Elementos de di\u00E1logo folder.open=Abrir carpeta - - - - +notifications.entry=Nuevo archivo con nombre\:{0} de {1} creado en {2} +notifications.header=Hay nuevo(s) archivo(s) en el m\u00F3dulo del curso "Di\u00E1logo de archivo" pane.tab.accessibility=Acceso pane.tab.dialogconfig=Configuraci\u00F3n del foro y dep\u00F3sito selection.forumAsPopup.label=\u00BFAbrir foro en una ventana pop-up? +table.header.action=Archivo +table.header.author=Autor +table.header.date=Fecha +table.header.filename=Nombre de archivo +table.header.filetype=Tipo de archivo +table.header.forum=Discusi\u00F3n +table.header.messages=Mensajes +table.header.newmessages=No le\u00EDdo +table.header.size=Tama\u00F1o diff --git a/src/main/java/org/olat/course/nodes/dialog/_i18n/LocalStrings_fa.properties b/src/main/java/org/olat/course/nodes/dialog/ui/_i18n/LocalStrings_fa.properties similarity index 58% rename from src/main/java/org/olat/course/nodes/dialog/_i18n/LocalStrings_fa.properties rename to src/main/java/org/olat/course/nodes/dialog/ui/_i18n/LocalStrings_fa.properties index a485d7fc48ec45556e7eb0118025998089e900bc..4a2eb4f59b2d278063dedc772311a0f82f1196ac 100644 --- a/src/main/java/org/olat/course/nodes/dialog/_i18n/LocalStrings_fa.properties +++ b/src/main/java/org/olat/course/nodes/dialog/ui/_i18n/LocalStrings_fa.properties @@ -1,4 +1,4 @@ -#Wed Jul 28 13:33:32 CEST 2010 +#Thu Jan 04 12:35:06 CET 2018 command.closesp=\u0628\u0633\u062A\u0646 \u067E\u0646\u062C\u0631\u0647 command.show=\u0646\u0645\u0627\u06CC\u0634 \u0645\u062D\u062A\u0648\u0627\u06CC \u0622\u0645\u0648\u0632\u0634\u06CC command.showpopup=\u0646\u0645\u0627\u06CC\u0634 \u0645\u062D\u062A\u0648\u0627\u06CC \u0622\u0645\u0648\u0632\u0634\u06CC \u062F\u0631 \u067E\u0646\u062C\u0631\u0647 \u062C\u062F\u06CC\u062F @@ -10,14 +10,24 @@ dialog.ablage.config.title=\u0641\u0627\u06CC\u0644 \u0645\u062D\u0627\u0648\u06 dialog.folder.name=\u067E\u0648\u0634\u0647 dialog.forum.config.title=\u062E\u0632\u0627\u0646\u0647 dialog.forum.popup.config.title=\u0627\u0646\u062C\u0645\u0646 +dialog.selected.element=\u0645\u0648\u0636\u0648\u0639 \u0628\u062D\u062B dialog.start=\u0634\u0631\u0648\u0639 dialog.upload.file=\u0627\u0631\u0633\u0627\u0644 \u0641\u0627\u06CC\u0644 +element.already.deleted=\u062C\u0632\u0621 \u0627\u0646\u062A\u062E\u0627\u0628 \u0634\u062F\u0647 \u062A\u0648\u0633\u0637 \u06A9\u0627\u0631\u0628\u0631 \u062F\u06CC\u06AF\u0631\u06CC \u067E\u0627\u06A9 \u0634\u062F\u0647 \u0627\u0633\u062A.\u0644\u0637\u0641\u0627 \u0646\u0645\u0627\u06CC \u062C\u062F\u0648\u0644 \u062E\u0648\u062F \u0631\u0627 \u0628\u0627\u0632\u0622\u0648\u0631\u06CC \u06A9\u0646\u06CC\u062F +element.delete=Do you really want to delete the file (<b>{0}</b>) and its forum? Data will automatically be archived in your personal folder, section 'archive'. folder.info=\u0641\u0627\u06CC\u0644 \u0645\u062D\u0627\u0648\u0631\u0647 \u0627\u06CC folder.open=\u0628\u0627\u0632 \u06A9\u0631\u062F\u0646 \u067E\u0648\u0634\u0647 - - - - +notifications.entry=New file with file name\:{0} from {1} created at {2} +notifications.header=There are new file(s) in the course module "File dialog" pane.tab.accessibility=\u062F\u0633\u062A\u06CC\u0627\u0628\u06CC pane.tab.dialogconfig=\u0645\u062D\u0644 \u067E\u06CC\u06A9\u0631\u0628\u0646\u062F\u06CC \u0627\u0646\u062C\u0645\u0646/\u062E\u0632\u0627\u0646\u0647 selection.forumAsPopup.label=\u0628\u0627\u0632 \u06A9\u0631\u062F\u0646 \u0627\u0646\u062C\u0645\u0646 \u062F\u0631 \u067E\u0646\u062C\u0631\u0647 \u0641\u0631\u0639\u06CC\u061F +table.header.action=\u0641\u0627\u06CC\u0644 +table.header.author=\u0646\u0648\u06CC\u0633\u0646\u062F\u0647 +table.header.date=\u062A\u0627\u0631\u06CC\u062E +table.header.filename=\u0646\u0627\u0645 \u0641\u0627\u06CC\u0644 +table.header.filetype=\u0646\u0648\u0639 \u0641\u0627\u06CC\u0644 +table.header.forum=\u0628\u062D\u062B \u0648 \u06AF\u0641\u062A\u06AF\u0648 +table.header.messages=\u067E\u06CC\u0627\u0645 \u0647\u0627 +table.header.newmessages=\u062E\u0648\u0627\u0646\u062F\u0647 \u0646\u0634\u062F\u0647 +table.header.size=\u0627\u0646\u062F\u0627\u0632\u0647 \u0641\u0627\u06CC\u0644 diff --git a/src/main/java/org/olat/course/nodes/dialog/ui/_i18n/LocalStrings_fr.properties b/src/main/java/org/olat/course/nodes/dialog/ui/_i18n/LocalStrings_fr.properties new file mode 100644 index 0000000000000000000000000000000000000000..e958747d6ff2f97505918fdca86aa144fb48eeb4 --- /dev/null +++ b/src/main/java/org/olat/course/nodes/dialog/ui/_i18n/LocalStrings_fr.properties @@ -0,0 +1,35 @@ +#Thu Jan 04 12:35:06 CET 2018 +command.closesp=Fermer fen\u00EAtre +command.show=Afficher contenu didactique +command.showpopup=Afficher contenu didactique dans nouvelle fen\u00EAtre +condition.accessModerator.title=Transmission et t\u00E9l\u00E9chargement des fichiers / Animer le forum +condition.accessPoster.title=Transmission et t\u00E9l\u00E9chargement des fichiers / Lire et \u00E9crire dans le forum +condition.accessReader.title=Uniquement t\u00E9l\u00E9chargement des fichiers / Uniquement lire dans le forum +condition.accessibility.title=Acces +dialog.ablage.config.title=Fichier à discut\u00E9 +dialog.copy.file=Copier un document +dialog.folder.name=D\u00E9p\u00F4t de fichier +dialog.forum.config.title=Stockage +dialog.forum.popup.config.title=Forum +dialog.selected.element=Discuter le fichier +dialog.start=Afficher +dialog.upload.file=T\u00E9l\u00E9charger fichier +element.already.deleted=L'\u00E9l\u00E9ment s\u00E9lectionn\u00E9 a \u00E9t\u00E9 effac\u00E9 entre temps par un autre utilisateur. Veuillez actualiser l'affichage du tableau. +element.delete=Voulez-vous vraiment effacer le fichier (<b>{0}</b>) incl. les contributions de discussion? Les donn\u00E9es seront d\u00E9pos\u00E9es automatiquement dans votre dossier personnel sous 'archive'. +folder.info=Fichier discut\u00E9 +folder.open=Ouvrir d\u00E9p\u00F4t +notifications.entry=Nouveau fichier avec le nom\: {0} cr\u00E9\u00E9 par {1} +notifications.header=Il y a de nouveaux fichier dans le module de cours "fichier discut\u00E9". +pane.tab.accessibility=Acc\u00E8s +pane.tab.dialogconfig=Configuration de d\u00E9p\u00F4t, du forum +selection.forumAsPopup.label=Ouvrir le forum dans une nouvelle fen\u00EAtre? +table.header.action=fichier +table.header.author=auteur +table.header.date=date +table.header.filename=nom de fichier +table.header.filetype=type de fichier +table.header.forum=discussion +table.header.messages=contributions +table.header.newmessages=non lus +table.header.size=taille du fichier +title_dialog=Discussion de fichier diff --git a/src/main/java/org/olat/modules/dialog/_i18n/LocalStrings_it.properties b/src/main/java/org/olat/course/nodes/dialog/ui/_i18n/LocalStrings_it.properties similarity index 50% rename from src/main/java/org/olat/modules/dialog/_i18n/LocalStrings_it.properties rename to src/main/java/org/olat/course/nodes/dialog/ui/_i18n/LocalStrings_it.properties index 4d08e6daf1e8002a00970b2e0434b456fb776d2c..75a5cb284b3062a36c88761bb18c351909cb3981 100644 --- a/src/main/java/org/olat/modules/dialog/_i18n/LocalStrings_it.properties +++ b/src/main/java/org/olat/course/nodes/dialog/ui/_i18n/LocalStrings_it.properties @@ -1,12 +1,28 @@ -#Tue Feb 07 12:50:59 CET 2017 +#Thu Jan 04 12:35:06 CET 2018 +command.closesp=Chiudere finestra +command.show=Mostrare contenuto didattico +command.showpopup=Mostrare contenuto didattico in nuova finestra +condition.accessModerator.title=upload / download files / moderatate forum +condition.accessPoster.title=upload / download files / read write forum +condition.accessReader.title=download files / read forum +condition.accessibility.title=Accesso +dialog.ablage.config.title=Discussione documentata dialog.copy.file=Copia file +dialog.folder.name=Deposito file +dialog.forum.config.title=Deposito +dialog.forum.popup.config.title=Forum dialog.selected.element=Discussione sul file -dialog.start=Mostrare +dialog.start=Avviare dialog.upload.file=Caricare file element.already.deleted=L'elemento selezionato, nel frattempo, \u00E8 stato eliminato da un altro utente. Ricarichi la visualizzazione della tabella, p.f. element.delete=Vuole eliminare il file (<b>{0}</b>) insieme ai contributi? I dati vengono depositati automaticamente nella Sua cartella personale sotto "archive". +folder.info=Discussione documentata +folder.open=Apri deposito notifications.entry=Nuovo file con il nome\:{0} di {1} creato in data {2} notifications.header=Ci sono nuovi file nel modulo di corso "Discussione documentata" +pane.tab.accessibility=Accesso +pane.tab.dialogconfig=Configurazione deposito / forum +selection.forumAsPopup.label=Aprire forum in finestra popup? table.header.action=File table.header.author=Autore table.header.date=Data @@ -16,3 +32,4 @@ table.header.forum=Discussione table.header.messages=Contributi table.header.newmessages=Non letti table.header.size=Misura +title_dialog=Discussione documentata diff --git a/src/main/java/org/olat/course/nodes/dialog/_i18n/LocalStrings_jp.properties b/src/main/java/org/olat/course/nodes/dialog/ui/_i18n/LocalStrings_jp.properties similarity index 55% rename from src/main/java/org/olat/course/nodes/dialog/_i18n/LocalStrings_jp.properties rename to src/main/java/org/olat/course/nodes/dialog/ui/_i18n/LocalStrings_jp.properties index 8c9316b287747a7037469ebb60dae8522eb072b2..34000fec838c81630890e12d57754f9f17f5c069 100644 --- a/src/main/java/org/olat/course/nodes/dialog/_i18n/LocalStrings_jp.properties +++ b/src/main/java/org/olat/course/nodes/dialog/ui/_i18n/LocalStrings_jp.properties @@ -1,15 +1,4 @@ -#Tue Sep 28 20:47:49 CEST 2010 - - - - - - - - - - - +#Thu Jan 04 12:35:06 CET 2018 command.closesp=\u30A6\u30A3\u30F3\u30C9\u30A6\u3092\u9589\u3058\u308B command.show=\u5B66\u7FD2\u30B3\u30F3\u30C6\u30F3\u30C4\u3092\u8868\u793A\u3059\u308B command.showpopup=\u65B0\u3057\u3044\u30A6\u30A3\u30F3\u30C9\u30A6\u306B\u5B66\u7FD2\u30B3\u30F3\u30C6\u30F3\u30C4\u3092\u8868\u793A\u3059\u308B @@ -21,16 +10,25 @@ dialog.ablage.config.title=\u30D5\u30A1\u30A4\u30EB\u30C0\u30A4\u30A2\u30ED\u30B dialog.folder.name=\u30B9\u30C8\u30EC\u30FC\u30B8\u30D5\u30A9\u30EB\u30C0 dialog.forum.config.title=\u30B9\u30C8\u30EC\u30FC\u30B8 dialog.forum.popup.config.title=\u30D5\u30A9\u30FC\u30E9\u30E0 +dialog.selected.element=\u30D5\u30A1\u30A4\u30EB\u306B\u95A2\u3059\u308B\u30C0\u30A4\u30A2\u30ED\u30B0 dialog.start=\u30B9\u30BF\u30FC\u30C8 dialog.upload.file=\u30D5\u30A1\u30A4\u30EB\u3092\u30A2\u30C3\u30D7\u30ED\u30FC\u30C9\u3059\u308B +element.already.deleted=\u9078\u629E\u3057\u305F\u30A8\u30EC\u30E1\u30F3\u30C8\u306F\u4ED6\u306E\u30E6\u30FC\u30B6\u306B\u3088\u3063\u3066\u524A\u9664\u3055\u308C\u307E\u3057\u305F\u3002\u30C6\u30FC\u30D6\u30EB\u30D3\u30E5\u30FC\u3092\u30EA\u30D5\u30EC\u30C3\u30B7\u30E5\u3057\u3066\u304F\u3060\u3055\u3044\u3002 +element.delete=\u672C\u5F53\u306B\u30D5\u30A1\u30A4\u30EB (<b>{0}</b>) \u304A\u3088\u3073\u30D5\u30A9\u30FC\u30E9\u30E0\u3092\u524A\u9664\u3057\u3066\u3082\u3088\u308D\u3057\u3044\u3067\u3059\u304B? \u30C7\u30FC\u30BF\u306F\u3042\u306A\u305F\u306E\u30D1\u30FC\u30BD\u30CA\u30EB\u30D5\u30A9\u30EB\u30C0\u30BB\u30AF\u30B7\u30E7\u30F3\u300C\u30A2\u30FC\u30AB\u30A4\u30D6\u300D\u306B\u81EA\u52D5\u7684\u306B\u30A2\u30FC\u30AB\u30A4\u30D6\u3055\u308C\u307E\u3059\u3002 folder.info=\u30D5\u30A1\u30A4\u30EB\u30C0\u30A4\u30A2\u30ED\u30B0 folder.open=\u30D5\u30A9\u30EB\u30C0\u3092\u958B\u304F - - - - - +notifications.entry=\u65B0\u3057\u3044\u30D5\u30A1\u30A4\u30EB\: {0} \u4F5C\u6210\: {1} \u4F5C\u6210\u65E5\u6642\: {2} +notifications.header=\u30B3\u30FC\u30B9\u300C {0} \u300D\u306E\u30D5\u30A1\u30A4\u30EB\u30C0\u30A4\u30A2\u30ED\u30B0 pane.tab.accessibility=\u30A2\u30AF\u30BB\u30B9 pane.tab.dialogconfig=\u30D5\u30A9\u30FC\u30E9\u30E0/\u30B9\u30C8\u30EC\u30FC\u30B8\u8A2D\u5B9A selection.forumAsPopup.label=\u30D5\u30A9\u30FC\u30E9\u30E0\u3092\u65B0\u3057\u3044\u30DD\u30C3\u30D7\u30A2\u30C3\u30D7\u30A6\u30A3\u30F3\u30C9\u30A6\u306B\u958B\u304D\u307E\u3059\u304B? +table.header.action=\u30D5\u30A1\u30A4\u30EB +table.header.author=\u4F5C\u8005 +table.header.date=\u65E5\u4ED8 +table.header.filename=\u30D5\u30A1\u30A4\u30EB\u540D +table.header.filetype=\u30D5\u30A1\u30A4\u30EB\u30BF\u30A4\u30D7 +table.header.forum=\u30C7\u30A3\u30B9\u30AB\u30C3\u30B7\u30E7\u30F3 +table.header.messages=\u30E1\u30C3\u30BB\u30FC\u30B8 +table.header.newmessages=\u672A\u8AAD +table.header.size=\u30D5\u30A1\u30A4\u30EB\u30B5\u30A4\u30BA title_dialog=\u30D5\u30A1\u30A4\u30EB\u30C0\u30A4\u30A2\u30ED\u30B0 diff --git a/src/main/java/org/olat/course/nodes/dialog/_i18n/LocalStrings_lt.properties b/src/main/java/org/olat/course/nodes/dialog/ui/_i18n/LocalStrings_lt.properties similarity index 51% rename from src/main/java/org/olat/course/nodes/dialog/_i18n/LocalStrings_lt.properties rename to src/main/java/org/olat/course/nodes/dialog/ui/_i18n/LocalStrings_lt.properties index 6ad461669f9f1cdc872590b15d41745f171f5072..3c0e2c428139827397f4b8c6d1d91404341a0256 100644 --- a/src/main/java/org/olat/course/nodes/dialog/_i18n/LocalStrings_lt.properties +++ b/src/main/java/org/olat/course/nodes/dialog/ui/_i18n/LocalStrings_lt.properties @@ -1,14 +1,4 @@ -#Wed Jul 28 13:33:30 CEST 2010 - - - - - - - - - - +#Thu Jan 04 12:35:06 CET 2018 command.closesp=U\u017Edaryti lang\u0105 command.show=Pavaizduoti mokymosi turin\u012F command.showpopup=Pavaizduoti mokymosi turin\u012F naujame lange @@ -20,14 +10,24 @@ dialog.ablage.config.title=Rinkmenos dialogas dialog.folder.name=Aplankas dialog.forum.config.title=Laikmena dialog.forum.popup.config.title=Diskusija +dialog.selected.element=Diskusijos pavadinimas dialog.start=Paleisti dialog.upload.file=I\u0161siun\u010Diama rinkmena +element.already.deleted=Pasirinktas elementas buvo i\u0161trintas kito vartotojo. Pra\u0161ome atsinaujinti lentel\u0117s vaizd\u0105. +element.delete=Ar j\u016Bs tikrai norite i\u0161trinti rinkmen\u0105 (<b>{0}</b>) ir jos diskusij\u0105? Duomenys bus automati\u0161kai suarchyvuoti j\u016Bs\u0173 asmeniniame aplanke, sekcijoje \u201Carchyvas\u201D. folder.info=Rinkmenos dialogas folder.open=Atidaryti aplank\u0105 - - - - +notifications.entry=Nauja rinkmena pavadinimu {0} i\u0161 {1}sukurta {2} +notifications.header=Yra nauja \u017Einut\u0117(s) kurso modulyje \u201CRinkmenos dialogas\u201D pane.tab.accessibility=Prieiga pane.tab.dialogconfig=Diskusij\u0173/laikmenos s\u0105ranka selection.forumAsPopup.label=Atidaryti diskusij\u0105 i\u0161kylan\u010Diajame lange? +table.header.action=Rinkmena +table.header.author=Autorius +table.header.date=Data +table.header.filename=Rinkmenos pavadinimas +table.header.filetype=Rinkmenos tipas +table.header.forum=Diskusija +table.header.messages=\u017Dinut\u0117 +table.header.newmessages=Neskaityta +table.header.size=Rinkmenos dydis diff --git a/src/main/java/org/olat/course/nodes/dialog/_i18n/LocalStrings_nl_NL.properties b/src/main/java/org/olat/course/nodes/dialog/ui/_i18n/LocalStrings_nl_NL.properties similarity index 50% rename from src/main/java/org/olat/course/nodes/dialog/_i18n/LocalStrings_nl_NL.properties rename to src/main/java/org/olat/course/nodes/dialog/ui/_i18n/LocalStrings_nl_NL.properties index af5d451a46c8081110da574b31bd5c8cf0fcb97d..0303729cefd2902da106adcb7cbcd52728549b11 100644 --- a/src/main/java/org/olat/course/nodes/dialog/_i18n/LocalStrings_nl_NL.properties +++ b/src/main/java/org/olat/course/nodes/dialog/ui/_i18n/LocalStrings_nl_NL.properties @@ -1,15 +1,4 @@ -#Thu Sep 08 16:42:44 CEST 2011 - - - - - - - - - - - +#Thu Jan 04 12:35:07 CET 2018 command.closesp=Sluit venster command.show=Toon leerinhoud command.showpopup=Toon leerinhoud in een nieuw venster @@ -21,16 +10,25 @@ dialog.ablage.config.title=Bestandsdialoog dialog.folder.name=Bewaarmap dialog.forum.config.title=Bewaar dialog.forum.popup.config.title=Forum +dialog.selected.element=Dialoog betreffende bestand dialog.start=Start dialog.upload.file=Upload bestand +element.already.deleted=Het geselecteerde element werd door een andere gebruiker gewist. Gelieve het tabeloverzicht te verversen. +element.delete=Weet u zeker dat u bestand (<b>{0}</b>) en zijn forum wilt verwijderen? Data zal automatisch gearchiveerd worden in uw persoonlijke map, sectie 'Archief'. folder.info=Bestandsdialoog folder.open=Open map - - - - - +notifications.entry=Nieuw bestand met bestandsnaam\: {0} door {1} aangemaakt op {2} +notifications.header=Bestandsdialoog in cursus "{0}" pane.tab.accessibility=Toegang pane.tab.dialogconfig=Forum/ bewaar configuratie selection.forumAsPopup.label=Open forum in pop-upvenster +table.header.action=Bestand +table.header.author=Auteur +table.header.date=Datum +table.header.filename=Bestandsnaam +table.header.filetype=Bestandstype +table.header.forum=Discussie +table.header.messages=Bijdrage +table.header.newmessages=Ongelezen +table.header.size=Bestandsgrootte title_dialog=Bestandsdialoog diff --git a/src/main/java/org/olat/course/nodes/dialog/_i18n/LocalStrings_pl.properties b/src/main/java/org/olat/course/nodes/dialog/ui/_i18n/LocalStrings_pl.properties similarity index 51% rename from src/main/java/org/olat/course/nodes/dialog/_i18n/LocalStrings_pl.properties rename to src/main/java/org/olat/course/nodes/dialog/ui/_i18n/LocalStrings_pl.properties index e62fe2d48f3ffad2a8950083b4712073becf716c..bdd995437a3a14256b73b8233762a19e55709e15 100644 --- a/src/main/java/org/olat/course/nodes/dialog/_i18n/LocalStrings_pl.properties +++ b/src/main/java/org/olat/course/nodes/dialog/ui/_i18n/LocalStrings_pl.properties @@ -1,15 +1,4 @@ -#Mon Aug 30 14:18:00 CEST 2010 - - - - - - - - - - - +#Thu Jan 04 12:35:06 CET 2018 command.closesp=Zamknij okno command.show=Wy\u015Bwietl zawarto\u015B\u0107 edukacyjn\u0105 command.showpopup=Wy\u015Bwietl zawarto\u015B\u0107 edukacyjn\u0105 w nowym oknie @@ -18,19 +7,29 @@ condition.accessPoster.title=Przekazuj / pobieraj pliki / czytaj-zapisuj forum condition.accessReader.title=Pobieraj pliki / czytaj forum condition.accessibility.title=Dost\u0119p dialog.ablage.config.title=Okno pliku +dialog.copy.file=Kopiuj plik dialog.folder.name=Folder dialog.forum.config.title=Przechowywanie dialog.forum.popup.config.title=Forum +dialog.selected.element=Temat dyskusji dialog.start=Start dialog.upload.file=Przeka\u017C plik +element.already.deleted=Wybrany element zosta\u0142 usuni\u0119ty przez innego u\u017Cytkownika. Od\u015Bwie\u017C widok tabeli. +element.delete=Czy naprawd\u0119 chcesz usun\u0105\u0107 plik (<b>{0}</b>) i jego forum? Dane b\u0119d\u0105 automatycznie zarchiwizowane w Twoim osobistym folderze w sekcji 'archive'. folder.info=Okno pliku folder.open=Otw\u00F3rz folder - - - - - +notifications.entry=Nowy plik o nazwie\:{0} z {1} utworzony {2} +notifications.header=S\u0105 nowe pliki w module kursu "Okno pliku" pane.tab.accessibility=Dost\u0119p pane.tab.dialogconfig=Konfiguracja forum selection.forumAsPopup.label=Otwiera\u0107 forum w wyskakuj\u0105cym oknie? +table.header.action=Plik +table.header.author=Autor +table.header.date=Data +table.header.filename=Nazwa pliku +table.header.filetype=Typ pliku +table.header.forum=Dyskusja +table.header.messages=Wiadomo\u015Bci +table.header.newmessages=Nieprzeczytane +table.header.size=Rozmiar pliku title_dialog=Okno pliku diff --git a/src/main/java/org/olat/modules/dialog/_i18n/LocalStrings_pt_BR.properties b/src/main/java/org/olat/course/nodes/dialog/ui/_i18n/LocalStrings_pt_BR.properties similarity index 50% rename from src/main/java/org/olat/modules/dialog/_i18n/LocalStrings_pt_BR.properties rename to src/main/java/org/olat/course/nodes/dialog/ui/_i18n/LocalStrings_pt_BR.properties index d6d18315494763a7fec33a23bc4d393ae2eb90a2..c2c5ad948ed10a55c0570dac17cf5cf4f81bdaeb 100644 --- a/src/main/java/org/olat/modules/dialog/_i18n/LocalStrings_pt_BR.properties +++ b/src/main/java/org/olat/course/nodes/dialog/ui/_i18n/LocalStrings_pt_BR.properties @@ -1,12 +1,28 @@ -#Tue Apr 03 14:58:53 CEST 2012 +#Thu Jan 04 12:35:06 CET 2018 +command.closesp=Fechar janela +command.show=Exibir conte\u00FAdo did\u00E1tico +command.showpopup=Exibir conte\u00FAdo did\u00E1tico em nova janela +condition.accessModerator.title=Carregar/ baixar arquivos/ moderar f\u00F3rum +condition.accessPoster.title=Carregar/ baixar arquivos/ ler-escrever f\u00F3rum +condition.accessReader.title=Baixar arquivos/ ler f\u00F3rum +condition.accessibility.title=Acesso +dialog.ablage.config.title=Arquivo de di\u00E1logo dialog.copy.file=Copiar arquivo +dialog.folder.name=Pasta +dialog.forum.config.title=Armazenamento +dialog.forum.popup.config.title=F\u00F3rum dialog.selected.element=T\u00F3pico de discuss\u00E3o dialog.start=Iniciar -dialog.upload.file=Carregar arquivo +dialog.upload.file=Carregar arquivo element.already.deleted=O elemento selecionado foi apagado por outro usu\u00E1rio. Favor atualizar a tabela de visualiza\u00E7\u00E3o. element.delete=Voc\u00EA realmente quer apagar o arquivo (<b>{0}</b>) e seu f\u00F3rum? Os dados ser\u00E3o automaticamente arquivados em sua pasta pessoal, se\u00E7\u00E3o 'arquivamento'. +folder.info=Arquivo de di\u00E1logo +folder.open=Abrir pasta notifications.entry=Novo arquivo com nome\:{0} de {1} criado em {2} notifications.header=Existem novos arquivos no m\u00F3dulo de curso "Arquivos de di\u00E1logo" +pane.tab.accessibility=Acesso +pane.tab.dialogconfig=F\u00F3rum/configura\u00E7\u00E3o de armazenamento +selection.forumAsPopup.label=Abrir pasta em janela pop-up? table.header.action=Arquivar table.header.author=Autor table.header.date=Data @@ -16,3 +32,4 @@ table.header.forum=Discuss\u00E3o table.header.messages=Mensagens table.header.newmessages=N\u00E3o lido table.header.size=Tamanho do arquivo +title_dialog=Arquivo de Di\u00E1logo diff --git a/src/main/java/org/olat/modules/dialog/_i18n/LocalStrings_pt_PT.properties b/src/main/java/org/olat/course/nodes/dialog/ui/_i18n/LocalStrings_pt_PT.properties similarity index 50% rename from src/main/java/org/olat/modules/dialog/_i18n/LocalStrings_pt_PT.properties rename to src/main/java/org/olat/course/nodes/dialog/ui/_i18n/LocalStrings_pt_PT.properties index 7de307b6571b16cdae47e3edbef1c2f1e9f9441c..50007084051ae475af9cd141c1295fdce60a3f0a 100644 --- a/src/main/java/org/olat/modules/dialog/_i18n/LocalStrings_pt_PT.properties +++ b/src/main/java/org/olat/course/nodes/dialog/ui/_i18n/LocalStrings_pt_PT.properties @@ -1,11 +1,27 @@ -#Mon Mar 02 09:54:05 CET 2009 +#Thu Jan 04 12:35:07 CET 2018 +command.closesp=Fechar janela +command.show=Exibir conte\u00FAdo did\u00E1tico +command.showpopup=Exibir conte\u00FAdo did\u00E1tico em nova janela +condition.accessModerator.title=Carregar/ baixar arquivos/ moderar f\u00F3rum +condition.accessPoster.title=Carregar/ baixar arquivos/ ler-escrever f\u00F3rum +condition.accessReader.title=Baixar arquivos/ ler f\u00F3rum +condition.accessibility.title=Acesso +dialog.ablage.config.title=Arquivo de di\u00E1logo +dialog.folder.name=Pasta +dialog.forum.config.title=Armazenamento +dialog.forum.popup.config.title=F\u00F3rum dialog.selected.element=T\u00F3pico de discuss\u00E3o dialog.start=Iniciar -dialog.upload.file=Carregar arquivo +dialog.upload.file=Carregar arquivo element.already.deleted=O elemento selecionado foi apagado por outro usu\u00E1rio. Favor atualizar a tabela de visualiza\u00E7\u00E3o. element.delete=Voc\u00EA realmente quer apagar o arquivo (<b>{0}</b>) e seu f\u00F3rum? Os dados ser\u00E3o automaticamente arquivados em sua pasta pessoal, se\u00E7\u00E3o 'arquivamento'. +folder.info=Arquivo de di\u00E1logo +folder.open=Abrir pasta notifications.entry=Novo arquivo com nome\:{0} de {1} criado em {2} notifications.header=Existem novos arquivos no m\u00F3dulo de curso "Arquivos de di\u00E1logo" +pane.tab.accessibility=Acesso +pane.tab.dialogconfig=F\u00F3rum/configura\u00E7\u00E3o de armazenamento +selection.forumAsPopup.label=Abrir pasta em janela pop-up? table.header.action=Arquivar table.header.author=Autor table.header.date=Data diff --git a/src/main/java/org/olat/modules/dialog/_i18n/LocalStrings_ru.properties b/src/main/java/org/olat/course/nodes/dialog/ui/_i18n/LocalStrings_ru.properties similarity index 51% rename from src/main/java/org/olat/modules/dialog/_i18n/LocalStrings_ru.properties rename to src/main/java/org/olat/course/nodes/dialog/ui/_i18n/LocalStrings_ru.properties index f10bf584b1477b67a06e6fab87eda113de509462..81d6ddc56a07ba2d5174b567607738b8e5b0364a 100644 --- a/src/main/java/org/olat/modules/dialog/_i18n/LocalStrings_ru.properties +++ b/src/main/java/org/olat/course/nodes/dialog/ui/_i18n/LocalStrings_ru.properties @@ -1,11 +1,27 @@ -#Mon Mar 02 09:54:19 CET 2009 +#Thu Jan 04 12:35:06 CET 2018 +command.closesp=\u0417\u0430\u043A\u0440\u044B\u0442\u044C \u043E\u043A\u043D\u043E +command.show=\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u0443\u0447\u0435\u0431\u043D\u043E\u0435 \u0441\u043E\u0434\u0435\u0440\u0436\u0430\u043D\u0438\u0435 +command.showpopup=\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u0443\u0447\u0435\u0431\u043D\u043E\u0435 \u0441\u043E\u0434\u0435\u0440\u0436\u0430\u043D\u0438\u0435 \u0432 \u043D\u043E\u0432\u043E\u043C \u043E\u043A\u043D\u0435 +condition.accessModerator.title=\u0417\u0430\u0433\u0440\u0443\u0437\u043A\u0430 \u0438 \u0441\u043A\u0430\u0447\u0438\u0432\u0430\u043D\u0438\u0435 \u0444\u0430\u0439\u043B\u043E\u0432 / \u041C\u043E\u0434\u0435\u0440\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u0435 \u0432 \u0444\u043E\u0440\u0443\u043C\u0435 +condition.accessPoster.title=\u0417\u0430\u0433\u0440\u0443\u0437\u043A\u0430 \u0438 \u0441\u043A\u0430\u0447\u0438\u0432\u0430\u043D\u0438\u0435 \u0444\u0430\u0439\u043B\u043E\u0432 / \u0427\u0438\u0442\u0430\u0442\u044C \u0438 \u043F\u0438\u0441\u0430\u0442\u044C \u0432 \u0444\u043E\u0440\u0443\u043C\u0435 +condition.accessReader.title=\u0422\u043E\u043B\u044C\u043A\u043E \u0441\u043A\u0430\u0447\u0438\u0432\u0430\u043D\u0438\u0435 \u0444\u0430\u0439\u043B\u043E\u0432 / \u0422\u043E\u043B\u044C\u043A\u043E \u0447\u0442\u0435\u043D\u0438\u0435 \u0432 \u0444\u043E\u0440\u0443\u043C\u0435 +condition.accessibility.title=\u0414\u043E\u0441\u0442\u0443\u043F +dialog.ablage.config.title=\u041E\u0431\u0441\u0443\u0436\u0434\u0435\u043D\u0438\u0435 \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u0430 +dialog.folder.name=\u041F\u0430\u043F\u043A\u0430 \u0434\u043B\u044F \u0444\u0430\u0439\u043B\u043E\u0432 +dialog.forum.config.title=\u041F\u0430\u043F\u043A\u0430 +dialog.forum.popup.config.title=\u0424\u043E\u0440\u0443\u043C dialog.selected.element=\u041E\u0431\u0441\u0443\u0436\u0434\u0435\u043D\u0438\u0435 \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u0430 -dialog.start=\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C +dialog.start=\u0421\u0442\u0430\u0440\u0442 dialog.upload.file=\u041F\u0435\u0440\u0435\u0441\u043B\u0430\u0442\u044C \u0444\u0430\u0439\u043B element.already.deleted=\u0412\u044B\u0431\u0440\u0430\u043D\u043D\u044B\u0439 \u044D\u043B\u0435\u043C\u0435\u043D\u0442 \u0432 \u0442\u0435\u0447\u0435\u043D\u0438\u0435 \u044D\u0442\u043E\u0433\u043E \u0432\u0440\u0435\u043C\u0435\u043D\u0438 \u0431\u044B\u043B \u0443\u0434\u0430\u043B\u0451\u043D \u0434\u0440\u0443\u0433\u0438\u043C \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u0435\u043C. \u041F\u043E\u0436\u0430\u0439\u043B\u0443\u0441\u0442\u0430, \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u0435 \u0442\u0430\u0431\u043B\u0438\u0446\u0443 \u0441\u043D\u043E\u0432\u0430. element.delete=\u0412\u044B \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043B\u044C\u043D\u043E \u0445\u043E\u0442\u0438\u0442\u0435 \u0443\u0434\u0430\u043B\u0438\u0442\u044C \u0444\u0430\u0439\u043B (<b>{0}</b>) \u0432\u043A\u043B\u044E\u0447\u0430\u044F \u0435\u0433\u043E \u043E\u0431\u0441\u0443\u0436\u0434\u0435\u043D\u0438\u0435? \u042D\u0442\u0438 \u0434\u0430\u043D\u043D\u044B\u0435 \u0431\u0443\u0434\u0443\u0442 \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438 \u043F\u043E\u043C\u0435\u0449\u0435\u043D\u044B \u0432 \u0412\u0430\u0448\u0443 \u043B\u0438\u0447\u043D\u0443\u044E \u043F\u0430\u043F\u043A\u0443 \u043F\u043E\u0434 \u0438\u043C\u0435\u043D\u0435\u043C '\u0410\u0440\u0445\u0438\u0432'. +folder.info=\u041E\u0431\u0441\u0443\u0436\u0434\u0435\u043D\u0438\u0435 \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u0430 +folder.open=\u041E\u0442\u043A\u0440\u044B\u0442\u044C \u043F\u0430\u043F\u043A\u0443 notifications.entry=\u041D\u043E\u0432\u043E\u0435 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0435 \u0441 \u0438\u043C\u0435\u043D\u0435\u043C\:{0} \u043E\u0442 {1} \u0441\u043E\u0437\u0434\u0430\u043D\u043E {2} notifications.header=\u041D\u043E\u0432\u044B\u0435 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F \u0432 \u043C\u043E\u0434\u0443\u043B\u0435 \u043A\u0443\u0440\u0441\u0430 "\u041E\u0431\u0441\u0443\u0436\u0434\u0435\u043D\u0438\u0435 \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u0430" +pane.tab.accessibility=\u0414\u043E\u0441\u0442\u0443\u043F +pane.tab.dialogconfig=\u041A\u043E\u043D\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044F \u043F\u0430\u043F\u043A\u0438/\u0444\u043E\u0440\u0443\u043C\u0430 +selection.forumAsPopup.label=\u041E\u0442\u043A\u0440\u044B\u0442\u044C \u0444\u043E\u0440\u0443\u043C \u0432\u043E \u0432\u0441\u043F\u043B\u044B\u0432\u0430\u044E\u0449\u0435\u043C \u043E\u043A\u043D\u0435 (pop-up)? table.header.action=\u0424\u0430\u0439\u043B table.header.author=\u0410\u0432\u0442\u043E\u0440 table.header.date=\u0414\u0430\u0442\u0430 diff --git a/src/main/java/org/olat/modules/dialog/_i18n/LocalStrings_sq.properties b/src/main/java/org/olat/course/nodes/dialog/ui/_i18n/LocalStrings_sq.properties similarity index 53% rename from src/main/java/org/olat/modules/dialog/_i18n/LocalStrings_sq.properties rename to src/main/java/org/olat/course/nodes/dialog/ui/_i18n/LocalStrings_sq.properties index 90f58f5a1bf6cee23034778bc4474f53a53cbbfe..bbe23e150d3ed3512771c4e588bfe4bca6eb943f 100644 --- a/src/main/java/org/olat/modules/dialog/_i18n/LocalStrings_sq.properties +++ b/src/main/java/org/olat/course/nodes/dialog/ui/_i18n/LocalStrings_sq.properties @@ -1,11 +1,27 @@ -#Mon Mar 02 09:54:12 CET 2009 +#Thu Jan 04 12:35:06 CET 2018 +command.closesp=Mbylle dritaren +command.show=Shfaq p\u00EBrmbajtje m\u00EBsimi +command.showpopup=Shfaqet p\u00EBrmbajtja e m\u00EBsimit n\u00EB dritare t\u00EB re +condition.accessModerator.title=Ngarko / shkarko skedar\u00EBt / forum moderimi +condition.accessPoster.title=Ngarko / shkarko skedar\u00EBt / forum lexim-shkrimi +condition.accessReader.title=Shkarko skedar\u00EBt / forum leximi +condition.accessibility.title=Qasja +dialog.ablage.config.title=Dialog skedari +dialog.folder.name=Dosja +dialog.forum.config.title=Ruajtja +dialog.forum.popup.config.title=Forumi dialog.selected.element=Tem\u00EB diskutimi -dialog.start=Nisu +dialog.start=Nise dialog.upload.file=Ngarko skedar element.already.deleted=Elementi i p\u00EBrzgjedhur \u00EBsht\u00EB fshir\u00EB nga nj\u00EB shfryt\u00EBzues tjet\u00EBr. Ju lutemi rifreskoni pamjen e tabel\u00EBs. element.delete=A doni me t\u00EB v\u00EBrtet\u00EB t\u00EB fshini skedarin (<b>{0}</b>) dhe formumin e tij? T\u00EB dh\u00EBnat automatikisht do t\u00EB arkivohet n\u00EB dosjen tuaj personale, sekstioni 'Arkiva'. +folder.info=Dialog skedari +folder.open=Hap dosje notifications.entry=Skedar i ri me emrin \:{0} nga {1} krijuar m\u00EB {2} notifications.header=Ka skedar\u00EB t\u00EB rinj\u00EB nj\u00EB modulin e kursit "Dialogu i skedar\u00EBve" +pane.tab.accessibility=Qasja +pane.tab.dialogconfig=Konfigurimini i forumit +selection.forumAsPopup.label=Hape forumin n\u00EB dritare k\u00EBrcyese? table.header.action=Skedar table.header.author=Autori table.header.date=Data diff --git a/src/main/java/org/olat/course/nodes/dialog/_i18n/LocalStrings_zh_CN.properties b/src/main/java/org/olat/course/nodes/dialog/ui/_i18n/LocalStrings_zh_CN.properties similarity index 52% rename from src/main/java/org/olat/course/nodes/dialog/_i18n/LocalStrings_zh_CN.properties rename to src/main/java/org/olat/course/nodes/dialog/ui/_i18n/LocalStrings_zh_CN.properties index a94977478acde3cfdd158b261d1df49c39c748f1..a5aa17c5a1ba89fcf280775bf52081a6073ee5e3 100644 --- a/src/main/java/org/olat/course/nodes/dialog/_i18n/LocalStrings_zh_CN.properties +++ b/src/main/java/org/olat/course/nodes/dialog/ui/_i18n/LocalStrings_zh_CN.properties @@ -1,14 +1,4 @@ -#Tue Aug 17 15:37:44 CEST 2010 - - - - - - - - - - +#Thu Jan 04 12:35:06 CET 2018 command.closesp=\u5173\u95ED\u7A97\u53E3 command.show=\u663E\u793A\u5B66\u4E60\u5185\u5BB9 command.showpopup=\u5728\u7A97\u53E3\u91CC\u663E\u793A\u5B66\u4E60\u5185\u5BB9 @@ -20,15 +10,25 @@ dialog.ablage.config.title=\u6587\u4EF6\u8BA8\u8BBA dialog.folder.name=\u6587\u4EF6\u5939 dialog.forum.config.title=\u5B58\u50A8 dialog.forum.popup.config.title=\u8BBA\u575B +dialog.selected.element=\u4E3B\u9898 dialog.start=\u5F00\u59CB dialog.upload.file=\u4E0A\u4F20\u6587\u4EF6 +element.already.deleted=\u53E6\u4E00\u4E2A\u7528\u6237\u5DF2\u5220\u9664\u9009\u4E2D\u7684\u5143\u7D20. \u8BF7\u66F4\u65B0\u5217\u8868. +element.delete=\u4F60\u786E\u5B9A\u8981\u5220\u9664\u8BE5\u6587\u4EF6 (<b>{0}</b>) \u53CA\u5176\u8BBA\u575B? \u6570\u636E\u5C06\u81EA\u52A8\u5B58\u50A8\u5230\u4F60\u7684\u4E2A\u4EBA\u6587\u4EF6\u5939 '\u5F52\u6863'\u4E2D\u3002 folder.info=\u6587\u4EF6\u8BA8\u8BBA folder.open=\u6253\u5F00\u6587\u4EF6\u5939 - - - - +notifications.entry=\u65B0\u6587\u4EF6\:{1} \u5728 {2}\u521B\u5EFA\u7684\u65B0\u6587\u4EF6 {0} +notifications.header=\u5728"\u6587\u4EF6\u8BA8\u8BBA"\u4E2D\u6709\u65B0\u6587\u4EF6(s) pane.tab.accessibility=\u8BBF\u95EE pane.tab.dialogconfig=\u8BBA\u575B/\u5B58\u50A8\u914D\u7F6E selection.forumAsPopup.label=\u5728\u5F39\u51FA\u7A97\u53E3\u91CC\u6253\u5F00\u8BBA\u575B\uFF1F +table.header.action=\u6587\u4EF6 +table.header.author=\u521B\u5EFA\u4EBA +table.header.date=\u65E5\u671F +table.header.filename=\u6587\u4EF6\u540D +table.header.filetype=\u6587\u4EF6\u7C7B\u578B +table.header.forum=\u8BA8\u8BBA +table.header.messages=\u6D88\u606F +table.header.newmessages=\u672A\u8BFB +table.header.size=\u6587\u4EF6\u5927\u5C0F title_dialog=\u6587\u4EF6\u8BA8\u8BBA diff --git a/src/main/java/org/olat/modules/dialog/_i18n/LocalStrings_zh_TW.properties b/src/main/java/org/olat/course/nodes/dialog/ui/_i18n/LocalStrings_zh_TW.properties similarity index 51% rename from src/main/java/org/olat/modules/dialog/_i18n/LocalStrings_zh_TW.properties rename to src/main/java/org/olat/course/nodes/dialog/ui/_i18n/LocalStrings_zh_TW.properties index 8fd456ec0fd7eefcba77ac839813bbb0dfb5c91d..4603f1e7de99dc9431d863da8749a6b4b9ed836e 100644 --- a/src/main/java/org/olat/modules/dialog/_i18n/LocalStrings_zh_TW.properties +++ b/src/main/java/org/olat/course/nodes/dialog/ui/_i18n/LocalStrings_zh_TW.properties @@ -1,11 +1,27 @@ -#Mon Mar 02 09:54:06 CET 2009 +#Thu Jan 04 12:35:06 CET 2018 +command.closesp=\u95DC\u9589\u8996\u7A97 +command.show=\u986F\u793A\u5B78\u7FD2\u5167\u5BB9 +command.showpopup=\u5728\u65B0\u8996\u7A97\u986F\u793A\u5B78\u7FD2\u5167\u5BB9 +condition.accessModerator.title=\u4E0A\u50B3 / \u4E0B\u8F09\u6A94\u6848 / \u7BA1\u7406\u8AD6\u58C7 +condition.accessPoster.title=\u4E0A\u50B3 / \u4E0B\u8F09\u6A94\u6848 / \u8B80\u53D6/\u5BEB\u5165\u8AD6\u58C7 +condition.accessReader.title=\u4E0B\u8F09\u6A94\u6848 / \u8B80\u53D6\u8AD6\u58C7 +condition.accessibility.title=\u5B58\u53D6 +dialog.ablage.config.title=\u6A94\u6848\u5C0D\u8A71\u6846 +dialog.folder.name=\u8CC7\u6599\u593E +dialog.forum.config.title=\u5132\u5B58\u5340 +dialog.forum.popup.config.title=\u8AD6\u58C7 dialog.selected.element=\u8A0E\u8AD6\u4E3B\u984C dialog.start=\u958B\u59CB dialog.upload.file=\u4E0A\u50B3\u6A94\u6848 element.already.deleted=\u9078\u64C7\u7684\u5143\u7D20\u5DF2\u88AB\u5176\u4ED6\u4F7F\u7528\u8005\u522A\u9664\u3002 \u8ACB\u91CD\u65B0\u6574\u7406\u8868\u683C\u8996\u89C0\u3002 element.delete=\u60A8\u771F\u7684\u8981\u522A\u9664\u6A94\u6848 (<b>{0}</b>) \u548C\u5B83\u7684\u8AD6\u58C7\u55CE\uFF1F \u8CC7\u6599\u5C07\u81EA\u52D5\u5099\u4EFD\u5230\u60A8\u7684\u500B\u4EBA\u8CC7\u6599\u593E\uFF0C\u5728 'Archive' \u5206\u5340\u3002 +folder.info=\u6A94\u6848\u5C0D\u8A71\u6846 +folder.open=\u958B\u555F\u8CC7\u6599\u593E notifications.entry=\u65B0\u6A94\u6848\u4EE5\u6A94\u540D\uFF1A{0} \u81EA {1} \u5EFA\u7ACB\u65BC {2} notifications.header=\u5728\u8AB2\u7A0B\u6A21\u7D44\u300C\u6A94\u6848\u5C0D\u8A71\u6846\u300D\u4E2D\u6709\u65B0\u6A94\u6848 +pane.tab.accessibility=\u5B58\u53D6 +pane.tab.dialogconfig=\u8AD6\u58C7/\u5132\u5B58\u5340\u8A2D\u5B9A +selection.forumAsPopup.label=\u5728\u5F48\u51FA\u8996\u7A97\u958B\u555F\u8AD6\u58C7\uFF1F table.header.action=\u6A94\u6848 table.header.author=\u4F5C\u8005 table.header.date=\u65E5\u671F @@ -15,3 +31,4 @@ table.header.forum=\u8A0E\u8AD6 table.header.messages=\u6587\u7AE0 table.header.newmessages=\u672A\u8B80\u53D6 table.header.size=\u6A94\u6848\u5927\u5C0F +title_dialog=\u6A94\u6848\u5C0D\u8A71\u6846 diff --git a/src/main/java/org/olat/modules/dialog/_i18n/i18nBundleMetadata.properties b/src/main/java/org/olat/course/nodes/dialog/ui/_i18n/i18nBundleMetadata.properties similarity index 100% rename from src/main/java/org/olat/modules/dialog/_i18n/i18nBundleMetadata.properties rename to src/main/java/org/olat/course/nodes/dialog/ui/_i18n/i18nBundleMetadata.properties diff --git a/src/main/java/org/olat/modules/dialog/DialogElementsController.java b/src/main/java/org/olat/modules/dialog/DialogElementsController.java deleted file mode 100644 index fec175bff5072702b56bdc41b719c75deadc6cfc..0000000000000000000000000000000000000000 --- a/src/main/java/org/olat/modules/dialog/DialogElementsController.java +++ /dev/null @@ -1,492 +0,0 @@ -/** -* OLAT - Online Learning and Training<br> -* http://www.olat.org -* <p> -* Licensed under the Apache License, Version 2.0 (the "License"); <br> -* you may not use this file except in compliance with the License.<br> -* You may obtain a copy of the License at -* <p> -* http://www.apache.org/licenses/LICENSE-2.0 -* <p> -* Unless required by applicable law or agreed to in writing,<br> -* software distributed under the License is distributed on an "AS IS" BASIS, <br> -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> -* See the License for the specific language governing permissions and <br> -* limitations under the License. -* <p> -* Copyright (c) since 2004 at Multimedia- & E-Learning Services (MELS),<br> -* University of Zurich, Switzerland. -* <hr> -* <a href="http://www.openolat.org"> -* OpenOLAT - Online Learning and Training</a><br> -* This file has been modified by the OpenOLAT community. Changes are licensed -* under the Apache 2.0 license as the original file. -*/ - -package org.olat.modules.dialog; - -import java.io.File; -import java.util.ArrayList; -import java.util.Date; -import java.util.Iterator; -import java.util.List; - -import org.olat.core.commons.controllers.linkchooser.LinkChooserController; -import org.olat.core.commons.controllers.linkchooser.URLChoosenEvent; -import org.olat.core.commons.modules.bc.FileUploadController; -import org.olat.core.commons.modules.bc.FolderConfig; -import org.olat.core.commons.modules.bc.FolderEvent; -import org.olat.core.commons.modules.bc.vfs.OlatRootFolderImpl; -import org.olat.core.commons.services.notifications.NotificationsManager; -import org.olat.core.commons.services.notifications.PublisherData; -import org.olat.core.commons.services.notifications.SubscriptionContext; -import org.olat.core.commons.services.notifications.ui.ContextualSubscriptionController; -import org.olat.core.gui.UserRequest; -import org.olat.core.gui.components.Component; -import org.olat.core.gui.components.link.Link; -import org.olat.core.gui.components.link.LinkFactory; -import org.olat.core.gui.components.panel.StackedPanel; -import org.olat.core.gui.components.table.TableController; -import org.olat.core.gui.components.table.TableEvent; -import org.olat.core.gui.components.table.TableGuiConfiguration; -import org.olat.core.gui.components.velocity.VelocityContainer; -import org.olat.core.gui.control.Controller; -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.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.gui.control.generic.popup.PopupBrowserWindow; -import org.olat.core.gui.control.generic.title.TitleInfo; -import org.olat.core.id.Identity; -import org.olat.core.logging.OLATRuntimeException; -import org.olat.core.logging.activity.CourseLoggingAction; -import org.olat.core.logging.activity.ThreadLocalUserActivityLogger; -import org.olat.core.util.Formatter; -import org.olat.core.util.Util; -import org.olat.core.util.resource.OresHelper; -import org.olat.core.util.vfs.Quota; -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.olat.core.util.vfs.VFSMediaResource; -import org.olat.core.util.vfs.filters.VFSLeafFilter; -import org.olat.course.CourseFactory; -import org.olat.course.CourseModule; -import org.olat.course.ICourse; -import org.olat.course.groupsandrights.CourseRights; -import org.olat.course.nodes.CourseNode; -import org.olat.course.nodes.DialogCourseNode; -import org.olat.course.nodes.dialog.DialogConfigForm; -import org.olat.course.nodes.dialog.DialogNodeForumCallback; -import org.olat.course.nodes.dialog.ReadOnlyDialogNodeForumCallback; -import org.olat.course.properties.CoursePropertyManager; -import org.olat.course.run.userview.NodeEvaluation; -import org.olat.course.run.userview.UserCourseEnvironment; -import org.olat.modules.fo.Forum; -import org.olat.modules.fo.ForumCallback; -import org.olat.modules.fo.ForumUIFactory; -import org.olat.modules.fo.manager.ForumManager; -import org.olat.repository.RepositoryEntry; -import org.olat.repository.RepositoryManager; -import org.olat.util.logging.activity.LoggingResourceable; - -/** - * Description:<br> - * TODO: guido Class Description for DialogController - * <P> - * Initial Date: 03.11.2005 <br> - * - * @author guido - */ -public class DialogElementsController extends BasicController { - - protected static final String ACTION_START_FORUM = "startforum"; - protected static final String ACTION_SHOW_FILE = "showfile"; - protected static final String ACTION_DELETE_ELEMENT = "delete"; - private static final int TABLE_RESULTS_PER_PAGE = 5; - - private DialogElementsPropertyManager dialogElmsMgr; - private VelocityContainer content; - private TableController tableCtr; - private CourseNode courseNode; - private FileUploadController fileUplCtr; - private LinkChooserController fileCopyCtr; - private StackedPanel dialogPanel; - private ForumManager forumMgr; - private DialogElement recentDialogElement, selectedElement; - private DialogElementsTableModel tableModel; - private DialogBoxController confirmDeletionCtr; - private ContextualSubscriptionController csCtr; - private ForumCallback forumCallback; - private SubscriptionContext subsContext; - private CoursePropertyManager coursePropMgr; - private boolean isOlatAdmin; - private boolean isGuestOnly; - private NodeEvaluation nodeEvaluation; - private UserCourseEnvironment userCourseEnv; - private TableGuiConfiguration tableConf; - private Link uploadButton; - private Link copyButton; - private Controller forumCtr; - private CloseableModalController cmc; - - public DialogElementsController(UserRequest ureq, WindowControl wControl, CourseNode courseNode, UserCourseEnvironment userCourseEnv, - NodeEvaluation nodeEvaluation) { - super(ureq, wControl); - this.nodeEvaluation = nodeEvaluation; - this.userCourseEnv = userCourseEnv; - this.coursePropMgr = userCourseEnv.getCourseEnvironment().getCoursePropertyManager(); - this.courseNode = courseNode; - forumMgr = ForumManager.getInstance(); - dialogElmsMgr = DialogElementsPropertyManager.getInstance(); - - content = createVelocityContainer("dialog"); - uploadButton = LinkFactory.createButton("dialog.upload.file", content, this); - uploadButton.setIconLeftCSS("o_icon o_icon-fw o_icon_upload"); - uploadButton.setElementCssClass("o_sel_dialog_upload"); - - isOlatAdmin = ureq.getUserSession().getRoles().isOLATAdmin(); - isGuestOnly = ureq.getUserSession().getRoles().isGuestOnly(); - - // add copy from course folder if user has course editor rights (course owner and users in a right group with the author right) - Identity identity = ureq.getIdentity(); - ICourse course = CourseFactory.loadCourse(userCourseEnv.getCourseEnvironment().getCourseResourceableId()); - RepositoryManager rm = RepositoryManager.getInstance(); - RepositoryEntry entry = rm.lookupRepositoryEntry(course, true); - if (isOlatAdmin || rm.isOwnerOfRepositoryEntry(identity, entry) - || userCourseEnv.getCourseEnvironment().getCourseGroupManager().hasRight(identity, CourseRights.RIGHT_COURSEEDITOR)) { - copyButton = LinkFactory.createButton("dialog.copy.file", content, this); - } - - forumCallback = userCourseEnv.isCourseReadOnly() ? - new ReadOnlyDialogNodeForumCallback(nodeEvaluation, isOlatAdmin, isGuestOnly, subsContext) : - new DialogNodeForumCallback(nodeEvaluation, isOlatAdmin, isGuestOnly, subsContext); - content.contextPut("security", forumCallback); - - if(isGuestOnly){ - //guests cannot subscribe (OLAT-2019) - subsContext = null; - }else{ - subsContext = CourseModule.createSubscriptionContext(userCourseEnv.getCourseEnvironment(), courseNode); - } - - // if sc is null, then no subscription is desired - if (subsContext != null) { - // FIXME:fj: implement subscription callback for group forums - String businessPath = wControl.getBusinessControl().getAsString(); - PublisherData pdata = new PublisherData(OresHelper.calculateTypeName(DialogElement.class), "", businessPath); - csCtr = new ContextualSubscriptionController(ureq, getWindowControl(), subsContext, pdata); - listenTo(csCtr); - content.put("subscription", csCtr.getInitialComponent()); - } - //configure and display table - tableConf = new TableGuiConfiguration(); - tableConf.setResultsPerPage(TABLE_RESULTS_PER_PAGE); - tableConf.setPreferencesOffered(true, "FileDialogElementsTable"); - tableConf.setDownloadOffered(true); - dialogPanel = putInitialPanel(content); - showOverviewTable(ureq, forumCallback); - } - - private void showOverviewTable(UserRequest ureq, ForumCallback callback) { - removeAsListenerAndDispose(tableCtr); - tableCtr = new TableController(tableConf, ureq, getWindowControl(), getTranslator()); - DialogPropertyElements elements = dialogElmsMgr.findDialogElements(coursePropMgr, courseNode); - List<DialogElement> list = new ArrayList<DialogElement>(); - tableModel = new DialogElementsTableModel(getTranslator(), callback, courseNode.getModuleConfiguration()); - if (elements != null) list = elements.getDialogPropertyElements(); - for (Iterator<DialogElement> iter = list.iterator(); iter.hasNext();) { - DialogElement element = iter.next(); - Integer msgCount = forumMgr.countMessagesByForumID(element.getForumKey()); - element.setMessagesCount(msgCount); - element.setNewMessages(new Integer(msgCount.intValue() - - forumMgr.countReadMessagesByUserAndForum(ureq.getIdentity(), element.getForumKey()))); - } - tableModel.setEntries(list); - tableModel.addColumnDescriptors(tableCtr); - tableCtr.setTableDataModel(tableModel); - tableCtr.modelChanged(); - tableCtr.setSortColumn(3, false); - listenTo(tableCtr); - content.put("dialogElementsTable", tableCtr.getInitialComponent()); - dialogPanel.setContent(content); - } - - /** - * @see org.olat.core.gui.control.DefaultController#event(org.olat.core.gui.UserRequest, - * org.olat.core.gui.components.Component, org.olat.core.gui.control.Event) - */ - @Override - public void event(UserRequest ureq, Controller source, Event event) { - DialogElement entry = null; - // process table events - if (source == tableCtr) { - TableEvent te = (TableEvent) event; - String command = te.getActionId(); - int row = te.getRowId(); - entry = tableModel.getEntryAt(row); - if (command.equals(ACTION_START_FORUM)) { - selectedElement = dialogElmsMgr.findDialogElement(coursePropMgr, courseNode, entry.getForumKey()); - if(selectedElement == null){ - showInfo("element.already.deleted"); - return; - } - Forum forum = null; - forum = forumMgr.loadForum(entry.getForumKey()); - content.contextPut("hasSelectedElement", Boolean.TRUE); - content.contextPut("selectedElement", selectedElement); - - // display forum either inline or as popup - String integration = (String) courseNode.getModuleConfiguration().get(DialogConfigForm.DIALOG_CONFIG_INTEGRATION); - - subsContext = CourseModule.createSubscriptionContext(userCourseEnv.getCourseEnvironment(), courseNode, forum.getKey().toString()); - forumCallback = userCourseEnv.isCourseReadOnly() ? - new ReadOnlyDialogNodeForumCallback(nodeEvaluation, isOlatAdmin, isGuestOnly, subsContext) : - new DialogNodeForumCallback(nodeEvaluation, isOlatAdmin, isGuestOnly, subsContext); - content.contextPut("security", forumCallback); - - if (integration.equals(DialogConfigForm.CONFIG_INTEGRATION_VALUE_INLINE)) { - removeAsListenerAndDispose(forumCtr); - forumCtr = ForumUIFactory.getStandardForumController(ureq, getWindowControl(), forum, forumCallback); - listenTo(forumCtr); - content.contextPut("hasInlineForum", Boolean.TRUE); - content.put("forum", forumCtr.getInitialComponent()); - } else { - content.contextPut("hasInlineForum", Boolean.FALSE); - TitleInfo titleInfo = new TitleInfo(translate("dialog.selected.element"), selectedElement.getFilename()); - PopupBrowserWindow pbw = ForumUIFactory.getPopupableForumController(ureq, getWindowControl(), forum, forumCallback, titleInfo); - pbw.open(ureq); - } - - } else if (command.equals(ACTION_SHOW_FILE)) { - doFileDelivery(ureq, entry.getForumKey()); - } else if (command.equals(ACTION_DELETE_ELEMENT)) { - selectedElement = entry; - confirmDeletionCtr = activateYesNoDialog(ureq, translate("delete"), translate("element.delete", entry.getFilename()), confirmDeletionCtr); - return; - } - // process file upload events - } else if (source == cmc) { - // reset recent element - recentDialogElement = null; - showOverviewTable(ureq, forumCallback); - // cleanup - removeAsListenerAndDispose(cmc); - cmc = null; - removeAsListenerAndDispose(fileUplCtr); - fileUplCtr = null; - - } else if (source == fileUplCtr) { - // clear dialog - cmc.deactivate(); - removeAsListenerAndDispose(cmc); - cmc = null; - // event. - if (event.getCommand().equals(FolderEvent.UPLOAD_EVENT)) { - String filename = null; - try { - // get size of file - OlatRootFolderImpl forumContainer = getForumContainer(recentDialogElement.getForumKey()); - VFSLeaf vl = (VFSLeaf) forumContainer.getItems().get(0); - String fileSize = Formatter.formatBytes(vl.getSize()); - - // new dialog element - filename = ((FolderEvent) event).getFilename(); - DialogElement element = new DialogElement(); - element.setAuthor(recentDialogElement.getAuthor()); - element.setDate(new Date()); - element.setFilename(filename); - element.setForumKey(recentDialogElement.getForumKey()); - element.setFileSize(fileSize); - - // do logging - //ThreadLocalUserActivityLogger.log(CourseLoggingAction.DIALOG_ELEMENT_FILE_UPLOADED, getClass(), LoggingResourceable.wrapUploadFile(filename)); - - - // inform subscription manager about new element - if (subsContext != null) { - NotificationsManager.getInstance().markPublisherNews(subsContext, ureq.getIdentity(), true); - } - //everything when well so save the property - dialogElmsMgr.addDialogElement(coursePropMgr, courseNode, element); - } catch (Exception e) { - // - throw new OLATRuntimeException(DialogElementsController.class, "Error while adding new 'file discussion' element with filename: "+filename, e); - } - } - // cleanup file upload controller - removeAsListenerAndDispose(fileUplCtr); - fileUplCtr = null; - // reset recent element - recentDialogElement = null; - showOverviewTable(ureq, forumCallback); - - } else if (source == fileCopyCtr) { - if (event == Event.DONE_EVENT || event == Event.CANCELLED_EVENT) { - // reset recent element - recentDialogElement = null; - showOverviewTable(ureq, forumCallback); - } else if (event instanceof URLChoosenEvent) { - URLChoosenEvent choosenEvent = (URLChoosenEvent)event; - String fileUrl = choosenEvent.getURL(); - if(fileUrl.indexOf("://") < 0) { - //copy file - VFSContainer courseContainer = userCourseEnv.getCourseEnvironment().getCourseFolderContainer(); - VFSLeaf vl = (VFSLeaf) courseContainer.resolve(fileUrl); - OlatRootFolderImpl forumContainer = getForumContainer(recentDialogElement.getForumKey()); - VFSLeaf copyVl = forumContainer.createChildLeaf(vl.getName()); - if(copyVl == null) { - copyVl = (VFSLeaf)forumContainer.resolve(vl.getName()); - } - VFSManager.copyContent(vl, copyVl); - - // get size of file - String fileSize = Formatter.formatBytes(copyVl.getSize()); - - DialogElement element = new DialogElement(); - element.setAuthor(recentDialogElement.getAuthor()); - element.setDate(new Date()); - element.setFilename(vl.getName()); - element.setForumKey(recentDialogElement.getForumKey()); - element.setFileSize(fileSize); - - // do logging - //ThreadLocalUserActivityLogger.log(CourseLoggingAction.DIALOG_ELEMENT_FILE_UPLOADED, getClass(), LoggingResourceable.wrapUploadFile(filename)); - - // inform subscription manager about new element - if (subsContext != null) { - NotificationsManager.getInstance().markPublisherNews(subsContext, ureq.getIdentity(), true); - } - //everything when well so save the property - dialogElmsMgr.addDialogElement(coursePropMgr, courseNode, element); - } - - //not supported - recentDialogElement = null; - showOverviewTable(ureq, forumCallback); - } - } else if (source == confirmDeletionCtr) { - if (DialogBoxUIFactory.isYesEvent(event)) { - DialogCourseNode node = (DialogCourseNode) courseNode; - // archive data to personal folder - node.doArchiveElement(selectedElement, CourseFactory.getOrCreateDataExportDirectory(getIdentity(), node.getShortTitle()), getLocale()); - // delete element - dialogElmsMgr.deleteDialogElement(coursePropMgr, courseNode, selectedElement.getForumKey()); - forumMgr.deleteForum(selectedElement.getForumKey()); - showOverviewTable(ureq, forumCallback); - content.contextPut("hasSelectedElement", Boolean.FALSE); - //do logging - ThreadLocalUserActivityLogger.log(CourseLoggingAction.DIALOG_ELEMENT_FILE_DELETED, getClass(), - LoggingResourceable.wrapUploadFile(selectedElement.getFilename())); - } - } - } - - /** - * deliver the selected file and show in a popup - * - * @param ureq - * @param command - */ - private void doFileDelivery(UserRequest ureq, Long forumKey) { - OlatRootFolderImpl forumContainer = getForumContainer(forumKey); - List<VFSItem> items = forumContainer.getItems(new VFSLeafFilter()); - if(items.size() > 0 && items.get(0) instanceof VFSLeaf) { - VFSLeaf vl = (VFSLeaf)items.get(0); - ureq.getDispatchResult().setResultingMediaResource(new VFSMediaResource(vl)); - ThreadLocalUserActivityLogger.log(CourseLoggingAction.DIALOG_ELEMENT_FILE_DOWNLOADED, getClass(), - LoggingResourceable.wrapBCFile(vl.getName())); - } else { - logError("No file to discuss: " + forumContainer, null); - } - } - - public void event(UserRequest ureq, Component source, Event event) { - // process my content events - if (source == content) { - String command = event.getCommand(); - if (command.equals(ACTION_SHOW_FILE)) { - doFileDelivery(ureq, selectedElement.getForumKey()); - } - } else if (source == uploadButton){ - Forum forum = forumMgr.addAForum(); - OlatRootFolderImpl forumContainer = getForumContainer(forum.getKey()); - - removeAsListenerAndDispose(fileUplCtr); - fileUplCtr = new FileUploadController(getWindowControl(),forumContainer, ureq, (int)FolderConfig.getLimitULKB(), Quota.UNLIMITED, null, false, false, false, false, true, false); - listenTo(fileUplCtr); - - recentDialogElement = new DialogElement(); - recentDialogElement.setForumKey(forum.getKey()); - recentDialogElement.setAuthor(ureq.getIdentity().getName()); - removeAsListenerAndDispose(cmc); - cmc = new CloseableModalController(getWindowControl(), "close", fileUplCtr.getInitialComponent(), true, translate("dialog.upload.file")); - listenTo(cmc); - cmc.activate(); - } else if (source == copyButton) { - Forum forum = forumMgr.addAForum(); - VFSContainer courseContainer = userCourseEnv.getCourseEnvironment().getCourseFolderContainer(); - fileCopyCtr = new MyLinkChooserController(ureq, getWindowControl(), courseContainer, null); - listenTo(fileCopyCtr); - - recentDialogElement = new DialogElement(); - recentDialogElement.setForumKey(forum.getKey()); - recentDialogElement.setAuthor(ureq.getIdentity().getName()); - dialogPanel.setContent(fileCopyCtr.getInitialComponent()); - } - - } - - /** - * to save content - * - * @param forumKey - * @return - */ - public static OlatRootFolderImpl getForumContainer(Long forumKey) { - StringBuilder sb = new StringBuilder(); - sb.append("/forum/"); - sb.append(forumKey); - sb.append("/"); - String pathToForumDir = sb.toString(); - OlatRootFolderImpl forumContainer = new OlatRootFolderImpl(pathToForumDir, null); - File baseFile = forumContainer.getBasefile(); - baseFile.mkdirs(); - return forumContainer; - } - - public static String getFileSize(Long forumKey){ - OlatRootFolderImpl forumContainer = getForumContainer(forumKey); - VFSLeaf vl = (VFSLeaf) forumContainer.getItems().get(0); - return Formatter.formatBytes(vl.getSize()); - } - - /** - * @see org.olat.core.gui.control.DefaultController#doDispose(boolean) - */ - protected void doDispose() { - // - } - - private class MyLinkChooserController extends LinkChooserController { - public MyLinkChooserController(UserRequest ureq, WindowControl wControl, VFSContainer rootDir, String uploadRelPath) { - super(ureq, wControl, rootDir, uploadRelPath, null, null, false, "", null, true); - } - - @Override - //this is a hack to overwrite the package used by the BasicController - protected VelocityContainer createVelocityContainer(String page) { - setTranslator(Util.createPackageTranslator(LinkChooserController.class, getLocale())); - velocity_root = Util.getPackageVelocityRoot(LinkChooserController.class); - return super.createVelocityContainer(page); - } - - @Override - public void event(UserRequest ureq, Controller source, Event event) { - fireEvent(ureq, event); - } - } -} diff --git a/src/main/java/org/olat/modules/dialog/DialogElementsPropertyManager.java b/src/main/java/org/olat/modules/dialog/DialogElementsPropertyManager.java deleted file mode 100644 index 24a127db7fc630327a8ef2324babaae20d51e90a..0000000000000000000000000000000000000000 --- a/src/main/java/org/olat/modules/dialog/DialogElementsPropertyManager.java +++ /dev/null @@ -1,201 +0,0 @@ -/** -* OLAT - Online Learning and Training<br> -* http://www.olat.org -* <p> -* Licensed under the Apache License, Version 2.0 (the "License"); <br> -* you may not use this file except in compliance with the License.<br> -* You may obtain a copy of the License at -* <p> -* http://www.apache.org/licenses/LICENSE-2.0 -* <p> -* Unless required by applicable law or agreed to in writing,<br> -* software distributed under the License is distributed on an "AS IS" BASIS, <br> -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> -* See the License for the specific language governing permissions and <br> -* limitations under the License. -* <p> -* Copyright (c) since 2004 at Multimedia- & E-Learning Services (MELS),<br> -* University of Zurich, Switzerland. -* <hr> -* <a href="http://www.openolat.org"> -* OpenOLAT - Online Learning and Training</a><br> -* This file has been modified by the OpenOLAT community. Changes are licensed -* under the Apache 2.0 license as the original file. -*/ - -package org.olat.modules.dialog; - -/** - * Description:<br> - * TODO: guido Class Description for DialogElement - * <P> - * Initial Date: 14.11.2005 <br> - * - * @author guido - */ -import java.util.Iterator; -import java.util.List; - -import org.olat.core.id.OLATResourceable; -import org.olat.core.logging.AssertException; -import org.olat.core.logging.OLATRuntimeException; -import org.olat.core.manager.BasicManager; -import org.olat.core.util.coordinate.CoordinatorManager; -import org.olat.core.util.coordinate.SyncerExecutor; -import org.olat.core.util.resource.OresHelper; -import org.olat.core.util.xml.XStreamHelper; -import org.olat.course.nodes.CourseNode; -import org.olat.course.nodes.DialogCourseNode; -import org.olat.course.properties.CoursePropertyManager; -import org.olat.properties.Property; -import org.olat.properties.PropertyManager; - -public class DialogElementsPropertyManager extends BasicManager { - public static final String PROPERTY_NAME = "fileDialog"; - // create with spring - private static DialogElementsPropertyManager dialogElementsManager = new DialogElementsPropertyManager(); - - private DialogElementsPropertyManager() { - // private constr. for singleton - } - - /** - * @return single instance - */ - public static DialogElementsPropertyManager getInstance() { - return dialogElementsManager; - } - - /** - * @param userCourseEnv - * @param courseNode - * @return an empty DialogPropertyElements if noting found or the populated object - */ - public DialogPropertyElements findDialogElements(CoursePropertyManager coursePropMgr, CourseNode courseNode) { - Property property = coursePropMgr.findCourseNodeProperty(courseNode, null, null, PROPERTY_NAME); - if (property == null) return new DialogPropertyElements(PROPERTY_NAME); - else return (DialogPropertyElements) XStreamHelper.fromXML(property.getTextValue()); - } - - /** - * Find all DialogElements for a certain coursenode - * - * @param courseId - * @param courseNodeId - * @return a Object containing a collection of DialogElements - */ - public DialogPropertyElements findDialogElements(Long courseId, String courseNodeId) { - Property prop = findProperty(courseId, courseNodeId); - if (prop == null) return new DialogPropertyElements(PROPERTY_NAME); - return (DialogPropertyElements) XStreamHelper.fromXML(prop.getTextValue()); - } - - /** - * @param userCourseEnv - * @param courseNode - * @param fileDialogId - * @return - */ - protected DialogElement findDialogElement(CoursePropertyManager coursePropMgr, CourseNode courseNode, Long forumKey) { - DialogPropertyElements elements = findDialogElements(coursePropMgr, courseNode); - if (elements != null) { - List<DialogElement> list = elements.getDialogPropertyElements(); - for (DialogElement element : list) { - if (element.getForumKey().equals(forumKey)) return element; - } - } else { - throw new OLATRuntimeException(this.getClass(), "trying to find property element, but no properties yet exists: coursenode " - +courseNode.getShortTitle()+"("+courseNode.getIdent()+") and forum with key: "+forumKey, null); - } - // no match - return null; - } - - /** - * Deletes a single dialog element which are all in one property stored. The - * property will still exist even if it contains no elements - * - * @param userCourseEnv - * @param courseNode - * @param fileDialogId - */ - protected void deleteDialogElement(final CoursePropertyManager coursePropMgr, final CourseNode courseNode, Long forumKey) { - final DialogPropertyElements elements = findDialogElements(coursePropMgr, courseNode); - if (elements != null) { - final List<DialogElement> list = elements.getDialogPropertyElements(); - for (Iterator<DialogElement> iter = list.iterator(); iter.hasNext();) { - final DialogElement element = iter.next(); - if (element.getForumKey().equals(forumKey)) { - //o_clusterOK by:ld - OLATResourceable courseNodeResourceable = OresHelper.createOLATResourceableInstance(DialogCourseNode.class, new Long(courseNode.getIdent())); - CoordinatorManager.getInstance().getCoordinator().getSyncer().doInSync(courseNodeResourceable, new SyncerExecutor(){ - public void execute() { - list.remove(element); - String dialogElementsAsXML = XStreamHelper.toXML(elements); - Property property = coursePropMgr.findCourseNodeProperty(courseNode, null, null, PROPERTY_NAME); - - property.setTextValue(dialogElementsAsXML); - coursePropMgr.updateProperty(property); - }}); - break; - } - } - } else { - throw new OLATRuntimeException(this.getClass(), "trying to delete property element, but no properties yet exist for course node: "+courseNode.getIdent(), null); - } - } - - /** - * persits a new added dialog element in the course node property - * - * @param userCourseEnv - * @param courseNode - * @param forumKey - * @param fileName - * @param authorUsername - * @param fileDialogId - */ - public void addDialogElement(final CoursePropertyManager coursePropMgr, final CourseNode courseNode, final DialogElement element) { - //o_clusterOK by:ld (it was assumed that the courseNodeId - used for constructing the olatResourceable - is unique over all courses) - OLATResourceable courseNodeResourceable = OresHelper.createOLATResourceableInstance(DialogCourseNode.class, new Long(courseNode.getIdent())); - CoordinatorManager.getInstance().getCoordinator().getSyncer().doInSync(courseNodeResourceable, new SyncerExecutor(){ - public void execute() { - DialogPropertyElements dialogProps = findDialogElements(coursePropMgr, courseNode); - - dialogProps.addElement(element); - String dialogElementsAsXML = XStreamHelper.toXML(dialogProps); - Property property = coursePropMgr.findCourseNodeProperty(courseNode, null, null, PROPERTY_NAME); - if (property == null) { - property = coursePropMgr.createCourseNodePropertyInstance(courseNode, null, null, PROPERTY_NAME, null, null, null, - dialogElementsAsXML); - coursePropMgr.saveProperty(property); - } else { - property.setTextValue(dialogElementsAsXML); - coursePropMgr.updateProperty(property); - } - }}); - } - - private Property findProperty(Long courseId, String courseNodeId) { - PropertyManager propMrg = PropertyManager.getInstance(); - String category = "NID:dial::" + courseNodeId; - List<Property> elements = propMrg.findProperties(null, null, "CourseModule", courseId, category, PROPERTY_NAME); - if (elements.size() == 0) return null; //no match - if (elements.size() != 1) throw new AssertException( - "Found more then one property for a course node 'dialog element' which should never happen!"); - return elements.get(0); - } - - /** - * Delete the file dialog course node poperty - * - * @param courseId - * @param courseNodeId - */ - public void deleteProperty(Long courseId, String courseNodeId) { - Property prop = findProperty(courseId, courseNodeId); - PropertyManager propMrg = PropertyManager.getInstance(); - if (prop != null) propMrg.deleteProperty(prop); - } - -} diff --git a/src/main/java/org/olat/modules/dialog/DialogElementsTableModel.java b/src/main/java/org/olat/modules/dialog/DialogElementsTableModel.java deleted file mode 100644 index ffc21fc21d6a0a1840290ba6b9d77636b158a0cc..0000000000000000000000000000000000000000 --- a/src/main/java/org/olat/modules/dialog/DialogElementsTableModel.java +++ /dev/null @@ -1,183 +0,0 @@ -/** -* OLAT - Online Learning and Training<br> -* http://www.olat.org -* <p> -* Licensed under the Apache License, Version 2.0 (the "License"); <br> -* you may not use this file except in compliance with the License.<br> -* You may obtain a copy of the License at -* <p> -* http://www.apache.org/licenses/LICENSE-2.0 -* <p> -* Unless required by applicable law or agreed to in writing,<br> -* software distributed under the License is distributed on an "AS IS" BASIS, <br> -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> -* See the License for the specific language governing permissions and <br> -* limitations under the License. -* <p> -* Copyright (c) since 2004 at Multimedia- & E-Learning Services (MELS),<br> -* University of Zurich, Switzerland. -* <hr> -* <a href="http://www.openolat.org"> -* OpenOLAT - Online Learning and Training</a><br> -* This file has been modified by the OpenOLAT community. Changes are licensed -* under the Apache 2.0 license as the original file. -*/ - -package org.olat.modules.dialog; - -import java.util.ArrayList; -import java.util.List; -import java.util.Locale; - -import org.olat.core.gui.components.table.BaseTableDataModelWithoutFilter; -import org.olat.core.gui.components.table.DefaultColumnDescriptor; -import org.olat.core.gui.components.table.StaticColumnDescriptor; -import org.olat.core.gui.components.table.Table; -import org.olat.core.gui.components.table.TableController; -import org.olat.core.gui.components.table.TableDataModel; -import org.olat.core.gui.render.Renderer; -import org.olat.core.gui.render.StringOutput; -import org.olat.core.gui.render.URLBuilder; -import org.olat.core.gui.translator.Translator; -import org.olat.course.nodes.dialog.DialogConfigForm; -import org.olat.modules.ModuleConfiguration; -import org.olat.modules.fo.ForumCallback; - -/** - * Description:<br> - * Table model for run mode of course node "file dialog" - * <P> - * Initial Date: 08.11.2005 <br> - * - * @author guido - */ -public class DialogElementsTableModel extends BaseTableDataModelWithoutFilter<DialogElement> implements TableDataModel<DialogElement> { - - private static final int COLUMN_COUNT = 9; - private List<DialogElement> entries = new ArrayList<DialogElement>(); - protected Translator translator; - private ForumCallback callback; - private ModuleConfiguration config; - - /** - * @param translator - */ - public DialogElementsTableModel(Translator translator, ForumCallback callback, ModuleConfiguration config) { - this.translator = translator; - this.callback = callback; - this.config = config; - } - - /** - * @see org.olat.core.gui.components.table.TableDataModel#getColumnCount() - */ - public int getColumnCount() { - return COLUMN_COUNT; - } - - /** - * @see org.olat.core.gui.components.table.TableDataModel#getRowCount() - */ - public int getRowCount() { - return entries.size(); - } - - /** - * @param num - * @return - */ - public DialogElement getEntryAt(int num) { - return entries.get(num); - } - - /** - * @see org.olat.core.gui.components.table.TableDataModel#getValueAt(int, int) - */ - public Object getValueAt(int row, int col) { - DialogElement entry = getEntryAt(row); - switch (col) { - case 0: - if (entry.getFilename().length() > 30) { return entry.getFilename().substring(0, 30) + "..."; } - return entry.getFilename(); - case 1: - return entry.getAuthor(); - case 2: - return entry.getFileSize(); - case 3: - return entry.getDate(); - case 4: - return entry.getNewMessages(); - case 5: - return entry.getMessagesCount(); - default: - return "ERROR"; - } - } - - public void addColumnDescriptors(TableController tableCtr) { - Locale loc = translator.getLocale(); - if (callback != null) { - tableCtr.addColumnDescriptor(new FileDownloadColumnDescriptor("table.header.filename", 0, loc)); - } else { - tableCtr.addColumnDescriptor(new DefaultColumnDescriptor("table.header.filename", 0, null, loc)); - } - if (callback != null) { - StaticColumnDescriptor statColdesc = new StaticColumnDescriptor(DialogElementsController.ACTION_START_FORUM, "table.header.forum", - translator.translate("dialog.start")); - // if configured open forum as popup - String integration = (String) config.get(DialogConfigForm.DIALOG_CONFIG_INTEGRATION); - if (integration.equals(DialogConfigForm.CONFIG_INTEGRATION_VALUE_POPUP)) { - statColdesc.setIsPopUpWindowAction(true, DefaultColumnDescriptor.DEFAULT_POPUP_ATTRIBUTES); - } - tableCtr.addColumnDescriptor(statColdesc); - } - tableCtr.addColumnDescriptor(new DefaultColumnDescriptor("table.header.author", 1, null, loc)); - tableCtr.addColumnDescriptor(false, new DefaultColumnDescriptor("table.header.size", 2, null, loc)); - tableCtr.addColumnDescriptor(new DefaultColumnDescriptor("table.header.date", 3, null, loc)); - if (callback != null) tableCtr.addColumnDescriptor(new DefaultColumnDescriptor("table.header.newmessages", 4, null, loc)); - if (callback != null) tableCtr.addColumnDescriptor(new DefaultColumnDescriptor("table.header.messages", 5, null, loc)); - // callback is null in course editor environement where we dont need - // security calls - if (callback != null && callback.mayDeleteMessageAsModerator()) tableCtr.addColumnDescriptor(new StaticColumnDescriptor( - DialogElementsController.ACTION_DELETE_ELEMENT, "table.header.action", translator.translate("delete"))); - } - - /** - * Set entries to be represented by this table model. - * - * @param entries - */ - public void setEntries(List<DialogElement> entries) { - this.entries = entries; - } - - private static class FileDownloadColumnDescriptor extends DefaultColumnDescriptor { - - public FileDownloadColumnDescriptor(String headerKey, int dataColumn, Locale locale) { - super(headerKey, dataColumn, null, locale); - } - - @Override - public void renderValue(StringOutput sb, int row, Renderer renderer) { - if(renderer == null) {//download - int sortedRow = table.getSortedRow(row); - Object entry = table.getTableDataModel().getValueAt(sortedRow, getDataColumn()); - if(entry != null) { - sb.append(entry.toString()); - } - } else { - URLBuilder ubu = renderer.getUrlBuilder(); - ubu = ubu.createCopyFor(getTable()); - - int sortedRow = table.getSortedRow(row); - Object entry = table.getTableDataModel().getValueAt(sortedRow, getDataColumn()); - - StringOutput link = new StringOutput(); - ubu.buildURI(link, new String[] { Table.COMMANDLINK_ROWACTION_CLICKED, Table.COMMANDLINK_ROWACTION_ID }, new String[] { String.valueOf(sortedRow), DialogElementsController.ACTION_SHOW_FILE }); // url - sb.append("<a href=\"javascript:o_openPopUp('").append(link).append(entry.toString()).append("','fileview','600','700','no')\">") - .append(entry.toString()) - .append("</a>"); - } - } - } -} diff --git a/src/main/java/org/olat/modules/dialog/_content/dialog.html b/src/main/java/org/olat/modules/dialog/_content/dialog.html deleted file mode 100644 index 957269fa65a99e5d815ccad7e9fb522ce56bfd90..0000000000000000000000000000000000000000 --- a/src/main/java/org/olat/modules/dialog/_content/dialog.html +++ /dev/null @@ -1,30 +0,0 @@ -<div class="o_sel_dialog"> -<div class="clearfix"> - #if ($r.available("subscription")) - $r.render("subscription") - #end - #if ($security.mayOpenNewThread()) - $r.render("dialog.upload.file") - #if ($r.available("dialog.copy.file")) - $r.render("dialog.copy.file") - #end - #end -</div> -<hr /> -$r.render("dialogElementsTable") -#if($hasSelectedElement && $hasInlineForum) - <div class="panel panel-default o_block_large_top"> - <div class="panel-heading"> - <h3 class="panel-title">$r.translate("dialog.selected.element"): - <i class="o_icon o_icon-fw $r.getFiletypeIconCss($selectedElement.getFilename())"> </i> - $selectedElement.getFilename() - </h3> - </div> - <div class="panel-body"> - #if($hasInlineForum) - $r.render("forum") - #end - </div> - </div> -#end -</div> \ No newline at end of file diff --git a/src/main/java/org/olat/modules/dialog/_i18n/LocalStrings_ar.properties b/src/main/java/org/olat/modules/dialog/_i18n/LocalStrings_ar.properties deleted file mode 100644 index 11c844029ff44f8c708ba307a780b52c371358a3..0000000000000000000000000000000000000000 --- a/src/main/java/org/olat/modules/dialog/_i18n/LocalStrings_ar.properties +++ /dev/null @@ -1,17 +0,0 @@ -#Sun Feb 21 13:16:19 CET 2010 -dialog.selected.element=\u0645\u0644\u0641 \u0627\u0644\u0645\u0646\u0627\u0642\u0634\u0629 -dialog.start=\u0639\u0631\u0636 -dialog.upload.file=\u062A\u062D\u0645\u064A\u0644 \u0645\u0644\u0641 -element.already.deleted=\u0644\u0642\u062F \u062A\u0645 \u062D\u0630\u0641 \u0627\u0644\u0639\u0646\u0635\u0631 \u0627\u0644\u0645\u062D\u062F\u062F \u0645\u0646 \u0642\u0628\u0644 \u0645\u0633\u062A\u062E\u062F\u0645 \u0622\u062E\u0631\u060C \u064A\u0631\u062C\u0649 \u062A\u062D\u062F\u064A\u062B \u0639\u0631\u0636 \u0627\u0644\u062C\u062F\u0648\u0644. -element.delete=\u0648\u0627\u0644\u0645\u0646\u062A\u062F\u0649\u061F(<b>{0}</b>) \u0647\u0644 \u062A\u0631\u064A\u062F \u0641\u0639\u0644\u0627\u064B \u062A\u0631\u064A\u062F \u062D\u0630\u0641 \u0627\u0644\u0645\u0644\u0641\r\n \u0627\u0644\u0628\u064A\u0627\u0646\u0627\u062A \u0633\u0648\u0641 \u064A\u062A\u0645 \u062D\u0641\u0638\u0647\u0627 \u062A\u0644\u0642\u0627\u0626\u064A\u0627\u064B \u0641\u0649 \u0627\u0644\u0645\u062C\u0644\u062F \u0627\u0644\u0634\u062E\u0635\u0649\u060C \u0642\u0633\u0645 \u0627\u0644\u0623\u0631\u0634\u064A\u0641. -notifications.entry={2} \u0645\u0644\u0641 \u062C\u062F\u064A\u062F \u0628\u0627\u0633\u0645 \:{0} \u0645\u0646 {1} \u0648\u0641\u0649\r\n \u062A\u0645 \u0625\u0646\u0634\u0627\u0626\u0647 -notifications.header="{0}" \u0645\u0644\u0641 \u062D\u0648\u0631 \u0641\u0649 \u0627\u0644\u0645\u0642\u0631\u0631 -table.header.action=\u0645\u0644\u0641 -table.header.author=\u0627\u0644\u0645\u0624\u0644\u0641 -table.header.date=\u0627\u0644\u062A\u0627\u0631\u064A\u062E -table.header.filename=\u0627\u0633\u0645 \u0627\u0644\u0645\u0644\u0641 -table.header.filetype=\u0646\u0648\u0639 \u0627\u0644\u0645\u0644\u0641 -table.header.forum=\u0627\u0644\u0645\u0646\u0627\u0642\u0634\u0629 -table.header.messages=\u0631\u0633\u0627\u0626\u0644 -table.header.newmessages=\u063A\u064A\u0631 \u0645\u0642\u0631\u0624\u0629 -table.header.size=\u062D\u062C\u0645 \u0627\u0644\u0645\u0644\u0641 diff --git a/src/main/java/org/olat/modules/dialog/_i18n/LocalStrings_cs.properties b/src/main/java/org/olat/modules/dialog/_i18n/LocalStrings_cs.properties deleted file mode 100644 index 0770ae11ca70f9d509201ce8206d50091914db7a..0000000000000000000000000000000000000000 --- a/src/main/java/org/olat/modules/dialog/_i18n/LocalStrings_cs.properties +++ /dev/null @@ -1,17 +0,0 @@ -#Mon Mar 02 09:54:14 CET 2009 -dialog.selected.element=T\u00E9ma diskuze -dialog.start=Za\u010D\u00EDt -dialog.upload.file=Nahr\u00E1t soubor -element.already.deleted=Vybran\u00E9 elementy byly smaz\u00E1ny jin\u00FDm u\u017Eivatelem. Pros\u00EDm obnovte zobrazen\u00ED tabulky. -element.delete=Opravdu chcete smazat soubor (<b>{0}</b>) a jeho diskuzi? Data budou automticky archivov\u00E1na ve Va\u0161\u00ED osobn\u00ED slo\u017Ece, v sekci 'archive'. -notifications.entry=Nov\u00FD soubor jm\u00E9nem {0} od {1} vytvo\u0159en v {2} -notifications.header=V modulu kurzu "Dialog souboru" je nov\u00FD soubor -table.header.action=Soubor -table.header.author=Autor -table.header.date=Datum -table.header.filename=Jm\u00E9no souboru -table.header.filetype=Typ souboru -table.header.forum=Diskuze -table.header.messages=Zpr\u00E1vy -table.header.newmessages=Nep\u0159e\u010Dteno -table.header.size=Velikost souboru diff --git a/src/main/java/org/olat/modules/dialog/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/modules/dialog/_i18n/LocalStrings_de.properties deleted file mode 100644 index eb44c04c972fb30dd605ce910ed4672314a04bba..0000000000000000000000000000000000000000 --- a/src/main/java/org/olat/modules/dialog/_i18n/LocalStrings_de.properties +++ /dev/null @@ -1,18 +0,0 @@ -#Mon Mar 02 09:54:04 CET 2009 -dialog.selected.element=Diskussion zur Datei -dialog.start=Anzeigen -dialog.upload.file=Datei hochladen -dialog.copy.file=Datei kopieren -element.already.deleted=Das gew\u00E4hle Element wurde in der Zwischenzeit von einem anderen Benutzer gel\u00F6scht. Bitte die Tabellenansicht neu laden. -element.delete=Wollen Sie die Datei (<b>{0}</b>) inkl. der Diskussionsbeitr\u00E4ge l\u00F6schen? Die Daten werden automatisch in Ihrem pers\u00F6nlichen Ordner unter 'Archiv' abgelegt. -notifications.entry=Neue Datei mit dem Namen\:{0} von {1} erstellt am {2} -notifications.header=Dateidiskussion in Kurs "{0}" -table.header.action=Datei -table.header.author=Autor -table.header.date=Datum -table.header.filename=Dateiname -table.header.filetype=Dateityp -table.header.forum=Diskussion -table.header.messages=Beitr\u00E4ge -table.header.newmessages=Ungelesen -table.header.size=Dateigr\u00F6sse diff --git a/src/main/java/org/olat/modules/dialog/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/modules/dialog/_i18n/LocalStrings_en.properties deleted file mode 100644 index c1a2cd04d473382c187a92a536c716284ed2919c..0000000000000000000000000000000000000000 --- a/src/main/java/org/olat/modules/dialog/_i18n/LocalStrings_en.properties +++ /dev/null @@ -1,18 +0,0 @@ -#Mon May 16 17:34:03 CEST 2011 -dialog.copy.file=Copy file -dialog.selected.element=Dialog regarding file -dialog.start=Show -dialog.upload.file=Upload file -element.already.deleted=The element selected has been deleted by another user. Please refresh the table view. -element.delete=Do you really want to delete the file (<b>{0}</b>) and its forum? Data will automatically be archived in your personal folder, section 'Archive'. -notifications.entry=New file with file name\: {0} by {1} created on {2} -notifications.header=File dialog in course "{0}" -table.header.action=File -table.header.author=Author -table.header.date=Date -table.header.filename=File name -table.header.filetype=File type -table.header.forum=Discussion -table.header.messages=Contributions -table.header.newmessages=Unread -table.header.size=File size diff --git a/src/main/java/org/olat/modules/dialog/_i18n/LocalStrings_es.properties b/src/main/java/org/olat/modules/dialog/_i18n/LocalStrings_es.properties deleted file mode 100644 index 79078f65ff5a6b121d6ebfb54ed83690bcdfebb4..0000000000000000000000000000000000000000 --- a/src/main/java/org/olat/modules/dialog/_i18n/LocalStrings_es.properties +++ /dev/null @@ -1,17 +0,0 @@ -#Mon Mar 02 09:54:21 CET 2009 -dialog.selected.element=Discusi\u00F3n de datos -dialog.start=Indicar -dialog.upload.file=Subir archivo -element.already.deleted=El elemento seleccionado ha sido eliminado por otro usuario en el tiempo intermedio. -element.delete=\u00BFDeseas eliminar el archivo (<b<{0}</b>) y su foro correspondiente? Los datos son archivados autom\u00E1ticamente en tu carpeta personal en 'archivo'. -notifications.entry=Nuevo archivo con nombre\:{0} de {1} creado en {2} -notifications.header=Hay nuevo(s) archivo(s) en el m\u00F3dulo del curso "Di\u00E1logo de archivo" -table.header.action=Archivo -table.header.author=Autor -table.header.date=Fecha -table.header.filename=Nombre de archivo -table.header.filetype=Tipo de archivo -table.header.forum=Discusi\u00F3n -table.header.messages=Mensajes -table.header.newmessages=No le\u00EDdo -table.header.size=Tama\u00F1o diff --git a/src/main/java/org/olat/modules/dialog/_i18n/LocalStrings_fa.properties b/src/main/java/org/olat/modules/dialog/_i18n/LocalStrings_fa.properties deleted file mode 100644 index 3e1b47a06cb8e0c705182f4f35d81442f1b31740..0000000000000000000000000000000000000000 --- a/src/main/java/org/olat/modules/dialog/_i18n/LocalStrings_fa.properties +++ /dev/null @@ -1,17 +0,0 @@ -#Mon Mar 02 09:54:13 CET 2009 -dialog.selected.element=\u0645\u0648\u0636\u0648\u0639 \u0628\u062D\u062B -dialog.start=\u0634\u0631\u0648\u0639 -dialog.upload.file=\u0627\u0631\u0633\u0627\u0644 \u0641\u0627\u06CC\u0644 -element.already.deleted=\u062C\u0632\u0621 \u0627\u0646\u062A\u062E\u0627\u0628 \u0634\u062F\u0647 \u062A\u0648\u0633\u0637 \u06A9\u0627\u0631\u0628\u0631 \u062F\u06CC\u06AF\u0631\u06CC \u067E\u0627\u06A9 \u0634\u062F\u0647 \u0627\u0633\u062A.\u0644\u0637\u0641\u0627 \u0646\u0645\u0627\u06CC \u062C\u062F\u0648\u0644 \u062E\u0648\u062F \u0631\u0627 \u0628\u0627\u0632\u0622\u0648\u0631\u06CC \u06A9\u0646\u06CC\u062F -element.delete=Do you really want to delete the file (<b>{0}</b>) and its forum? Data will automatically be archived in your personal folder, section 'archive'. -notifications.entry=New file with file name\:{0} from {1} created at {2} -notifications.header=There are new file(s) in the course module "File dialog" -table.header.action=\u0641\u0627\u06CC\u0644 -table.header.author=\u0646\u0648\u06CC\u0633\u0646\u062F\u0647 -table.header.date=\u062A\u0627\u0631\u06CC\u062E -table.header.filename=\u0646\u0627\u0645 \u0641\u0627\u06CC\u0644 -table.header.filetype=\u0646\u0648\u0639 \u0641\u0627\u06CC\u0644 -table.header.forum=\u0628\u062D\u062B \u0648 \u06AF\u0641\u062A\u06AF\u0648 -table.header.messages=\u067E\u06CC\u0627\u0645 \u0647\u0627 -table.header.newmessages=\u062E\u0648\u0627\u0646\u062F\u0647 \u0646\u0634\u062F\u0647 -table.header.size=\u0627\u0646\u062F\u0627\u0632\u0647 \u0641\u0627\u06CC\u0644 diff --git a/src/main/java/org/olat/modules/dialog/_i18n/LocalStrings_fr.properties b/src/main/java/org/olat/modules/dialog/_i18n/LocalStrings_fr.properties deleted file mode 100644 index 33814603c50b0411b6a1e1287c3391188b6e616d..0000000000000000000000000000000000000000 --- a/src/main/java/org/olat/modules/dialog/_i18n/LocalStrings_fr.properties +++ /dev/null @@ -1,18 +0,0 @@ -#Mon Oct 22 15:53:15 CEST 2012 -dialog.copy.file=Copier un document -dialog.selected.element=discussion sur le fichier -dialog.start=afficher -dialog.upload.file=T\u00E9l\u00E9charger fichier -element.already.deleted=L'\u00E9l\u00E9ment s\u00E9lectionn\u00E9 a \u00E9t\u00E9 effac\u00E9 entre temps par un autre utilisateur. Veuillez actualiser l'affichage du tableau. -element.delete=Voulez-vous vraiment effacer le fichier (<b>{0}</b>) incl. les contributions de discussion? Les donn\u00E9es seront d\u00E9pos\u00E9es automatiquement dans votre dossier personnel sous 'archive'. -notifications.entry=Nouveau fichier avec le nom\: {0} cr\u00E9\u00E9 par {1} le {2} -notifications.header=Il y a de nouveaux fichier dans le module de cours "fichier discut\u00E9". -table.header.action=fichier -table.header.author=auteur -table.header.date=date -table.header.filename=nom de fichier -table.header.filetype=type de fichier -table.header.forum=discussion -table.header.messages=contributions -table.header.newmessages=non lus -table.header.size=taille du fichier diff --git a/src/main/java/org/olat/modules/dialog/_i18n/LocalStrings_jp.properties b/src/main/java/org/olat/modules/dialog/_i18n/LocalStrings_jp.properties deleted file mode 100644 index ff561c41a52772cc8deb767ceb5a98d2afce1a0b..0000000000000000000000000000000000000000 --- a/src/main/java/org/olat/modules/dialog/_i18n/LocalStrings_jp.properties +++ /dev/null @@ -1,17 +0,0 @@ -#Thu Sep 08 16:42:38 CEST 2011 -dialog.selected.element=\u30D5\u30A1\u30A4\u30EB\u306B\u95A2\u3059\u308B\u30C0\u30A4\u30A2\u30ED\u30B0 -dialog.start=\u30B9\u30BF\u30FC\u30C8 -dialog.upload.file=\u30D5\u30A1\u30A4\u30EB\u3092\u30A2\u30C3\u30D7\u30ED\u30FC\u30C9\u3059\u308B -element.already.deleted=\u9078\u629E\u3057\u305F\u30A8\u30EC\u30E1\u30F3\u30C8\u306F\u4ED6\u306E\u30E6\u30FC\u30B6\u306B\u3088\u3063\u3066\u524A\u9664\u3055\u308C\u307E\u3057\u305F\u3002\u30C6\u30FC\u30D6\u30EB\u30D3\u30E5\u30FC\u3092\u30EA\u30D5\u30EC\u30C3\u30B7\u30E5\u3057\u3066\u304F\u3060\u3055\u3044\u3002 -element.delete=\u672C\u5F53\u306B\u30D5\u30A1\u30A4\u30EB (<b>{0}</b>) \u304A\u3088\u3073\u30D5\u30A9\u30FC\u30E9\u30E0\u3092\u524A\u9664\u3057\u3066\u3082\u3088\u308D\u3057\u3044\u3067\u3059\u304B? \u30C7\u30FC\u30BF\u306F\u3042\u306A\u305F\u306E\u30D1\u30FC\u30BD\u30CA\u30EB\u30D5\u30A9\u30EB\u30C0\u30BB\u30AF\u30B7\u30E7\u30F3\u300C\u30A2\u30FC\u30AB\u30A4\u30D6\u300D\u306B\u81EA\u52D5\u7684\u306B\u30A2\u30FC\u30AB\u30A4\u30D6\u3055\u308C\u307E\u3059\u3002 -notifications.entry=\u65B0\u3057\u3044\u30D5\u30A1\u30A4\u30EB\: {0} \u4F5C\u6210\: {1} \u4F5C\u6210\u65E5\u6642\: {2} -notifications.header=\u30B3\u30FC\u30B9\u300C {0} \u300D\u306E\u30D5\u30A1\u30A4\u30EB\u30C0\u30A4\u30A2\u30ED\u30B0 -table.header.action=\u30D5\u30A1\u30A4\u30EB -table.header.author=\u4F5C\u8005 -table.header.date=\u65E5\u4ED8 -table.header.filename=\u30D5\u30A1\u30A4\u30EB\u540D -table.header.filetype=\u30D5\u30A1\u30A4\u30EB\u30BF\u30A4\u30D7 -table.header.forum=\u30C7\u30A3\u30B9\u30AB\u30C3\u30B7\u30E7\u30F3 -table.header.messages=\u30E1\u30C3\u30BB\u30FC\u30B8 -table.header.newmessages=\u672A\u8AAD -table.header.size=\u30D5\u30A1\u30A4\u30EB\u30B5\u30A4\u30BA diff --git a/src/main/java/org/olat/modules/dialog/_i18n/LocalStrings_lt.properties b/src/main/java/org/olat/modules/dialog/_i18n/LocalStrings_lt.properties deleted file mode 100644 index 79d46077b7d3fe7c4f571640c6619a0680099fb6..0000000000000000000000000000000000000000 --- a/src/main/java/org/olat/modules/dialog/_i18n/LocalStrings_lt.properties +++ /dev/null @@ -1,17 +0,0 @@ -#Mon Mar 02 09:54:02 CET 2009 -dialog.selected.element=Diskusijos pavadinimas -dialog.start=Prad\u0117ti -dialog.upload.file=Nusi\u0173sti rinkmen\u0105 -element.already.deleted=Pasirinktas elementas buvo i\u0161trintas kito vartotojo. Pra\u0161ome atsinaujinti lentel\u0117s vaizd\u0105. -element.delete=Ar j\u016Bs tikrai norite i\u0161trinti rinkmen\u0105 (<b>{0}</b>) ir jos diskusij\u0105? Duomenys bus automati\u0161kai suarchyvuoti j\u016Bs\u0173 asmeniniame aplanke, sekcijoje \u201Carchyvas\u201D. -notifications.entry=Nauja rinkmena pavadinimu {0} i\u0161 {1}sukurta {2} -notifications.header=Yra nauja \u017Einut\u0117(s) kurso modulyje \u201CRinkmenos dialogas\u201D -table.header.action=Rinkmena -table.header.author=Autorius -table.header.date=Data -table.header.filename=Rinkmenos pavadinimas -table.header.filetype=Rinkmenos tipas -table.header.forum=Diskusija -table.header.messages=\u017Dinut\u0117 -table.header.newmessages=Neskaityta -table.header.size=Rinkmenos dydis diff --git a/src/main/java/org/olat/modules/dialog/_i18n/LocalStrings_nl_NL.properties b/src/main/java/org/olat/modules/dialog/_i18n/LocalStrings_nl_NL.properties deleted file mode 100644 index fcf247ddf1f2e0eb0f65287e63a1f60a567e23f5..0000000000000000000000000000000000000000 --- a/src/main/java/org/olat/modules/dialog/_i18n/LocalStrings_nl_NL.properties +++ /dev/null @@ -1,17 +0,0 @@ -#Thu Sep 08 16:42:46 CEST 2011 -dialog.selected.element=Dialoog betreffende bestand -dialog.start=Toon -dialog.upload.file=Bestand uploaden -element.already.deleted=Het geselecteerde element werd door een andere gebruiker gewist. Gelieve het tabeloverzicht te verversen. -element.delete=Weet u zeker dat u bestand (<b>{0}</b>) en zijn forum wilt verwijderen? Data zal automatisch gearchiveerd worden in uw persoonlijke map, sectie 'Archief'. -notifications.entry=Nieuw bestand met bestandsnaam\: {0} door {1} aangemaakt op {2} -notifications.header=Bestandsdialoog in cursus "{0}" -table.header.action=Bestand -table.header.author=Auteur -table.header.date=Datum -table.header.filename=Bestandsnaam -table.header.filetype=Bestandstype -table.header.forum=Discussie -table.header.messages=Bijdrage -table.header.newmessages=Ongelezen -table.header.size=Bestandsgrootte diff --git a/src/main/java/org/olat/modules/dialog/_i18n/LocalStrings_pl.properties b/src/main/java/org/olat/modules/dialog/_i18n/LocalStrings_pl.properties deleted file mode 100644 index 7ae76ab61c4dac9c21cc93080631ff932f29febb..0000000000000000000000000000000000000000 --- a/src/main/java/org/olat/modules/dialog/_i18n/LocalStrings_pl.properties +++ /dev/null @@ -1,18 +0,0 @@ -#Sun Dec 23 13:03:56 CET 2012 -dialog.copy.file=Kopiuj plik -dialog.selected.element=Temat dyskusji -dialog.start=Start -dialog.upload.file=Przeka\u017C plik -element.already.deleted=Wybrany element zosta\u0142 usuni\u0119ty przez innego u\u017Cytkownika. Od\u015Bwie\u017C widok tabeli. -element.delete=Czy naprawd\u0119 chcesz usun\u0105\u0107 plik (<b>{0}</b>) i jego forum? Dane b\u0119d\u0105 automatycznie zarchiwizowane w Twoim osobistym folderze w sekcji 'archive'. -notifications.entry=Nowy plik o nazwie\:{0} z {1} utworzony {2} -notifications.header=S\u0105 nowe pliki w module kursu "Okno pliku" -table.header.action=Plik -table.header.author=Autor -table.header.date=Data -table.header.filename=Nazwa pliku -table.header.filetype=Typ pliku -table.header.forum=Dyskusja -table.header.messages=Wiadomo\u015Bci -table.header.newmessages=Nieprzeczytane -table.header.size=Rozmiar pliku diff --git a/src/main/java/org/olat/modules/dialog/_i18n/LocalStrings_zh_CN.properties b/src/main/java/org/olat/modules/dialog/_i18n/LocalStrings_zh_CN.properties deleted file mode 100644 index 266b70aecf08ef83fd80c837f3ef5e6e67212edb..0000000000000000000000000000000000000000 --- a/src/main/java/org/olat/modules/dialog/_i18n/LocalStrings_zh_CN.properties +++ /dev/null @@ -1,17 +0,0 @@ -#Mon Mar 02 09:54:03 CET 2009 -dialog.selected.element=\u4E3B\u9898 -dialog.start=\u5F00\u59CB -dialog.upload.file=\u4E0A\u4F20\u6587\u4EF6 -element.already.deleted=\u53E6\u4E00\u4E2A\u7528\u6237\u5DF2\u5220\u9664\u9009\u4E2D\u7684\u5143\u7D20. \u8BF7\u66F4\u65B0\u5217\u8868. -element.delete=\u4F60\u786E\u5B9A\u8981\u5220\u9664\u8BE5\u6587\u4EF6 (<b>{0}</b>) \u53CA\u5176\u8BBA\u575B? \u6570\u636E\u5C06\u81EA\u52A8\u5B58\u50A8\u5230\u4F60\u7684\u4E2A\u4EBA\u6587\u4EF6\u5939 '\u5F52\u6863'\u4E2D\u3002 -notifications.entry=\u65B0\u6587\u4EF6\:{1} \u5728 {2}\u521B\u5EFA\u7684\u65B0\u6587\u4EF6 {0} -notifications.header=\u5728"\u6587\u4EF6\u8BA8\u8BBA"\u4E2D\u6709\u65B0\u6587\u4EF6(s) -table.header.action=\u6587\u4EF6 -table.header.author=\u521B\u5EFA\u4EBA -table.header.date=\u65E5\u671F -table.header.filename=\u6587\u4EF6\u540D -table.header.filetype=\u6587\u4EF6\u7C7B\u578B -table.header.forum=\u8BA8\u8BBA -table.header.messages=\u6D88\u606F -table.header.newmessages=\u672A\u8BFB -table.header.size=\u6587\u4EF6\u5927\u5C0F diff --git a/src/main/java/org/olat/modules/fo/manager/ForumManager.java b/src/main/java/org/olat/modules/fo/manager/ForumManager.java index b7a109b5f83ce9015115f0c580b6f0b79af40bb4..935aeacb113dc1c05f58ea7f69c6db2886154db4 100644 --- a/src/main/java/org/olat/modules/fo/manager/ForumManager.java +++ b/src/main/java/org/olat/modules/fo/manager/ForumManager.java @@ -261,7 +261,7 @@ public class ForumManager { /** * Return the title of a message of the forum. */ - public Integer countMessagesByForumID(Long forum_id) { + public int countMessagesByForumID(Long forum_id) { return countMessagesByForumID(forum_id, false); } diff --git a/src/main/java/org/olat/modules/fo/model/ForumImpl.java b/src/main/java/org/olat/modules/fo/model/ForumImpl.java index 71e80a044a04fe349aab654f61e814480038e96f..11635603b6ae47720a7899dd958fe26170539485 100644 --- a/src/main/java/org/olat/modules/fo/model/ForumImpl.java +++ b/src/main/java/org/olat/modules/fo/model/ForumImpl.java @@ -33,6 +33,7 @@ import javax.persistence.Id; import javax.persistence.Table; import javax.persistence.Temporal; import javax.persistence.TemporalType; +import javax.persistence.Transient; import javax.persistence.Version; import org.hibernate.annotations.GenericGenerator; @@ -93,6 +94,7 @@ public class ForumImpl implements Forum, CreateInfo, Persistable{ } @Override + @Transient public String getResourceableTypeName() { return OresHelper.calculateTypeName(Forum.class); } diff --git a/src/main/java/org/olat/modules/wiki/WikiFileUploadController.java b/src/main/java/org/olat/modules/wiki/WikiFileUploadController.java index 166dfc02e6b487d9726566f8732915d3b4f4c3bc..54885fe0c6f94850f9e4ff371149d524cefc471f 100644 --- a/src/main/java/org/olat/modules/wiki/WikiFileUploadController.java +++ b/src/main/java/org/olat/modules/wiki/WikiFileUploadController.java @@ -49,7 +49,7 @@ public class WikiFileUploadController extends BasicController { VelocityContainer mainVC = this.createVelocityContainer("upload_file"); fileUplCtr = new FileUploadController(getWindowControl(), mediaFolder, ureq, - (int)FolderConfig.getLimitULKB(), Quota.UNLIMITED, null, false, false, false, true, true, false); + FolderConfig.getLimitULKB(), Quota.UNLIMITED, null, false, false, false, true, true, false); listenTo(fileUplCtr); mainVC.put("fileUpload", fileUplCtr.getInitialComponent()); putInitialPanel(mainVC); diff --git a/src/main/java/org/olat/search/service/indexer/repository/course/DialogCourseNodeIndexer.java b/src/main/java/org/olat/search/service/indexer/repository/course/DialogCourseNodeIndexer.java index 880100a0c98b00f572624be342d31e516dc57ad6..4c6fe478f9581cbd6622ed52fbffdc16db6a4369 100644 --- a/src/main/java/org/olat/search/service/indexer/repository/course/DialogCourseNodeIndexer.java +++ b/src/main/java/org/olat/search/service/indexer/repository/course/DialogCourseNodeIndexer.java @@ -26,34 +26,30 @@ package org.olat.search.service.indexer.repository.course; import java.io.IOException; -import java.util.ArrayList; -import java.util.Iterator; import java.util.List; import org.apache.lucene.document.Document; import org.olat.basesecurity.BaseSecurityManager; import org.olat.basesecurity.Constants; import org.olat.core.CoreSpringFactory; -import org.olat.core.commons.modules.bc.vfs.OlatRootFolderImpl; import org.olat.core.id.Identity; import org.olat.core.id.OLATResourceable; import org.olat.core.id.Roles; import org.olat.core.id.context.BusinessControl; import org.olat.core.id.context.ContextEntry; import org.olat.core.util.resource.OresHelper; +import org.olat.core.util.vfs.VFSContainer; import org.olat.core.util.vfs.VFSLeaf; import org.olat.core.util.vfs.filters.VFSLeafFilter; import org.olat.course.ICourse; import org.olat.course.nodes.CourseNode; -import org.olat.course.properties.CoursePropertyManager; -import org.olat.modules.dialog.DialogElement; -import org.olat.modules.dialog.DialogElementsController; -import org.olat.modules.dialog.DialogElementsPropertyManager; -import org.olat.modules.dialog.DialogPropertyElements; +import org.olat.course.nodes.dialog.DialogElement; +import org.olat.course.nodes.dialog.DialogElementsManager; import org.olat.modules.fo.Forum; import org.olat.modules.fo.Message; import org.olat.modules.fo.Status; import org.olat.modules.fo.manager.ForumManager; +import org.olat.repository.RepositoryEntry; import org.olat.search.service.SearchResourceContext; import org.olat.search.service.document.CourseNodeDocument; import org.olat.search.service.document.ForumMessageDocument; @@ -86,21 +82,13 @@ public class DialogCourseNodeIndexer extends DefaultIndexer implements CourseNod Document document = CourseNodeDocument.createDocument(courseNodeResourceContext, courseNode); indexWriter.addDocument(document); - CoursePropertyManager coursePropMgr = course.getCourseEnvironment().getCoursePropertyManager(); - DialogElementsPropertyManager dialogElmsMgr = DialogElementsPropertyManager.getInstance(); - DialogPropertyElements elements = dialogElmsMgr.findDialogElements(coursePropMgr, courseNode); - List<DialogElement> list = new ArrayList<DialogElement>(); - if (elements != null) list = elements.getDialogPropertyElements(); - // loop over all dialog elements - for (Iterator<DialogElement> iter = list.iterator(); iter.hasNext();) { - DialogElement element = iter.next(); - element.getAuthor(); - element.getDate(); - Forum forum = ForumManager.getInstance().loadForum(element.getForumKey()); - // do IndexForum + RepositoryEntry entry = course.getCourseEnvironment().getCourseGroupManager().getCourseEntry(); + DialogElementsManager dialogElmsMgr = CoreSpringFactory.getImpl(DialogElementsManager.class); + List<DialogElement> elements = dialogElmsMgr.getDialogElements(entry, courseNode.getIdent()); + for (DialogElement element:elements) { + Forum forum = element.getForum(); doIndexAllMessages(courseNodeResourceContext, forum, indexWriter ); - // do Index File - doIndexFile(element.getFilename(), element.getForumKey(), courseNodeResourceContext, indexWriter); + doIndexFile(element, courseNodeResourceContext, indexWriter); } } @@ -113,13 +101,15 @@ public class DialogCourseNodeIndexer extends DefaultIndexer implements CourseNod * @throws IOException * @throws InterruptedException */ - private void doIndexFile(String filename, Long forumKey, SearchResourceContext leafResourceContext, OlatFullIndexer indexWriter) throws IOException,InterruptedException { - OlatRootFolderImpl forumContainer = DialogElementsController.getForumContainer(forumKey); - VFSLeaf leaf = (VFSLeaf) forumContainer.getItems(new VFSLeafFilter()).get(0); + private void doIndexFile(DialogElement element, SearchResourceContext leafResourceContext, OlatFullIndexer indexWriter) + throws IOException,InterruptedException { + DialogElementsManager dialogElmsMgr = CoreSpringFactory.getImpl(DialogElementsManager.class); + VFSContainer dialogContainer = dialogElmsMgr.getDialogContainer(element); + VFSLeaf leaf = (VFSLeaf) dialogContainer.getItems(new VFSLeafFilter()).get(0); if (isLogDebugEnabled()) logDebug("Analyse VFSLeaf=" + leaf.getName()); try { if (CoreSpringFactory.getImpl(FileDocumentFactory.class).isFileSupported(leaf)) { - leafResourceContext.setFilePath(filename); + leafResourceContext.setFilePath(element.getFilename()); leafResourceContext.setDocumentType(TYPE_FILE); Document document = CoreSpringFactory.getImpl(FileDocumentFactory.class).createDocument(leafResourceContext, leaf); diff --git a/src/main/java/org/olat/upgrade/OLATUpgrade_12_3_0.java b/src/main/java/org/olat/upgrade/OLATUpgrade_12_3_0.java index 2f72557300df693beaa4c7b938fd60b692fb5bb1..e145f0ce65d51353390eb3594ee0915e79908d6a 100644 --- a/src/main/java/org/olat/upgrade/OLATUpgrade_12_3_0.java +++ b/src/main/java/org/olat/upgrade/OLATUpgrade_12_3_0.java @@ -21,20 +21,39 @@ package org.olat.upgrade; import java.io.File; import java.net.URI; +import java.util.Date; import java.util.List; +import org.olat.basesecurity.BaseSecurity; +import org.olat.core.commons.modules.bc.vfs.OlatRootFolderImpl; import org.olat.core.commons.persistence.DB; +import org.olat.core.id.Identity; +import org.olat.core.id.OLATResourceable; import org.olat.core.util.StringHelper; +import org.olat.core.util.resource.OresHelper; +import org.olat.core.util.vfs.VFSItem; import org.olat.core.util.vfs.VFSLeaf; +import org.olat.core.util.xml.XStreamHelper; +import org.olat.course.nodes.dialog.DialogElementsManager; +import org.olat.course.nodes.dialog.model.DialogElementImpl; import org.olat.ims.qti.QTIConstants; import org.olat.ims.qti.editor.QTIEditHelper; import org.olat.ims.qti.editor.beecom.objects.Item; import org.olat.ims.qti21.QTI21Constants; import org.olat.ims.qti21.QTI21Service; +import org.olat.modules.fo.Forum; +import org.olat.modules.fo.manager.ForumManager; import org.olat.modules.qpool.QPoolService; import org.olat.modules.qpool.model.QuestionItemImpl; +import org.olat.properties.Property; +import org.olat.repository.RepositoryEntry; +import org.olat.repository.RepositoryManager; +import org.olat.upgrade.legacy.DialogElement; +import org.olat.upgrade.legacy.DialogPropertyElements; import org.springframework.beans.factory.annotation.Autowired; +import com.thoughtworks.xstream.XStream; + import uk.ac.ed.ph.jqtiplus.resolution.ResolvedAssessmentItem; /** @@ -50,12 +69,22 @@ public class OLATUpgrade_12_3_0 extends OLATUpgrade { private static final String VERSION = "OLAT_12.3.0"; private static final String MIGRATE_QPOOL_TITLE = "MIGRATE QPOOL TITLE"; + private static final String MIGRATE_DIALOG = "MIGRATE DIALOG ELEMENTS"; + @Autowired private DB dbInstance; @Autowired private QPoolService qpoolService; @Autowired private QTI21Service qtiService; + @Autowired + private BaseSecurity securityManager; + @Autowired + private ForumManager forumManager; + @Autowired + private RepositoryManager repositoryManager; + @Autowired + private DialogElementsManager dialogElementsManager; public OLATUpgrade_12_3_0() { super(); @@ -85,6 +114,7 @@ public class OLATUpgrade_12_3_0 extends OLATUpgrade { // Migrate the topics from the database field title to topic. // Migrate the title of the question (XML) to the database. allOk &= migrateQpoolTopicTitle(upgradeManager, uhd); + allOk &= migrateDialogElements(upgradeManager, uhd); uhd.setInstallationComplete(allOk); upgradeManager.setUpgradesHistory(uhd, VERSION); @@ -194,5 +224,107 @@ public class OLATUpgrade_12_3_0 extends OLATUpgrade { Item xmlItem = QTIEditHelper.readItemXml(leaf); return xmlItem.getTitle(); } + + private boolean migrateDialogElements(UpgradeManager upgradeManager, UpgradeHistoryData uhd) { + boolean allOk = true; + if (!uhd.getBooleanDataValue(MIGRATE_DIALOG)) { + try { + XStream xstream = XStreamHelper.createXStreamInstance(); + xstream.alias("org.olat.modules.dialog.DialogPropertyElements", DialogPropertyElements.class); + xstream.alias("org.olat.modules.dialog.DialogElement", DialogElement.class); + + List<Property> properties = getProperties(); + for(Property property:properties) { + migrateDialogElement(property, xstream); + dbInstance.commitAndCloseSession(); + } + } catch (Exception e) { + log.error("", e); + allOk &= false; + } + + uhd.setBooleanDataValue(MIGRATE_DIALOG, allOk); + upgradeManager.setUpgradesHistory(uhd, VERSION); + } + return allOk; + } + private boolean migrateDialogElement(Property property, XStream xstream) { + Long resourceId = property.getResourceTypeId(); + OLATResourceable ores = OresHelper.createOLATResourceableInstance("CourseModule", resourceId); + RepositoryEntry entry = repositoryManager.lookupRepositoryEntry(ores, false); + if(entry != null) { + String category = property.getCategory(); + if(category.startsWith("NID:dial::")) { + category = category.substring("NID:dial::".length(), category.length()); + } + + String value = property.getTextValue(); + if(StringHelper.containsNonWhitespace(value)) { + DialogPropertyElements propertyElements = (DialogPropertyElements)xstream.fromXML(value); + List<DialogElement> elements = propertyElements.getDialogPropertyElements(); + for(DialogElement element:elements) { + createDialogElement(element, entry, category); + } + } + } + return true; + } + + private void createDialogElement(DialogElement element, RepositoryEntry entry, String nodeIdent) { + try { + Identity author = null; + if(StringHelper.isLong(element.getAuthor())) { + author = securityManager.loadIdentityByKey(Long.valueOf(element.getAuthor())); + } else if(StringHelper.containsNonWhitespace(element.getAuthor())) { + author = securityManager.findIdentityByName(element.getAuthor()); + } + + Forum forum = forumManager.loadForum(element.getForumKey()); + if(forum == null) { + log.error("Missing forum", null); + return; + } + + Object currentElement = dialogElementsManager.getDialogElementByForum(forum.getKey()); + if(currentElement != null) { + return; + } + + Date date = element.getDate() == null ? new Date() : element.getDate(); + DialogElementImpl el = new DialogElementImpl(); + el.setCreationDate(date); + el.setLastModified(date); + el.setFilename(element.getFilename()); + el.setSize(getFileSize(forum.getKey())); + el.setEntry(entry); + el.setSubIdent(nodeIdent); + el.setAuthor(author); + el.setForum(forum); + dbInstance.getCurrentEntityManager().persist(el); + } catch (Exception e) { + log.error("", e); + } + } + + public Long getFileSize(Long forumKey) { + StringBuilder sb = new StringBuilder(); + sb.append("/forum/").append(forumKey).append("/"); + OlatRootFolderImpl forumContainer = new OlatRootFolderImpl(sb.toString(), null); + VFSItem vl = forumContainer.getItems().get(0); + if(vl instanceof VFSLeaf) { + return ((VFSLeaf)vl).getSize(); + } + return -1l; + } + + private List<Property> getProperties() { + StringBuilder sb = new StringBuilder(); + sb.append("select v from ").append(Property.class.getName()).append(" as v ") + .append(" where v.name=:name and v.resourceTypeName=:resName"); + return dbInstance.getCurrentEntityManager().createQuery(sb.toString(), Property.class) + .setParameter("name", "fileDialog") + .setParameter("resName", "CourseModule") + .getResultList(); + } } diff --git a/src/main/java/org/olat/modules/dialog/DialogElement.java b/src/main/java/org/olat/upgrade/legacy/DialogElement.java similarity index 75% rename from src/main/java/org/olat/modules/dialog/DialogElement.java rename to src/main/java/org/olat/upgrade/legacy/DialogElement.java index 96fe65da58913977df379fd1d72d77d60db1a114..5a014596e88847cdbced4a2e02207b2bab276e73 100644 --- a/src/main/java/org/olat/modules/dialog/DialogElement.java +++ b/src/main/java/org/olat/upgrade/legacy/DialogElement.java @@ -23,15 +23,10 @@ * under the Apache 2.0 license as the original file. */ -package org.olat.modules.dialog; +package org.olat.upgrade.legacy; import java.util.Date; -import org.hibernate.ObjectNotFoundException; -import org.olat.basesecurity.BaseSecurityManager; -import org.olat.core.commons.persistence.DBFactory; -import org.olat.core.id.Identity; - /** * Description:<br> * TODO: guido Class Description for DialogElementsTableEntry @@ -53,7 +48,7 @@ public class DialogElement { private Long forumKey; public DialogElement(){ - //empty construvtor + //empty constructor } //getters must be public for velocity access @@ -68,29 +63,13 @@ public class DialogElement { return filename; } public String getAuthor() { - try { - // try to handle as identity id - Identity identity = BaseSecurityManager.getInstance().loadIdentityByKey(Long.valueOf(author)); - if (identity == null) { - return author; - } - return identity.getName(); - } catch (NumberFormatException nEx) { - return author; - } catch (ObjectNotFoundException oEx) { - DBFactory.getInstance().rollbackAndCloseSession(); - return author; - } catch (Throwable th) { - DBFactory.getInstance().rollbackAndCloseSession(); - return author; - } + return author; } public String getFileSize() { return fileSize; } public void setAuthor(String author) { - Identity identity = BaseSecurityManager.getInstance().findIdentityByName(author); - this.author = identity.getKey().toString(); + this.author = author; } public void setFilename(String filename) { this.filename = filename; @@ -128,5 +107,4 @@ public class DialogElement { public void setAuthorIdentityId(String identityId) { this.author = identityId; } - } diff --git a/src/main/java/org/olat/modules/dialog/DialogPropertyElements.java b/src/main/java/org/olat/upgrade/legacy/DialogPropertyElements.java similarity index 98% rename from src/main/java/org/olat/modules/dialog/DialogPropertyElements.java rename to src/main/java/org/olat/upgrade/legacy/DialogPropertyElements.java index 958979eb1b7fee6170f3e46a9e74ec0617827430..0a5c08c0faf1ef389a22a1fcd53ea767c56a49dd 100644 --- a/src/main/java/org/olat/modules/dialog/DialogPropertyElements.java +++ b/src/main/java/org/olat/upgrade/legacy/DialogPropertyElements.java @@ -23,7 +23,7 @@ * under the Apache 2.0 license as the original file. */ -package org.olat.modules.dialog; +package org.olat.upgrade.legacy; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/org/olat/user/propertyhandlers/_spring/userPropertiesContext.xml b/src/main/java/org/olat/user/propertyhandlers/_spring/userPropertiesContext.xml index 6c25e978805b702b1bb95e23a4453b4b737aad7a..8c7c1a5bec8149bb4fb4fc32015d3fc72c5c715e 100644 --- a/src/main/java/org/olat/user/propertyhandlers/_spring/userPropertiesContext.xml +++ b/src/main/java/org/olat/user/propertyhandlers/_spring/userPropertiesContext.xml @@ -1107,6 +1107,24 @@ </property> </bean> </entry> + + <entry key="org.olat.course.nodes.dialog.ui.DialogElementsTableModel"> + <bean class="org.olat.user.propertyhandlers.UserPropertyUsageContext"> + <property name="description" value="File dialog" /> + <property name="propertyHandlers"> + <list> + <ref bean="userPropertyLastName" /> + <ref bean="userPropertyFirstName" /> + </list> + </property> + <property name="mandatoryProperties"> + <set> + <ref bean="userPropertyLastName" /> + <ref bean="userPropertyFirstName" /> + </set> + </property> + </bean> + </entry> <entry key="org.olat.course.assessment.AssessedIdentitiesTableDataModel"> <bean class="org.olat.user.propertyhandlers.UserPropertyUsageContext"> diff --git a/src/main/resources/META-INF/persistence.xml b/src/main/resources/META-INF/persistence.xml index 31aa59873dba54f064384a30489d64c082491a29..971c0407215b37c62ff64fd72f89de8e450ee25c 100644 --- a/src/main/resources/META-INF/persistence.xml +++ b/src/main/resources/META-INF/persistence.xml @@ -93,6 +93,7 @@ <class>org.olat.course.assessment.model.UserEfficiencyStatementRepoImpl</class> <class>org.olat.course.nodes.cl.model.DBCheckbox</class> <class>org.olat.course.nodes.cl.model.DBCheck</class> + <class>org.olat.course.nodes.dialog.model.DialogElementImpl</class> <class>org.olat.course.nodes.gta.model.IdentityMarkImpl</class> <class>org.olat.course.nodes.gta.model.TaskImpl</class> <class>org.olat.course.nodes.gta.model.TaskLightImpl</class> diff --git a/src/main/resources/database/mysql/alter_12_2_x_to_12_3_0.sql b/src/main/resources/database/mysql/alter_12_2_x_to_12_3_0.sql index 54761a6acf031e56ecd7877748b0ec0b6bc43b03..3750553d86d208035961233a95433f6e9b6866f2 100644 --- a/src/main/resources/database/mysql/alter_12_2_x_to_12_3_0.sql +++ b/src/main/resources/database/mysql/alter_12_2_x_to_12_3_0.sql @@ -13,4 +13,27 @@ alter table o_as_entry add column a_current_run_status varchar(16); alter table o_qti_assessmenttest_session add column q_num_questions bigint; alter table o_qti_assessmenttest_session add column q_num_answered_questions bigint; -alter table o_qti_assessmenttest_session add column q_extra_time bigint; \ No newline at end of file +alter table o_qti_assessmenttest_session add column q_extra_time bigint; + + +-- dialog elements +create table o_dialog_element ( + id bigint not null auto_increment, + creationdate datetime not null, + lastmodified datetime not null, + d_filename varchar(2048), + d_filesize bigint, + d_subident varchar(64) not null, + fk_author bigint, + fk_entry bigint not null, + fk_forum bigint not null, + primary key (id) +); + +alter table o_dialog_element add constraint dial_el_author_idx foreign key (fk_author) references o_bs_identity (id); +alter table o_dialog_element add constraint dial_el_entry_idx foreign key (fk_entry) references o_repositoryentry (repositoryentry_id); +alter table o_dialog_element add constraint dial_el_forum_idx foreign key (fk_forum) references o_forum (forum_id); +create index idx_dial_el_subident_idx on o_dialog_element (d_subident); + + + diff --git a/src/main/resources/database/mysql/setupDatabase.sql b/src/main/resources/database/mysql/setupDatabase.sql index e6eee943aed8e454f4f810bccfa91291489ff37a..263b5900e43c86faa2d4582f5128ecec9ef689d6 100644 --- a/src/main/resources/database/mysql/setupDatabase.sql +++ b/src/main/resources/database/mysql/setupDatabase.sql @@ -2243,6 +2243,20 @@ create table o_tax_competence_audit_log ( primary key (id) ); +-- dialog elements +create table o_dialog_element ( + id bigint not null auto_increment, + creationdate datetime not null, + lastmodified datetime not null, + d_filename varchar(2048), + d_filesize bigint, + d_subident varchar(64) not null, + fk_author bigint, + fk_entry bigint not null, + fk_forum bigint not null, + primary key (id) +); + -- user view create view o_bs_identity_short_v as ( select @@ -3114,6 +3128,12 @@ create index idx_tax_level_path_key_idx on o_tax_taxonomy_level (t_m_path_keys); alter table o_tax_taxonomy_competence add constraint tax_comp_to_tax_level_idx foreign key (fk_level) references o_tax_taxonomy_level (id); alter table o_tax_taxonomy_competence add constraint tax_level_to_ident_idx foreign key (fk_identity) references o_bs_identity (id); +-- dialog elements +alter table o_dialog_element add constraint dial_el_author_idx foreign key (fk_author) references o_bs_identity (id); +alter table o_dialog_element add constraint dial_el_entry_idx foreign key (fk_entry) references o_repositoryentry (repositoryentry_id); +alter table o_dialog_element add constraint dial_el_forum_idx foreign key (fk_forum) references o_forum (forum_id); +create index idx_dial_el_subident_idx on o_dialog_element (d_subident); + -- o_logging_table create index log_target_resid_idx on o_loggingtable(targetresid); create index log_ptarget_resid_idx on o_loggingtable(parentresid); diff --git a/src/main/resources/database/oracle/alter_12_2_x_to_12_3_0.sql b/src/main/resources/database/oracle/alter_12_2_x_to_12_3_0.sql index fd3e0151a7c06a2797d2e05912adb15f7ed26cdd..c7f5f312425787547e81b0a55a2591d6ae78d3fd 100644 --- a/src/main/resources/database/oracle/alter_12_2_x_to_12_3_0.sql +++ b/src/main/resources/database/oracle/alter_12_2_x_to_12_3_0.sql @@ -12,4 +12,26 @@ alter table o_as_entry add a_current_run_status varchar2(16 char); alter table o_qti_assessmenttest_session add q_num_questions number(20); alter table o_qti_assessmenttest_session add q_num_answered_questions number(20); -alter table o_qti_assessmenttest_session add q_extra_time number(20); \ No newline at end of file +alter table o_qti_assessmenttest_session add q_extra_time number(20); + +-- dialog elements +create table o_dialog_element ( + id number(20) generated always as identity, + creationdate date not null, + lastmodified date not null, + d_filename varchar2(2048 char), + d_filesize number(20), + d_subident varchar2(64 char) not null, + fk_author number(20), + fk_entry number(20) not null, + fk_forum number(20) not null, + primary key (id) +); + +alter table o_dialog_element add constraint dial_el_author_idx foreign key (fk_author) references o_bs_identity (id); +create index idx_dial_el_author_idx on o_dialog_element (fk_author); +alter table o_dialog_element add constraint dial_el_entry_idx foreign key (fk_entry) references o_repositoryentry (repositoryentry_id); +create index idx_dial_el_entry_idx on o_dialog_element (fk_entry); +alter table o_dialog_element add constraint dial_el_forum_idx foreign key (fk_forum) references o_forum (forum_id); +create index idx_dial_el_forum_idx on o_dialog_element (fk_forum); +create index idx_dial_el_subident_idx on o_dialog_element (d_subident); \ No newline at end of file diff --git a/src/main/resources/database/oracle/setupDatabase.sql b/src/main/resources/database/oracle/setupDatabase.sql index 18b2cb2ba4fd01643179502ae48b3d11452556ef..b70b669c08a7def2269033c82dbbf555c8c090c8 100644 --- a/src/main/resources/database/oracle/setupDatabase.sql +++ b/src/main/resources/database/oracle/setupDatabase.sql @@ -2286,6 +2286,20 @@ create table o_tax_competence_audit_log ( primary key (id) ); +-- dialog elements +create table o_dialog_element ( + id number(20) generated always as identity, + creationdate date not null, + lastmodified date not null, + d_filename varchar2(2048 char), + d_filesize number(20), + d_subident varchar2(64 char) not null, + fk_author number(20), + fk_entry number(20) not null, + fk_forum number(20) not null, + primary key (id) +); + -- user view create view o_bs_identity_short_v as ( select @@ -3309,6 +3323,15 @@ alter table o_lecture_entry_config add constraint lec_entry_config_entry_idx for create index idx_lec_audit_entry_idx on o_lecture_block_audit_log(fk_entry); create index idx_lec_audit_ident_idx on o_lecture_block_audit_log(fk_identity); +-- dialog elements +alter table o_dialog_element add constraint dial_el_author_idx foreign key (fk_author) references o_bs_identity (id); +create index idx_dial_el_author_idx on o_dialog_element (fk_author); +alter table o_dialog_element add constraint dial_el_entry_idx foreign key (fk_entry) references o_repositoryentry (repositoryentry_id); +create index idx_dial_el_entry_idx on o_dialog_element (fk_entry); +alter table o_dialog_element add constraint dial_el_forum_idx foreign key (fk_forum) references o_forum (forum_id); +create index idx_dial_el_forum_idx on o_dialog_element (fk_forum); +create index idx_dial_el_subident_idx on o_dialog_element (d_subident); + -- o_logging_table create index log_target_resid_idx on o_loggingtable(targetresid); create index log_ptarget_resid_idx on o_loggingtable(parentresid); diff --git a/src/main/resources/database/postgresql/alter_12_2_x_to_12_3_0.sql b/src/main/resources/database/postgresql/alter_12_2_x_to_12_3_0.sql index 0ffecfda9b8aed80fa1f0c7d8d62cb114448559b..d6e2f2cd9614c5bedddb2688f35baad2ef701003 100644 --- a/src/main/resources/database/postgresql/alter_12_2_x_to_12_3_0.sql +++ b/src/main/resources/database/postgresql/alter_12_2_x_to_12_3_0.sql @@ -12,4 +12,33 @@ alter table o_as_entry add column a_current_run_status varchar(16); alter table o_qti_assessmenttest_session add column q_num_questions int8; alter table o_qti_assessmenttest_session add column q_num_answered_questions int8; -alter table o_qti_assessmenttest_session add column q_extra_time int8; \ No newline at end of file +alter table o_qti_assessmenttest_session add column q_extra_time int8; + +-- dialog elements +create table o_dialog_element ( + id bigserial, + creationdate timestamp not null, + lastmodified timestamp not null, + d_filename varchar(2048), + d_filesize int8, + d_subident varchar(64) not null, + fk_author int8, + fk_entry int8 not null, + fk_forum int8 not null, + primary key (id) +); + +alter table o_dialog_element add constraint dial_el_author_idx foreign key (fk_author) references o_bs_identity (id); +create index idx_dial_el_author_idx on o_dialog_element (fk_author); +alter table o_dialog_element add constraint dial_el_entry_idx foreign key (fk_entry) references o_repositoryentry (repositoryentry_id); +create index idx_dial_el_entry_idx on o_dialog_element (fk_entry); +alter table o_dialog_element add constraint dial_el_forum_idx foreign key (fk_forum) references o_forum (forum_id); +create index idx_dial_el_forum_idx on o_dialog_element (fk_forum); +create index idx_dial_el_subident_idx on o_dialog_element (d_subident); + + + + + + + diff --git a/src/main/resources/database/postgresql/setupDatabase.sql b/src/main/resources/database/postgresql/setupDatabase.sql index 9a51bd79f7fb3d3df50b2879c89b6caad8186488..7f219ef07299c045a877fe57c9584b51b38f5310 100644 --- a/src/main/resources/database/postgresql/setupDatabase.sql +++ b/src/main/resources/database/postgresql/setupDatabase.sql @@ -2241,6 +2241,20 @@ create table o_tax_competence_audit_log ( primary key (id) ); +-- dialog elements +create table o_dialog_element ( + id bigserial, + creationdate timestamp not null, + lastmodified timestamp not null, + d_filename varchar(2048), + d_filesize int8, + d_subident varchar(64) not null, + fk_author int8, + fk_entry int8 not null, + fk_forum int8 not null, + primary key (id) +); + -- user view create view o_bs_identity_short_v as ( select @@ -3162,6 +3176,15 @@ create index idx_tax_comp_to_tax_level_idx on o_tax_taxonomy_competence (fk_leve alter table o_tax_taxonomy_competence add constraint tax_level_to_ident_idx foreign key (fk_identity) references o_bs_identity (id); create index idx_tax_level_to_ident_idx on o_tax_taxonomy_competence (fk_identity); +-- dialog elements +alter table o_dialog_element add constraint dial_el_author_idx foreign key (fk_author) references o_bs_identity (id); +create index idx_dial_el_author_idx on o_dialog_element (fk_author); +alter table o_dialog_element add constraint dial_el_entry_idx foreign key (fk_entry) references o_repositoryentry (repositoryentry_id); +create index idx_dial_el_entry_idx on o_dialog_element (fk_entry); +alter table o_dialog_element add constraint dial_el_forum_idx foreign key (fk_forum) references o_forum (forum_id); +create index idx_dial_el_forum_idx on o_dialog_element (fk_forum); +create index idx_dial_el_subident_idx on o_dialog_element (d_subident); + -- o_logging_table create index log_target_resid_idx on o_loggingtable(targetresid); create index log_ptarget_resid_idx on o_loggingtable(parentresid); diff --git a/src/test/java/org/olat/course/nodes/dialog/manager/DialogElementsManagerTest.java b/src/test/java/org/olat/course/nodes/dialog/manager/DialogElementsManagerTest.java new file mode 100644 index 0000000000000000000000000000000000000000..5328000a8270e9ca9a385c91689811c72efae50a --- /dev/null +++ b/src/test/java/org/olat/course/nodes/dialog/manager/DialogElementsManagerTest.java @@ -0,0 +1,85 @@ +/** + * <a href="http://www.openolat.org"> + * OpenOLAT - Online Learning and Training</a><br> + * <p> + * Licensed under the Apache License, Version 2.0 (the "License"); <br> + * you may not use this file except in compliance with the License.<br> + * You may obtain a copy of the License at the + * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a> + * <p> + * Unless required by applicable law or agreed to in writing,<br> + * software distributed under the License is distributed on an "AS IS" BASIS, <br> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> + * See the License for the specific language governing permissions and <br> + * limitations under the License. + * <p> + * Initial code contributed and copyrighted by<br> + * frentix GmbH, http://www.frentix.com + * <p> + */ +package org.olat.course.nodes.dialog.manager; + +import java.util.UUID; + +import org.junit.Assert; +import org.junit.Test; +import org.olat.core.commons.persistence.DB; +import org.olat.core.id.Identity; +import org.olat.course.nodes.dialog.DialogElement; +import org.olat.course.nodes.dialog.DialogElementsManager; +import org.olat.modules.fo.Forum; +import org.olat.repository.RepositoryEntry; +import org.olat.test.JunitTestHelper; +import org.olat.test.OlatTestCase; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * + * Initial date: 3 janv. 2018<br> + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + * + */ +public class DialogElementsManagerTest extends OlatTestCase { + + @Autowired + private DB dbInstance; + @Autowired + private DialogElementsManager dialogElementsManager; + + @Test + public void createDialogElement() { + RepositoryEntry entry = JunitTestHelper.createAndPersistRepositoryEntry(); + Identity author = JunitTestHelper.createAndPersistIdentityAsRndUser("session-1"); + String subIdent = UUID.randomUUID().toString(); + DialogElement element = dialogElementsManager.createDialogElement(entry, author, "task_d.txt", 234l, subIdent); + dbInstance.commitAndCloseSession(); + + Assert.assertNotNull(element.getKey()); + Assert.assertNotNull(element.getForum()); + Assert.assertEquals(author, element.getAuthor()); + Assert.assertEquals("task_d.txt", element.getFilename()); + Assert.assertEquals(Long.valueOf(234l), element.getSize()); + Assert.assertEquals(subIdent, element.getSubIdent()); + Assert.assertEquals(entry, element.getEntry()); + } + + @Test + public void getDialogElementByForumKey() { + RepositoryEntry entry = JunitTestHelper.createAndPersistRepositoryEntry(); + Identity author = JunitTestHelper.createAndPersistIdentityAsRndUser("session-1"); + String subIdent = UUID.randomUUID().toString(); + DialogElement element = dialogElementsManager.createDialogElement(entry, author, "task_e.txt", 235l, subIdent); + dbInstance.commitAndCloseSession(); + + Forum forum = element.getForum(); + DialogElement loadedElement = dialogElementsManager.getDialogElementByForum(forum.getKey()); + Assert.assertNotNull(loadedElement.getKey()); + Assert.assertEquals(forum, loadedElement.getForum()); + Assert.assertEquals(author, loadedElement.getAuthor()); + Assert.assertEquals("task_e.txt", loadedElement.getFilename()); + Assert.assertEquals(Long.valueOf(235l), loadedElement.getSize()); + Assert.assertEquals(subIdent, loadedElement.getSubIdent()); + Assert.assertEquals(entry, loadedElement.getEntry()); + } + +} diff --git a/src/test/java/org/olat/selenium/page/course/DialogConfigurationPage.java b/src/test/java/org/olat/selenium/page/course/DialogConfigurationPage.java index 549a6ea5c87436035edc3d98d18abc7859334b7d..bdef7c63adae0fff68ff89bb03109167cf48876d 100644 --- a/src/test/java/org/olat/selenium/page/course/DialogConfigurationPage.java +++ b/src/test/java/org/olat/selenium/page/course/DialogConfigurationPage.java @@ -48,16 +48,16 @@ public class DialogConfigurationPage { public DialogConfigurationPage uploadFile(File file) { By uploadBy = By.cssSelector("fieldset.o_sel_dialog_settings_upload a.o_sel_dialog_upload"); browser.findElement(uploadBy).click(); - OOGraphene.waitBusy(browser); + OOGraphene.waitModalDialog(browser); - By inputBy = By.xpath("//div[@class='o_fileinput']/input[@type='file']"); + By inputBy = By.xpath("//div[contains(@class,'modal-body')]//div[@class='o_fileinput']/input[@type='file']"); OOGraphene.uploadFile(inputBy, file, browser); - By uploadButtonBy = By.cssSelector("fieldset.o_sel_dialog_settings_upload button.btn-primary"); + By uploadButtonBy = By.cssSelector("div.modal-body div.o_sel_upload_buttons button.btn-primary"); OOGraphene.waitElement(uploadButtonBy, browser); browser.findElement(uploadButtonBy).click(); - By rowBy = By.xpath("//table//tr/td[contains(text(),'" + file.getName() + "')]"); + By rowBy = By.xpath("//table//tr/td/a[contains(text(),'" + file.getName() + "')]"); OOGraphene.waitElement(rowBy, browser); return this; diff --git a/src/test/java/org/olat/selenium/page/course/DialogPage.java b/src/test/java/org/olat/selenium/page/course/DialogPage.java index 9665b84710e57c1336173e3432774d1c170c9582..1c22868c1965768d8557c84c7f19a60bf5463782 100644 --- a/src/test/java/org/olat/selenium/page/course/DialogPage.java +++ b/src/test/java/org/olat/selenium/page/course/DialogPage.java @@ -62,8 +62,20 @@ public class DialogPage { return this; } + /** + * Return back to the list of dialog elements from a selected one. + * + * @return Itself + */ + public DialogPage back() { + By backBy = By.cssSelector("div.o_sel_dialog a.o_link_back"); + browser.findElement(backBy).click(); + OOGraphene.waitBusy(browser); + return this; + } + public ForumPage openForum(String filename) { - By openForumBy = By.xpath("//table//tr[td/a[contains(text(),'" + filename + "')]]/td/a[contains(@onclick,'startforum')]"); + By openForumBy = By.xpath("//table//tr[td/a[contains(text(),'" + filename + "')]]/td/a[contains(@href,'forum')]"); browser.findElement(openForumBy).click(); OOGraphene.waitBusy(browser); By forumBy = By.cssSelector("div.o_sel_dialog div.o_sel_forum"); diff --git a/src/test/java/org/olat/test/AllTestsJunit4.java b/src/test/java/org/olat/test/AllTestsJunit4.java index 37b80370978066ff55e5e606f9c1a251b65afd75..6be42da158eeb8de0a4b710cbb5d668d2e096524 100644 --- a/src/test/java/org/olat/test/AllTestsJunit4.java +++ b/src/test/java/org/olat/test/AllTestsJunit4.java @@ -137,6 +137,7 @@ import org.junit.runners.Suite; org.olat.course.condition.ConditionTest.class, org.olat.course.condition.KeyAndNameConverterTest.class, org.olat.course.highscore.HighScoreManagerTest.class, + org.olat.course.nodes.dialog.manager.DialogElementsManagerTest.class, org.olat.course.nodes.en.EnrollmentManagerSerialTest.class, org.olat.course.nodes.en.EnrollmentManagerConcurrentTest.class, org.olat.course.nodes.gta.manager.GTAManagerTest.class,