From a49640d9fcffdd78b2db2a4cc48b9b125e048925 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Agneray?= <francois.agneray@lam.fr> Date: Tue, 20 Sep 2022 14:21:17 +0200 Subject: [PATCH] #70 => done --- .../components/instance-form.component.html | 4 + .../components/instance-form.component.ts | 1 + .../components/instance-navbar.component.html | 124 +++++++++--------- .../app/instance/instance.component.spec.ts | 1 + .../components/progress-bar.component.spec.ts | 2 + .../effects/search-multiple.effects.spec.ts | 2 + .../app/metamodel/models/instance.model.ts | 1 + client/src/test-data.ts | 3 + docker-compose.yml | 2 +- .../__CG__AppEntityInstance.php | 26 +++- server/src/Action/InstanceAction.php | 2 + server/src/Action/InstanceListAction.php | 2 + server/src/Entity/Instance.php | 18 +++ server/tests/Action/InstanceActionTest.php | 1 + .../tests/Action/InstanceListActionTest.php | 1 + 15 files changed, 127 insertions(+), 63 deletions(-) diff --git a/client/src/app/admin/instance/components/instance-form.component.html b/client/src/app/admin/instance/components/instance-form.component.html index 604a1d43..cfed0c6a 100644 --- a/client/src/app/admin/instance/components/instance-form.component.html +++ b/client/src/app/admin/instance/components/instance-form.component.html @@ -169,6 +169,10 @@ <input class="custom-control-input" type="checkbox" id="back_to_portal" name="back_to_portal" formControlName="back_to_portal"> <label class="custom-control-label" for="back_to_portal">Back to portal</label> </div> + <div class="custom-control custom-switch mb-2"> + <input class="custom-control-input" type="checkbox" id="user_menu_enabled" name="user_menu_enabled" formControlName="user_menu_enabled"> + <label class="custom-control-label" for="user_menu_enabled">User menu enabled</label> + </div> <div class="custom-control custom-switch mb-2"> <input class="custom-control-input" type="checkbox" id="search_by_criteria_allowed" name="search_by_criteria_allowed" formControlName="search_by_criteria_allowed" (change)="checkDisableSearchByCriteriaAllowed()"> <label class="custom-control-label" for="search_by_criteria_allowed">Classic search allowed</label> diff --git a/client/src/app/admin/instance/components/instance-form.component.ts b/client/src/app/admin/instance/components/instance-form.component.ts index 2dd39b3b..7bba768b 100644 --- a/client/src/app/admin/instance/components/instance-form.component.ts +++ b/client/src/app/admin/instance/components/instance-form.component.ts @@ -48,6 +48,7 @@ export class InstanceFormComponent implements OnInit { family_color: new UntypedFormControl('#212529'), samp_enabled: new UntypedFormControl(true), back_to_portal: new UntypedFormControl(true), + user_menu_enabled: new UntypedFormControl(true), search_by_criteria_allowed: new UntypedFormControl(true), search_by_criteria_label: new UntypedFormControl({value: 'Search', disabled: false}), search_multiple_allowed: new UntypedFormControl(false), diff --git a/client/src/app/instance/components/instance-navbar.component.html b/client/src/app/instance/components/instance-navbar.component.html index aa363e91..4ebd6d99 100644 --- a/client/src/app/instance/components/instance-navbar.component.html +++ b/client/src/app/instance/components/instance-navbar.component.html @@ -43,42 +43,44 @@ </li> </ul> <!-- sign in / sign out --> - <button *ngIf="authenticationEnabled && !isAuthenticated" - class="btn btn-outline-success my-2 my-sm-0" - id="button-sign-in" - (click)="login.emit()"> - Sign In / Register - </button> - <span *ngIf="isAuthenticated" id="dropdown-menu" dropdown> - <button id="button-basic" dropdownToggle type="button" class="btn btn-light" aria-controls="dropdown-basic"> - <span class="fa-stack" [ngStyle]="{ color: instance.design_color }"> - <span class="fas fa-circle fa-2x"></span> - <span class="fas fa-user fa-stack-1x fa-inverse"></span> - </span> - - <span class="fas fa-chevron-down text-secondary"></span> + <ng-container *ngIf="instance.user_menu_enabled"> + <button *ngIf="authenticationEnabled && !isAuthenticated" + class="btn btn-outline-success my-2 my-sm-0" + id="button-sign-in" + (click)="login.emit()"> + Sign In / Register </button> - <ul id="basic-link-dropdown" *dropdownMenu class="dropdown-menu dropdown-menu-right dropdown-up" role="menu" aria-labelledby="basic-link"> - <li id="li-email" role="menuitem"> - <span class="dropdown-item font-italic">{{ userProfile.email }}</span> - </li> - <li class="divider dropdown-divider"></li> - <li role="menuitem"> - <a *ngIf="isAdmin()" class="dropdown-item pointer" routerLink="/admin"> - <span class="fas fa-tools"></span> Admin - </a> - <a class="dropdown-item pointer" (click)="openEditProfile.emit()"> - <span class="fas fa-id-card"></span> Edit profile - </a> - </li> - <li class="divider dropdown-divider"></li> - <li role="menuitem"> - <a class="dropdown-item text-danger pointer" (click)="logout.emit()"> - <span class="fas fa-sign-out-alt fa-fw"></span> Sign Out - </a> - </li> - </ul> - </span> + <span *ngIf="isAuthenticated" id="dropdown-menu" dropdown> + <button id="button-basic" dropdownToggle type="button" class="btn btn-light" aria-controls="dropdown-basic"> + <span class="fa-stack" [ngStyle]="{ color: instance.design_color }"> + <span class="fas fa-circle fa-2x"></span> + <span class="fas fa-user fa-stack-1x fa-inverse"></span> + </span> + + <span class="fas fa-chevron-down text-secondary"></span> + </button> + <ul id="basic-link-dropdown" *dropdownMenu class="dropdown-menu dropdown-menu-right dropdown-up" role="menu" aria-labelledby="basic-link"> + <li id="li-email" role="menuitem"> + <span class="dropdown-item font-italic">{{ userProfile.email }}</span> + </li> + <li class="divider dropdown-divider"></li> + <li role="menuitem"> + <a *ngIf="isAdmin()" class="dropdown-item pointer" routerLink="/admin"> + <span class="fas fa-tools"></span> Admin + </a> + <a class="dropdown-item pointer" (click)="openEditProfile.emit()"> + <span class="fas fa-id-card"></span> Edit profile + </a> + </li> + <li class="divider dropdown-divider"></li> + <li role="menuitem"> + <a class="dropdown-item text-danger pointer" (click)="logout.emit()"> + <span class="fas fa-sign-out-alt fa-fw"></span> Sign Out + </a> + </li> + </ul> + </span> + </ng-container> </div> <!-- Navigation Mobile --> @@ -117,31 +119,33 @@ <span class="fa-solid fa-right-to-bracket fa-fw"></span> Back to portal </a> </li> - <li *ngIf="isAuthenticated || !authenticationEnabled" class="divider dropdown-divider"></li> - <li *ngIf="!authenticationEnabled" role="menuitem"> - <a class="dropdown-item pointer" routerLink="/admin"> - <span class="fas fa-tools"></span> Admin - </a> - </li> - <li *ngIf="isAuthenticated" role="menuitem"> - <a *ngIf="isAdmin()" class="dropdown-item pointer" routerLink="/admin"> - <span class="fas fa-tools"></span> Admin - </a> - <a class="dropdown-item pointer" (click)="openEditProfile.emit()"> - <span class="fas fa-id-card"></span> Edit profile - </a> - </li> - <li *ngIf="authenticationEnabled" class="divider dropdown-divider"></li> - <li *ngIf="authenticationEnabled && !isAuthenticated" role="menuitem"> - <a class="dropdown-item pointer text-success" (click)="login.emit()"> - <span class="fas fa-sign-in-alt fa-fw"></span> Sign In / Register - </a> - </li> - <li *ngIf="isAuthenticated" role="menuitem"> - <a class="dropdown-item pointer text-danger" (click)="logout.emit()"> - <span class="fas fa-sign-out-alt fa-fw"></span> Sign Out - </a> - </li> + <ng-container *ngIf="instance.user_menu_enabled"> + <li *ngIf="isAuthenticated || !authenticationEnabled" class="divider dropdown-divider"></li> + <li *ngIf="!authenticationEnabled" role="menuitem"> + <a class="dropdown-item pointer" routerLink="/admin"> + <span class="fas fa-tools"></span> Admin + </a> + </li> + <li *ngIf="isAuthenticated" role="menuitem"> + <a *ngIf="isAdmin()" class="dropdown-item pointer" routerLink="/admin"> + <span class="fas fa-tools"></span> Admin + </a> + <a class="dropdown-item pointer" (click)="openEditProfile.emit()"> + <span class="fas fa-id-card"></span> Edit profile + </a> + </li> + <li *ngIf="authenticationEnabled" class="divider dropdown-divider"></li> + <li *ngIf="authenticationEnabled && !isAuthenticated" role="menuitem"> + <a class="dropdown-item pointer text-success" (click)="login.emit()"> + <span class="fas fa-sign-in-alt fa-fw"></span> Sign In / Register + </a> + </li> + <li *ngIf="isAuthenticated" role="menuitem"> + <a class="dropdown-item pointer text-danger" (click)="logout.emit()"> + <span class="fas fa-sign-out-alt fa-fw"></span> Sign Out + </a> + </li> + </ng-container> </ul> </span> </nav> diff --git a/client/src/app/instance/instance.component.spec.ts b/client/src/app/instance/instance.component.spec.ts index f7ba23e2..d42a9466 100644 --- a/client/src/app/instance/instance.component.spec.ts +++ b/client/src/app/instance/instance.component.spec.ts @@ -97,6 +97,7 @@ describe('[Instance] InstanceComponent', () => { family_color: '#212529', samp_enabled: true, back_to_portal: true, + user_menu_enabled: true, search_by_criteria_allowed: true, search_by_criteria_label: 'Search', search_multiple_allowed: true, diff --git a/client/src/app/instance/search/components/progress-bar.component.spec.ts b/client/src/app/instance/search/components/progress-bar.component.spec.ts index f50af2db..d75a7021 100644 --- a/client/src/app/instance/search/components/progress-bar.component.spec.ts +++ b/client/src/app/instance/search/components/progress-bar.component.spec.ts @@ -70,6 +70,7 @@ describe('[Instance][Search][Component] ProgressBarComponent', () => { family_color: '#212529', samp_enabled: true, back_to_portal: true, + user_menu_enabled: true, search_by_criteria_allowed: true, search_by_criteria_label: 'Search', search_multiple_allowed: true, @@ -109,6 +110,7 @@ describe('[Instance][Search][Component] ProgressBarComponent', () => { family_color: '#212529', samp_enabled: true, back_to_portal: true, + user_menu_enabled: true, search_by_criteria_allowed: true, search_by_criteria_label: 'Search', search_multiple_allowed: true, diff --git a/client/src/app/instance/store/effects/search-multiple.effects.spec.ts b/client/src/app/instance/store/effects/search-multiple.effects.spec.ts index b95c1cc9..2879c200 100644 --- a/client/src/app/instance/store/effects/search-multiple.effects.spec.ts +++ b/client/src/app/instance/store/effects/search-multiple.effects.spec.ts @@ -152,6 +152,7 @@ describe('[Instance][Store] SearchMultipleEffects', () => { family_color: '#212529', samp_enabled: true, back_to_portal: true, + user_menu_enabled: true, search_by_criteria_allowed: true, search_by_criteria_label: 'Search', search_multiple_allowed: true, @@ -234,6 +235,7 @@ describe('[Instance][Store] SearchMultipleEffects', () => { family_color: '#212529', samp_enabled: true, back_to_portal: true, + user_menu_enabled: true, search_by_criteria_allowed: true, search_by_criteria_label: 'Search', search_multiple_allowed: true, diff --git a/client/src/app/metamodel/models/instance.model.ts b/client/src/app/metamodel/models/instance.model.ts index a0ea62db..88d70938 100644 --- a/client/src/app/metamodel/models/instance.model.ts +++ b/client/src/app/metamodel/models/instance.model.ts @@ -35,6 +35,7 @@ export interface Instance { family_color: string; samp_enabled: boolean; back_to_portal: boolean; + user_menu_enabled: boolean; search_by_criteria_allowed: boolean; search_by_criteria_label: string; search_multiple_allowed: boolean; diff --git a/client/src/test-data.ts b/client/src/test-data.ts index 3f4b0354..2ee794d5 100644 --- a/client/src/test-data.ts +++ b/client/src/test-data.ts @@ -67,6 +67,7 @@ export const INSTANCE_LIST: Instance[] = [ family_color: '#212529', samp_enabled: true, back_to_portal: true, + user_menu_enabled: true, search_by_criteria_allowed: false, search_by_criteria_label: 'Search', search_multiple_allowed: false, @@ -100,6 +101,7 @@ export const INSTANCE_LIST: Instance[] = [ family_color: '#212529', samp_enabled: true, back_to_portal: true, + user_menu_enabled: true, search_by_criteria_allowed: false, search_by_criteria_label: 'Search', search_multiple_allowed: false, @@ -135,6 +137,7 @@ export const INSTANCE: Instance = { family_color: '#212529', samp_enabled: true, back_to_portal: true, + user_menu_enabled: true, search_by_criteria_allowed: false, search_by_criteria_label: 'Search', search_multiple_allowed: false, diff --git a/docker-compose.yml b/docker-compose.yml index 4ef7a61b..dcb400ff 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -35,7 +35,7 @@ services: SSO_AUTH_URL: "http://localhost:8180" SSO_REALM: "anis" SSO_CLIENT_ID: "anis-client" - TOKEN_ENABLED: 0 + TOKEN_ENABLED: 1 TOKEN_JWKS_URL: "http://keycloak:8180/realms/anis/protocol/openid-connect/certs" TOKEN_ADMIN_ROLES: anis_admin,superuser RMQ_HOST: rmq diff --git a/server/doctrine-proxy/__CG__AppEntityInstance.php b/server/doctrine-proxy/__CG__AppEntityInstance.php index d830aa78..4a88f09a 100644 --- a/server/doctrine-proxy/__CG__AppEntityInstance.php +++ b/server/doctrine-proxy/__CG__AppEntityInstance.php @@ -67,10 +67,10 @@ class Instance extends \App\Entity\Instance implements \Doctrine\ORM\Proxy\Proxy public function __sleep() { if ($this->__isInitialized__) { - return ['__isInitialized__', 'name', 'label', 'description', 'scientificManager', 'instrument', 'wavelengthDomain', 'display', 'dataPath', 'filesPath', 'public', 'portalLogo', 'designColor', 'designBackgroundColor', 'designLogo', 'designFavicon', 'familyBorderColor', 'familyHeaderBackgroundColor', 'familyTitleColor', 'familyTitleBold', 'familyColor', 'sampEnabled', 'backToPortal', 'searchByCriteriaAllowed', 'searchByCriteriaLabel', 'searchMultipleAllowed', 'searchMultipleLabel', 'searchMultipleAllDatasetsSelected', 'documentationAllowed', 'documentationLabel', 'datasetFamilies']; + return ['__isInitialized__', 'name', 'label', 'description', 'scientificManager', 'instrument', 'wavelengthDomain', 'display', 'dataPath', 'filesPath', 'public', 'portalLogo', 'designColor', 'designBackgroundColor', 'designLogo', 'designFavicon', 'familyBorderColor', 'familyHeaderBackgroundColor', 'familyTitleColor', 'familyTitleBold', 'familyColor', 'sampEnabled', 'backToPortal', 'userMenuEnabled', 'searchByCriteriaAllowed', 'searchByCriteriaLabel', 'searchMultipleAllowed', 'searchMultipleLabel', 'searchMultipleAllDatasetsSelected', 'documentationAllowed', 'documentationLabel', 'datasetFamilies']; } - return ['__isInitialized__', 'name', 'label', 'description', 'scientificManager', 'instrument', 'wavelengthDomain', 'display', 'dataPath', 'filesPath', 'public', 'portalLogo', 'designColor', 'designBackgroundColor', 'designLogo', 'designFavicon', 'familyBorderColor', 'familyHeaderBackgroundColor', 'familyTitleColor', 'familyTitleBold', 'familyColor', 'sampEnabled', 'backToPortal', 'searchByCriteriaAllowed', 'searchByCriteriaLabel', 'searchMultipleAllowed', 'searchMultipleLabel', 'searchMultipleAllDatasetsSelected', 'documentationAllowed', 'documentationLabel', 'datasetFamilies']; + return ['__isInitialized__', 'name', 'label', 'description', 'scientificManager', 'instrument', 'wavelengthDomain', 'display', 'dataPath', 'filesPath', 'public', 'portalLogo', 'designColor', 'designBackgroundColor', 'designLogo', 'designFavicon', 'familyBorderColor', 'familyHeaderBackgroundColor', 'familyTitleColor', 'familyTitleBold', 'familyColor', 'sampEnabled', 'backToPortal', 'userMenuEnabled', 'searchByCriteriaAllowed', 'searchByCriteriaLabel', 'searchMultipleAllowed', 'searchMultipleLabel', 'searchMultipleAllDatasetsSelected', 'documentationAllowed', 'documentationLabel', 'datasetFamilies']; } /** @@ -654,6 +654,28 @@ class Instance extends \App\Entity\Instance implements \Doctrine\ORM\Proxy\Proxy return parent::setBackToPortal($backToPortal); } + /** + * {@inheritDoc} + */ + public function getUserMenuEnabled() + { + + $this->__initializer__ && $this->__initializer__->__invoke($this, 'getUserMenuEnabled', []); + + return parent::getUserMenuEnabled(); + } + + /** + * {@inheritDoc} + */ + public function setUserMenuEnabled($userMenuEnabled) + { + + $this->__initializer__ && $this->__initializer__->__invoke($this, 'setUserMenuEnabled', [$userMenuEnabled]); + + return parent::setUserMenuEnabled($userMenuEnabled); + } + /** * {@inheritDoc} */ diff --git a/server/src/Action/InstanceAction.php b/server/src/Action/InstanceAction.php index dd4d14d7..269a4c5b 100644 --- a/server/src/Action/InstanceAction.php +++ b/server/src/Action/InstanceAction.php @@ -85,6 +85,7 @@ final class InstanceAction extends AbstractAction 'family_color', 'samp_enabled', 'back_to_portal', + 'user_menu_enabled', 'search_by_criteria_allowed', 'search_by_criteria_label', 'search_multiple_allowed', @@ -147,6 +148,7 @@ final class InstanceAction extends AbstractAction $instance->setFamilyTitleBold($parsedBody['family_title_bold']); $instance->setFamilyColor($parsedBody['family_color']); $instance->setSampEnabled($parsedBody['samp_enabled']); + $instance->setUserMenuEnabled($parsedBody['user_menu_enabled']); $instance->setBackToPortal($parsedBody['back_to_portal']); $instance->setSearchByCriteriaAllowed($parsedBody['search_by_criteria_allowed']); $instance->setSearchByCriteriaLabel($parsedBody['search_by_criteria_label']); diff --git a/server/src/Action/InstanceListAction.php b/server/src/Action/InstanceListAction.php index 4ba09706..c1e94a2d 100644 --- a/server/src/Action/InstanceListAction.php +++ b/server/src/Action/InstanceListAction.php @@ -85,6 +85,7 @@ final class InstanceListAction extends AbstractAction 'family_color', 'samp_enabled', 'back_to_portal', + 'user_menu_enabled', 'search_by_criteria_allowed', 'search_by_criteria_label', 'search_multiple_allowed', @@ -142,6 +143,7 @@ final class InstanceListAction extends AbstractAction $instance->setFamilyColor($parsedBody['family_color']); $instance->setSampEnabled($parsedBody['samp_enabled']); $instance->setBackToPortal($parsedBody['back_to_portal']); + $instance->setUserMenuEnabled($parsedBody['user_menu_enabled']); $instance->setSearchByCriteriaAllowed($parsedBody['search_by_criteria_allowed']); $instance->setSearchByCriteriaLabel($parsedBody['search_by_criteria_label']); $instance->setSearchMultipleAllowed($parsedBody['search_multiple_allowed']); diff --git a/server/src/Entity/Instance.php b/server/src/Entity/Instance.php index bed8205d..e320d1e9 100644 --- a/server/src/Entity/Instance.php +++ b/server/src/Entity/Instance.php @@ -178,6 +178,13 @@ class Instance implements \JsonSerializable */ protected $backToPortal; + /** + * @var bool + * + * @Column(type="boolean", name="user_menu_enabled", nullable=false, options={"default" : true}) + */ + protected $userMenuEnabled; + /** * @var bool * @@ -456,6 +463,16 @@ class Instance implements \JsonSerializable $this->backToPortal = $backToPortal; } + public function getUserMenuEnabled() + { + return $this->userMenuEnabled; + } + + public function setUserMenuEnabled($userMenuEnabled) + { + $this->userMenuEnabled = $userMenuEnabled; + } + public function getSearchByCriteriaAllowed() { return $this->searchByCriteriaAllowed; @@ -565,6 +582,7 @@ class Instance implements \JsonSerializable 'family_color' => $this->getFamilyColor(), 'samp_enabled' => $this->getSampEnabled(), 'back_to_portal' => $this->getBackToPortal(), + 'user_menu_enabled' => $this->getUserMenuEnabled(), 'search_by_criteria_allowed' => $this->getSearchByCriteriaAllowed(), 'search_by_criteria_label' => $this->getSearchByCriteriaLabel(), 'search_multiple_allowed' => $this->getSearchMultipleAllowed(), diff --git a/server/tests/Action/InstanceActionTest.php b/server/tests/Action/InstanceActionTest.php index 577c10a3..1f4fecec 100644 --- a/server/tests/Action/InstanceActionTest.php +++ b/server/tests/Action/InstanceActionTest.php @@ -101,6 +101,7 @@ final class InstanceActionTest extends TestCase 'home_component_config' => '{}', 'samp_enabled' => true, 'back_to_portal' => true, + 'user_menu_enabled' => true, 'search_by_criteria_allowed' => true, 'search_by_criteria_label' => 'Search', 'search_multiple_allowed' => false, diff --git a/server/tests/Action/InstanceListActionTest.php b/server/tests/Action/InstanceListActionTest.php index 7fad3b78..f6311699 100644 --- a/server/tests/Action/InstanceListActionTest.php +++ b/server/tests/Action/InstanceListActionTest.php @@ -85,6 +85,7 @@ final class InstanceListActionTest extends TestCase 'home_component_config' => '{}', 'samp_enabled' => true, 'back_to_portal' => true, + 'user_menu_enabled' => true, 'search_by_criteria_allowed' => true, 'search_by_criteria_label' => 'Search', 'search_multiple_allowed' => false, -- GitLab