diff --git a/pom.xml b/pom.xml index d2880dc4c99a0b671c11388183e2aeb4d94137b5..7ee25a80fa6a5599d056447ab9ff70eaeb17e71a 100644 --- a/pom.xml +++ b/pom.xml @@ -1291,8 +1291,8 @@ <configuration> <target> <mkdir dir="${project.build.directory}/downloads" /> - <get src="https://nexus.openolat.org/nexus/content/repositories/openolat/org/apache/tomcat/apache-tomcat-arq/8.0.24/apache-tomcat-arq-8.0.24.zip" dest="${project.build.directory}/downloads" verbose="true" skipexisting="true" /> - <unzip src="${project.build.directory}/downloads/apache-tomcat-arq-8.0.24.zip" dest="${project.build.directory}/arq-apache-tomcat-8.0.24" /> + <get src="https://nexus.openolat.org/nexus/content/repositories/openolat/org/apache/tomcat/apache-tomcat-arq/8.5.45/apache-tomcat-arq-8.5.45.zip" dest="${project.build.directory}/downloads" verbose="true" skipexisting="true" /> + <unzip src="${project.build.directory}/downloads/apache-tomcat-arq-8.5.45.zip" dest="${project.build.directory}/arq-apache-tomcat-8.5.45" /> </target> </configuration> </execution> diff --git a/src/main/java/org/olat/group/ui/run/_i18n/LocalStrings_pt_BR.properties b/src/main/java/org/olat/group/ui/run/_i18n/LocalStrings_pt_BR.properties index eaddb18207b5161a0481d3d9b2f62920a617be2c..f013f1cfa9fd0174a5ac20a72eeac0bc156e0d2f 100644 --- a/src/main/java/org/olat/group/ui/run/_i18n/LocalStrings_pt_BR.properties +++ b/src/main/java/org/olat/group/ui/run/_i18n/LocalStrings_pt_BR.properties @@ -1,4 +1,4 @@ -#Thu Sep 12 21:21:31 CEST 2019 +#Thu Sep 26 19:53:42 CEST 2019 businessgroup.contact.bodytext=<p></p>---<p>Ir imediatamente para o grupo "{0}"\: {1}</p> businessgroup.contact.subject=Mensagem para grupo {0} contact.all.coaches=Todos os treinadores (coaches) de grupo diff --git a/src/main/java/org/olat/modules/adobeconnect/manager/AbstractAdobeConnectProvider.java b/src/main/java/org/olat/modules/adobeconnect/manager/AbstractAdobeConnectProvider.java index da82eec5a190cd2210a9d3f76440b1be5c426fea..0872e22edba6068de4faeef0ab33f64dad4f0424 100644 --- a/src/main/java/org/olat/modules/adobeconnect/manager/AbstractAdobeConnectProvider.java +++ b/src/main/java/org/olat/modules/adobeconnect/manager/AbstractAdobeConnectProvider.java @@ -117,9 +117,10 @@ public abstract class AbstractAdobeConnectProvider implements AdobeConnectSPI { builder.queryParam("source-sco-id", templateId); } if(startDate != null) { - builder - .queryParam("date-begin", formatDate(startDate)) - .queryParam("date-end", formatDate(endDate)); + builder.queryParam("date-begin", formatDate(startDate)); + } + if(endDate != null) { + builder.queryParam("date-end", formatDate(endDate)); } List<AdobeConnectSco> createdScos = sendScoRequest(builder, error); @@ -195,9 +196,10 @@ public abstract class AbstractAdobeConnectProvider implements AdobeConnectSPI { builder.queryParam("source-sco-id", templateId); } if(startDate != null) { - builder - .queryParam("date-begin", formatDate(startDate)) - .queryParam("date-end", formatDate(endDate)); + builder.queryParam("date-begin", formatDate(startDate)); + } + if(endDate != null) { + builder.queryParam("date-end", formatDate(endDate)); } boolean ok = false; diff --git a/src/main/java/org/olat/modules/qpool/ui/admin/QEducationalContextEditController.java b/src/main/java/org/olat/modules/qpool/ui/admin/QEducationalContextEditController.java index 4841b863fa6a73471913ceeba623cf4ec1702814..51263118515b840e61557c981bc4c9126999ba05 100644 --- a/src/main/java/org/olat/modules/qpool/ui/admin/QEducationalContextEditController.java +++ b/src/main/java/org/olat/modules/qpool/ui/admin/QEducationalContextEditController.java @@ -63,8 +63,14 @@ public class QEducationalContextEditController extends FormBasicController { @Override protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) { + formLayout.setElementCssClass("o_sel_edit_level_form"); + String name = itemLevel == null ? "" : itemLevel.getLevel(); nameEl = uifactory.addTextElement("level.level", "level.level", 128, name, formLayout); + nameEl.setElementCssClass("o_sel_level_name"); + if(!StringHelper.containsNonWhitespace(name)) { + nameEl.setFocus(true); + } FormLayoutContainer buttonsCont = FormLayoutContainer.createButtonLayout("buttons", getTranslator()); buttonsCont.setRootForm(mainForm); diff --git a/src/main/java/org/olat/modules/qpool/ui/admin/QEducationalContextsAdminController.java b/src/main/java/org/olat/modules/qpool/ui/admin/QEducationalContextsAdminController.java index 92014e037b5bcbaf2a28ab992e92c28a4768bf75..dcb787aa3f9a4e1fad48ffff481ce36e03cc620d 100644 --- a/src/main/java/org/olat/modules/qpool/ui/admin/QEducationalContextsAdminController.java +++ b/src/main/java/org/olat/modules/qpool/ui/admin/QEducationalContextsAdminController.java @@ -22,7 +22,7 @@ package org.olat.modules.qpool.ui.admin; import java.util.ArrayList; import java.util.List; -import org.olat.core.CoreSpringFactory; +import org.apache.logging.log4j.Level; import org.olat.core.gui.UserRequest; import org.olat.core.gui.components.form.flexible.FormItem; import org.olat.core.gui.components.form.flexible.FormItemContainer; @@ -53,6 +53,7 @@ import org.olat.core.util.i18n.ui.SingleKeyTranslatorController; import org.olat.modules.qpool.QPoolService; import org.olat.modules.qpool.model.QEducationalContext; import org.olat.modules.qpool.ui.QuestionsController; +import org.springframework.beans.factory.annotation.Autowired; /** * @@ -74,12 +75,11 @@ public class QEducationalContextsAdminController extends FormBasicController { private DialogBoxController confirmDeleteCtrl; private SingleKeyTranslatorController singleKeyTrnsCtrl; - private final QPoolService qpoolService; + @Autowired + private QPoolService qpoolService; public QEducationalContextsAdminController(UserRequest ureq, WindowControl wControl) { super(ureq, wControl, null, "levels_admin", Util.createPackageTranslator(QuestionsController.class, ureq.getLocale())); - - qpoolService = CoreSpringFactory.getImpl(QPoolService.class); initForm(ureq); reloadModel(); } @@ -106,6 +106,7 @@ public class QEducationalContextsAdminController extends FormBasicController { tableEl.setCustomizeColumns(false); createType = uifactory.addFormLink("create.level", formLayout, Link.BUTTON); + createType.setElementCssClass("o_sel_add_level"); } private void reloadModel() { @@ -291,7 +292,7 @@ public class QEducationalContextsAdminController extends FormBasicController { case level: return level.getLevel(); case levelI18n: { String i18nKey = "item.level." + level.getLevel().toLowerCase(); - String translation = getTranslator().translate(i18nKey); + String translation = getTranslator().translate(i18nKey, null, Level.OFF); if(i18nKey.equals(translation) || translation.length() > 256) { return level.getLevel(); } diff --git a/src/main/java/org/olat/modules/qpool/ui/metadata/GeneralMetadataEditController.java b/src/main/java/org/olat/modules/qpool/ui/metadata/GeneralMetadataEditController.java index 6c39c37246c451ab7314a6c4d037e4b0938e466b..399917a9bb8a07dc78c5657a4410ffd33191a333 100644 --- a/src/main/java/org/olat/modules/qpool/ui/metadata/GeneralMetadataEditController.java +++ b/src/main/java/org/olat/modules/qpool/ui/metadata/GeneralMetadataEditController.java @@ -95,15 +95,18 @@ public class GeneralMetadataEditController extends FormBasicController { protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) { String topic = item.getTopic(); topicEl = uifactory.addTextElement("general.topic", "general.topic", 1000, topic, formLayout); + topicEl.setElementCssClass("o_sel_qpool_metadata_topic"); taxonomyLevelEl = uifactory.addDropdownSingleselect("general.taxonomy.level", formLayout, new String[0], new String[0]); + taxonomyLevelEl.setElementCssClass("o_sel_qpool_metadata_taxonomy"); buildTaxonomyLevelEl(); taxonomyLevelEl.setVisible(qPoolSecurityCallback.canUseTaxonomy()); KeyValues contexts = MetaUIFactory.getContextKeyValues(getTranslator(), qpoolService); contextEl = uifactory.addDropdownSingleselect("educational.context", "educational.context", formLayout, contexts.getKeys(), contexts.getValues(), null); + contextEl.setElementCssClass("o_sel_qpool_metadata_context"); contextEl.setAllowNoSelection(true); contextEl.setEnabled(contexts.getKeys().length > 0); if (item.getEducationalContext() != null) { @@ -113,26 +116,32 @@ public class GeneralMetadataEditController extends FormBasicController { String keywords = item.getKeywords(); keywordsEl = uifactory.addTextElement("general.keywords", "general.keywords", 1000, keywords, formLayout); + keywordsEl.setElementCssClass("o_sel_qpool_metadata_keywords"); String addInfos = item.getAdditionalInformations(); addInfosEl = uifactory.addTextElement("general.additional.informations", "general.additional.informations", 256, addInfos, formLayout); + addInfosEl.setElementCssClass("o_sel_qpool_metadata_add_infos"); String coverage = item.getCoverage(); coverageEl = uifactory.addTextElement("general.coverage", "general.coverage", 1000, coverage, formLayout); + coverageEl.setElementCssClass("o_sel_qpool_metadata_coverage"); String language = item.getLanguage(); languageEl = uifactory.addTextElement("general.language", "general.language", 10, language, formLayout); + languageEl.setElementCssClass("o_sel_qpool_metadata_language"); KeyValues types = MetaUIFactory.getAssessmentTypes(getTranslator()); assessmentTypeEl = uifactory.addDropdownSingleselect("question.assessmentType", "question.assessmentType", formLayout, types.getKeys(), types.getValues(), null); + assessmentTypeEl.setElementCssClass("o_sel_qpool_metadata_assessment_type"); assessmentTypeEl.setAllowNoSelection(true); if(StringHelper.containsNonWhitespace(item.getAssessmentType())) { assessmentTypeEl.select(item.getAssessmentType(), true); } buttonsCont = FormLayoutContainer.createButtonLayout("buttons", getTranslator()); + buttonsCont.setElementCssClass("o_sel_qpool_metadata_buttons"); buttonsCont.setRootForm(mainForm); formLayout.add(buttonsCont); uifactory.addFormSubmitButton("ok", "ok", buttonsCont); diff --git a/src/main/java/org/olat/modules/qpool/ui/metadata/MetaUIFactory.java b/src/main/java/org/olat/modules/qpool/ui/metadata/MetaUIFactory.java index 05ad034cadad9de6ae87c406de6e61029ecfaafb..5ff6422863359a99a910bfde4f5ef48420db6a69 100644 --- a/src/main/java/org/olat/modules/qpool/ui/metadata/MetaUIFactory.java +++ b/src/main/java/org/olat/modules/qpool/ui/metadata/MetaUIFactory.java @@ -23,6 +23,7 @@ import java.math.BigDecimal; import java.util.ArrayList; import java.util.List; +import org.apache.logging.log4j.Level; import org.olat.core.gui.components.form.flexible.elements.SingleSelection; import org.olat.core.gui.components.form.flexible.elements.TextElement; import org.olat.core.gui.translator.Translator; @@ -77,7 +78,7 @@ public class MetaUIFactory { for(QEducationalContext level:levels) { contextKeys[count] = level.getKey().toString(); String i18nKey = "item.level." + level.getLevel().toLowerCase(); - String translation = translator.translate(i18nKey); + String translation = translator.translate(i18nKey, null, Level.OFF); if(i18nKey.equals(translation) || translation.length() > 256) { translation = level.getLevel(); } diff --git a/src/main/java/org/olat/modules/qpool/ui/metadata/_content/item_metadatas.html b/src/main/java/org/olat/modules/qpool/ui/metadata/_content/item_metadatas.html index 511bd2a9d88774f8c7caa7741eec708208704f63..684084465a8352fa9995578cb3715cc7cf267200 100644 --- a/src/main/java/org/olat/modules/qpool/ui/metadata/_content/item_metadatas.html +++ b/src/main/java/org/olat/modules/qpool/ui/metadata/_content/item_metadatas.html @@ -1,5 +1,5 @@ <div class="panel-group" id="accordion"> - <div class="panel panel-default"> + <div class="panel panel-default o_sel_qpool_metadata_general"> <div class="panel-heading"> <h4 class="panel-title"> <i id="collapseGeneralToggler" class="o_icon o_icon-fw #if($inGeneral) o_icon_close_togglebox #else o_icon_open_togglebox #end"> </i> @@ -14,15 +14,13 @@ </div> </div> <script> - /* <![CDATA[ */ - jQuery('#general').on('hide.bs.collapse', function () { - jQuery('#collapseGeneralToggler').removeClass('o_icon_close_togglebox').addClass('o_icon_open_togglebox'); - }) - jQuery('#general').on('show.bs.collapse', function () { - jQuery('#collapseGeneralToggler').removeClass('o_icon_open_togglebox').addClass('o_icon_close_togglebox'); - $r.backgroundCommand("show","panel","general") - }) - /* ]]> */ + jQuery('#general').on('hide.bs.collapse', function () { + jQuery('#collapseGeneralToggler').removeClass('o_icon_close_togglebox').addClass('o_icon_open_togglebox'); + }) + jQuery('#general').on('show.bs.collapse', function () { + jQuery('#collapseGeneralToggler').removeClass('o_icon_open_togglebox').addClass('o_icon_close_togglebox'); + $r.backgroundCommand("show","panel","general") + }) </script> </div> <div class="panel panel-default"> diff --git a/src/main/java/org/olat/modules/vitero/manager/ViteroManager.java b/src/main/java/org/olat/modules/vitero/manager/ViteroManager.java index 08893cf590e467082dc07a3539876ccd9ac5efea..8d7c7f8fdd0e3e5cddf0be9d404d5edcff3547d4 100644 --- a/src/main/java/org/olat/modules/vitero/manager/ViteroManager.java +++ b/src/main/java/org/olat/modules/vitero/manager/ViteroManager.java @@ -231,10 +231,7 @@ public class ViteroManager implements UserDataDeletable { cal.add(Calendar.MINUTE, booking.getEndBuffer()); Date end = cal.getTime(); - if(start.before(now) && end.after(now)) { - return true; - } - return false; + return(start.before(now) && end.after(now)); } public String getURLToBooking(Identity identity, ViteroBooking booking) @@ -1039,6 +1036,8 @@ public class ViteroManager implements UserDataDeletable { booking.setEnd(cal.getTime()); booking.setEndBuffer(15); + booking.setInspire(viteroModule.isInspire()); + List<Integer> roomSizes = getLicencedRoomSizes(); if(!roomSizes.isEmpty()) { booking.setRoomSize(roomSizes.get(0)); @@ -1304,7 +1303,7 @@ public class ViteroManager implements UserDataDeletable { throws VmsNotAvailableException { ViteroBooking booking = null; List<Property> properties = propertyManager.listProperties(null, group, ores, VMS_CATEGORY, Integer.toString(bookingId)); - if(properties.size() > 0) { + if(!properties.isEmpty()) { Property property = properties.get(0); String propIdentifier = property.getStringValue(); if((propIdentifier == null || subIdentifier == null) @@ -1388,7 +1387,7 @@ public class ViteroManager implements UserDataDeletable { //check if vms user with an openolat login exists on vms server //without the need authentication object in openolat. List<Usertype> users = getCustomersUsers(); - if(users != null && users.size() > 0) { + if(users != null && !users.isEmpty()) { for(Usertype user:users) { String vmsUsername = user.getUsername(); if(vmsUsername.startsWith(prefix)) { @@ -1549,7 +1548,7 @@ public class ViteroManager implements UserDataDeletable { private final List<ViteroBooking> convert(List<Booking_Type> bookings) { List<ViteroBooking> viteroBookings = new ArrayList<>(); - if(bookings != null && bookings.size() > 0) { + if(bookings != null && !bookings.isEmpty()) { for(Booking_Type b:bookings) { viteroBookings.add(convert(b)); } @@ -1574,6 +1573,7 @@ public class ViteroManager implements UserDataDeletable { vb.setStartBuffer(booking.getStartbuffer()); vb.setEnd(parse(booking.getEnd())); vb.setEndBuffer(booking.getEndbuffer()); + vb.setInspire(booking.isInspire()); return vb; } diff --git a/src/main/java/org/olat/modules/vitero/model/ViteroBooking.java b/src/main/java/org/olat/modules/vitero/model/ViteroBooking.java index 8d6b73a537a3ad868604138e36fd24c8a0d99209..9d18d639a32aac5b9494395f133ff8d4db7f7fa0 100644 --- a/src/main/java/org/olat/modules/vitero/model/ViteroBooking.java +++ b/src/main/java/org/olat/modules/vitero/model/ViteroBooking.java @@ -45,6 +45,7 @@ public class ViteroBooking { private int endBuffer; private int roomSize; private boolean autoSignIn; + private boolean inspire; private String timeZoneId; private String resourceName; @@ -167,4 +168,12 @@ public class ViteroBooking { public void setAutoSignIn(boolean autoSignIn) { this.autoSignIn = autoSignIn; } + + public boolean isInspire() { + return inspire; + } + + public void setInspire(boolean inspire) { + this.inspire = inspire; + } } \ No newline at end of file diff --git a/src/main/java/org/olat/modules/vitero/restapi/ViteroBookingVO.java b/src/main/java/org/olat/modules/vitero/restapi/ViteroBookingVO.java index cf98ffbd2e0aabda92aff271bc38c003840849a7..f4a0286b5d0ab5726ba882072c73e0590f318d8c 100644 --- a/src/main/java/org/olat/modules/vitero/restapi/ViteroBookingVO.java +++ b/src/main/java/org/olat/modules/vitero/restapi/ViteroBookingVO.java @@ -47,6 +47,7 @@ public class ViteroBookingVO { private Date end; private int endBuffer; private int roomSize; + private boolean inspire; private boolean autoSignIn; private String timeZoneId; @@ -66,6 +67,7 @@ public class ViteroBookingVO { endBuffer = booking.getEndBuffer(); roomSize = booking.getRoomSize(); autoSignIn = booking.isAutoSignIn(); + inspire = booking.isInspire(); timeZoneId = booking.getTimeZoneId(); } @@ -157,6 +159,14 @@ public class ViteroBookingVO { this.autoSignIn = autoSignIn; } + public boolean isInspire() { + return inspire; + } + + public void setInspire(boolean inspire) { + this.inspire = inspire; + } + public String getTimeZoneId() { return timeZoneId; } diff --git a/src/main/java/org/olat/modules/vitero/restapi/ViteroBookingWebService.java b/src/main/java/org/olat/modules/vitero/restapi/ViteroBookingWebService.java index 1c9f4fd5b300a990965a809749f200de1bf9003f..c2375092a8fae5a0492533fd10a5f5bccb6cc0b3 100644 --- a/src/main/java/org/olat/modules/vitero/restapi/ViteroBookingWebService.java +++ b/src/main/java/org/olat/modules/vitero/restapi/ViteroBookingWebService.java @@ -190,6 +190,7 @@ public class ViteroBookingWebService { vBooking.setEndBuffer(booking.getEndBuffer()); vBooking.setRoomSize(booking.getRoomSize()); vBooking.setAutoSignIn(booking.isAutoSignIn()); + vBooking.setInspire(booking.isInspire()); vBooking.setTimeZoneId(viteroModule.getTimeZoneId()); ViteroStatus status; diff --git a/src/main/java/org/olat/modules/vitero/ui/ViteroAdminBookingRawInfosController.java b/src/main/java/org/olat/modules/vitero/ui/ViteroAdminBookingRawInfosController.java index e96c6b0c8b972e05ed1f2b28b7925d43aec3e823..ca004684a787c9634aa1331d51569212a1f9b276 100644 --- a/src/main/java/org/olat/modules/vitero/ui/ViteroAdminBookingRawInfosController.java +++ b/src/main/java/org/olat/modules/vitero/ui/ViteroAdminBookingRawInfosController.java @@ -26,8 +26,10 @@ import org.olat.core.gui.components.form.flexible.impl.FormBasicController; import org.olat.core.gui.control.Controller; import org.olat.core.gui.control.WindowControl; import org.olat.core.util.Formatter; +import org.olat.modules.vitero.ViteroModule; import org.olat.modules.vitero.model.ViteroBooking; import org.olat.modules.vitero.model.ViteroGroup; +import org.springframework.beans.factory.annotation.Autowired; /** * @@ -43,18 +45,18 @@ public class ViteroAdminBookingRawInfosController extends FormBasicController { private final ViteroGroup group; private final ViteroBooking booking; private final Formatter formatter; - private static final String[] autoSignInKeys = new String[]{"on"}; - private final String[] autoSignInValues; + private static final String[] onKeys = new String[]{"on"}; + + + @Autowired + private ViteroModule viteroModule; public ViteroAdminBookingRawInfosController(UserRequest ureq, WindowControl wControl, ViteroBooking booking, ViteroGroup group) { super(ureq, wControl); - this.group = group; this.booking = booking; - this.formatter = Formatter.getInstance(getLocale()); - autoSignInValues = new String[]{ translate("enabled") }; - + formatter = Formatter.getInstance(getLocale()); initForm(ureq); } @@ -75,10 +77,18 @@ public class ViteroAdminBookingRawInfosController extends FormBasicController { name = name.substring(0, sepIndex); } uifactory.addStaticTextElement("group.name", name, formLayout); + + String[] enabledValues = new String[]{translate("enabled")}; + MultipleSelectionElement inspireEl = uifactory.addCheckboxesHorizontal("option.inspire", formLayout, onKeys, enabledValues); + inspireEl.setVisible(viteroModule.isInspire()); + if(viteroModule.isInspire() && booking.isInspire()) { + inspireEl.select(onKeys[0], true); + } + inspireEl.setEnabled(false); - MultipleSelectionElement autoSignIn = uifactory.addCheckboxesHorizontal("booking.autoSignIn", formLayout, autoSignInKeys, autoSignInValues); + MultipleSelectionElement autoSignIn = uifactory.addCheckboxesHorizontal("booking.autoSignIn", formLayout, onKeys, enabledValues); if(booking.isAutoSignIn()) { - autoSignIn.select(autoSignInKeys[0], true); + autoSignIn.select(onKeys[0], true); } autoSignIn.setEnabled(false); } diff --git a/src/main/java/org/olat/modules/vitero/ui/ViteroBookingEditController.java b/src/main/java/org/olat/modules/vitero/ui/ViteroBookingEditController.java index 18486e0684bd55dccf84a07414bdd71d374f7f2a..613de8b13423b30f9b644ee96c8987c6a721bf33 100644 --- a/src/main/java/org/olat/modules/vitero/ui/ViteroBookingEditController.java +++ b/src/main/java/org/olat/modules/vitero/ui/ViteroBookingEditController.java @@ -23,7 +23,6 @@ import java.util.Collections; import java.util.Date; import java.util.List; -import org.olat.core.CoreSpringFactory; import org.olat.core.gui.UserRequest; import org.olat.core.gui.components.form.flexible.FormItemContainer; import org.olat.core.gui.components.form.flexible.elements.DateChooser; @@ -39,10 +38,12 @@ import org.olat.core.helpers.Settings; import org.olat.core.id.OLATResourceable; import org.olat.core.util.StringHelper; import org.olat.group.BusinessGroup; +import org.olat.modules.vitero.ViteroModule; import org.olat.modules.vitero.manager.ViteroManager; import org.olat.modules.vitero.manager.VmsNotAvailableException; import org.olat.modules.vitero.model.ViteroBooking; import org.olat.modules.vitero.model.ViteroStatus; +import org.springframework.beans.factory.annotation.Autowired; /** * @@ -54,14 +55,17 @@ import org.olat.modules.vitero.model.ViteroStatus; * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com */ public class ViteroBookingEditController extends FormBasicController { + + private static final String[] enabledKeys = new String[]{"on"}; + private TextElement groupName; private DateChooser beginChooser; private DateChooser endChooser; private SingleSelection beginBufferEl; private SingleSelection endBufferEl; private SingleSelection roomSizeEl; - + private MultipleSelectionElement inspireEl; private MultipleSelectionElement autoSignIn; private static final String[] bufferKeys = new String[]{"0", "15", "30", "45", "60"}; @@ -74,7 +78,11 @@ public class ViteroBookingEditController extends FormBasicController { private final OLATResourceable ores; private final String subIdentifier; private final ViteroBooking booking; - private final ViteroManager viteroManager; + + @Autowired + private ViteroModule viteroModule; + @Autowired + private ViteroManager viteroManager; public ViteroBookingEditController(UserRequest ureq, WindowControl wControl, BusinessGroup group, OLATResourceable ores, String subIdentifier, ViteroBooking booking) { @@ -84,7 +92,6 @@ public class ViteroBookingEditController extends FormBasicController { this.ores = ores; this.subIdentifier = subIdentifier; this.booking = booking; - viteroManager = (ViteroManager)CoreSpringFactory.getBean("viteroManager"); List<Integer> sizes; try { @@ -156,6 +163,14 @@ public class ViteroBookingEditController extends FormBasicController { } roomSizeEl.setEnabled(editable); + String[] enabledValues = new String[]{translate("enabled")}; + inspireEl = uifactory.addCheckboxesHorizontal("option.inspire", formLayout, enabledKeys, enabledValues); + inspireEl.setVisible(viteroModule.isInspire()); + if(viteroModule.isInspire() && booking.isInspire()) { + inspireEl.select(enabledKeys[0], true); + } + inspireEl.setEnabled(editable); + autoSignIn = uifactory.addCheckboxesHorizontal("booking.autoSignIn", formLayout, autoSignInKeys, autoSignInValues); if(booking.isAutoSignIn()) { autoSignIn.select(autoSignInKeys[0], true); @@ -188,7 +203,7 @@ public class ViteroBookingEditController extends FormBasicController { @Override protected boolean validateFormLogic(UserRequest ureq) { - boolean allOk = true; + boolean allOk = super.validateFormLogic(ureq); String name = groupName.getValue(); groupName.clearError(); @@ -207,10 +222,10 @@ public class ViteroBookingEditController extends FormBasicController { beginChooser.clearError(); if(begin == null) { beginChooser.setErrorKey("form.legende.mandatory", null); - allOk = false; + allOk &= false; } else if(new Date().after(begin)) { beginChooser.setErrorKey("error.bookingInPast", null); - allOk = false; + allOk &= false; } } @@ -219,13 +234,10 @@ public class ViteroBookingEditController extends FormBasicController { endChooser.clearError(); if(end == null) { endChooser.setErrorKey("form.legende.mandatory", null); - allOk = false; - } else if(new Date().after(begin)) { - beginChooser.setErrorKey("error.bookingInPast", null); - allOk = false; - } else if(end.before(begin)) { + allOk &= false; + } else if(new Date().after(begin) || end.before(begin)) { beginChooser.setErrorKey("error.bookingInPast", null); - allOk = false; + allOk &= false; } } @@ -235,7 +247,7 @@ public class ViteroBookingEditController extends FormBasicController { allOk = false; } - return allOk && super.validateFormLogic(ureq); + return allOk; } @Override @@ -270,6 +282,9 @@ public class ViteroBookingEditController extends FormBasicController { boolean auto = autoSignIn.isMultiselect() && autoSignIn.isSelected(0); booking.setAutoSignIn(auto); + boolean inspire = inspireEl.isVisible() && inspireEl.isAtLeastSelected(1); + booking.setInspire(inspire); + try { if(booking.getBookingId() >= 0) { ViteroBooking updatedBooking = viteroManager.updateBooking(group, ores, subIdentifier, booking); diff --git a/src/test/java/org/olat/selenium/CourseElementTest.java b/src/test/java/org/olat/selenium/CourseElementTest.java index ac0ca70b6022247b23a287fe7d3cc36e8e514eaa..bea8a6a3159e3de47173fd2f8fcf5ceb2bf5e21a 100644 --- a/src/test/java/org/olat/selenium/CourseElementTest.java +++ b/src/test/java/org/olat/selenium/CourseElementTest.java @@ -149,9 +149,10 @@ public class CourseElementTest extends Deployments { //check that the default title of CP (Lorem Ipsum) is visible in the iframe By iframe = By.cssSelector("div.o_iframedisplay>iframe"); OOGraphene.waitElement(iframe, browser); + OOGraphene.waitingALittleBit(); WebElement cpIframe = browser.findElement(iframe); browser.switchTo().frame(cpIframe); - browser.findElement(By.xpath("//h2[text()='Lorem Ipsum']")); + OOGraphene.waitElement(By.xpath("//h2[text()='Lorem Ipsum']"), browser); } /** diff --git a/src/test/java/org/olat/selenium/QuestionPoolTest.java b/src/test/java/org/olat/selenium/QuestionPoolTest.java index 7308baef78400d9252ffa3d8fd286cbb8d00c08f..79db4b7321e76598fb9c09ea51054b6f3824aaad 100644 --- a/src/test/java/org/olat/selenium/QuestionPoolTest.java +++ b/src/test/java/org/olat/selenium/QuestionPoolTest.java @@ -172,5 +172,78 @@ public class QuestionPoolTest extends Deployments { .selectMyQuestions() .assertFinalQuestionInList(questionTitle); } + + /** + * An author create a QTI 2.1 question, a multiple choice, + * and fill the general metadata. Go back in list and check + * the metadata are there. + * + * @param loginPage + * @throws IOException + * @throws URISyntaxException + */ + @Test + @RunAsClient + public void questionPoolGeneralMetadata() + throws IOException, URISyntaxException { + // prepare taxonomy + LoginPage loginPage = LoginPage.load(browser, deploymentUrl); + loginPage + .loginAs("administrator", "openolat") + .resume(); + AdministrationPage administration = NavigationPage.load(browser) + .openAdministration(); + // add a level + administration + .openQuestionPool() + .selectLevels() + .addLevel("Primary School") + .assertLevelInList("Primary School"); + // configure the taxonomy + administration + .openTaxonomy() + .selectTaxonomy("QPOOL") + .assertOnMetadata() + .selectTaxonomyTree() + .atLeastOneLevel("one-fore-question-pool", "One for question pool"); + + new UserToolsPage(browser).logout(); + + // The author create a new question with metadata + UserVO author = new UserRestClient(deploymentUrl).createAuthor("Lili"); + + loginPage = LoginPage.load(browser, deploymentUrl); + loginPage + .loginAs(author.getLogin(), author.getPassword()) + .resume(); + + String questionTitle = "MetaMC-" + UUID.randomUUID(); + NavigationPage navBar = NavigationPage.load(browser); + QuestionPoolPage questionPool = navBar.assertOnNavigationPage() + .openQuestionPool(); + questionPool + .selectMyQuestions() + .newQuestion(questionTitle, QTI21QuestionType.mc) + .metadata().openGeneral() + .setGeneralMetadata("New topic", "One for question pool", "Primary School", + "Interessant", "Add. infos", "Wide coverage", "formative") + .saveGeneralMetadata(); + + questionPool + .clickToolbarBack() + .assertQuestionInList(questionTitle, QTI21QuestionType.mc.name()) + .openQuickView(questionTitle) + .metadata() + .openGeneral() + .assertTopic("New topic") + .assertTaxonomy("One for question pool") + .assertLevel("Primary School") + .assertKeywords("Interessant") + .assertAdditionalInfos("Add. infos") + .assertCoverage("Wide coverage") + .assertAssessmentType("formative"); + + // open quick view + } } diff --git a/src/test/java/org/olat/selenium/page/course/LTIPage.java b/src/test/java/org/olat/selenium/page/course/LTIPage.java index cd9b3e7acb468e2889c598e9252a45c2c4dcc083..5d0fe3f686bb2f8f8f0a8811323d4c2ff629bb1c 100644 --- a/src/test/java/org/olat/selenium/page/course/LTIPage.java +++ b/src/test/java/org/olat/selenium/page/course/LTIPage.java @@ -53,13 +53,14 @@ public class LTIPage { By iframeBy = By.cssSelector(".o_iframedisplay iframe"); OOGraphene.waitElement(iframeBy, browser); - WebElement iframe = browser.findElement(iframeBy); - WebDriver iframeBrowser = browser.switchTo().frame(iframe); - + List<WebElement> iframes = browser.findElements(iframeBy); + browser = browser.switchTo().frame(iframes.get(0)); + By launchedBy = By.xpath("//p[contains(text(),'Launch Validated.')]"); - OOGraphene.waitElement(launchedBy, iframeBrowser); + OOGraphene.waitElement(launchedBy, browser); } catch (Exception e) { - OOGraphene.takeScreenshot("LTIPage::start", browser); + OOGraphene.takeScreenshot("LTIPage_start", browser); + throw e; } return this; diff --git a/src/test/java/org/olat/selenium/page/qpool/QuestionMetadataPage.java b/src/test/java/org/olat/selenium/page/qpool/QuestionMetadataPage.java new file mode 100644 index 0000000000000000000000000000000000000000..a4afd85f38e991fefce27ad5a040ac13611e49af --- /dev/null +++ b/src/test/java/org/olat/selenium/page/qpool/QuestionMetadataPage.java @@ -0,0 +1,149 @@ +/** + * <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.qpool; + +import org.olat.selenium.page.graphene.OOGraphene; +import org.openqa.selenium.By; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.support.ui.Select; + +/** + * + * Initial date: 23 sept. 2019<br> + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + * + */ +public class QuestionMetadataPage { + + private final WebDriver browser; + + private QuestionMetadataPage(WebDriver browser) { + this.browser = browser; + } + + public static QuestionMetadataPage getPage(WebDriver browser) { + return new QuestionMetadataPage(browser); + } + + public QuestionMetadataPage openGeneral() { + By hrefBy = By.cssSelector("div.o_sel_qpool_metadata_general>div>h4>a"); + OOGraphene.waitElement(hrefBy, browser); + browser.findElement(hrefBy).click(); + OOGraphene.waitingALittleLonger();// wait the accordion opens up + + By generalMetadata = By.cssSelector("div.o_sel_qpool_metadata_general div.panel-body fieldset.o_form"); + OOGraphene.waitElement(generalMetadata, browser); + + return this; + } + + public QuestionMetadataPage setGeneralMetadata(String topic, String taxonomy, String level, + String keywords, String additionalInfos, String coverage, String assessmentType) { + if(topic != null) { + By topicBy = By.cssSelector("div.o_sel_qpool_metadata_topic input[type='text']"); + browser.findElement(topicBy).sendKeys(topic); + } + + if(taxonomy != null) { + By taxonomyBy = By.cssSelector("div.o_sel_qpool_metadata_taxonomy select"); + new Select(browser.findElement(taxonomyBy)).selectByVisibleText(taxonomy); + } + + if(level != null) { + By levelBy = By.cssSelector("div.o_sel_qpool_metadata_context select"); + new Select(browser.findElement(levelBy)).selectByVisibleText(level); + } + + if(keywords != null) { + By keywordsBy = By.cssSelector("div.o_sel_qpool_metadata_keywords input[type='text']"); + browser.findElement(keywordsBy).sendKeys(keywords); + } + + if(additionalInfos != null) { + By additionalInfosBy = By.cssSelector("div.o_sel_qpool_metadata_add_infos input[type='text']"); + browser.findElement(additionalInfosBy).sendKeys(additionalInfos); + } + + if(coverage != null) { + By coverageBy = By.cssSelector("div.o_sel_qpool_metadata_coverage input[type='text']"); + browser.findElement(coverageBy).sendKeys(coverage); + } + + if(assessmentType != null) { + By assessmentTypeBy = By.cssSelector("div.o_sel_qpool_metadata_assessment_type select"); + new Select(browser.findElement(assessmentTypeBy)).selectByValue(assessmentType); + } + return this; + } + + public QuestionMetadataPage assertTopic(String topic) { + By topicBy = By.xpath("//div[contains(@class,'o_sel_qpool_metadata_topic')]//input[@value='" + topic + "']"); + OOGraphene.waitElement(topicBy, browser); + return this; + } + + public QuestionMetadataPage assertTaxonomy(String taxonomy) { + By taxonomyBy = By.xpath("//div[contains(@class,'o_sel_qpool_metadata_taxonomy')]//select/option[@selected='selected'][text()[contains(.,'" + taxonomy + "')]]"); + OOGraphene.waitElement(taxonomyBy, browser); + return this; + } + + public QuestionMetadataPage assertLevel(String level) { + By levelBy = By.xpath("//div[contains(@class,'o_sel_qpool_metadata_context')]//select/option[@selected='selected'][text()[contains(.,'" + level + "')]]"); + OOGraphene.waitElement(levelBy, browser); + return this; + } + + public QuestionMetadataPage assertKeywords(String keywords) { + By keywordsBy = By.xpath("//div[contains(@class,'o_sel_qpool_metadata_keywords')]//input[@value='" + keywords + "']"); + OOGraphene.waitElement(keywordsBy, browser); + return this; + } + + public QuestionMetadataPage assertCoverage(String coverage) { + By coverageBy = By.xpath("//div[contains(@class,'o_sel_qpool_metadata_coverage')]//input[@value='" + coverage + "']"); + OOGraphene.waitElement(coverageBy, browser); + return this; + } + + public QuestionMetadataPage assertAdditionalInfos(String infos) { + By infosBy = By.xpath("//div[contains(@class,'o_sel_qpool_metadata_add_infos')]//input[@value='" + infos + "']"); + OOGraphene.waitElement(infosBy, browser); + return this; + } + + public QuestionMetadataPage assertAssessmentType(String assessmentType) { + By assessmentTypeBy = By.xpath("//div[contains(@class,'o_sel_qpool_metadata_assessment_type')]//select/option[@selected='selected'][@value='" + assessmentType + "']"); + OOGraphene.waitElement(assessmentTypeBy, browser); + return this; + } + + public QuestionMetadataPage saveGeneralMetadata() { + By buttonsBy = By.cssSelector("div.o_sel_qpool_metadata_general div.panel-body div.o_sel_qpool_metadata_buttons"); + OOGraphene.moveTo(buttonsBy, browser); + + By saveBy = By.cssSelector("div.o_sel_qpool_metadata_general div.panel-body div.o_sel_qpool_metadata_buttons button.btn.btn-primary"); + browser.findElement(saveBy).click(); + OOGraphene.waitBusy(browser); + OOGraphene.moveTop(browser); + return this; + } + +} diff --git a/src/test/java/org/olat/selenium/page/qpool/QuestionPoolAdminPage.java b/src/test/java/org/olat/selenium/page/qpool/QuestionPoolAdminPage.java index 5f2685ff06d5be90351ee31a6c301342f07aee29..53df103693521dffd656764a057a9b842eda4732 100644 --- a/src/test/java/org/olat/selenium/page/qpool/QuestionPoolAdminPage.java +++ b/src/test/java/org/olat/selenium/page/qpool/QuestionPoolAdminPage.java @@ -93,4 +93,35 @@ public class QuestionPoolAdminPage { return this; } + public QuestionPoolAdminPage selectLevels() { + By levelsBy = By.xpath("//div[contains(@class,'o_segments')]/a[contains(@onclick,'segment.educational.context')]"); + OOGraphene.waitElement(levelsBy, browser); + browser.findElement(levelsBy).click(); + return this; + } + + public QuestionPoolAdminPage addLevel(String name) { + By addLevelBy = By.cssSelector("a.btn.o_sel_add_level"); + OOGraphene.waitElement(addLevelBy, browser); + browser.findElement(addLevelBy).click(); + + OOGraphene.waitModalDialog(browser); + + By nameBy = By.cssSelector("fieldset.o_sel_edit_level_form div.o_sel_level_name input[type='text']"); + OOGraphene.waitElement(nameBy, browser); + browser.findElement(nameBy).sendKeys(name); + + By saveBy = By.cssSelector("fieldset.o_sel_edit_level_form button.btn.btn-primary"); + browser.findElement(saveBy).click(); + OOGraphene.waitBusy(browser); + OOGraphene.waitModalDialogDisappears(browser); + return this; + } + + public QuestionPoolAdminPage assertLevelInList(String level) { + By levelBy = By.xpath("//div[contains(@class,'o_table_flexi')]/table//td[text()[contains(.,'" + level + "')]]"); + OOGraphene.waitElement(levelBy, browser); + return this; + } + } diff --git a/src/test/java/org/olat/selenium/page/qpool/QuestionPoolPage.java b/src/test/java/org/olat/selenium/page/qpool/QuestionPoolPage.java index a764502254955e190e170bcc8719d6b3257e8318..7c0dee97eb94c36ace5d04c4272088e24b889df4 100644 --- a/src/test/java/org/olat/selenium/page/qpool/QuestionPoolPage.java +++ b/src/test/java/org/olat/selenium/page/qpool/QuestionPoolPage.java @@ -130,6 +130,13 @@ public class QuestionPoolPage { return this; } + /** + * @return Access to the metadata panel + */ + public QuestionMetadataPage metadata() { + return QuestionMetadataPage.getPage(browser); + } + /** * Start the process, confirm with the first taxonomy level found. * @@ -156,6 +163,16 @@ public class QuestionPoolPage { return this; } + public QuestionPoolPage openQuickView(String title) { + By quickViewBy = By.xpath("//div[contains(@class,'o_table_flexi')]//tr[td[text()[contains(.,'" + title + "')]]]/td/a[contains(@href,'quick-view')]"); + OOGraphene.waitElement(quickViewBy, browser); + browser.findElement(quickViewBy).click(); + + By viewBy = By.cssSelector("tr.o_table_row_details>td #o_qti_container"); + OOGraphene.waitElement(viewBy, browser); + return this; + } + /** * Check if the mark "Final" is visible in the toolbar. * diff --git a/src/test/java/org/olat/selenium/page/taxonomy/TaxonomyTreePage.java b/src/test/java/org/olat/selenium/page/taxonomy/TaxonomyTreePage.java index 38ad98939fb8d4fe9ff25d5e781c03344fab55ac..0de339b030cec70467562046755d19d2dba11849 100644 --- a/src/test/java/org/olat/selenium/page/taxonomy/TaxonomyTreePage.java +++ b/src/test/java/org/olat/selenium/page/taxonomy/TaxonomyTreePage.java @@ -55,7 +55,7 @@ public class TaxonomyTreePage { By tableTreeBy = By.cssSelector("div.o_sel_taxonomy_levels_tree div.o_table_flexi_breadcrumb"); OOGraphene.waitElement(tableTreeBy, browser); - By tableBy = By.xpath("//div[contains(@class,'o_sel_taxonomy_levels_tree')]//table//tr/td[text()[contains(.,'" + identifier + "')]]"); + By tableBy = By.xpath("//div[contains(@class,'o_taxonomy_level_listing')]//table//tr/td/a[text()[contains(.,'" + identifier + "')]]"); List<WebElement> tableEls = browser.findElements(tableBy); if(tableEls.isEmpty()) { newLevel(identifier, name); diff --git a/src/test/resources/arquillian.xml b/src/test/resources/arquillian.xml index 570750e8694d11e661e5de11e817290ecdc04be9..650be96dfb0516720fe2b588354559b9844fe879 100644 --- a/src/test/resources/arquillian.xml +++ b/src/test/resources/arquillian.xml @@ -13,8 +13,8 @@ <container qualifier="tomcat-7-managed" default="true"> <configuration> <property name="workDir">target/arquillianDeployments</property> - <property name="catalinaHome">target/arq-apache-tomcat-8.0.24</property> - <property name="catalinaBase">target/arq-apache-tomcat-8.0.24</property> + <property name="catalinaHome">target/arq-apache-tomcat-8.5.45</property> + <property name="catalinaBase">target/arq-apache-tomcat-8.5.45</property> <property name="javaVmArguments">-Xmx512m -Xms256m -Djava.awt.headless=true</property> <!-- debugging arguments for javaVm: -Xrunjdwp:transport=dt_socket,address=8787,server=y,suspend=y --> </configuration>