diff --git a/src/main/java/org/olat/course/reminder/ui/CourseReminderEditController.java b/src/main/java/org/olat/course/reminder/ui/CourseReminderEditController.java index 435e6a37bd88b8e28f78d23ca6355adfd7e81a2b..1a2393f8109982e1c37a891f438a81863f08d235 100644 --- a/src/main/java/org/olat/course/reminder/ui/CourseReminderEditController.java +++ b/src/main/java/org/olat/course/reminder/ui/CourseReminderEditController.java @@ -114,6 +114,7 @@ public class CourseReminderEditController extends FormBasicController { String desc = reminder.getDescription(); descriptionEl = uifactory.addTextElement("reminder.description", "reminder.description", 128, desc, generalCont); + descriptionEl.setElementCssClass("o_sel_course_reminder_desc"); String sendTime = getSendTimeDescription(); uifactory.addStaticTextElement("send.time.description.label", sendTime, generalCont); @@ -199,8 +200,10 @@ public class CourseReminderEditController extends FormBasicController { FormLink addRuleButton = uifactory.addFormLink("add.rule.".concat(id), "add", "add.rule", null, rulesCont, Link.BUTTON); addRuleButton.setIconLeftCSS("o_icon o_icon-fw o_icon_add"); + addRuleButton.setElementCssClass("o_sel_course_add_rule"); FormLink deleteRuleButton = uifactory.addFormLink("delete.rule.".concat(id), "delete", "delete.rule", null, rulesCont, Link.BUTTON); deleteRuleButton.setIconLeftCSS("o_icon o_icon-fw o_icon_delete_item"); + deleteRuleButton.setElementCssClass("o_sel_course_delete_rule"); RuleEditorFragment editor = ruleSpi.getEditorFragment(rule, entry); FormItem customItem = editor.initForm(rulesCont, this, ureq); diff --git a/src/main/java/org/olat/course/reminder/ui/CourseReminderListController.java b/src/main/java/org/olat/course/reminder/ui/CourseReminderListController.java index 4be65d314f5a831d057c8b0b4ca31664b91ba990..c122e8bf8e41b62cdfaea488873c54f7324c2e45 100644 --- a/src/main/java/org/olat/course/reminder/ui/CourseReminderListController.java +++ b/src/main/java/org/olat/course/reminder/ui/CourseReminderListController.java @@ -101,8 +101,11 @@ public class CourseReminderListController extends FormBasicController implements @Override protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) { + formLayout.setElementCssClass("o_sel_course_reminder_list"); + addButton = uifactory.addFormLink("add.reminder", formLayout, Link.BUTTON); addButton.setIconLeftCSS("o_icon o_icon_add"); + addButton.setElementCssClass("o_sel_add_course_reminder"); FlexiTableColumnModel columnsModel = FlexiTableDataModelFactory.createFlexiTableColumnModel(); columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(false, ReminderCols.id.i18nKey(), ReminderCols.id.ordinal(), @@ -131,6 +134,7 @@ public class CourseReminderListController extends FormBasicController implements FormLink toolsLink = uifactory.addFormLink("tools_" + counter.incrementAndGet(), "tools", "", null, null, Link.NONTRANSLATED); toolsLink.setIconLeftCSS("o_icon o_icon_actions o_icon-lg"); + toolsLink.setElementCssClass("o_sel_course_reminder_tools"); toolsLink.setTitle(translate("tools")); ReminderRow row = new ReminderRow(reminder, toolsLink); @@ -300,21 +304,24 @@ public class CourseReminderListController extends FormBasicController implements mainVC = createVelocityContainer("tools"); List<String> links = new ArrayList<>(); - addLink("edit", "edit", "o_icon o_icon-fw o_icon_edit", links); - addLink("duplicate", "duplicate", "o_icon o_icon-fw o_icon_copy", links); - addLink("send", "send", "o_icon o_icon-fw o_icon_send", links); - addLink("show.sent", "show.sent", "o_icon o_icon-fw o_icon_show_send", links); - addLink("delete", "delete", "o_icon o_icon-fw o_icon_delete_item", links); + addLink("edit", "edit", "o_icon o_icon-fw o_icon_edit", links, "o_sel_course_reminder_edit"); + addLink("duplicate", "duplicate", "o_icon o_icon-fw o_icon_copy", links, "o_sel_course_reminder_duplicate"); + addLink("send", "send", "o_icon o_icon-fw o_icon_send", links, "o_sel_course_reminder_send"); + addLink("show.sent", "show.sent", "o_icon o_icon-fw o_icon_show_send", links, "o_sel_course_reminder_showsent"); + addLink("delete", "delete", "o_icon o_icon-fw o_icon_delete_item", links, "o_sel_course_reminder_delete"); mainVC.contextPut("links", links); putInitialPanel(mainVC); } - private void addLink(String name, String cmd, String iconCSS, List<String> links) { + private void addLink(String name, String cmd, String iconCSS, List<String> links, String elementCssClass) { Link link = LinkFactory.createLink(name, cmd, getTranslator(), mainVC, this, Link.LINK); if(iconCSS != null) { link.setIconLeftCSS(iconCSS); } + if(elementCssClass != null) { + link.setElementCssClass(elementCssClass); + } mainVC.put(name, link); links.add(name); } diff --git a/src/main/java/org/olat/course/reminder/ui/CourseReminderLogsController.java b/src/main/java/org/olat/course/reminder/ui/CourseReminderLogsController.java index 678d0276c6a6d9436b8660b0a531f42b4f504116..0f8c9b539ae3d215ecc02fd5d1f3221c265392fb 100644 --- a/src/main/java/org/olat/course/reminder/ui/CourseReminderLogsController.java +++ b/src/main/java/org/olat/course/reminder/ui/CourseReminderLogsController.java @@ -142,6 +142,7 @@ public class CourseReminderLogsController extends FormBasicController { tableModel = new CourseSendReminderTableModel(columnsModel); tableEl = uifactory.addTableElement(getWindowControl(), "table", tableModel, 20, false, getTranslator(), formLayout); + tableEl.setElementCssClass("o_sel_course_sent_reminder_log_list"); updateModel(); } diff --git a/src/main/java/org/olat/course/reminder/ui/CourseRemindersController.java b/src/main/java/org/olat/course/reminder/ui/CourseRemindersController.java index 321bb90796777d752e13799d28d2fae84748b217..dea834217fa6aefc7a4056cb3e867a48d11720da 100644 --- a/src/main/java/org/olat/course/reminder/ui/CourseRemindersController.java +++ b/src/main/java/org/olat/course/reminder/ui/CourseRemindersController.java @@ -71,8 +71,10 @@ public class CourseRemindersController extends BasicController implements Activa segmentView = SegmentViewFactory.createSegmentView("segments", mainVC, this); remindersLink = LinkFactory.createLink("reminders", mainVC, this); + remindersLink.setElementCssClass("o_sel_course_reminder_list_segment"); segmentView.addSegment(remindersLink, true); logsLink = LinkFactory.createLink("logs", mainVC, this); + logsLink.setElementCssClass("o_sel_course_reminder_log_segment"); segmentView.addSegment(logsLink, false); doOpenRemindersConfiguration(ureq); diff --git a/src/main/java/org/olat/course/reminder/ui/CourseSendReminderListController.java b/src/main/java/org/olat/course/reminder/ui/CourseSendReminderListController.java index ce3e9423efcf8d73663850256c34820551d54d2c..b54d9c1d343e3db9f19dff12d43fbf6af659c228 100644 --- a/src/main/java/org/olat/course/reminder/ui/CourseSendReminderListController.java +++ b/src/main/java/org/olat/course/reminder/ui/CourseSendReminderListController.java @@ -130,6 +130,7 @@ public class CourseSendReminderListController extends FormBasicController { tableModel = new CourseSendReminderTableModel(columnsModel); tableEl = uifactory.addTableElement(getWindowControl(), "table", tableModel, 20, false, getTranslator(), formLayout); + tableEl.setElementCssClass("o_sel_course_sent_reminder_list"); updateModel(); } diff --git a/src/main/java/org/olat/course/reminder/ui/_content/edit_rules.html b/src/main/java/org/olat/course/reminder/ui/_content/edit_rules.html index f99d5eb4b3c6b740bffe2bbda22a3cdbfa7c8776..6775c89500b2c23d50ed7f4506e7b673104a5bad 100644 --- a/src/main/java/org/olat/course/reminder/ui/_content/edit_rules.html +++ b/src/main/java/org/olat/course/reminder/ui/_content/edit_rules.html @@ -1,7 +1,7 @@ <div class="o_block_large"> <p>$r.translate("rules.description")</p> #foreach($rule in $rules) - <div class="o_reminder_rule row"> + <div class="o_reminder_rule row o_sel_row-$velocityCount"> <div class="col-md-4">$r.render($rule.typeComponentName)</div> <div class="col-md-6"> $r.render($rule.customItemName) diff --git a/src/main/java/org/olat/course/reminder/ui/_content/edit_rules_buttons.html b/src/main/java/org/olat/course/reminder/ui/_content/edit_rules_buttons.html index 8c7c295ee00c713da68de7fc7a2cf4a38bce9dab..b97f9f8bb09a1b217a9e5c910c375e72d35df34f 100644 --- a/src/main/java/org/olat/course/reminder/ui/_content/edit_rules_buttons.html +++ b/src/main/java/org/olat/course/reminder/ui/_content/edit_rules_buttons.html @@ -1,4 +1,4 @@ -<div class="o_block o_button_group"> +<div class="o_block o_button_group o_sel_course_reminder_config_buttons"> $r.render("save") $r.render("cancel") </div> \ No newline at end of file diff --git a/src/main/java/org/olat/course/run/CourseRuntimeController.java b/src/main/java/org/olat/course/run/CourseRuntimeController.java index 77475fc251dca1e1ce1b56aafc33f26b192299e5..c58980fe134e744695a8111f2a5824d419187f7e 100644 --- a/src/main/java/org/olat/course/run/CourseRuntimeController.java +++ b/src/main/java/org/olat/course/run/CourseRuntimeController.java @@ -493,7 +493,7 @@ public class CourseRuntimeController extends RepositoryEntryRuntimeController im if(reminderModule.isEnabled()) { reminderLink = LinkFactory.createToolLink("reminders.cmd", translate("command.options.reminders"), this, "o_icon_reminder"); - reminderLink.setElementCssClass("o_sel_course_options_certificates"); + reminderLink.setElementCssClass("o_sel_course_reminders"); settings.addComponent(reminderLink); } } diff --git a/src/main/java/org/olat/repository/_content/cycle_dates.html b/src/main/java/org/olat/repository/_content/cycle_dates.html index aa1f98e01664d1b76652b8decc2ed4cfa2d514f6..bb817259e3a7e34c7cb1e2da266a456ee5a50af8 100644 --- a/src/main/java/org/olat/repository/_content/cycle_dates.html +++ b/src/main/java/org/olat/repository/_content/cycle_dates.html @@ -1,6 +1,6 @@ <div class="o_date form-inline"> <span class="form-control-static">$r.translate("cif.date.start")</span> - <div class="form-group">$r.render("date.start")</div> + <div class="form-group o_sel_repo_lifecycle_validfrom">$r.render("date.start")</div> <span class="form-control-static">$r.translate("cif.date.end")</span> - <div class="form-group">$r.render("date.end")</div> + <div class="form-group o_sel_repo_lifecycle_validto">$r.render("date.end")</div> </div> \ No newline at end of file diff --git a/src/main/java/org/olat/repository/ui/author/RepositoryEditDescriptionController.java b/src/main/java/org/olat/repository/ui/author/RepositoryEditDescriptionController.java index 0d86deabf5101068b877d652715df38c341ae6bc..6d0b67eb05e60dcb4d5364b23923ed2acf6c94d8 100644 --- a/src/main/java/org/olat/repository/ui/author/RepositoryEditDescriptionController.java +++ b/src/main/java/org/olat/repository/ui/author/RepositoryEditDescriptionController.java @@ -53,7 +53,6 @@ import org.olat.core.gui.control.WindowControl; import org.olat.core.util.FileUtils; import org.olat.core.util.StringHelper; import org.olat.core.util.WebappHelper; -import org.olat.core.util.i18n.I18nManager; import org.olat.core.util.vfs.LocalFileImpl; import org.olat.core.util.vfs.LocalFolderImpl; import org.olat.core.util.vfs.VFSContainer; @@ -106,8 +105,6 @@ public class RepositoryEditDescriptionController extends FormBasicController { private static final String[] dateKeys = new String[]{ "none", "private", "public"}; - @Autowired - private I18nManager i18nmanager; @Autowired private UserManager userManager; @Autowired @@ -217,6 +214,7 @@ public class RepositoryEditDescriptionController extends FormBasicController { translate("cif.dates.public") }; dateTypesEl = uifactory.addRadiosVertical("cif.dates", descCont, dateKeys, dateValues); + dateTypesEl.setElementCssClass("o_sel_repo_lifecycle_type"); if(repositoryEntry.getLifecycle() == null) { dateTypesEl.select("none", true); } else if(repositoryEntry.getLifecycle().isPrivateCycle()) { @@ -253,7 +251,9 @@ public class RepositoryEditDescriptionController extends FormBasicController { descCont.add("private.date", privateDatesCont); startDateEl = uifactory.addDateChooser("date.start", "cif.date.start", null, privateDatesCont); + startDateEl.setElementCssClass("o_sel_repo_lifecycle_validfrom"); endDateEl = uifactory.addDateChooser("date.end", "cif.date.end", null, privateDatesCont); + endDateEl.setElementCssClass("o_sel_repo_lifecycle_validto"); if(repositoryEntry.getLifecycle() != null) { RepositoryEntryLifecycle lifecycle = repositoryEntry.getLifecycle(); diff --git a/src/test/java/org/olat/selenium/CourseTest.java b/src/test/java/org/olat/selenium/CourseTest.java index 7bbe0b63396b0d532feb6b27a44638feb0cfd346..1ec30ac526332c93a19c1e5a507ea8b1c5dd9414 100644 --- a/src/test/java/org/olat/selenium/CourseTest.java +++ b/src/test/java/org/olat/selenium/CourseTest.java @@ -22,7 +22,10 @@ package org.olat.selenium; import java.io.IOException; import java.net.URISyntaxException; import java.net.URL; +import java.util.Calendar; +import java.util.Date; import java.util.List; +import java.util.Locale; import java.util.UUID; import org.jboss.arquillian.container.test.api.Deployment; @@ -47,6 +50,7 @@ import org.olat.selenium.page.course.CoursePageFragment; import org.olat.selenium.page.course.CourseWizardPage; import org.olat.selenium.page.course.InfoMessageCEPage; import org.olat.selenium.page.course.PublisherPageFragment; +import org.olat.selenium.page.course.RemindersPage; import org.olat.selenium.page.course.PublisherPageFragment.Access; import org.olat.selenium.page.graphene.OOGraphene; import org.olat.selenium.page.repository.AuthoringEnvPage; @@ -910,4 +914,96 @@ public class CourseTest { .members() .assertFirstNameInList(ryomou); } + + /** + * An author create a course, set a start and end date for life-cycle. + * It add a participant to the course. It creates a reminder + * with a rule to catch only participant, an other to send + * the reminder after the start of the course. It sends the reminder + * manually, checks the reminders send, checks the log. + * + * @param loginPage + * @throws IOException + * @throws URISyntaxException + */ + @Test + @RunAsClient + public void courseReminders(@InitialPage LoginPage loginPage) + throws IOException, URISyntaxException { + UserVO author = new UserRestClient(deploymentUrl).createAuthor(); + loginPage.loginAs(author.getLogin(), author.getPassword()); + UserVO kanu = new UserRestClient(deploymentUrl).createRandomUser("Kanu"); + + //go to authoring + AuthoringEnvPage authoringEnv = navBar + .assertOnNavigationPage() + .openAuthoringEnvironment(); + + Calendar cal = Calendar.getInstance(); + cal.setTime(new Date()); + cal.add(Calendar.DATE, -10); + Date validFrom = cal.getTime(); + cal.add(Calendar.DATE, 20); + Date validTo = cal.getTime(); + + String title = "Remind-me-" + UUID.randomUUID().toString(); + //create course + authoringEnv + .openCreateDropDown() + .clickCreate(ResourceType.course) + .fillCreateForm(title) + .assertOnGeneralTab() + .setLifecycle(validFrom, validTo, Locale.GERMAN) + .save(); + + //open course editor, create a node, set access + CoursePageFragment course = new CoursePageFragment(browser); + course + .openToolsMenu() + .edit() + .createNode("info") + .autoPublish() + .accessConfiguration() + .setUserAccess(UserAccess.registred) + .clickToolbarBack(); + // add a participant + course + .members() + .quickAdd(kanu); + + //go to reminders + RemindersPage reminders = course + .reminders() + .assertOnRemindersList(); + + String reminderTitle = "REM-" + UUID.randomUUID(); + reminders + .addReminder() + .setDescription(reminderTitle) + .setTimeBasedRule(1, "RepositoryEntryLifecycleAfterValidFromRuleSPI", 5, "day") + .addRule(1) + .setRoleBasedRule(2, "RepositoryEntryRoleRuleSPI", "participant") + .saveReminder() + .assertOnRemindersList() + .assertOnReminderInList(reminderTitle); + //send the reminders + reminders + .openActionMenu(reminderTitle) + .sendReminders(); + //check the reminder is send to user + reminders + .openActionMenu(reminderTitle) + .showSentReminders() + //reminder send to user + .assertSentRemindersList(kanu, true) + //reminder not send to author + .assertSentRemindersList(author, false); + + //open reminders log + reminders + .clickToolbarBack() + .openLog() + .assertLogList(kanu, reminderTitle, true) + .assertLogList(author, reminderTitle, false); + } } diff --git a/src/test/java/org/olat/selenium/page/course/CoursePageFragment.java b/src/test/java/org/olat/selenium/page/course/CoursePageFragment.java index 026b30d1aa224fc6400623a74578553c481725b0..46a993cbc66fc852af491f7b2ac66b1ed3461255 100644 --- a/src/test/java/org/olat/selenium/page/course/CoursePageFragment.java +++ b/src/test/java/org/olat/selenium/page/course/CoursePageFragment.java @@ -128,6 +128,16 @@ public class CoursePageFragment { return this; } + public RemindersPage reminders() { + if(!browser.findElement(settingsMenu).isDisplayed()) { + openSettingsMenu(); + } + By reminderBy = By.cssSelector("a.o_sel_course_reminders"); + browser.findElement(reminderBy).click(); + OOGraphene.waitBusy(browser); + return new RemindersPage(browser); + } + /** * Click the editor link in the tools drop-down * @return diff --git a/src/test/java/org/olat/selenium/page/course/RemindersPage.java b/src/test/java/org/olat/selenium/page/course/RemindersPage.java new file mode 100644 index 0000000000000000000000000000000000000000..1c78ead8fb99bffa476bf539048ca4113019bc25 --- /dev/null +++ b/src/test/java/org/olat/selenium/page/course/RemindersPage.java @@ -0,0 +1,254 @@ +/** + * <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.selenium.page.course; + +import java.util.List; + +import org.jboss.arquillian.drone.api.annotation.Drone; +import org.junit.Assert; +import org.olat.selenium.page.NavigationPage; +import org.olat.selenium.page.graphene.OOGraphene; +import org.olat.user.restapi.UserVO; +import org.openqa.selenium.By; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.support.ui.Select; + +/** + * + * Initial date: 09.07.2015<br> + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + * + */ +public class RemindersPage { + + @Drone + private WebDriver browser; + + public RemindersPage() { + // + } + + public RemindersPage(WebDriver browser) { + this.browser = browser; + } + + /** + * Check that the reminders list is present. + * @return + */ + public RemindersPage assertOnRemindersList() { + By reminderListBy = By.className("o_sel_course_reminder_list"); + List<WebElement> reminderListEls = browser.findElements(reminderListBy); + Assert.assertEquals(1, reminderListEls.size()); + return this; + } + + + public RemindersPage assertOnReminderInList(String title) { + By rowBy = By.xpath("//fieldset[contains(@class,'o_sel_course_reminder_list')]//table//tr//td//a[contains(text(), '" + title + "')]"); + List<WebElement> reminderListEls = browser.findElements(rowBy); + Assert.assertEquals(1, reminderListEls.size()); + return this; + } + + /** + * Open the tools menu of the reminder specified by the title. + * + * @param title + * @return + */ + public RemindersPage openActionMenu(String title) { + By rowBy = By.xpath("//fieldset[contains(@class,'o_sel_course_reminder_list')]//table//tr[//td//a[contains(text(), '" + title + "')]]//td//a[contains(@class,'o_sel_course_reminder_tools')]"); + List<WebElement> reminderListEls = browser.findElements(rowBy); + Assert.assertEquals(1, reminderListEls.size()); + reminderListEls.get(0).click(); + OOGraphene.waitBusy(browser); + return this; + } + + /** + * Click in the tools the "Send reminders". + * + * @return + */ + public RemindersPage sendReminders() { + By sendBy = By.cssSelector("div.o_callout_content ul.o_dropdown a.o_sel_course_reminder_send"); + browser.findElement(sendBy).click(); + OOGraphene.waitBusy(browser); + return this; + } + + /** + * Click in the tools the "Show sent reminders". + * + * @return + */ + public RemindersPage showSentReminders() { + By sendBy = By.cssSelector("div.o_callout_content ul.o_dropdown a.o_sel_course_reminder_showsent"); + browser.findElement(sendBy).click(); + OOGraphene.waitBusy(browser); + return this; + } + + public RemindersPage assertSentRemindersList(UserVO user, boolean in) { + By rowBy = By.xpath("//div[contains(@class,'o_sel_course_sent_reminder_list')]//table//tr//td//a[contains(text(), '" + user.getFirstName() + "')]"); + List<WebElement> reminderListEls = browser.findElements(rowBy); + if(in) { + Assert.assertEquals(1, reminderListEls.size()); + } else { + Assert.assertTrue(reminderListEls.isEmpty()); + } + return this; + } + + public RemindersPage clickToolbarBack() { + browser.findElement(NavigationPage.toolbarBackBy).click(); + OOGraphene.waitBusy(browser); + return this; + } + + /** + * Open the log + * + * @return + */ + public RemindersPage openLog() { + By logSegmentBy = By.cssSelector("a.o_sel_course_reminder_log_segment"); + browser.findElement(logSegmentBy).click(); + OOGraphene.waitBusy(browser); + return this; + } + + public RemindersPage assertLogList(UserVO user, String reminderTitle, boolean in) { + String xpath = "//div[contains(@class,'o_sel_course_sent_reminder_log_list')]//table//tr" + + "[//td//a[contains(text(), '" + user.getFirstName() + "')]]" + + "[//td//a[contains(text(), '" + reminderTitle + "')]]"; + + By rowBy = By.xpath(xpath); + List<WebElement> logListEls = browser.findElements(rowBy); + if(in) { + Assert.assertFalse(logListEls.isEmpty()); + } else { + Assert.assertTrue(logListEls.isEmpty()); + } + return this; + } + + /** + * Create a new reminder + * + * @return + */ + public RemindersPage addReminder() { + By addReminderBy = By.cssSelector("a.o_sel_add_course_reminder"); + browser.findElement(addReminderBy).click(); + OOGraphene.waitBusy(browser); + return this; + } + + public RemindersPage setDescription(String text) { + By descBy = By.cssSelector(".o_sel_course_reminder_desc input[type='text']"); + browser.findElement(descBy).sendKeys(text); + return this; + } + + public RemindersPage setTimeBasedRule(int pos, String type, int time, String unit) { + //select type + selectRuleType(pos, type); + + //enter time + By timeBy = By.cssSelector("div.o_sel_row-" + pos + " input[type='text']"); + browser.findElement(timeBy).sendKeys(Integer.toString(time)); + + //select time unit + By selectUnitBy = By.xpath("//div[contains(@class,'o_sel_row-" + pos + "')]//select[contains(@name,'launchunit')]"); + WebElement unitSelect = browser.findElement(selectUnitBy); + new Select(unitSelect).selectByValue(unit); + OOGraphene.waitBusy(browser); + + return this; + } + + /** + * Set the configuration of a repository entry role. + * + * @param pos + * @param type + * @param role + * @return + */ + public RemindersPage setRoleBasedRule(int pos, String type, String role) { + //select type + selectRuleType(pos, type); + + //select role + By selectRoleBy = By.xpath("//div[contains(@class,'o_sel_row-" + pos + "')]//select[contains(@name,'role.')]"); + WebElement roleSelect = browser.findElement(selectRoleBy); + new Select(roleSelect).selectByValue(role); + OOGraphene.waitBusy(browser); + + return this; + } + + /** + * Add a rule after the specified row. Warning, the first + * position is 1. + * + * @param pos + * @return + */ + public RemindersPage addRule(int pos) { + By addRuleBy = By.cssSelector("div.o_sel_row-" + pos + " a.o_sel_course_add_rule"); + browser.findElement(addRuleBy).click(); + OOGraphene.waitBusy(browser); + return this; + } + + /** + * Select the rule type, it's the simple name of the class: + * RepositoryEntryLifecycleAfterValidFromRuleSPI, + * RepositoryEntryRoleRuleSPI... + * + * @param pos + * @param type + */ + private void selectRuleType(int pos, String type) { + By selectTypeBy = By.xpath("//div[contains(@class,'o_sel_row-" + pos + "')]//select[contains(@name,'rule.type')]"); + WebElement typeSelect = browser.findElement(selectTypeBy); + new Select(typeSelect).selectByValue(type); + OOGraphene.waitBusy(browser); + } + + /** + * Save the form to edit a reminder + * + * @return + */ + public RemindersPage saveReminder() { + By saveBy = By.cssSelector(".o_sel_course_reminder_config_buttons button.btn-primary"); + List<WebElement> saveEls = browser.findElements(saveBy); + Assert.assertEquals(1, saveEls.size()); + saveEls.get(0).click(); + OOGraphene.waitBusy(browser); + return this; + } + +} diff --git a/src/test/java/org/olat/selenium/page/repository/RepositoryEditDescriptionPage.java b/src/test/java/org/olat/selenium/page/repository/RepositoryEditDescriptionPage.java index 452c3f6e89a34cfc0d87ff77221f279e9af84035..68c251f7315ecae859658a57b63615acc795cdf0 100644 --- a/src/test/java/org/olat/selenium/page/repository/RepositoryEditDescriptionPage.java +++ b/src/test/java/org/olat/selenium/page/repository/RepositoryEditDescriptionPage.java @@ -19,7 +19,10 @@ */ package org.olat.selenium.page.repository; +import java.text.DateFormat; +import java.util.Date; import java.util.List; +import java.util.Locale; import org.jboss.arquillian.drone.api.annotation.Drone; import org.jboss.arquillian.graphene.Graphene; @@ -57,6 +60,32 @@ public class RepositoryEditDescriptionPage { return this; } + public RepositoryEditDescriptionPage setLifecycle(Date validFrom, Date validTo, Locale locale) { + //select private + By radioPrivateBy = By.cssSelector(".o_sel_repo_lifecycle_type input[type='radio'][value='private']"); + browser.findElement(radioPrivateBy).click(); + OOGraphene.waitBusy(browser); + + By validFromBy = By.cssSelector(".o_sel_repo_lifecycle_validfrom .o_date_picker input[type='text']"); + DateFormat shortDateFormat = DateFormat.getDateInstance(DateFormat.SHORT, locale); + String validFromStr = shortDateFormat.format(validFrom); + browser.findElement(validFromBy).sendKeys(validFromStr); + + By validToBy = By.cssSelector(".o_sel_repo_lifecycle_validto .o_date_picker input[type='text']"); + String validToStr = shortDateFormat.format(validTo); + browser.findElement(validToBy).sendKeys(validToStr); + + return this; + } + + public RepositoryEditDescriptionPage save() { + By saveBy = By.cssSelector("div.o_sel_repo_save_details button.btn-primary"); + WebElement saveButton = browser.findElement(saveBy); + saveButton.click(); + OOGraphene.waitBusy(browser); + return this; + } + public void clickToolbarBack() { browser.findElement(NavigationPage.toolbarBackBy).click(); OOGraphene.waitBusy(browser);