Skip to content
Snippets Groups Projects
Commit 8768598c authored by srosse's avatar srosse
Browse files

OO-2636: wording and ui enhancements

parent e2e85561
No related branches found
No related tags found
No related merge requests found
Showing
with 192 additions and 65 deletions
......@@ -85,9 +85,10 @@ public class EditLectureBlockController extends FormBasicController {
private TextElement descriptionEl;
private TextElement preparationEl;
private AutoCompleter locationEl;
private DateChooser startDateEl;
private DateChooser dateEl;
private SingleSelection plannedLecturesEl;
private TextElement endHourEl, endMinuteEl;
private TextElement startHourEl, startMinuteEl;
private MultipleSelectionElement groupsEl, teacherEl, compulsoryEl;
private RepositoryEntry entry;
......@@ -241,17 +242,26 @@ public class EditLectureBlockController extends FormBasicController {
locationEl.setMinLength(1);
Date startDate = lectureBlock == null ? null : lectureBlock.getStartDate();
startDateEl = uifactory.addDateChooser("lecture.start", startDate, formLayout);
startDateEl.setEnabled(!lectureManagementManaged && !LectureBlockManagedFlag.isManaged(lectureBlock, LectureBlockManagedFlag.dates));
startDateEl.setDomReplacementWrapperRequired(false);
startDateEl.setDateChooserTimeEnabled(true);
startDateEl.setMandatory(true);
dateEl = uifactory.addDateChooser("lecture.date", startDate, formLayout);
dateEl.setEnabled(!lectureManagementManaged && !LectureBlockManagedFlag.isManaged(lectureBlock, LectureBlockManagedFlag.dates));
dateEl.setDomReplacementWrapperRequired(false);
dateEl.setMandatory(true);
String datePage = velocity_root + "/date_start_end.html";
FormLayoutContainer dateCont = FormLayoutContainer.createCustomFormLayout("start_end", getTranslator(), datePage);
dateCont.setLabel("lecture.end", null);
dateCont.setLabel("lecture.time", null);
formLayout.add(dateCont);
startHourEl = uifactory.addTextElement("lecture.start.hour", null, 2, "", dateCont);
startHourEl.setEnabled(!lectureManagementManaged && !LectureBlockManagedFlag.isManaged(lectureBlock, LectureBlockManagedFlag.dates));
startHourEl.setDomReplacementWrapperRequired(false);
startHourEl.setDisplaySize(2);
startHourEl.setMandatory(true);
startMinuteEl = uifactory.addTextElement("lecture.start.minute", null, 2, "", dateCont);
startMinuteEl.setEnabled(!lectureManagementManaged && !LectureBlockManagedFlag.isManaged(lectureBlock, LectureBlockManagedFlag.dates));
startMinuteEl.setDomReplacementWrapperRequired(false);
startMinuteEl.setDisplaySize(2);
endHourEl = uifactory.addTextElement("lecture.end.hour", null, 2, "", dateCont);
endHourEl.setEnabled(!lectureManagementManaged && !LectureBlockManagedFlag.isManaged(lectureBlock, LectureBlockManagedFlag.dates));
endHourEl.setDomReplacementWrapperRequired(false);
......@@ -261,17 +271,23 @@ public class EditLectureBlockController extends FormBasicController {
endMinuteEl.setEnabled(!lectureManagementManaged && !LectureBlockManagedFlag.isManaged(lectureBlock, LectureBlockManagedFlag.dates));
endMinuteEl.setDomReplacementWrapperRequired(false);
endMinuteEl.setDisplaySize(2);
if(lectureBlock != null && lectureBlock.getEndDate() != null) {
if(lectureBlock != null) {
Calendar cal = Calendar.getInstance();
cal.setTime(lectureBlock.getEndDate());
int hour = cal.get(Calendar.HOUR_OF_DAY);
int minute = cal.get(Calendar.MINUTE);
endHourEl.setValue(Integer.toString(hour));
endMinuteEl.setValue(Integer.toString(minute));
} else {
endHourEl.setValue("00");
endMinuteEl.setValue("00");
if(lectureBlock.getStartDate() != null) {
cal.setTime(lectureBlock.getStartDate());
int hour = cal.get(Calendar.HOUR_OF_DAY);
int minute = cal.get(Calendar.MINUTE);
startHourEl.setValue(Integer.toString(hour));
startMinuteEl.setValue(formatMinute(minute));
}
if(lectureBlock.getEndDate() != null) {
cal.setTime(lectureBlock.getEndDate());
int hour = cal.get(Calendar.HOUR_OF_DAY);
int minute = cal.get(Calendar.MINUTE);
endHourEl.setValue(Integer.toString(hour));
endMinuteEl.setValue(formatMinute(minute));
}
}
FormLayoutContainer buttonsCont = FormLayoutContainer.createButtonLayout("buttons", getTranslator());
......@@ -280,6 +296,16 @@ public class EditLectureBlockController extends FormBasicController {
uifactory.addFormSubmitButton("save", buttonsCont);
}
private String formatMinute(int minute) {
if(minute < 0) {
return "";
}
if(minute < 10) {
return "0" + minute;
}
return Integer.toString(minute);
}
private void updateUI() {
if(compulsoryEl.isAtLeastSelected(1)) {
setFormWarning(null);
......@@ -321,12 +347,14 @@ public class EditLectureBlockController extends FormBasicController {
allOk &= false;
}
startDateEl.clearError();
if(startDateEl.getDate() == null) {
startDateEl.setErrorKey("form.legende.mandatory", null);
dateEl.clearError();
if(dateEl.getDate() == null) {
dateEl.setErrorKey("form.legende.mandatory", null);
allOk &= false;
}
allOk &= validateInt(startHourEl, 24);
allOk &= validateInt(startMinuteEl, 60);
allOk &= validateInt(endHourEl, 24);
allOk &= validateInt(endMinuteEl, 60);
return allOk & super.validateFormLogic(ureq);
......@@ -386,10 +414,12 @@ public class EditLectureBlockController extends FormBasicController {
lectureBlock.setDescription(descriptionEl.getValue());
lectureBlock.setPreparation(preparationEl.getValue());
lectureBlock.setLocation(locationEl.getValue());
lectureBlock.setStartDate(startDateEl.getDate());
Calendar cal = Calendar.getInstance();
cal.setTime(startDateEl.getDate());
cal.setTime(dateEl.getDate());
cal.set(Calendar.HOUR_OF_DAY, Integer.parseInt(startHourEl.getValue()));
cal.set(Calendar.MINUTE, Integer.parseInt(startMinuteEl.getValue()));
lectureBlock.setStartDate(cal.getTime());
cal.set(Calendar.HOUR_OF_DAY, Integer.parseInt(endHourEl.getValue()));
cal.set(Calendar.MINUTE, Integer.parseInt(endMinuteEl.getValue()));
lectureBlock.setEndDate(cal.getTime());
......
......@@ -92,7 +92,9 @@ public class EditParticipantSummaryController extends FormBasicController {
FormLayoutContainer buttonsCont = FormLayoutContainer.createButtonLayout("buttons", getTranslator());
formLayout.add(buttonsCont);
uifactory.addFormCancelButton("cancel", buttonsCont, ureq, getWindowControl());
removeCustomRateButton = uifactory.addFormLink("remove.custom.rate", "remove.custom.rate", null, buttonsCont, Link.BUTTON);
if(rateEnabled) {
removeCustomRateButton = uifactory.addFormLink("remove.custom.rate", "remove.custom.rate", null, buttonsCont, Link.BUTTON);
}
uifactory.addFormSubmitButton("save", buttonsCont);
}
......
......@@ -353,9 +353,12 @@ public class LectureSettingsAdminController extends FormBasicController {
@Override
protected void formOK(UserRequest ureq) {
lectureModule.setEnabled(enableEl.isAtLeastSelected(1));
lectureModule.setCanOverrideStandardConfiguration(canOverrideStandardConfigEl.isSelected(0));
if(enableEl.isAtLeastSelected(1)) {
boolean enabled = enableEl.isAtLeastSelected(1);
lectureModule.setEnabled(enabled);
if(enabled) {
lectureModule.setCanOverrideStandardConfiguration(canOverrideStandardConfigEl.isSelected(0));
//enabled user tool
Set<String> availableTools = userToolsModule.getAvailableUserToolSet();
if(!availableTools.contains("org.olat.home.HomeMainController:org.olat.modules.lecture.ui.LecturesToolController")) {
......@@ -368,41 +371,41 @@ public class LectureSettingsAdminController extends FormBasicController {
aTools.append(selectedKey);
}
userToolsModule.setAvailableUserTools(aTools.toString());
lectureModule.setRollCallDefaultEnabled(rollCallEnableEl.isAtLeastSelected(1));
int autoClosePeriod = Integer.parseInt(autoClosePeriodEl.getValue());
lectureModule.setRollCallAutoClosePeriod(autoClosePeriod);
lectureModule.setStatusPartiallyDoneEnabled(partiallyDoneEnabledEl.isAtLeastSelected(1));
lectureModule.setStatusCancelledEnabled(statusEnabledEl.isAtLeastSelected(1));
boolean authorizedAbsenceenabled = authorizedAbsenceEnableEl.isAtLeastSelected(1);
lectureModule.setAuthorizedAbsenceEnabled(authorizedAbsenceEnableEl.isAtLeastSelected(1));
lectureModule.setCountAuthorizedAbsenceAsAttendant(authorizedAbsenceenabled && countAuthorizedAbsenceAsAttendantEl.isAtLeastSelected(1));
lectureModule.setTeacherCanAuthorizedAbsence(authorizedAbsenceenabled && teacherCanAuthorizeAbsenceEl.isAtLeastSelected(1));
lectureModule.setAbsenceAppealEnabled(appealAbsenceEnableEl.isAtLeastSelected(1));
if(appealAbsenceEnableEl.isAtLeastSelected(1)) {
int period = Integer.parseInt(appealPeriodEl.getValue());
lectureModule.setAbsenceAppealPeriod(period);
}
lectureModule.setRollCallReminderEnabled(reminderEnableEl.isAtLeastSelected(1));
if(reminderEnableEl.isAtLeastSelected(1)) {
int period = Integer.parseInt(reminderPeriodEl.getValue());
lectureModule.setRollCallReminderPeriod(period);
}
lectureModule.setRollCallCalculateAttendanceRateDefaultEnabled(calculateAttendanceRateEnableEl.isAtLeastSelected(1));
String attendanceRateInPercent = attendanceRateEl.getValue();
if(StringHelper.containsNonWhitespace(attendanceRateInPercent)) {
double val = Double.parseDouble(attendanceRateInPercent) / 100.0d;
lectureModule.setRequiredAttendanceRateDefault(val);
}
lectureModule.setTeacherCalendarSyncEnabledDefault(syncTeachersCalendarEnableEl.isAtLeastSelected(1));
lectureModule.setCourseCalendarSyncEnabledDefault(syncCourseCalendarEnableEl.isAtLeastSelected(1));
}
lectureModule.setRollCallDefaultEnabled(rollCallEnableEl.isAtLeastSelected(1));
int autoClosePeriod = Integer.parseInt(autoClosePeriodEl.getValue());
lectureModule.setRollCallAutoClosePeriod(autoClosePeriod);
lectureModule.setStatusPartiallyDoneEnabled(partiallyDoneEnabledEl.isAtLeastSelected(1));
lectureModule.setStatusCancelledEnabled(statusEnabledEl.isAtLeastSelected(1));
boolean authorizedAbsenceenabled = authorizedAbsenceEnableEl.isAtLeastSelected(1);
lectureModule.setAuthorizedAbsenceEnabled(authorizedAbsenceEnableEl.isAtLeastSelected(1));
lectureModule.setCountAuthorizedAbsenceAsAttendant(authorizedAbsenceenabled && countAuthorizedAbsenceAsAttendantEl.isAtLeastSelected(1));
lectureModule.setTeacherCanAuthorizedAbsence(authorizedAbsenceenabled && teacherCanAuthorizeAbsenceEl.isAtLeastSelected(1));
lectureModule.setAbsenceAppealEnabled(appealAbsenceEnableEl.isAtLeastSelected(1));
if(appealAbsenceEnableEl.isAtLeastSelected(1)) {
int period = Integer.parseInt(appealPeriodEl.getValue());
lectureModule.setAbsenceAppealPeriod(period);
}
lectureModule.setRollCallReminderEnabled(reminderEnableEl.isAtLeastSelected(1));
if(reminderEnableEl.isAtLeastSelected(1)) {
int period = Integer.parseInt(reminderPeriodEl.getValue());
lectureModule.setRollCallReminderPeriod(period);
}
lectureModule.setRollCallCalculateAttendanceRateDefaultEnabled(calculateAttendanceRateEnableEl.isAtLeastSelected(1));
String attendanceRateInPercent = attendanceRateEl.getValue();
if(StringHelper.containsNonWhitespace(attendanceRateInPercent)) {
double val = Double.parseDouble(attendanceRateInPercent) / 100.0d;
lectureModule.setRequiredAttendanceRateDefault(val);
}
lectureModule.setTeacherCalendarSyncEnabledDefault(syncTeachersCalendarEnableEl.isAtLeastSelected(1));
lectureModule.setCourseCalendarSyncEnabledDefault(syncCourseCalendarEnableEl.isAtLeastSelected(1));
}
}
\ No newline at end of file
......@@ -89,6 +89,7 @@ implements SortableFlexiTableDataModel<ParticipantRow>, ExportableFlexiTableData
case authorizedAbsenceLectures: return positive(row.getStatistics().getTotalAuthorizedAbsentLectures());
case rateWarning: return row.getStatistics();
case rate: return row.getStatistics().getAttendanceRate();
case infos: return row;
default: return null;
}
}
......@@ -113,7 +114,8 @@ implements SortableFlexiTableDataModel<ParticipantRow>, ExportableFlexiTableData
authorizedAbsenceLectures("table.header.authorized.absence"),
progress("table.header.progress"),
rateWarning("table.header.rate.warning"),
rate("table.header.rate");
rate("table.header.rate"),
infos("table.header.infos");
private final String i18nKey;
......
......@@ -54,6 +54,7 @@ import org.olat.modules.lecture.RepositoryEntryLectureConfiguration;
import org.olat.modules.lecture.model.LectureBlockStatistics;
import org.olat.modules.lecture.ui.ParticipantListDataModel.ParticipantsCols;
import org.olat.modules.lecture.ui.component.LectureStatisticsCellRenderer;
import org.olat.modules.lecture.ui.component.ParticipantInfosRenderer;
import org.olat.modules.lecture.ui.component.PercentCellRenderer;
import org.olat.modules.lecture.ui.component.RateWarningCellRenderer;
import org.olat.repository.RepositoryEntry;
......@@ -178,6 +179,8 @@ public class ParticipantListRepositoryController extends FormBasicController {
columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(ParticipantsCols.rate, new PercentCellRenderer()));
}
columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(ParticipantsCols.infos, new ParticipantInfosRenderer(getTranslator(), defaultRate)));
if(!printView) {
DefaultFlexiColumnModel editColumn = new DefaultFlexiColumnModel("table.header.edit", -1, "edit",
new StaticFlexiCellRenderer("", "edit", "o_icon o_icon-lg o_icon_edit", translate("edit"), null));
......
<div class="o_date_ms form-inline">$r.render("lecture.end.hour"):$r.render("lecture.end.minute")</div>
<div class="o_date_ms form-inline">
$r.translate("lecture.time.from") $r.render("lecture.start.hour"):$r.render("lecture.start.minute")
$r.translate("lecture.time.until") $r.render("lecture.end.hour"):$r.render("lecture.end.minute")</div>
#if($f.hasError("lecture.start.hour"))
<div>$r.render("lecture.start.hour_ERROR")</div>
#end
#if($f.hasError("lecture.start.minute"))
<div>$r.render("lecture.start.minute_ERROR")</div>
#end
#if($f.hasError("lecture.end.hour"))
<div>$r.render("lecture.end.hour_ERROR")</div>
#end
......
......@@ -81,6 +81,7 @@ form.managedflags.intro.short=Dieser Lektionblock wurde von einem externen Werkz
in.progress=In Bearbeitung
info.lecture.block.optional=Dieser Lektionenblock ist <strong>nicht</strong> obligatorisch.
info.no.lectures=Sie folgen zur Zeit keinen Lektionen
infos.participant.attendance.rate=Pers\u00F6nlicher Schwellwert: {0}%
interceptor.start=Sie haben jetzt einen Lektionenblock f\u00FCr den Kurs "{0}" {1} von {4} bis {5}.
lecture.absence.default.authorized=Absenzen standardm\u00E4ssig als entschuldigt z\u00E4hlen
lecture.admin.course.override.title=Konfiguration - Auf Kursebene \u00FCbersteuerbar
......@@ -123,6 +124,9 @@ lecture.teacher=Dozenten
lecture.teacher.can.authorize.absence=Dozenten d\u00FCrfen Absenzen entschuldigen
lecture.teacher.reminder.body=<p>Liebe Dozentin<br>Lieber Dozent</p><p>Wir m\u00F6chten Sie h\u00F6flich darin errinern, dass Sie die Absenzen f\u00FCr den im Betreff genannten Lektionenblock umgehend erfassen. Mit nachfolgendem Link gelangen Sie direkt zum entsprechenden Lektionenblock\:<br><a href\='{3}'>{3}</a></p><p>Besten Dank\!</p><p>Ihre Kursadministration</p>
lecture.teacher.reminder.subject=Erinnerung Lektionenblock "{0}"
lecture.time=Zeit
lecture.time.from=von
lecture.time.until=bis
lecture.title=Titel
lectures.admin.reasons=Begr\u00FCndungen
lectures.admin.settings=Konfiguration Lektionen- und Absenzenmanagement
......@@ -155,7 +159,7 @@ open=Offen
open.course=Kurs \u00F6ffnen
partiallydone=Teilweise erledigt
participant.rate=Schwellwert
participant.rate.edit=Pers\u00F6nlicher Schwellwert
participant.rate.edit=Pers\u00F6nlicher
pdf.table.dates={0} von {1} bis {2}
pdf.table.header.participants=Teilnehmer
pdf.table.header.signature=Unterschrift
......@@ -219,6 +223,7 @@ table.header.entry=Kurs
table.header.export=Export
table.header.external.ref=Ext. Ref.
table.header.id=ID
table.header.infos=<i class='o_icon o_icon-lg o_icon_info'> </i>
table.header.lecture.1=1
table.header.lecture.10=10
table.header.lecture.11=11
......
......@@ -81,6 +81,7 @@ form.managedflags.intro.short=This lecture block has been created by an external
in.progress=In process
info.lecture.block.optional=This lecture block is optional.
info.no.lectures=You don't follow any lectures for the moment.
infos.participant.attendance.rate=Personal attendance rate: {0}%
interceptor.start=You have now a roll call for the course "{0}" {1} from {4} until {5}.
lecture.absence.default.authorized=Absence per default authorized
lecture.admin.course.override.title=Configuration - can be overridden at course level
......@@ -123,6 +124,9 @@ lecture.teacher=Teacher
lecture.teacher.can.authorize.absence=Coaches can authorize absences
lecture.teacher.reminder.body=Reminder lectures block "{0}" in course {3}
lecture.teacher.reminder.subject=Reminder lectures block "{0}"
lecture.time=Time
lecture.time.from=from
lecture.time.until=until
lecture.title=Title
lectures.admin.reasons=Reasons
lectures.admin.settings=Settings lectures and absence management
......@@ -219,6 +223,7 @@ table.header.entry=Course
table.header.export=Export
table.header.external.ref=Ext. ref.
table.header.id=ID
table.header.infos=<i class='o_icon o_icon-lg o_icon_info'> </i>
table.header.lecture.1=1
table.header.lecture.10=10
table.header.lecture.11=11
......
/**
* <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.modules.lecture.ui.component;
import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiCellRenderer;
import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableComponent;
import org.olat.core.gui.render.Renderer;
import org.olat.core.gui.render.StringOutput;
import org.olat.core.gui.render.URLBuilder;
import org.olat.core.gui.translator.Translator;
import org.olat.core.util.StringHelper;
import org.olat.modules.lecture.ui.ParticipantRow;
/**
*
* Initial date: 18 juil. 2017<br>
* @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
*
*/
public class ParticipantInfosRenderer implements FlexiCellRenderer {
private int count = 0;
private final Translator translator;
private final double defaultAttendanceRate;
public ParticipantInfosRenderer(Translator translator, double defaultAttendanceRate) {
this.translator = translator;
this.defaultAttendanceRate = defaultAttendanceRate;
}
@Override
public void render(Renderer renderer, StringOutput target, Object cellValue, int row, FlexiTableComponent source,
URLBuilder ubu, Translator trans) {
if(cellValue instanceof ParticipantRow) {
ParticipantRow participantRow = (ParticipantRow)cellValue;
double requiredRate = participantRow.getStatistics().getRequiredRate();
if(requiredRate >= 0.0d && Math.abs(defaultAttendanceRate - requiredRate) > 0.0001) {
String id = "p_infos_" + ++count;
target.append("<span id='").append(id).append("'><i class='o_icon o_icon-lg o_icon_info'> </i></span>");
// Attach bootstrap tooltip handler to help icon
double percent = requiredRate * 100.0d;
long rounded = Math.round(percent);
String rateInfos = translator.translate("infos.participant.attendance.rate", new String[] { Long.toString(rounded) });
target.append("<script>jQuery(function () {jQuery('#").append(id).append("').tooltip({placement:\"top\",container: \"body\",html:true,title:\"")
.append(StringHelper.escapeJavaScript(rateInfos))
.append("\"});})</script>");
}
}
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment