GUI improvements 2 and wording first part

This commit is contained in:
anhefti 2020-03-10 16:50:23 +01:00
parent 8698800c34
commit 59030d4bbd
24 changed files with 478 additions and 266 deletions

View file

@ -167,13 +167,10 @@ public class ConfigTemplateAttributeForm implements TemplateComposer {
valSpace.setLayout(new GridLayout());
valSpace.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
widgetFactory.label(content, StringUtils.EMPTY);
widgetFactory.labelLocalized(
widgetFactory.addFormSubContextHeader(
valSpace,
CustomVariant.TEXT_H3,
FORM_VALUE_TEXT_KEY,
FORM_VALUE_TOOLTIP_TEXT_KEY);
widgetFactory.labelSeparator(valSpace);
FORM_VALUE_TOOLTIP_TEXT_KEY );
final Composite grid = new Composite(valSpace, SWT.NONE);
grid.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));

View file

@ -177,13 +177,10 @@ public class ConfigTemplateForm implements TemplateComposer {
if (isReadonly) {
widgetFactory.label(content, StringUtils.EMPTY);
widgetFactory.labelLocalized(
widgetFactory.addFormSubContextHeader(
content,
WidgetFactory.CustomVariant.TEXT_H3,
ATTRIBUTES_LIST_TITLE_TEXT_KEY,
ATTRIBUTES_LIST_TITLE_TOOLTIP_TEXT_KEY);
widgetFactory.labelSeparator(content);
final TableFilterAttribute viewFilter = new TableFilterAttribute(
CriteriaType.SINGLE_SELECTION,

View file

@ -688,7 +688,7 @@ public class ExamForm implements TemplateComposer {
final EntityKey examConfigMappingKey = action.getSingleSelection();
if (examConfigMappingKey != null) {
action.withEntityKey(examConfigMappingKey);
return SebExamConfigPropForm
return SebExamConfigForm
.getConfigKeyFunction(this.pageService)
.apply(action);
}

View file

@ -84,9 +84,11 @@ public class InstitutionList implements TemplateComposer {
@Override
public void compose(final PageContext pageContext) {
final Composite content = this.pageService.getWidgetFactory().defaultPageLayout(
pageContext.getParent(),
TITLE_TEXT_KEY);
final Composite content = this.pageService
.getWidgetFactory()
.defaultPageLayout(
pageContext.getParent(),
TITLE_TEXT_KEY);
final PageActionBuilder pageActionBuilder =
this.pageService.pageActionBuilder(pageContext.clearEntityKeys());

View file

@ -8,10 +8,16 @@
package ch.ethz.seb.sebserver.gui.content;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
import java.util.function.BooleanSupplier;
import java.util.function.Function;
import ch.ethz.seb.sebserver.gbl.model.sebconfig.SebClientConfig;
import org.apache.commons.lang3.StringUtils;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Component;
@ -79,15 +85,26 @@ public class LmsSetupForm implements TemplateComposer {
new LocTextKey("sebserver.lmssetup.form.institution");
private static final LocTextKey FORM_PROXY_KEY =
new LocTextKey("sebserver.lmssetup.form.proxy");
private static final LocTextKey FORM_PROXY_CHECK_KEY =
new LocTextKey("sebserver.lmssetup.form.proxy.check");
private static final LocTextKey FORM_PROXY_HOST_KEY =
new LocTextKey("sebserver.lmssetup.form.proxy.host");
private static final LocTextKey FORM_PROXY_PORT_KEY =
new LocTextKey("sebserver.lmssetup.form.proxy.port");
private static final LocTextKey FORM_PROXY_AUTH_CREDENTIALS_KEY =
new LocTextKey("sebserver.lmssetup.form.proxy.auth-credentials");
private static final LocTextKey FORM_PROXY_NAME_KEY =
new LocTextKey("sebserver.lmssetup.form.proxy.name");
private static final LocTextKey FORM_PROXY_PWD_KEY =
new LocTextKey("sebserver.lmssetup.form.proxy.password");
public static final LocTextKey LMS_SETUP_TEST_OK =
new LocTextKey("sebserver.lmssetup.action.test.ok");
private static final Set<String> PROXY_ATTRIBUTES = new HashSet<>(Arrays.asList(
Domain.LMS_SETUP.ATTR_LMS_PROXY_HOST,
Domain.LMS_SETUP.ATTR_LMS_PROXY_PORT,
Domain.LMS_SETUP.ATTR_LMS_PROXY_AUTH_USERNAME,
Domain.LMS_SETUP.ATTR_LMS_PROXY_AUTH_SECRET
));
private final PageService pageService;
private final ResourceService resourceService;
@ -145,6 +162,9 @@ public class LmsSetupForm implements TemplateComposer {
.call()
.map(inst -> inst.active)
.getOr(false);
final boolean withProxy = StringUtils.isNotBlank(lmsSetup.proxyHost) ||
StringUtils.isNotBlank(lmsSetup.proxyAuthUsername) ||
lmsSetup.proxyPort != null;
// The LMS Setup form
final LmsType lmsType = lmsSetup.getLmsType();
@ -207,17 +227,18 @@ public class LmsSetupForm implements TemplateComposer {
.asPasswordField()
.mandatory(!readonly))
.addFieldIf(
() -> readonly,
() -> FormBuilder.text(
Domain.LMS_SETUP.ATTR_LMS_PROXY_HOST,
FORM_PROXY_KEY,
(StringUtils.isNotBlank(lmsSetup.getProxyHost()))
? lmsSetup.getProxyHost() + Constants.URL_PORT_SEPARATOR + lmsSetup.proxyPort
: null))
.addFieldIf(
isEdit,
() -> FormBuilder.checkbox(
"FORM_PROXY_CHECK",
FORM_PROXY_CHECK_KEY,
withProxy
? Constants.TRUE_STRING
: Constants.FALSE_STRING))
.addFieldIf(
() -> !readonly || withProxy,
() -> FormBuilder.text(
Domain.LMS_SETUP.ATTR_LMS_PROXY_HOST,
FORM_PROXY_HOST_KEY,
@ -225,7 +246,7 @@ public class LmsSetupForm implements TemplateComposer {
.withInputSpan(3)
.withEmptyCellSpan(0))
.addFieldIf(
isEdit,
() -> !readonly || withProxy,
() -> FormBuilder.text(
Domain.LMS_SETUP.ATTR_LMS_PROXY_PORT,
FORM_PROXY_PORT_KEY,
@ -240,26 +261,47 @@ public class LmsSetupForm implements TemplateComposer {
.withEmptyCellSeparation(false)
.withEmptyCellSpan(0))
.addFieldIf(
isEdit,
() -> !readonly || withProxy,
() -> FormBuilder.text(
Domain.LMS_SETUP.ATTR_LMS_PROXY_AUTH_USERNAME,
FORM_PROXY_AUTH_CREDENTIALS_KEY,
FORM_PROXY_NAME_KEY,
lmsSetup.getProxyAuthUsername())
.withInputSpan(3)
.withEmptyCellSpan(0))
.addFieldIf(
isEdit,
() -> FormBuilder.text(Domain.LMS_SETUP.ATTR_LMS_PROXY_AUTH_SECRET)
() -> !readonly,
() -> FormBuilder.text(
Domain.LMS_SETUP.ATTR_LMS_PROXY_AUTH_SECRET,
FORM_PROXY_PWD_KEY)
.asPasswordField()
.withInputSpan(2)
.withLabelSpan(0)
.withEmptyCellSeparation(false)
.withEmptyCellSpan(0))
.withInputSpan(3)
.withLabelSpan(2)
.withEmptyCellSeparation(true)
.withEmptyCellSpan(3))
.buildFor((entityKey == null)
? restService.getRestCall(NewLmsSetup.class)
: restService.getRestCall(SaveLmsSetup.class));
if (!readonly) {
formHandle.process(
PROXY_ATTRIBUTES::contains,
ffa -> ffa.setVisible(withProxy)
);
formHandle.getForm().getFieldInput("FORM_PROXY_CHECK")
.addListener(SWT.Selection, event -> formHandle.process(
PROXY_ATTRIBUTES::contains,
ffa -> {
boolean selected = ((Button) event.widget).getSelection();
ffa.setVisible(selected);
if (!selected) {
ffa.resetError();
ffa.setStringValue("");
}
}
));
}
// propagate content actions to action-pane
this.pageService.pageActionBuilder(formContext.clearEntityKeys())

View file

@ -174,16 +174,16 @@ final class SebExamConfigCreationPopup {
entityKey.getModelId())
.addField(FormBuilder.text(
Domain.CONFIGURATION_NODE.ATTR_NAME,
SebExamConfigPropForm.FORM_NAME_TEXT_KEY))
SebExamConfigForm.FORM_NAME_TEXT_KEY))
.addField(FormBuilder.text(
Domain.CONFIGURATION_NODE.ATTR_DESCRIPTION,
SebExamConfigPropForm.FORM_DESCRIPTION_TEXT_KEY)
SebExamConfigForm.FORM_DESCRIPTION_TEXT_KEY)
.asArea())
.addFieldIf(
() -> !this.copyAsTemplate && !this.createFromTemplate,
() -> FormBuilder.checkbox(
ConfigCreationInfo.ATTR_COPY_WITH_HISTORY,
SebExamConfigPropForm.FORM_HISTORY_TEXT_KEY))
SebExamConfigForm.FORM_HISTORY_TEXT_KEY))
.build();
return () -> formHandle;

View file

@ -13,7 +13,6 @@ import java.util.HashSet;
import java.util.List;
import java.util.function.Function;
import org.apache.commons.lang3.StringUtils;
import org.eclipse.rap.rwt.RWT;
import org.eclipse.rap.rwt.client.service.UrlLauncher;
import org.eclipse.swt.SWT;
@ -68,7 +67,7 @@ import ch.ethz.seb.sebserver.gui.widget.WidgetFactory.CustomVariant;
@Lazy
@Component
@GuiProfile
public class SebExamConfigPropForm implements TemplateComposer {
public class SebExamConfigForm implements TemplateComposer {
static final LocTextKey FORM_TITLE_NEW =
new LocTextKey("sebserver.examconfig.form.title.new");
@ -108,7 +107,7 @@ public class SebExamConfigPropForm implements TemplateComposer {
private final DownloadService downloadService;
private final String downloadFileName;
protected SebExamConfigPropForm(
protected SebExamConfigForm(
final PageService pageService,
final CurrentUser currentUser,
final DownloadService downloadService,
@ -225,24 +224,7 @@ public class SebExamConfigPropForm implements TemplateComposer {
.withAttribute(PageContext.AttributeKeys.READ_ONLY, String.valueOf(!modifyGrant))
.publishIf(() -> modifyGrant && isReadonly)
.newAction(ActionDefinition.SEB_EXAM_CONFIG_EXPORT_PLAIN_XML)
.withEntityKey(entityKey)
.withExec(action -> {
final String downloadURL = this.downloadService.createDownloadURL(
entityKey.modelId,
SebExamConfigPlaintextDownload.class,
this.downloadFileName);
urlLauncher.openURL(downloadURL);
return action;
})
.noEventPropagation()
.publishIf(() -> modifyGrant && isReadonly)
.newAction(ActionDefinition.SEB_EXAM_CONFIG_GET_CONFIG_KEY)
.withEntityKey(entityKey)
.withExec(SebExamConfigPropForm.getConfigKeyFunction(this.pageService))
.noEventPropagation()
.publishIf(() -> modifyGrant && isReadonly)
.newAction(ActionDefinition.SEB_EXAM_CONFIG_IMPORT_TO_EXISTING_CONFIG)
.withEntityKey(entityKey)
@ -275,6 +257,25 @@ public class SebExamConfigPropForm implements TemplateComposer {
.noEventPropagation()
.publishIf(() -> modifyGrant && isReadonly)
.newAction(ActionDefinition.SEB_EXAM_CONFIG_EXPORT_PLAIN_XML)
.withEntityKey(entityKey)
.withExec(action -> {
final String downloadURL = this.downloadService.createDownloadURL(
entityKey.modelId,
SebExamConfigPlaintextDownload.class,
this.downloadFileName);
urlLauncher.openURL(downloadURL);
return action;
})
.noEventPropagation()
.publishIf(() -> modifyGrant && isReadonly)
.newAction(ActionDefinition.SEB_EXAM_CONFIG_GET_CONFIG_KEY)
.withEntityKey(entityKey)
.withExec(SebExamConfigForm.getConfigKeyFunction(this.pageService))
.noEventPropagation()
.publishIf(() -> modifyGrant && isReadonly)
.newAction(ActionDefinition.SEB_EXAM_CONFIG_PROP_SAVE)
.withEntityKey(entityKey)
.withExec(formHandle::processFormSave)
@ -289,13 +290,10 @@ public class SebExamConfigPropForm implements TemplateComposer {
if (isAttachedToExam && isReadonly) {
widgetFactory.label(content, StringUtils.EMPTY);
widgetFactory.labelLocalized(
widgetFactory.addFormSubContextHeader(
content,
CustomVariant.TEXT_H3,
FORM_ATTACHED_EXAMS_TITLE_TEXT_KEY,
FORM_ATTACHED_EXAMS_TITLE_TOOLTIP_TEXT_KEY);
widgetFactory.labelSeparator(content);
final EntityTable<ExamConfigurationMap> table =
this.pageService.entityTableBuilder(this.restService.getRestCall(GetExamConfigMappingsPage.class))

View file

@ -69,7 +69,7 @@ final class SebExamConfigImportPopup {
newConfig);
dialog.open(
SebExamConfigPropForm.FORM_IMPORT_TEXT_KEY,
SebExamConfigForm.FORM_IMPORT_TEXT_KEY,
(Predicate<FormHandle<ConfigurationNode>>) formHandle -> doImport(
pageService,
formHandle,
@ -151,7 +151,7 @@ final class SebExamConfigImportPopup {
.call();
if (!configuration.hasError()) {
context.publishInfo(SebExamConfigPropForm.FORM_IMPORT_CONFIRM_TEXT_KEY);
context.publishInfo(SebExamConfigForm.FORM_IMPORT_CONFIRM_TEXT_KEY);
if (newConfig) {
final PageAction action = pageService.pageActionBuilder(context)
@ -184,7 +184,7 @@ final class SebExamConfigImportPopup {
}
formHandle.getContext().notifyError(
SebExamConfigPropForm.FORM_TITLE,
SebExamConfigForm.FORM_TITLE,
configuration.getError());
}
@ -198,7 +198,7 @@ final class SebExamConfigImportPopup {
return false;
} catch (final Exception e) {
formHandle.getContext().notifyError(SebExamConfigPropForm.FORM_TITLE, e);
formHandle.getContext().notifyError(SebExamConfigForm.FORM_TITLE, e);
return true;
}
}
@ -234,7 +234,7 @@ final class SebExamConfigImportPopup {
.readonly(false)
.addField(FormBuilder.fileUpload(
API.IMPORT_FILE_ATTR_NAME,
SebExamConfigPropForm.FORM_IMPORT_SELECT_TEXT_KEY,
SebExamConfigForm.FORM_IMPORT_SELECT_TEXT_KEY,
null,
API.SEB_FILE_EXTENSION))
@ -242,24 +242,24 @@ final class SebExamConfigImportPopup {
() -> this.newConfig,
() -> FormBuilder.text(
Domain.CONFIGURATION_NODE.ATTR_NAME,
SebExamConfigPropForm.FORM_NAME_TEXT_KEY))
SebExamConfigForm.FORM_NAME_TEXT_KEY))
.addFieldIf(
() -> this.newConfig,
() -> FormBuilder.text(
Domain.CONFIGURATION_NODE.ATTR_DESCRIPTION,
SebExamConfigPropForm.FORM_DESCRIPTION_TEXT_KEY)
SebExamConfigForm.FORM_DESCRIPTION_TEXT_KEY)
.asArea())
.addFieldIf(
() -> this.newConfig && !examConfigTemplateResources.isEmpty(),
() -> FormBuilder.singleSelection(
Domain.CONFIGURATION_NODE.ATTR_TEMPLATE_ID,
SebExamConfigPropForm.FORM_TEMPLATE_TEXT_KEY,
SebExamConfigForm.FORM_TEMPLATE_TEXT_KEY,
null,
resourceService::getExamConfigTemplateResources))
.addField(FormBuilder.text(
API.IMPORT_PASSWORD_ATTR_NAME,
SebExamConfigPropForm.FORM_IMPORT_PASSWORD_TEXT_KEY,
SebExamConfigForm.FORM_IMPORT_PASSWORD_TEXT_KEY,
"").asPasswordField())
.build();

View file

@ -214,7 +214,7 @@ public class SebExamConfigSettingsForm implements TemplateComposer {
throw e;
} catch (final Exception e) {
log.error("Unexpected error while trying to fetch exam configuration data and create views", e);
pageContext.notifyError(SebExamConfigPropForm.FORM_TITLE, e);
pageContext.notifyError(SebExamConfigForm.FORM_TITLE, e);
}
}

View file

@ -63,19 +63,29 @@ public class UserActivityLogs implements TemplateComposer {
new LocTextKey("sebserver.userlogs.list.column.user");
private static final LocTextKey DATE_TEXT_KEY =
new LocTextKey("sebserver.userlogs.list.column.dateTime");
private static final LocTextKey DETAILS_DATE_TEXT_KEY =
new LocTextKey("sebserver.seblogs.details.dateTime");
private static final LocTextKey ACTIVITY_TEXT_KEY =
new LocTextKey("sebserver.userlogs.list.column.activityType");
private static final LocTextKey ENTITY_TYPE_TEXT_KEY =
new LocTextKey("sebserver.userlogs.list.column.entityType");
private static final LocTextKey ENTITY_ID_TEXT_KEY =
new LocTextKey("sebserver.userlogs.list.column.entityId");
private static final LocTextKey MESSAGE_TEXT_KEY =
new LocTextKey("sebserver.userlogs.list.column.message");
private final static LocTextKey EMPTY_SELECTION_TEXT =
new LocTextKey("sebserver.userlogs.info.pleaseSelect");
private static final LocTextKey FORM_USER_TEXT_KEY =
new LocTextKey("sebserver.userlogs.form.user");
private static final LocTextKey FORM_DATE_TEXT_KEY =
new LocTextKey("sebserver.userlogs.form.dateTime");
private static final LocTextKey FORM_DETAILS_DATE_TEXT_KEY =
new LocTextKey("sebserver.userlogs.form.dateTime");
private static final LocTextKey FORM_ACTIVITY_TEXT_KEY =
new LocTextKey("sebserver.userlogs.form.activityType");
private static final LocTextKey FORM_ENTITY_TYPE_TEXT_KEY =
new LocTextKey("sebserver.userlogs.form.entityType");
private static final LocTextKey FORM_ENTITY_ID_TEXT_KEY =
new LocTextKey("sebserver.userlogs.form.entityId");
private static final LocTextKey FORM_MESSAGE_TEXT_KEY =
new LocTextKey("sebserver.userlogs.form.message");
private final TableFilterAttribute institutionFilter;
private final TableFilterAttribute userNameFilter =
new TableFilterAttribute(CriteriaType.TEXT, UserActivityLog.FILTER_ATTR_USER_NAME);
@ -248,29 +258,29 @@ public class UserActivityLogs implements TemplateComposer {
.readonly(true)
.addField(FormBuilder.text(
UserActivityLog.ATTR_USER_NAME,
USER_TEXT_KEY,
FORM_USER_TEXT_KEY,
String.valueOf(userActivityLog.getUsername())))
.addField(FormBuilder.text(
Domain.USER_ACTIVITY_LOG.ATTR_ACTIVITY_TYPE,
ACTIVITY_TEXT_KEY,
FORM_ACTIVITY_TEXT_KEY,
this.resourceService.getUserActivityTypeName(userActivityLog)))
.addField(FormBuilder.text(
Domain.USER_ACTIVITY_LOG.ATTR_ENTITY_TYPE,
ENTITY_TYPE_TEXT_KEY,
FORM_ENTITY_TYPE_TEXT_KEY,
this.resourceService.getEntityTypeName(userActivityLog)))
.addField(FormBuilder.text(
Domain.USER_ACTIVITY_LOG.ATTR_ENTITY_ID,
ENTITY_ID_TEXT_KEY,
FORM_ENTITY_ID_TEXT_KEY,
userActivityLog.entityId))
.addField(FormBuilder.text(
Domain.USER_ACTIVITY_LOG.ATTR_TIMESTAMP,
DETAILS_DATE_TEXT_KEY,
FORM_DETAILS_DATE_TEXT_KEY,
this.widgetFactory.getI18nSupport()
.formatDisplayDateTime(Utils.toDateTimeUTC(userActivityLog.timestamp)) + " " +
this.i18nSupport.getUsersTimeZoneTitleSuffix()))
.addField(FormBuilder.text(
Domain.USER_ACTIVITY_LOG.ATTR_MESSAGE,
MESSAGE_TEXT_KEY,
FORM_MESSAGE_TEXT_KEY,
String.valueOf(userActivityLog.message))
.asArea())
.build();

View file

@ -12,6 +12,7 @@ import ch.ethz.seb.sebserver.gui.service.i18n.LocTextKey;
public enum ActionCategory {
FORM(null, 0),
LIST_VARIA(null, 10),
INSTITUTION_LIST(new LocTextKey("sebserver.institution.list.actions"), 1),
USER_ACCOUNT_LIST(new LocTextKey("sebserver.useraccount.list.actions"), 1),
LMS_SETUP_LIST(new LocTextKey("sebserver.lmssetup.list.actions"), 1),

View file

@ -26,7 +26,7 @@ public enum ActionDefinition {
new LocTextKey("sebserver.institution.action.new"),
ImageIcon.INSTITUTION,
PageStateDefinitionImpl.INSTITUTION_EDIT,
ActionCategory.FORM),
ActionCategory.LIST_VARIA),
INSTITUTION_VIEW_FROM_LIST(
new LocTextKey("sebserver.institution.action.list.view"),
ImageIcon.SHOW,
@ -54,7 +54,7 @@ public enum ActionDefinition {
PageStateDefinitionImpl.INSTITUTION_VIEW,
ActionCategory.FORM),
INSTITUTION_SAVE_AND_ACTIVATE(
new LocTextKey("sebserver.form.action.save.activate"),
new LocTextKey("sebserver.institution.action.activate"),
ImageIcon.ACTIVE,
PageStateDefinitionImpl.INSTITUTION_VIEW,
ActionCategory.FORM),
@ -83,7 +83,8 @@ public enum ActionDefinition {
USER_ACCOUNT_NEW(
new LocTextKey("sebserver.useraccount.action.new"),
ImageIcon.USER,
PageStateDefinitionImpl.USER_ACCOUNT_EDIT),
PageStateDefinitionImpl.USER_ACCOUNT_EDIT,
ActionCategory.FORM.LIST_VARIA),
USER_ACCOUNT_VIEW_FROM_LIST(
new LocTextKey("sebserver.useraccount.action.view"),
ImageIcon.SHOW,
@ -110,7 +111,7 @@ public enum ActionDefinition {
PageStateDefinitionImpl.USER_ACCOUNT_VIEW,
ActionCategory.FORM),
USER_ACCOUNT_SAVE_AND_ACTIVATE(
new LocTextKey("sebserver.form.action.save.activate"),
new LocTextKey("sebserver.useraccount.action.activate"),
ImageIcon.ACTIVE,
PageStateDefinitionImpl.USER_ACCOUNT_VIEW,
ActionCategory.FORM),
@ -147,7 +148,8 @@ public enum ActionDefinition {
LMS_SETUP_NEW(
new LocTextKey("sebserver.lmssetup.action.new"),
ImageIcon.LMS_SETUP,
PageStateDefinitionImpl.LMS_SETUP_EDIT),
PageStateDefinitionImpl.LMS_SETUP_EDIT,
ActionCategory.LIST_VARIA),
LMS_SETUP_VIEW_FROM_LIST(
new LocTextKey("sebserver.lmssetup.action.list.view"),
ImageIcon.SHOW,
@ -224,6 +226,11 @@ public enum ActionDefinition {
new LocTextKey("sebserver.exam.action.import"),
ImageIcon.IMPORT,
PageStateDefinitionImpl.QUIZ_LIST),
EXAM_VIEW_FROM_CONFIG(
new LocTextKey("sebserver.exam.action.list.view"),
ImageIcon.SHOW,
PageStateDefinitionImpl.SEB_EXAM_CONFIG_PROP_VIEW,
ActionCategory.LIST_VARIA),
EXAM_VIEW_FROM_LIST(
new LocTextKey("sebserver.exam.action.list.view"),
ImageIcon.SHOW,
@ -343,12 +350,13 @@ public enum ActionDefinition {
ActionCategory.FORM),
SEB_CLIENT_CONFIG_LIST(
new LocTextKey("sebserver.clientconfig.action.list"),
new LocTextKey("sebserver.clientconfig.list.title"),
PageStateDefinitionImpl.SEB_CLIENT_CONFIG_LIST),
SEB_CLIENT_CONFIG_NEW(
new LocTextKey("sebserver.clientconfig.action.list.new"),
ImageIcon.NEW,
PageStateDefinitionImpl.SEB_CLIENT_CONFIG_EDIT),
PageStateDefinitionImpl.SEB_CLIENT_CONFIG_EDIT,
ActionCategory.LIST_VARIA),
SEB_CLIENT_CONFIG_VIEW_FROM_LIST(
new LocTextKey("sebserver.clientconfig.action.list.view"),
ImageIcon.SHOW,
@ -375,7 +383,7 @@ public enum ActionDefinition {
PageStateDefinitionImpl.SEB_CLIENT_CONFIG_VIEW,
ActionCategory.FORM),
SEB_CLIENT_CONFIG_SAVE_AND_ACTIVATE(
new LocTextKey("sebserver.form.action.save.activate"),
new LocTextKey("sebserver.clientconfig.action.activate"),
ImageIcon.ACTIVE,
PageStateDefinitionImpl.SEB_CLIENT_CONFIG_VIEW,
ActionCategory.FORM),
@ -406,7 +414,8 @@ public enum ActionDefinition {
SEB_EXAM_CONFIG_NEW(
new LocTextKey("sebserver.examconfig.action.list.new"),
ImageIcon.NEW,
PageStateDefinitionImpl.SEB_EXAM_CONFIG_PROP_EDIT),
PageStateDefinitionImpl.SEB_EXAM_CONFIG_PROP_EDIT,
ActionCategory.LIST_VARIA),
SEB_EXAM_CONFIG_VIEW_PROP_FROM_LIST(
new LocTextKey("sebserver.examconfig.action.list.view"),
ImageIcon.SHOW,
@ -421,7 +430,7 @@ public enum ActionDefinition {
new LocTextKey("sebserver.examconfig.action.import-config"),
ImageIcon.IMPORT,
PageStateDefinitionImpl.SEB_EXAM_CONFIG_LIST,
ActionCategory.VARIA),
ActionCategory.LIST_VARIA),
SEB_EXAM_CONFIG_MODIFY_PROP_FROM_LIST(
new LocTextKey("sebserver.examconfig.action.list.modify.properties"),
@ -496,7 +505,7 @@ public enum ActionDefinition {
new LocTextKey("sebserver.configtemplate.action.list.new"),
ImageIcon.TEMPLATE,
PageStateDefinitionImpl.SEB_EXAM_CONFIG_TEMPLATE_EDIT,
ActionCategory.VARIA),
ActionCategory.LIST_VARIA),
SEB_EXAM_CONFIG_TEMPLATE_VIEW_FROM_LIST(
new LocTextKey("sebserver.configtemplate.action.list.view"),
ImageIcon.SHOW,

View file

@ -79,7 +79,7 @@ public class ActionPane implements TemplateComposer {
PageEventListener.LISTENER_ATTRIBUTE_KEY,
(ActionPublishEventListener) event -> {
final Composite parent = pageContext.getParent();
final Tree treeForGroup = getTreeForGroup(parent, event.action.definition);
final Tree treeForGroup = getTreeForGroup(parent, event.action.definition, true);
final TreeItem actionItem = ActionPane.this.widgetFactory.treeItemLocalized(
treeForGroup,
event.action.definition.title);
@ -141,7 +141,7 @@ public class ActionPane implements TemplateComposer {
}
private TreeItem findAction(final Composite parent, final ActionDefinition actionDefinition) {
final Tree treeForGroup = getTreeForGroup(parent, actionDefinition);
final Tree treeForGroup = getTreeForGroup(parent, actionDefinition, false);
if (treeForGroup == null) {
return null;
}
@ -165,11 +165,15 @@ public class ActionPane implements TemplateComposer {
return null;
}
private Tree getTreeForGroup(final Composite parent, final ActionDefinition actionDefinition) {
private Tree getTreeForGroup(
final Composite parent,
final ActionDefinition actionDefinition,
boolean create) {
clearDisposedTrees();
final ActionCategory category = actionDefinition.category;
if (!this.actionTrees.containsKey(category.name())) {
if (!this.actionTrees.containsKey(category.name()) && create) {
final Tree actionTree = createActionTree(parent, actionDefinition.category);
this.actionTrees.put(category.name(), actionTree);
}
@ -210,7 +214,7 @@ public class ActionPane implements TemplateComposer {
// action tree
final Tree actions = this.widgetFactory.treeLocalized(
composite,
SWT.SINGLE | SWT.FULL_SELECTION);
SWT.SINGLE | SWT.FULL_SELECTION | SWT.NO_SCROLL);
actions.setData(RWT.CUSTOM_VARIANT, "actions");
final GridData gridData = new GridData(SWT.FILL, SWT.TOP, true, false);
actions.setLayoutData(gridData);
@ -225,7 +229,7 @@ public class ActionPane implements TemplateComposer {
imageCell.setBindingIndex(0);
final TextCell textCell = new TextCell(template);
textCell.setLeft(0, 30)
.setWidth(150)
.setWidth(SWT.DEFAULT)
.setTop(7)
.setBottom(0, 0)
.setHorizontalAlignment(SWT.LEFT);

View file

@ -21,7 +21,7 @@ public enum ActivityDefinition implements Activity {
EXAM_ADMINISTRATION(new LocTextKey("sebserver.overall.activity.title.examadmin")),
EXAM(new LocTextKey("sebserver.exam.action.list")),
SEB_CONFIGURATION(new LocTextKey("sebserver.overall.activity.title.sebconfig")),
SEB_CLIENT_CONFIG(new LocTextKey("sebserver.clientconfig.action.list")),
SEB_CLIENT_CONFIG(new LocTextKey("sebserver.clientconfig.list.title")),
SEB_EXAM_CONFIG(new LocTextKey("sebserver.examconfig.action.list")),
SEB_EXAM_CONFIG_TEMPLATE(new LocTextKey("sebserver.configtemplate.action.list")),
MONITORING(new LocTextKey("sebserver.overall.activity.title.monitoring")),

View file

@ -26,7 +26,7 @@ import ch.ethz.seb.sebserver.gui.content.SebClientConfigForm;
import ch.ethz.seb.sebserver.gui.content.SebClientConfigList;
import ch.ethz.seb.sebserver.gui.content.SebClientLogs;
import ch.ethz.seb.sebserver.gui.content.SebExamConfigList;
import ch.ethz.seb.sebserver.gui.content.SebExamConfigPropForm;
import ch.ethz.seb.sebserver.gui.content.SebExamConfigForm;
import ch.ethz.seb.sebserver.gui.content.SebExamConfigSettingsForm;
import ch.ethz.seb.sebserver.gui.content.UserAccountChangePasswordForm;
import ch.ethz.seb.sebserver.gui.content.UserAccountForm;
@ -64,8 +64,8 @@ public enum PageStateDefinitionImpl implements PageStateDefinition {
SEB_CLIENT_CONFIG_EDIT(Type.FORM_EDIT, SebClientConfigForm.class, ActivityDefinition.SEB_CLIENT_CONFIG),
SEB_EXAM_CONFIG_LIST(Type.LIST_VIEW, SebExamConfigList.class, ActivityDefinition.SEB_EXAM_CONFIG),
SEB_EXAM_CONFIG_PROP_VIEW(Type.FORM_VIEW, SebExamConfigPropForm.class, ActivityDefinition.SEB_EXAM_CONFIG),
SEB_EXAM_CONFIG_PROP_EDIT(Type.FORM_EDIT, SebExamConfigPropForm.class, ActivityDefinition.SEB_EXAM_CONFIG),
SEB_EXAM_CONFIG_PROP_VIEW(Type.FORM_VIEW, SebExamConfigForm.class, ActivityDefinition.SEB_EXAM_CONFIG),
SEB_EXAM_CONFIG_PROP_EDIT(Type.FORM_EDIT, SebExamConfigForm.class, ActivityDefinition.SEB_EXAM_CONFIG),
SEB_EXAM_CONFIG_EDIT(Type.FORM_IN_TIME_EDIT, SebExamConfigSettingsForm.class, ActivityDefinition.SEB_EXAM_CONFIG),
SEB_EXAM_CONFIG_VIEW(Type.FORM_VIEW, SebExamConfigSettingsForm.class, ActivityDefinition.SEB_EXAM_CONFIG),

View file

@ -483,7 +483,7 @@ public final class Form implements FormBinding {
this.listValue = listValue;
}
abstract String getStringValue();
public abstract String getStringValue();
public void setStringValue(final String value) {
throw new UnsupportedOperationException();

View file

@ -144,6 +144,7 @@ public class EntityTable<ROW extends Entity> {
layout.marginHeight = 0;
this.composite.setLayout(layout);
GridData gridData = new GridData(SWT.FILL, SWT.TOP, true, false);
gridData.horizontalIndent = 2;
this.composite.setLayoutData(gridData);
this.staticQueryParams = staticQueryParams;
this.rowDecorator = rowDecorator;

View file

@ -66,7 +66,7 @@ public class TableFilter<ROW extends Entity> {
final GridData gridData = new GridData(SWT.FILL, SWT.TOP, true, false);
this.composite.setLayoutData(gridData);
final RowLayout layout = new RowLayout(SWT.HORIZONTAL);
layout.spacing = 5;
layout.marginLeft = 0;
layout.wrap = false;
layout.center = false;
layout.fill = true;
@ -137,7 +137,7 @@ public class TableFilter<ROW extends Entity> {
boolean adaptColumnWidth(final int columnIndex, final int width) {
if (columnIndex < this.components.size()) {
final boolean adaptWidth = this.components.get(columnIndex).adaptWidth(width);
final boolean adaptWidth = this.components.get(columnIndex).adaptWidth(width + 2);
if (adaptWidth) {
this.composite.layout();
}

View file

@ -8,15 +8,17 @@
package ch.ethz.seb.sebserver.gui.widget;
import static ch.ethz.seb.sebserver.gui.service.i18n.PolyglotPageService.POLYGLOT_WIDGET_FUNCTION_KEY;
import java.io.InputStream;
import java.util.Collection;
import java.util.List;
import java.util.Locale;
import java.util.function.Consumer;
import java.util.function.Supplier;
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.Tuple;
import ch.ethz.seb.sebserver.gbl.util.Utils;
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.i18n.PolyglotPageService;
import ch.ethz.seb.sebserver.gui.service.page.PageService;
import ch.ethz.seb.sebserver.gui.service.page.impl.DefaultPageLayout;
import ch.ethz.seb.sebserver.gui.service.push.ServerPushService;
import org.eclipse.rap.rwt.RWT;
import org.eclipse.rap.rwt.client.service.JavaScriptExecutor;
import org.eclipse.rap.rwt.widgets.WidgetUtil;
@ -26,38 +28,20 @@ import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.ImageData;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.ColorDialog;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.DateTime;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.TabFolder;
import org.eclipse.swt.widgets.TabItem;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeItem;
import org.eclipse.swt.widgets.Widget;
import org.eclipse.swt.widgets.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
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.Tuple;
import ch.ethz.seb.sebserver.gbl.util.Utils;
import ch.ethz.seb.sebserver.gui.content.action.ActionDefinition;
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.i18n.PolyglotPageService;
import ch.ethz.seb.sebserver.gui.service.page.PageService;
import ch.ethz.seb.sebserver.gui.service.page.impl.DefaultPageLayout;
import ch.ethz.seb.sebserver.gui.service.push.ServerPushService;
import java.io.InputStream;
import java.util.Collection;
import java.util.List;
import java.util.Locale;
import java.util.function.Consumer;
import java.util.function.Supplier;
import static ch.ethz.seb.sebserver.gui.service.i18n.PolyglotPageService.POLYGLOT_WIDGET_FUNCTION_KEY;
@Lazy
@Service
@ -66,6 +50,7 @@ public class WidgetFactory {
private static final String ADD_HTML_ATTR_ARIA_ROLE = "role";
private static final String ADD_HTML_ATTR_TEST_ID = "test-id";
private static final String SUB_TITLE_TExT_SUFFIX = ".subtitle";
private static final Logger log = LoggerFactory.getLogger(WidgetFactory.class);
@ -166,6 +151,7 @@ public class WidgetFactory {
TEXT_H1("h1"),
TEXT_H2("h2"),
TEXT_H3("h3"),
SUBTITLE( "subtitle"),
IMAGE_BUTTON("imageButton"),
TEXT_ACTION("action"),
TEXT_READONLY("readonlyText"),
@ -225,6 +211,7 @@ public class WidgetFactory {
final Composite content = new Composite(parent, SWT.NONE);
final GridLayout contentLayout = new GridLayout();
contentLayout.marginLeft = 10;
contentLayout.marginHeight = 0;
content.setLayout(contentLayout);
final GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, true);
content.setLayoutData(gridData);
@ -236,18 +223,36 @@ public class WidgetFactory {
final Label labelLocalizedTitle = labelLocalizedTitle(defaultPageLayout, title);
final GridData gridData = new GridData(SWT.FILL, SWT.TOP, true, false);
labelLocalizedTitle.setLayoutData(gridData);
// sub title if defined in language properties
LocTextKey subTitleTextKey = new LocTextKey(title.name + SUB_TITLE_TExT_SUFFIX);
if (i18nSupport.hasText(subTitleTextKey)) {
final GridData gridDataSub = new GridData(SWT.FILL, SWT.FILL, true, false);
final Label labelLocalizedSubTitle = labelLocalized(
defaultPageLayout,
CustomVariant.SUBTITLE,
subTitleTextKey);
labelLocalizedSubTitle.setLayoutData(gridDataSub);
}
return defaultPageLayout;
}
public Composite defaultPageLayout(
final Composite parent,
final LocTextKey title,
final ActionDefinition actionDefinition) {
final Composite defaultPageLayout = defaultPageLayout(parent);
final Label labelLocalizedTitle = labelLocalizedTitle(defaultPageLayout, title);
labelLocalizedTitle.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
return defaultPageLayout;
public void addFormSubContextHeader(final Composite parent, final LocTextKey titleTextKey, final LocTextKey tooltipTextKey) {
GridData gridData = new GridData(SWT.FILL, SWT.BOTTOM, true, false);
gridData.horizontalIndent = 8;
gridData.verticalIndent = 10;
Label subContextLabel = labelLocalized(
parent,
CustomVariant.TEXT_H3,
titleTextKey,
tooltipTextKey);
subContextLabel.setLayoutData(gridData);
GridData gridData1 = new GridData(SWT.FILL, SWT.BOTTOM, true, false);
gridData1.heightHint = 5;
gridData1.horizontalIndent = 8;
Label subContextSeparator = labelSeparator(parent);
subContextSeparator.setLayoutData(gridData1);
}
public Composite formGrid(final Composite parent, final int rows) {
@ -256,8 +261,8 @@ public class WidgetFactory {
layout.horizontalSpacing = 10;
layout.verticalSpacing = 10;
layout.marginBottom = 10;
layout.marginLeft = 10;
layout.marginTop = 0;
layout.marginLeft = 4;
layout.marginTop = 10;
grid.setLayout(layout);
grid.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
return grid;
@ -370,7 +375,8 @@ public class WidgetFactory {
public Label labelLocalizedTitle(final Composite content, final LocTextKey locTextKey) {
final Label labelLocalized = labelLocalized(content, CustomVariant.TEXT_H1, locTextKey);
labelLocalized.setLayoutData(new GridData(SWT.TOP, SWT.LEFT, true, false));
GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, false);
labelLocalized.setLayoutData(gridData);
return labelLocalized;
}

View file

@ -137,6 +137,9 @@ public class LmsSetupDAOImpl implements LmsSetupDAO {
checkUniqueName(lmsSetup);
LmsSetupRecord savedRecord = recordById(lmsSetup.id)
.getOrThrow();
final ClientCredentials lmsCredentials = createAPIClientCredentials(lmsSetup);
final ClientCredentials proxyCredentials = createProxyClientCredentials(lmsSetup);
final LmsSetupRecord newRecord = new LmsSetupRecord(
@ -152,9 +155,9 @@ public class LmsSetupDAOImpl implements LmsSetupDAO {
lmsSetup.getProxyPort(),
proxyCredentials.clientIdAsString(),
proxyCredentials.secretAsString(),
null);
savedRecord.getActive());
this.lmsSetupRecordMapper.updateByPrimaryKeySelective(newRecord);
this.lmsSetupRecordMapper.updateByPrimaryKey(newRecord);
return this.lmsSetupRecordMapper.selectByPrimaryKey(lmsSetup.id);
})
.flatMap(this::toDomainModel)

View file

@ -35,7 +35,7 @@ sebserver.overall.date.to=To
sebserver.overall.action.add=Add;
sebserver.overall.action.remove=Remove
sebserver.overall.action.select=Please Select
sebserver.overall.action.toggle-activity=Switch Activity
sebserver.overall.action.toggle-activity=Switch Status
sebserver.overall.types.activityType.REGISTER=Register new Account
sebserver.overall.types.activityType.CREATE=Create New
@ -90,7 +90,6 @@ sebserver.error.unexpected=Unexpected Error
sebserver.page.message=Information
sebserver.dialog.confirm.title=Confirmation
sebserver.form.mandatory=This field is mandatory.
sebserver.form.action.save.activate=Save and Activate
sebserver.table.column.sort.default.tooltip=Click on the column header to sort the table within this column.
sebserver.dialog.confirm.deactivation=Note that there are {0} other entities that belongs to this entity.<br/>Those will also be deactivated by deactivating this entity.<br/><br/>Are You sure to deactivate this entity?
@ -141,6 +140,7 @@ sebserver.actionpane.title=
sebserver.institution.list.actions=
sebserver.institution.list.empty=No institution has been found. Please adapt the filter or create a new institution
sebserver.institution.list.title=Institutions
sebserver.institution.list.title.subtitle=
sebserver.institution.list.column.name=Name
sebserver.institution.list.column.name.tooltip=The name of the institution.<br/><br/>Use the filter above to narrow down a specific name.<br/>{0}
sebserver.institution.list.column.urlSuffix=URL Suffix
@ -163,6 +163,7 @@ sebserver.institution.action.delete=Delete Institution
sebserver.institution.info.pleaseSelect=Please select first an institution from the list.
sebserver.institution.form.title.new=Add Institution
sebserver.institution.form.title=Institution
sebserver.institution.form.title.subtitle=
sebserver.institution.form.name=Name
sebserver.institution.form.name.tooltip=The name of the institution
@ -189,6 +190,7 @@ sebserver.useraccount.role.EXAM_SUPPORTER.tooltip=An exam supporter can only see
sebserver.useraccount.list.empty=No user account has been found. Please adapt the filter or create a new user account
sebserver.useraccount.list.title=User Accounts
sebserver.useraccount.list.title.subtitle=
sebserver.useraccount.list.column.institution=Institution
sebserver.useraccount.list.column.institution.tooltip=The institution of the user account.<br/><br/>Use the filter above to specify the institution.<br/>{0}
sebserver.useraccount.list.column.name=First Name
@ -206,10 +208,10 @@ sebserver.useraccount.action.form=User Account of {0}
sebserver.useraccount.action.new=Add User Account
sebserver.useraccount.action.view=View User Account
sebserver.useraccount.action.list.modify=Edit User Account
sebserver.useraccount.action.modify=Edit
sebserver.useraccount.action.modify=Edit User Account
sebserver.useraccount.action.save=Save User Account
sebserver.useraccount.action.activate=Activate Account
sebserver.useraccount.action.deactivate=Deactivate Account
sebserver.useraccount.action.activate=Activate User Account
sebserver.useraccount.action.deactivate=Deactivate User Account
sebserver.useraccount.action.delete=Delete User Account
sebserver.useraccount.action.change.password=Change Password
sebserver.useraccount.action.change.password.save=Save New Password
@ -218,6 +220,7 @@ sebserver.useraccount.info.pleaseSelect=Please select first a User Account from
sebserver.useraccount.info.notEditable=You have no edit rights for this User Account.
sebserver.useraccount.form.title=User Account
sebserver.useraccount.form.title.subtitle=
sebserver.useraccount.form.title.new=Add User Account
sebserver.useraccount.form.institution=Institution
sebserver.useraccount.form.institution.tooltip=The institution the user belongs to.
@ -251,7 +254,7 @@ sebserver.useraccount.form.password.new.confirm.tooltip=Please confirm the passw
# LMS Setup
################################
sebserver.lmssetup.type.MOCKUP=Mock-up
sebserver.lmssetup.type.MOCKUP=Testing
sebserver.lmssetup.type.MOODLE=Moodle
sebserver.lmssetup.type.OPEN_EDX=Open edX
@ -259,6 +262,7 @@ sebserver.lmssetup.list.actions=
sebserver.lmssetup.list.action.no.modify.privilege=No Access: A LMS Setup from other institution cannot be modified.
sebserver.lmssetup.list.empty=No LMS Setup has been found. Please adapt the filter or create a new LMS Setup
sebserver.lmssetup.list.title=Learning Management System Setups
sebserver.lmssetup.list.title.subtitle=List of connection settings to the LMS.
sebserver.lmssetup.list.column.institution=Institution
sebserver.lmssetup.list.column.institution.tooltip=The institution of the LMS setup.<br/><br/>Use the filter above to specify the institution.<br/>{0}
sebserver.lmssetup.list.column.name=Name
@ -268,7 +272,7 @@ sebserver.lmssetup.list.column.type.tooltip=The type of the LMS.<br/><br/>Use th
sebserver.lmssetup.list.column.active=Active
sebserver.lmssetup.list.column.active.tooltip=The activity of the LMS Setup.<br/><br/>Use the filter above to specify the activity.<br/>{0}
sebserver.lmssetup.action.list=LMS Connection Settings
sebserver.lmssetup.action.list=LMS Setups
sebserver.lmssetup.action.form=LMS Setup
sebserver.lmssetup.action.new=Add LMS Setup
sebserver.lmssetup.action.list.view=View LMS Setup
@ -290,6 +294,7 @@ sebserver.lmssetup.action.delete=Delete LMS Setup
sebserver.lmssetup.info.pleaseSelect=Please select first a LMS Setup from the list
sebserver.lmssetup.form.title=Learning Management System Setup
sebserver.lmssetup.form.title.subtitle=
sebserver.lmssetup.form.title.new=Add Learning Management System Setup
sebserver.lmssetup.form.institution=Institution
sebserver.lmssetup.form.institution.tooltip=The institution where the LMS setup belongs to
@ -304,66 +309,72 @@ sebserver.lmssetup.form.clientname.lms.tooltip=The client name of the API client
sebserver.lmssetup.form.secret.lms=LMS Server Password
sebserver.lmssetup.form.secret.lms.tooltip=The secret or password of the API client access to the LMS.<br/><br/>This is usually provided by an LMS administrator that has created a API access account for SEB Server binding within the LMS server.
sebserver.lmssetup.form.proxy=Proxy
sebserver.lmssetup.form.proxy.check=With Proxy
sebserver.lmssetup.form.proxy.check.tooltip=Check and give detailed information if the SEB Server runs behind a proxy<br/>and need proxy settings to connect to the internet.
sebserver.lmssetup.form.proxy.tooltip=The proxy details of a proxy is needed to connect to a LMS server
sebserver.lmssetup.form.proxy.host=Proxy Host
sebserver.lmssetup.form.proxy.host.tooltip=The server name of the proxy host to connect to
sebserver.lmssetup.form.proxy.port=Proxy Port
sebserver.lmssetup.form.proxy.port.tooltip=The proxy server port to connect to
sebserver.lmssetup.form.proxy.auth-credentials=Proxy Name/Password
sebserver.lmssetup.form.proxy.name=Proxy Name
sebserver.lmssetup.form.proxy.name.tooltip=Proxy authentication name, needed if the proxy requests authentication
sebserver.lmssetup.form.proxy.password=Proxy Password
sebserver.lmssetup.form.proxy.password.tooltip=Proxy authentication password, needed if the proxy requests authentication
sebserver.lmssetup.form.proxy.auth-credentials.tooltip=The proxy authentication credentials (name and password)<br/>to authenticate the connection within the proxy server
################################
# Quiz Discovery
#LMS Exam
################################
sebserver.quizdiscovery.list.actions=
sebserver.quizdiscovery.list.title=Quizzes
sebserver.quizdiscovery.list.empty=No Quiz has been found. Please adapt the filter or create a new LMS Setup
sebserver.quizdiscovery.list.title=LMS Exams
sebserver.quizdiscovery.list.title.subtitle=List of exams found in connected LMS.
sebserver.quizdiscovery.list.empty=No LMS exam has been found. Please adapt the filter or create a new LMS Setup
sebserver.quizdiscovery.list.column.institution=Institution
sebserver.quizdiscovery.list.column.institution.tooltip=The institution of the LMS setup that defines LMS of the quiz.<br/><br/>Use the filter above to specify the institution.<br/>{0}
sebserver.quizdiscovery.list.column.institution.tooltip=The institution filter.<br/><br/>Use the filter above to specify the institution.<br/>{0}
sebserver.quizdiscovery.list.column.lmssetup=LMS
sebserver.quizdiscovery.list.column.lmssetup.tooltip=The LMS setup that defines the LMS of the quiz<br/><br/>Use the filter above to specify the LMS setup.<br/>{0}
sebserver.quizdiscovery.list.column.lmssetup.tooltip=The LMS setup filter<br/><br/>Use the filter above to find all LMS exams of a specific LMS setup.<br/>{0}
sebserver.quizdiscovery.list.column.name=Name
sebserver.quizdiscovery.list.column.name.tooltip=The name of the quiz.<br/><br/>Use the filter above to narrow down a specific quiz name.<br/>{0}
sebserver.quizdiscovery.list.column.name.tooltip=The name of the LMS exam.<br/><br/>Use the filter above to narrow down a specific name.<br/>{0}
sebserver.quizdiscovery.list.column.starttime=Start Time {0}
sebserver.quizdiscovery.list.column.starttime.tooltip=The start time of the quiz.<br/><br/>Use the filter above to set a specific from date.<br/>{0}
sebserver.quizdiscovery.list.column.starttime.tooltip=The start time of the LMS exam.<br/><br/>Use the filter above to set a specific from date.<br/>{0}
sebserver.quizdiscovery.list.column.endtime=End Time {0}
sebserver.quizdiscovery.list.column.endtime.tooltip=The end time of the quiz.<br/><br/>{0}
sebserver.quizdiscovery.list.column.endtime.tooltip=The end time of the LMS exam.<br/><br/>{0}
sebserver.quizdiscovery.info.pleaseSelect=Please select first a Quiz from the list
sebserver.quizdiscovery.action.list=LMS Exam Discovery
sebserver.quizdiscovery.action.list=LMS Exam Lookup
sebserver.quizdiscovery.action.import=Import as Exam
sebserver.quizdiscovery.quiz.import.out.dated=The Selected Quiz is is already finished and can't be imported
sebserver.quizdiscovery.action.details=Show Details
sebserver.quizdiscovery.quiz.import.out.dated=The Selected LMS exam is is already finished and can't be imported
sebserver.quizdiscovery.action.details=Show LMS Exam Details
sebserver.quizdiscovery.quiz.details.title=Quiz Details
sebserver.quizdiscovery.quiz.details.title=LMS Exam Details
sebserver.quizdiscovery.quiz.details.institution=Institution
sebserver.quizdiscovery.quiz.details.institution.tooltip=The institution of the LMS setup that defines the LMS of the quiz.
sebserver.quizdiscovery.quiz.details.institution.tooltip=The institution of the LMS setup.
sebserver.quizdiscovery.quiz.details.lmssetup=LMS Setup
sebserver.quizdiscovery.quiz.details.lmssetup.tooltip=The LMS setup that defines the LMS of the quiz.
sebserver.quizdiscovery.quiz.details.lmssetup.tooltip=The LMS setup that defines the LMS where the exam is defined.
sebserver.quizdiscovery.quiz.details.name=Name
sebserver.quizdiscovery.quiz.details.name.tooltip=The name of the quiz.<br/><br/>This name is defined on the corresponding LMS
sebserver.quizdiscovery.quiz.details.name.tooltip=The name of the LMS exam.<br/><br/>This name is defined on the corresponding LMS
sebserver.quizdiscovery.quiz.details.description=Description
sebserver.quizdiscovery.quiz.details.description.tooltip=The description of the quiz.<br/><br/>This description is defined on the corresponding LMS
sebserver.quizdiscovery.quiz.details.description.tooltip=The description of the LMS exam.<br/><br/>This description is defined on the corresponding LMS
sebserver.quizdiscovery.quiz.details.starttime=Start Time
sebserver.quizdiscovery.quiz.details.starttime.tooltip=The start time of the quiz.<br/><br/>This time is set on the corresponding LMS
sebserver.quizdiscovery.quiz.details.starttime.tooltip=The start time of the LMS exam.<br/><br/>This time is set on the corresponding LMS
sebserver.quizdiscovery.quiz.details.endtime=End Time
sebserver.quizdiscovery.quiz.details.endtime.tooltip=The end time of the quiz.<br/><br/>This time is set on the corresponding LMS
sebserver.quizdiscovery.quiz.details.endtime.tooltip=The end time of the LMS exam.<br/><br/>This time is set on the corresponding LMS
sebserver.quizdiscovery.quiz.details.url=Start URL
sebserver.quizdiscovery.quiz.details.url.tooltip=The start URL on the LMS for the quiz.<br/><br/>This is defined by the LMS setup and the quiz URL
sebserver.quizdiscovery.quiz.details.url.tooltip=The start URL on the LMS for the exam.<br/><br/>This is defined by the LMS setup and the exam URL
sebserver.quizdiscovery.quiz.details.additional.timecreated=Creation Time
sebserver.quizdiscovery.quiz.details.additional.timecreated.tooltip=The time when the quiz was first created<br/><br/>This time is defined by the corresponding LMS
sebserver.quizdiscovery.quiz.details.additional.timecreated.tooltip=The time when the LMS exam was first created<br/><br/>This time is defined by the corresponding LMS
sebserver.quizdiscovery.quiz.details.additional.course_shortname=Short Name
sebserver.quizdiscovery.quiz.details.additional.course_shortname.tooltip=The short name of the quiz<br/><br/>This is defined on the corresponding LMS
sebserver.quizdiscovery.quiz.details.additional.course_shortname.tooltip=The short name of the LMS exam<br/><br/>This is defined on the corresponding LMS
sebserver.quizdiscovery.quiz.details.additional.course_fullname=Full Name
sebserver.quizdiscovery.quiz.details.additional.course_fullname.tooltip=The full name of the quiz<br/><br/>This is defined on the corresponding LMS
sebserver.quizdiscovery.quiz.details.additional.course_fullname.tooltip=The full name of the LMS exam<br/><br/>This is defined on the corresponding LMS
sebserver.quizdiscovery.quiz.details.additional.course_displayname=Display Name
sebserver.quizdiscovery.quiz.details.additional.course_displayname.tooltip=The display name of the quiz<br/><br/>This is defined on the corresponding LMS
sebserver.quizdiscovery.quiz.details.additional.course_displayname.tooltip=The display name of the LMS exam<br/><br/>This is defined on the corresponding LMS
sebserver.quizdiscovery.quiz.details.additional.course_summary=Summary
sebserver.quizdiscovery.quiz.details.additional.course_summary.tooltip=The summary of the quiz<br/><br/>This is defined on the corresponding LMS
sebserver.quizdiscovery.quiz.details.additional.course_summary.tooltip=The summary of the LMS exam<br/><br/>This is defined on the corresponding LMS
sebserver.quizdiscovery.quiz.details.additional.timelimit=Time Limit
sebserver.quizdiscovery.quiz.details.additional.timelimit.toolitp=The time limit of the quiz<br/><br/>This is defined on the corresponding LMS
sebserver.quizdiscovery.quiz.details.additional.timelimit.toolitp=The time limit of the LMS exam<br/><br/>This is defined on the corresponding LMS
################################
# Exam
@ -393,7 +404,7 @@ sebserver.exam.consistency.missing-config= - There is no configuration defined f
sebserver.exam.consistency.missing-seb-restriction= - There is currently no SEB restriction applied on the LMS side. Use 'Enable SEB Restriction' on the right to activate auto-restriction.<br/> Or if this is not possible consider doing it manually on the LMS.
sebserver.exam.confirm.remove-config=This exam is current running. The remove of the attached configuration will led to an invalid state<br/>where connecting SEB clients cannot download the configuration for the exam.<br/><br/>Are you sure to remove the Configuration?
sebserver.exam.action.list=SEB Exam Settings
sebserver.exam.action.list=SEB Exams
sebserver.exam.action.list.view=View Exam
sebserver.exam.action.list.modify=Edit Exam
sebserver.exam.action.modify=Edit Exam
@ -569,72 +580,70 @@ sebserver.exam.indicator.thresholds.list.add=Add a new threshold
sebserver.exam.indicator.thresholds.list.remove=Delete this threshold
################################
# SEB client configuration
# Client configuration
################################
sebserver.sebconfig.activity.name=SEB Configuration
sebserver.clientconfig.action.list=Client Configuration
sebserver.clientconfig.action.export=Export
sebserver.clientconfig.list.empty=There is currently no SEB-Client configuration available. Please create a new one
sebserver.clientconfig.list.title=SEB client configurations
sebserver.clientconfig.list.empty=There is currently no client configuration available. Please create a new one.
sebserver.clientconfig.list.title=Client Configurations
sebserver.clientconfig.list.title.subtitle=
sebserver.clientconfig.list.actions=
sebserver.clientconfig.list.column.institution=Institution
sebserver.clientconfig.list.column.institution.tooltip=The institution of the SEB client configuration.<br/><br/>Use the filter above to specify the institution.<br/>{0}
sebserver.clientconfig.list.column.institution.tooltip=The institution of the client configuration.<br/><br/>Use the filter above to specify the institution.<br/>{0}
sebserver.clientconfig.list.column.name=Name
sebserver.clientconfig.list.column.name.tooltip=The name of the SEB client configuration.<br/><br/>Use the filter above to narrow down a specific name.<br/>{0}
sebserver.clientconfig.list.column.name.tooltip=The name of the client configuration.<br/><br/>Use the filter above to narrow down a specific name.<br/>{0}
sebserver.clientconfig.list.column.date=Creation Date {0}
sebserver.clientconfig.list.column.date.tooltip=The date when the SEB client configuration was first created.<br/><br/>Use the filter above to specify a from-date.<br/>{0}
sebserver.clientconfig.list.column.date.tooltip=The date when the client configuration was first created.<br/><br/>Use the filter above to specify a from-date.<br/>{0}
sebserver.clientconfig.list.column.active=Active
sebserver.clientconfig.list.column.active.tooltip=The activity of SEB client configuration.<br/><br/>Use the filter above to specify the activity.<br/>{0}
sebserver.clientconfig.list.column.active.tooltip=The activity of client configuration.<br/><br/>Use the filter above to specify the activity.<br/>{0}
sebserver.clientconfig.info.pleaseSelect=Please select first a Client Configuration from the list
sebserver.clientconfig.list.action.no.modify.privilege=No Access: A SEB client configuration from other institution cannot be modified.
sebserver.clientconfig.list.action.no.modify.privilege=No Access: A client configuration from other institution cannot be modified.
sebserver.clientconfig.form.title.new=Add Client Configuration
sebserver.clientconfig.form.title=SEB client configuration
sebserver.clientconfig.form.title=Client Configuration
sebserver.clientconfig.form.title.subtitle=
sebserver.clientconfig.form.name=Name
sebserver.clientconfig.form.name.tooltip=The name of the SEB client configuration.<br/>Can be any name that not already exists for another SEB client configuration
sebserver.clientconfig.form.name.tooltip=The name of the client configuration.<br/>Can be any name that not already exists for another client configuration
sebserver.clientconfig.form.fallback=With Fallback
sebserver.clientconfig.form.fallback.tooltip=Indicates whether this SEB client configuration has a fallback definition or not
sebserver.clientconfig.form.fallback.tooltip=Indicates whether this client configuration has a fallback definition or not
sebserver.clientconfig.form.fallback-url=Fallback Start URL
sebserver.clientconfig.form.fallback-url.tooltip=A fallback URL that tells the SEB where to go when the SEB Server service is unavailable.
sebserver.clientconfig.form.sebServerFallbackTimeout=Fallback Timeout
sebserver.clientconfig.form.sebServerFallbackTimeout.tooltip=Defines the fallback timeout for the SEB client in milli-seconds.
sebserver.clientconfig.form.sebServerFallbackTimeout.tooltip=Defines the fallback timeout for the SEB in milli-seconds.
sebserver.clientconfig.form.sebServerFallbackAttempts=Connection Attempts
sebserver.clientconfig.form.sebServerFallbackAttempts.tooltip=The number of connection attempts a SEB client is trying before switching to fallback case.
sebserver.clientconfig.form.sebServerFallbackAttempts.tooltip=The number of connection attempts a SEB is trying before switching to fallback case.
sebserver.clientconfig.form.sebServerFallbackAttemptInterval=Interval
sebserver.clientconfig.form.sebServerFallbackAttemptInterval.tooltip=The interval (in milli-seconds) between connection attempts a SEB client shall use.
sebserver.clientconfig.form.sebServerFallbackAttemptInterval.tooltip=The interval (in milli-seconds) between connection attempts a SEB shall use.
sebserver.clientconfig.form.sebServerFallbackPasswordHash=Fallback Password
sebserver.clientconfig.form.sebServerFallbackPasswordHash.tooltip=A password if set a SEB Client user must provide before the SEB client starts the fallback procedure.
sebserver.clientconfig.form.sebServerFallbackPasswordHash.tooltip=A password if set a SEB Client user must provide before the SEB starts the fallback procedure.
sebserver.clientconfig.form.sebServerFallbackPasswordHash.confirm=Confirm Password
sebserver.clientconfig.form.sebServerFallbackPasswordHash.tooltip.confirm=Please confirm the fallback password
sebserver.clientconfig.form.hashedQuitPassword=Quit Password
sebserver.clientconfig.form.hashedQuitPassword.tooltip=A password if set a SEB client user must provide to be able to quit the SEB client.
sebserver.clientconfig.form.hashedQuitPassword.tooltip=A password if set a SEB user must provide to be able to quit the SEB.
sebserver.clientconfig.form.hashedQuitPassword.confirm=Confirm Password
sebserver.clientconfig.form.hashedQuitPassword.tooltip.confirm=Please confirm the quit password
sebserver.clientconfig.form.date=Creation Date
sebserver.clientconfig.form.date.tooltip=The date when the SEB client configuration was first created.
sebserver.clientconfig.form.date.tooltip=The date when the client configuration was first created.
sebserver.clientconfig.form.encryptSecret=Configuration Password
sebserver.clientconfig.form.encryptSecret.tooltip=Define a password if the SEB client configuration shall be password-encrypted
sebserver.clientconfig.form.encryptSecret.tooltip=Define a password if the client configuration shall be password-encrypted
sebserver.clientconfig.form.encryptSecret.confirm=Confirm Password
sebserver.clientconfig.form.encryptSecret.confirm.tooltip=Please retype the given password for confirmation
sebserver.clientconfig.form.sebConfigPurpose=Configuration Purpose
sebserver.clientconfig.form.sebConfigPurpose.tooltip=This indicates whether this client configuration shall be used to configure the SEB Client or to start an exam
sebserver.clientconfig.config.purpose.START_EXAM=Starting an Exam
sebserver.clientconfig.config.purpose.START_EXAM.tooltip=If the SEB client configuration is loaded via a SEB-Link, the local configuration will not be overwritten.
sebserver.clientconfig.config.purpose.START_EXAM.tooltip=If the client configuration is loaded via a SEB-Link, the local configuration will not be overwritten.
sebserver.clientconfig.config.purpose.CONFIGURE_CLIENT=Configure a Client
sebserver.clientconfig.config.purpose.CONFIGURE_CLIENT.tooltip=If the SEB client configuration is loaded via a SEB-Link, the local configuration will be overwritten by this configuration.
sebserver.clientconfig.config.purpose.CONFIGURE_CLIENT.tooltip=If the client configuration is loaded via a SEB-Link, the local configuration will be overwritten by this configuration.
sebserver.clientconfig.action.list.new=Add Configuration
sebserver.clientconfig.action.list.view=View Configuration
sebserver.clientconfig.action.list.modify=Edit Configuration
sebserver.clientconfig.action.modify=Edit
sebserver.clientconfig.action.save=Save
sebserver.clientconfig.action.activate=Activate Configuration
sebserver.clientconfig.action.deactivate=Deactivate Configuration
sebserver.clientconfig.action.list.new=Add Client Configuration
sebserver.clientconfig.action.list.view=View Client Configuration
sebserver.clientconfig.action.list.modify=Edit Client Configuration
sebserver.clientconfig.action.modify=Edit Client Configuration
sebserver.clientconfig.action.save=Save Client Configuration
sebserver.clientconfig.action.activate=Activate Client Configuration
sebserver.clientconfig.action.deactivate=Deactivate Client Configuration
sebserver.clientconfig.action.export=Export Client Configuration
################################
# SEB Exam Configuration
@ -642,6 +651,7 @@ sebserver.clientconfig.action.deactivate=Deactivate Configuration
sebserver.examconfig.action.list=Exam Configuration
sebserver.examconfig.list.title=Exam Configurations
sebserver.examconfig.list.title.subtitle=
sebserver.examconfig.list.column.institution=Institution
sebserver.examconfig.list.column.institution.tooltip=The institution of the SEB exam configuration.<br/><br/>Use the filter above to specify the institution.<br/>{0}
sebserver.examconfig.list.column.name=Name
@ -658,33 +668,34 @@ sebserver.examconfig.info.pleaseSelect=Please select first an Exam Configuration
sebserver.examconfig.list.action.no.modify.privilege=No Access: An Exam Configuration from other institution cannot be modified.
sebserver.examconfig.action.list.new=Add Exam Configuration
sebserver.examconfig.action.list.view=View Configuration
sebserver.examconfig.action.list.modify=Configuration Settings
sebserver.examconfig.action.list.modify.properties=Edit Configuration
sebserver.examconfig.action.modify=Configuration Settings
sebserver.examconfig.action.modify.properties=Edit Configuration
sebserver.examconfig.action.view.properties=View Configuration
sebserver.examconfig.action.save=Save
sebserver.examconfig.action.saveToHistory=Save / Publish
sebserver.examconfig.action.saveToHistory.success=Successfully saved in history
sebserver.examconfig.action.list.view=View Exam Configuration
sebserver.examconfig.action.list.modify=Exam Configuration Settings
sebserver.examconfig.action.list.modify.properties=Edit Exam Configuration
sebserver.examconfig.action.modify=Exam Configuration Settings
sebserver.examconfig.action.modify.properties=Edit Exam Configuration
sebserver.examconfig.action.view.properties=View Exam Configuration
sebserver.examconfig.action.save=Save Exam Configuration
sebserver.examconfig.action.saveToHistory=Save / Publish Settings
sebserver.examconfig.action.saveToHistory.success=Exam configuration settings successfully saved in history.
sebserver.examconfig.action.saveToHistory.integrity-violation=There is currently at least one running Exam with active SEB client connections that uses this Configuration.<br/>Modify of a configuration that is currently in use would lead to inconsistency and is therefore not allowed.<br/><br/>Please make sure that the configuration is not in use before applying changes.
sebserver.examconfig.action.undo=Undo
sebserver.examconfig.action.undo.success=Successfully reverted to last saved state
sebserver.examconfig.action.copy=Copy Configuration
sebserver.examconfig.action.undo.success=Successfully reverted exam configuration settings to last saved state
sebserver.examconfig.action.copy=Copy Exam Configuration
sebserver.examconfig.action.copy.dialog=Exam Configuration
sebserver.examconfig.action.copy-as-template=Save As Template
sebserver.examconfig.action.copy-as-template.dialog=Configuration Template
sebserver.examconfig.action.export.plainxml=Export Configuration
sebserver.examconfig.action.export.plainxml=Export Exam Configuration
sebserver.examconfig.action.get-config-key=Export Config-Key
sebserver.examconfig.action.import-config=Import Exam Configuration
sebserver.examconfig.action.import-file-select=Import From File
sebserver.examconfig.action.import-file-password=Password
sebserver.examconfig.action.import-config.confirm=Configuration successfully imported
sebserver.examconfig.action.import.missing-password=Missing Password: The chosen SEB Configuration is password-protected.<br/><br/>Please choose it again and provide the correct password within the password field.
sebserver.examconfig.action.state-change.confirm=This configuration is already attached to an exam.<br/><br/>Please note that changing an attached configuration will take effect on the exam when the configuration changes are saved<br/><br/>Are you sure to change this configuration to an editable state?
sebserver.examconfig.action.import-config.confirm=Exam Configuration successfully imported
sebserver.examconfig.action.import.missing-password=Missing Password: The chosen exam configuration is password-protected.<br/><br/>Please choose it again and provide the correct password within the password field.
sebserver.examconfig.action.state-change.confirm=This configuration is already attached to an exam.<br/>Please note that changing an attached configuration will take effect on the exam when the configuration changes are saved<br/><br/>Are you sure to change this configuration to an editable state?
sebserver.examconfig.form.title.new=Add Exam Configuration
sebserver.examconfig.form.title=Exam Configuration
sebserver.examconfig.form.title.subtitle=
sebserver.examconfig.form.name=Name
sebserver.examconfig.form.name.tooltip=The name of the SEB exam configuration.
sebserver.examconfig.form.description=Description
@ -693,7 +704,7 @@ sebserver.examconfig.form.with-history=With History
sebserver.examconfig.form.template=Template
sebserver.examconfig.form.template.tooltip=The template this SEB exam configuration depends on.
sebserver.examconfig.form.status=Status
sebserver.examconfig.form.status.tooltip=The status of this SEB exam configuration.<br/><br/>Under Construction marks a SEB exam configuration to not be able to attach to an exam so far.<br/><br/>Ready to use marks an SEB exam configuration to be able to attach to an exam.<br/><br/>In Use marks a SEB exam configuration is already been used from one or more exam(s)
sebserver.examconfig.form.status.tooltip=The status of this SEB exam configuration.<br/><br/>Under Construction marks a SEB exam configuration to not be able to attach to an exam so far.<br/>Ready to use marks an SEB exam configuration to be able to attach to an exam.<br/>In Use marks a SEB exam configuration is already been used from one or more exam(s)
sebserver.examconfig.form.config-key.title=Config Key
sebserver.examconfig.form.attached-to=Attached To Exam
sebserver.examconfig.form.attached-to.tooltip=This SEB exam configuration is currently attached to the following exams.<br/><br/>Select an exam from the list and use the "View Exam" or Double-Click on the list to go to a specific exam.
@ -1178,6 +1189,7 @@ sebserver.examconfig.props.validation.WindowsSizeValidator=Invalid number
sebserver.configtemplate.action.list=Configuration Templates
sebserver.configtemplate.list.title=Configuration Templates
sebserver.configtemplate.list.title.subtitle=
sebserver.configtemplate.list.empty=There is currently no SEB-Exam configuration template available. Please create a new one
sebserver.configtemplate.list.actions=
@ -1185,19 +1197,20 @@ sebserver.configtemplate.info.pleaseSelect=Please select first an Exam Configura
sebserver.configtemplate.action.list.new=Add Configuration Template
sebserver.configtemplate.action.list.view=View Configuration Template
sebserver.configtemplate.action.view=View Template
sebserver.configtemplate.action.list.modify=Edit Template
sebserver.configtemplate.action.modify=Edit Template
sebserver.configtemplate.action.create-config=Create Configuration
sebserver.configtemplate.action.view=View Configuration Template
sebserver.configtemplate.action.list.modify=Edit Configuration Template
sebserver.configtemplate.action.modify=Edit Configuration Template
sebserver.configtemplate.action.create-config=Create Exam Configuration
sebserver.configtemplate.action.create-config.dialog=Exam Configuration
sebserver.configtemplate.form.title.new=Add Template
sebserver.configtemplate.form.title.new=Add Configuration Template
sebserver.configtemplate.form.title=Configuration Template
sebserver.configtemplate.form.title.subtitle=
sebserver.configtemplate.form.name=Name
sebserver.configtemplate.form.name.tooltip=The name of the SEB exam configuration template
sebserver.configtemplate.form.description=Description
sebserver.configtemplate.form.description.tooltip=The description of the SEB exam configuration template
sebserver.configtemplate.action.save=Save Template
sebserver.configtemplate.action.save=Save Configuration Template
sebserver.configtemplate.attr.type.TEXT_FIELD=Text Field
sebserver.configtemplate.attr.type.PASSWORD_FIELD=Password Field
@ -1216,16 +1229,16 @@ sebserver.configtemplate.attr.type.TABLE=Table
sebserver.configtemplate.attr.type.INLINE_TABLE=Table
sebserver.configtemplate.attr.type.COMPOSITE_TABLE=Table
sebserver.configtemplate.attrs.list.title=Configuration Attributes
sebserver.configtemplate.attrs.list.title.tooltip=Table of all SEB exam configuration attributes of this template
sebserver.configtemplate.attrs.list.title=Exam Configuration Attributes
sebserver.configtemplate.attrs.list.title.subtitle=Table of all exam configuration attributes of this template
sebserver.configtemplate.attrs.list.name=Name
sebserver.configtemplate.attrs.list.name.tooltip=The technical name of the SEB exam configuration attribute with the display name in brackets if available.<br/><br/>{0}
sebserver.configtemplate.attrs.list.name.tooltip=The technical name of the exam configuration attribute with the display name in brackets if available.<br/><br/>{0}
sebserver.configtemplate.attrs.list.view=View
sebserver.configtemplate.attrs.list.view.tooltip=The view/tab where the SEB exam configuration attribute belongs to.<br/><br/>{0}
sebserver.configtemplate.attrs.list.view.tooltip=The view/tab where the exam configuration attribute belongs to.<br/><br/>{0}
sebserver.configtemplate.attrs.list.group=Group
sebserver.configtemplate.attrs.list.group.tooltip=The group on the view/tab where the SEB exam configuration attribute belongs to.<br/><br/>{0}
sebserver.configtemplate.attrs.list.group.tooltip=The group on the view/tab where the exam configuration attribute belongs to.<br/><br/>{0}
sebserver.configtemplate.attrs.list.type=Type
sebserver.configtemplate.attrs.list.type.tooltip=The type of the SEB exam configuration attribute.<br/><br/>{0}
sebserver.configtemplate.attrs.list.type.tooltip=The type of the exam configuration attribute.<br/><br/>{0}
sebserver.configtemplate.attr.list.actions=
sebserver.configtemplate.attr.list.actions.modify=Edit Attribute
@ -1234,20 +1247,21 @@ sebserver.configtemplate.attr.list.actions.removeview=Remove From View
sebserver.configtemplate.attr.list.actions.attach-default-view=Attach To View
sebserver.configtemplate.attr.info.pleaseSelect=Please select first an Attribute from the list
sebserver.configtemplate.attr.form.title=Template Attribute
sebserver.configtemplate.attr.form.title=Configuration Template Attribute
sebserver.configtemplate.attr.form.title.subtitle=
sebserver.configtemplate.attr.form.name=Name
sebserver.configtemplate.attr.form.name.tooltip=The technical name of the SEB exam configuration attribute with the display name in brackets if available.
sebserver.configtemplate.attr.form.name.tooltip=The technical name of the exam configuration attribute with the display name in brackets if available.
sebserver.configtemplate.attr.form.type=Type
sebserver.configtemplate.attr.form.type.tooltip=The type of the SEB exam configuration attribute.
sebserver.configtemplate.attr.form.type.tooltip=The type of the exam configuration attribute.
sebserver.configtemplate.attr.form.view=View
sebserver.configtemplate.attr.form.view.tooltip=The view/tab where the SEB exam configuration attribute belongs to.
sebserver.configtemplate.attr.form.view.tooltip=The view/tab where the exam configuration attribute belongs to.
sebserver.configtemplate.attr.form.group=Group
sebserver.configtemplate.attr.form.group.tooltip=The group on the view/tab where the SEB exam configuration attribute belongs to.
sebserver.configtemplate.attr.form.value=Template Attribute Value
sebserver.configtemplate.attr.form.group.tooltip=The group on the view/tab where the exam configuration attribute belongs to.
sebserver.configtemplate.attr.form.value=Configuration Template Attribute Value
sebserver.configtemplate.attr.form.value.tooltip=The SEB exam configuration attribute value that can be set as default for this template
sebserver.configtemplate.attr.action.setdefault=Set Default Values
sebserver.configtemplate.attr.action.template=View Template
sebserver.configtemplate.attr.action.template=View Configuration Template
################################
@ -1362,8 +1376,19 @@ sebserver.userlogs.list.column.activityType=User Activity
sebserver.userlogs.list.column.activityType.tooltip=The type of the user activity.<br/><br/>Use the filter above to specify a activity type.<br/>{0}
sebserver.userlogs.list.column.entityType=Domain Type
sebserver.userlogs.list.column.entityType.tooltip=The domain type of the user activity.<br/><br/>Use the filter above to specify a domain type.<br/>{0}
sebserver.userlogs.list.column.entityId=Entity-ID
sebserver.userlogs.list.column.message=Message
sebserver.userlogs.form.user=User
sebserver.userlogs.form.user.tooltip=The user account of the user activity log.
sebserver.userlogs.form.dateTime=Date {0}
sebserver.userlogs.form.dateTime.tooltip=The date when the user activity log happened.
sebserver.userlogs.form.activityType=User Activity
sebserver.userlogs.form.activityType.tooltip=The type of the user activity.
sebserver.userlogs.form.entityType=Domain Type
sebserver.userlogs.form.entityType.tooltip=The domain type of the user activity.
sebserver.userlogs.form.entityId=Entity-ID
sebserver.userlogs.form.entityId.tooltip=The internal entity identifier of the domain object
sebserver.userlogs.form.message=Message
sebserver.userlogs.form.message.tooltip=The user activity log message.<br/>This is usually a data model representation of the domain object
sebserver.userlogs.details.title=User Activity Log Details
sebserver.userlogs.info.pleaseSelect=Please select first a User Log from the list

View file

@ -68,8 +68,7 @@ Label.list-nav {
Label.h1 {
font: 25px Arial, Helvetica, sans-serif;
height: 28px;
padding: 0px 12px 6px 12px;
padding: 0px 0px 0px 5px;
color: #1f407a;
}
@ -87,6 +86,12 @@ Label.h3 {
color: #1f407a;
}
Label.subtitle {
font: 14px Arial, Helvetica, sans-serif;
padding: 0px 0px 0px 5px;
color: #4a4a4a;
}
Label.error {
font: 10px Arial, Helvetica, sans-serif;
color: #aa0000;
@ -628,7 +633,11 @@ Tree[BORDER] {
border: 1px solid #eceeef;
}
TreeItem, TreeItem.treesection, Tree-RowOverlay:hover.treesection, Tree-RowOverlay:selected.treesection, Tree-RowOverlay:selected:hover.treesection {
TreeItem,
TreeItem.treesection,
Tree-RowOverlay:hover.treesection,
Tree-RowOverlay:selected.treesection,
Tree-RowOverlay:selected:hover.treesection {
font: bold 14px Arial, Helvetica, sans-serif;
color: #1f407a;
background-color: transparent;
@ -657,18 +666,18 @@ Tree-RowOverlay:hover {
Tree-RowOverlay:selected {
background-color: #82be1e;
color: #1F407A;
background-color: #b5b5b5;
color: #303030;
}
Tree-RowOverlay:selected:unfocused {
background-color: #82be1e;
color: #1f407a;
background-color: #b5b5b5;
color: #303030;
}
Tree-RowOverlay:selected:hover {
background-color: #82be1e;
color: #000000;
color: #1f407a;
}
Tree.actions {

File diff suppressed because one or more lines are too long

View file

@ -23,6 +23,8 @@ import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
import ch.ethz.seb.sebserver.gbl.model.institution.LmsSetupTestResult;
import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.lmssetup.TestLmsSetup;
import org.apache.commons.codec.Charsets;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.BooleanUtils;
@ -140,6 +142,7 @@ import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.useraccount.GetUs
import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.useraccount.GetUserAccountNames;
import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.useraccount.NewUserAccount;
import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.useraccount.SaveUserAccount;
import org.springframework.web.servlet.DispatcherServlet;
public class UseCasesIntegrationTest extends GuiIntegrationTest {
@ -658,6 +661,57 @@ public class UseCasesIntegrationTest extends GuiIntegrationTest {
.call();
}
@Test
@Order(6)
// *************************************
// Use Case 5.5: Login as TestInstAdmin and create new Open edX LMS setup and activate
// - login as TestInstAdmin : 987654321
public void testUsecase5_5() {
final RestServiceImpl restService = createRestServiceForUser(
"TestInstAdmin",
"987654321",
new NewLmsSetup(),
new TestLmsSetup(),
new GetLmsSetupNames(),
new GetLmsSetup(),
new SaveLmsSetup(),
new ActivateLmsSetup(),
new DeactivateLmsSetup(),
new GetQuizPage());
// create new LMS Setup Mockup
Result<LmsSetup> newLMSCall = restService
.getBuilder(NewLmsSetup.class)
.withFormParam(Domain.LMS_SETUP.ATTR_NAME, "Test Open edx")
.withFormParam(Domain.LMS_SETUP.ATTR_LMS_TYPE, LmsType.OPEN_EDX.name())
.withFormParam(Domain.LMS_SETUP.ATTR_LMS_URL, "http://localhost:8080/openedxtest")
.withFormParam(Domain.LMS_SETUP.ATTR_LMS_CLIENTNAME, "test")
.withFormParam(Domain.LMS_SETUP.ATTR_LMS_CLIENTSECRET, "test")
.call();
assertNotNull(newLMSCall);
assertFalse(newLMSCall.hasError());
LmsSetup lmsSetup = newLMSCall.get();
assertEquals("Test Open edx", lmsSetup.name);
assertFalse(lmsSetup.isActive());
// activate lms setup
LmsSetupTestResult testResult = restService
.getBuilder(TestLmsSetup.class)
.withURIVariable(API.PARAM_MODEL_ID, lmsSetup.getModelId())
.call()
.getOrThrow();
DispatcherServlet dispatcherServlet = mockMvc.getDispatcherServlet();
assertNotNull(testResult);
assertFalse(testResult.isOk());
assertEquals("[Error [errorType=TOKEN_REQUEST, message=Failed to gain access token from OpenEdX Rest API:\n" +
" tried token endpoints: [/oauth2/access_token]]]", String.valueOf(testResult.errors));
// TODO how to mockup a Open edX response
}
@Test
@Order(6)
// *************************************
@ -1717,6 +1771,27 @@ public class UseCasesIntegrationTest extends GuiIntegrationTest {
assertNotNull(newTemplValue);
assertEquals("123", newTemplValue.value);
// reset template values
TemplateAttribute attribute = restService
.getBuilder(ResetTemplateValues.class)
.withURIVariable(API.PARAM_PARENT_MODEL_ID, String.valueOf(template.id))
.withURIVariable(API.PARAM_MODEL_ID, templateAttr.getModelId())
.call()
.getOrThrow();
assertNotNull(attribute);
assertEquals("hashedAdminPassword", attribute.getConfigAttribute().name);
restService
.getBuilder(GetConfigurationValues.class)
.withQueryParam(ConfigurationValue.FILTER_ATTR_CONFIGURATION_ID, String.valueOf(fallow_up.id))
.withQueryParam(ConfigurationValue.FILTER_ATTR_CONFIGURATION_ATTRIBUTE_ID, savedTAttribute.getModelId())
.call()
.getOrThrow()
.stream()
.filter(cValue -> cValue.attributeId.equals(attribute.getConfigAttribute().id))
.findFirst()
.ifPresent(cValue -> assertNull(cValue.value));
}
}