diff --git a/src/main/java/org/olat/course/nodes/FOCourseNode.java b/src/main/java/org/olat/course/nodes/FOCourseNode.java index 66527f33abb7f3e4ce9accda16d4c8bf7e0cf8b5..f7ea0c5d52dd11048a43d1d5fbab1a7131b76c7e 100644 --- a/src/main/java/org/olat/course/nodes/FOCourseNode.java +++ b/src/main/java/org/olat/course/nodes/FOCourseNode.java @@ -58,6 +58,7 @@ import org.olat.course.ICourse; import org.olat.course.condition.Condition; import org.olat.course.condition.interpreter.ConditionExpression; import org.olat.course.condition.interpreter.ConditionInterpreter; +import org.olat.course.editor.ConditionAccessEditConfig; import org.olat.course.editor.CourseEditorEnv; import org.olat.course.editor.NodeEditController; import org.olat.course.editor.StatusDescription; @@ -87,47 +88,52 @@ import org.olat.repository.RepositoryEntry; * Initial Date: Feb 9, 2004 * * @author Mike Stock Comment: - * @author BPS (<a href="http://www.bps-system.de/">BPS Bildungsportal Sachsen GmbH</a>) + * @author BPS (<a href="http://www.bps-system.de/">BPS Bildungsportal Sachsen + * GmbH</a>) */ public class FOCourseNode extends AbstractAccessableCourseNode { - + private static final Logger log = Tracing.createLoggerFor(FOCourseNode.class); private static final long serialVersionUID = 2281715263255594865L; - + @SuppressWarnings("deprecation") private static final String PACKAGE_FO = Util.getPackageName(FOCourseNodeRunController.class); private static final String TYPE = "fo"; - + private static final int CURRENT_VERSION = 4; public static final String CONFIG_FORUM_KEY = "forumKey"; public static final String CONFIG_PSEUDONYM_POST_ALLOWED = "pseudonym.post.allowed"; public static final String CONFIG_PSEUDONYM_POST_DEFAULT = "pseudonym.post.default"; + public static final String CONFIG_COACH_MODERATE_ALLOWED = "coach.moderate.allowed"; + public static final String CONFIG_COACH_POST_ALLOWED = "coach.post.allowed"; + public static final String CONFIG_PARTICIPANT_POST_ALLOWED = "participant.post.allowed"; public static final String CONFIG_GUEST_POST_ALLOWED = "guest.post.allowed"; // null means no precondition / always accessible private Condition preConditionReader, preConditionPoster, preConditionModerator; - - + public FOCourseNode() { super(TYPE); updateModuleConfigDefaults(true); - // restrict moderator access to course admins and course coaches - preConditionModerator = getPreConditionModerator(); - preConditionModerator.setEasyModeCoachesAndAdmins(true); - preConditionModerator.setConditionExpression(preConditionModerator.getConditionFromEasyModeConfiguration()); - preConditionModerator.setExpertMode(false); } @Override - public TabbableController createEditController(UserRequest ureq, WindowControl wControl, BreadcrumbPanel stackPanel, ICourse course, UserCourseEnvironment euce) { + public TabbableController createEditController(UserRequest ureq, WindowControl wControl, BreadcrumbPanel stackPanel, + ICourse course, UserCourseEnvironment euce) { updateModuleConfigDefaults(false); FOCourseNodeEditController childTabCntrllr = new FOCourseNodeEditController(ureq, wControl, this, course, euce); - CourseNode chosenNode = course.getEditorTreeModel().getCourseNode(euce.getCourseEditorEnv().getCurrentCourseNodeId()); + CourseNode chosenNode = course.getEditorTreeModel() + .getCourseNode(euce.getCourseEditorEnv().getCurrentCourseNodeId()); return new NodeEditController(ureq, wControl, course, chosenNode, euce, childTabCntrllr); } + @Override + public ConditionAccessEditConfig getAccessEditConfig() { + return hasCustomPreConditions() ? ConditionAccessEditConfig.custom() : ConditionAccessEditConfig.regular(false); + } + @Override public NodeRunConstructionResult createNodeRunConstructionResult(UserRequest ureq, WindowControl wControl, final UserCourseEnvironment userCourseEnv, CourseNodeSecurityCallback nodeSecCallback, String nodecmd) { @@ -140,8 +146,8 @@ public class FOCourseNode extends AbstractAccessableCourseNode { if (nodecmd != null) { try { Long messageId = Long.valueOf(nodecmd); - BusinessControlFactory bcf = BusinessControlFactory.getInstance(); - BusinessControl businessControl = bcf.createFromString("[Message:"+messageId+"]"); + BusinessControlFactory bcf = BusinessControlFactory.getInstance(); + BusinessControl businessControl = bcf.createFromString("[Message:" + messageId + "]"); wControl = bcf.createBusinessWindowControl(businessControl, wControl); } catch (NumberFormatException e) { // ups, nodecmd is not a message, what the heck is it then? @@ -149,32 +155,54 @@ public class FOCourseNode extends AbstractAccessableCourseNode { } } - //for guests, check if posting is allowed + // for guests, check if posting is allowed boolean pseudonymPostAllowed = false; boolean defaultPseudonym = false; boolean guestPostAllowed = false; - if(roles.isGuestOnly()) { + if (roles.isGuestOnly()) { String config = getModuleConfiguration().getStringValue(CONFIG_GUEST_POST_ALLOWED); guestPostAllowed = "true".equals(config); } else { ForumModule forumModule = CoreSpringFactory.getImpl(ForumModule.class); String config = getModuleConfiguration().getStringValue(CONFIG_PSEUDONYM_POST_ALLOWED); pseudonymPostAllowed = forumModule.isAnonymousPostingWithPseudonymEnabled() && "true".equals(config); - if(pseudonymPostAllowed) { + if (pseudonymPostAllowed) { defaultPseudonym = getModuleConfiguration().getBooleanSafe(CONFIG_PSEUDONYM_POST_DEFAULT, forumModule.isPseudonymForMessageEnabledByDefault()); } } // Create subscription context and run controller - SubscriptionContext forumSubContext = CourseModule.createSubscriptionContext(userCourseEnv.getCourseEnvironment(), this); + SubscriptionContext forumSubContext = CourseModule + .createSubscriptionContext(userCourseEnv.getCourseEnvironment(), this); + boolean moderator = isModerator(userCourseEnv, nodeSecCallback.getNodeEvaluation()); + boolean poster = isPoster(userCourseEnv, nodeSecCallback.getNodeEvaluation()); ForumCallback foCallback = userCourseEnv.isCourseReadOnly() - ? new ReadOnlyForumCallback(nodeSecCallback.getNodeEvaluation(), isAdministrator, isGuestOnly) - : new ForumNodeForumCallback(nodeSecCallback.getNodeEvaluation(), isAdministrator, isGuestOnly, - guestPostAllowed, pseudonymPostAllowed, defaultPseudonym, forumSubContext); + ? new ReadOnlyForumCallback(moderator, isAdministrator, isGuestOnly) + : new ForumNodeForumCallback(poster, moderator, isAdministrator, isGuestOnly, guestPostAllowed, + pseudonymPostAllowed, defaultPseudonym, forumSubContext); FOCourseNodeRunController forumC = new FOCourseNodeRunController(ureq, wControl, theForum, foCallback, this); return new NodeRunConstructionResult(forumC); } + private boolean isModerator(UserCourseEnvironment userCourseEnv, NodeEvaluation ne) { + if (hasCustomPreConditions()) { + return ne != null? ne.isCapabilityAccessible("moderator"): false; + } else if (getModuleConfiguration().getBooleanSafe(CONFIG_COACH_MODERATE_ALLOWED) && userCourseEnv.isCoach()) { + return true; + } + return false; + } + + public boolean isPoster(UserCourseEnvironment userCourseEnv, NodeEvaluation ne) { + if (hasCustomPreConditions()) { + return ne != null ? ne.isCapabilityAccessible("poster") : false; + } else if ((getModuleConfiguration().getBooleanSafe(CONFIG_COACH_POST_ALLOWED) && userCourseEnv.isCoach()) + || (getModuleConfiguration().getBooleanSafe(CONFIG_PARTICIPANT_POST_ALLOWED) && userCourseEnv.isParticipant())) { + return true; + } + return false; + } + /** * Private helper method to load the forum from the configuration or create on * if it does not yet exist @@ -183,119 +211,135 @@ public class FOCourseNode extends AbstractAccessableCourseNode { * @return the loaded forum */ public Forum loadOrCreateForum(final CourseEnvironment courseEnv) { - updateModuleConfigDefaults(false); + updateModuleConfigDefaults(false); - Forum forum = null; - List<Property> forumKeyProps = courseEnv.getCoursePropertyManager() - .findCourseNodeProperties(this, null, null, CONFIG_FORUM_KEY); - if(forumKeyProps == null || forumKeyProps.isEmpty()) { + Forum forum = null; + List<Property> forumKeyProps = courseEnv.getCoursePropertyManager().findCourseNodeProperties(this, null, null, + CONFIG_FORUM_KEY); + if (forumKeyProps == null || forumKeyProps.isEmpty()) { forum = createForum(courseEnv); - } else if(forumKeyProps.size() == 1) { + } else if (forumKeyProps.size() == 1) { forum = loadForum(courseEnv, forumKeyProps.get(0)); } else if (forumKeyProps.size() > 1) { forum = saveMultiForums(courseEnv); } return forum; } - + private Forum saveMultiForums(final CourseEnvironment courseEnv) { final ForumManager fom = CoreSpringFactory.getImpl(ForumManager.class); - final OLATResourceable courseNodeResourceable = OresHelper.createOLATResourceableInstance(FOCourseNode.class, Long.valueOf(getIdent())); - return CoordinatorManager.getInstance().getCoordinator().getSyncer().doInSync(courseNodeResourceable, new SyncerCallback<Forum>(){ - @Override - public Forum execute() { - List<Property> forumKeyProps = courseEnv.getCoursePropertyManager() - .findCourseNodeProperties(FOCourseNode.this, null, null, CONFIG_FORUM_KEY); - Forum masterForum; - if(forumKeyProps.size() == 1) { - masterForum = loadForum(courseEnv, forumKeyProps.get(0)); - } else if(forumKeyProps.size() > 1) { - Long masterForumKey = forumKeyProps.get(0).getLongValue(); - List<Long> forumsToMerge = new ArrayList<>(); - for(int i=1; i<forumKeyProps.size(); i++) { - forumsToMerge.add(forumKeyProps.get(i).getLongValue()); - } - fom.mergeForums(masterForumKey, forumsToMerge); - masterForum = fom.loadForum(masterForumKey); - for(int i=1; i<forumKeyProps.size(); i++) { - courseEnv.getCoursePropertyManager().deleteProperty(forumKeyProps.get(i)); + final OLATResourceable courseNodeResourceable = OresHelper.createOLATResourceableInstance(FOCourseNode.class, + Long.valueOf(getIdent())); + return CoordinatorManager.getInstance().getCoordinator().getSyncer().doInSync(courseNodeResourceable, + new SyncerCallback<Forum>() { + @Override + public Forum execute() { + List<Property> forumKeyProps = courseEnv.getCoursePropertyManager() + .findCourseNodeProperties(FOCourseNode.this, null, null, CONFIG_FORUM_KEY); + Forum masterForum; + if (forumKeyProps.size() == 1) { + masterForum = loadForum(courseEnv, forumKeyProps.get(0)); + } else if (forumKeyProps.size() > 1) { + Long masterForumKey = forumKeyProps.get(0).getLongValue(); + List<Long> forumsToMerge = new ArrayList<>(); + for (int i = 1; i < forumKeyProps.size(); i++) { + forumsToMerge.add(forumKeyProps.get(i).getLongValue()); + } + fom.mergeForums(masterForumKey, forumsToMerge); + masterForum = fom.loadForum(masterForumKey); + for (int i = 1; i < forumKeyProps.size(); i++) { + courseEnv.getCoursePropertyManager().deleteProperty(forumKeyProps.get(i)); + } + } else { + masterForum = null; + } + return masterForum; } - } else { - masterForum = null; - } - return masterForum; - } - }); + }); } - + private Forum loadForum(CourseEnvironment courseEnv, Property prop) { final ForumManager fom = CoreSpringFactory.getImpl(ForumManager.class); Long forumKey = prop.getLongValue(); Forum forum = fom.loadForum(forumKey); if (forum == null) { - throw new OLATRuntimeException(FOCourseNode.class, "Tried to load forum with key " + forumKey.longValue() + " in course " - + courseEnv.getCourseResourceableId() + " for node " + getIdent() - + " as defined in course node property but forum manager could not load forum.", null); + throw new OLATRuntimeException(FOCourseNode.class, + "Tried to load forum with key " + forumKey.longValue() + " in course " + + courseEnv.getCourseResourceableId() + " for node " + getIdent() + + " as defined in course node property but forum manager could not load forum.", + null); } return forum; } - + private Forum createForum(final CourseEnvironment courseEnv) { final ForumManager fom = CoreSpringFactory.getImpl(ForumManager.class); - //creates resourceable from FOCourseNode.class and the current node id as key - OLATResourceable courseNodeResourceable = OresHelper.createOLATResourceableInstance(FOCourseNode.class, new Long(getIdent())); - //o_clusterOK by:ld - return CoordinatorManager.getInstance().getCoordinator().getSyncer().doInSync(courseNodeResourceable, new SyncerCallback<Forum>(){ - @Override - public Forum execute() { - Forum forum; - CoursePropertyManager cpm = courseEnv.getCoursePropertyManager(); - Property forumKeyProperty = cpm.findCourseNodeProperty(FOCourseNode.this, null, null, CONFIG_FORUM_KEY); - if (forumKeyProperty == null) { - // First call of forum, create new forum and save forum key as property - forum = fom.addAForum(); - Long forumKey = forum.getKey(); - forumKeyProperty = cpm.createCourseNodePropertyInstance(FOCourseNode.this, null, null, CONFIG_FORUM_KEY, null, forumKey, null, null); - cpm.saveProperty(forumKeyProperty); - } else { - // Forum does already exist, load forum with key from properties - Long forumKey = forumKeyProperty.getLongValue(); - forum = fom.loadForum(forumKey); - if (forum == null) { - throw new OLATRuntimeException(FOCourseNode.class, "Tried to load forum with key " + forumKey.longValue() + " in course " - + courseEnv.getCourseResourceableId() + " for node " + getIdent() - + " as defined in course node property but forum manager could not load forum.", null); + // creates resourceable from FOCourseNode.class and the current node id as key + OLATResourceable courseNodeResourceable = OresHelper.createOLATResourceableInstance(FOCourseNode.class, + new Long(getIdent())); + // o_clusterOK by:ld + return CoordinatorManager.getInstance().getCoordinator().getSyncer().doInSync(courseNodeResourceable, + new SyncerCallback<Forum>() { + @Override + public Forum execute() { + Forum forum; + CoursePropertyManager cpm = courseEnv.getCoursePropertyManager(); + Property forumKeyProperty = cpm.findCourseNodeProperty(FOCourseNode.this, null, null, + CONFIG_FORUM_KEY); + if (forumKeyProperty == null) { + // First call of forum, create new forum and save forum key as property + forum = fom.addAForum(); + Long forumKey = forum.getKey(); + forumKeyProperty = cpm.createCourseNodePropertyInstance(FOCourseNode.this, null, null, + CONFIG_FORUM_KEY, null, forumKey, null, null); + cpm.saveProperty(forumKeyProperty); + } else { + // Forum does already exist, load forum with key from properties + Long forumKey = forumKeyProperty.getLongValue(); + forum = fom.loadForum(forumKey); + if (forum == null) { + throw new OLATRuntimeException(FOCourseNode.class, "Tried to load forum with key " + + forumKey.longValue() + " in course " + courseEnv.getCourseResourceableId() + + " for node " + getIdent() + + " as defined in course node property but forum manager could not load forum.", + null); + } + } + return forum; } - } - return forum; - } - }); + }); } @Override public void calcAccessAndVisibility(ConditionInterpreter ci, NodeEvaluation nodeEval) { - // evaluate the preconditions - boolean reader = (getPreConditionReader().getConditionExpression() == null ? true : ci.evaluateCondition(getPreConditionReader())); - nodeEval.putAccessStatus("reader", reader); - boolean poster = (getPreConditionPoster().getConditionExpression() == null ? true : ci.evaluateCondition(getPreConditionPoster())); - nodeEval.putAccessStatus("poster", poster); - boolean moderator = (getPreConditionModerator().getConditionExpression() == null ? true : ci - .evaluateCondition(getPreConditionModerator())); - nodeEval.putAccessStatus("moderator", moderator); - - boolean visible = (getPreConditionVisibility().getConditionExpression() == null ? true : ci - .evaluateCondition(getPreConditionVisibility())); - nodeEval.setVisible(visible); + if (hasCustomPreConditions()) { + boolean reader = (getPreConditionReader().getConditionExpression() == null ? true + : ci.evaluateCondition(getPreConditionReader())); + nodeEval.putAccessStatus("reader", reader); + boolean poster = (getPreConditionPoster().getConditionExpression() == null ? true + : ci.evaluateCondition(getPreConditionPoster())); + nodeEval.putAccessStatus("poster", poster); + boolean moderator = (getPreConditionModerator().getConditionExpression() == null ? true + : ci.evaluateCondition(getPreConditionModerator())); + nodeEval.putAccessStatus("moderator", moderator); + + boolean visible = (getPreConditionVisibility().getConditionExpression() == null ? true + : ci.evaluateCondition(getPreConditionVisibility())); + nodeEval.setVisible(visible); + } else { + super.calcAccessAndVisibility(ci, nodeEval); + } } @Override - public Controller createPreviewController(UserRequest ureq, WindowControl wControl, UserCourseEnvironment userCourseEnv, CourseNodeSecurityCallback nodeSecCallback) { + public Controller createPreviewController(UserRequest ureq, WindowControl wControl, + UserCourseEnvironment userCourseEnv, CourseNodeSecurityCallback nodeSecCallback) { return new FOPreviewController(ureq, wControl, nodeSecCallback.getNodeEvaluation()); } @Override - public Controller createPeekViewRunController(UserRequest ureq, WindowControl wControl, UserCourseEnvironment userCourseEnv, - CourseNodeSecurityCallback nodeSecCallback) { + public Controller createPeekViewRunController(UserRequest ureq, WindowControl wControl, + UserCourseEnvironment userCourseEnv, CourseNodeSecurityCallback nodeSecCallback) { if (nodeSecCallback.isAccessible()) { // Create a forum peekview controller that shows the latest two messages Forum theForum = loadOrCreateForum(userCourseEnv.getCourseEnvironment()); @@ -307,8 +351,17 @@ public class FOCourseNode extends AbstractAccessableCourseNode { } /** - * @return Returns the preConditionModerator. + * The conditions to control the user rights are deprecated. In new course nodes + * this options are controlled by module configurations. Existing course nodes + * may have preconditions. In that case they are still used for compatibility + * reasons. + * + * @return */ + public boolean hasCustomPreConditions() { + return preConditionModerator != null || preConditionPoster != null || preConditionReader != null; + } + public Condition getPreConditionModerator() { if (preConditionModerator == null) { preConditionModerator = new Condition(); @@ -317,9 +370,6 @@ public class FOCourseNode extends AbstractAccessableCourseNode { return preConditionModerator; } - /** - * @param preConditionModerator The preConditionModerator to set. - */ public void setPreConditionModerator(Condition preConditionModerator) { if (preConditionModerator == null) { preConditionModerator = getPreConditionModerator(); @@ -328,9 +378,6 @@ public class FOCourseNode extends AbstractAccessableCourseNode { this.preConditionModerator = preConditionModerator; } - /** - * @return Returns the preConditionPoster. - */ public Condition getPreConditionPoster() { if (preConditionPoster == null) { preConditionPoster = new Condition(); @@ -339,9 +386,6 @@ public class FOCourseNode extends AbstractAccessableCourseNode { return preConditionPoster; } - /** - * @param preConditionPoster The preConditionPoster to set. - */ public void setPreConditionPoster(Condition preConditionPoster) { if (preConditionPoster == null) { preConditionPoster = getPreConditionPoster(); @@ -350,9 +394,6 @@ public class FOCourseNode extends AbstractAccessableCourseNode { this.preConditionPoster = preConditionPoster; } - /** - * @return Returns the preConditionReader. - */ public Condition getPreConditionReader() { if (preConditionReader == null) { preConditionReader = new Condition(); @@ -361,9 +402,6 @@ public class FOCourseNode extends AbstractAccessableCourseNode { return preConditionReader; } - /** - * @param preConditionReader The preConditionReader to set. - */ public void setPreConditionReader(Condition preConditionReader) { if (preConditionReader == null) { preConditionReader = getPreConditionReader(); @@ -374,22 +412,23 @@ public class FOCourseNode extends AbstractAccessableCourseNode { @Override public StatusDescription isConfigValid() { - if(oneClickStatusCache!=null) { + if (oneClickStatusCache != null) { return oneClickStatusCache[0]; } - + return StatusDescription.NOERROR; } @Override public StatusDescription[] isConfigValid(CourseEditorEnv cev) { oneClickStatusCache = null; - //only here we know which translator to take for translating condition error messages + // only here we know which translator to take for translating condition error + // messages List<StatusDescription> sds = isConfigValidWithTranslator(cev, PACKAGE_FO, getConditionExpressions()); oneClickStatusCache = StatusDescriptionHelper.sort(sds); return oneClickStatusCache; } - + @Override public RepositoryEntry getReferencedRepositoryEntry() { return null; @@ -401,22 +440,22 @@ public class FOCourseNode extends AbstractAccessableCourseNode { } @Override - public boolean archiveNodeData(Locale locale, ICourse course, ArchiveOptions options, - ZipOutputStream exportStream, String archivePath, String charset) { + public boolean archiveNodeData(Locale locale, ICourse course, ArchiveOptions options, ZipOutputStream exportStream, + String archivePath, String charset) { CoursePropertyManager cpm = course.getCourseEnvironment().getCoursePropertyManager(); Property forumKeyProperty = cpm.findCourseNodeProperty(this, null, null, CONFIG_FORUM_KEY); - if(forumKeyProperty == null) { + if (forumKeyProperty == null) { return false; } Long forumKey = forumKeyProperty.getLongValue(); - if(CoreSpringFactory.getImpl(ForumManager.class).countThreadsByForumID(forumKey) <= 0) { + if (CoreSpringFactory.getImpl(ForumManager.class).countThreadsByForumID(forumKey) <= 0) { return false; } - - String forumName = "forum_" + Formatter.makeStringFilesystemSave(getShortTitle()) - + "_" + Formatter.formatDatetimeFilesystemSave(new Date(System.currentTimeMillis())); + + String forumName = "forum_" + Formatter.makeStringFilesystemSave(getShortTitle()) + "_" + + Formatter.formatDatetimeFilesystemSave(new Date(System.currentTimeMillis())); forumName = ZipUtil.concat(archivePath, forumName); - ForumStreamedRTFFormatter rtff = new ForumStreamedRTFFormatter(exportStream, forumName, false, locale); + ForumStreamedRTFFormatter rtff = new ForumStreamedRTFFormatter(exportStream, forumName, false, locale); CoreSpringFactory.getImpl(ForumArchiveManager.class).applyFormatter(rtff, forumKey, null); return true; } @@ -425,16 +464,18 @@ public class FOCourseNode extends AbstractAccessableCourseNode { public String informOnDelete(Locale locale, ICourse course) { CoursePropertyManager cpm = PersistingCoursePropertyManager.getInstance(course); Property forumKeyProperty = cpm.findCourseNodeProperty(this, null, null, CONFIG_FORUM_KEY); - if (forumKeyProperty == null) return null; // no forum created yet + if (forumKeyProperty == null) + return null; // no forum created yet return new PackageTranslator(PACKAGE_FO, locale).translate("warn.forumdelete"); } @Override public void cleanupOnDelete(ICourse course) { super.cleanupOnDelete(course); - + // mark the subscription to this node as deleted - SubscriptionContext forumSubContext = CourseModule.createTechnicalSubscriptionContext(course.getCourseEnvironment(), this); + SubscriptionContext forumSubContext = CourseModule + .createTechnicalSubscriptionContext(course.getCourseEnvironment(), this); NotificationsManager.getInstance().delete(forumSubContext); // delete the forum, if there is one (is created on demand only) @@ -448,25 +489,24 @@ public class FOCourseNode extends AbstractAccessableCourseNode { } /** - * Update the module configuration to have all mandatory configuration flags - * set to usefull default values + * Update the module configuration to have all mandatory configuration flags set + * to usefull default values * - * @param isNewNode true: an initial configuration is set; false: upgrading - * from previous node configuration version, set default to maintain - * previous behaviour + * @param isNewNode true: an initial configuration is set; false: upgrading from + * previous node configuration version, set default to maintain + * previous behaviour */ @Override public void updateModuleConfigDefaults(boolean isNewNode) { ModuleConfiguration config = getModuleConfiguration(); int version = config.getConfigurationVersion(); - - if(isNewNode) { + + if (isNewNode) { ForumModule forumModule = CoreSpringFactory.getImpl(ForumModule.class); boolean pseudonymAllowed = forumModule.isAnonymousPostingWithPseudonymEnabled() && forumModule.isPseudonymForCourseEnabledByDefault(); config.setStringValue(CONFIG_PSEUDONYM_POST_ALLOWED, pseudonymAllowed ? "true" : "false"); - boolean pseudonymDefault = pseudonymAllowed - && forumModule.isPseudonymForMessageEnabledByDefault(); + boolean pseudonymDefault = pseudonymAllowed && forumModule.isPseudonymForMessageEnabledByDefault(); config.setStringValue(CONFIG_PSEUDONYM_POST_DEFAULT, pseudonymDefault ? "true" : "false"); config.setStringValue(CONFIG_GUEST_POST_ALLOWED, "false"); } @@ -474,22 +514,51 @@ public class FOCourseNode extends AbstractAccessableCourseNode { config.setBooleanEntry(NodeEditController.CONFIG_STARTPAGE, Boolean.FALSE.booleanValue()); } if (version < 3) { - if(config.getStringValue(CONFIG_PSEUDONYM_POST_ALLOWED) == null) { - config.setStringValue(CONFIG_PSEUDONYM_POST_ALLOWED, "false"); + if (config.getStringValue(CONFIG_PSEUDONYM_POST_ALLOWED) == null) { + config.setStringValue(CONFIG_PSEUDONYM_POST_ALLOWED, "false"); } - if(config.getStringValue(CONFIG_GUEST_POST_ALLOWED) == null) { + if (config.getStringValue(CONFIG_GUEST_POST_ALLOWED) == null) { config.setStringValue(CONFIG_GUEST_POST_ALLOWED, "false"); } } if (version < 4) { - + config.setBooleanEntry(CONFIG_COACH_MODERATE_ALLOWED, true); + config.setBooleanEntry(CONFIG_COACH_POST_ALLOWED, true); + config.setBooleanEntry(CONFIG_PARTICIPANT_POST_ALLOWED, true); + removeDefaultPreconditions(); } - // else node is up-to-date - nothing to do + + // Clean up config.remove(NodeEditController.CONFIG_INTEGRATION); - + config.setConfigurationVersion(CURRENT_VERSION); } - + + /** + * We don't want to have custom preConditions. So we keep these preConditions + * only, if they have some special configs. Otherwise we delete them and use the + * regular configs. + */ + private void removeDefaultPreconditions() { + if (hasCustomPreConditions()) { + boolean defaultPreconditions = !preConditionModerator.isExpertMode() + && preConditionModerator.isEasyModeCoachesAndAdmins() + && !preConditionModerator.isEasyModeAlwaysAllowCoachesAndAdmins() + && !preConditionModerator.isAssessmentMode() && !preConditionModerator.isAssessmentModeViewResults() + && !preConditionPoster.isExpertMode() && !preConditionPoster.isEasyModeCoachesAndAdmins() + && !preConditionPoster.isEasyModeAlwaysAllowCoachesAndAdmins() + && !preConditionPoster.isAssessmentMode() && !preConditionPoster.isAssessmentModeViewResults() + && !preConditionReader.isExpertMode() && !preConditionReader.isEasyModeCoachesAndAdmins() + && !preConditionReader.isEasyModeAlwaysAllowCoachesAndAdmins() + && !preConditionReader.isAssessmentMode() && !preConditionReader.isAssessmentModeViewResults(); + if (defaultPreconditions) { + preConditionModerator = null; + preConditionPoster = null; + preConditionReader = null; + } + } + } + @Override protected void postImportCopyConditions(CourseEnvironmentMapper envMapper) { super.postImportCopyConditions(envMapper); @@ -508,48 +577,51 @@ public class FOCourseNode extends AbstractAccessableCourseNode { @Override public List<ConditionExpression> getConditionExpressions() { - List<ConditionExpression> retVal; - List<ConditionExpression> parentsConditions = super.getConditionExpressions(); - if (!parentsConditions.isEmpty()) { - retVal = new ArrayList<>(parentsConditions); - }else { - retVal = new ArrayList<>(); - } - // - String coS = getPreConditionModerator().getConditionExpression(); - if (coS != null && !coS.equals("")) { - // an active condition is defined - ConditionExpression ce = new ConditionExpression(getPreConditionModerator().getConditionId()); - ce.setExpressionString(getPreConditionModerator().getConditionExpression()); - retVal.add(ce); - } - coS = getPreConditionPoster().getConditionExpression(); - if (coS != null && !coS.equals("")) { - // an active condition is defined - ConditionExpression ce = new ConditionExpression(getPreConditionPoster().getConditionId()); - ce.setExpressionString(getPreConditionPoster().getConditionExpression()); - retVal.add(ce); - } - coS = getPreConditionReader().getConditionExpression(); - if (coS != null && !coS.equals("")) { - // an active condition is defined - ConditionExpression ce = new ConditionExpression(getPreConditionReader().getConditionId()); - ce.setExpressionString(getPreConditionReader().getConditionExpression()); - retVal.add(ce); + if (hasCustomPreConditions()) { + List<ConditionExpression> retVal; + List<ConditionExpression> parentsConditions = super.getConditionExpressions(); + if (!parentsConditions.isEmpty()) { + retVal = new ArrayList<>(parentsConditions); + } else { + retVal = new ArrayList<>(); + } + // + String coS = getPreConditionModerator().getConditionExpression(); + if (coS != null && !coS.equals("")) { + // an active condition is defined + ConditionExpression ce = new ConditionExpression(getPreConditionModerator().getConditionId()); + ce.setExpressionString(getPreConditionModerator().getConditionExpression()); + retVal.add(ce); + } + coS = getPreConditionPoster().getConditionExpression(); + if (coS != null && !coS.equals("")) { + // an active condition is defined + ConditionExpression ce = new ConditionExpression(getPreConditionPoster().getConditionId()); + ce.setExpressionString(getPreConditionPoster().getConditionExpression()); + retVal.add(ce); + } + coS = getPreConditionReader().getConditionExpression(); + if (coS != null && !coS.equals("")) { + // an active condition is defined + ConditionExpression ce = new ConditionExpression(getPreConditionReader().getConditionId()); + ce.setExpressionString(getPreConditionReader().getConditionExpression()); + retVal.add(ce); + } + return retVal; } - // - return retVal; + + return super.getConditionExpressions(); } } class ReadOnlyForumCallback implements ForumCallback { - private final boolean isGuestOnly; + private final boolean isModerator; private final boolean isOlatAdmin; - private final NodeEvaluation ne; - - public ReadOnlyForumCallback(NodeEvaluation ne, boolean isOlatAdmin, boolean isGuestOnly) { - this.ne = ne; + private final boolean isGuestOnly; + + public ReadOnlyForumCallback(boolean isModerator, boolean isOlatAdmin, boolean isGuestOnly) { + this.isModerator = isModerator; this.isOlatAdmin = isOlatAdmin; this.isGuestOnly = isGuestOnly; } @@ -568,7 +640,7 @@ class ReadOnlyForumCallback implements ForumCallback { public boolean mayReplyMessage() { return false; } - + @Override public boolean mayEditOwnMessage() { return false; @@ -596,8 +668,9 @@ class ReadOnlyForumCallback implements ForumCallback { @Override public boolean mayFilterForUser() { - if (isGuestOnly) return false; - return ne.isCapabilityAccessible("moderator") || isOlatAdmin; + if (isGuestOnly) + return false; + return isModerator || isOlatAdmin; } @Override @@ -608,7 +681,8 @@ class ReadOnlyForumCallback implements ForumCallback { class ForumNodeForumCallback implements ForumCallback { - private final NodeEvaluation ne; + private final boolean isPoster; + private final boolean isModerator; private final boolean isOlatAdmin; private final boolean isGuestOnly; private final boolean guestPostAllowed; @@ -616,16 +690,11 @@ class ForumNodeForumCallback implements ForumCallback { private final boolean anonymousPostDefault; private final SubscriptionContext subscriptionContext; - /** - * @param ne the nodeevaluation for this coursenode - * @param isOlatAdmin true if the user is olat-admin - * @param isGuestOnly true if the user is olat-guest - * @param subscriptionContext - */ - public ForumNodeForumCallback(NodeEvaluation ne, boolean isOlatAdmin, boolean isGuestOnly, + public ForumNodeForumCallback(boolean isPoster, boolean isModerator, boolean isOlatAdmin, boolean isGuestOnly, boolean guestPostAllowed, boolean anonymousPostAllowed, boolean anonymousPostDefault, SubscriptionContext subscriptionContext) { - this.ne = ne; + this.isPoster = isPoster; + this.isModerator = isModerator; this.isOlatAdmin = isOlatAdmin; this.isGuestOnly = isGuestOnly; this.guestPostAllowed = guestPostAllowed; @@ -636,7 +705,8 @@ class ForumNodeForumCallback implements ForumCallback { @Override public boolean mayUsePseudonym() { - if (isGuestOnly) return false; + if (isGuestOnly) + return false; return anonymousPostAllowed; } @@ -647,38 +717,44 @@ class ForumNodeForumCallback implements ForumCallback { @Override public boolean mayOpenNewThread() { - if (isGuestOnly && !guestPostAllowed) return false; - return ne.isCapabilityAccessible("poster") || ne.isCapabilityAccessible("moderator") || isOlatAdmin; + if (isGuestOnly && !guestPostAllowed) + return false; + return isPoster || isModerator || isOlatAdmin; } @Override public boolean mayReplyMessage() { - if (isGuestOnly && !guestPostAllowed) return false; - return ne.isCapabilityAccessible("poster") || ne.isCapabilityAccessible("moderator") || isOlatAdmin; + if (isGuestOnly && !guestPostAllowed) + return false; + return isPoster || isModerator || isOlatAdmin; } - + @Override public boolean mayEditOwnMessage() { - if (isGuestOnly && !guestPostAllowed) return false; + if (isGuestOnly && !guestPostAllowed) + return false; return true; } @Override public boolean mayDeleteOwnMessage() { - if (isGuestOnly && !guestPostAllowed) return false; + if (isGuestOnly && !guestPostAllowed) + return false; return true; } @Override public boolean mayEditMessageAsModerator() { - if (isGuestOnly) return false; - return ne.isCapabilityAccessible("moderator") || isOlatAdmin; + if (isGuestOnly) + return false; + return isModerator || isOlatAdmin; } @Override public boolean mayDeleteMessageAsModerator() { - if (isGuestOnly) return false; - return ne.isCapabilityAccessible("moderator") || isOlatAdmin; + if (isGuestOnly) + return false; + return isModerator || isOlatAdmin; } @Override @@ -688,8 +764,9 @@ class ForumNodeForumCallback implements ForumCallback { @Override public boolean mayFilterForUser() { - if (isGuestOnly) return false; - return ne.isCapabilityAccessible("moderator") || isOlatAdmin; + if (isGuestOnly) + return false; + return isModerator|| isOlatAdmin; } @Override diff --git a/src/main/java/org/olat/course/nodes/fo/FOConfigController.java b/src/main/java/org/olat/course/nodes/fo/FOConfigController.java new file mode 100644 index 0000000000000000000000000000000000000000..cb600f11cf499a7b3842446c2b2eb0eebd50a118 --- /dev/null +++ b/src/main/java/org/olat/course/nodes/fo/FOConfigController.java @@ -0,0 +1,195 @@ +/** + * <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.fo; + +import static org.olat.core.gui.translator.TranslatorHelper.translateAll; + +import java.util.Collection; + +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.MultipleSelectionElement; +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.FormLayoutContainer; +import org.olat.core.gui.control.Controller; +import org.olat.core.gui.control.WindowControl; +import org.olat.course.editor.NodeEditController; +import org.olat.course.nodes.FOCourseNode; +import org.olat.modules.ModuleConfiguration; +import org.olat.modules.fo.ForumModule; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * + * Initial date: 10.11.2015<br> + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + * + */ +public class FOConfigController extends FormBasicController { + + private static final String[] allowKeys = new String[] { "on" }; + private static final String MODERATOR_COACH = "edit.moderator.coach"; + private static final String[] MODERATOR_KEYS = new String[] { MODERATOR_COACH }; + private static final String POSTER_COACH = "edit.poster.coach"; + private static final String POSTER_PARTICIPANT = "edit.poster.participant"; + private static final String POSTER_GUEST = "edit.poster.guest"; + private static final String[] POSTER_KEYS = new String[] { + POSTER_COACH, + POSTER_PARTICIPANT, + POSTER_GUEST + }; + + private MultipleSelectionElement allowPseudonymEl; + private MultipleSelectionElement pseudonymAsDefaultEl; + private MultipleSelectionElement allowGuestEl; + private MultipleSelectionElement moderatorRolesEl; + private MultipleSelectionElement posterRolesEl; + + private final FOCourseNode foNode; + private final ModuleConfiguration moduleConfig; + + @Autowired + private ForumModule forumModule; + + public FOConfigController(UserRequest ureq, WindowControl wControl, FOCourseNode foNode) { + super(ureq, wControl, LAYOUT_VERTICAL); + this.foNode = foNode; + this.moduleConfig = foNode.getModuleConfiguration(); + initForm(ureq); + updateUI(); + } + + @Override + protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) { + setFormContextHelp("Communication and Collaboration#_forumkonfig"); + formLayout.setElementCssClass("o_sel_course_forum_settings"); + + if(forumModule.isAnonymousPostingWithPseudonymEnabled()) { + FormLayoutContainer anonymousCont = FormLayoutContainer.createDefaultFormLayout("anonymous", getTranslator()); + formLayout.add(anonymousCont); + anonymousCont.setFormTitle(translate("anonymous.title")); + + allowPseudonymEl = uifactory.addCheckboxesHorizontal("allow.pseudonym.post", anonymousCont, allowKeys, + translateAll(getTranslator(), allowKeys)); + allowPseudonymEl.setElementCssClass("o_sel_course_forum_allow_pseudo"); + allowPseudonymEl.addActionListener(FormEvent.ONCHANGE); + if ("true".equals(moduleConfig.getStringValue(FOCourseNode.CONFIG_PSEUDONYM_POST_ALLOWED))) { + allowPseudonymEl.select(allowKeys[0], true); + } + + pseudonymAsDefaultEl = uifactory.addCheckboxesHorizontal("pseudonym.default", anonymousCont, allowKeys, + translateAll(getTranslator(), allowKeys)); + pseudonymAsDefaultEl.setElementCssClass("o_sel_course_forum_pseudo_default"); + pseudonymAsDefaultEl.addActionListener(FormEvent.ONCHANGE); + + boolean defaultPseudonym = moduleConfig.getBooleanSafe(FOCourseNode.CONFIG_PSEUDONYM_POST_DEFAULT, + forumModule.isPseudonymForMessageEnabledByDefault()); + if (defaultPseudonym) { + pseudonymAsDefaultEl.select(allowKeys[0], true); + } + } + + FormLayoutContainer rightsCont = FormLayoutContainer.createDefaultFormLayout("rights", getTranslator()); + formLayout.add(rightsCont); + rightsCont.setFormTitle(translate("user.rights")); + + if (foNode.hasCustomPreConditions()) { + allowGuestEl = uifactory.addCheckboxesHorizontal("allow.guest.post", rightsCont, allowKeys, + translateAll(getTranslator(), allowKeys)); + allowGuestEl.setElementCssClass("o_sel_course_forum_allow_guest"); + allowGuestEl.addActionListener(FormEvent.ONCHANGE); + if ("true".equals(moduleConfig.getStringValue(FOCourseNode.CONFIG_GUEST_POST_ALLOWED))) { + allowGuestEl.select(allowKeys[0], true); + } + } else { + moderatorRolesEl = uifactory.addCheckboxesVertical("edit.moderator", rightsCont, MODERATOR_KEYS, + translateAll(getTranslator(), MODERATOR_KEYS), 1); + moderatorRolesEl.select(MODERATOR_COACH, moduleConfig.getBooleanSafe(FOCourseNode.CONFIG_COACH_MODERATE_ALLOWED)); + moderatorRolesEl.addActionListener(FormEvent.ONCHANGE); + + posterRolesEl = uifactory.addCheckboxesVertical("edit.poster", rightsCont, POSTER_KEYS, + translateAll(getTranslator(), POSTER_KEYS), 1); + posterRolesEl.select(POSTER_COACH, moduleConfig.getBooleanSafe(FOCourseNode.CONFIG_COACH_POST_ALLOWED)); + posterRolesEl.select(POSTER_PARTICIPANT, + moduleConfig.getBooleanSafe(FOCourseNode.CONFIG_PARTICIPANT_POST_ALLOWED)); + posterRolesEl.select(POSTER_GUEST, moduleConfig.getBooleanSafe(FOCourseNode.CONFIG_GUEST_POST_ALLOWED)); + posterRolesEl.addActionListener(FormEvent.ONCHANGE); + } + } + + private void updateUI() { + if(pseudonymAsDefaultEl != null && allowPseudonymEl != null) { + boolean isPseudonymPostAllowed = allowPseudonymEl.isAtLeastSelected(1); + pseudonymAsDefaultEl.setVisible(isPseudonymPostAllowed); + } + } + + @Override + protected void formInnerEvent(UserRequest ureq, FormItem source, FormEvent event) { + if(allowPseudonymEl == source || pseudonymAsDefaultEl == source) { + doUpdatePseudonym(ureq); + updateUI(); + } else if(allowGuestEl == source) { + doUpdatePosterGuest(ureq); + } else if (source == moderatorRolesEl) { + doUpdateModeratorRoles(ureq); + } else if (source == posterRolesEl) { + doUpdatePosterRoles(ureq); + } + super.formInnerEvent(ureq, source, event); + } + + private void doUpdatePseudonym(UserRequest ureq) { + moduleConfig.setBooleanEntry(FOCourseNode.CONFIG_PSEUDONYM_POST_ALLOWED, allowPseudonymEl.isAtLeastSelected(1)); + moduleConfig.setBooleanEntry(FOCourseNode.CONFIG_PSEUDONYM_POST_DEFAULT, pseudonymAsDefaultEl.isAtLeastSelected(1)); + fireEvent(ureq, NodeEditController.NODECONFIG_CHANGED_EVENT); + } + + private void doUpdatePosterGuest(UserRequest ureq) { + moduleConfig.setBooleanEntry(FOCourseNode.CONFIG_GUEST_POST_ALLOWED, allowGuestEl.isAtLeastSelected(1)); + fireEvent(ureq, NodeEditController.NODECONFIG_CHANGED_EVENT); + } + + private void doUpdateModeratorRoles(UserRequest ureq) { + Collection<String> selectedKeys = moderatorRolesEl.getSelectedKeys(); + moduleConfig.setBooleanEntry(FOCourseNode.CONFIG_COACH_MODERATE_ALLOWED, selectedKeys.contains(MODERATOR_COACH)); + fireEvent(ureq, NodeEditController.NODECONFIG_CHANGED_EVENT); + } + + private void doUpdatePosterRoles(UserRequest ureq) { + Collection<String> selectedKeys = posterRolesEl.getSelectedKeys(); + moduleConfig.setBooleanEntry(FOCourseNode.CONFIG_COACH_POST_ALLOWED, selectedKeys.contains(POSTER_COACH)); + moduleConfig.setBooleanEntry(FOCourseNode.CONFIG_PARTICIPANT_POST_ALLOWED, selectedKeys.contains(POSTER_PARTICIPANT)); + moduleConfig.setBooleanEntry(FOCourseNode.CONFIG_GUEST_POST_ALLOWED, selectedKeys.contains(POSTER_GUEST)); + fireEvent(ureq, NodeEditController.NODECONFIG_CHANGED_EVENT); + } + + @Override + protected void formOK(UserRequest ureq) { + // + } + + @Override + protected void doDispose() { + // + } +} \ No newline at end of file diff --git a/src/main/java/org/olat/course/nodes/fo/FOCourseNodeEditController.java b/src/main/java/org/olat/course/nodes/fo/FOCourseNodeEditController.java index cde2397cf23008fc0bc1092a5577375493e491b4..2ebe6eaf2445e3b9d633b6360bf91c953c5055b0 100644 --- a/src/main/java/org/olat/course/nodes/fo/FOCourseNodeEditController.java +++ b/src/main/java/org/olat/course/nodes/fo/FOCourseNodeEditController.java @@ -52,48 +52,51 @@ import org.olat.course.tree.CourseEditorTreeModel; public class FOCourseNodeEditController extends ActivateableTabbableDefaultController implements ControllerEventListener { private static final String PANE_TAB_ACCESSIBILITY = "pane.tab.accessibility"; - private static final String PANE_TAB_SETTINGS = "pane.tab.settings"; - private static final String[] paneKeys = { PANE_TAB_ACCESSIBILITY, PANE_TAB_SETTINGS }; + private static final String PANE_TAB_CONFIG = "pane.tab.config"; + private static final String[] paneKeys = { PANE_TAB_ACCESSIBILITY, PANE_TAB_CONFIG }; - private final FOCourseNode foNode; - private final VelocityContainer myContent; - - private SettingsController settingsCtrl; - private final ConditionEditController readerCondContr, posterCondContr, moderatorCondContr; private TabbedPane myTabbedPane; + private VelocityContainer accessibilityContent; + + private FOConfigController configCtrl; + private ConditionEditController readerCondContr, posterCondContr, moderatorCondContr; + + private final FOCourseNode foNode; public FOCourseNodeEditController(UserRequest ureq, WindowControl wControl, FOCourseNode forumNode, ICourse course, UserCourseEnvironment euce) { super(ureq, wControl); this.foNode = forumNode; - myContent = createVelocityContainer("edit"); - - CourseEditorTreeModel editorModel = course.getEditorTreeModel(); - // Reader precondition - Condition readerCondition = foNode.getPreConditionReader(); - readerCondContr = new ConditionEditController(ureq, getWindowControl(), euce, readerCondition, - AssessmentHelper.getAssessableNodes(editorModel, forumNode)); - listenTo(readerCondContr); - myContent.put("readerCondition", readerCondContr.getInitialComponent()); - - // Poster precondition - Condition posterCondition = foNode.getPreConditionPoster(); - posterCondContr = new ConditionEditController(ureq, getWindowControl(), euce, posterCondition, - AssessmentHelper.getAssessableNodes(editorModel, forumNode)); - listenTo(posterCondContr); - myContent.put("posterCondition", posterCondContr.getInitialComponent()); - - // Moderator precondition - Condition moderatorCondition = foNode.getPreConditionModerator(); - moderatorCondContr = new ConditionEditController(ureq, getWindowControl(), euce, moderatorCondition, - AssessmentHelper.getAssessableNodes(editorModel, forumNode)); - listenTo(moderatorCondContr); - myContent.put("moderatorCondition", moderatorCondContr.getInitialComponent()); + if (forumNode.hasCustomPreConditions()) { + accessibilityContent = createVelocityContainer("edit"); + CourseEditorTreeModel editorModel = course.getEditorTreeModel(); + + // Reader precondition + Condition readerCondition = foNode.getPreConditionReader(); + readerCondContr = new ConditionEditController(ureq, getWindowControl(), euce, readerCondition, + AssessmentHelper.getAssessableNodes(editorModel, forumNode)); + listenTo(readerCondContr); + accessibilityContent.put("readerCondition", readerCondContr.getInitialComponent()); + + // Poster precondition + Condition posterCondition = foNode.getPreConditionPoster(); + posterCondContr = new ConditionEditController(ureq, getWindowControl(), euce, posterCondition, + AssessmentHelper.getAssessableNodes(editorModel, forumNode)); + listenTo(posterCondContr); + accessibilityContent.put("posterCondition", posterCondContr.getInitialComponent()); + + // Moderator precondition + Condition moderatorCondition = foNode.getPreConditionModerator(); + moderatorCondContr = new ConditionEditController(ureq, getWindowControl(), euce, moderatorCondition, + AssessmentHelper.getAssessableNodes(editorModel, forumNode)); + listenTo(moderatorCondContr); + accessibilityContent.put("moderatorCondition", moderatorCondContr.getInitialComponent()); + } //Settings - settingsCtrl = new SettingsController(ureq, getWindowControl(), forumNode); - listenTo(settingsCtrl); + configCtrl = new FOConfigController(ureq, getWindowControl(), forumNode); + listenTo(configCtrl); } @Override @@ -121,25 +124,19 @@ public class FOCourseNodeEditController extends ActivateableTabbableDefaultContr foNode.setPreConditionModerator(cond); fireEvent(urequest, NodeEditController.NODECONFIG_CHANGED_EVENT); } - } else if (source == settingsCtrl) { - if (event == Event.CHANGED_EVENT) { - String pseudoAllowed = settingsCtrl.isPseudonymPostAllowed() ? "true" : "false"; - foNode.getModuleConfiguration().setStringValue(FOCourseNode.CONFIG_PSEUDONYM_POST_ALLOWED, pseudoAllowed); - String defaultPseudo = settingsCtrl.isDefaultPseudonym() ? "true" : "false"; - foNode.getModuleConfiguration().setStringValue(FOCourseNode.CONFIG_PSEUDONYM_POST_DEFAULT, defaultPseudo); - String guestAllowed = settingsCtrl.isGuestPostAllowed() ? "true" : "false"; - foNode.getModuleConfiguration().setStringValue(FOCourseNode.CONFIG_GUEST_POST_ALLOWED, guestAllowed); - fireEvent(urequest, NodeEditController.NODECONFIG_CHANGED_EVENT); - } + } else if (source == configCtrl) { + fireEvent(urequest, event); } } @Override public void addTabs(TabbedPane tabbedPane) { myTabbedPane = tabbedPane; - tabbedPane.addTab(translate(PANE_TAB_ACCESSIBILITY), myContent); - if(settingsCtrl != null) { - tabbedPane.addTab(translate(PANE_TAB_SETTINGS), settingsCtrl.getInitialComponent()); + if (accessibilityContent != null) { + tabbedPane.addTab(translate(PANE_TAB_ACCESSIBILITY), accessibilityContent); + } + if(configCtrl != null) { + tabbedPane.addTab(translate(PANE_TAB_CONFIG), configCtrl.getInitialComponent()); } } diff --git a/src/main/java/org/olat/course/nodes/fo/SettingsController.java b/src/main/java/org/olat/course/nodes/fo/SettingsController.java deleted file mode 100644 index 6cd8e4bdc2334e7014998d73f87fbeef5e79de40..0000000000000000000000000000000000000000 --- a/src/main/java/org/olat/course/nodes/fo/SettingsController.java +++ /dev/null @@ -1,140 +0,0 @@ -/** - * <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.fo; - -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.MultipleSelectionElement; -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.control.Controller; -import org.olat.core.gui.control.Event; -import org.olat.core.gui.control.WindowControl; -import org.olat.course.nodes.FOCourseNode; -import org.olat.modules.fo.ForumModule; -import org.springframework.beans.factory.annotation.Autowired; - -/** - * - * Initial date: 10.11.2015<br> - * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com - * - */ -public class SettingsController extends FormBasicController { - - private static final String[] allowKeys = new String[] { "on" }; - - private MultipleSelectionElement allowPseudonymEl, pseudonymAsDefaultEl, allowGuestEl; - - private final FOCourseNode foNode; - - @Autowired - private ForumModule forumModule; - - public SettingsController(UserRequest ureq, WindowControl wControl, FOCourseNode foNode) { - super(ureq, wControl, LAYOUT_VERTICAL); - this.foNode = foNode; - initForm(ureq); - updateUI(); - } - - @Override - protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) { - setFormTitle("settings.title"); - setFormContextHelp("Communication and Collaboration#_forumkonfig"); - formLayout.setElementCssClass("o_sel_course_forum_settings"); - - if(forumModule.isAnonymousPostingWithPseudonymEnabled()) { - String[] allowPseudonymValues = new String[] { translate("allow.pseudonym.post") }; - allowPseudonymEl = uifactory.addCheckboxesHorizontal("allow.pseudonym", null, formLayout, - allowKeys, allowPseudonymValues); - allowPseudonymEl.setElementCssClass("o_sel_course_forum_allow_pseudo"); - allowPseudonymEl.setLabel(null, null); - allowPseudonymEl.addActionListener(FormEvent.ONCHANGE); - - if("true".equals(foNode.getModuleConfiguration().getStringValue(FOCourseNode.CONFIG_PSEUDONYM_POST_ALLOWED))) { - allowPseudonymEl.select(allowKeys[0], true); - } - - String[] defaultPseudonymValues = new String[] { translate("pseudonym.default") }; - pseudonymAsDefaultEl = uifactory.addCheckboxesHorizontal("pseudonym.default", null, formLayout, - allowKeys, defaultPseudonymValues); - pseudonymAsDefaultEl.setElementCssClass("o_sel_course_forum_pseudo_default"); - pseudonymAsDefaultEl.setLabel(null, null); - pseudonymAsDefaultEl.addActionListener(FormEvent.ONCHANGE); - - boolean defaultPseudonym = foNode.getModuleConfiguration().getBooleanSafe(FOCourseNode.CONFIG_PSEUDONYM_POST_DEFAULT, - forumModule.isPseudonymForMessageEnabledByDefault()); - if(defaultPseudonym) { - pseudonymAsDefaultEl.select(allowKeys[0], true); - } - } - - String[] allowGuestValues = new String[] { translate("allow.guest.post") }; - allowGuestEl = uifactory.addCheckboxesHorizontal("allow.guest", null, formLayout, - allowKeys, allowGuestValues); - allowGuestEl.setElementCssClass("o_sel_course_forum_allow_guest"); - allowGuestEl.setLabel(null, null); - allowGuestEl.addActionListener(FormEvent.ONCHANGE); - if("true".equals(foNode.getModuleConfiguration().getStringValue(FOCourseNode.CONFIG_GUEST_POST_ALLOWED))) { - allowGuestEl.select(allowKeys[0], true); - } - } - - private void updateUI() { - if(pseudonymAsDefaultEl != null && allowPseudonymEl != null) { - pseudonymAsDefaultEl.setVisible(isPseudonymPostAllowed()); - } - } - - @Override - protected void doDispose() { - // - } - - public boolean isPseudonymPostAllowed() { - return allowPseudonymEl == null ? false : allowPseudonymEl.isAtLeastSelected(1); - } - - public boolean isDefaultPseudonym() { - return pseudonymAsDefaultEl == null ? false : pseudonymAsDefaultEl.isAtLeastSelected(1); - } - - public boolean isGuestPostAllowed() { - return allowGuestEl.isAtLeastSelected(1); - } - - @Override - protected void formInnerEvent(UserRequest ureq, FormItem source, FormEvent event) { - if(allowPseudonymEl == source || pseudonymAsDefaultEl == source) { - fireEvent(ureq, Event.CHANGED_EVENT); - updateUI(); - } else if(allowGuestEl == source) { - fireEvent(ureq, Event.CHANGED_EVENT); - } - super.formInnerEvent(ureq, source, event); - } - - @Override - protected void formOK(UserRequest ureq) { - // - } -} \ No newline at end of file diff --git a/src/main/java/org/olat/course/nodes/fo/_i18n/LocalStrings_ar.properties b/src/main/java/org/olat/course/nodes/fo/_i18n/LocalStrings_ar.properties index 38ef1cb59c5181e976587327bf64e36dafa50384..8af7e41d112a0757736468bbf4e9f71f5077a099 100644 --- a/src/main/java/org/olat/course/nodes/fo/_i18n/LocalStrings_ar.properties +++ b/src/main/java/org/olat/course/nodes/fo/_i18n/LocalStrings_ar.properties @@ -14,7 +14,6 @@ display.config.startPage.true=\u0646\u0639\u0645\u060C \u0639\u0631\u0636 \u0635 pane.tab.accessibility=\u0648\u0635\u0648\u0644 -pane.tab.foconfig=\u0639\u0631\u0636 peekview.allItemsLink=\u0643\u0644 \u0627\u0644\u0645\u0634\u0627\u0631\u0643\u0627\u062A preview.canModerate=\u062A\u0645\u0643\u064A\u0646 \u0639\u0631\u0636 \u0627\u0644\u0645\u0634\u0627\u0631\u0643\u0627\u062A \u0641\u0649 \u0627\u0644\u0645\u0646\u062A\u062F\u0649 preview.canPost=\u062A\u0645\u0643\u064A\u0646 \u0627\u0644\u0643\u062A\u0627\u0628\u0629 \u0641\u0649 \u0627\u0644\u0645\u0646\u062A\u062F\u0649 diff --git a/src/main/java/org/olat/course/nodes/fo/_i18n/LocalStrings_bg.properties b/src/main/java/org/olat/course/nodes/fo/_i18n/LocalStrings_bg.properties index 433e7a0605c39b1ceeba8fead9f86866a289c0e2..36d3b336827a48065868d181abb68179d89c3cd3 100644 --- a/src/main/java/org/olat/course/nodes/fo/_i18n/LocalStrings_bg.properties +++ b/src/main/java/org/olat/course/nodes/fo/_i18n/LocalStrings_bg.properties @@ -14,7 +14,6 @@ display.config.startPage.true=\u0414\u0430, \u043F\u043E\u043A\u0430\u0436\u0435 pane.tab.accessibility=\u0414\u043E\u0441\u0442\u044A\u043F -pane.tab.foconfig=\u041F\u043E\u043A\u0430\u0437\u0432\u0430\u043D\u0435 preview.canModerate=\u041F\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u044F\u043D\u0435\u0442\u043E \u043D\u0430 \u043D\u0430\u043F\u0438\u0441\u0430\u043D\u043E\u0442\u043E \u0432\u044A\u0432 \u0444\u043E\u0440\u0443\u043C\u0430 \u0435 \u0430\u043A\u0442\u0438\u0432\u0438\u0440\u0430\u043D\u043E preview.canPost=\u041F\u0438\u0441\u0430\u043D\u0435\u0442\u043E \u043D\u0430 \u0441\u044A\u043E\u0431\u0449\u0435\u043D\u0438\u044F \u0432\u044A\u0432 \u0444\u043E\u0440\u0443\u043C\u0430 \u0435 \u0430\u043A\u0442\u0438\u0432\u0438\u0440\u0430\u043D\u043E preview.canRead=\u0427\u0435\u0442\u0435\u043D\u0435\u0442\u043E \u043D\u0430 \u0441\u044A\u043E\u0431\u0449\u0435\u043D\u0438\u044F \u0432\u044A\u0432 \u0444\u043E\u0440\u0443\u043C\u0430 \u0435 \u0430\u043A\u0442\u0438\u0432\u0438\u0440\u0430\u043D\u043E diff --git a/src/main/java/org/olat/course/nodes/fo/_i18n/LocalStrings_cs.properties b/src/main/java/org/olat/course/nodes/fo/_i18n/LocalStrings_cs.properties index d8bcd7b248b828fd1dfc0cb5f834d6572bd3e276..52c957d7e937b0c5a81ba4550ccf52b1d5cb619c 100644 --- a/src/main/java/org/olat/course/nodes/fo/_i18n/LocalStrings_cs.properties +++ b/src/main/java/org/olat/course/nodes/fo/_i18n/LocalStrings_cs.properties @@ -14,7 +14,6 @@ display.config.startPage.true=Ano, zobrazit uv\u00EDtac\u00ED str\u00E1nku. pane.tab.accessibility=P\u0159\u00EDstup -pane.tab.foconfig=Zobrazit preview.canModerate=Sou\u010Dasn\u00FD p\u0159\u00EDstup do f\u00F3ra je mo\u017En\u00FD preview.canPost=Zapisovac\u00ED pr\u00E1vo do f\u00F3ra je p\u0159\u00EDstupn\u00E9 preview.canRead=\u010Ctec\u00ED pr\u00E1vo do f\u00F3ra je p\u0159\u00EDstupn\u00E9 diff --git a/src/main/java/org/olat/course/nodes/fo/_i18n/LocalStrings_da.properties b/src/main/java/org/olat/course/nodes/fo/_i18n/LocalStrings_da.properties index 2f0b89f9f946c7b99ec9cbc06b6265a8193ceb02..bf8c14da6b9e2ddfb5d7969f3eb960f28c8491a1 100644 --- a/src/main/java/org/olat/course/nodes/fo/_i18n/LocalStrings_da.properties +++ b/src/main/java/org/olat/course/nodes/fo/_i18n/LocalStrings_da.properties @@ -14,7 +14,6 @@ display.config.startPage.true=Ja, vis velkomstsiden. pane.tab.accessibility=Adgange -pane.tab.foconfig=Visning preview.canModerate=Pr\u00E6sentation af forunm indhold er muligt preview.canPost=Det er muligt at skrive forum indhold preview.canRead=Det er muligt at l\u00E6se forum indhold diff --git a/src/main/java/org/olat/course/nodes/fo/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/course/nodes/fo/_i18n/LocalStrings_de.properties index 6d5f448ff284d1401f7cf6e2937dd2c68a5f3f9d..8a21fedfaf6b3617f7ea28c4044f21b9a92bf854 100644 --- a/src/main/java/org/olat/course/nodes/fo/_i18n/LocalStrings_de.properties +++ b/src/main/java/org/olat/course/nodes/fo/_i18n/LocalStrings_de.properties @@ -1,6 +1,7 @@ #Mon Mar 02 09:54:04 CET 2009 -allow.guest.post=Nicht registrierten Benutzern (G\u00E4sten) das Erstellen von Beitr\u00E4gen gestatten +allow.guest.post=G\u00E4sten das Erstellen von Beitr\u00E4gen gestatten allow.pseudonym.post=Beitr\u00E4ge mit Pseudonym zulassen +anonymous.title=Aliase command.closefo=Ansicht schliessen command.show=Forum anzeigen command.showpopup=Forum in neuem Fenster anzeigen @@ -11,14 +12,19 @@ display.config.fieldsettitle=Konfiguration display.config.startPage=Mit Startseite? display.config.startPage.false=Nein, Inhalt direkt starten display.config.startPage.true=Ja, anzeigen +edit.moderator=Moderator +edit.moderator.coach=Betreuer +edit.poster=Forumsbeitr\u00E4ge erstellen +edit.poster.coach=Betreuer +edit.poster.guest=Gast +edit.poster.participant=Teilnehemer pane.tab.accessibility=Zugang -pane.tab.foconfig=Darstellung -pane.tab.settings=Konfiguration -settings.title=Konfiguration +pane.tab.config=Konfiguration +peekview.allItemsLink= Alle Beitr\u00E4ge preview.canModerate=Forumsbeitr\u00E4ge moderieren m\u00F6glich preview.canPost=Forumsbeitr\u00E4ge schreiben m\u00F6glich preview.canRead=Forumsbeitr\u00E4ge lesen m\u00F6glich preview.header=Rechte im Forum f\u00FCr den simulierten Benutzer pseudonym.default=Pseudonym im einzelnen Forum-Post aktiviert +user.rights=Benutzerberechtigungen warn.forumdelete=Achtung\: Alle Beitr\u00E4ge werden gel\u00F6scht. -peekview.allItemsLink = Alle Beitr\u00E4ge \ No newline at end of file diff --git a/src/main/java/org/olat/course/nodes/fo/_i18n/LocalStrings_el.properties b/src/main/java/org/olat/course/nodes/fo/_i18n/LocalStrings_el.properties index 54e673cdb032d17e2e2b41a73ecff8792dab549d..3390ec8b4ddb79b797ab1118861c6e3f60f4fc1d 100644 --- a/src/main/java/org/olat/course/nodes/fo/_i18n/LocalStrings_el.properties +++ b/src/main/java/org/olat/course/nodes/fo/_i18n/LocalStrings_el.properties @@ -14,7 +14,6 @@ display.config.startPage.true=\u039D\u03B1\u03B9, \u03B5\u03BC\u03C6\u03AC\u03BD pane.tab.accessibility=\u03A0\u03C1\u03CC\u03C3\u03B2\u03B1\u03C3\u03B7 -pane.tab.foconfig=\u0395\u03BC\u03C6\u03AC\u03BD\u03B9\u03C3\u03B7 peekview.allItemsLink=\u038C\u03BB\u03B5\u03C2 \u03BF\u03B9 \u03C3\u03C5\u03BC\u03BC\u03B5\u03C4\u03BF\u03C7\u03AD\u03C2 preview.canModerate=\u0397 \u03C0\u03B1\u03C1\u03BF\u03C5\u03C3\u03AF\u03B1\u03C3\u03B7 \u03C4\u03C9\u03BD \u03B8\u03B5\u03BC\u03AC\u03C4\u03C9\u03BD \u03C4\u03BF\u03C5 forum \u03B5\u03AF\u03BD\u03B1\u03B9 \u03B4\u03C5\u03BD\u03B1\u03C4\u03AE preview.canPost=\u03A4\u03BF \u03B3\u03C1\u03AC\u03C8\u03B9\u03BC\u03BF \u03C3\u03B5 \u03B8\u03AD\u03BC\u03B1\u03C4\u03B1 \u03C4\u03BF\u03C5 forum \u03B5\u03AF\u03BD\u03B1\u03B9 \u03B4\u03C5\u03BD\u03B1\u03C4\u03CC diff --git a/src/main/java/org/olat/course/nodes/fo/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/course/nodes/fo/_i18n/LocalStrings_en.properties index d1b2fa67b56f1950ac51f7ff7d3e33c05a371a60..a6341deb19824d7a0d4636e481dfa8a57bfaea49 100644 --- a/src/main/java/org/olat/course/nodes/fo/_i18n/LocalStrings_en.properties +++ b/src/main/java/org/olat/course/nodes/fo/_i18n/LocalStrings_en.properties @@ -1,6 +1,7 @@ #Wed Jan 26 19:01:16 CET 2011 -allow.guest.post=Allow non-registered users (guests) to post +allow.guest.post=Allow guests to post allow.pseudonym.post=Allow posts using an alias +anymous.title=Aliases command.closefo=Close view command.show=Display forum command.showpopup=Display forum in a new window @@ -11,14 +12,19 @@ display.config.fieldsettitle=Configuration display.config.startPage=With welcome page? display.config.startPage.false=No, show content immediately. display.config.startPage.true=Yes, display welcome page. +edit.moderator=Moderator +edit.moderator.coach=Coach +edit.poster=Create forum posts +edit.poster.coach=Coach +edit.poster.guest=Guest +edit.poster.participant=Participant pane.tab.accessibility=Access -pane.tab.foconfig=Display -pane.tab.settings=Settings -settings.title=Settings +pane.tab.config=Configuration peekview.allItemsLink=All contributions preview.canModerate=Moderating forum contributions enabled preview.canPost=Writing forum contributions enabled preview.canRead=Reading forum contributions enabled preview.header=Forum rights for simulated user pseudonym.default=Activate alias in every message +user.rights=User rights warn.forumdelete=Warning\: All entries will be deleted. diff --git a/src/main/java/org/olat/course/nodes/fo/_i18n/LocalStrings_es.properties b/src/main/java/org/olat/course/nodes/fo/_i18n/LocalStrings_es.properties index a32f59c852679709139625b70e46a5fe3aa19087..c62e2bc3fee1a238c02e730ea70eef304e5ced46 100644 --- a/src/main/java/org/olat/course/nodes/fo/_i18n/LocalStrings_es.properties +++ b/src/main/java/org/olat/course/nodes/fo/_i18n/LocalStrings_es.properties @@ -14,7 +14,6 @@ display.config.startPage.true=S\u00ED. pane.tab.accessibility=Acceso -pane.tab.foconfig=Visualizaci\u00F3n preview.canModerate=Posible moderar contribuciones al foro preview.canPost=Posible escribir contribuciones al foro preview.canRead=Posible leer contribuciones al foro diff --git a/src/main/java/org/olat/course/nodes/fo/_i18n/LocalStrings_fr.properties b/src/main/java/org/olat/course/nodes/fo/_i18n/LocalStrings_fr.properties index 25782e8b9f615d2333bd9a44fd136d731be7b806..0ed8b1162216594b2de5040f244443d37626d160 100644 --- a/src/main/java/org/olat/course/nodes/fo/_i18n/LocalStrings_fr.properties +++ b/src/main/java/org/olat/course/nodes/fo/_i18n/LocalStrings_fr.properties @@ -1,5 +1,4 @@ #Wed Mar 08 11:26:13 CET 2017 -allow.guest.post=Permettent aux utilisateurs invit\u00E9s de r\u00E9pondre sur le forum allow.pseudonym.post=Autoriser les messages anonymes avec pseudonyme command.closefo=Fermer visualisation command.show=Afficher forum @@ -12,13 +11,11 @@ display.config.startPage=Avec page d'accueil? display.config.startPage.false=Non, d\u00E9marer contenu tout de suite svp display.config.startPage.true=Oui, afficher svp pane.tab.accessibility=Acc\u00E8s -pane.tab.foconfig=Affichage -pane.tab.settings=Configuration +pane.tab.config=Configuration peekview.allItemsLink=Toutes les contributions preview.canModerate=Animer des contributions du forum possible preview.canPost=Ecriture de contributions du forum possible preview.canRead=Lecture de contributions du forum possible preview.header=Droits dans forum pour l'utilisateur simul\u00E9 pseudonym.default=Activer les pseudonymes pour chaque message -settings.title=Configuration warn.forumdelete=Attention\: toutes les contributions seront supprim\u00E9es. diff --git a/src/main/java/org/olat/course/nodes/fo/_i18n/LocalStrings_it.properties b/src/main/java/org/olat/course/nodes/fo/_i18n/LocalStrings_it.properties index b4bc3b645ab83846cd6bc49848f975131cc30467..33b9c5e0b154fbd077a0ff5a0f9db2c99202277a 100644 --- a/src/main/java/org/olat/course/nodes/fo/_i18n/LocalStrings_it.properties +++ b/src/main/java/org/olat/course/nodes/fo/_i18n/LocalStrings_it.properties @@ -1,5 +1,5 @@ #Mon Mar 20 12:52:56 CET 2017 -allow.guest.post=Permettere agli utenti non registrati (ospiti) di postare nel forum +allow.guest.post=Permettere agli ospiti di postare nel forum allow.pseudonym.post=Permettere di postare utilizzando uno pseudonimo command.closefo=Chiudere visualizzazione command.show=Mostrare forum @@ -12,13 +12,11 @@ display.config.startPage=Con pagina d'avvio? display.config.startPage.false=No, avviare il contenuto direttamente display.config.startPage.true=S\u00EC, mostrare la pagina d'avvio pane.tab.accessibility=Accesso -pane.tab.foconfig=Visualizzazione -pane.tab.settings=Configurazione +pane.tab.config=Configurazione peekview.allItemsLink=Tutti i contributi preview.canModerate=Moderazione dei contributi del forum possibile preview.canPost=Scrittura dei contributi del forum possibile preview.canRead=Lettura dei contributi del forum possibile preview.header=Diritti nel forum per l'utente simulato pseudonym.default=Attivare alias in ogni messaggio -settings.title=Configurazioni warn.forumdelete=Attenzione\: tutti i contributi vengono eliminati. diff --git a/src/main/java/org/olat/course/nodes/fo/_i18n/LocalStrings_jp.properties b/src/main/java/org/olat/course/nodes/fo/_i18n/LocalStrings_jp.properties index 649822b75d7ec0b8bbd41314e1ced5d59de376cf..7caa09df840cbc04487fab6a319330687737e9c4 100644 --- a/src/main/java/org/olat/course/nodes/fo/_i18n/LocalStrings_jp.properties +++ b/src/main/java/org/olat/course/nodes/fo/_i18n/LocalStrings_jp.properties @@ -14,6 +14,5 @@ display.config.startPage.true=\u306F\u3044\u3001\u30A6\u30A7\u30EB\u30AB\u30E0\u pane.tab.accessibility=\u30A2\u30AF\u30BB\u30B9 -pane.tab.foconfig=\u8868\u793A peekview.allItemsLink=\u3059\u3079\u3066\u306E\u6295\u7A3F warn.forumdelete=\u8B66\u544A\: \u3059\u3079\u3066\u306E\u30E1\u30C3\u30BB\u30FC\u30B8\u306F\u524A\u9664\u3055\u308C\u307E\u3059\u3002 diff --git a/src/main/java/org/olat/course/nodes/fo/_i18n/LocalStrings_nl_NL.properties b/src/main/java/org/olat/course/nodes/fo/_i18n/LocalStrings_nl_NL.properties index c201a6cff26f06fb297e76b0fe454787bd751375..44e57a7f0360fa84bbfc416682d2a7ef4cfc527a 100644 --- a/src/main/java/org/olat/course/nodes/fo/_i18n/LocalStrings_nl_NL.properties +++ b/src/main/java/org/olat/course/nodes/fo/_i18n/LocalStrings_nl_NL.properties @@ -14,7 +14,6 @@ display.config.startPage.true=Ja, welkomspagina weergeven. pane.tab.accessibility=Toegang -pane.tab.foconfig=Vertonen peekview.allItemsLink=Alle bijdragen preview.canModerate=Het modereren van forum bijdragen is mogelijk preview.canPost=Het schrijven van forum bijdragen is mogelijk diff --git a/src/main/java/org/olat/course/nodes/fo/_i18n/LocalStrings_pl.properties b/src/main/java/org/olat/course/nodes/fo/_i18n/LocalStrings_pl.properties index e544c1e455b1b6f029402c2dd3b59a340071cbd2..5f5ac27d6baf98a91b80013f9ce67e6406003b32 100644 --- a/src/main/java/org/olat/course/nodes/fo/_i18n/LocalStrings_pl.properties +++ b/src/main/java/org/olat/course/nodes/fo/_i18n/LocalStrings_pl.properties @@ -14,7 +14,6 @@ display.config.startPage.true=Tak, poka\u017C stron\u0119 powitaln\u0105. pane.tab.accessibility=Dost\u0119p -pane.tab.foconfig=Wy\u015Bwietlanie peekview.allItemsLink=Wszystkie sk\u0142adniki preview.canModerate=Moderowanie jest dozwolone preview.canPost=Tworzenie wiadomo\u015Bci jest dozwolone diff --git a/src/main/java/org/olat/course/nodes/fo/_i18n/LocalStrings_pt_BR.properties b/src/main/java/org/olat/course/nodes/fo/_i18n/LocalStrings_pt_BR.properties index 921f09c129475bf33ed84e04e76a328d8a971f51..2158f5f05d8c821a6361731db263efc472233541 100644 --- a/src/main/java/org/olat/course/nodes/fo/_i18n/LocalStrings_pt_BR.properties +++ b/src/main/java/org/olat/course/nodes/fo/_i18n/LocalStrings_pt_BR.properties @@ -1,5 +1,4 @@ #Thu Mar 16 22:26:57 CET 2017 -allow.guest.post=Permitir que os utilizadores n\u00E3o registados (convidados) postem allow.pseudonym.post=Permitir mensagens usando um alias command.closefo=Fechar vis\u00E3o command.show=Exibir f\u00F3rum @@ -12,13 +11,11 @@ display.config.startPage=Com p\u00E1gina de boas-vindas? display.config.startPage.false=N\u00E3o, mostrar conte\u00FAdo imediatamente. display.config.startPage.true=Sim, mostrar p\u00E1gina de boas-vindas. pane.tab.accessibility=Acesso -pane.tab.foconfig=Exibir -pane.tab.settings=Configura\u00E7\u00F5es +pane.tab.config=Configura\u00E7\u00F5es peekview.allItemsLink=Todas as contribui\u00E7\u00F5es preview.canModerate=Apresentar contribui\u00E7\u00F5es para o f\u00F3rum \u00E9 poss\u00EDvel preview.canPost=Escrever contribui\u00E7\u00F5es para o f\u00F3rum \u00E9 poss\u00EDvel preview.canRead=Ler contribui\u00E7\u00F5es do f\u00F3rum \u00E9 poss\u00EDvel preview.header=Direitos do f\u00F3rum para usu\u00E1rio simulado pseudonym.default=Ativar alias em cada mensagem -settings.title=Configura\u00E7\u00F5es warn.forumdelete=Aviso\: Todas as mensagens ser\u00E3o apagadas. diff --git a/src/main/java/org/olat/course/nodes/fo/_i18n/LocalStrings_pt_PT.properties b/src/main/java/org/olat/course/nodes/fo/_i18n/LocalStrings_pt_PT.properties index 9ac768c914750e3a251766e1502008b7cf1c62be..9acbb7a98f76ed9cd9b4e59ff77e6c7d1c74db38 100644 --- a/src/main/java/org/olat/course/nodes/fo/_i18n/LocalStrings_pt_PT.properties +++ b/src/main/java/org/olat/course/nodes/fo/_i18n/LocalStrings_pt_PT.properties @@ -14,7 +14,6 @@ display.config.startPage.true=Sim, mostrar p\u00E1gina de boas-vindas. pane.tab.accessibility=Acesso -pane.tab.foconfig=Exibir preview.canModerate=Apresentar contribui\u00E7\u00F5es para o f\u00F3rum \u00E9 poss\u00EDvel preview.canPost=Escrever contribui\u00E7\u00F5es para o f\u00F3rum \u00E9 poss\u00EDvel preview.canRead=Ler contribui\u00E7\u00F5es do f\u00F3rum \u00E9 poss\u00EDvel diff --git a/src/main/java/org/olat/course/nodes/fo/_i18n/LocalStrings_ru.properties b/src/main/java/org/olat/course/nodes/fo/_i18n/LocalStrings_ru.properties index a1ba4f9c7d3075b4d243b61388bee35e10d317a6..e715c45af2d240ce59372fa98fceedaec2a40fed 100644 --- a/src/main/java/org/olat/course/nodes/fo/_i18n/LocalStrings_ru.properties +++ b/src/main/java/org/olat/course/nodes/fo/_i18n/LocalStrings_ru.properties @@ -14,7 +14,6 @@ display.config.startPage.true=\u0414\u0430, \u043F\u043E\u043A\u0430\u0437\u0430 pane.tab.accessibility=\u0414\u043E\u0441\u0442\u0443\u043F -pane.tab.foconfig=\u041F\u043E\u043A\u0430\u0437 peekview.allItemsLink=\u0412\u0441\u0435 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F preview.canModerate=\u0412\u043E\u0437\u043C\u043E\u0436\u043D\u043E \u043C\u043E\u0434\u0435\u0440\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u0435 \u0432 \u0444\u043E\u0440\u0443\u043C\u0435 preview.canPost=\u0412\u043E\u0437\u043C\u043E\u0436\u043D\u043E \u043D\u0430\u043F\u0438\u0441\u0430\u043D\u0438\u0435 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0439 diff --git a/src/main/java/org/olat/course/nodes/fo/_i18n/LocalStrings_sq.properties b/src/main/java/org/olat/course/nodes/fo/_i18n/LocalStrings_sq.properties index 3e790e9dece16165b859e7649d1278f793e5eea2..995f119e1f126ff4723237cfa51ad6ba23e6ecbb 100644 --- a/src/main/java/org/olat/course/nodes/fo/_i18n/LocalStrings_sq.properties +++ b/src/main/java/org/olat/course/nodes/fo/_i18n/LocalStrings_sq.properties @@ -14,7 +14,6 @@ display.config.startPage.true=Po, shfaqe faqen e mir\u00EBseardhjes. pane.tab.accessibility=Qasja -pane.tab.foconfig=Shfaqja preview.canModerate=Kontributet e tanishme jan\u00EB t\u00EB mundshme preview.canPost=Kontributi i shkrimit p\u00EBr forumin \u00EBsht\u00EB i mundsh\u00EBm preview.canRead=Kontributi i leximi p\u00EBr forumin \u00EBsht\u00EB i mundsh\u00EBm diff --git a/src/main/java/org/olat/course/nodes/fo/_i18n/LocalStrings_zh_CN.properties b/src/main/java/org/olat/course/nodes/fo/_i18n/LocalStrings_zh_CN.properties index bb25804906524af6ba95908d670452f9e154fd57..9f70c8331b34dec326fc003a2039cdd7b594844b 100644 --- a/src/main/java/org/olat/course/nodes/fo/_i18n/LocalStrings_zh_CN.properties +++ b/src/main/java/org/olat/course/nodes/fo/_i18n/LocalStrings_zh_CN.properties @@ -14,7 +14,6 @@ display.config.startPage.true=\u662F, \u663E\u793A\u6B22\u8FCE\u754C\u9762 pane.tab.accessibility=\u8BBF\u95EE -pane.tab.foconfig=\u663E\u793A peekview.allItemsLink=\u6240\u6709\u8D21\u732E preview.canModerate=\u53EF\u4EE5\u663E\u793A\u8BBA\u575B\u8D34 preview.canPost=\u5141\u8BB8\u53D1\u5E16 diff --git a/src/main/java/org/olat/course/nodes/fo/_i18n/LocalStrings_zh_TW.properties b/src/main/java/org/olat/course/nodes/fo/_i18n/LocalStrings_zh_TW.properties index 53e20c76d9d227bb9ef9707061b6afaf955277fb..99e971eba2de34c02f28465d80d436a77831bbd7 100644 --- a/src/main/java/org/olat/course/nodes/fo/_i18n/LocalStrings_zh_TW.properties +++ b/src/main/java/org/olat/course/nodes/fo/_i18n/LocalStrings_zh_TW.properties @@ -14,7 +14,6 @@ display.config.startPage.true=\u662F\uFF0C\u986F\u793A\u6B61\u8FCE\u9801\u9762\u pane.tab.accessibility=\u5B58\u53D6 -pane.tab.foconfig=\u986F\u793A peekview.allItemsLink=\u6240\u6709\u7684\u8CA2\u737B\u8005 preview.canModerate=\u555F\u7528\u5C55\u793A\u8AD6\u58C7\u8CA2\u737B preview.canPost=\u555F\u7528\u5BEB\u5165\u8AD6\u58C7\u8CA2\u737B