diff --git a/src/main/java/ch/ethz/seb/sebserver/gbl/Constants.java b/src/main/java/ch/ethz/seb/sebserver/gbl/Constants.java index 9a678d19..61d6c1d7 100644 --- a/src/main/java/ch/ethz/seb/sebserver/gbl/Constants.java +++ b/src/main/java/ch/ethz/seb/sebserver/gbl/Constants.java @@ -24,6 +24,7 @@ public final class Constants { public static final Character LIST_SEPARATOR_CHAR = ','; public static final String LIST_SEPARATOR = ","; + public static final String EMBEDDED_LIST_SEPARATOR = "|"; public static final String EMPTY_NOTE = "--"; public static final String FORM_URL_ENCODED_SEPARATOR = "&"; public static final String FORM_URL_ENCODED_NAME_VALUE_SEPARATOR = "="; diff --git a/src/main/java/ch/ethz/seb/sebserver/gbl/api/POSTMapper.java b/src/main/java/ch/ethz/seb/sebserver/gbl/api/POSTMapper.java index f0606214..314e9a62 100644 --- a/src/main/java/ch/ethz/seb/sebserver/gbl/api/POSTMapper.java +++ b/src/main/java/ch/ethz/seb/sebserver/gbl/api/POSTMapper.java @@ -25,6 +25,9 @@ import org.joda.time.DateTimeZone; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; +import ch.ethz.seb.sebserver.gbl.Constants; +import ch.ethz.seb.sebserver.gbl.model.Domain; +import ch.ethz.seb.sebserver.gbl.model.exam.Indicator.Threshold; import ch.ethz.seb.sebserver.gbl.util.Utils; public class POSTMapper { @@ -151,6 +154,24 @@ public class POSTMapper { return Utils.toDateTime(value); } + public List getThresholds() { + final List thresholdStrings = this.params.get(Domain.THRESHOLD.REFERENCE_NAME); + if (thresholdStrings == null || thresholdStrings.isEmpty()) { + return Collections.emptyList(); + } + + return thresholdStrings.stream() + .map(ts -> { + try { + final String[] split = StringUtils.split(ts, Constants.EMBEDDED_LIST_SEPARATOR); + return new Threshold(Double.parseDouble(split[0]), split[1]); + } catch (final Exception e) { + return null; + } + }) + .collect(Collectors.toList()); + } + @SuppressWarnings("unchecked") public T putIfAbsent(final String name, final String value) { this.params.putIfAbsent(name, Arrays.asList(value)); diff --git a/src/main/java/ch/ethz/seb/sebserver/gbl/model/exam/Indicator.java b/src/main/java/ch/ethz/seb/sebserver/gbl/model/exam/Indicator.java index 3e401443..cc886fb4 100644 --- a/src/main/java/ch/ethz/seb/sebserver/gbl/model/exam/Indicator.java +++ b/src/main/java/ch/ethz/seb/sebserver/gbl/model/exam/Indicator.java @@ -9,7 +9,6 @@ package ch.ethz.seb.sebserver.gbl.model.exam; import java.util.Collection; -import java.util.Collections; import java.util.List; import javax.validation.constraints.NotNull; @@ -93,7 +92,7 @@ public final class Indicator implements GrantEntity { this.name = postParams.getString(Domain.INDICATOR.ATTR_NAME); this.type = postParams.getEnum(Domain.INDICATOR.ATTR_TYPE, IndicatorType.class); this.defaultColor = postParams.getString(Domain.INDICATOR.ATTR_COLOR); - this.thresholds = Collections.emptyList(); + this.thresholds = postParams.getThresholds(); } @Override diff --git a/src/main/java/ch/ethz/seb/sebserver/gui/content/ExamForm.java b/src/main/java/ch/ethz/seb/sebserver/gui/content/ExamForm.java index cde95596..2d27bc3d 100644 --- a/src/main/java/ch/ethz/seb/sebserver/gui/content/ExamForm.java +++ b/src/main/java/ch/ethz/seb/sebserver/gui/content/ExamForm.java @@ -251,7 +251,8 @@ public class ExamForm implements TemplateComposer { final EntityTable indicatorTable = this.pageService.entityTableBuilder(restService.getRestCall(GetIndicators.class)) .withEmptyMessage(new LocTextKey("sebserver.exam.indicator.list.empty")) - .withPaging(3) + .withPaging(5) + .hideNavigation() .withColumn(new ColumnDefinition<>( Domain.INDICATOR.ATTR_NAME, nameColumnKey, @@ -267,6 +268,10 @@ public class ExamForm implements TemplateComposer { thresholdColumnKey, ExamForm::thresholdsValue, false)) + .withDefaultAction(actionBuilder + .newAction(ActionDefinition.EXAM_INDICATOR_MODIFY_FROM_LIST) + .withParentEntityKey(entityKey) + .create()) .compose(content); diff --git a/src/main/java/ch/ethz/seb/sebserver/gui/content/IndicatorForm.java b/src/main/java/ch/ethz/seb/sebserver/gui/content/IndicatorForm.java index 43653236..53bc0133 100644 --- a/src/main/java/ch/ethz/seb/sebserver/gui/content/IndicatorForm.java +++ b/src/main/java/ch/ethz/seb/sebserver/gui/content/IndicatorForm.java @@ -104,7 +104,7 @@ public class IndicatorForm implements TemplateComposer { indicator.getModelId()) .putStaticValue( Domain.EXAM.ATTR_INSTITUTION_ID, - exam.getModelId()) + String.valueOf(exam.getInstitutionId())) .putStaticValue( Domain.INDICATOR.ATTR_EXAM_ID, parentEntityKey.getModelId()) diff --git a/src/main/java/ch/ethz/seb/sebserver/gui/content/activity/ActivitiesPane.java b/src/main/java/ch/ethz/seb/sebserver/gui/content/activity/ActivitiesPane.java index 65e9d8fb..deb8a76f 100644 --- a/src/main/java/ch/ethz/seb/sebserver/gui/content/activity/ActivitiesPane.java +++ b/src/main/java/ch/ethz/seb/sebserver/gui/content/activity/ActivitiesPane.java @@ -270,19 +270,14 @@ public class ActivitiesPane implements TemplateComposer { @Override public void notify(final ActionEvent event) { - // TODO -// final MainPageState mainPageState = MainPageState.get(); -// mainPageState.action = event.action; - if (!event.activity) { - final EntityKey entityKey = event.action.getEntityKey(); - final String modelId = (entityKey != null) ? entityKey.modelId : null; - final TreeItem item = findItemByActionDefinition( - this.navigation.getItems(), - event.action.definition.targetState.activityAnchor(), - modelId); - if (item != null) { - this.navigation.select(item); - } + final EntityKey entityKey = event.action.getEntityKey(); + final String modelId = (entityKey != null) ? entityKey.modelId : null; + final TreeItem item = findItemByActionDefinition( + this.navigation.getItems(), + event.action.definition.targetState.activityAnchor(), + modelId); + if (item != null) { + this.navigation.select(item); } } } diff --git a/src/main/java/ch/ethz/seb/sebserver/gui/form/FormBuilder.java b/src/main/java/ch/ethz/seb/sebserver/gui/form/FormBuilder.java index 62a69aab..4a56c426 100644 --- a/src/main/java/ch/ethz/seb/sebserver/gui/form/FormBuilder.java +++ b/src/main/java/ch/ethz/seb/sebserver/gui/form/FormBuilder.java @@ -65,6 +65,7 @@ public class FormBuilder { final GridLayout layout = new GridLayout(rows, true); layout.horizontalSpacing = 10; layout.verticalSpacing = 10; + layout.marginBottom = 50; layout.marginLeft = 10; layout.marginTop = 0; this.formParent.setLayout(layout); diff --git a/src/main/java/ch/ethz/seb/sebserver/gui/form/ThresholdListBuilder.java b/src/main/java/ch/ethz/seb/sebserver/gui/form/ThresholdListBuilder.java index 55e507c7..1c4dd928 100644 --- a/src/main/java/ch/ethz/seb/sebserver/gui/form/ThresholdListBuilder.java +++ b/src/main/java/ch/ethz/seb/sebserver/gui/form/ThresholdListBuilder.java @@ -17,6 +17,7 @@ import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.Label; import ch.ethz.seb.sebserver.gbl.Constants; +import ch.ethz.seb.sebserver.gbl.model.Domain; import ch.ethz.seb.sebserver.gbl.model.exam.Indicator.Threshold; import ch.ethz.seb.sebserver.gui.widget.ThresholdList; @@ -34,7 +35,8 @@ public class ThresholdListBuilder extends FieldBuilder> { void build(final FormBuilder builder) { final Label lab = builder.labelLocalized(builder.formParent, this.label, this.spanLabel); if (builder.readonly || this.readonly) { - + // TODO do we need a read-only view for this? + return; } else { final ThresholdList thresholdList = builder.widgetFactory.thresholdList( builder.formParent, @@ -53,8 +55,13 @@ public class ThresholdListBuilder extends FieldBuilder> { return null; } + // thresholds={value}|{color},thresholds={value}|{color}... return StringUtils.join(thresholds.stream() - .map(t -> String.valueOf(t.getValue()) + Constants.FORM_URL_ENCODED_NAME_VALUE_SEPARATOR + t.getColor()) + .map(t -> Domain.THRESHOLD.REFERENCE_NAME + + Constants.FORM_URL_ENCODED_NAME_VALUE_SEPARATOR + + String.valueOf(t.getValue()) + + Constants.EMBEDDED_LIST_SEPARATOR + + t.getColor()) .collect(Collectors.toList()), Constants.LIST_SEPARATOR); } diff --git a/src/main/java/ch/ethz/seb/sebserver/gui/service/page/PageService.java b/src/main/java/ch/ethz/seb/sebserver/gui/service/page/PageService.java index 84ac7d26..6bf3cf2f 100644 --- a/src/main/java/ch/ethz/seb/sebserver/gui/service/page/PageService.java +++ b/src/main/java/ch/ethz/seb/sebserver/gui/service/page/PageService.java @@ -180,9 +180,9 @@ public interface PageService { return this; } - public PageActionBuilder withSimpleRestCall( + public PageActionBuilder withSimpleRestCall( final RestService restService, - final Class> restCallType) { + final Class> restCallType) { this.exec = action -> { restService.getBuilder(restCallType) diff --git a/src/main/java/ch/ethz/seb/sebserver/gui/service/page/event/ActionEvent.java b/src/main/java/ch/ethz/seb/sebserver/gui/service/page/event/ActionEvent.java index d2ccff06..01205536 100644 --- a/src/main/java/ch/ethz/seb/sebserver/gui/service/page/event/ActionEvent.java +++ b/src/main/java/ch/ethz/seb/sebserver/gui/service/page/event/ActionEvent.java @@ -15,20 +15,10 @@ import ch.ethz.seb.sebserver.gui.service.page.impl.PageAction; public final class ActionEvent implements PageEvent { public final PageAction action; - @Deprecated // use the ActionDefinition - public final boolean activity; public ActionEvent(final PageAction action) { super(); this.action = action; - this.activity = false; - } - - @Deprecated - public ActionEvent(final PageAction action, final boolean activity) { - super(); - this.action = action; - this.activity = activity; } } diff --git a/src/main/java/ch/ethz/seb/sebserver/gui/service/remote/webservice/auth/OAuth2AuthorizationContextHolder.java b/src/main/java/ch/ethz/seb/sebserver/gui/service/remote/webservice/auth/OAuth2AuthorizationContextHolder.java index 019e876d..a7fc62fc 100644 --- a/src/main/java/ch/ethz/seb/sebserver/gui/service/remote/webservice/auth/OAuth2AuthorizationContextHolder.java +++ b/src/main/java/ch/ethz/seb/sebserver/gui/service/remote/webservice/auth/OAuth2AuthorizationContextHolder.java @@ -205,8 +205,8 @@ public class OAuth2AuthorizationContextHolder implements AuthorizationContextHol log.debug("Trying to login for user: {}", username); try { - final OAuth2AccessToken accessToken = this.restTemplate.getAccessToken(); - log.debug("Got token for user: {} : {}", username, "--"); + this.restTemplate.getAccessToken(); + log.debug("Got token for user: {}", username); this.loggedInUser = getLoggedInUser(); return true; } catch (final OAuth2AccessDeniedException | AccessDeniedException e) { diff --git a/src/main/java/ch/ethz/seb/sebserver/gui/table/EntityTable.java b/src/main/java/ch/ethz/seb/sebserver/gui/table/EntityTable.java index b01bd40c..5a40ea75 100644 --- a/src/main/java/ch/ethz/seb/sebserver/gui/table/EntityTable.java +++ b/src/main/java/ch/ethz/seb/sebserver/gui/table/EntityTable.java @@ -82,7 +82,8 @@ public class EntityTable { final List actions, final int pageSize, final LocTextKey emptyMessage, - final Function, PageAction> defaultActionFunction) { + final Function, PageAction> defaultActionFunction, + final boolean hideNavigation) { this.composite = new Composite(parent, type); this.pageService = pageService; @@ -143,7 +144,7 @@ public class EntityTable { } } - this.navigator = new TableNavigator(this); + this.navigator = (hideNavigation) ? null : new TableNavigator(this); createTableColumns(); updateTableRows( @@ -287,7 +288,9 @@ public class EntityTable { .withQueryParams((this.filter != null) ? this.filter.getFilterParameter() : null) .call() .map(this::createTableRowsFromPage) - .map(this.navigator::update) + .map(pageData -> (this.navigator != null) + ? this.navigator.update(pageData) + : pageData) .onErrorDo(t -> { // TODO error handling }); @@ -357,8 +360,6 @@ public class EntityTable { this.filter.adaptColumnWidth( this.table.indexOf(tableColumn), tableColumn.getWidth())) { - - //this.composite.layout(true, true); } } } diff --git a/src/main/java/ch/ethz/seb/sebserver/gui/table/TableBuilder.java b/src/main/java/ch/ethz/seb/sebserver/gui/table/TableBuilder.java index 365206ed..5793b0e4 100644 --- a/src/main/java/ch/ethz/seb/sebserver/gui/table/TableBuilder.java +++ b/src/main/java/ch/ethz/seb/sebserver/gui/table/TableBuilder.java @@ -48,6 +48,7 @@ public class TableBuilder { private Function, PageAction> defaultActionFunction; private int pageSize = -1; private int type = SWT.NONE; + private boolean hideNavigation = false; public TableBuilder( final PageService pageService, @@ -57,6 +58,11 @@ public class TableBuilder { this.restCall = restCall; } + public TableBuilder hideNavigation() { + this.hideNavigation = true; + return this; + } + public TableBuilder withEmptyMessage(final LocTextKey emptyMessage) { this.emptyMessage = emptyMessage; return this; @@ -112,7 +118,8 @@ public class TableBuilder { this.actions, this.pageSize, this.emptyMessage, - this.defaultActionFunction); + this.defaultActionFunction, + this.hideNavigation); } } diff --git a/src/main/java/ch/ethz/seb/sebserver/webservice/servicelayer/dao/impl/IndicatorDAOImpl.java b/src/main/java/ch/ethz/seb/sebserver/webservice/servicelayer/dao/impl/IndicatorDAOImpl.java index c0d35f09..ead07c1a 100644 --- a/src/main/java/ch/ethz/seb/sebserver/webservice/servicelayer/dao/impl/IndicatorDAOImpl.java +++ b/src/main/java/ch/ethz/seb/sebserver/webservice/servicelayer/dao/impl/IndicatorDAOImpl.java @@ -170,6 +170,17 @@ public class IndicatorDAOImpl implements IndicatorDAO { modified.defaultColor); this.indicatorRecordMapper.insert(newRecord); + + // insert thresholds + modified.thresholds + .stream() + .map(threshold -> new ThresholdRecord( + null, + newRecord.getId(), + new BigDecimal(threshold.value), + threshold.color)) + .forEach(this.thresholdRecordMapper::insert); + return newRecord; }) .flatMap(this::toDomainModel) diff --git a/src/main/java/ch/ethz/seb/sebserver/webservice/servicelayer/lms/LmsAPIService.java b/src/main/java/ch/ethz/seb/sebserver/webservice/servicelayer/lms/LmsAPIService.java index b507f0ca..9508a5a0 100644 --- a/src/main/java/ch/ethz/seb/sebserver/webservice/servicelayer/lms/LmsAPIService.java +++ b/src/main/java/ch/ethz/seb/sebserver/webservice/servicelayer/lms/LmsAPIService.java @@ -111,7 +111,11 @@ public interface LmsAPIService { end = quizzes.size(); } - return new Page<>(quizzes.size() / pageSize, pageNumber, sortAttribute, quizzes.subList(start, end)); + return new Page<>( + (quizzes.size() / pageSize) + 1, + pageNumber, + sortAttribute, + quizzes.subList(start, end)); }; } diff --git a/src/main/java/ch/ethz/seb/sebserver/webservice/weblayer/api/QuizImportController.java b/src/main/java/ch/ethz/seb/sebserver/webservice/weblayer/api/QuizImportController.java index 1c71dc24..e68aaf8a 100644 --- a/src/main/java/ch/ethz/seb/sebserver/webservice/weblayer/api/QuizImportController.java +++ b/src/main/java/ch/ethz/seb/sebserver/webservice/weblayer/api/QuizImportController.java @@ -85,7 +85,9 @@ public class QuizImportController { EntityType.EXAM, institutionId); - final FilterMap filterMap = new FilterMap(allRequestParams); + final FilterMap filterMap = new FilterMap(allRequestParams) + .putIfAbsent(Entity.FILTER_ATTR_INSTITUTION, String.valueOf(institutionId)); + return this.lmsAPIService.requestQuizDataPage( (pageNumber != null) ? pageNumber