SEBSERV-153 IndicatorTemplate implementation

This commit is contained in:
anhefti 2021-09-06 15:58:30 +02:00
parent 446bb15a9c
commit 152955f712
22 changed files with 524 additions and 137 deletions

View file

@ -59,7 +59,7 @@ public class ExamTemplate implements GrantEntity {
public final Long configTemplateId;
@JsonProperty(EXAM_TEMPLATE.ATTR_INDICATOR_TEMPLATES)
public final Collection<Indicator> indicatorTemplates;
public final Collection<IndicatorTemplate> indicatorTemplates;
@JsonProperty(ATTR_EXAM_ATTRIBUTES)
public final Map<String, String> examAttributes;
@ -73,7 +73,7 @@ public class ExamTemplate implements GrantEntity {
@JsonProperty(EXAM_TEMPLATE.ATTR_EXAM_TYPE) final ExamType examType,
@JsonProperty(EXAM_TEMPLATE.ATTR_SUPPORTER) final Collection<String> supporter,
@JsonProperty(EXAM_TEMPLATE.ATTR_CONFIGURATION_TEMPLATE_ID) final Long configTemplateId,
@JsonProperty(EXAM_TEMPLATE.ATTR_INDICATOR_TEMPLATES) final Collection<Indicator> indicatorTemplates,
@JsonProperty(EXAM_TEMPLATE.ATTR_INDICATOR_TEMPLATES) final Collection<IndicatorTemplate> indicatorTemplates,
@JsonProperty(ATTR_EXAM_ATTRIBUTES) final Map<String, String> examAttributes) {
this.id = id;
@ -136,7 +136,7 @@ public class ExamTemplate implements GrantEntity {
return this.configTemplateId;
}
public Collection<Indicator> getIndicatorTemplates() {
public Collection<IndicatorTemplate> getIndicatorTemplates() {
return this.indicatorTemplates;
}

View file

@ -217,8 +217,12 @@ public final class Indicator implements Entity {
return builder.toString();
}
public static Indicator createNew(final Exam exam) {
return new Indicator(null, exam.id, null, null, null, null, null, null);
public static Indicator createNew(final String examId) {
try {
return new Indicator(null, Long.parseLong(examId), null, null, null, null, null, null);
} catch (final Exception e) {
return new Indicator(null, null, null, null, null, null, null, null);
}
}
public static String getDisplayValue(final IndicatorType indicatorType, final Double value) {

View file

@ -0,0 +1,175 @@
/*
* Copyright (c) 2021 ETH Zürich, Educational Development and Technology (LET)
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
package ch.ethz.seb.sebserver.gbl.model.exam;
import java.util.Collection;
import java.util.List;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import org.apache.commons.lang3.StringUtils;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
import ch.ethz.seb.sebserver.gbl.api.EntityType;
import ch.ethz.seb.sebserver.gbl.api.POSTMapper;
import ch.ethz.seb.sebserver.gbl.model.Domain;
import ch.ethz.seb.sebserver.gbl.model.Domain.INDICATOR;
import ch.ethz.seb.sebserver.gbl.model.Domain.THRESHOLD;
import ch.ethz.seb.sebserver.gbl.model.Entity;
import ch.ethz.seb.sebserver.gbl.model.exam.Indicator.IndicatorType;
import ch.ethz.seb.sebserver.gbl.model.exam.Indicator.Threshold;
import ch.ethz.seb.sebserver.gbl.util.Utils;
@JsonIgnoreProperties(ignoreUnknown = true)
public class IndicatorTemplate implements Entity {
public static final String ATTR_EXAM_TEMPLATE_ID = "examTemplateId";
@JsonProperty(INDICATOR.ATTR_ID)
public final Long id;
@JsonProperty(ATTR_EXAM_TEMPLATE_ID)
public final Long examTemplateId;
@JsonProperty(INDICATOR.ATTR_NAME)
@NotNull(message = "indicator:name:notNull")
@Size(min = 3, max = 255, message = "indicator:name:size:{min}:{max}:${validatedValue}")
public final String name;
@JsonProperty(INDICATOR.ATTR_TYPE)
@NotNull(message = "indicator:type:notNull")
public final IndicatorType type;
@JsonProperty(INDICATOR.ATTR_COLOR)
public final String defaultColor;
@JsonProperty(INDICATOR.ATTR_ICON)
public final String defaultIcon;
@JsonProperty(INDICATOR.ATTR_TAGS)
public final String tags;
@JsonProperty(THRESHOLD.REFERENCE_NAME)
public final List<Threshold> thresholds;
@JsonCreator
public IndicatorTemplate(
@JsonProperty(INDICATOR.ATTR_ID) final Long id,
@JsonProperty(ATTR_EXAM_TEMPLATE_ID) final Long examTemplateId,
@JsonProperty(INDICATOR.ATTR_NAME) final String name,
@JsonProperty(INDICATOR.ATTR_TYPE) final IndicatorType type,
@JsonProperty(INDICATOR.ATTR_COLOR) final String defaultColor,
@JsonProperty(INDICATOR.ATTR_ICON) final String defaultIcon,
@JsonProperty(INDICATOR.ATTR_TAGS) final String tags,
@JsonProperty(THRESHOLD.REFERENCE_NAME) final Collection<Threshold> thresholds) {
this.id = id;
this.examTemplateId = examTemplateId;
this.name = name;
this.type = type;
this.defaultColor = defaultColor;
this.defaultIcon = defaultIcon;
this.tags = tags;
this.thresholds = Utils.immutableListOf(thresholds);
}
/** This initialize an indicator for an exam template */
public IndicatorTemplate(final Long id, final Long examTemplateId, final POSTMapper postParams) {
this.id = id;
this.examTemplateId = examTemplateId;
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.defaultIcon = postParams.getString(Domain.INDICATOR.ATTR_ICON);
this.tags = postParams.getString(Domain.INDICATOR.ATTR_TAGS);
this.thresholds = postParams.getThresholds();
}
@Override
public String getModelId() {
return (this.id == null) ? null : String.valueOf(this.id);
}
@Override
public EntityType entityType() {
return EntityType.INDICATOR;
}
@Override
public String getName() {
return this.name;
}
public Long getId() {
return this.id;
}
public Long getExamTemplateId() {
return this.examTemplateId;
}
public IndicatorType getType() {
return this.type;
}
public String getDefaultColor() {
return this.defaultColor;
}
public String getDefaultIcon() {
return this.defaultIcon;
}
public String getTags() {
return this.tags;
}
public Collection<Threshold> getThresholds() {
return this.thresholds;
}
@Override
public String toString() {
final StringBuilder builder = new StringBuilder();
builder.append("Indicator [id=");
builder.append(this.id);
builder.append(", examId=");
builder.append(this.examTemplateId);
builder.append(", name=");
builder.append(this.name);
builder.append(", type=");
builder.append(this.type);
builder.append(", defaultColor=");
builder.append(this.defaultColor);
builder.append(", defaultIcon=");
builder.append(this.defaultIcon);
builder.append(", tags=");
builder.append(this.tags);
builder.append(", thresholds=");
builder.append(this.thresholds);
builder.append("]");
return builder.toString();
}
public static String getDisplayValue(final IndicatorType indicatorType, final Double value) {
if (value == null || indicatorType == null) {
return StringUtils.EMPTY;
}
if (indicatorType.integerValue) {
return String.valueOf(value.intValue());
} else {
return String.valueOf(value.floatValue());
}
}
}

View file

@ -19,7 +19,7 @@ public enum ActionCategory {
QUIZ_LIST(new LocTextKey("sebserver.quizdiscovery.list.actions"), 1),
EXAM_LIST(new LocTextKey("sebserver.exam.list.actions"), 1),
EXAM_TEMPLATE_LIST(new LocTextKey("sebserver.examtemplate.list.actions"), 1),
EXAM_TEMPLATE_INDICATOR_LIST(new LocTextKey("sebserver.examtemplate.indicator.list.actions"), 2),
INDICATOR_TEMPLATE_LIST(new LocTextKey("sebserver.examtemplate.indicator.list.actions"), 1),
EXAM_CONFIG_MAPPING_LIST(new LocTextKey("sebserver.exam.configuration.list.actions"), 1),
INDICATOR_LIST(new LocTextKey("sebserver.exam.indicator.list.actions"), 2),
SEB_CLIENT_CONFIG_LIST(new LocTextKey("sebserver.clientconfig.list.actions"), 1),

View file

@ -398,12 +398,12 @@ public enum ActionDefinition {
PageStateDefinitionImpl.EXAM_TEMPLATE_EDIT,
ActionCategory.LIST_VARIA),
EXAM_TEMPLATE_MODIFY(
new LocTextKey("sebserver.examtemplate.action.list.edit"),
ImageIcon.TEMPLATE,
new LocTextKey("sebserver.examtemplate.form.action.edit"),
ImageIcon.EDIT,
PageStateDefinitionImpl.EXAM_TEMPLATE_EDIT,
ActionCategory.LIST_VARIA),
ActionCategory.FORM),
EXAM_TEMPLATE_SAVE(
new LocTextKey("sebserver.examtemplate.action.save"),
new LocTextKey("sebserver.examtemplate.form.action.save"),
ImageIcon.SAVE,
PageStateDefinitionImpl.EXAM_TEMPLATE_VIEW,
ActionCategory.FORM),
@ -413,21 +413,31 @@ public enum ActionDefinition {
PageStateDefinitionImpl.EXAM_TEMPLATE_VIEW,
ActionCategory.FORM),
EXAM_TEMPLATE_INDICATOR_NEW(
INDICATOR_TEMPLATE_NEW(
new LocTextKey("sebserver.examtemplate.indicator.action.list.new"),
ImageIcon.INDICATOR,
PageStateDefinitionImpl.EXAM_TEMPLATE_INDICATOR_EDIT,
ActionCategory.EXAM_TEMPLATE_INDICATOR_LIST),
EXAM_TEMPLATE_INDICATOR_MODIFY_FROM_LIST(
PageStateDefinitionImpl.INDICATOR_TEMPLATE_EDIT,
ActionCategory.INDICATOR_TEMPLATE_LIST),
INDICATOR_TEMPLATE_MODIFY_FROM_LIST(
new LocTextKey("sebserver.examtemplate.indicator.action.list.modify"),
ImageIcon.EDIT,
PageStateDefinitionImpl.EXAM_TEMPLATE_INDICATOR_EDIT,
ActionCategory.EXAM_TEMPLATE_INDICATOR_LIST),
EXAM_TEMPLATE_INDICATOR_DELETE_FROM_LIST(
PageStateDefinitionImpl.INDICATOR_TEMPLATE_EDIT,
ActionCategory.INDICATOR_TEMPLATE_LIST),
INDICATOR_TEMPLATE_DELETE_FROM_LIST(
new LocTextKey("sebserver.examtemplate.indicator.action.list.delete"),
ImageIcon.DELETE,
PageStateDefinitionImpl.EXAM_TEMPLATE_VIEW,
ActionCategory.EXAM_TEMPLATE_INDICATOR_LIST),
ActionCategory.INDICATOR_TEMPLATE_LIST),
INDICATOR_TEMPLATE_SAVE(
new LocTextKey("sebserver.examtemplate.indicator.action.save"),
ImageIcon.SAVE,
PageStateDefinitionImpl.EXAM_TEMPLATE_VIEW,
ActionCategory.FORM),
INDICATOR_TEMPLATE_CANCEL_MODIFY(
new LocTextKey("sebserver.overall.action.modify.cancel"),
ImageIcon.CANCEL,
PageStateDefinitionImpl.EXAM_TEMPLATE_VIEW,
ActionCategory.FORM),
SEB_CLIENT_CONFIG_LIST(
new LocTextKey("sebserver.clientconfig.list.title"),

View file

@ -27,9 +27,9 @@ import ch.ethz.seb.sebserver.gui.content.configs.SEBSettingsForm;
import ch.ethz.seb.sebserver.gui.content.exam.ExamForm;
import ch.ethz.seb.sebserver.gui.content.exam.ExamList;
import ch.ethz.seb.sebserver.gui.content.exam.ExamTemplateForm;
import ch.ethz.seb.sebserver.gui.content.exam.ExamTemplateIndicatorForm;
import ch.ethz.seb.sebserver.gui.content.exam.ExamTemplateList;
import ch.ethz.seb.sebserver.gui.content.exam.IndicatorForm;
import ch.ethz.seb.sebserver.gui.content.exam.IndicatorTemplateForm;
import ch.ethz.seb.sebserver.gui.content.exam.LmsSetupForm;
import ch.ethz.seb.sebserver.gui.content.exam.LmsSetupList;
import ch.ethz.seb.sebserver.gui.content.exam.QuizLookupList;
@ -66,7 +66,7 @@ public enum PageStateDefinitionImpl implements PageStateDefinition {
EXAM_TEMPLATE_LIST(Type.LIST_VIEW, ExamTemplateList.class, ActivityDefinition.EXAM_TEMPLATE),
EXAM_TEMPLATE_VIEW(Type.LIST_VIEW, ExamTemplateForm.class, ActivityDefinition.EXAM_TEMPLATE),
EXAM_TEMPLATE_EDIT(Type.FORM_EDIT, ExamTemplateForm.class, ActivityDefinition.EXAM_TEMPLATE),
EXAM_TEMPLATE_INDICATOR_EDIT(Type.FORM_EDIT, ExamTemplateIndicatorForm.class, ActivityDefinition.EXAM_TEMPLATE),
INDICATOR_TEMPLATE_EDIT(Type.FORM_EDIT, IndicatorTemplateForm.class, ActivityDefinition.EXAM_TEMPLATE),
SEB_CLIENT_CONFIG_LIST(Type.LIST_VIEW, SEBClientConfigList.class, ActivityDefinition.SEB_CLIENT_CONFIG),
SEB_CLIENT_CONFIG_VIEW(Type.FORM_VIEW, SEBClientConfigForm.class, ActivityDefinition.SEB_CLIENT_CONFIG),

View file

@ -8,6 +8,8 @@
package ch.ethz.seb.sebserver.gui.content.exam;
import java.util.List;
import org.apache.commons.lang3.BooleanUtils;
import org.eclipse.swt.widgets.Composite;
import org.springframework.context.annotation.Lazy;
@ -18,6 +20,8 @@ import ch.ethz.seb.sebserver.gbl.api.API;
import ch.ethz.seb.sebserver.gbl.model.Domain;
import ch.ethz.seb.sebserver.gbl.model.EntityKey;
import ch.ethz.seb.sebserver.gbl.model.exam.Indicator;
import ch.ethz.seb.sebserver.gbl.model.exam.Indicator.IndicatorType;
import ch.ethz.seb.sebserver.gbl.model.exam.Indicator.Threshold;
import ch.ethz.seb.sebserver.gbl.profile.GuiProfile;
import ch.ethz.seb.sebserver.gbl.util.Utils;
import ch.ethz.seb.sebserver.gui.content.action.ActionDefinition;
@ -104,10 +108,10 @@ public class ExamFormIndicators implements TemplateComposer {
INDICATOR_TYPE_COLUMN_KEY,
this::indicatorTypeName)
.widthProportion(1))
.withColumn(new ColumnDefinition<>(
.withColumn(new ColumnDefinition<Indicator>(
Domain.THRESHOLD.REFERENCE_NAME,
INDICATOR_THRESHOLD_COLUMN_KEY,
ExamFormIndicators::thresholdsValue)
i -> thresholdsValue(i.thresholds, i.type))
.asMarkup()
.widthProportion(4))
.withDefaultActionIf(
@ -166,12 +170,15 @@ public class ExamFormIndicators implements TemplateComposer {
.getText(ResourceService.EXAM_INDICATOR_TYPE_PREFIX + indicator.type.name());
}
static String thresholdsValue(final Indicator indicator) {
if (indicator.thresholds.isEmpty()) {
static String thresholdsValue(
final List<Threshold> thresholds,
final IndicatorType indicatorType) {
if (thresholds.isEmpty()) {
return Constants.EMPTY_NOTE;
}
final StringBuilder builder = indicator.thresholds
final StringBuilder builder = thresholds
.stream()
.reduce(
new StringBuilder(),
@ -183,7 +190,7 @@ public class ExamFormIndicators implements TemplateComposer {
? "color: #4a4a4a; "
: "color: #FFFFFF;")
.append("'>")
.append(Indicator.getDisplayValue(indicator.type, threshold.value))
.append(Indicator.getDisplayValue(indicatorType, threshold.value))
.append(" (")
.append(threshold.color)
.append(")")

View file

@ -22,7 +22,7 @@ import ch.ethz.seb.sebserver.gbl.model.Domain;
import ch.ethz.seb.sebserver.gbl.model.EntityKey;
import ch.ethz.seb.sebserver.gbl.model.exam.Exam;
import ch.ethz.seb.sebserver.gbl.model.exam.ExamTemplate;
import ch.ethz.seb.sebserver.gbl.model.exam.Indicator;
import ch.ethz.seb.sebserver.gbl.model.exam.IndicatorTemplate;
import ch.ethz.seb.sebserver.gbl.profile.GuiProfile;
import ch.ethz.seb.sebserver.gbl.util.Tuple;
import ch.ethz.seb.sebserver.gui.content.action.ActionDefinition;
@ -36,9 +36,9 @@ import ch.ethz.seb.sebserver.gui.service.page.PageService.PageActionBuilder;
import ch.ethz.seb.sebserver.gui.service.page.TemplateComposer;
import ch.ethz.seb.sebserver.gui.service.page.impl.PageAction;
import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.RestService;
import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.exam.DeleteExamTemplateIndicator;
import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.exam.DeleteIndicatorTemplate;
import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.exam.GetExamTemplate;
import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.exam.GetExamTemplateIndicatorPage;
import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.exam.GetIndicatorTemplatePage;
import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.exam.NewExamTemplate;
import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.exam.SaveExamTemplate;
import ch.ethz.seb.sebserver.gui.service.remote.webservice.auth.CurrentUser;
@ -133,6 +133,9 @@ public class ExamTemplateForm implements TemplateComposer {
.putStaticValueIf(() -> !isNew,
Domain.EXAM_TEMPLATE.ATTR_ID,
examTemplate.getModelId())
.putStaticValueIf(() -> !isNew,
Domain.EXAM_TEMPLATE.ATTR_INSTITUTION_ID,
String.valueOf(examTemplate.getInstitutionId()))
.addField(FormBuilder.text(
Domain.EXAM_TEMPLATE.ATTR_NAME,
@ -176,9 +179,6 @@ public class ExamTemplateForm implements TemplateComposer {
// propagate content actions to action-pane
this.pageService.pageActionBuilder(formContext.clearEntityKeys())
.newAction(ActionDefinition.EXAM_TEMPLATE_NEW)
.publishIf(() -> userGrant.iw() && readonly)
.newAction(ActionDefinition.EXAM_TEMPLATE_MODIFY)
.withEntityKey(entityKey)
.publishIf(() -> userGrant.im() && readonly)
@ -207,9 +207,9 @@ public class ExamTemplateForm implements TemplateComposer {
final PageActionBuilder actionBuilder = this.pageService
.pageActionBuilder(pageContext.clearEntityKeys());
final EntityTable<Indicator> indicatorTable =
final EntityTable<IndicatorTemplate> indicatorTable =
this.pageService
.entityTableBuilder(this.restService.getRestCall(GetExamTemplateIndicatorPage.class))
.entityTableBuilder(this.restService.getRestCall(GetIndicatorTemplatePage.class))
.withRestCallAdapter(builder -> builder.withURIVariable(
API.PARAM_PARENT_MODEL_ID,
entityKey.modelId))
@ -220,36 +220,36 @@ public class ExamTemplateForm implements TemplateComposer {
.withColumn(new ColumnDefinition<>(
Domain.INDICATOR.ATTR_NAME,
INDICATOR_NAME_COLUMN_KEY,
Indicator::getName)
IndicatorTemplate::getName)
.widthProportion(2))
.withColumn(new ColumnDefinition<>(
Domain.INDICATOR.ATTR_TYPE,
INDICATOR_TYPE_COLUMN_KEY,
this::indicatorTypeName)
.widthProportion(1))
.withColumn(new ColumnDefinition<>(
.withColumn(new ColumnDefinition<IndicatorTemplate>(
Domain.THRESHOLD.REFERENCE_NAME,
INDICATOR_THRESHOLD_COLUMN_KEY,
ExamFormIndicators::thresholdsValue)
it -> ExamFormIndicators.thresholdsValue(it.thresholds, it.type))
.asMarkup()
.widthProportion(4))
.withDefaultActionIf(
() -> userGrant.im(),
() -> actionBuilder
.newAction(ActionDefinition.EXAM_TEMPLATE_INDICATOR_MODIFY_FROM_LIST)
.newAction(ActionDefinition.INDICATOR_TEMPLATE_MODIFY_FROM_LIST)
.withParentEntityKey(entityKey)
.create())
.withSelectionListener(this.pageService.getSelectionPublisher(
pageContext,
ActionDefinition.EXAM_TEMPLATE_INDICATOR_MODIFY_FROM_LIST,
ActionDefinition.EXAM_TEMPLATE_INDICATOR_DELETE_FROM_LIST))
ActionDefinition.INDICATOR_TEMPLATE_MODIFY_FROM_LIST,
ActionDefinition.INDICATOR_TEMPLATE_DELETE_FROM_LIST))
.compose(pageContext.copyOf(content));
actionBuilder
.newAction(ActionDefinition.EXAM_TEMPLATE_INDICATOR_MODIFY_FROM_LIST)
.newAction(ActionDefinition.INDICATOR_TEMPLATE_MODIFY_FROM_LIST)
.withParentEntityKey(entityKey)
.withSelect(
indicatorTable::getSelection,
@ -257,7 +257,7 @@ public class ExamTemplateForm implements TemplateComposer {
INDICATOR_EMPTY_SELECTION_TEXT_KEY)
.publishIf(() -> userGrant.im() && indicatorTable.hasAnyContent(), false)
.newAction(ActionDefinition.EXAM_TEMPLATE_INDICATOR_DELETE_FROM_LIST)
.newAction(ActionDefinition.INDICATOR_TEMPLATE_DELETE_FROM_LIST)
.withEntityKey(entityKey)
.withSelect(
indicatorTable::getSelection,
@ -265,7 +265,7 @@ public class ExamTemplateForm implements TemplateComposer {
INDICATOR_EMPTY_SELECTION_TEXT_KEY)
.publishIf(() -> userGrant.im() && indicatorTable.hasAnyContent(), false)
.newAction(ActionDefinition.EXAM_TEMPLATE_INDICATOR_NEW)
.newAction(ActionDefinition.INDICATOR_TEMPLATE_NEW)
.withParentEntityKey(entityKey)
.publishIf(() -> userGrant.im());
}
@ -275,14 +275,14 @@ public class ExamTemplateForm implements TemplateComposer {
final EntityKey entityKey = action.getEntityKey();
final EntityKey indicatorKey = action.getSingleSelection();
this.resourceService.getRestService()
.getBuilder(DeleteExamTemplateIndicator.class)
.getBuilder(DeleteIndicatorTemplate.class)
.withURIVariable(API.PARAM_PARENT_MODEL_ID, entityKey.modelId)
.withURIVariable(API.PARAM_MODEL_ID, indicatorKey.modelId)
.call();
return action;
}
private String indicatorTypeName(final Indicator indicator) {
private String indicatorTypeName(final IndicatorTemplate indicator) {
if (indicator.type == null) {
return Constants.EMPTY_NOTE;
}

View file

@ -1,29 +0,0 @@
/*
* Copyright (c) 2021 ETH Zürich, Educational Development and Technology (LET)
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
package ch.ethz.seb.sebserver.gui.content.exam;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Component;
import ch.ethz.seb.sebserver.gbl.profile.GuiProfile;
import ch.ethz.seb.sebserver.gui.service.page.PageContext;
import ch.ethz.seb.sebserver.gui.service.page.TemplateComposer;
@Lazy
@Component
@GuiProfile
public class ExamTemplateIndicatorForm implements TemplateComposer {
@Override
public void compose(final PageContext pageContext) {
// TODO Auto-generated method stub
}
}

View file

@ -99,7 +99,7 @@ public class IndicatorForm implements TemplateComposer {
// get data or create new. Handle error if happen
final Indicator indicator = (isNew)
? Indicator.createNew(exam)
? Indicator.createNew(exam.getModelId())
: restService
.getBuilder(GetIndicator.class)
.withURIVariable(API.PARAM_MODEL_ID, entityKey.modelId)
@ -176,7 +176,7 @@ public class IndicatorForm implements TemplateComposer {
.addField(FormBuilder.thresholdList(
Domain.THRESHOLD.REFERENCE_NAME,
FORM_THRESHOLDS_TEXT_KEY,
indicator))
indicator.thresholds))
.buildFor((isNew)
? restService.getRestCall(NewIndicator.class)

View file

@ -0,0 +1,221 @@
/*
* Copyright (c) 2021 ETH Zürich, Educational Development and Technology (LET)
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
package ch.ethz.seb.sebserver.gui.content.exam;
import org.apache.commons.lang3.StringUtils;
import org.eclipse.swt.widgets.Composite;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Component;
import ch.ethz.seb.sebserver.gbl.Constants;
import ch.ethz.seb.sebserver.gbl.api.API;
import ch.ethz.seb.sebserver.gbl.api.EntityType;
import ch.ethz.seb.sebserver.gbl.model.Domain;
import ch.ethz.seb.sebserver.gbl.model.EntityKey;
import ch.ethz.seb.sebserver.gbl.model.exam.ExamTemplate;
import ch.ethz.seb.sebserver.gbl.model.exam.Indicator.IndicatorType;
import ch.ethz.seb.sebserver.gbl.model.exam.IndicatorTemplate;
import ch.ethz.seb.sebserver.gbl.profile.GuiProfile;
import ch.ethz.seb.sebserver.gbl.util.Utils;
import ch.ethz.seb.sebserver.gui.content.action.ActionDefinition;
import ch.ethz.seb.sebserver.gui.form.Form;
import ch.ethz.seb.sebserver.gui.form.FormBuilder;
import ch.ethz.seb.sebserver.gui.form.FormHandle;
import ch.ethz.seb.sebserver.gui.service.ResourceService;
import ch.ethz.seb.sebserver.gui.service.i18n.I18nSupport;
import ch.ethz.seb.sebserver.gui.service.i18n.LocTextKey;
import ch.ethz.seb.sebserver.gui.service.page.PageContext;
import ch.ethz.seb.sebserver.gui.service.page.PageService;
import ch.ethz.seb.sebserver.gui.service.page.TemplateComposer;
import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.RestService;
import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.exam.GetExamTemplate;
import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.exam.GetIndicatorTemplate;
import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.exam.NewIndicatorTemplate;
import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.exam.SaveIndicatorTemplate;
import ch.ethz.seb.sebserver.gui.widget.WidgetFactory;
@Lazy
@Component
@GuiProfile
public class IndicatorTemplateForm implements TemplateComposer {
private static final LocTextKey NEW_INDICATOR_TILE_TEXT_KEY =
new LocTextKey("sebserver.exam.indicator.form.title.new");
private static final LocTextKey INDICATOR_TILE_TEXT_KEY =
new LocTextKey("sebserver.exam.indicator.form.title");
private static final LocTextKey FORM_THRESHOLDS_TEXT_KEY =
new LocTextKey("sebserver.exam.indicator.form.thresholds");
private static final LocTextKey FORM_COLOR_TEXT_KEY =
new LocTextKey("sebserver.exam.indicator.form.color");
private static final LocTextKey FORM_TYPE_TEXT_KEY =
new LocTextKey("sebserver.exam.indicator.form.type");
private static final LocTextKey FORM_NAME_TEXT_KEY =
new LocTextKey("sebserver.exam.indicator.form.name");
private static final LocTextKey FORM_TAGS_TEXT_KEY =
new LocTextKey("sebserver.exam.indicator.form.tags");
private static final LocTextKey FORM_EXAM_TEXT_KEY =
new LocTextKey("sebserver.exam.indicator.form.exam");
private static final LocTextKey FORM_DESC_TEXT_KEY =
new LocTextKey("sebserver.exam.indicator.form.description");
private static final String INDICATOR_TYPE_DESC_PREFIX =
"sebserver.exam.indicator.type.description.";
private static final String TYPE_DESCRIPTION_FIELD_NAME =
"typeDescription";
private final PageService pageService;
private final ResourceService resourceService;
private final I18nSupport i18nSupport;
protected IndicatorTemplateForm(final PageService pageService) {
this.pageService = pageService;
this.resourceService = pageService.getResourceService();
this.i18nSupport = pageService.getI18nSupport();
}
@Override
public void compose(final PageContext pageContext) {
final RestService restService = this.resourceService.getRestService();
final WidgetFactory widgetFactory = this.pageService.getWidgetFactory();
final EntityKey entityKey = pageContext.getEntityKey();
final EntityKey parentEntityKey = pageContext.getParentEntityKey();
final boolean isNew = entityKey == null;
final boolean isReadonly = pageContext.isReadonly();
final ExamTemplate examTemplate = restService
.getBuilder(GetExamTemplate.class)
.withURIVariable(API.PARAM_MODEL_ID, parentEntityKey.modelId)
.call()
.onError(error -> pageContext.notifyLoadError(EntityType.EXAM, error))
.getOrThrow();
// get data or create new. Handle error if happen
final IndicatorTemplate indicatorTemplate = (isNew)
? new IndicatorTemplate(null, Long.parseLong(parentEntityKey.modelId),
null, null, null, null, null, null)
: restService
.getBuilder(GetIndicatorTemplate.class)
.withURIVariable(API.PARAM_PARENT_MODEL_ID, parentEntityKey.modelId)
.withURIVariable(API.PARAM_MODEL_ID, entityKey.modelId)
.call()
.onError(error -> pageContext.notifyLoadError(EntityType.INDICATOR, error))
.getOrThrow();
final boolean typeSet = indicatorTemplate.type != null;
final String typeDescription = (typeSet)
? Utils.formatLineBreaks(
this.i18nSupport.getText(INDICATOR_TYPE_DESC_PREFIX + indicatorTemplate.type.name))
: Constants.EMPTY_NOTE;
// new PageContext with actual EntityKey
final PageContext formContext = pageContext.withEntityKey(indicatorTemplate.getEntityKey());
// the default page layout
final LocTextKey titleKey = (isNew)
? NEW_INDICATOR_TILE_TEXT_KEY
: INDICATOR_TILE_TEXT_KEY;
final Composite content = widgetFactory.defaultPageLayout(
formContext.getParent(),
titleKey);
final FormHandle<IndicatorTemplate> formHandle = this.pageService.formBuilder(
formContext.copyOf(content))
.readonly(isReadonly)
.putStaticValueIf(() -> !isNew,
Domain.INDICATOR.ATTR_ID,
indicatorTemplate.getModelId())
.putStaticValue(
Domain.EXAM.ATTR_INSTITUTION_ID,
String.valueOf(examTemplate.getInstitutionId()))
.putStaticValue(
Domain.INDICATOR.ATTR_EXAM_ID,
parentEntityKey.getModelId())
.addField(FormBuilder.text(
Domain.EXAM_TEMPLATE.ATTR_NAME,
FORM_EXAM_TEXT_KEY,
examTemplate.name)
.readonly(true))
.addField(FormBuilder.text(
Domain.INDICATOR.ATTR_NAME,
FORM_NAME_TEXT_KEY,
indicatorTemplate.name)
.mandatory(!isReadonly))
.addField(FormBuilder.singleSelection(
Domain.INDICATOR.ATTR_TYPE,
FORM_TYPE_TEXT_KEY,
(indicatorTemplate.type != null) ? indicatorTemplate.type.name() : null,
this.resourceService::indicatorTypeResources)
.withSelectionListener(this::updateForm)
.mandatory(!isReadonly))
.addField(FormBuilder.text(
TYPE_DESCRIPTION_FIELD_NAME,
FORM_DESC_TEXT_KEY,
typeDescription)
.asArea()
//.asHTML(true)
.readonly(true)
.withInputSpan(6))
.addField(FormBuilder.colorSelection(
Domain.INDICATOR.ATTR_COLOR,
FORM_COLOR_TEXT_KEY,
indicatorTemplate.defaultColor)
.withEmptyCellSeparation(false))
.addField(FormBuilder.text(
Domain.INDICATOR.ATTR_TAGS,
FORM_TAGS_TEXT_KEY,
indicatorTemplate.tags)
.visibleIf(indicatorTemplate.type != null && indicatorTemplate.type.tags
&& !indicatorTemplate.type.tagsReadonly))
.addField(FormBuilder.thresholdList(
Domain.THRESHOLD.REFERENCE_NAME,
FORM_THRESHOLDS_TEXT_KEY,
indicatorTemplate.thresholds))
.buildFor((isNew)
? restService.getRestCall(NewIndicatorTemplate.class)
: restService.getRestCall(SaveIndicatorTemplate.class));
// propagate content actions to action-pane
this.pageService.pageActionBuilder(formContext.clearEntityKeys())
.newAction(ActionDefinition.INDICATOR_TEMPLATE_SAVE)
.withEntityKey(parentEntityKey)
.withExec(formHandle::processFormSave)
.ignoreMoveAwayFromEdit()
.publishIf(() -> !isReadonly)
.newAction(ActionDefinition.INDICATOR_TEMPLATE_CANCEL_MODIFY)
.withEntityKey(parentEntityKey)
.withExec(this.pageService.backToCurrentFunction())
.publishIf(() -> !isReadonly);
}
private void updateForm(final Form form) {
final String typeValue = form.getFieldValue(Domain.INDICATOR.ATTR_TYPE);
if (StringUtils.isNotBlank(typeValue)) {
final String text = this.i18nSupport.getText(INDICATOR_TYPE_DESC_PREFIX + typeValue);
form.setFieldValue(
TYPE_DESCRIPTION_FIELD_NAME,
Utils.formatLineBreaks(text));
final IndicatorType type = IndicatorType.valueOf(typeValue);
form.setFieldVisible(type.tags && !type.tagsReadonly, Domain.INDICATOR.ATTR_TAGS);
if (!type.tags || type.tagsReadonly) {
form.setFieldValue(Domain.INDICATOR.ATTR_TAGS, StringUtils.EMPTY);
}
} else {
form.setFieldValue(TYPE_DESCRIPTION_FIELD_NAME, Constants.EMPTY_NOTE);
}
}
}

View file

@ -24,7 +24,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import ch.ethz.seb.sebserver.gbl.model.Entity;
import ch.ethz.seb.sebserver.gbl.model.exam.Indicator;
import ch.ethz.seb.sebserver.gbl.model.exam.Indicator.Threshold;
import ch.ethz.seb.sebserver.gbl.util.Cryptor;
import ch.ethz.seb.sebserver.gbl.util.Tuple;
import ch.ethz.seb.sebserver.gui.service.i18n.I18nSupport;
@ -279,12 +279,12 @@ public class FormBuilder {
public static ThresholdListBuilder thresholdList(
final String name,
final LocTextKey label,
final Indicator indicator) {
final List<Threshold> thresholds) {
return new ThresholdListBuilder(
name,
label,
indicator.thresholds);
thresholds);
}
public static ImageUploadFieldBuilder imageUpload(final String name, final LocTextKey label, final String value) {

View file

@ -24,9 +24,9 @@ import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.RestCall;
@Lazy
@Component
@GuiProfile
public class DeleteExamTemplateIndicator extends RestCall<EntityKey> {
public class DeleteIndicatorTemplate extends RestCall<EntityKey> {
public DeleteExamTemplateIndicator() {
public DeleteIndicatorTemplate() {
super(new TypeKey<>(
CallType.DELETE,
EntityType.INDICATOR,

View file

@ -17,20 +17,20 @@ import com.fasterxml.jackson.core.type.TypeReference;
import ch.ethz.seb.sebserver.gbl.api.API;
import ch.ethz.seb.sebserver.gbl.api.EntityType;
import ch.ethz.seb.sebserver.gbl.model.exam.Indicator;
import ch.ethz.seb.sebserver.gbl.model.exam.IndicatorTemplate;
import ch.ethz.seb.sebserver.gbl.profile.GuiProfile;
import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.RestCall;
@Lazy
@Component
@GuiProfile
public class GetExamTemplateIndicator extends RestCall<Indicator> {
public class GetIndicatorTemplate extends RestCall<IndicatorTemplate> {
public GetExamTemplateIndicator() {
public GetIndicatorTemplate() {
super(new TypeKey<>(
CallType.GET_SINGLE,
EntityType.INDICATOR,
new TypeReference<Indicator>() {
new TypeReference<IndicatorTemplate>() {
}),
HttpMethod.GET,
MediaType.APPLICATION_FORM_URLENCODED,

View file

@ -18,20 +18,20 @@ import com.fasterxml.jackson.core.type.TypeReference;
import ch.ethz.seb.sebserver.gbl.api.API;
import ch.ethz.seb.sebserver.gbl.api.EntityType;
import ch.ethz.seb.sebserver.gbl.model.Page;
import ch.ethz.seb.sebserver.gbl.model.exam.Indicator;
import ch.ethz.seb.sebserver.gbl.model.exam.IndicatorTemplate;
import ch.ethz.seb.sebserver.gbl.profile.GuiProfile;
import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.RestCall;
@Lazy
@Component
@GuiProfile
public class GetExamTemplateIndicatorPage extends RestCall<Page<Indicator>> {
public class GetIndicatorTemplatePage extends RestCall<Page<IndicatorTemplate>> {
public GetExamTemplateIndicatorPage() {
public GetIndicatorTemplatePage() {
super(new TypeKey<>(
CallType.GET_PAGE,
EntityType.INDICATOR,
new TypeReference<Page<Indicator>>() {
new TypeReference<Page<IndicatorTemplate>>() {
}),
HttpMethod.GET,
MediaType.APPLICATION_FORM_URLENCODED,

View file

@ -17,25 +17,24 @@ import com.fasterxml.jackson.core.type.TypeReference;
import ch.ethz.seb.sebserver.gbl.api.API;
import ch.ethz.seb.sebserver.gbl.api.EntityType;
import ch.ethz.seb.sebserver.gbl.model.exam.Indicator;
import ch.ethz.seb.sebserver.gbl.model.exam.IndicatorTemplate;
import ch.ethz.seb.sebserver.gbl.profile.GuiProfile;
import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.RestCall;
@Lazy
@Component
@GuiProfile
public class NewExamTemplateIndicator extends RestCall<Indicator> {
public class NewIndicatorTemplate extends RestCall<IndicatorTemplate> {
public NewExamTemplateIndicator() {
public NewIndicatorTemplate() {
super(new TypeKey<>(
CallType.NEW,
EntityType.INDICATOR,
new TypeReference<Indicator>() {
new TypeReference<IndicatorTemplate>() {
}),
HttpMethod.POST,
MediaType.APPLICATION_FORM_URLENCODED,
API.EXAM_TEMPLATE_ENDPOINT
+ API.PARENT_MODEL_ID_VAR_PATH_SEGMENT
+ API.EXAM_TEMPLATE_INDICATOR_PATH_SEGMENT);
}

View file

@ -17,27 +17,25 @@ import com.fasterxml.jackson.core.type.TypeReference;
import ch.ethz.seb.sebserver.gbl.api.API;
import ch.ethz.seb.sebserver.gbl.api.EntityType;
import ch.ethz.seb.sebserver.gbl.model.exam.Indicator;
import ch.ethz.seb.sebserver.gbl.model.exam.IndicatorTemplate;
import ch.ethz.seb.sebserver.gbl.profile.GuiProfile;
import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.RestCall;
@Lazy
@Component
@GuiProfile
public class SaveExamTemplateIndicator extends RestCall<Indicator> {
public class SaveIndicatorTemplate extends RestCall<IndicatorTemplate> {
public SaveExamTemplateIndicator() {
public SaveIndicatorTemplate() {
super(new TypeKey<>(
CallType.SAVE,
EntityType.INDICATOR,
new TypeReference<Indicator>() {
new TypeReference<IndicatorTemplate>() {
}),
HttpMethod.PUT,
MediaType.APPLICATION_JSON,
API.EXAM_TEMPLATE_ENDPOINT
+ API.PARENT_MODEL_ID_VAR_PATH_SEGMENT
+ API.EXAM_TEMPLATE_INDICATOR_PATH_SEGMENT
+ API.MODEL_ID_VAR_PATH_SEGMENT);
+ API.EXAM_TEMPLATE_INDICATOR_PATH_SEGMENT);
}
}

View file

@ -34,7 +34,7 @@ import ch.ethz.seb.sebserver.gbl.api.JSONMapper;
import ch.ethz.seb.sebserver.gbl.model.EntityKey;
import ch.ethz.seb.sebserver.gbl.model.exam.Exam.ExamType;
import ch.ethz.seb.sebserver.gbl.model.exam.ExamTemplate;
import ch.ethz.seb.sebserver.gbl.model.exam.Indicator;
import ch.ethz.seb.sebserver.gbl.model.exam.IndicatorTemplate;
import ch.ethz.seb.sebserver.gbl.profile.WebServiceProfile;
import ch.ethz.seb.sebserver.gbl.util.Result;
import ch.ethz.seb.sebserver.webservice.datalayer.batis.mapper.ExamTemplateRecordDynamicSqlSupport;
@ -125,7 +125,7 @@ public class ExamTemplateDAOImpl implements ExamTemplateDAO {
checkUniqueName(data);
final Collection<Indicator> indicatorTemplates = data.getIndicatorTemplates();
final Collection<IndicatorTemplate> indicatorTemplates = data.getIndicatorTemplates();
final String indicatorsJSON = (indicatorTemplates != null && !indicatorTemplates.isEmpty())
? this.jsonMapper.writeValueAsString(indicatorTemplates)
: null;
@ -158,7 +158,7 @@ public class ExamTemplateDAOImpl implements ExamTemplateDAO {
checkUniqueName(data);
final Collection<Indicator> indicatorTemplates = data.getIndicatorTemplates();
final Collection<IndicatorTemplate> indicatorTemplates = data.getIndicatorTemplates();
final String indicatorsJSON = (indicatorTemplates != null && !indicatorTemplates.isEmpty())
? this.jsonMapper.writeValueAsString(indicatorTemplates)
: null;
@ -232,9 +232,10 @@ public class ExamTemplateDAOImpl implements ExamTemplateDAO {
return Result.tryCatch(() -> {
final String indicatorTemplatesString = record.getIndicatorTemplates();
final Collection<Indicator> indicators = (StringUtils.isNotBlank(indicatorTemplatesString))
? this.jsonMapper.readValue(indicatorTemplatesString, new TypeReference<Collection<Indicator>>() {
})
final Collection<IndicatorTemplate> indicators = (StringUtils.isNotBlank(indicatorTemplatesString))
? this.jsonMapper.readValue(indicatorTemplatesString,
new TypeReference<Collection<IndicatorTemplate>>() {
})
: null;
final Map<String, String> examAttributes = this.additionalAttributesDAO

View file

@ -41,6 +41,7 @@ import ch.ethz.seb.sebserver.gbl.model.Page;
import ch.ethz.seb.sebserver.gbl.model.PageSortOrder;
import ch.ethz.seb.sebserver.gbl.model.exam.ExamTemplate;
import ch.ethz.seb.sebserver.gbl.model.exam.Indicator;
import ch.ethz.seb.sebserver.gbl.model.exam.IndicatorTemplate;
import ch.ethz.seb.sebserver.gbl.profile.WebServiceProfile;
import ch.ethz.seb.sebserver.webservice.datalayer.batis.mapper.ExamTemplateRecordDynamicSqlSupport;
import ch.ethz.seb.sebserver.webservice.servicelayer.PaginationService;
@ -82,7 +83,7 @@ public class ExamTemplateController extends EntityController<ExamTemplate, ExamT
method = RequestMethod.GET,
consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE,
produces = MediaType.APPLICATION_JSON_VALUE)
public Page<Indicator> getIndicatorPage(
public Page<IndicatorTemplate> getIndicatorPage(
@PathVariable final String modelId,
@RequestParam(
name = API.PARAM_INSTITUTION_ID,
@ -119,7 +120,7 @@ public class ExamTemplateController extends EntityController<ExamTemplate, ExamT
method = RequestMethod.GET,
consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE,
produces = MediaType.APPLICATION_JSON_VALUE)
public Indicator getIndicatorBy(
public IndicatorTemplate getIndicatorBy(
@PathVariable final String parentModelId,
@PathVariable final String modelId,
@RequestParam(
@ -144,13 +145,11 @@ public class ExamTemplateController extends EntityController<ExamTemplate, ExamT
}
@RequestMapping(
path = API.PARENT_MODEL_ID_VAR_PATH_SEGMENT
+ API.EXAM_TEMPLATE_INDICATOR_PATH_SEGMENT,
path = API.EXAM_TEMPLATE_INDICATOR_PATH_SEGMENT,
method = RequestMethod.POST,
consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE,
produces = MediaType.APPLICATION_JSON_VALUE)
public Indicator createIndicator(
@PathVariable final String parentModelId,
public IndicatorTemplate createIndicatorTemplate(
@RequestParam final MultiValueMap<String, String> allRequestParams,
@RequestParam(
name = API.PARAM_INSTITUTION_ID,
@ -161,19 +160,21 @@ public class ExamTemplateController extends EntityController<ExamTemplate, ExamT
// check write privilege for requested institution and concrete entityType
this.checkWritePrivilege(institutionId);
final ExamTemplate examTemplate = super.entityDAO
.byModelId(parentModelId)
.getOrThrow();
final POSTMapper postMap = new POSTMapper(allRequestParams, request.getQueryString())
.putIfAbsent(API.PARAM_INSTITUTION_ID, String.valueOf(institutionId));
final Indicator newIndicator = new Indicator(
final String examTemplateId = postMap.getString(IndicatorTemplate.ATTR_EXAM_TEMPLATE_ID);
final ExamTemplate examTemplate = super.entityDAO
.byModelId(examTemplateId)
.getOrThrow();
final IndicatorTemplate newIndicator = new IndicatorTemplate(
(long) examTemplate.getIndicatorTemplates().size(),
Long.parseLong(parentModelId),
Long.parseLong(examTemplateId),
postMap);
final ArrayList<Indicator> indicators = new ArrayList<>(examTemplate.indicatorTemplates);
final ArrayList<IndicatorTemplate> indicators = new ArrayList<>(examTemplate.indicatorTemplates);
indicators.add(newIndicator);
final ExamTemplate newExamTemplate = new ExamTemplate(
examTemplate.id,
@ -189,29 +190,26 @@ public class ExamTemplateController extends EntityController<ExamTemplate, ExamT
}
@RequestMapping(
path = API.PARENT_MODEL_ID_VAR_PATH_SEGMENT
+ API.EXAM_TEMPLATE_INDICATOR_PATH_SEGMENT
+ API.MODEL_ID_VAR_PATH_SEGMENT,
path = API.EXAM_TEMPLATE_INDICATOR_PATH_SEGMENT,
method = RequestMethod.PUT,
consumes = MediaType.APPLICATION_JSON_VALUE,
produces = MediaType.APPLICATION_JSON_VALUE)
public Indicator saveIndicatorPut(
@PathVariable final String parentModelId,
@PathVariable final String modelId,
public IndicatorTemplate saveIndicatorPut(
@RequestParam(
name = API.PARAM_INSTITUTION_ID,
required = true,
defaultValue = UserService.USERS_INSTITUTION_AS_DEFAULT) final Long institutionId,
@Valid @RequestBody final Indicator modifyData) {
@Valid @RequestBody final IndicatorTemplate modifyData) {
// check modify privilege for requested institution and concrete entityType
this.checkModifyPrivilege(institutionId);
final ExamTemplate examTemplate = super.entityDAO
.byModelId(parentModelId)
.byPK(modifyData.examTemplateId)
.getOrThrow();
final List<Indicator> newIndicators = examTemplate.indicatorTemplates
final String modelId = modifyData.getModelId();
final List<IndicatorTemplate> newIndicators = examTemplate.indicatorTemplates
.stream()
.map(i -> {
if (modelId.equals(i.getModelId())) {
@ -241,7 +239,7 @@ public class ExamTemplateController extends EntityController<ExamTemplate, ExamT
+ API.MODEL_ID_VAR_PATH_SEGMENT,
method = RequestMethod.DELETE,
produces = MediaType.APPLICATION_JSON_VALUE)
public EntityKey deleteIndicator(
public EntityKey deleteIndicatorTemplate(
@PathVariable final String parentModelId,
@PathVariable final String modelId,
@RequestParam(
@ -256,7 +254,7 @@ public class ExamTemplateController extends EntityController<ExamTemplate, ExamT
.byModelId(parentModelId)
.getOrThrow();
final List<Indicator> newIndicators = examTemplate.indicatorTemplates
final List<IndicatorTemplate> newIndicators = examTemplate.indicatorTemplates
.stream()
.filter(i -> !modelId.equals(i.getModelId()))
.collect(Collectors.toList());
@ -285,11 +283,11 @@ public class ExamTemplateController extends EntityController<ExamTemplate, ExamT
return ExamTemplateRecordDynamicSqlSupport.examTemplateRecord;
}
static Function<Collection<Indicator>, List<Indicator>> pageSort(final String sort) {
static Function<Collection<IndicatorTemplate>, List<IndicatorTemplate>> pageSort(final String sort) {
final String sortBy = PageSortOrder.decode(sort);
return indicators -> {
final List<Indicator> list = indicators.stream().collect(Collectors.toList());
final List<IndicatorTemplate> list = indicators.stream().collect(Collectors.toList());
if (StringUtils.isBlank(sort)) {
return list;
}

View file

@ -6,7 +6,7 @@ DROP TABLE IF EXISTS `exam_template` ;
CREATE TABLE IF NOT EXISTS `exam_template` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
`institution_id` BIGINT UNSIGNED NOT NULL,
`configuration_template_id` BIGINT UNSIGNED NOT NULL,
`configuration_template_id` BIGINT UNSIGNED NULL,
`name` VARCHAR(255) NOT NULL,
`description` VARCHAR(4000) NULL,
`exam_type` VARCHAR(45) NULL,

View file

@ -1602,8 +1602,8 @@ sebserver.examtemplate.list.title.subtitle=
sebserver.examtemplate.list.empty=There is currently no exam template available. Please create a new one
sebserver.examtemplate.list.actions=
sebserver.examtemplate.list.action.no.modify.privilege=No Access: An Exam Template from other institution cannot be modified.
sebserver.examtemplate.action.list.view=View
sebserver.examtemplate.action.list.modify=Edit
sebserver.examtemplate.action.list.view=View Exam Template
sebserver.examtemplate.action.list.modify=Edit Exam Template
sebserver.examtemplate.action.list.new=Add Exam Template
sebserver.examtemplate.list.column.institution=Institution
@ -1629,7 +1629,10 @@ sebserver.examtemplate.form.examConfigTemplate.tooltip=The linked ecam configura
sebserver.examtemplate.form.supporter=Exam Supporter
sebserver.examtemplate.form.supporter.tooltip=List of all exam supporter user that will automatically be applied to an exam imported with this template.
sebserver.examtemplate.form.action.save=Save
sebserver.examtemplate.form.action.edit=Edit Template Settings
sebserver.examtemplate.indicator.list.actions=
sebserver.examtemplate.indicator.list.title=Indicators
sebserver.examtemplate.indicator.list.title.tooltip=A list of indicators that will automatically be created when importing a exam with this template
sebserver.examtemplate.indicator.list.column.type=Type

View file

@ -611,7 +611,7 @@ DROP TABLE IF EXISTS `exam_template` ;
CREATE TABLE IF NOT EXISTS `exam_template` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
`institution_id` BIGINT UNSIGNED NOT NULL,
`configuration_template_id` BIGINT UNSIGNED NOT NULL,
`configuration_template_id` BIGINT UNSIGNED NULL,
`name` VARCHAR(255) NOT NULL,
`description` VARCHAR(4000) NULL,
`exam_type` VARCHAR(45) NULL,