From c2b2dea65f1de5e1661d331707efcffde3f114a9 Mon Sep 17 00:00:00 2001 From: anhefti Date: Wed, 11 Sep 2019 16:44:26 +0200 Subject: [PATCH] fix user account edit privileges and page state --- .../seb/sebserver/gui/content/ExamForm.java | 5 +- .../gui/content/ExamSebConfigMapForm.java | 4 +- .../sebserver/gui/content/IndicatorForm.java | 4 +- .../gui/content/InstitutionForm.java | 4 +- .../sebserver/gui/content/LmsSetupForm.java | 4 +- .../gui/content/SebClientConfigForm.java | 4 +- .../gui/content/SebExamConfigPropForm.java | 4 +- .../UserAccountChangePasswordForm.java | 4 +- .../gui/content/UserAccountForm.java | 9 +- .../gui/content/UserAccountList.java | 22 ++- .../gui/content/action/ActionDefinition.java | 182 +++++++++--------- .../gui/content/action/ActionPane.java | 4 - .../gui/content/activity/ActivitiesPane.java | 11 +- ...tion.java => PageStateDefinitionImpl.java} | 8 +- .../gui/service/page/PageService.java | 20 +- ...ageState.java => PageStateDefinition.java} | 2 +- .../page/impl/ComposerServiceImpl.java | 3 + .../gui/service/page/impl/PageAction.java | 2 +- .../service/page/impl/PageServiceImpl.java | 13 +- .../gui/service/page/impl/PageState.java | 53 +++++ src/main/resources/messages.properties | 1 + 21 files changed, 209 insertions(+), 154 deletions(-) rename src/main/java/ch/ethz/seb/sebserver/gui/content/activity/{PageStateDefinition.java => PageStateDefinitionImpl.java} (94%) rename src/main/java/ch/ethz/seb/sebserver/gui/service/page/{PageState.java => PageStateDefinition.java} (90%) create mode 100644 src/main/java/ch/ethz/seb/sebserver/gui/service/page/impl/PageState.java diff --git a/src/main/java/ch/ethz/seb/sebserver/gui/content/ExamForm.java b/src/main/java/ch/ethz/seb/sebserver/gui/content/ExamForm.java index be16b30e..756cdd78 100644 --- a/src/main/java/ch/ethz/seb/sebserver/gui/content/ExamForm.java +++ b/src/main/java/ch/ethz/seb/sebserver/gui/content/ExamForm.java @@ -53,6 +53,7 @@ import ch.ethz.seb.sebserver.gui.service.page.PageService.PageActionBuilder; import ch.ethz.seb.sebserver.gui.service.page.TemplateComposer; import ch.ethz.seb.sebserver.gui.service.page.event.ActionEvent; import ch.ethz.seb.sebserver.gui.service.page.impl.PageAction; +import ch.ethz.seb.sebserver.gui.service.page.impl.PageState; import ch.ethz.seb.sebserver.gui.service.remote.download.DownloadService; import ch.ethz.seb.sebserver.gui.service.remote.download.SebExamConfigDownload; import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.RestService; @@ -574,8 +575,8 @@ public class ExamForm implements TemplateComposer { return activityHomeAction; } - this.pageService.onEmptyEntityKeyGoTo(action, ActionDefinition.EXAM_VIEW_LIST); - return action; + final PageState lastState = this.pageService.getCurrentState(); + return lastState.gotoAction; } } diff --git a/src/main/java/ch/ethz/seb/sebserver/gui/content/ExamSebConfigMapForm.java b/src/main/java/ch/ethz/seb/sebserver/gui/content/ExamSebConfigMapForm.java index f8052101..37c23264 100644 --- a/src/main/java/ch/ethz/seb/sebserver/gui/content/ExamSebConfigMapForm.java +++ b/src/main/java/ch/ethz/seb/sebserver/gui/content/ExamSebConfigMapForm.java @@ -174,9 +174,7 @@ public class ExamSebConfigMapForm implements TemplateComposer { .newAction(ActionDefinition.EXAM_CONFIGURATION_CANCEL_MODIFY) .withEntityKey(parentEntityKey) - .withExec(action -> this.pageService.onEmptyEntityKeyGoTo( - action, - ActionDefinition.EXAM_VIEW_LIST)) + .withExec(this.pageService.backToCurrentFunction()) .publishIf(() -> !isReadonly); } diff --git a/src/main/java/ch/ethz/seb/sebserver/gui/content/IndicatorForm.java b/src/main/java/ch/ethz/seb/sebserver/gui/content/IndicatorForm.java index 3d0c8d66..72d810af 100644 --- a/src/main/java/ch/ethz/seb/sebserver/gui/content/IndicatorForm.java +++ b/src/main/java/ch/ethz/seb/sebserver/gui/content/IndicatorForm.java @@ -160,9 +160,7 @@ public class IndicatorForm implements TemplateComposer { .newAction(ActionDefinition.EXAM_INDICATOR_CANCEL_MODIFY) .withEntityKey(parentEntityKey) - .withExec(action -> this.pageService.onEmptyEntityKeyGoTo( - action, - ActionDefinition.EXAM_VIEW_LIST)) + .withExec(this.pageService.backToCurrentFunction()) .publishIf(() -> !isReadonly); } diff --git a/src/main/java/ch/ethz/seb/sebserver/gui/content/InstitutionForm.java b/src/main/java/ch/ethz/seb/sebserver/gui/content/InstitutionForm.java index e5b17526..297c02ec 100644 --- a/src/main/java/ch/ethz/seb/sebserver/gui/content/InstitutionForm.java +++ b/src/main/java/ch/ethz/seb/sebserver/gui/content/InstitutionForm.java @@ -170,9 +170,7 @@ public class InstitutionForm implements TemplateComposer { .newAction(ActionDefinition.INSTITUTION_CANCEL_MODIFY) .withEntityKey(entityKey) - .withExec(action -> this.pageService.onEmptyEntityKeyGoTo( - action, - ActionDefinition.INSTITUTION_VIEW_LIST)) + .withExec(this.pageService.backToCurrentFunction()) .publishIf(() -> !isReadonly); } diff --git a/src/main/java/ch/ethz/seb/sebserver/gui/content/LmsSetupForm.java b/src/main/java/ch/ethz/seb/sebserver/gui/content/LmsSetupForm.java index 994609bb..3b1dd9ae 100644 --- a/src/main/java/ch/ethz/seb/sebserver/gui/content/LmsSetupForm.java +++ b/src/main/java/ch/ethz/seb/sebserver/gui/content/LmsSetupForm.java @@ -231,9 +231,7 @@ public class LmsSetupForm implements TemplateComposer { .newAction(ActionDefinition.LMS_SETUP_CANCEL_MODIFY) .withEntityKey(entityKey) - .withExec(action -> this.pageService.onEmptyEntityKeyGoTo( - action, - ActionDefinition.LMS_SETUP_VIEW_LIST)) + .withExec(this.pageService.backToCurrentFunction()) .publishIf(() -> !readonly); } diff --git a/src/main/java/ch/ethz/seb/sebserver/gui/content/SebClientConfigForm.java b/src/main/java/ch/ethz/seb/sebserver/gui/content/SebClientConfigForm.java index d22f805a..a507ad94 100644 --- a/src/main/java/ch/ethz/seb/sebserver/gui/content/SebClientConfigForm.java +++ b/src/main/java/ch/ethz/seb/sebserver/gui/content/SebClientConfigForm.java @@ -208,9 +208,7 @@ public class SebClientConfigForm implements TemplateComposer { .newAction(ActionDefinition.SEB_CLIENT_CONFIG_CANCEL_MODIFY) .withEntityKey(entityKey) - .withExec(action -> this.pageService.onEmptyEntityKeyGoTo( - action, - ActionDefinition.SEB_CLIENT_CONFIG_LIST)) + .withExec(this.pageService.backToCurrentFunction()) .publishIf(() -> !isReadonly); } diff --git a/src/main/java/ch/ethz/seb/sebserver/gui/content/SebExamConfigPropForm.java b/src/main/java/ch/ethz/seb/sebserver/gui/content/SebExamConfigPropForm.java index 0839ff53..827871c6 100644 --- a/src/main/java/ch/ethz/seb/sebserver/gui/content/SebExamConfigPropForm.java +++ b/src/main/java/ch/ethz/seb/sebserver/gui/content/SebExamConfigPropForm.java @@ -209,9 +209,7 @@ public class SebExamConfigPropForm implements TemplateComposer { .newAction(ActionDefinition.SEB_EXAM_CONFIG_CANCEL_MODIFY) .withEntityKey(entityKey) - .withExec(action -> this.pageService.onEmptyEntityKeyGoTo( - action, - ActionDefinition.SEB_EXAM_CONFIG_LIST)) + .withExec(this.pageService.backToCurrentFunction()) .publishIf(() -> !isReadonly); } diff --git a/src/main/java/ch/ethz/seb/sebserver/gui/content/UserAccountChangePasswordForm.java b/src/main/java/ch/ethz/seb/sebserver/gui/content/UserAccountChangePasswordForm.java index 4fc52216..b09826ee 100644 --- a/src/main/java/ch/ethz/seb/sebserver/gui/content/UserAccountChangePasswordForm.java +++ b/src/main/java/ch/ethz/seb/sebserver/gui/content/UserAccountChangePasswordForm.java @@ -133,9 +133,7 @@ public class UserAccountChangePasswordForm implements TemplateComposer { .publish() .newAction(ActionDefinition.USER_ACCOUNT_CANCEL_MODIFY) - .withExec(action -> this.pageService.onEmptyEntityKeyGoTo( - action, - ActionDefinition.USER_ACCOUNT_VIEW_LIST)) + .withExec(this.pageService.backToCurrentFunction()) .publish(); } diff --git a/src/main/java/ch/ethz/seb/sebserver/gui/content/UserAccountForm.java b/src/main/java/ch/ethz/seb/sebserver/gui/content/UserAccountForm.java index a7385340..96a87a7e 100644 --- a/src/main/java/ch/ethz/seb/sebserver/gui/content/UserAccountForm.java +++ b/src/main/java/ch/ethz/seb/sebserver/gui/content/UserAccountForm.java @@ -120,12 +120,12 @@ public class UserAccountForm implements TemplateComposer { return; } + final boolean roleBasedEditGrant = Privilege.hasRoleBasedUserAccountEditGrant(userAccount, currentUser.get()); // new PageContext with actual EntityKey final PageContext formContext = pageContext.withEntityKey(userAccount.getEntityKey()); - final boolean ownAccount = user.uuid.equals(userAccount.getModelId()); final EntityGrantCheck userGrantCheck = currentUser.entityGrantCheck(userAccount); - final boolean roleBasedEditGrant = Privilege.hasRoleBasedUserAccountEditGrant(userAccount, currentUser.get()); + final boolean writeGrant = roleBasedEditGrant && userGrantCheck.w(); final boolean modifyGrant = roleBasedEditGrant && userGrantCheck.m(); final boolean institutionalWriteGrant = currentUser.hasInstitutionalPrivilege( @@ -262,10 +262,7 @@ public class UserAccountForm implements TemplateComposer { .publishIf(() -> !readonly) .newAction(ActionDefinition.USER_ACCOUNT_CANCEL_MODIFY) - .withEntityKey(entityKey) - .withExec(action -> this.pageService.onEmptyEntityKeyGoTo( - action, - ActionDefinition.USER_ACCOUNT_VIEW_LIST)) + .withExec(this.pageService.backToCurrentFunction()) .publishIf(() -> !readonly); } diff --git a/src/main/java/ch/ethz/seb/sebserver/gui/content/UserAccountList.java b/src/main/java/ch/ethz/seb/sebserver/gui/content/UserAccountList.java index 94ec5f28..05b80acd 100644 --- a/src/main/java/ch/ethz/seb/sebserver/gui/content/UserAccountList.java +++ b/src/main/java/ch/ethz/seb/sebserver/gui/content/UserAccountList.java @@ -17,7 +17,9 @@ import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Component; import ch.ethz.seb.sebserver.gbl.Constants; +import ch.ethz.seb.sebserver.gbl.api.API; import ch.ethz.seb.sebserver.gbl.api.EntityType; +import ch.ethz.seb.sebserver.gbl.api.authorization.Privilege; import ch.ethz.seb.sebserver.gbl.model.Domain; import ch.ethz.seb.sebserver.gbl.model.Entity; import ch.ethz.seb.sebserver.gbl.model.user.UserInfo; @@ -27,11 +29,13 @@ import ch.ethz.seb.sebserver.gui.content.action.ActionDefinition; import ch.ethz.seb.sebserver.gui.service.ResourceService; import ch.ethz.seb.sebserver.gui.service.i18n.LocTextKey; import ch.ethz.seb.sebserver.gui.service.page.PageContext; +import ch.ethz.seb.sebserver.gui.service.page.PageMessageException; import ch.ethz.seb.sebserver.gui.service.page.PageService; import ch.ethz.seb.sebserver.gui.service.page.PageService.PageActionBuilder; import ch.ethz.seb.sebserver.gui.service.page.TemplateComposer; import ch.ethz.seb.sebserver.gui.service.page.impl.PageAction; import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.RestService; +import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.useraccount.GetUserAccount; import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.useraccount.GetUserAccountPage; import ch.ethz.seb.sebserver.gui.service.remote.webservice.auth.CurrentUser; import ch.ethz.seb.sebserver.gui.service.remote.webservice.auth.CurrentUser.GrantCheck; @@ -65,6 +69,8 @@ public class UserAccountList implements TemplateComposer { new LocTextKey("sebserver.useraccount.list.column.name"); private static final LocTextKey TITLE_TEXT_KEY = new LocTextKey("sebserver.useraccount.list.title"); + private static final LocTextKey NO_EDIT_RIGHT_MESSAGE = + new LocTextKey("sebserver.useraccount.info.notEditable"); // filter attribute models private final TableFilterAttribute institutionFilter; @@ -193,10 +199,24 @@ public class UserAccountList implements TemplateComposer { .publishIf(() -> table.hasAnyContent()) .newAction(ActionDefinition.USER_ACCOUNT_MODIFY_FROM_LIST) - .withSelect(table::getSelection, PageAction::applySingleSelection, EMPTY_SELECTION_TEXT_KEY) + .withSelect(table::getSelection, this::editAction, EMPTY_SELECTION_TEXT_KEY) .publishIf(() -> userGrant.im() && table.hasAnyContent()); } + private PageAction editAction(final PageAction pageAction) { + if (!this.resourceService.getRestService() + .getBuilder(GetUserAccount.class) + .withURIVariable(API.PARAM_MODEL_ID, pageAction.getSingleSelection().modelId) + .call() + .map(user -> Privilege.hasRoleBasedUserAccountEditGrant(user, + this.resourceService.getCurrentUser().get())) + .getOr(false)) { + throw new PageMessageException(NO_EDIT_RIGHT_MESSAGE); + } + + return PageAction.applySingleSelection(pageAction); + } + private String getLocaleDisplayText(final UserInfo userInfo) { return (userInfo.language != null) ? userInfo.language.getDisplayLanguage(this.pageService.getI18nSupport().getCurrentLocale()) diff --git a/src/main/java/ch/ethz/seb/sebserver/gui/content/action/ActionDefinition.java b/src/main/java/ch/ethz/seb/sebserver/gui/content/action/ActionDefinition.java index 056425d7..df84aba0 100644 --- a/src/main/java/ch/ethz/seb/sebserver/gui/content/action/ActionDefinition.java +++ b/src/main/java/ch/ethz/seb/sebserver/gui/content/action/ActionDefinition.java @@ -8,9 +8,9 @@ package ch.ethz.seb.sebserver.gui.content.action; -import ch.ethz.seb.sebserver.gui.content.activity.PageStateDefinition; +import ch.ethz.seb.sebserver.gui.content.activity.PageStateDefinitionImpl; import ch.ethz.seb.sebserver.gui.service.i18n.LocTextKey; -import ch.ethz.seb.sebserver.gui.service.page.PageState; +import ch.ethz.seb.sebserver.gui.service.page.PageStateDefinition; import ch.ethz.seb.sebserver.gui.widget.WidgetFactory.ImageIcon; /** Enumeration of static action data for each action within the SEB Server GUI */ @@ -18,162 +18,162 @@ public enum ActionDefinition { INSTITUTION_VIEW_LIST( new LocTextKey("sebserver.institution.action.list"), - PageStateDefinition.INSTITUTION_LIST), + PageStateDefinitionImpl.INSTITUTION_LIST), INSTITUTION_VIEW_FORM( new LocTextKey("sebserver.institution.action.form"), - PageStateDefinition.INSTITUTION_VIEW), + PageStateDefinitionImpl.INSTITUTION_VIEW), INSTITUTION_NEW( new LocTextKey("sebserver.institution.action.new"), ImageIcon.NEW, - PageStateDefinition.INSTITUTION_EDIT), + PageStateDefinitionImpl.INSTITUTION_EDIT), INSTITUTION_VIEW_FROM_LIST( new LocTextKey("sebserver.institution.action.list.view"), ImageIcon.SHOW, - PageStateDefinition.INSTITUTION_VIEW, + PageStateDefinitionImpl.INSTITUTION_VIEW, ActionCategory.INSTITUTION_LIST), INSTITUTION_MODIFY_FROM_LIST( new LocTextKey("sebserver.institution.action.list.modify"), ImageIcon.EDIT, - PageStateDefinition.INSTITUTION_EDIT, + PageStateDefinitionImpl.INSTITUTION_EDIT, ActionCategory.INSTITUTION_LIST), INSTITUTION_MODIFY( new LocTextKey("sebserver.institution.action.modify"), ImageIcon.EDIT, - PageStateDefinition.INSTITUTION_EDIT, + PageStateDefinitionImpl.INSTITUTION_EDIT, ActionCategory.FORM), INSTITUTION_CANCEL_MODIFY( new LocTextKey("sebserver.overall.action.modify.cancel"), ImageIcon.CANCEL, - PageStateDefinition.INSTITUTION_VIEW, + PageStateDefinitionImpl.INSTITUTION_VIEW, ActionCategory.FORM), INSTITUTION_SAVE( new LocTextKey("sebserver.institution.action.save"), ImageIcon.SAVE, - PageStateDefinition.INSTITUTION_VIEW, + PageStateDefinitionImpl.INSTITUTION_VIEW, ActionCategory.FORM), INSTITUTION_ACTIVATE( new LocTextKey("sebserver.institution.action.activate"), ImageIcon.TOGGLE_OFF, - PageStateDefinition.INSTITUTION_VIEW, + PageStateDefinitionImpl.INSTITUTION_VIEW, ActionCategory.FORM), INSTITUTION_DEACTIVATE( new LocTextKey("sebserver.institution.action.deactivate"), ImageIcon.TOGGLE_ON, - PageStateDefinition.INSTITUTION_VIEW, + PageStateDefinitionImpl.INSTITUTION_VIEW, ActionCategory.FORM), USER_ACCOUNT_VIEW_LIST( new LocTextKey("sebserver.useraccount.action.list"), - PageStateDefinition.USER_ACCOUNT_LIST), + PageStateDefinitionImpl.USER_ACCOUNT_LIST), USER_ACCOUNT_VIEW_FORM( new LocTextKey("sebserver.useraccount.action.form"), - PageStateDefinition.USER_ACCOUNT_VIEW), + PageStateDefinitionImpl.USER_ACCOUNT_VIEW), USER_ACCOUNT_NEW( new LocTextKey("sebserver.useraccount.action.new"), ImageIcon.NEW, - PageStateDefinition.USER_ACCOUNT_EDIT), + PageStateDefinitionImpl.USER_ACCOUNT_EDIT), USER_ACCOUNT_VIEW_FROM_LIST( new LocTextKey("sebserver.useraccount.action.view"), ImageIcon.SHOW, - PageStateDefinition.USER_ACCOUNT_VIEW, + PageStateDefinitionImpl.USER_ACCOUNT_VIEW, ActionCategory.USER_ACCOUNT_LIST), USER_ACCOUNT_MODIFY_FROM_LIST( new LocTextKey("sebserver.useraccount.action.list.modify"), ImageIcon.EDIT, - PageStateDefinition.USER_ACCOUNT_EDIT, + PageStateDefinitionImpl.USER_ACCOUNT_EDIT, ActionCategory.USER_ACCOUNT_LIST), USER_ACCOUNT_MODIFY( new LocTextKey("sebserver.useraccount.action.modify"), ImageIcon.EDIT, - PageStateDefinition.USER_ACCOUNT_EDIT, + PageStateDefinitionImpl.USER_ACCOUNT_EDIT, ActionCategory.FORM), USER_ACCOUNT_CANCEL_MODIFY( new LocTextKey("sebserver.overall.action.modify.cancel"), ImageIcon.CANCEL, - PageStateDefinition.USER_ACCOUNT_VIEW, + PageStateDefinitionImpl.USER_ACCOUNT_VIEW, ActionCategory.FORM), USER_ACCOUNT_SAVE( new LocTextKey("sebserver.useraccount.action.save"), ImageIcon.SAVE, - PageStateDefinition.USER_ACCOUNT_VIEW, + PageStateDefinitionImpl.USER_ACCOUNT_VIEW, ActionCategory.FORM), USER_ACCOUNT_ACTIVATE( new LocTextKey("sebserver.useraccount.action.activate"), ImageIcon.TOGGLE_OFF, - PageStateDefinition.USER_ACCOUNT_VIEW, + PageStateDefinitionImpl.USER_ACCOUNT_VIEW, ActionCategory.FORM), USER_ACCOUNT_DEACTIVATE( new LocTextKey("sebserver.useraccount.action.deactivate"), ImageIcon.TOGGLE_ON, - PageStateDefinition.USER_ACCOUNT_VIEW, + PageStateDefinitionImpl.USER_ACCOUNT_VIEW, ActionCategory.FORM), USER_ACCOUNT_CHANGE_PASSOWRD( new LocTextKey("sebserver.useraccount.action.change.password"), ImageIcon.SECURE, - PageStateDefinition.USER_ACCOUNT_PASSWORD_CHANGE, + PageStateDefinitionImpl.USER_ACCOUNT_PASSWORD_CHANGE, ActionCategory.FORM), USER_ACCOUNT_CHANGE_PASSOWRD_SAVE( new LocTextKey("sebserver.useraccount.action.change.password.save"), ImageIcon.SAVE, - PageStateDefinition.USER_ACCOUNT_VIEW, + PageStateDefinitionImpl.USER_ACCOUNT_VIEW, ActionCategory.FORM), LMS_SETUP_VIEW_LIST( new LocTextKey("sebserver.lmssetup.action.list"), - PageStateDefinition.LMS_SETUP_LIST), + PageStateDefinitionImpl.LMS_SETUP_LIST), LMS_SETUP_NEW( new LocTextKey("sebserver.lmssetup.action.new"), ImageIcon.NEW, - PageStateDefinition.LMS_SETUP_EDIT), + PageStateDefinitionImpl.LMS_SETUP_EDIT), LMS_SETUP_VIEW_FROM_LIST( new LocTextKey("sebserver.lmssetup.action.list.view"), ImageIcon.SHOW, - PageStateDefinition.LMS_SETUP_VIEW, + PageStateDefinitionImpl.LMS_SETUP_VIEW, ActionCategory.LMS_SETUP_LIST), LMS_SETUP_MODIFY_FROM_LIST( new LocTextKey("sebserver.lmssetup.action.list.modify"), ImageIcon.EDIT, - PageStateDefinition.LMS_SETUP_EDIT, + PageStateDefinitionImpl.LMS_SETUP_EDIT, ActionCategory.LMS_SETUP_LIST), LMS_SETUP_MODIFY( new LocTextKey("sebserver.lmssetup.action.modify"), ImageIcon.EDIT, - PageStateDefinition.LMS_SETUP_EDIT, + PageStateDefinitionImpl.LMS_SETUP_EDIT, ActionCategory.FORM), LMS_SETUP_SAVE_AND_TEST( new LocTextKey("sebserver.lmssetup.action.savetest"), ImageIcon.TEST, - PageStateDefinition.LMS_SETUP_VIEW, + PageStateDefinitionImpl.LMS_SETUP_VIEW, ActionCategory.FORM), LMS_SETUP_TEST_AND_SAVE( new LocTextKey("sebserver.lmssetup.action.testsave"), ImageIcon.TEST, - PageStateDefinition.LMS_SETUP_VIEW, + PageStateDefinitionImpl.LMS_SETUP_VIEW, ActionCategory.FORM), LMS_SETUP_CANCEL_MODIFY( new LocTextKey("sebserver.overall.action.modify.cancel"), ImageIcon.CANCEL, - PageStateDefinition.LMS_SETUP_VIEW, + PageStateDefinitionImpl.LMS_SETUP_VIEW, ActionCategory.FORM), LMS_SETUP_SAVE( new LocTextKey("sebserver.lmssetup.action.save"), ImageIcon.SAVE, - PageStateDefinition.LMS_SETUP_VIEW, + PageStateDefinitionImpl.LMS_SETUP_VIEW, ActionCategory.FORM), LMS_SETUP_ACTIVATE( new LocTextKey("sebserver.lmssetup.action.activate"), ImageIcon.TOGGLE_OFF, - PageStateDefinition.LMS_SETUP_VIEW, + PageStateDefinitionImpl.LMS_SETUP_VIEW, ActionCategory.FORM), LMS_SETUP_DEACTIVATE( new LocTextKey("sebserver.lmssetup.action.deactivate"), ImageIcon.TOGGLE_ON, - PageStateDefinition.LMS_SETUP_VIEW, + PageStateDefinitionImpl.LMS_SETUP_VIEW, ActionCategory.FORM), QUIZ_DISCOVERY_VIEW_LIST( new LocTextKey("sebserver.quizdiscovery.action.list"), - PageStateDefinition.QUIZ_LIST), + PageStateDefinitionImpl.QUIZ_LIST), QUIZ_DISCOVERY_SHOW_DETAILS( new LocTextKey("sebserver.quizdiscovery.action.details"), ImageIcon.SHOW, @@ -181,76 +181,76 @@ public enum ActionDefinition { QUIZ_DISCOVERY_EXAM_IMPORT( new LocTextKey("sebserver.quizdiscovery.action.import"), ImageIcon.IMPORT, - PageStateDefinition.EXAM_EDIT, + PageStateDefinitionImpl.EXAM_EDIT, ActionCategory.QUIZ_LIST), EXAM_VIEW_LIST( new LocTextKey("sebserver.exam.action.list"), - PageStateDefinition.EXAM_LIST), + PageStateDefinitionImpl.EXAM_LIST), EXAM_IMPORT( new LocTextKey("sebserver.exam.action.import"), ImageIcon.IMPORT, - PageStateDefinition.QUIZ_LIST), + PageStateDefinitionImpl.QUIZ_LIST), EXAM_VIEW_FROM_LIST( new LocTextKey("sebserver.exam.action.list.view"), ImageIcon.SHOW, - PageStateDefinition.EXAM_VIEW, + PageStateDefinitionImpl.EXAM_VIEW, ActionCategory.EXAM_LIST), EXAM_MODIFY_FROM_LIST( new LocTextKey("sebserver.exam.action.list.modify"), ImageIcon.EDIT, - PageStateDefinition.EXAM_EDIT, + PageStateDefinitionImpl.EXAM_EDIT, ActionCategory.EXAM_LIST), EXAM_MODIFY( new LocTextKey("sebserver.exam.action.modify"), ImageIcon.EDIT, - PageStateDefinition.EXAM_EDIT, + PageStateDefinitionImpl.EXAM_EDIT, ActionCategory.FORM), EXAM_CANCEL_MODIFY( new LocTextKey("sebserver.overall.action.modify.cancel"), ImageIcon.CANCEL, - PageStateDefinition.EXAM_VIEW, + PageStateDefinitionImpl.EXAM_VIEW, ActionCategory.FORM), EXAM_SAVE( new LocTextKey("sebserver.exam.action.save"), ImageIcon.SAVE, - PageStateDefinition.EXAM_VIEW, + PageStateDefinitionImpl.EXAM_VIEW, ActionCategory.FORM), EXAM_ACTIVATE( new LocTextKey("sebserver.exam.action.activate"), ImageIcon.TOGGLE_OFF, - PageStateDefinition.EXAM_VIEW, + PageStateDefinitionImpl.EXAM_VIEW, ActionCategory.FORM), EXAM_DEACTIVATE( new LocTextKey("sebserver.exam.action.deactivate"), ImageIcon.TOGGLE_ON, - PageStateDefinition.EXAM_VIEW, + PageStateDefinitionImpl.EXAM_VIEW, ActionCategory.FORM), EXAM_CONFIGURATION_NEW( new LocTextKey("sebserver.exam.configuration.action.list.new"), ImageIcon.NEW, - PageStateDefinition.EXAM_CONFIG_MAP_EDIT, + PageStateDefinitionImpl.EXAM_CONFIG_MAP_EDIT, ActionCategory.EXAM_CONFIG_MAPPING_LIST), EXAM_CONFIGURATION_MODIFY_FROM_LIST( new LocTextKey("sebserver.exam.configuration.action.list.modify"), ImageIcon.EDIT, - PageStateDefinition.EXAM_CONFIG_MAP_EDIT, + PageStateDefinitionImpl.EXAM_CONFIG_MAP_EDIT, ActionCategory.EXAM_CONFIG_MAPPING_LIST), EXAM_CONFIGURATION_EXAM_CONFIG_VIEW_PROP( new LocTextKey("sebserver.examconfig.action.view"), ImageIcon.SHOW, - PageStateDefinition.SEB_EXAM_CONFIG_VIEW, + PageStateDefinitionImpl.SEB_EXAM_CONFIG_VIEW, ActionCategory.EXAM_CONFIG_MAPPING_LIST), EXAM_CONFIGURATION_DELETE_FROM_LIST( new LocTextKey("sebserver.exam.configuration.action.list.delete"), ImageIcon.DELETE, - PageStateDefinition.EXAM_VIEW, + PageStateDefinitionImpl.EXAM_VIEW, ActionCategory.EXAM_CONFIG_MAPPING_LIST), EXAM_CONFIGURATION_EXPORT( new LocTextKey("sebserver.exam.configuration.action.export-config"), ImageIcon.EXPORT, - PageStateDefinition.EXAM_VIEW, + PageStateDefinitionImpl.EXAM_VIEW, ActionCategory.EXAM_CONFIG_MAPPING_LIST), EXAM_CONFIGURATION_GET_CONFIG_KEY( new LocTextKey("sebserver.exam.configuration.action.get-config-key"), @@ -259,135 +259,135 @@ public enum ActionDefinition { EXAM_CONFIGURATION_SAVE( new LocTextKey("sebserver.exam.configuration.action.save"), ImageIcon.SAVE, - PageStateDefinition.EXAM_VIEW, + PageStateDefinitionImpl.EXAM_VIEW, ActionCategory.FORM), EXAM_CONFIGURATION_CANCEL_MODIFY( new LocTextKey("sebserver.overall.action.modify.cancel"), ImageIcon.CANCEL, - PageStateDefinition.EXAM_VIEW, + PageStateDefinitionImpl.EXAM_VIEW, ActionCategory.FORM), EXAM_INDICATOR_NEW( new LocTextKey("sebserver.exam.indicator.action.list.new"), ImageIcon.NEW, - PageStateDefinition.INDICATOR_EDIT, + PageStateDefinitionImpl.INDICATOR_EDIT, ActionCategory.INDICATOR_LIST), EXAM_INDICATOR_MODIFY_FROM_LIST( new LocTextKey("sebserver.exam.indicator.action.list.modify"), ImageIcon.EDIT, - PageStateDefinition.INDICATOR_EDIT, + PageStateDefinitionImpl.INDICATOR_EDIT, ActionCategory.INDICATOR_LIST), EXAM_INDICATOR_DELETE_FROM_LIST( new LocTextKey("sebserver.exam.indicator.action.list.delete"), ImageIcon.DELETE, - PageStateDefinition.EXAM_VIEW, + PageStateDefinitionImpl.EXAM_VIEW, ActionCategory.INDICATOR_LIST), EXAM_INDICATOR_SAVE( new LocTextKey("sebserver.exam.indicator.action.save"), ImageIcon.SAVE, - PageStateDefinition.EXAM_VIEW, + PageStateDefinitionImpl.EXAM_VIEW, ActionCategory.FORM), EXAM_INDICATOR_CANCEL_MODIFY( new LocTextKey("sebserver.overall.action.modify.cancel"), ImageIcon.CANCEL, - PageStateDefinition.EXAM_VIEW, + PageStateDefinitionImpl.EXAM_VIEW, ActionCategory.FORM), SEB_CLIENT_CONFIG_LIST( new LocTextKey("sebserver.clientconfig.action.list"), - PageStateDefinition.SEB_CLIENT_CONFIG_LIST), + PageStateDefinitionImpl.SEB_CLIENT_CONFIG_LIST), SEB_CLIENT_CONFIG_NEW( new LocTextKey("sebserver.clientconfig.action.list.new"), ImageIcon.NEW, - PageStateDefinition.SEB_CLIENT_CONFIG_EDIT), + PageStateDefinitionImpl.SEB_CLIENT_CONFIG_EDIT), SEB_CLIENT_CONFIG_VIEW_FROM_LIST( new LocTextKey("sebserver.clientconfig.action.list.view"), ImageIcon.SHOW, - PageStateDefinition.SEB_CLIENT_CONFIG_VIEW, + PageStateDefinitionImpl.SEB_CLIENT_CONFIG_VIEW, ActionCategory.SEB_CLIENT_CONFIG_LIST), SEB_CLIENT_CONFIG_MODIFY_FROM_LIST( new LocTextKey("sebserver.clientconfig.action.list.modify"), ImageIcon.EDIT, - PageStateDefinition.SEB_CLIENT_CONFIG_EDIT, + PageStateDefinitionImpl.SEB_CLIENT_CONFIG_EDIT, ActionCategory.SEB_CLIENT_CONFIG_LIST), SEB_CLIENT_CONFIG_MODIFY( new LocTextKey("sebserver.clientconfig.action.modify"), ImageIcon.EDIT, - PageStateDefinition.SEB_CLIENT_CONFIG_EDIT, + PageStateDefinitionImpl.SEB_CLIENT_CONFIG_EDIT, ActionCategory.FORM), SEB_CLIENT_CONFIG_CANCEL_MODIFY( new LocTextKey("sebserver.overall.action.modify.cancel"), ImageIcon.CANCEL, - PageStateDefinition.SEB_CLIENT_CONFIG_VIEW, + PageStateDefinitionImpl.SEB_CLIENT_CONFIG_VIEW, ActionCategory.FORM), SEB_CLIENT_CONFIG_SAVE( new LocTextKey("sebserver.clientconfig.action.save"), ImageIcon.SAVE, - PageStateDefinition.SEB_CLIENT_CONFIG_VIEW, + PageStateDefinitionImpl.SEB_CLIENT_CONFIG_VIEW, ActionCategory.FORM), SEB_CLIENT_CONFIG_ACTIVATE( new LocTextKey("sebserver.clientconfig.action.activate"), ImageIcon.TOGGLE_OFF, - PageStateDefinition.SEB_CLIENT_CONFIG_VIEW, + PageStateDefinitionImpl.SEB_CLIENT_CONFIG_VIEW, ActionCategory.FORM), SEB_CLIENT_CONFIG_DEACTIVATE( new LocTextKey("sebserver.clientconfig.action.deactivate"), ImageIcon.TOGGLE_ON, - PageStateDefinition.SEB_CLIENT_CONFIG_VIEW, + PageStateDefinitionImpl.SEB_CLIENT_CONFIG_VIEW, ActionCategory.FORM), SEB_CLIENT_CONFIG_EXPORT( new LocTextKey("sebserver.clientconfig.action.export"), ImageIcon.EXPORT, - PageStateDefinition.SEB_CLIENT_CONFIG_VIEW, + PageStateDefinitionImpl.SEB_CLIENT_CONFIG_VIEW, ActionCategory.FORM), SEB_EXAM_CONFIG_LIST( new LocTextKey("sebserver.examconfig.action.list"), - PageStateDefinition.SEB_EXAM_CONFIG_LIST), + PageStateDefinitionImpl.SEB_EXAM_CONFIG_LIST), SEB_EXAM_CONFIG_NEW( new LocTextKey("sebserver.examconfig.action.list.new"), ImageIcon.NEW, - PageStateDefinition.SEB_EXAM_CONFIG_PROP_EDIT), + PageStateDefinitionImpl.SEB_EXAM_CONFIG_PROP_EDIT), SEB_EXAM_CONFIG_VIEW_PROP_FROM_LIST( new LocTextKey("sebserver.examconfig.action.list.view"), ImageIcon.SHOW, - PageStateDefinition.SEB_EXAM_CONFIG_VIEW, + PageStateDefinitionImpl.SEB_EXAM_CONFIG_VIEW, ActionCategory.SEB_EXAM_CONFIG_LIST), SEB_EXAM_CONFIG_VIEW_PROP( new LocTextKey("sebserver.examconfig.action.view"), ImageIcon.SHOW, - PageStateDefinition.SEB_EXAM_CONFIG_VIEW, + PageStateDefinitionImpl.SEB_EXAM_CONFIG_VIEW, ActionCategory.FORM), SEB_EXAM_CONFIG_MODIFY_PROP_FROM_LIST( new LocTextKey("sebserver.examconfig.action.list.modify.properties"), ImageIcon.EDIT, - PageStateDefinition.SEB_EXAM_CONFIG_PROP_EDIT, + PageStateDefinitionImpl.SEB_EXAM_CONFIG_PROP_EDIT, ActionCategory.SEB_EXAM_CONFIG_LIST), SEB_EXAM_CONFIG_PROP_MODIFY( new LocTextKey("sebserver.examconfig.action.modify.properties"), ImageIcon.EDIT, - PageStateDefinition.SEB_EXAM_CONFIG_PROP_EDIT, + PageStateDefinitionImpl.SEB_EXAM_CONFIG_PROP_EDIT, ActionCategory.FORM), SEB_EXAM_CONFIG_MODIFY( new LocTextKey("sebserver.examconfig.action.modify"), ImageIcon.EDIT_SETTINGS, - PageStateDefinition.SEB_EXAM_CONFIG_EDIT, + PageStateDefinitionImpl.SEB_EXAM_CONFIG_EDIT, ActionCategory.FORM), SEB_EXAM_CONFIG_CANCEL_MODIFY( new LocTextKey("sebserver.overall.action.modify.cancel"), ImageIcon.CANCEL, - PageStateDefinition.SEB_EXAM_CONFIG_VIEW, + PageStateDefinitionImpl.SEB_EXAM_CONFIG_VIEW, ActionCategory.FORM), SEB_EXAM_CONFIG_SAVE( new LocTextKey("sebserver.examconfig.action.save"), ImageIcon.SAVE, - PageStateDefinition.SEB_EXAM_CONFIG_VIEW, + PageStateDefinitionImpl.SEB_EXAM_CONFIG_VIEW, ActionCategory.FORM), SEB_EXAM_CONFIG_EXPORT_PLAIN_XML( new LocTextKey("sebserver.examconfig.action.export.plainxml"), ImageIcon.EXPORT, - PageStateDefinition.SEB_EXAM_CONFIG_VIEW, + PageStateDefinitionImpl.SEB_EXAM_CONFIG_VIEW, ActionCategory.FORM), SEB_EXAM_CONFIG_GET_CONFIG_KEY( new LocTextKey("sebserver.examconfig.action.get-config-key"), @@ -397,42 +397,42 @@ public enum ActionDefinition { SEB_EXAM_CONFIG_MODIFY_FROM_LIST( new LocTextKey("sebserver.examconfig.action.list.modify"), ImageIcon.EDIT_SETTINGS, - PageStateDefinition.SEB_EXAM_CONFIG_EDIT, + PageStateDefinitionImpl.SEB_EXAM_CONFIG_EDIT, ActionCategory.SEB_EXAM_CONFIG_LIST), SEB_EXAM_CONFIG_SAVE_TO_HISTORY( new LocTextKey("sebserver.examconfig.action.saveToHistory"), ImageIcon.SAVE, - PageStateDefinition.SEB_EXAM_CONFIG_EDIT, + PageStateDefinitionImpl.SEB_EXAM_CONFIG_EDIT, ActionCategory.FORM), SEB_EXAM_CONFIG_UNDO( new LocTextKey("sebserver.examconfig.action.undo"), ImageIcon.UNDO, - PageStateDefinition.SEB_EXAM_CONFIG_EDIT, + PageStateDefinitionImpl.SEB_EXAM_CONFIG_EDIT, ActionCategory.FORM), RUNNING_EXAM_VIEW_LIST( new LocTextKey("sebserver.monitoring.action.list"), - PageStateDefinition.MONITORING_RUNNING_EXAM_LIST), + PageStateDefinitionImpl.MONITORING_RUNNING_EXAM_LIST), MONITOR_EXAM_FROM_LIST( new LocTextKey("sebserver.monitoring.exam.action.list.view"), ImageIcon.SHOW, - PageStateDefinition.MONITORING_RUNNING_EXAM, + PageStateDefinitionImpl.MONITORING_RUNNING_EXAM, ActionCategory.RUNNING_EXAM_LIST), MONITOR_CLIENT_CONNECTION( new LocTextKey("sebserver.monitoring.exam.connection.action.view"), ImageIcon.SHOW, - PageStateDefinition.MONITORING_CLIENT_CONNECTION, + PageStateDefinitionImpl.MONITORING_CLIENT_CONNECTION, ActionCategory.CLIENT_EVENT_LIST), MONITOR_EXAM_FROM_DETAILS( new LocTextKey("sebserver.monitoring.exam.action.detail.view"), ImageIcon.SHOW, - PageStateDefinition.MONITORING_RUNNING_EXAM, + PageStateDefinitionImpl.MONITORING_RUNNING_EXAM, ActionCategory.VARIA), LOGS_USER_ACTIVITY_LIST( new LocTextKey("sebserver.logs.activity.userlogs"), - PageStateDefinition.USER_ACTIVITY_LOGS), + PageStateDefinitionImpl.USER_ACTIVITY_LOGS), LOGS_USER_ACTIVITY_SHOW_DETAILS( new LocTextKey("sebserver.logs.activity.userlogs.details"), ImageIcon.SHOW, @@ -440,7 +440,7 @@ public enum ActionDefinition { LOGS_SEB_CLIENT( new LocTextKey("sebserver.logs.activity.seblogs"), - PageStateDefinition.SEB_CLIENT_LOGS), + PageStateDefinitionImpl.SEB_CLIENT_LOGS), LOGS_SEB_CLIENT_SHOW_DETAILS( new LocTextKey("sebserver.logs.activity.seblogs.details"), ImageIcon.SHOW, @@ -450,14 +450,14 @@ public enum ActionDefinition { public final LocTextKey title; public final ImageIcon icon; - public final PageState targetState; + public final PageStateDefinition targetState; public final ActionCategory category; - private ActionDefinition(final LocTextKey title, final PageState targetState) { + private ActionDefinition(final LocTextKey title, final PageStateDefinition targetState) { this(title, null, targetState, ActionCategory.VARIA); } - private ActionDefinition(final LocTextKey title, final ImageIcon icon, final PageState targetState) { + private ActionDefinition(final LocTextKey title, final ImageIcon icon, final PageStateDefinition targetState) { this(title, icon, targetState, ActionCategory.VARIA); } @@ -472,7 +472,7 @@ public enum ActionDefinition { private ActionDefinition( final LocTextKey title, final ImageIcon icon, - final PageState targetState, + final PageStateDefinition targetState, final ActionCategory category) { this.title = title; diff --git a/src/main/java/ch/ethz/seb/sebserver/gui/content/action/ActionPane.java b/src/main/java/ch/ethz/seb/sebserver/gui/content/action/ActionPane.java index 3bd4d6a4..f2590c37 100644 --- a/src/main/java/ch/ethz/seb/sebserver/gui/content/action/ActionPane.java +++ b/src/main/java/ch/ethz/seb/sebserver/gui/content/action/ActionPane.java @@ -119,10 +119,6 @@ public class ActionPane implements TemplateComposer { } } -// final Label labelSeparator = this.widgetFactory.labelSeparator(composite); -// final GridData separatorLayout = new GridData(SWT.FILL, SWT.TOP, true, false); -// labelSeparator.setLayoutData(separatorLayout); - // title if (category.title != null) { final Label actionsTitle = this.widgetFactory.labelLocalized( diff --git a/src/main/java/ch/ethz/seb/sebserver/gui/content/activity/ActivitiesPane.java b/src/main/java/ch/ethz/seb/sebserver/gui/content/activity/ActivitiesPane.java index e0838ee9..b581d84f 100644 --- a/src/main/java/ch/ethz/seb/sebserver/gui/content/activity/ActivitiesPane.java +++ b/src/main/java/ch/ethz/seb/sebserver/gui/content/activity/ActivitiesPane.java @@ -30,12 +30,12 @@ import ch.ethz.seb.sebserver.gui.service.page.PageContext; import ch.ethz.seb.sebserver.gui.service.page.PageContext.AttributeKeys; import ch.ethz.seb.sebserver.gui.service.page.PageService; import ch.ethz.seb.sebserver.gui.service.page.PageService.PageActionBuilder; -import ch.ethz.seb.sebserver.gui.service.page.PageState; import ch.ethz.seb.sebserver.gui.service.page.TemplateComposer; import ch.ethz.seb.sebserver.gui.service.page.event.ActionEvent; import ch.ethz.seb.sebserver.gui.service.page.event.ActionEventListener; import ch.ethz.seb.sebserver.gui.service.page.event.PageEventListener; import ch.ethz.seb.sebserver.gui.service.page.impl.PageAction; +import ch.ethz.seb.sebserver.gui.service.page.impl.PageState; import ch.ethz.seb.sebserver.gui.service.remote.webservice.auth.CurrentUser; import ch.ethz.seb.sebserver.gui.widget.WidgetFactory; import ch.ethz.seb.sebserver.gui.widget.WidgetFactory.CustomVariant; @@ -351,7 +351,7 @@ public class ActivitiesPane implements TemplateComposer { } else { final TreeItem item = findItemByActionDefinition( navigation.getItems(), - state.activityAnchor()); + state.definition.activityAnchor()); if (item != null) { final PageAction action = getActivitySelection(item); this.pageService.executePageAction(action, result -> { @@ -379,9 +379,12 @@ public class ActivitiesPane implements TemplateComposer { private void selectCurrentItem(final Tree navigation, final TreeItem item) { final PageState currentState = this.pageService.getCurrentState(); + if (currentState == null) { + return; + } final TreeItem currentItem = findItemByActionDefinition( item.getItems(), - currentState.activityAnchor()); + currentState.definition.activityAnchor()); if (currentItem != null) { navigation.select(currentItem); } @@ -403,7 +406,7 @@ public class ActivitiesPane implements TemplateComposer { } final PageState currentState = this.pageService.getCurrentState(); - if (currentState == action.definition.targetState) { + if (currentState != null && currentState.definition == action.definition.targetState) { return; } diff --git a/src/main/java/ch/ethz/seb/sebserver/gui/content/activity/PageStateDefinition.java b/src/main/java/ch/ethz/seb/sebserver/gui/content/activity/PageStateDefinitionImpl.java similarity index 94% rename from src/main/java/ch/ethz/seb/sebserver/gui/content/activity/PageStateDefinition.java rename to src/main/java/ch/ethz/seb/sebserver/gui/content/activity/PageStateDefinitionImpl.java index 77fb4e25..8692e2b7 100644 --- a/src/main/java/ch/ethz/seb/sebserver/gui/content/activity/PageStateDefinition.java +++ b/src/main/java/ch/ethz/seb/sebserver/gui/content/activity/PageStateDefinitionImpl.java @@ -32,10 +32,10 @@ import ch.ethz.seb.sebserver.gui.content.UserAccountList; import ch.ethz.seb.sebserver.gui.content.UserActivityLogs; import ch.ethz.seb.sebserver.gui.content.action.ActionPane; import ch.ethz.seb.sebserver.gui.service.page.Activity; -import ch.ethz.seb.sebserver.gui.service.page.PageState; +import ch.ethz.seb.sebserver.gui.service.page.PageStateDefinition; import ch.ethz.seb.sebserver.gui.service.page.TemplateComposer; -public enum PageStateDefinition implements PageState { +public enum PageStateDefinitionImpl implements PageStateDefinition { INSTITUTION_LIST(Type.LIST_VIEW, InstitutionList.class, ActivityDefinition.INSTITUTION), INSTITUTION_VIEW(Type.FORM_VIEW, InstitutionForm.class, ActivityDefinition.INSTITUTION), @@ -81,7 +81,7 @@ public enum PageStateDefinition implements PageState { public final Class actionPaneComposer; public final Activity activityAnchor; - private PageStateDefinition( + private PageStateDefinitionImpl( final Type type, final Class contentPaneComposer, final Activity activityAnchor) { @@ -89,7 +89,7 @@ public enum PageStateDefinition implements PageState { this(type, contentPaneComposer, ActionPane.class, activityAnchor); } - private PageStateDefinition( + private PageStateDefinitionImpl( final Type type, final Class contentPaneComposer, final Class actionPaneComposer, diff --git a/src/main/java/ch/ethz/seb/sebserver/gui/service/page/PageService.java b/src/main/java/ch/ethz/seb/sebserver/gui/service/page/PageService.java index 6f384782..47dfd64f 100644 --- a/src/main/java/ch/ethz/seb/sebserver/gui/service/page/PageService.java +++ b/src/main/java/ch/ethz/seb/sebserver/gui/service/page/PageService.java @@ -38,6 +38,7 @@ import ch.ethz.seb.sebserver.gui.service.i18n.PolyglotPageService; import ch.ethz.seb.sebserver.gui.service.page.PageContext.AttributeKeys; import ch.ethz.seb.sebserver.gui.service.page.event.PageEvent; import ch.ethz.seb.sebserver.gui.service.page.impl.PageAction; +import ch.ethz.seb.sebserver.gui.service.page.impl.PageState; import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.RestCall; import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.RestService; import ch.ethz.seb.sebserver.gui.service.remote.webservice.auth.AuthorizationContextHolder; @@ -85,6 +86,14 @@ public interface PageService { * @return PageState of the current user. */ PageState getCurrentState(); + /** Get a PageAction function to go back to the current state. + * + * @return a PageAction function to go back to the current state. */ + default Function backToCurrentFunction() { + final PageState currentState = this.getCurrentState(); + return action -> (currentState != null) ? currentState.gotoAction : action; + } + /** Publishes a given PageEvent to the current page tree * This goes through the page-tree and collects all listeners the are listen to * the specified page event type. @@ -151,17 +160,6 @@ public interface PageService { /** Clears the PageState of the current users page */ void clearState(); - default PageAction onEmptyEntityKeyGoTo(final PageAction action, final ActionDefinition gotoActionDef) { - if (action.getEntityKey() == null) { - final PageContext pageContext = action.pageContext(); - return pageActionBuilder(pageContext) - .newAction(gotoActionDef) - .create(); - } - - return action; - } - /** Key to store the ScrolledComposite update function within Control data map */ static String SCROLLED_COMPOSITE_UPDATE = "SCROLLED_COMPOSITE_UPDATE"; diff --git a/src/main/java/ch/ethz/seb/sebserver/gui/service/page/PageState.java b/src/main/java/ch/ethz/seb/sebserver/gui/service/page/PageStateDefinition.java similarity index 90% rename from src/main/java/ch/ethz/seb/sebserver/gui/service/page/PageState.java rename to src/main/java/ch/ethz/seb/sebserver/gui/service/page/PageStateDefinition.java index ca743d22..a4494b37 100644 --- a/src/main/java/ch/ethz/seb/sebserver/gui/service/page/PageState.java +++ b/src/main/java/ch/ethz/seb/sebserver/gui/service/page/PageStateDefinition.java @@ -8,7 +8,7 @@ package ch.ethz.seb.sebserver.gui.service.page; -public interface PageState { +public interface PageStateDefinition { enum Type { UNDEFINED, diff --git a/src/main/java/ch/ethz/seb/sebserver/gui/service/page/impl/ComposerServiceImpl.java b/src/main/java/ch/ethz/seb/sebserver/gui/service/page/impl/ComposerServiceImpl.java index aca472d3..4a62563b 100644 --- a/src/main/java/ch/ethz/seb/sebserver/gui/service/page/impl/ComposerServiceImpl.java +++ b/src/main/java/ch/ethz/seb/sebserver/gui/service/page/impl/ComposerServiceImpl.java @@ -120,6 +120,9 @@ public class ComposerServiceImpl implements ComposerService { try { composer.compose(pageContext); PageService.updateScrolledComposite(pageContext.getParent()); + } catch (final RuntimeException e) { + log.warn("Failed to compose: {}, pageContext: {}", name, pageContext, e); + throw e; } catch (final Exception e) { log.error("Failed to compose: {}, pageContext: {}", name, pageContext, e); } diff --git a/src/main/java/ch/ethz/seb/sebserver/gui/service/page/impl/PageAction.java b/src/main/java/ch/ethz/seb/sebserver/gui/service/page/impl/PageAction.java index c2aef318..7f3df45c 100644 --- a/src/main/java/ch/ethz/seb/sebserver/gui/service/page/impl/PageAction.java +++ b/src/main/java/ch/ethz/seb/sebserver/gui/service/page/impl/PageAction.java @@ -24,7 +24,7 @@ import ch.ethz.seb.sebserver.gui.service.i18n.LocTextKey; import ch.ethz.seb.sebserver.gui.service.page.PageContext; import ch.ethz.seb.sebserver.gui.service.page.PageContext.AttributeKeys; import ch.ethz.seb.sebserver.gui.service.page.PageMessageException; -import ch.ethz.seb.sebserver.gui.service.page.PageState.Type; +import ch.ethz.seb.sebserver.gui.service.page.PageStateDefinition.Type; import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.RestCallError; public final class PageAction { diff --git a/src/main/java/ch/ethz/seb/sebserver/gui/service/page/impl/PageServiceImpl.java b/src/main/java/ch/ethz/seb/sebserver/gui/service/page/impl/PageServiceImpl.java index 9b4b561b..73eff81c 100644 --- a/src/main/java/ch/ethz/seb/sebserver/gui/service/page/impl/PageServiceImpl.java +++ b/src/main/java/ch/ethz/seb/sebserver/gui/service/page/impl/PageServiceImpl.java @@ -35,8 +35,7 @@ import ch.ethz.seb.sebserver.gui.service.i18n.PolyglotPageService; import ch.ethz.seb.sebserver.gui.service.page.ComposerService; import ch.ethz.seb.sebserver.gui.service.page.PageContext; import ch.ethz.seb.sebserver.gui.service.page.PageService; -import ch.ethz.seb.sebserver.gui.service.page.PageState; -import ch.ethz.seb.sebserver.gui.service.page.PageState.Type; +import ch.ethz.seb.sebserver.gui.service.page.PageStateDefinition.Type; import ch.ethz.seb.sebserver.gui.service.page.event.ActionEvent; import ch.ethz.seb.sebserver.gui.service.page.event.ActionPublishEvent; import ch.ethz.seb.sebserver.gui.service.page.event.PageEvent; @@ -178,28 +177,26 @@ public class PageServiceImpl implements PageService { private void exec(final PageAction pageAction, final Consumer> callback) { pageAction.applyAction(result -> { if (!result.hasError()) { + final PageAction action = result.get(); if (pageAction.fireActionEvent) { firePageEvent(new ActionEvent(action), action.pageContext()); } try { - final HttpSession httpSession = RWT .getUISession() .getHttpSession(); - log.debug("Set session PageState: {} : {}", pageAction.definition.targetState, httpSession.getId()); - httpSession.setAttribute(ATTR_PAGE_STATE, pageAction.definition.targetState); - + final PageState pageState = new PageState(action.definition.targetState, action); + log.debug("Set session PageState: {} : {}", pageState, httpSession.getId()); + httpSession.setAttribute(ATTR_PAGE_STATE, pageState); } catch (final Exception e) { log.error("Failed to set current PageState: ", e); } - } callback.accept(result); }); - } @Override diff --git a/src/main/java/ch/ethz/seb/sebserver/gui/service/page/impl/PageState.java b/src/main/java/ch/ethz/seb/sebserver/gui/service/page/impl/PageState.java new file mode 100644 index 00000000..822173b5 --- /dev/null +++ b/src/main/java/ch/ethz/seb/sebserver/gui/service/page/impl/PageState.java @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2019 ETH Zürich, Educational Development and Technology (LET) + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +package ch.ethz.seb.sebserver.gui.service.page.impl; + +import ch.ethz.seb.sebserver.gui.service.page.Activity; +import ch.ethz.seb.sebserver.gui.service.page.PageStateDefinition; +import ch.ethz.seb.sebserver.gui.service.page.PageStateDefinition.Type; + +public final class PageState { + + public final PageStateDefinition definition; + public final PageAction gotoAction; + + PageState(final PageStateDefinition definition, final PageAction goToAction) { + super(); + this.definition = definition; + this.gotoAction = goToAction; + } + + public PageStateDefinition getDefinition() { + return this.definition; + } + + public PageAction getGotoAction() { + return this.gotoAction; + } + + public Type type() { + return this.definition.type(); + } + + public Activity activityAnchor() { + return this.definition.activityAnchor(); + } + + @Override + public String toString() { + final StringBuilder builder = new StringBuilder(); + builder.append("PageState [definition="); + builder.append(this.definition); + builder.append(", gotoAction="); + builder.append(this.gotoAction); + builder.append("]"); + return builder.toString(); + } + +} diff --git a/src/main/resources/messages.properties b/src/main/resources/messages.properties index 35c12a68..ba914367 100644 --- a/src/main/resources/messages.properties +++ b/src/main/resources/messages.properties @@ -170,6 +170,7 @@ sebserver.useraccount.action.change.password=Change Password sebserver.useraccount.action.change.password.save=Save New Password sebserver.useraccount.info.pleaseSelect=Please Select a User Account first. +sebserver.useraccount.info.notEditable=You have no edit rights for this User Account. sebserver.useraccount.form.title=User Account sebserver.useraccount.form.title.new=New User Account