GUI improvements
This commit is contained in:
parent
8ea0def877
commit
25485b1fd4
28 changed files with 7160 additions and 6921 deletions
|
@ -25,6 +25,7 @@ public final class Constants {
|
||||||
|
|
||||||
public static final String DEFAULT_LANG_CODE = "en";
|
public static final String DEFAULT_LANG_CODE = "en";
|
||||||
public static final String DEFAULT_TIME_ZONE_CODE = "UTC";
|
public static final String DEFAULT_TIME_ZONE_CODE = "UTC";
|
||||||
|
public static final String TOOLTIP_TEXT_KEY_SUFFIX = ".tooltip";
|
||||||
|
|
||||||
public static final int SEB_FILE_HEADER_SIZE = 4;
|
public static final int SEB_FILE_HEADER_SIZE = 4;
|
||||||
public static final int JN_CRYPTOR_ITERATIONS = 10000;
|
public static final int JN_CRYPTOR_ITERATIONS = 10000;
|
||||||
|
|
|
@ -59,7 +59,7 @@ public final class UserInfo implements UserAccount, Serializable {
|
||||||
public final String uuid;
|
public final String uuid;
|
||||||
|
|
||||||
/** The foreign key identifier to the institution where the User belongs to */
|
/** The foreign key identifier to the institution where the User belongs to */
|
||||||
@NotNull
|
@NotNull(message = "user:institutionId:notNull")
|
||||||
@JsonProperty(USER.ATTR_INSTITUTION_ID)
|
@JsonProperty(USER.ATTR_INSTITUTION_ID)
|
||||||
public final Long institutionId;
|
public final Long institutionId;
|
||||||
|
|
||||||
|
@ -68,11 +68,12 @@ public final class UserInfo implements UserAccount, Serializable {
|
||||||
|
|
||||||
/** First name of the user */
|
/** First name of the user */
|
||||||
@NotNull(message = "user:name:notNull")
|
@NotNull(message = "user:name:notNull")
|
||||||
@Size(min = 3, max = 255, message = "user:name:size:{min}:{max}:${validatedValue}")
|
@Size(max = 255, message = "user:name:size:{min}:{max}:${validatedValue}")
|
||||||
@JsonProperty(USER.ATTR_NAME)
|
@JsonProperty(USER.ATTR_NAME)
|
||||||
public final String name;
|
public final String name;
|
||||||
|
|
||||||
/** Surname of the user */
|
/** Surname of the user */
|
||||||
|
@NotNull(message = "user:surname:notNull")
|
||||||
@Size(max = 255, message = "user:surname:size:{min}:{max}:${validatedValue}")
|
@Size(max = 255, message = "user:surname:size:{min}:{max}:${validatedValue}")
|
||||||
@JsonProperty(USER.ATTR_SURNAME)
|
@JsonProperty(USER.ATTR_SURNAME)
|
||||||
public final String surname;
|
public final String surname;
|
||||||
|
@ -215,7 +216,7 @@ public final class UserInfo implements UserAccount, Serializable {
|
||||||
public EnumSet<UserRole> getUserRoles() {
|
public EnumSet<UserRole> getUserRoles() {
|
||||||
return EnumSet.copyOf(
|
return EnumSet.copyOf(
|
||||||
getRoles().stream()
|
getRoles().stream()
|
||||||
.map(r -> UserRole.valueOf(r))
|
.map(UserRole::valueOf)
|
||||||
.collect(Collectors.toList()));
|
.collect(Collectors.toList()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -300,7 +301,7 @@ public final class UserInfo implements UserAccount, Serializable {
|
||||||
*
|
*
|
||||||
* @param userInfo UserInfo instance to copy
|
* @param userInfo UserInfo instance to copy
|
||||||
* @return copied UserInfo instance */
|
* @return copied UserInfo instance */
|
||||||
public static final UserInfo of(final UserInfo userInfo) {
|
public static UserInfo of(final UserInfo userInfo) {
|
||||||
return new UserInfo(
|
return new UserInfo(
|
||||||
userInfo.getUuid(),
|
userInfo.getUuid(),
|
||||||
userInfo.getInstitutionId(),
|
userInfo.getInstitutionId(),
|
||||||
|
@ -326,7 +327,7 @@ public final class UserInfo implements UserAccount, Serializable {
|
||||||
* @param timeZone new timeZone or null if the timeZone of given userInfo should be taken
|
* @param timeZone new timeZone or null if the timeZone of given userInfo should be taken
|
||||||
* @param roles new timeZone or null if the roles of given userInfo should be taken
|
* @param roles new timeZone or null if the roles of given userInfo should be taken
|
||||||
* @return copied UserInfo instance with the given attributes */
|
* @return copied UserInfo instance with the given attributes */
|
||||||
public static final UserInfo of(
|
public static UserInfo of(
|
||||||
final UserInfo userInfo,
|
final UserInfo userInfo,
|
||||||
final String name,
|
final String name,
|
||||||
final String username,
|
final String username,
|
||||||
|
@ -350,11 +351,11 @@ public final class UserInfo implements UserAccount, Serializable {
|
||||||
(roles != null) ? new HashSet<>(Arrays.asList(roles)) : userInfo.roles);
|
(roles != null) ? new HashSet<>(Arrays.asList(roles)) : userInfo.roles);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static final UserInfo withEMail(final UserInfo userInfo, final String email) {
|
public static UserInfo withEMail(final UserInfo userInfo, final String email) {
|
||||||
return of(userInfo, null, null, null, email, null, null, (String[]) null);
|
return of(userInfo, null, null, null, email, null, null, (String[]) null);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static final UserInfo withRoles(final UserInfo userInfo, final String... roles) {
|
public static UserInfo withRoles(final UserInfo userInfo, final String... roles) {
|
||||||
return of(userInfo, null, null, null, null, null, null, roles);
|
return of(userInfo, null, null, null, null, null, null, roles);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -49,11 +49,12 @@ public final class UserMod implements UserAccount {
|
||||||
|
|
||||||
/** first (or full) name of the user */
|
/** first (or full) name of the user */
|
||||||
@NotNull(message = "user:name:notNull")
|
@NotNull(message = "user:name:notNull")
|
||||||
@Size(min = 3, max = 255, message = "user:name:size:{min}:{max}:${validatedValue}")
|
@Size(max = 255, message = "user:name:size:{min}:{max}:${validatedValue}")
|
||||||
@JsonProperty(USER.ATTR_NAME)
|
@JsonProperty(USER.ATTR_NAME)
|
||||||
public final String name;
|
public final String name;
|
||||||
|
|
||||||
/** surname of the user */
|
/** surname of the user */
|
||||||
|
@NotNull(message = "user:surname:notNull")
|
||||||
@Size(max = 255, message = "user:surname:size:{min}:{max}:${validatedValue}")
|
@Size(max = 255, message = "user:surname:size:{min}:{max}:${validatedValue}")
|
||||||
@JsonProperty(USER.ATTR_SURNAME)
|
@JsonProperty(USER.ATTR_SURNAME)
|
||||||
public final String surname;
|
public final String surname;
|
||||||
|
|
|
@ -30,6 +30,15 @@ public class Tuple<T> {
|
||||||
return this._2;
|
return this._2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
public <TT extends Tuple<T>> TT adaptTo(Class<TT> type) {
|
||||||
|
if (type.equals(this.getClass())) {
|
||||||
|
return (TT) this;
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int hashCode() {
|
public int hashCode() {
|
||||||
final int prime = 31;
|
final int prime = 31;
|
||||||
|
|
41
src/main/java/ch/ethz/seb/sebserver/gbl/util/Tuple3.java
Normal file
41
src/main/java/ch/ethz/seb/sebserver/gbl/util/Tuple3.java
Normal file
|
@ -0,0 +1,41 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2020 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.util;
|
||||||
|
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
/** A tuple of three elements of the same type */
|
||||||
|
public class Tuple3<T> extends Tuple<T> {
|
||||||
|
|
||||||
|
/** The third element of the tuple */
|
||||||
|
public final T _3;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object o) {
|
||||||
|
if (this == o) return true;
|
||||||
|
if (o == null || getClass() != o.getClass()) return false;
|
||||||
|
if (!super.equals(o)) return false;
|
||||||
|
Tuple3<?> tuple3 = (Tuple3<?>) o;
|
||||||
|
return Objects.equals(_3, tuple3._3);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
return Objects.hash(super.hashCode(), _3);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Tuple3(T _1, T _2, T _3) {
|
||||||
|
super(_1, _2);
|
||||||
|
this._3 = _3;
|
||||||
|
}
|
||||||
|
|
||||||
|
public T get_3() {
|
||||||
|
return _3;
|
||||||
|
}
|
||||||
|
}
|
|
@ -8,8 +8,9 @@
|
||||||
|
|
||||||
package ch.ethz.seb.sebserver.gui.content;
|
package ch.ethz.seb.sebserver.gui.content;
|
||||||
|
|
||||||
import java.util.Arrays;
|
import java.util.Collections;
|
||||||
|
|
||||||
|
import org.apache.commons.lang3.StringUtils;
|
||||||
import org.eclipse.swt.SWT;
|
import org.eclipse.swt.SWT;
|
||||||
import org.eclipse.swt.layout.GridData;
|
import org.eclipse.swt.layout.GridData;
|
||||||
import org.eclipse.swt.layout.GridLayout;
|
import org.eclipse.swt.layout.GridLayout;
|
||||||
|
@ -68,6 +69,8 @@ public class ConfigTemplateAttributeForm implements TemplateComposer {
|
||||||
new LocTextKey("sebserver.configtemplate.attr.form.group");
|
new LocTextKey("sebserver.configtemplate.attr.form.group");
|
||||||
private static final LocTextKey FORM_VALUE_TEXT_KEY =
|
private static final LocTextKey FORM_VALUE_TEXT_KEY =
|
||||||
new LocTextKey("sebserver.configtemplate.attr.form.value");
|
new LocTextKey("sebserver.configtemplate.attr.form.value");
|
||||||
|
private static final LocTextKey FORM_VALUE_TOOLTIP_TEXT_KEY =
|
||||||
|
new LocTextKey("sebserver.configtemplate.attr.form.value" + Constants.TOOLTIP_TEXT_KEY_SUFFIX);
|
||||||
|
|
||||||
private final PageService pageService;
|
private final PageService pageService;
|
||||||
private final RestService restService;
|
private final RestService restService;
|
||||||
|
@ -164,11 +167,12 @@ public class ConfigTemplateAttributeForm implements TemplateComposer {
|
||||||
valSpace.setLayout(new GridLayout());
|
valSpace.setLayout(new GridLayout());
|
||||||
valSpace.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
|
valSpace.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
|
||||||
|
|
||||||
|
widgetFactory.label(content, StringUtils.EMPTY);
|
||||||
widgetFactory.labelLocalized(
|
widgetFactory.labelLocalized(
|
||||||
valSpace,
|
valSpace,
|
||||||
CustomVariant.TEXT_H2,
|
CustomVariant.TEXT_H3,
|
||||||
FORM_VALUE_TEXT_KEY);
|
FORM_VALUE_TEXT_KEY,
|
||||||
|
FORM_VALUE_TOOLTIP_TEXT_KEY);
|
||||||
widgetFactory.labelSeparator(valSpace);
|
widgetFactory.labelSeparator(valSpace);
|
||||||
|
|
||||||
final Composite grid = new Composite(valSpace, SWT.NONE);
|
final Composite grid = new Composite(valSpace, SWT.NONE);
|
||||||
|
@ -201,7 +205,7 @@ public class ConfigTemplateAttributeForm implements TemplateComposer {
|
||||||
|
|
||||||
this.examConfigurationService.initInputFieldValues(
|
this.examConfigurationService.initInputFieldValues(
|
||||||
configuration.id,
|
configuration.id,
|
||||||
Arrays.asList(viewContext));
|
Collections.singletonList(viewContext));
|
||||||
|
|
||||||
this.pageService.pageActionBuilder(formContext.clearEntityKeys())
|
this.pageService.pageActionBuilder(formContext.clearEntityKeys())
|
||||||
|
|
||||||
|
|
|
@ -64,6 +64,8 @@ public class ConfigTemplateForm implements TemplateComposer {
|
||||||
new LocTextKey("sebserver.configtemplate.form.description");
|
new LocTextKey("sebserver.configtemplate.form.description");
|
||||||
private static final LocTextKey ATTRIBUTES_LIST_TITLE_TEXT_KEY =
|
private static final LocTextKey ATTRIBUTES_LIST_TITLE_TEXT_KEY =
|
||||||
new LocTextKey("sebserver.configtemplate.attrs.list.title");
|
new LocTextKey("sebserver.configtemplate.attrs.list.title");
|
||||||
|
private static final LocTextKey ATTRIBUTES_LIST_TITLE_TOOLTIP_TEXT_KEY =
|
||||||
|
new LocTextKey("sebserver.configtemplate.attrs.list.title" + Constants.TOOLTIP_TEXT_KEY_SUFFIX);
|
||||||
private static final LocTextKey ATTRIBUTES_LIST_NAME_TEXT_KEY =
|
private static final LocTextKey ATTRIBUTES_LIST_NAME_TEXT_KEY =
|
||||||
new LocTextKey("sebserver.configtemplate.attrs.list.name");
|
new LocTextKey("sebserver.configtemplate.attrs.list.name");
|
||||||
private static final LocTextKey ATTRIBUTES_LIST_VIEW_TEXT_KEY =
|
private static final LocTextKey ATTRIBUTES_LIST_VIEW_TEXT_KEY =
|
||||||
|
@ -158,7 +160,8 @@ public class ConfigTemplateForm implements TemplateComposer {
|
||||||
.addField(FormBuilder.text(
|
.addField(FormBuilder.text(
|
||||||
Domain.CONFIGURATION_NODE.ATTR_NAME,
|
Domain.CONFIGURATION_NODE.ATTR_NAME,
|
||||||
FORM_NAME_TEXT_KEY,
|
FORM_NAME_TEXT_KEY,
|
||||||
examConfig.name))
|
examConfig.name)
|
||||||
|
.mandatory(!isReadonly))
|
||||||
.addField(FormBuilder.text(
|
.addField(FormBuilder.text(
|
||||||
Domain.CONFIGURATION_NODE.ATTR_DESCRIPTION,
|
Domain.CONFIGURATION_NODE.ATTR_DESCRIPTION,
|
||||||
FORM_DESCRIPTION_TEXT_KEY,
|
FORM_DESCRIPTION_TEXT_KEY,
|
||||||
|
@ -174,10 +177,13 @@ public class ConfigTemplateForm implements TemplateComposer {
|
||||||
|
|
||||||
if (isReadonly) {
|
if (isReadonly) {
|
||||||
|
|
||||||
widgetFactory.label(content, "");
|
widgetFactory.label(content, StringUtils.EMPTY);
|
||||||
widgetFactory.labelLocalizedTitle(
|
widgetFactory.labelLocalized(
|
||||||
content,
|
content,
|
||||||
ATTRIBUTES_LIST_TITLE_TEXT_KEY);
|
WidgetFactory.CustomVariant.TEXT_H3,
|
||||||
|
ATTRIBUTES_LIST_TITLE_TEXT_KEY,
|
||||||
|
ATTRIBUTES_LIST_TITLE_TOOLTIP_TEXT_KEY);
|
||||||
|
widgetFactory.labelSeparator(content);
|
||||||
|
|
||||||
final TableFilterAttribute viewFilter = new TableFilterAttribute(
|
final TableFilterAttribute viewFilter = new TableFilterAttribute(
|
||||||
CriteriaType.SINGLE_SELECTION,
|
CriteriaType.SINGLE_SELECTION,
|
||||||
|
@ -186,7 +192,7 @@ public class ConfigTemplateForm implements TemplateComposer {
|
||||||
final TableFilterAttribute typeFilter = new TableFilterAttribute(
|
final TableFilterAttribute typeFilter = new TableFilterAttribute(
|
||||||
CriteriaType.SINGLE_SELECTION,
|
CriteriaType.SINGLE_SELECTION,
|
||||||
TemplateAttribute.FILTER_ATTR_TYPE,
|
TemplateAttribute.FILTER_ATTR_TYPE,
|
||||||
() -> this.resourceService.getAttributeTypeResources());
|
this.resourceService::getAttributeTypeResources);
|
||||||
|
|
||||||
final EntityTable<TemplateAttribute> attrTable =
|
final EntityTable<TemplateAttribute> attrTable =
|
||||||
this.pageService.entityTableBuilder(
|
this.pageService.entityTableBuilder(
|
||||||
|
@ -228,6 +234,14 @@ public class ConfigTemplateForm implements TemplateComposer {
|
||||||
.newAction(ActionDefinition.SEB_EXAM_CONFIG_TEMPLATE_ATTR_EDIT)
|
.newAction(ActionDefinition.SEB_EXAM_CONFIG_TEMPLATE_ATTR_EDIT)
|
||||||
.withParentEntityKey(entityKey)
|
.withParentEntityKey(entityKey)
|
||||||
.create())
|
.create())
|
||||||
|
|
||||||
|
.withSelectionListener(this.pageService.getSelectionPublisher(
|
||||||
|
pageContext,
|
||||||
|
ActionDefinition.SEB_EXAM_CONFIG_TEMPLATE_ATTR_EDIT,
|
||||||
|
ActionDefinition.SEB_EXAM_CONFIG_TEMPLATE_ATTR_SET_DEFAULT,
|
||||||
|
ActionDefinition.SEB_EXAM_CONFIG_TEMPLATE_ATTR_LIST_REMOVE_VIEW,
|
||||||
|
ActionDefinition.SEB_EXAM_CONFIG_TEMPLATE_ATTR_LIST_ATTACH_DEFAULT_VIEW))
|
||||||
|
|
||||||
.compose(pageContext.copyOf(content));
|
.compose(pageContext.copyOf(content));
|
||||||
|
|
||||||
pageActionBuilder
|
pageActionBuilder
|
||||||
|
@ -238,7 +252,7 @@ public class ConfigTemplateForm implements TemplateComposer {
|
||||||
attrTable::getSelection,
|
attrTable::getSelection,
|
||||||
PageAction::applySingleSelectionAsEntityKey,
|
PageAction::applySingleSelectionAsEntityKey,
|
||||||
EMPTY_ATTRIBUTE_SELECTION_TEXT_KEY)
|
EMPTY_ATTRIBUTE_SELECTION_TEXT_KEY)
|
||||||
.publishIf(() -> attrTable.hasAnyContent())
|
.publishIf(attrTable::hasAnyContent, false)
|
||||||
|
|
||||||
.newAction(ActionDefinition.SEB_EXAM_CONFIG_TEMPLATE_ATTR_SET_DEFAULT)
|
.newAction(ActionDefinition.SEB_EXAM_CONFIG_TEMPLATE_ATTR_SET_DEFAULT)
|
||||||
.withParentEntityKey(entityKey)
|
.withParentEntityKey(entityKey)
|
||||||
|
@ -247,7 +261,7 @@ public class ConfigTemplateForm implements TemplateComposer {
|
||||||
action -> this.resetToDefaults(action, attrTable),
|
action -> this.resetToDefaults(action, attrTable),
|
||||||
EMPTY_ATTRIBUTE_SELECTION_TEXT_KEY)
|
EMPTY_ATTRIBUTE_SELECTION_TEXT_KEY)
|
||||||
.noEventPropagation()
|
.noEventPropagation()
|
||||||
.publishIf(() -> attrTable.hasAnyContent())
|
.publishIf(attrTable::hasAnyContent, false)
|
||||||
|
|
||||||
.newAction(ActionDefinition.SEB_EXAM_CONFIG_TEMPLATE_ATTR_LIST_REMOVE_VIEW)
|
.newAction(ActionDefinition.SEB_EXAM_CONFIG_TEMPLATE_ATTR_LIST_REMOVE_VIEW)
|
||||||
.withParentEntityKey(entityKey)
|
.withParentEntityKey(entityKey)
|
||||||
|
@ -256,7 +270,7 @@ public class ConfigTemplateForm implements TemplateComposer {
|
||||||
action -> this.removeFormView(action, attrTable),
|
action -> this.removeFormView(action, attrTable),
|
||||||
EMPTY_ATTRIBUTE_SELECTION_TEXT_KEY)
|
EMPTY_ATTRIBUTE_SELECTION_TEXT_KEY)
|
||||||
.noEventPropagation()
|
.noEventPropagation()
|
||||||
.publishIf(() -> attrTable.hasAnyContent())
|
.publishIf(attrTable::hasAnyContent, false)
|
||||||
|
|
||||||
.newAction(ActionDefinition.SEB_EXAM_CONFIG_TEMPLATE_ATTR_LIST_ATTACH_DEFAULT_VIEW)
|
.newAction(ActionDefinition.SEB_EXAM_CONFIG_TEMPLATE_ATTR_LIST_ATTACH_DEFAULT_VIEW)
|
||||||
.withParentEntityKey(entityKey)
|
.withParentEntityKey(entityKey)
|
||||||
|
@ -265,7 +279,7 @@ public class ConfigTemplateForm implements TemplateComposer {
|
||||||
action -> this.attachView(action, attrTable),
|
action -> this.attachView(action, attrTable),
|
||||||
EMPTY_ATTRIBUTE_SELECTION_TEXT_KEY)
|
EMPTY_ATTRIBUTE_SELECTION_TEXT_KEY)
|
||||||
.noEventPropagation()
|
.noEventPropagation()
|
||||||
.publishIf(() -> attrTable.hasAnyContent());
|
.publishIf(attrTable::hasAnyContent, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
pageActionBuilder
|
pageActionBuilder
|
||||||
|
@ -315,7 +329,7 @@ public class ConfigTemplateForm implements TemplateComposer {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private final PageAction resetToDefaults(
|
private PageAction resetToDefaults(
|
||||||
final PageAction action,
|
final PageAction action,
|
||||||
final EntityTable<TemplateAttribute> attrTable) {
|
final EntityTable<TemplateAttribute> attrTable) {
|
||||||
|
|
||||||
|
@ -325,7 +339,7 @@ public class ConfigTemplateForm implements TemplateComposer {
|
||||||
return resetToDefaults;
|
return resetToDefaults;
|
||||||
}
|
}
|
||||||
|
|
||||||
private final PageAction removeFormView(
|
private PageAction removeFormView(
|
||||||
final PageAction action,
|
final PageAction action,
|
||||||
final EntityTable<TemplateAttribute> attrTable) {
|
final EntityTable<TemplateAttribute> attrTable) {
|
||||||
|
|
||||||
|
@ -335,7 +349,7 @@ public class ConfigTemplateForm implements TemplateComposer {
|
||||||
return removeFormView;
|
return removeFormView;
|
||||||
}
|
}
|
||||||
|
|
||||||
private final PageAction attachView(
|
private PageAction attachView(
|
||||||
final PageAction action,
|
final PageAction action,
|
||||||
final EntityTable<TemplateAttribute> attrTable) {
|
final EntityTable<TemplateAttribute> attrTable) {
|
||||||
|
|
||||||
|
|
|
@ -43,7 +43,7 @@ import ch.ethz.seb.sebserver.gui.widget.WidgetFactory;
|
||||||
@GuiProfile
|
@GuiProfile
|
||||||
public class ConfigTemplateList implements TemplateComposer {
|
public class ConfigTemplateList implements TemplateComposer {
|
||||||
|
|
||||||
private static final LocTextKey NO_MODIFY_PRIVILEGE_ON_OTHER_INSTITUION =
|
private static final LocTextKey NO_MODIFY_PRIVILEGE_ON_OTHER_INSTITUTION =
|
||||||
new LocTextKey("sebserver.examconfig.list.action.no.modify.privilege");
|
new LocTextKey("sebserver.examconfig.list.action.no.modify.privilege");
|
||||||
private static final LocTextKey TITLE_TEMPLATE_TEXT_KEY =
|
private static final LocTextKey TITLE_TEMPLATE_TEXT_KEY =
|
||||||
new LocTextKey("sebserver.configtemplate.list.title");
|
new LocTextKey("sebserver.configtemplate.list.title");
|
||||||
|
@ -131,6 +131,12 @@ public class ConfigTemplateList implements TemplateComposer {
|
||||||
.withDefaultAction(pageActionBuilder
|
.withDefaultAction(pageActionBuilder
|
||||||
.newAction(ActionDefinition.SEB_EXAM_CONFIG_TEMPLATE_VIEW_FROM_LIST)
|
.newAction(ActionDefinition.SEB_EXAM_CONFIG_TEMPLATE_VIEW_FROM_LIST)
|
||||||
.create())
|
.create())
|
||||||
|
|
||||||
|
.withSelectionListener(this.pageService.getSelectionPublisher(
|
||||||
|
pageContext,
|
||||||
|
ActionDefinition.SEB_EXAM_CONFIG_TEMPLATE_VIEW_FROM_LIST,
|
||||||
|
ActionDefinition.SEB_EXAM_CONFIG_TEMPLATE_MODIFY_FROM_LIST))
|
||||||
|
|
||||||
.compose(pageContext.copyOf(content));
|
.compose(pageContext.copyOf(content));
|
||||||
|
|
||||||
final GrantCheck examConfigGrant = this.currentUser.grantCheck(EntityType.CONFIGURATION_NODE);
|
final GrantCheck examConfigGrant = this.currentUser.grantCheck(EntityType.CONFIGURATION_NODE);
|
||||||
|
@ -142,14 +148,12 @@ public class ConfigTemplateList implements TemplateComposer {
|
||||||
.newAction(ActionDefinition.SEB_EXAM_CONFIG_TEMPLATE_VIEW_FROM_LIST)
|
.newAction(ActionDefinition.SEB_EXAM_CONFIG_TEMPLATE_VIEW_FROM_LIST)
|
||||||
.withSelect(templateTable::getSelection, PageAction::applySingleSelectionAsEntityKey,
|
.withSelect(templateTable::getSelection, PageAction::applySingleSelectionAsEntityKey,
|
||||||
EMPTY_TEMPLATE_SELECTION_TEXT_KEY)
|
EMPTY_TEMPLATE_SELECTION_TEXT_KEY)
|
||||||
.publishIf(() -> templateTable.hasAnyContent())
|
.publishIf(templateTable::hasAnyContent, false)
|
||||||
|
|
||||||
.newAction(ActionDefinition.SEB_EXAM_CONFIG_TEMPLATE_MODIFY_FROM_LIST)
|
.newAction(ActionDefinition.SEB_EXAM_CONFIG_TEMPLATE_MODIFY_FROM_LIST)
|
||||||
.withSelect(
|
.withSelect(
|
||||||
templateTable.getGrantedSelection(this.currentUser, NO_MODIFY_PRIVILEGE_ON_OTHER_INSTITUION),
|
templateTable.getGrantedSelection(this.currentUser, NO_MODIFY_PRIVILEGE_ON_OTHER_INSTITUTION),
|
||||||
PageAction::applySingleSelectionAsEntityKey, EMPTY_TEMPLATE_SELECTION_TEXT_KEY)
|
PageAction::applySingleSelectionAsEntityKey, EMPTY_TEMPLATE_SELECTION_TEXT_KEY)
|
||||||
.publishIf(() -> examConfigGrant.im() && templateTable.hasAnyContent());
|
.publishIf(() -> examConfigGrant.im() && templateTable.hasAnyContent(), false);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,7 +20,7 @@ import java.util.function.Function;
|
||||||
import java.util.function.Supplier;
|
import java.util.function.Supplier;
|
||||||
|
|
||||||
import org.apache.commons.lang3.BooleanUtils;
|
import org.apache.commons.lang3.BooleanUtils;
|
||||||
import org.apache.tomcat.util.buf.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
import org.eclipse.rap.rwt.RWT;
|
import org.eclipse.rap.rwt.RWT;
|
||||||
import org.eclipse.rap.rwt.client.service.UrlLauncher;
|
import org.eclipse.rap.rwt.client.service.UrlLauncher;
|
||||||
import org.eclipse.swt.widgets.Composite;
|
import org.eclipse.swt.widgets.Composite;
|
||||||
|
@ -394,7 +394,7 @@ public class ExamForm implements TemplateComposer {
|
||||||
if (readonly && !importFromQuizData) {
|
if (readonly && !importFromQuizData) {
|
||||||
|
|
||||||
// List of SEB Configuration
|
// List of SEB Configuration
|
||||||
this.widgetFactory.label(content, "");
|
this.widgetFactory.label(content, StringUtils.EMPTY);
|
||||||
this.widgetFactory.labelLocalized(
|
this.widgetFactory.labelLocalized(
|
||||||
content,
|
content,
|
||||||
CustomVariant.TEXT_H3,
|
CustomVariant.TEXT_H3,
|
||||||
|
|
|
@ -131,11 +131,6 @@ public class InstitutionForm implements TemplateComposer {
|
||||||
.newAction(ActionDefinition.INSTITUTION_NEW)
|
.newAction(ActionDefinition.INSTITUTION_NEW)
|
||||||
.publishIf(() -> writeGrant && isReadonly)
|
.publishIf(() -> writeGrant && isReadonly)
|
||||||
|
|
||||||
// Removed as discussed in SEBSERV-52
|
|
||||||
// .newAction(ActionDefinition.USER_ACCOUNT_NEW)
|
|
||||||
// .withParentEntityKey(entityKey)
|
|
||||||
// .publishIf(() -> userWriteGrant && isReadonly && institution.isActive())
|
|
||||||
|
|
||||||
.newAction(ActionDefinition.INSTITUTION_MODIFY)
|
.newAction(ActionDefinition.INSTITUTION_MODIFY)
|
||||||
.withEntityKey(entityKey)
|
.withEntityKey(entityKey)
|
||||||
.publishIf(() -> modifyGrant && isReadonly)
|
.publishIf(() -> modifyGrant && isReadonly)
|
||||||
|
|
|
@ -140,7 +140,7 @@ public class InstitutionList implements TemplateComposer {
|
||||||
table::getSelection,
|
table::getSelection,
|
||||||
PageAction::applySingleSelectionAsEntityKey,
|
PageAction::applySingleSelectionAsEntityKey,
|
||||||
EMPTY_SELECTION_TEXT_KEY)
|
EMPTY_SELECTION_TEXT_KEY)
|
||||||
.publishIf(() -> table.hasAnyContent(), false)
|
.publishIf(table::hasAnyContent, false)
|
||||||
|
|
||||||
.newAction(ActionDefinition.INSTITUTION_MODIFY_FROM_LIST)
|
.newAction(ActionDefinition.INSTITUTION_MODIFY_FROM_LIST)
|
||||||
.withSelect(
|
.withSelect(
|
||||||
|
|
|
@ -196,6 +196,12 @@ public class SebClientConfigForm implements TemplateComposer {
|
||||||
.ignoreMoveAwayFromEdit()
|
.ignoreMoveAwayFromEdit()
|
||||||
.publishIf(() -> !isReadonly)
|
.publishIf(() -> !isReadonly)
|
||||||
|
|
||||||
|
.newAction(ActionDefinition.SEB_CLIENT_CONFIG_SAVE_AND_ACTIVATE)
|
||||||
|
.withEntityKey(entityKey)
|
||||||
|
.withExec(formHandle::saveAndActivate)
|
||||||
|
.ignoreMoveAwayFromEdit()
|
||||||
|
.publishIf(() -> !isReadonly && !clientConfig.isActive())
|
||||||
|
|
||||||
.newAction(ActionDefinition.SEB_CLIENT_CONFIG_CANCEL_MODIFY)
|
.newAction(ActionDefinition.SEB_CLIENT_CONFIG_CANCEL_MODIFY)
|
||||||
.withEntityKey(entityKey)
|
.withEntityKey(entityKey)
|
||||||
.withExec(this.pageService.backToCurrentFunction())
|
.withExec(this.pageService.backToCurrentFunction())
|
||||||
|
|
|
@ -151,6 +151,16 @@ public class SebClientConfigList implements TemplateComposer {
|
||||||
.withDefaultAction(pageActionBuilder
|
.withDefaultAction(pageActionBuilder
|
||||||
.newAction(ActionDefinition.SEB_CLIENT_CONFIG_VIEW_FROM_LIST)
|
.newAction(ActionDefinition.SEB_CLIENT_CONFIG_VIEW_FROM_LIST)
|
||||||
.create())
|
.create())
|
||||||
|
|
||||||
|
.withSelectionListener(this.pageService.getSelectionPublisher(
|
||||||
|
ActionDefinition.SEB_CLIENT_CONFIG_TOGGLE_ACTIVITY,
|
||||||
|
ActionDefinition.SEB_CLIENT_CONFIG_ACTIVATE,
|
||||||
|
ActionDefinition.SEB_CLIENT_CONFIG_DEACTIVATE,
|
||||||
|
pageContext,
|
||||||
|
ActionDefinition.SEB_CLIENT_CONFIG_VIEW_FROM_LIST,
|
||||||
|
ActionDefinition.SEB_CLIENT_CONFIG_MODIFY_FROM_LIST,
|
||||||
|
ActionDefinition.SEB_CLIENT_CONFIG_TOGGLE_ACTIVITY))
|
||||||
|
|
||||||
.compose(pageContext.copyOf(content));
|
.compose(pageContext.copyOf(content));
|
||||||
|
|
||||||
final GrantCheck clientConfigGrant = this.currentUser.grantCheck(EntityType.SEB_CLIENT_CONFIGURATION);
|
final GrantCheck clientConfigGrant = this.currentUser.grantCheck(EntityType.SEB_CLIENT_CONFIGURATION);
|
||||||
|
@ -162,13 +172,20 @@ public class SebClientConfigList implements TemplateComposer {
|
||||||
|
|
||||||
.newAction(ActionDefinition.SEB_CLIENT_CONFIG_VIEW_FROM_LIST)
|
.newAction(ActionDefinition.SEB_CLIENT_CONFIG_VIEW_FROM_LIST)
|
||||||
.withSelect(table::getSelection, PageAction::applySingleSelectionAsEntityKey, EMPTY_SELECTION_TEXT_KEY)
|
.withSelect(table::getSelection, PageAction::applySingleSelectionAsEntityKey, EMPTY_SELECTION_TEXT_KEY)
|
||||||
.publishIf(() -> table.hasAnyContent())
|
.publishIf(table::hasAnyContent, false)
|
||||||
|
|
||||||
.newAction(ActionDefinition.SEB_CLIENT_CONFIG_MODIFY_FROM_LIST)
|
.newAction(ActionDefinition.SEB_CLIENT_CONFIG_MODIFY_FROM_LIST)
|
||||||
.withSelect(
|
.withSelect(
|
||||||
table.getGrantedSelection(this.currentUser, NO_MODIFY_PRIVILEGE_ON_OTHER_INSTITUION),
|
table.getGrantedSelection(this.currentUser, NO_MODIFY_PRIVILEGE_ON_OTHER_INSTITUION),
|
||||||
PageAction::applySingleSelectionAsEntityKey, EMPTY_SELECTION_TEXT_KEY)
|
PageAction::applySingleSelectionAsEntityKey, EMPTY_SELECTION_TEXT_KEY)
|
||||||
.publishIf(() -> clientConfigGrant.im() && table.hasAnyContent());
|
.publishIf(() -> clientConfigGrant.im() && table.hasAnyContent(), false)
|
||||||
|
|
||||||
|
.newAction(ActionDefinition.SEB_CLIENT_CONFIG_TOGGLE_ACTIVITY)
|
||||||
|
.withExec(this.pageService.activationToggleActionFunction(table, EMPTY_SELECTION_TEXT_KEY))
|
||||||
|
.withConfirm(this.pageService.confirmDeactivation(table))
|
||||||
|
.publishIf(() -> clientConfigGrant.im() && table.hasAnyContent(), false);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -144,6 +144,12 @@ public class SebExamConfigList implements TemplateComposer {
|
||||||
.withDefaultAction(pageActionBuilder
|
.withDefaultAction(pageActionBuilder
|
||||||
.newAction(ActionDefinition.SEB_EXAM_CONFIG_VIEW_PROP_FROM_LIST)
|
.newAction(ActionDefinition.SEB_EXAM_CONFIG_VIEW_PROP_FROM_LIST)
|
||||||
.create())
|
.create())
|
||||||
|
|
||||||
|
.withSelectionListener(this.pageService.getSelectionPublisher(
|
||||||
|
pageContext,
|
||||||
|
ActionDefinition.SEB_EXAM_CONFIG_VIEW_PROP_FROM_LIST,
|
||||||
|
ActionDefinition.SEB_EXAM_CONFIG_MODIFY_PROP_FROM_LIST))
|
||||||
|
|
||||||
.compose(pageContext.copyOf(content));
|
.compose(pageContext.copyOf(content));
|
||||||
|
|
||||||
final GrantCheck examConfigGrant = this.currentUser.grantCheck(EntityType.CONFIGURATION_NODE);
|
final GrantCheck examConfigGrant = this.currentUser.grantCheck(EntityType.CONFIGURATION_NODE);
|
||||||
|
@ -155,20 +161,18 @@ public class SebExamConfigList implements TemplateComposer {
|
||||||
.newAction(ActionDefinition.SEB_EXAM_CONFIG_VIEW_PROP_FROM_LIST)
|
.newAction(ActionDefinition.SEB_EXAM_CONFIG_VIEW_PROP_FROM_LIST)
|
||||||
.withSelect(configTable::getSelection, PageAction::applySingleSelectionAsEntityKey,
|
.withSelect(configTable::getSelection, PageAction::applySingleSelectionAsEntityKey,
|
||||||
EMPTY_SELECTION_TEXT_KEY)
|
EMPTY_SELECTION_TEXT_KEY)
|
||||||
.publishIf(() -> configTable.hasAnyContent())
|
.publishIf(configTable::hasAnyContent, false)
|
||||||
|
|
||||||
.newAction(ActionDefinition.SEB_EXAM_CONFIG_MODIFY_PROP_FROM_LIST)
|
.newAction(ActionDefinition.SEB_EXAM_CONFIG_MODIFY_PROP_FROM_LIST)
|
||||||
.withSelect(
|
.withSelect(
|
||||||
configTable.getGrantedSelection(this.currentUser, NO_MODIFY_PRIVILEGE_ON_OTHER_INSTITUION),
|
configTable.getGrantedSelection(this.currentUser, NO_MODIFY_PRIVILEGE_ON_OTHER_INSTITUION),
|
||||||
PageAction::applySingleSelectionAsEntityKey, EMPTY_SELECTION_TEXT_KEY)
|
PageAction::applySingleSelectionAsEntityKey, EMPTY_SELECTION_TEXT_KEY)
|
||||||
.publishIf(() -> examConfigGrant.im() && configTable.hasAnyContent())
|
.publishIf(() -> examConfigGrant.im() && configTable.hasAnyContent(), false)
|
||||||
|
|
||||||
.newAction(ActionDefinition.SEB_EXAM_CONFIG_IMPORT_TO_NEW_CONFIG)
|
.newAction(ActionDefinition.SEB_EXAM_CONFIG_IMPORT_TO_NEW_CONFIG)
|
||||||
.withExec(SebExamConfigImportPopup.importFunction(this.pageService, true))
|
.withExec(SebExamConfigImportPopup.importFunction(this.pageService, true))
|
||||||
.noEventPropagation()
|
.noEventPropagation()
|
||||||
.publishIf(() -> examConfigGrant.im())
|
.publishIf(examConfigGrant::im);
|
||||||
|
|
||||||
;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,14 +9,17 @@
|
||||||
package ch.ethz.seb.sebserver.gui.content;
|
package ch.ethz.seb.sebserver.gui.content;
|
||||||
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
import java.util.Collections;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
|
|
||||||
|
import org.apache.commons.lang3.StringUtils;
|
||||||
import org.eclipse.rap.rwt.RWT;
|
import org.eclipse.rap.rwt.RWT;
|
||||||
import org.eclipse.rap.rwt.client.service.UrlLauncher;
|
import org.eclipse.rap.rwt.client.service.UrlLauncher;
|
||||||
import org.eclipse.swt.SWT;
|
import org.eclipse.swt.SWT;
|
||||||
import org.eclipse.swt.widgets.Composite;
|
import org.eclipse.swt.widgets.Composite;
|
||||||
|
import org.eclipse.swt.widgets.Label;
|
||||||
import org.eclipse.swt.widgets.Text;
|
import org.eclipse.swt.widgets.Text;
|
||||||
import org.springframework.beans.factory.annotation.Value;
|
import org.springframework.beans.factory.annotation.Value;
|
||||||
import org.springframework.context.annotation.Lazy;
|
import org.springframework.context.annotation.Lazy;
|
||||||
|
@ -94,7 +97,9 @@ public class SebExamConfigPropForm implements TemplateComposer {
|
||||||
static final LocTextKey FORM_IMPORT_CONFIRM_TEXT_KEY =
|
static final LocTextKey FORM_IMPORT_CONFIRM_TEXT_KEY =
|
||||||
new LocTextKey("sebserver.examconfig.action.import-config.confirm");
|
new LocTextKey("sebserver.examconfig.action.import-config.confirm");
|
||||||
static final LocTextKey FORM_ATTACHED_EXAMS_TITLE_TEXT_KEY =
|
static final LocTextKey FORM_ATTACHED_EXAMS_TITLE_TEXT_KEY =
|
||||||
new LocTextKey("sebserver.examconfig.form.attched-to");
|
new LocTextKey("sebserver.examconfig.form.attached-to");
|
||||||
|
static final LocTextKey FORM_ATTACHED_EXAMS_TITLE_TOOLTIP_TEXT_KEY =
|
||||||
|
new LocTextKey("sebserver.examconfig.form.attached-to" + Constants.TOOLTIP_TEXT_KEY_SUFFIX);
|
||||||
|
|
||||||
static final LocTextKey SAVE_CONFIRM_STATE_CHANGE_WHILE_ATTACHED =
|
static final LocTextKey SAVE_CONFIRM_STATE_CHANGE_WHILE_ATTACHED =
|
||||||
new LocTextKey("sebserver.examconfig.action.state-change.confirm");
|
new LocTextKey("sebserver.examconfig.action.state-change.confirm");
|
||||||
|
@ -186,7 +191,8 @@ public class SebExamConfigPropForm implements TemplateComposer {
|
||||||
.addField(FormBuilder.text(
|
.addField(FormBuilder.text(
|
||||||
Domain.CONFIGURATION_NODE.ATTR_NAME,
|
Domain.CONFIGURATION_NODE.ATTR_NAME,
|
||||||
FORM_NAME_TEXT_KEY,
|
FORM_NAME_TEXT_KEY,
|
||||||
examConfig.name))
|
examConfig.name)
|
||||||
|
.mandatory(!isReadonly))
|
||||||
.addField(FormBuilder.text(
|
.addField(FormBuilder.text(
|
||||||
Domain.CONFIGURATION_NODE.ATTR_DESCRIPTION,
|
Domain.CONFIGURATION_NODE.ATTR_DESCRIPTION,
|
||||||
FORM_DESCRIPTION_TEXT_KEY,
|
FORM_DESCRIPTION_TEXT_KEY,
|
||||||
|
@ -198,7 +204,7 @@ public class SebExamConfigPropForm implements TemplateComposer {
|
||||||
FORM_STATUS_TEXT_KEY,
|
FORM_STATUS_TEXT_KEY,
|
||||||
examConfig.status.name(),
|
examConfig.status.name(),
|
||||||
() -> resourceService.examConfigStatusResources(isAttachedToExam))
|
() -> resourceService.examConfigStatusResources(isAttachedToExam))
|
||||||
.withEmptyCellSeparation((isReadonly) ? false : true))
|
.withEmptyCellSeparation(!isReadonly))
|
||||||
.buildFor((isNew)
|
.buildFor((isNew)
|
||||||
? this.restService.getRestCall(NewExamConfig.class)
|
? this.restService.getRestCall(NewExamConfig.class)
|
||||||
: this.restService.getRestCall(SaveExamConfig.class));
|
: this.restService.getRestCall(SaveExamConfig.class));
|
||||||
|
@ -214,15 +220,13 @@ public class SebExamConfigPropForm implements TemplateComposer {
|
||||||
|
|
||||||
.newAction(ActionDefinition.SEB_EXAM_CONFIG_PROP_MODIFY)
|
.newAction(ActionDefinition.SEB_EXAM_CONFIG_PROP_MODIFY)
|
||||||
.withEntityKey(entityKey)
|
.withEntityKey(entityKey)
|
||||||
.publishIf(() -> modifyGrant && isReadonly)
|
|
||||||
|
|
||||||
.newAction(ActionDefinition.SEB_EXAM_CONFIG_VIEW)
|
.publishIf(() -> modifyGrant && isReadonly)
|
||||||
.withEntityKey(entityKey)
|
|
||||||
.publishIf(() -> isReadonly)
|
|
||||||
|
|
||||||
.newAction(ActionDefinition.SEB_EXAM_CONFIG_MODIFY)
|
.newAction(ActionDefinition.SEB_EXAM_CONFIG_MODIFY)
|
||||||
.withEntityKey(entityKey)
|
.withEntityKey(entityKey)
|
||||||
.publishIf(() -> modifyGrant && isReadonly && !settingsReadonly)
|
.withAttribute(PageContext.AttributeKeys.READ_ONLY, String.valueOf(!modifyGrant))
|
||||||
|
.publishIf(() -> modifyGrant && isReadonly)
|
||||||
|
|
||||||
.newAction(ActionDefinition.SEB_EXAM_CONFIG_EXPORT_PLAIN_XML)
|
.newAction(ActionDefinition.SEB_EXAM_CONFIG_EXPORT_PLAIN_XML)
|
||||||
.withEntityKey(entityKey)
|
.withEntityKey(entityKey)
|
||||||
|
@ -288,11 +292,13 @@ public class SebExamConfigPropForm implements TemplateComposer {
|
||||||
|
|
||||||
if (isAttachedToExam && isReadonly) {
|
if (isAttachedToExam && isReadonly) {
|
||||||
|
|
||||||
widgetFactory.labelSeparator(content);
|
widgetFactory.label(content, StringUtils.EMPTY);
|
||||||
widgetFactory.labelLocalized(
|
widgetFactory.labelLocalized(
|
||||||
content,
|
content,
|
||||||
CustomVariant.TEXT_H3,
|
CustomVariant.TEXT_H3,
|
||||||
FORM_ATTACHED_EXAMS_TITLE_TEXT_KEY);
|
FORM_ATTACHED_EXAMS_TITLE_TEXT_KEY,
|
||||||
|
FORM_ATTACHED_EXAMS_TITLE_TOOLTIP_TEXT_KEY);
|
||||||
|
widgetFactory.labelSeparator(content);
|
||||||
|
|
||||||
final EntityTable<ExamConfigurationMap> table =
|
final EntityTable<ExamConfigurationMap> table =
|
||||||
this.pageService.entityTableBuilder(this.restService.getRestCall(GetExamConfigMappingsPage.class))
|
this.pageService.entityTableBuilder(this.restService.getRestCall(GetExamConfigMappingsPage.class))
|
||||||
|
@ -314,13 +320,17 @@ public class SebExamConfigPropForm implements TemplateComposer {
|
||||||
this.pageService.getI18nSupport().getUsersTimeZoneTitleSuffix()),
|
this.pageService.getI18nSupport().getUsersTimeZoneTitleSuffix()),
|
||||||
ExamConfigurationMap::getExamStartTime))
|
ExamConfigurationMap::getExamStartTime))
|
||||||
|
|
||||||
.withColumn(new ColumnDefinition<ExamConfigurationMap>(
|
.withColumn(new ColumnDefinition<>(
|
||||||
Domain.EXAM.ATTR_TYPE,
|
Domain.EXAM.ATTR_TYPE,
|
||||||
ExamList.COLUMN_TITLE_TYPE_KEY,
|
ExamList.COLUMN_TITLE_TYPE_KEY,
|
||||||
resourceService::localizedExamTypeName))
|
resourceService::localizedExamTypeName))
|
||||||
|
|
||||||
.withDefaultAction(this::showExamAction)
|
.withDefaultAction(this::showExamAction)
|
||||||
|
|
||||||
|
.withSelectionListener(this.pageService.getSelectionPublisher(
|
||||||
|
pageContext,
|
||||||
|
ActionDefinition.EXAM_VIEW_FROM_LIST))
|
||||||
|
|
||||||
.compose(pageContext.copyOf(content));
|
.compose(pageContext.copyOf(content));
|
||||||
|
|
||||||
actionBuilder
|
actionBuilder
|
||||||
|
@ -331,7 +341,7 @@ public class SebExamConfigPropForm implements TemplateComposer {
|
||||||
return pageAction.withEntityKey(
|
return pageAction.withEntityKey(
|
||||||
new EntityKey(selectedExamMapping.examId, EntityType.EXAM));
|
new EntityKey(selectedExamMapping.examId, EntityType.EXAM));
|
||||||
})
|
})
|
||||||
.publishIf(table::hasAnyContent);
|
.publishIf(table::hasAnyContent, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -340,7 +350,7 @@ public class SebExamConfigPropForm implements TemplateComposer {
|
||||||
.newAction(ActionDefinition.EXAM_VIEW_FROM_LIST)
|
.newAction(ActionDefinition.EXAM_VIEW_FROM_LIST)
|
||||||
.withSelectionSupplier(() -> {
|
.withSelectionSupplier(() -> {
|
||||||
final ExamConfigurationMap selectedROWData = getSelectedExamMapping(table);
|
final ExamConfigurationMap selectedROWData = getSelectedExamMapping(table);
|
||||||
return new HashSet<>(Arrays.asList(new EntityKey(selectedROWData.examId, EntityType.EXAM)));
|
return new HashSet<>(Collections.singletonList(new EntityKey(selectedROWData.examId, EntityType.EXAM)));
|
||||||
})
|
})
|
||||||
.withExec(PageAction::applySingleSelectionAsEntityKey)
|
.withExec(PageAction::applySingleSelectionAsEntityKey)
|
||||||
.create();
|
.create();
|
||||||
|
|
|
@ -202,7 +202,7 @@ public class SebExamConfigSettingsForm implements TemplateComposer {
|
||||||
PageContext.AttributeKeys.CREATE_FROM_TEMPLATE,
|
PageContext.AttributeKeys.CREATE_FROM_TEMPLATE,
|
||||||
Constants.FALSE_STRING)))
|
Constants.FALSE_STRING)))
|
||||||
.noEventPropagation()
|
.noEventPropagation()
|
||||||
.publishIf(() -> examConfigGrant.iw())
|
.publishIf(examConfigGrant::iw)
|
||||||
|
|
||||||
.newAction(ActionDefinition.SEB_EXAM_CONFIG_VIEW_PROP)
|
.newAction(ActionDefinition.SEB_EXAM_CONFIG_VIEW_PROP)
|
||||||
.withEntityKey(entityKey)
|
.withEntityKey(entityKey)
|
||||||
|
@ -235,5 +235,4 @@ public class SebExamConfigSettingsForm implements TemplateComposer {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -44,7 +44,8 @@ import ch.ethz.seb.sebserver.gui.widget.WidgetFactory;
|
||||||
* If the current user is the owner of the User-Account the password is required and must
|
* If the current user is the owner of the User-Account the password is required and must
|
||||||
* match the users current password.
|
* match the users current password.
|
||||||
* If the current user is an administrator that has to reset another users password the
|
* If the current user is an administrator that has to reset another users password the
|
||||||
* password that is also required must match the administrators current password. */
|
* password that is also required must match the administrators current password.
|
||||||
|
**/
|
||||||
public class UserAccountChangePasswordForm implements TemplateComposer {
|
public class UserAccountChangePasswordForm implements TemplateComposer {
|
||||||
|
|
||||||
private static final String FORM_TITLE_KEY = "sebserver.useraccount.form.pwchange.title";
|
private static final String FORM_TITLE_KEY = "sebserver.useraccount.form.pwchange.title";
|
||||||
|
@ -99,22 +100,25 @@ public class UserAccountChangePasswordForm implements TemplateComposer {
|
||||||
.addField(FormBuilder.text(
|
.addField(FormBuilder.text(
|
||||||
PasswordChange.ATTR_NAME_PASSWORD,
|
PasswordChange.ATTR_NAME_PASSWORD,
|
||||||
FORM_PASSWORD_TEXT_KEY)
|
FORM_PASSWORD_TEXT_KEY)
|
||||||
.asPasswordField())
|
.asPasswordField()
|
||||||
|
.mandatory())
|
||||||
.addField(FormBuilder.text(
|
.addField(FormBuilder.text(
|
||||||
PasswordChange.ATTR_NAME_NEW_PASSWORD,
|
PasswordChange.ATTR_NAME_NEW_PASSWORD,
|
||||||
FORM_PASSWORD_NEW_TEXT_KEY)
|
FORM_PASSWORD_NEW_TEXT_KEY)
|
||||||
.asPasswordField())
|
.asPasswordField()
|
||||||
|
.mandatory())
|
||||||
.addFieldIf(
|
.addFieldIf(
|
||||||
() -> entityKey != null,
|
() -> entityKey != null,
|
||||||
() -> FormBuilder.text(
|
() -> FormBuilder.text(
|
||||||
PasswordChange.ATTR_NAME_CONFIRM_NEW_PASSWORD,
|
PasswordChange.ATTR_NAME_CONFIRM_NEW_PASSWORD,
|
||||||
FORM_PASSWORD_NEW_CONFIRM_TEXT_KEY)
|
FORM_PASSWORD_NEW_CONFIRM_TEXT_KEY)
|
||||||
.asPasswordField())
|
.asPasswordField()
|
||||||
|
.mandatory())
|
||||||
.buildFor(this.restService.getRestCall(ChangePassword.class));
|
.buildFor(this.restService.getRestCall(ChangePassword.class));
|
||||||
|
|
||||||
this.pageService.pageActionBuilder(pageContext)
|
this.pageService.pageActionBuilder(pageContext)
|
||||||
|
|
||||||
.newAction(ActionDefinition.USER_ACCOUNT_CHANGE_PASSOWRD_SAVE)
|
.newAction(ActionDefinition.USER_ACCOUNT_CHANGE_PASSWORD_SAVE)
|
||||||
.withExec(action -> {
|
.withExec(action -> {
|
||||||
final PageAction saveAction = formHandle.processFormSave(action);
|
final PageAction saveAction = formHandle.processFormSave(action);
|
||||||
if (ownAccount) {
|
if (ownAccount) {
|
||||||
|
|
|
@ -116,7 +116,7 @@ public class UserAccountForm implements TemplateComposer {
|
||||||
final UserAccount userAccount = isNew.getAsBoolean()
|
final UserAccount userAccount = isNew.getAsBoolean()
|
||||||
? UserMod.createNew((parentEntityKey != null)
|
? UserMod.createNew((parentEntityKey != null)
|
||||||
? Long.valueOf(parentEntityKey.modelId)
|
? Long.valueOf(parentEntityKey.modelId)
|
||||||
: user.institutionId)
|
: currentUser.get().institutionId)
|
||||||
: restService
|
: restService
|
||||||
.getBuilder(GetUserAccount.class)
|
.getBuilder(GetUserAccount.class)
|
||||||
.withURIVariable(API.PARAM_MODEL_ID, entityKey.modelId)
|
.withURIVariable(API.PARAM_MODEL_ID, entityKey.modelId)
|
||||||
|
@ -136,7 +136,8 @@ public class UserAccountForm implements TemplateComposer {
|
||||||
PrivilegeType.WRITE,
|
PrivilegeType.WRITE,
|
||||||
EntityType.USER);
|
EntityType.USER);
|
||||||
|
|
||||||
final boolean institutionActive = restService.getBuilder(GetInstitution.class)
|
final boolean institutionActive = userAccount.getInstitutionId() != null &&
|
||||||
|
restService.getBuilder(GetInstitution.class)
|
||||||
.withURIVariable(API.PARAM_MODEL_ID, String.valueOf(userAccount.getInstitutionId()))
|
.withURIVariable(API.PARAM_MODEL_ID, String.valueOf(userAccount.getInstitutionId()))
|
||||||
.call()
|
.call()
|
||||||
.map(inst -> inst.active)
|
.map(inst -> inst.active)
|
||||||
|
@ -170,8 +171,9 @@ public class UserAccountForm implements TemplateComposer {
|
||||||
Domain.USER.ATTR_INSTITUTION_ID,
|
Domain.USER.ATTR_INSTITUTION_ID,
|
||||||
FORM_INSTITUTION_TEXT_KEY,
|
FORM_INSTITUTION_TEXT_KEY,
|
||||||
String.valueOf(userAccount.getInstitutionId()),
|
String.valueOf(userAccount.getInstitutionId()),
|
||||||
() -> this.resourceService.institutionResource())
|
this.resourceService::institutionResource)
|
||||||
.readonlyIf(isNotNew))
|
.readonlyIf(isNotNew)
|
||||||
|
.mandatory(!readonly))
|
||||||
.addFieldIf(
|
.addFieldIf(
|
||||||
() -> readonly,
|
() -> readonly,
|
||||||
() -> FormBuilder.text(
|
() -> FormBuilder.text(
|
||||||
|
@ -182,15 +184,18 @@ public class UserAccountForm implements TemplateComposer {
|
||||||
.addField(FormBuilder.text(
|
.addField(FormBuilder.text(
|
||||||
Domain.USER.ATTR_NAME,
|
Domain.USER.ATTR_NAME,
|
||||||
FORM_NAME_TEXT_KEY,
|
FORM_NAME_TEXT_KEY,
|
||||||
userAccount.getName()))
|
userAccount.getName())
|
||||||
|
.mandatory(!readonly))
|
||||||
.addField(FormBuilder.text(
|
.addField(FormBuilder.text(
|
||||||
Domain.USER.ATTR_SURNAME,
|
Domain.USER.ATTR_SURNAME,
|
||||||
FORM_SURNAME_TEXT_KEY,
|
FORM_SURNAME_TEXT_KEY,
|
||||||
userAccount.getSurname()))
|
userAccount.getSurname())
|
||||||
|
.mandatory(!readonly))
|
||||||
.addField(FormBuilder.text(
|
.addField(FormBuilder.text(
|
||||||
Domain.USER.ATTR_USERNAME,
|
Domain.USER.ATTR_USERNAME,
|
||||||
FORM_USERNAME_TEXT_KEY,
|
FORM_USERNAME_TEXT_KEY,
|
||||||
userAccount.getUsername()))
|
userAccount.getUsername())
|
||||||
|
.mandatory(!readonly))
|
||||||
.addField(FormBuilder.text(
|
.addField(FormBuilder.text(
|
||||||
Domain.USER.ATTR_EMAIL,
|
Domain.USER.ATTR_EMAIL,
|
||||||
FORM_MAIL_TEXT_KEY,
|
FORM_MAIL_TEXT_KEY,
|
||||||
|
@ -206,7 +211,8 @@ public class UserAccountForm implements TemplateComposer {
|
||||||
Domain.USER.ATTR_TIMEZONE,
|
Domain.USER.ATTR_TIMEZONE,
|
||||||
FORM_TIMEZONE_TEXT_KEY,
|
FORM_TIMEZONE_TEXT_KEY,
|
||||||
userAccount.getTimeZone().getID(),
|
userAccount.getTimeZone().getID(),
|
||||||
this.resourceService::timeZoneResources))
|
this.resourceService::timeZoneResources)
|
||||||
|
.mandatory(!readonly))
|
||||||
.addFieldIf(
|
.addFieldIf(
|
||||||
() -> modifyGrant,
|
() -> modifyGrant,
|
||||||
() -> FormBuilder.multiCheckboxSelection(
|
() -> FormBuilder.multiCheckboxSelection(
|
||||||
|
@ -214,19 +220,22 @@ public class UserAccountForm implements TemplateComposer {
|
||||||
FORM_ROLES_TEXT_KEY,
|
FORM_ROLES_TEXT_KEY,
|
||||||
StringUtils.join(userAccount.getRoles(), Constants.LIST_SEPARATOR_CHAR),
|
StringUtils.join(userAccount.getRoles(), Constants.LIST_SEPARATOR_CHAR),
|
||||||
this.resourceService::userRoleResources)
|
this.resourceService::userRoleResources)
|
||||||
.visibleIf(writeGrant))
|
.visibleIf(writeGrant)
|
||||||
|
.mandatory(!readonly))
|
||||||
.addFieldIf(
|
.addFieldIf(
|
||||||
isNew,
|
isNew,
|
||||||
() -> FormBuilder.text(
|
() -> FormBuilder.text(
|
||||||
PasswordChange.ATTR_NAME_NEW_PASSWORD,
|
PasswordChange.ATTR_NAME_NEW_PASSWORD,
|
||||||
FORM_PASSWORD_TEXT_KEY)
|
FORM_PASSWORD_TEXT_KEY)
|
||||||
.asPasswordField())
|
.asPasswordField()
|
||||||
|
.mandatory(!readonly))
|
||||||
.addFieldIf(
|
.addFieldIf(
|
||||||
isNew,
|
isNew,
|
||||||
() -> FormBuilder.text(
|
() -> FormBuilder.text(
|
||||||
PasswordChange.ATTR_NAME_CONFIRM_NEW_PASSWORD,
|
PasswordChange.ATTR_NAME_CONFIRM_NEW_PASSWORD,
|
||||||
FORM_PASSWORD_CONFIRM_TEXT_KEY)
|
FORM_PASSWORD_CONFIRM_TEXT_KEY)
|
||||||
.asPasswordField())
|
.asPasswordField()
|
||||||
|
.mandatory(!readonly))
|
||||||
.buildFor((entityKey == null)
|
.buildFor((entityKey == null)
|
||||||
? restService.getRestCall(NewUserAccount.class)
|
? restService.getRestCall(NewUserAccount.class)
|
||||||
: restService.getRestCall(SaveUserAccount.class));
|
: restService.getRestCall(SaveUserAccount.class));
|
||||||
|
@ -241,7 +250,7 @@ public class UserAccountForm implements TemplateComposer {
|
||||||
.withEntityKey(entityKey)
|
.withEntityKey(entityKey)
|
||||||
.publishIf(() -> modifyGrant && readonly && institutionActive)
|
.publishIf(() -> modifyGrant && readonly && institutionActive)
|
||||||
|
|
||||||
.newAction(ActionDefinition.USER_ACCOUNT_CHANGE_PASSOWRD)
|
.newAction(ActionDefinition.USER_ACCOUNT_CHANGE_PASSWORD)
|
||||||
.withEntityKey(entityKey)
|
.withEntityKey(entityKey)
|
||||||
.publishIf(() -> modifyGrant && readonly && institutionActive && userAccount.isActive())
|
.publishIf(() -> modifyGrant && readonly && institutionActive && userAccount.isActive())
|
||||||
|
|
||||||
|
@ -258,22 +267,25 @@ public class UserAccountForm implements TemplateComposer {
|
||||||
|
|
||||||
.newAction(ActionDefinition.USER_ACCOUNT_SAVE)
|
.newAction(ActionDefinition.USER_ACCOUNT_SAVE)
|
||||||
.withEntityKey(entityKey)
|
.withEntityKey(entityKey)
|
||||||
.withExec(action -> {
|
.withExec(action -> formHandle.handleFormPost(formHandle.doAPIPost()
|
||||||
return formHandle.handleFormPost(formHandle.doAPIPost()
|
|
||||||
.map(userInfo -> {
|
.map(userInfo -> {
|
||||||
if (ownAccount) {
|
if (ownAccount) {
|
||||||
currentUser.refresh(userInfo);
|
currentUser.refresh(userInfo);
|
||||||
}
|
}
|
||||||
return userInfo;
|
return userInfo;
|
||||||
}),
|
}),
|
||||||
action);
|
action))
|
||||||
})
|
|
||||||
.ignoreMoveAwayFromEdit()
|
.ignoreMoveAwayFromEdit()
|
||||||
.publishIf(() -> !readonly)
|
.publishIf(() -> !readonly)
|
||||||
|
|
||||||
|
.newAction(ActionDefinition.USER_ACCOUNT_SAVE_AND_ACTIVATE)
|
||||||
|
.withEntityKey(entityKey)
|
||||||
|
.withExec(formHandle::saveAndActivate)
|
||||||
|
.ignoreMoveAwayFromEdit()
|
||||||
|
.publishIf(() -> !readonly && !ownAccount && !userAccount.isActive())
|
||||||
|
|
||||||
.newAction(ActionDefinition.USER_ACCOUNT_CANCEL_MODIFY)
|
.newAction(ActionDefinition.USER_ACCOUNT_CANCEL_MODIFY)
|
||||||
.withExec(this.pageService.backToCurrentFunction())
|
.withExec(this.pageService.backToCurrentFunction())
|
||||||
.publishIf(() -> !readonly);
|
.publishIf(() -> !readonly);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,15 +8,6 @@
|
||||||
|
|
||||||
package ch.ethz.seb.sebserver.gui.content;
|
package ch.ethz.seb.sebserver.gui.content;
|
||||||
|
|
||||||
import java.util.function.BooleanSupplier;
|
|
||||||
import java.util.function.Function;
|
|
||||||
|
|
||||||
import org.apache.commons.lang3.BooleanUtils;
|
|
||||||
import org.eclipse.swt.widgets.Composite;
|
|
||||||
import org.springframework.beans.factory.annotation.Value;
|
|
||||||
import org.springframework.context.annotation.Lazy;
|
|
||||||
import org.springframework.stereotype.Component;
|
|
||||||
|
|
||||||
import ch.ethz.seb.sebserver.gbl.Constants;
|
import ch.ethz.seb.sebserver.gbl.Constants;
|
||||||
import ch.ethz.seb.sebserver.gbl.api.API;
|
import ch.ethz.seb.sebserver.gbl.api.API;
|
||||||
import ch.ethz.seb.sebserver.gbl.api.EntityType;
|
import ch.ethz.seb.sebserver.gbl.api.EntityType;
|
||||||
|
@ -45,6 +36,14 @@ import ch.ethz.seb.sebserver.gui.table.ColumnDefinition.TableFilterAttribute;
|
||||||
import ch.ethz.seb.sebserver.gui.table.EntityTable;
|
import ch.ethz.seb.sebserver.gui.table.EntityTable;
|
||||||
import ch.ethz.seb.sebserver.gui.table.TableFilter.CriteriaType;
|
import ch.ethz.seb.sebserver.gui.table.TableFilter.CriteriaType;
|
||||||
import ch.ethz.seb.sebserver.gui.widget.WidgetFactory;
|
import ch.ethz.seb.sebserver.gui.widget.WidgetFactory;
|
||||||
|
import org.apache.commons.lang3.BooleanUtils;
|
||||||
|
import org.eclipse.swt.widgets.Composite;
|
||||||
|
import org.springframework.beans.factory.annotation.Value;
|
||||||
|
import org.springframework.context.annotation.Lazy;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import java.util.function.BooleanSupplier;
|
||||||
|
import java.util.function.Function;
|
||||||
|
|
||||||
@Lazy
|
@Lazy
|
||||||
@Component
|
@Component
|
||||||
|
@ -190,6 +189,16 @@ public class UserAccountList implements TemplateComposer {
|
||||||
.withDefaultAction(actionBuilder
|
.withDefaultAction(actionBuilder
|
||||||
.newAction(ActionDefinition.USER_ACCOUNT_VIEW_FROM_LIST)
|
.newAction(ActionDefinition.USER_ACCOUNT_VIEW_FROM_LIST)
|
||||||
.create())
|
.create())
|
||||||
|
|
||||||
|
.withSelectionListener(this.pageService.getSelectionPublisher(
|
||||||
|
ActionDefinition.USER_ACCOUNT_TOGGLE_ACTIVITY,
|
||||||
|
ActionDefinition.USER_ACCOUNT_ACTIVATE,
|
||||||
|
ActionDefinition.USER_ACCOUNT_DEACTIVATE,
|
||||||
|
pageContext,
|
||||||
|
ActionDefinition.USER_ACCOUNT_VIEW_FROM_LIST,
|
||||||
|
ActionDefinition.USER_ACCOUNT_MODIFY_FROM_LIST,
|
||||||
|
ActionDefinition.USER_ACCOUNT_TOGGLE_ACTIVITY))
|
||||||
|
|
||||||
.compose(pageContext.copyOf(content));
|
.compose(pageContext.copyOf(content));
|
||||||
|
|
||||||
// propagate content actions to action-pane
|
// propagate content actions to action-pane
|
||||||
|
@ -201,11 +210,16 @@ public class UserAccountList implements TemplateComposer {
|
||||||
|
|
||||||
.newAction(ActionDefinition.USER_ACCOUNT_VIEW_FROM_LIST)
|
.newAction(ActionDefinition.USER_ACCOUNT_VIEW_FROM_LIST)
|
||||||
.withSelect(table::getSelection, PageAction::applySingleSelectionAsEntityKey, EMPTY_SELECTION_TEXT_KEY)
|
.withSelect(table::getSelection, PageAction::applySingleSelectionAsEntityKey, EMPTY_SELECTION_TEXT_KEY)
|
||||||
.publishIf(() -> table.hasAnyContent())
|
.publishIf(table::hasAnyContent, false)
|
||||||
|
|
||||||
.newAction(ActionDefinition.USER_ACCOUNT_MODIFY_FROM_LIST)
|
.newAction(ActionDefinition.USER_ACCOUNT_MODIFY_FROM_LIST)
|
||||||
.withSelect(table::getSelection, this::editAction, EMPTY_SELECTION_TEXT_KEY)
|
.withSelect(table::getSelection, this::editAction, EMPTY_SELECTION_TEXT_KEY)
|
||||||
.publishIf(() -> userGrant.im() && table.hasAnyContent());
|
.publishIf(() -> userGrant.im() && table.hasAnyContent(), false)
|
||||||
|
|
||||||
|
.newAction(ActionDefinition.USER_ACCOUNT_TOGGLE_ACTIVITY)
|
||||||
|
.withExec(this.pageService.activationToggleActionFunction(table, EMPTY_SELECTION_TEXT_KEY))
|
||||||
|
.withConfirm(this.pageService.confirmDeactivation(table))
|
||||||
|
.publishIf(() -> userGrant.m() && table.hasAnyContent(), false);
|
||||||
}
|
}
|
||||||
|
|
||||||
private PageAction editAction(final PageAction pageAction) {
|
private PageAction editAction(final PageAction pageAction) {
|
||||||
|
|
|
@ -197,6 +197,9 @@ public class UserActivityLogs implements TemplateComposer {
|
||||||
.noEventPropagation()
|
.noEventPropagation()
|
||||||
.create())
|
.create())
|
||||||
|
|
||||||
|
.withSelectionListener(this.pageService.getSelectionPublisher(
|
||||||
|
pageContext,
|
||||||
|
ActionDefinition.LOGS_USER_ACTIVITY_SHOW_DETAILS))
|
||||||
.compose(pageContext.copyOf(content));
|
.compose(pageContext.copyOf(content));
|
||||||
|
|
||||||
actionBuilder
|
actionBuilder
|
||||||
|
@ -206,11 +209,11 @@ public class UserActivityLogs implements TemplateComposer {
|
||||||
action -> this.showDetails(action, table.getSingleSelectedROWData()),
|
action -> this.showDetails(action, table.getSingleSelectedROWData()),
|
||||||
EMPTY_SELECTION_TEXT)
|
EMPTY_SELECTION_TEXT)
|
||||||
.noEventPropagation()
|
.noEventPropagation()
|
||||||
.publishIf(table::hasAnyContent);
|
.publishIf(table::hasAnyContent, false);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private final String getLogTime(final UserActivityLog log) {
|
private String getLogTime(final UserActivityLog log) {
|
||||||
if (log == null || log.timestamp == null) {
|
if (log == null || log.timestamp == null) {
|
||||||
return Constants.EMPTY_NOTE;
|
return Constants.EMPTY_NOTE;
|
||||||
}
|
}
|
||||||
|
|
|
@ -109,6 +109,11 @@ public enum ActionDefinition {
|
||||||
ImageIcon.SAVE,
|
ImageIcon.SAVE,
|
||||||
PageStateDefinitionImpl.USER_ACCOUNT_VIEW,
|
PageStateDefinitionImpl.USER_ACCOUNT_VIEW,
|
||||||
ActionCategory.FORM),
|
ActionCategory.FORM),
|
||||||
|
USER_ACCOUNT_SAVE_AND_ACTIVATE(
|
||||||
|
new LocTextKey("sebserver.form.action.save.activate"),
|
||||||
|
ImageIcon.ACTIVE,
|
||||||
|
PageStateDefinitionImpl.USER_ACCOUNT_VIEW,
|
||||||
|
ActionCategory.FORM),
|
||||||
USER_ACCOUNT_ACTIVATE(
|
USER_ACCOUNT_ACTIVATE(
|
||||||
new LocTextKey("sebserver.useraccount.action.activate"),
|
new LocTextKey("sebserver.useraccount.action.activate"),
|
||||||
ImageIcon.TOGGLE_OFF,
|
ImageIcon.TOGGLE_OFF,
|
||||||
|
@ -119,12 +124,18 @@ public enum ActionDefinition {
|
||||||
ImageIcon.TOGGLE_ON,
|
ImageIcon.TOGGLE_ON,
|
||||||
PageStateDefinitionImpl.USER_ACCOUNT_VIEW,
|
PageStateDefinitionImpl.USER_ACCOUNT_VIEW,
|
||||||
ActionCategory.FORM),
|
ActionCategory.FORM),
|
||||||
USER_ACCOUNT_CHANGE_PASSOWRD(
|
USER_ACCOUNT_TOGGLE_ACTIVITY(
|
||||||
|
new LocTextKey("sebserver.overall.action.toggle-activity"),
|
||||||
|
ImageIcon.SWITCH,
|
||||||
|
PageStateDefinitionImpl.USER_ACCOUNT_LIST,
|
||||||
|
ActionCategory.USER_ACCOUNT_LIST),
|
||||||
|
|
||||||
|
USER_ACCOUNT_CHANGE_PASSWORD(
|
||||||
new LocTextKey("sebserver.useraccount.action.change.password"),
|
new LocTextKey("sebserver.useraccount.action.change.password"),
|
||||||
ImageIcon.SECURE,
|
ImageIcon.SECURE,
|
||||||
PageStateDefinitionImpl.USER_ACCOUNT_PASSWORD_CHANGE,
|
PageStateDefinitionImpl.USER_ACCOUNT_PASSWORD_CHANGE,
|
||||||
ActionCategory.FORM),
|
ActionCategory.FORM),
|
||||||
USER_ACCOUNT_CHANGE_PASSOWRD_SAVE(
|
USER_ACCOUNT_CHANGE_PASSWORD_SAVE(
|
||||||
new LocTextKey("sebserver.useraccount.action.change.password.save"),
|
new LocTextKey("sebserver.useraccount.action.change.password.save"),
|
||||||
ImageIcon.SAVE,
|
ImageIcon.SAVE,
|
||||||
PageStateDefinitionImpl.USER_ACCOUNT_VIEW,
|
PageStateDefinitionImpl.USER_ACCOUNT_VIEW,
|
||||||
|
@ -353,6 +364,11 @@ public enum ActionDefinition {
|
||||||
ImageIcon.SAVE,
|
ImageIcon.SAVE,
|
||||||
PageStateDefinitionImpl.SEB_CLIENT_CONFIG_VIEW,
|
PageStateDefinitionImpl.SEB_CLIENT_CONFIG_VIEW,
|
||||||
ActionCategory.FORM),
|
ActionCategory.FORM),
|
||||||
|
SEB_CLIENT_CONFIG_SAVE_AND_ACTIVATE(
|
||||||
|
new LocTextKey("sebserver.form.action.save.activate"),
|
||||||
|
ImageIcon.ACTIVE,
|
||||||
|
PageStateDefinitionImpl.SEB_CLIENT_CONFIG_VIEW,
|
||||||
|
ActionCategory.FORM),
|
||||||
SEB_CLIENT_CONFIG_ACTIVATE(
|
SEB_CLIENT_CONFIG_ACTIVATE(
|
||||||
new LocTextKey("sebserver.clientconfig.action.activate"),
|
new LocTextKey("sebserver.clientconfig.action.activate"),
|
||||||
ImageIcon.TOGGLE_OFF,
|
ImageIcon.TOGGLE_OFF,
|
||||||
|
@ -363,6 +379,11 @@ public enum ActionDefinition {
|
||||||
ImageIcon.TOGGLE_ON,
|
ImageIcon.TOGGLE_ON,
|
||||||
PageStateDefinitionImpl.SEB_CLIENT_CONFIG_VIEW,
|
PageStateDefinitionImpl.SEB_CLIENT_CONFIG_VIEW,
|
||||||
ActionCategory.FORM),
|
ActionCategory.FORM),
|
||||||
|
SEB_CLIENT_CONFIG_TOGGLE_ACTIVITY(
|
||||||
|
new LocTextKey("sebserver.overall.action.toggle-activity"),
|
||||||
|
ImageIcon.SWITCH,
|
||||||
|
PageStateDefinitionImpl.SEB_CLIENT_CONFIG_LIST,
|
||||||
|
ActionCategory.SEB_CLIENT_CONFIG_LIST),
|
||||||
SEB_CLIENT_CONFIG_EXPORT(
|
SEB_CLIENT_CONFIG_EXPORT(
|
||||||
new LocTextKey("sebserver.clientconfig.action.export"),
|
new LocTextKey("sebserver.clientconfig.action.export"),
|
||||||
ImageIcon.EXPORT,
|
ImageIcon.EXPORT,
|
||||||
|
@ -407,11 +428,7 @@ public enum ActionDefinition {
|
||||||
ImageIcon.EDIT_SETTINGS,
|
ImageIcon.EDIT_SETTINGS,
|
||||||
PageStateDefinitionImpl.SEB_EXAM_CONFIG_EDIT,
|
PageStateDefinitionImpl.SEB_EXAM_CONFIG_EDIT,
|
||||||
ActionCategory.FORM),
|
ActionCategory.FORM),
|
||||||
SEB_EXAM_CONFIG_VIEW(
|
|
||||||
new LocTextKey("sebserver.examconfig.action.view"),
|
|
||||||
ImageIcon.EDIT_SETTINGS,
|
|
||||||
PageStateDefinitionImpl.SEB_EXAM_CONFIG_VIEW,
|
|
||||||
ActionCategory.FORM),
|
|
||||||
SEB_EXAM_CONFIG_PROP_CANCEL_MODIFY(
|
SEB_EXAM_CONFIG_PROP_CANCEL_MODIFY(
|
||||||
new LocTextKey("sebserver.overall.action.modify.cancel"),
|
new LocTextKey("sebserver.overall.action.modify.cancel"),
|
||||||
ImageIcon.CANCEL,
|
ImageIcon.CANCEL,
|
||||||
|
@ -422,6 +439,7 @@ public enum ActionDefinition {
|
||||||
ImageIcon.SAVE,
|
ImageIcon.SAVE,
|
||||||
PageStateDefinitionImpl.SEB_EXAM_CONFIG_PROP_VIEW,
|
PageStateDefinitionImpl.SEB_EXAM_CONFIG_PROP_VIEW,
|
||||||
ActionCategory.FORM),
|
ActionCategory.FORM),
|
||||||
|
|
||||||
SEB_EXAM_CONFIG_EXPORT_PLAIN_XML(
|
SEB_EXAM_CONFIG_EXPORT_PLAIN_XML(
|
||||||
new LocTextKey("sebserver.examconfig.action.export.plainxml"),
|
new LocTextKey("sebserver.examconfig.action.export.plainxml"),
|
||||||
ImageIcon.EXPORT,
|
ImageIcon.EXPORT,
|
||||||
|
@ -641,15 +659,15 @@ public enum ActionDefinition {
|
||||||
public final PageStateDefinition targetState;
|
public final PageStateDefinition targetState;
|
||||||
public final ActionCategory category;
|
public final ActionCategory category;
|
||||||
|
|
||||||
private ActionDefinition(final LocTextKey title, final PageStateDefinition targetState) {
|
ActionDefinition(final LocTextKey title, final PageStateDefinition targetState) {
|
||||||
this(title, null, targetState, ActionCategory.VARIA);
|
this(title, null, targetState, ActionCategory.VARIA);
|
||||||
}
|
}
|
||||||
|
|
||||||
private ActionDefinition(final LocTextKey title, final ImageIcon icon, final PageStateDefinition targetState) {
|
ActionDefinition(final LocTextKey title, final ImageIcon icon, final PageStateDefinition targetState) {
|
||||||
this(title, icon, targetState, ActionCategory.VARIA);
|
this(title, icon, targetState, ActionCategory.VARIA);
|
||||||
}
|
}
|
||||||
|
|
||||||
private ActionDefinition(
|
ActionDefinition(
|
||||||
final LocTextKey title,
|
final LocTextKey title,
|
||||||
final ImageIcon icon,
|
final ImageIcon icon,
|
||||||
final ActionCategory category) {
|
final ActionCategory category) {
|
||||||
|
@ -657,7 +675,7 @@ public enum ActionDefinition {
|
||||||
this(title, icon, null, category);
|
this(title, icon, null, category);
|
||||||
}
|
}
|
||||||
|
|
||||||
private ActionDefinition(
|
ActionDefinition(
|
||||||
final LocTextKey title,
|
final LocTextKey title,
|
||||||
final ImageIcon icon,
|
final ImageIcon icon,
|
||||||
final PageStateDefinition targetState,
|
final PageStateDefinition targetState,
|
||||||
|
|
|
@ -75,11 +75,10 @@ public enum PageStateDefinitionImpl implements PageStateDefinition {
|
||||||
ActivityDefinition.SEB_EXAM_CONFIG_TEMPLATE),
|
ActivityDefinition.SEB_EXAM_CONFIG_TEMPLATE),
|
||||||
SEB_EXAM_CONFIG_TEMPLATE_EDIT(Type.FORM_EDIT, ConfigTemplateForm.class,
|
SEB_EXAM_CONFIG_TEMPLATE_EDIT(Type.FORM_EDIT, ConfigTemplateForm.class,
|
||||||
ActivityDefinition.SEB_EXAM_CONFIG_TEMPLATE),
|
ActivityDefinition.SEB_EXAM_CONFIG_TEMPLATE),
|
||||||
|
|
||||||
SEB_EXAM_CONFIG_TEMPLATE_ATTRIBUTE_EDIT(
|
SEB_EXAM_CONFIG_TEMPLATE_ATTRIBUTE_EDIT(
|
||||||
Type.FORM_EDIT,
|
Type.FORM_EDIT,
|
||||||
ConfigTemplateAttributeForm.class,
|
ConfigTemplateAttributeForm.class,
|
||||||
ActivityDefinition.SEB_EXAM_CONFIG),
|
ActivityDefinition.SEB_EXAM_CONFIG_TEMPLATE),
|
||||||
|
|
||||||
MONITORING_RUNNING_EXAM_LIST(Type.LIST_VIEW, MonitoringRunningExamList.class, ActivityDefinition.MONITORING_EXAMS),
|
MONITORING_RUNNING_EXAM_LIST(Type.LIST_VIEW, MonitoringRunningExamList.class, ActivityDefinition.MONITORING_EXAMS),
|
||||||
MONITORING_RUNNING_EXAM(Type.FORM_VIEW, MonitoringRunningExam.class, ActivityDefinition.MONITORING_EXAMS),
|
MONITORING_RUNNING_EXAM(Type.FORM_VIEW, MonitoringRunningExam.class, ActivityDefinition.MONITORING_EXAMS),
|
||||||
|
|
|
@ -20,6 +20,8 @@ import java.util.function.Function;
|
||||||
import java.util.function.Supplier;
|
import java.util.function.Supplier;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
import ch.ethz.seb.sebserver.gbl.util.Tuple3;
|
||||||
|
import ch.ethz.seb.sebserver.gbl.util.Utils;
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
import org.joda.time.DateTimeZone;
|
import org.joda.time.DateTimeZone;
|
||||||
import org.springframework.beans.factory.annotation.Value;
|
import org.springframework.beans.factory.annotation.Value;
|
||||||
|
@ -80,6 +82,7 @@ public class ResourceService {
|
||||||
private static final String MISSING_CLIENT_PING_NAME_KEY = "MISSING";
|
private static final String MISSING_CLIENT_PING_NAME_KEY = "MISSING";
|
||||||
|
|
||||||
public static final Comparator<Tuple<String>> RESOURCE_COMPARATOR = (t1, t2) -> t1._2.compareTo(t2._2);
|
public static final Comparator<Tuple<String>> RESOURCE_COMPARATOR = (t1, t2) -> t1._2.compareTo(t2._2);
|
||||||
|
public static final Comparator<Tuple3<String>> RESOURCE_COMPARATOR_TUPLE_3 = (t1, t2) -> t1._2.compareTo(t2._2);
|
||||||
|
|
||||||
public static final EnumSet<EntityType> ENTITY_TYPE_EXCLUDE_MAP = EnumSet.of(
|
public static final EnumSet<EntityType> ENTITY_TYPE_EXCLUDE_MAP = EnumSet.of(
|
||||||
EntityType.ADDITIONAL_ATTRIBUTES,
|
EntityType.ADDITIONAL_ATTRIBUTES,
|
||||||
|
@ -101,7 +104,6 @@ public class ResourceService {
|
||||||
public static final String USERACCOUNT_ROLE_PREFIX = "sebserver.useraccount.role.";
|
public static final String USERACCOUNT_ROLE_PREFIX = "sebserver.useraccount.role.";
|
||||||
public static final String EXAM_INDICATOR_TYPE_PREFIX = "sebserver.exam.indicator.type.";
|
public static final String EXAM_INDICATOR_TYPE_PREFIX = "sebserver.exam.indicator.type.";
|
||||||
public static final String LMSSETUP_TYPE_PREFIX = "sebserver.lmssetup.type.";
|
public static final String LMSSETUP_TYPE_PREFIX = "sebserver.lmssetup.type.";
|
||||||
public static final String LMSSETUP_PROXY_AUTH_TYPE_PREFIX = "sebserver.lmssetup.form.proxy.auth-type.";
|
|
||||||
public static final String CONFIG_ATTRIBUTE_TYPE_PREFIX = "sebserver.configtemplate.attr.type.";
|
public static final String CONFIG_ATTRIBUTE_TYPE_PREFIX = "sebserver.configtemplate.attr.type.";
|
||||||
public static final String SEB_RESTRICTION_WHITE_LIST_PREFIX = "sebserver.exam.form.sebrestriction.whiteListPaths.";
|
public static final String SEB_RESTRICTION_WHITE_LIST_PREFIX = "sebserver.exam.form.sebrestriction.whiteListPaths.";
|
||||||
public static final String SEB_RESTRICTION_PERMISSIONS_PREFIX = "sebserver.exam.form.sebrestriction.permissions.";
|
public static final String SEB_RESTRICTION_PERMISSIONS_PREFIX = "sebserver.exam.form.sebrestriction.permissions.";
|
||||||
|
@ -200,10 +202,13 @@ public class ResourceService {
|
||||||
public List<Tuple<String>> indicatorTypeResources() {
|
public List<Tuple<String>> indicatorTypeResources() {
|
||||||
return Arrays.asList(IndicatorType.values())
|
return Arrays.asList(IndicatorType.values())
|
||||||
.stream()
|
.stream()
|
||||||
.map(type -> new Tuple<>(
|
.map(type -> new Tuple3<>(
|
||||||
type.name(),
|
type.name(),
|
||||||
this.i18nSupport.getText(EXAM_INDICATOR_TYPE_PREFIX + type.name(), type.name())))
|
this.i18nSupport.getText(EXAM_INDICATOR_TYPE_PREFIX + type.name(), type.name()),
|
||||||
.sorted(RESOURCE_COMPARATOR)
|
Utils.formatLineBreaks(this.i18nSupport.getText(
|
||||||
|
EXAM_INDICATOR_TYPE_PREFIX + type.name() + Constants.TOOLTIP_TEXT_KEY_SUFFIX,
|
||||||
|
StringUtils.EMPTY))))
|
||||||
|
.sorted(RESOURCE_COMPARATOR_TUPLE_3)
|
||||||
.collect(Collectors.toList());
|
.collect(Collectors.toList());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -219,9 +224,12 @@ public class ResourceService {
|
||||||
public List<Tuple<String>> userRoleResources() {
|
public List<Tuple<String>> userRoleResources() {
|
||||||
return UserRole.publicRolesForUser(this.currentUser.get())
|
return UserRole.publicRolesForUser(this.currentUser.get())
|
||||||
.stream()
|
.stream()
|
||||||
.map(ur -> new Tuple<>(
|
.map(ur -> new Tuple3<>(
|
||||||
ur.name(),
|
ur.name(),
|
||||||
this.i18nSupport.getText(USERACCOUNT_ROLE_PREFIX + ur.name())))
|
this.i18nSupport.getText(USERACCOUNT_ROLE_PREFIX + ur.name()),
|
||||||
|
Utils.formatLineBreaks(this.i18nSupport.getText(
|
||||||
|
USERACCOUNT_ROLE_PREFIX + ur.name() + Constants.TOOLTIP_TEXT_KEY_SUFFIX,
|
||||||
|
StringUtils.EMPTY))))
|
||||||
.sorted(RESOURCE_COMPARATOR)
|
.sorted(RESOURCE_COMPARATOR)
|
||||||
.collect(Collectors.toList());
|
.collect(Collectors.toList());
|
||||||
}
|
}
|
||||||
|
@ -332,7 +340,6 @@ public class ResourceService {
|
||||||
/** Get a list of language key/name tuples for all supported languages in the
|
/** Get a list of language key/name tuples for all supported languages in the
|
||||||
* language of the current users locale.
|
* language of the current users locale.
|
||||||
*
|
*
|
||||||
* @param i18nSupport I18nSupport to get the actual current users locale
|
|
||||||
* @return list of language key/name tuples for all supported languages in the language of the current users
|
* @return list of language key/name tuples for all supported languages in the language of the current users
|
||||||
* locale */
|
* locale */
|
||||||
public List<Tuple<String>> languageResources() {
|
public List<Tuple<String>> languageResources() {
|
||||||
|
@ -359,9 +366,13 @@ public class ResourceService {
|
||||||
return Arrays.asList(ExamType.values())
|
return Arrays.asList(ExamType.values())
|
||||||
.stream()
|
.stream()
|
||||||
.filter(type -> type != ExamType.UNDEFINED)
|
.filter(type -> type != ExamType.UNDEFINED)
|
||||||
.map(type -> new Tuple<>(
|
.map(type -> new Tuple3<>(
|
||||||
type.name(),
|
type.name(),
|
||||||
this.i18nSupport.getText(EXAM_TYPE_PREFIX + type.name())))
|
this.i18nSupport.getText(EXAM_TYPE_PREFIX + type.name()),
|
||||||
|
Utils.formatLineBreaks(this.i18nSupport.getText(
|
||||||
|
this.i18nSupport.getText(EXAM_TYPE_PREFIX + type.name()) + Constants.TOOLTIP_TEXT_KEY_SUFFIX,
|
||||||
|
StringUtils.EMPTY))
|
||||||
|
))
|
||||||
.sorted(RESOURCE_COMPARATOR)
|
.sorted(RESOURCE_COMPARATOR)
|
||||||
.collect(Collectors.toList());
|
.collect(Collectors.toList());
|
||||||
}
|
}
|
||||||
|
@ -380,9 +391,13 @@ public class ResourceService {
|
||||||
return status != ConfigurationStatus.IN_USE;
|
return status != ConfigurationStatus.IN_USE;
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.map(type -> new Tuple<>(
|
.map(type -> new Tuple3<>(
|
||||||
type.name(),
|
type.name(),
|
||||||
this.i18nSupport.getText(EXAMCONFIG_STATUS_PREFIX + type.name())))
|
this.i18nSupport.getText(EXAMCONFIG_STATUS_PREFIX + type.name()),
|
||||||
|
Utils.formatLineBreaks(this.i18nSupport.getText(
|
||||||
|
this.i18nSupport.getText(EXAMCONFIG_STATUS_PREFIX + type.name()) + Constants.TOOLTIP_TEXT_KEY_SUFFIX,
|
||||||
|
StringUtils.EMPTY))
|
||||||
|
))
|
||||||
.sorted(RESOURCE_COMPARATOR)
|
.sorted(RESOURCE_COMPARATOR)
|
||||||
.collect(Collectors.toList());
|
.collect(Collectors.toList());
|
||||||
}
|
}
|
||||||
|
|
|
@ -176,6 +176,11 @@ public interface I18nSupport {
|
||||||
* @return the text in current language parsed from localized text */
|
* @return the text in current language parsed from localized text */
|
||||||
String getText(String key, Locale locale, String def, Object... args);
|
String getText(String key, Locale locale, String def, Object... args);
|
||||||
|
|
||||||
|
/** Indicates if there is a localized text defined for a specified LocTextKey
|
||||||
|
*
|
||||||
|
* @param locTextKey the LocTextKey instance
|
||||||
|
* @return true if there is a localized text defined for a specified LocTextKey, false otherwise
|
||||||
|
*/
|
||||||
boolean hasText(LocTextKey locTextKey);
|
boolean hasText(LocTextKey locTextKey);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -116,7 +116,7 @@ public final class PolyglotPageServiceImpl implements PolyglotPageService {
|
||||||
if (locTextKey != null) {
|
if (locTextKey != null) {
|
||||||
b.setText(this.i18nSupport.getText(locTextKey));
|
b.setText(this.i18nSupport.getText(locTextKey));
|
||||||
}
|
}
|
||||||
if (locToolTipKey != null) {
|
if (i18nSupport.hasText(locToolTipKey)) {
|
||||||
b.setToolTipText(Utils.formatLineBreaks(this.i18nSupport.getText(locToolTipKey)));
|
b.setToolTipText(Utils.formatLineBreaks(this.i18nSupport.getText(locToolTipKey)));
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -200,13 +200,11 @@ public final class PolyglotPageServiceImpl implements PolyglotPageService {
|
||||||
.equals(locale.getLanguage())));
|
.equals(locale.getLanguage())));
|
||||||
languageSelection.setData(RWT.CUSTOM_VARIANT, "header");
|
languageSelection.setData(RWT.CUSTOM_VARIANT, "header");
|
||||||
languageSelection.setText("| " + locale.getLanguage().toUpperCase(locale));
|
languageSelection.setText("| " + locale.getLanguage().toUpperCase(locale));
|
||||||
languageSelection.addListener(SWT.MouseDown, event -> {
|
languageSelection.addListener(SWT.MouseDown, event -> this.setPageLocale(composerCtx.getRoot(), locale));
|
||||||
this.setPageLocale(composerCtx.getRoot(), locale);
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static final Consumer<Label> labelFunction(
|
private static Consumer<Label> labelFunction(
|
||||||
final LocTextKey locTextKey,
|
final LocTextKey locTextKey,
|
||||||
final LocTextKey locToolTipKey,
|
final LocTextKey locToolTipKey,
|
||||||
final I18nSupport i18nSupport) {
|
final I18nSupport i18nSupport) {
|
||||||
|
@ -215,13 +213,13 @@ public final class PolyglotPageServiceImpl implements PolyglotPageService {
|
||||||
if (locTextKey != null) {
|
if (locTextKey != null) {
|
||||||
label.setText(i18nSupport.getText(locTextKey));
|
label.setText(i18nSupport.getText(locTextKey));
|
||||||
}
|
}
|
||||||
if (locToolTipKey != null) {
|
if (i18nSupport.hasText(locToolTipKey)) {
|
||||||
label.setToolTipText(Utils.formatLineBreaks(i18nSupport.getText(locToolTipKey)));
|
label.setToolTipText(Utils.formatLineBreaks(i18nSupport.getText(locToolTipKey)));
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
private static final Consumer<Group> groupFunction(
|
private static Consumer<Group> groupFunction(
|
||||||
final LocTextKey locTextKey,
|
final LocTextKey locTextKey,
|
||||||
final LocTextKey locToolTipKey,
|
final LocTextKey locToolTipKey,
|
||||||
final I18nSupport i18nSupport) {
|
final I18nSupport i18nSupport) {
|
||||||
|
@ -230,13 +228,13 @@ public final class PolyglotPageServiceImpl implements PolyglotPageService {
|
||||||
if (locTextKey != null) {
|
if (locTextKey != null) {
|
||||||
group.setText(i18nSupport.getText(locTextKey));
|
group.setText(i18nSupport.getText(locTextKey));
|
||||||
}
|
}
|
||||||
if (locToolTipKey != null) {
|
if (i18nSupport.hasText(locToolTipKey)) {
|
||||||
group.setToolTipText(Utils.formatLineBreaks(i18nSupport.getText(locToolTipKey, StringUtils.EMPTY)));
|
group.setToolTipText(Utils.formatLineBreaks(i18nSupport.getText(locToolTipKey, StringUtils.EMPTY)));
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
private static final void updateLocale(final TabItem[] items, final I18nSupport i18nSupport) {
|
private static void updateLocale(final TabItem[] items, final I18nSupport i18nSupport) {
|
||||||
if (items == null) {
|
if (items == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -249,7 +247,7 @@ public final class PolyglotPageServiceImpl implements PolyglotPageService {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static final void updateLocale(final TreeItem[] items, final I18nSupport i18nSupport) {
|
private static void updateLocale(final TreeItem[] items, final I18nSupport i18nSupport) {
|
||||||
if (items == null) {
|
if (items == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,6 +14,8 @@ import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
import ch.ethz.seb.sebserver.gbl.util.Tuple3;
|
||||||
|
import ch.ethz.seb.sebserver.gui.service.i18n.I18nSupport;
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
import org.eclipse.swt.SWT;
|
import org.eclipse.swt.SWT;
|
||||||
import org.eclipse.swt.layout.GridData;
|
import org.eclipse.swt.layout.GridData;
|
||||||
|
@ -69,6 +71,11 @@ public final class MultiSelectionCheckbox extends Composite implements Selection
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
this.checkboxes.put(tuple._1, button);
|
this.checkboxes.put(tuple._1, button);
|
||||||
|
|
||||||
|
Tuple3<String> tuple3 = tuple.adaptTo(Tuple3.class);
|
||||||
|
if (tuple3 != null && StringUtils.isNotBlank(tuple3._3)) {
|
||||||
|
button.setToolTipText(tuple3._3);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (StringUtils.isNotBlank(selectionValue)) {
|
if (StringUtils.isNotBlank(selectionValue)) {
|
||||||
|
|
|
@ -59,6 +59,8 @@ sebserver.overall.types.entityType.INSTITUTION=Institution
|
||||||
sebserver.overall.types.entityType.SEB_CLIENT_CONFIGURATION=Client Configuration
|
sebserver.overall.types.entityType.SEB_CLIENT_CONFIGURATION=Client Configuration
|
||||||
sebserver.overall.types.entityType.LMS_SETUP=LMS Setup
|
sebserver.overall.types.entityType.LMS_SETUP=LMS Setup
|
||||||
sebserver.overall.types.entityType.USER=User Account
|
sebserver.overall.types.entityType.USER=User Account
|
||||||
|
sebserver.overall.types.entityType.CLIENT_INSTRUCTION=SEB Client Instruction
|
||||||
|
sebserver.overall.types.entityType.EXAM_SEB_RESTRICTION=SEB Exam Restriction
|
||||||
|
|
||||||
sebserver.overall.activity.title.serveradmin=SEB Server Administration
|
sebserver.overall.activity.title.serveradmin=SEB Server Administration
|
||||||
sebserver.overall.activity.title.sebconfig=SEB Configuration
|
sebserver.overall.activity.title.sebconfig=SEB Configuration
|
||||||
|
@ -174,18 +176,27 @@ sebserver.institution.form.logoImage.unsupportedFileType=The selected file is no
|
||||||
|
|
||||||
sebserver.useraccount.list.actions=
|
sebserver.useraccount.list.actions=
|
||||||
sebserver.useraccount.role.SEB_SERVER_ADMIN=SEB Server Administrator
|
sebserver.useraccount.role.SEB_SERVER_ADMIN=SEB Server Administrator
|
||||||
|
sebserver.useraccount.role.SEB_SERVER_ADMIN.tooltip=A SEB server administrator has overall read privileges</br>and is able to create new institutions and user accounts
|
||||||
sebserver.useraccount.role.INSTITUTIONAL_ADMIN=Institutional Administrator
|
sebserver.useraccount.role.INSTITUTIONAL_ADMIN=Institutional Administrator
|
||||||
|
sebserver.useraccount.role.INSTITUTIONAL_ADMIN.tooltip=An institutional administrator has overall read privileges on the assigned institution</br>and is able to edit the institution and create new user accounts for the institution.</br>Furthermore an institutional administrator is able to create new LMS bindings and SEB client configurations for the institution.
|
||||||
sebserver.useraccount.role.EXAM_ADMIN=Exam Administrator
|
sebserver.useraccount.role.EXAM_ADMIN=Exam Administrator
|
||||||
|
sebserver.useraccount.role.EXAM_ADMIN.tooltip=An exam administrator has overall read privileges for the institution but cannot see or manage other user accounts.</br>An exam administrator is able to create new SEB configurations and import and setup exams.
|
||||||
sebserver.useraccount.role.EXAM_SUPPORTER=Exam Supporter
|
sebserver.useraccount.role.EXAM_SUPPORTER=Exam Supporter
|
||||||
|
sebserver.useraccount.role.EXAM_SUPPORTER.tooltip=An exam supporter can only see and edit the own user account</br> and monitor exams for that he/she was attached by an exam administrator.
|
||||||
|
|
||||||
sebserver.useraccount.list.empty=No user account has been found. Please adapt the filter or create a new user account
|
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=User Accounts
|
||||||
sebserver.useraccount.list.column.institution=Institution
|
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
|
sebserver.useraccount.list.column.name=First Name
|
||||||
|
sebserver.useraccount.list.column.name.tooltip=The first name of the user.</br></br>Use the filter above to narrow down a specific first name.</br>{0}
|
||||||
sebserver.useraccount.list.column.username=User Name
|
sebserver.useraccount.list.column.username=User Name
|
||||||
|
sebserver.useraccount.list.column.username.tooltip=The internal user name of the user.</br></br>Use the filter above to narrow down a specific user name.</br>{0}
|
||||||
sebserver.useraccount.list.column.email=Mail
|
sebserver.useraccount.list.column.email=Mail
|
||||||
|
sebserver.useraccount.list.column.email.tooltip=The e-mail address of the user.</br></br>Use the filter above to narrow down a specific e-mail address.</br>{0}
|
||||||
sebserver.useraccount.list.column.language=Language
|
sebserver.useraccount.list.column.language=Language
|
||||||
sebserver.useraccount.list.column.active=Active
|
sebserver.useraccount.list.column.active=Active
|
||||||
|
sebserver.useraccount.list.column.active.tooltip=The activity of the user.</br></br>Use the filter above to specify the activity.</br>{0}
|
||||||
|
|
||||||
sebserver.useraccount.action.list=User Account
|
sebserver.useraccount.action.list=User Account
|
||||||
sebserver.useraccount.action.form=User Account of {0}
|
sebserver.useraccount.action.form=User Account of {0}
|
||||||
|
@ -206,19 +217,32 @@ sebserver.useraccount.info.notEditable=You have no edit rights for this User Acc
|
||||||
sebserver.useraccount.form.title=User Account
|
sebserver.useraccount.form.title=User Account
|
||||||
sebserver.useraccount.form.title.new=Add User Account
|
sebserver.useraccount.form.title.new=Add User Account
|
||||||
sebserver.useraccount.form.institution=Institution
|
sebserver.useraccount.form.institution=Institution
|
||||||
|
sebserver.useraccount.form.institution.tooltip=The institution the user belongs to.
|
||||||
sebserver.useraccount.form.creationdate=Creation Date
|
sebserver.useraccount.form.creationdate=Creation Date
|
||||||
|
sebserver.useraccount.form.creationdate.tooltip=The date when the user-account was first created.
|
||||||
sebserver.useraccount.form.name=First Name
|
sebserver.useraccount.form.name=First Name
|
||||||
|
sebserver.useraccount.form.name.tooltip=The first name of the user.
|
||||||
sebserver.useraccount.form.surname=Surname
|
sebserver.useraccount.form.surname=Surname
|
||||||
|
sebserver.useraccount.form.surname.tooltip=The last- or surname of the user.
|
||||||
sebserver.useraccount.form.username=Username
|
sebserver.useraccount.form.username=Username
|
||||||
|
sebserver.useraccount.form.username.tooltip=The internal user name of the account.
|
||||||
sebserver.useraccount.form.mail=E-Mail
|
sebserver.useraccount.form.mail=E-Mail
|
||||||
|
sebserver.useraccount.form.mail.tooltip=The e-mail address of the user.
|
||||||
sebserver.useraccount.form.language=Language
|
sebserver.useraccount.form.language=Language
|
||||||
|
sebserver.useraccount.form.language.tooltip=The users language.
|
||||||
sebserver.useraccount.form.timezone=Time Zone
|
sebserver.useraccount.form.timezone=Time Zone
|
||||||
|
sebserver.useraccount.form.timezone.tooltip=The time-zone of the user.</br></br>Note that this also defines the exact time and date that is displayed to the user.
|
||||||
sebserver.useraccount.form.roles=User Roles
|
sebserver.useraccount.form.roles=User Roles
|
||||||
|
sebserver.useraccount.form.roles.tooltip=Select the roles for the user.</br>A user can have more then one role but must have at least one.</br></br>Please use the tooltip on the role name for more information about a specific role.
|
||||||
sebserver.useraccount.form.password=Password
|
sebserver.useraccount.form.password=Password
|
||||||
|
sebserver.useraccount.form.password.tooltip=The password of the user account
|
||||||
sebserver.useraccount.form.password.confirm=Confirm Password
|
sebserver.useraccount.form.password.confirm=Confirm Password
|
||||||
|
sebserver.useraccount.form.password.confirm.tooltip=Please confirm the password
|
||||||
sebserver.useraccount.form.pwchange.title=Change Password : {0}
|
sebserver.useraccount.form.pwchange.title=Change Password : {0}
|
||||||
sebserver.useraccount.form.password.new=New Password
|
sebserver.useraccount.form.password.new=New Password
|
||||||
|
sebserver.useraccount.form.password.new.tooltip=The new password for the user account
|
||||||
sebserver.useraccount.form.password.new.confirm=Confirm New Password
|
sebserver.useraccount.form.password.new.confirm=Confirm New Password
|
||||||
|
sebserver.useraccount.form.password.new.confirm.tooltip=Please confirm the password
|
||||||
|
|
||||||
################################
|
################################
|
||||||
# LMS Setup
|
# LMS Setup
|
||||||
|
@ -465,19 +489,28 @@ sebserver.clientconfig.list.empty=There is currently no SEB-Client configuration
|
||||||
sebserver.clientconfig.list.title=SEB Client Configurations
|
sebserver.clientconfig.list.title=SEB Client Configurations
|
||||||
sebserver.clientconfig.list.actions=
|
sebserver.clientconfig.list.actions=
|
||||||
sebserver.clientconfig.list.column.institution=Institution
|
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.name=Name
|
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.date=Creation Date {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.active=Active
|
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.info.pleaseSelect=Please select first a Client Configuration from the list
|
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 SEB Client Configuration from other institution cannot be modified.
|
||||||
|
|
||||||
sebserver.clientconfig.form.title.new=Add Client Configuration
|
sebserver.clientconfig.form.title.new=Add Client Configuration
|
||||||
sebserver.clientconfig.form.title=SEB Client Configuration
|
sebserver.clientconfig.form.title=SEB Client Configuration
|
||||||
sebserver.clientconfig.form.name=Name
|
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.fallback-url=Fallback Start URL
|
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.date=Creation Date
|
sebserver.clientconfig.form.date=Creation Date
|
||||||
|
sebserver.clientconfig.form.date.tooltip=The date when the SEB client configuration was first created.
|
||||||
sebserver.clientconfig.form.encryptSecret=Configuration Password
|
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.confirm=Confirm Password
|
sebserver.clientconfig.form.encryptSecret.confirm=Confirm Password
|
||||||
|
sebserver.clientconfig.form.encryptSecret.confirm.tooltip=Please retype the given password for configrmation
|
||||||
|
|
||||||
sebserver.clientconfig.action.list.new=Add Configuration
|
sebserver.clientconfig.action.list.new=Add Configuration
|
||||||
sebserver.clientconfig.action.list.view=View Configuration
|
sebserver.clientconfig.action.list.view=View Configuration
|
||||||
|
@ -494,9 +527,13 @@ sebserver.clientconfig.action.deactivate=Deactivate Configuration
|
||||||
sebserver.examconfig.action.list=Exam Configuration
|
sebserver.examconfig.action.list=Exam Configuration
|
||||||
sebserver.examconfig.list.title=Exam Configurations
|
sebserver.examconfig.list.title=Exam Configurations
|
||||||
sebserver.examconfig.list.column.institution=Institution
|
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
|
sebserver.examconfig.list.column.name=Name
|
||||||
|
sebserver.examconfig.list.column.name.tooltip=The name of the SEB exam configuration.</br></br>Use the filter above to narrow down a specific name.</br>{0}
|
||||||
sebserver.examconfig.list.column.description=Description
|
sebserver.examconfig.list.column.description=Description
|
||||||
|
sebserver.examconfig.list.column.description.tooltip=The description of the SEB exam configuration.</br></br>Use the filter above to find configurations that contains specific words or phrases within the description.</br>{0}
|
||||||
sebserver.examconfig.list.column.status=Status
|
sebserver.examconfig.list.column.status=Status
|
||||||
|
sebserver.examconfig.list.column.status.tooltip=The status of the SEB exam configuration.</br></br>Use the filter above to specify a status.</br>{0}
|
||||||
|
|
||||||
sebserver.examconfig.list.actions=
|
sebserver.examconfig.list.actions=
|
||||||
|
|
||||||
|
@ -506,10 +543,9 @@ sebserver.examconfig.list.action.no.modify.privilege=No Access: An Exam Configur
|
||||||
|
|
||||||
sebserver.examconfig.action.list.new=Add Exam Configuration
|
sebserver.examconfig.action.list.new=Add Exam Configuration
|
||||||
sebserver.examconfig.action.list.view=View Configuration
|
sebserver.examconfig.action.list.view=View Configuration
|
||||||
sebserver.examconfig.action.list.modify=Edit Settings
|
sebserver.examconfig.action.list.modify=Configuration Settings
|
||||||
sebserver.examconfig.action.list.modify.properties=Edit Configuration
|
sebserver.examconfig.action.list.modify.properties=Edit Configuration
|
||||||
sebserver.examconfig.action.view=View Settings
|
sebserver.examconfig.action.modify=Configuration Settings
|
||||||
sebserver.examconfig.action.modify=Edit Settings
|
|
||||||
sebserver.examconfig.action.modify.properties=Edit Configuration
|
sebserver.examconfig.action.modify.properties=Edit Configuration
|
||||||
sebserver.examconfig.action.view.properties=View Configuration
|
sebserver.examconfig.action.view.properties=View Configuration
|
||||||
sebserver.examconfig.action.save=Save
|
sebserver.examconfig.action.save=Save
|
||||||
|
@ -534,12 +570,17 @@ sebserver.examconfig.action.state-change.confirm=This configuration is already a
|
||||||
sebserver.examconfig.form.title.new=Add Exam Configuration
|
sebserver.examconfig.form.title.new=Add Exam Configuration
|
||||||
sebserver.examconfig.form.title=Exam Configuration
|
sebserver.examconfig.form.title=Exam Configuration
|
||||||
sebserver.examconfig.form.name=Name
|
sebserver.examconfig.form.name=Name
|
||||||
|
sebserver.examconfig.form.name.tooltip=The name of the SEB exam configuration.
|
||||||
sebserver.examconfig.form.description=Description
|
sebserver.examconfig.form.description=Description
|
||||||
|
sebserver.examconfig.form.description.tooltip=The description text of the SEB exam configuration.
|
||||||
sebserver.examconfig.form.with-history=With History
|
sebserver.examconfig.form.with-history=With History
|
||||||
sebserver.examconfig.form.template=Template
|
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=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.config-key.title=Config Key
|
sebserver.examconfig.form.config-key.title=Config Key
|
||||||
sebserver.examconfig.form.attched-to=Attached To Exam
|
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.
|
||||||
|
|
||||||
sebserver.examconfig.status.CONSTRUCTION=Under Construction
|
sebserver.examconfig.status.CONSTRUCTION=Under Construction
|
||||||
sebserver.examconfig.status.READY_TO_USE=Ready To Use
|
sebserver.examconfig.status.READY_TO_USE=Ready To Use
|
||||||
|
@ -1037,7 +1078,9 @@ sebserver.configtemplate.action.create-config.dialog=Exam Configuration
|
||||||
sebserver.configtemplate.form.title.new=Add Template
|
sebserver.configtemplate.form.title.new=Add Template
|
||||||
sebserver.configtemplate.form.title=Configuration Template
|
sebserver.configtemplate.form.title=Configuration Template
|
||||||
sebserver.configtemplate.form.name=Name
|
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=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 Template
|
||||||
|
|
||||||
sebserver.configtemplate.attr.type.TEXT_FIELD=Text Field
|
sebserver.configtemplate.attr.type.TEXT_FIELD=Text Field
|
||||||
|
@ -1058,10 +1101,15 @@ sebserver.configtemplate.attr.type.INLINE_TABLE=Table
|
||||||
sebserver.configtemplate.attr.type.COMPOSITE_TABLE=Table
|
sebserver.configtemplate.attr.type.COMPOSITE_TABLE=Table
|
||||||
|
|
||||||
sebserver.configtemplate.attrs.list.title=Configuration Attributes
|
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.name=Name
|
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.view=View
|
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.group=Group
|
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.type=Type
|
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.attr.list.actions=
|
sebserver.configtemplate.attr.list.actions=
|
||||||
sebserver.configtemplate.attr.list.actions.modify=Edit Attribute
|
sebserver.configtemplate.attr.list.actions.modify=Edit Attribute
|
||||||
|
@ -1072,10 +1120,15 @@ sebserver.configtemplate.attr.info.pleaseSelect=Please select first an Attribute
|
||||||
|
|
||||||
sebserver.configtemplate.attr.form.title=Template Attribute
|
sebserver.configtemplate.attr.form.title=Template Attribute
|
||||||
sebserver.configtemplate.attr.form.name=Name
|
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.type=Type
|
sebserver.configtemplate.attr.form.type=Type
|
||||||
|
sebserver.configtemplate.attr.form.type.tooltip=The type of the SEB exam configuration attribute.
|
||||||
sebserver.configtemplate.attr.form.view=View
|
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.group=Group
|
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.value=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.setdefault=Set Default Values
|
||||||
sebserver.configtemplate.attr.action.template=View Template
|
sebserver.configtemplate.attr.action.template=View Template
|
||||||
|
@ -1165,10 +1218,15 @@ sebserver.logs.activity.seblogs.details=Show Details
|
||||||
|
|
||||||
sebserver.userlogs.list.title=User Activity Logs
|
sebserver.userlogs.list.title=User Activity Logs
|
||||||
sebserver.userlogs.list.column.institution=Institution
|
sebserver.userlogs.list.column.institution=Institution
|
||||||
|
sebserver.userlogs.list.column.institution.tooltip=The institution of the user activity log.</br></br>Use the filter above to specify the institution.</br>{0}
|
||||||
sebserver.userlogs.list.column.user=User
|
sebserver.userlogs.list.column.user=User
|
||||||
|
sebserver.userlogs.list.column.user.tooltip=The user account of the user activity log.</br></br>Use the filter above to specify a user account.</br>{0}
|
||||||
sebserver.userlogs.list.column.dateTime=Date {0}
|
sebserver.userlogs.list.column.dateTime=Date {0}
|
||||||
|
sebserver.userlogs.list.column.dateTime.tooltip=The date when the user activity log happened.</br></br>Use the filter above to specify a from- and to-date range.</br>{0}
|
||||||
sebserver.userlogs.list.column.activityType=User Activity
|
sebserver.userlogs.list.column.activityType=User Activity
|
||||||
sebserver.userlogs.list.column.entityType=Entity Type
|
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.entityId=Entity-ID
|
||||||
sebserver.userlogs.list.column.message=Message
|
sebserver.userlogs.list.column.message=Message
|
||||||
|
|
||||||
|
|
Binary file not shown.
Before Width: | Height: | Size: 678 B After Width: | Height: | Size: 1.7 KiB |
Loading…
Reference in a new issue