From aec7051c6887df962622c143ec8db5b5865170ab Mon Sep 17 00:00:00 2001 From: Andrey Shaveko Date: Mon, 3 Jun 2024 12:12:05 +0200 Subject: [PATCH 01/12] fix: empty dropdown --- views/templates/blocks/header-main-navi.tpl | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/views/templates/blocks/header-main-navi.tpl b/views/templates/blocks/header-main-navi.tpl index a0c9b064da..b624f34ba5 100644 --- a/views/templates/blocks/header-main-navi.tpl +++ b/views/templates/blocks/header-main-navi.tpl @@ -84,9 +84,11 @@ $taoAsATool = get_data('taoAsATool'); getId() === 'user_settings'): ?> - + get_data('logout')])) : ?> + + From 2ece31ec20f4f9cefd7a3cb26d963f1c6a129737 Mon Sep 17 00:00:00 2001 From: Nevermind23 Date: Tue, 11 Jun 2024 01:32:41 +0400 Subject: [PATCH 02/12] chore: Add interface mode option to the form --- actions/class.UserSettings.php | 13 ++++++++ actions/form/class.UserSettings.php | 33 +++++++++++++++++++ .../classes/menu/SectionVisibilityFilter.php | 18 ++++++++++ .../classes/user/UserSettingsFormFactory.php | 4 +++ models/classes/user/UserSettingsInterface.php | 6 ++++ .../user/implementation/UserSettings.php | 13 ++++++++ .../implementation/UserSettingsService.php | 31 +++++++++++++++-- 7 files changed, 115 insertions(+), 3 deletions(-) diff --git a/actions/class.UserSettings.php b/actions/class.UserSettings.php index ce4cf7df03..a53c9a4e74 100644 --- a/actions/class.UserSettings.php +++ b/actions/class.UserSettings.php @@ -30,6 +30,7 @@ use oat\generis\model\GenerisRdf; use oat\generis\model\OntologyAwareTrait; use oat\oatbox\user\UserLanguageServiceInterface; +use oat\tao\model\featureFlag\FeatureFlagCheckerInterface; use oat\tao\model\service\ApplicationService; use oat\tao\model\user\UserSettingsFormFactory; use oat\tao\model\user\UserSettingsServiceInterface; @@ -110,6 +111,11 @@ public function properties() $userSettingsData[GenerisRdf::PROPERTY_USER_DEFLG] = $dataLang->getUri(); } + if ($this->getFeatureFlagChecker()->isEnabled(FeatureFlagCheckerInterface::FEATURE_FLAG_SOLAR_DESIGN_ENABLED)) { + $interfaceMode = $this->getResource($settingsForm->getValue('interface_mode')); + $userSettingsData[GenerisRdf::PROPERTY_USER_INTERFACE_MODE] = $interfaceMode->getUri(); + } + $binder = new tao_models_classes_dataBinding_GenerisFormDataBinder($userResource); if ($binder->bind($userSettingsData)) { @@ -164,6 +170,13 @@ private function getLanguageService(): tao_models_classes_LanguageService return tao_models_classes_LanguageService::singleton(); } + private function getFeatureFlagChecker(): FeatureFlagCheckerInterface + { + return $this + ->getPsrContainer() + ->get(FeatureFlagCheckerInterface::class); + } + private function isDemoMode(): bool { return $this->getPsrContainer()->get(ApplicationService::SERVICE_ID)->isDemo(); diff --git a/actions/form/class.UserSettings.php b/actions/form/class.UserSettings.php index 8621e1dc33..78134fe4c9 100644 --- a/actions/form/class.UserSettings.php +++ b/actions/form/class.UserSettings.php @@ -22,9 +22,11 @@ * */ +use oat\generis\model\GenerisRdf; use oat\oatbox\service\ServiceManager; use oat\oatbox\user\UserLanguageServiceInterface; use oat\oatbox\user\UserTimezoneServiceInterface; +use oat\tao\model\featureFlag\FeatureFlagCheckerInterface; use Psr\Container\ContainerInterface; /** @@ -142,6 +144,18 @@ protected function initElements() } $this->addTimezoneEl($this->form); + + if ($this->getFeatureFlagChecker()->isEnabled(FeatureFlagCheckerInterface::FEATURE_FLAG_SOLAR_DESIGN_ENABLED)) { + $this->addInterfaceModeEl($this->form); + } + } + + private function addInterfaceModeEl($form): void + { + $interfaceModeElement = tao_helpers_form_FormFactory::getElement('interface_mode', 'Radiobox'); + $interfaceModeElement->setDescription(__('Interface Mode')); + $interfaceModeElement->setOptions($this->getInterfaceModeOptions()); + $form->addElement($interfaceModeElement); } private function addTimezoneEl($form): void @@ -180,6 +194,13 @@ private function getLanguageService(): tao_models_classes_LanguageService return $this->languageService; } + private function getFeatureFlagChecker(): FeatureFlagCheckerInterface + { + return $this + ->getContainer() + ->get(FeatureFlagCheckerInterface::class); + } + private function getContainer(): ContainerInterface { if (!$this->container) { @@ -188,4 +209,16 @@ private function getContainer(): ContainerInterface return $this->container; } + + private function getInterfaceModeOptions(): array + { + $options = []; + $property = new core_kernel_classes_Property(GenerisRdf::PROPERTY_USER_INTERFACE_MODE); + + foreach ($property->getRange()->getInstances(true) as $rangeInstance) { + $options[tao_helpers_Uri::encode($rangeInstance->getUri())] = $rangeInstance->getLabel(); + } + + return $options; + } } diff --git a/models/classes/menu/SectionVisibilityFilter.php b/models/classes/menu/SectionVisibilityFilter.php index 46c3428a4d..1e8311bda7 100644 --- a/models/classes/menu/SectionVisibilityFilter.php +++ b/models/classes/menu/SectionVisibilityFilter.php @@ -23,9 +23,12 @@ namespace oat\tao\model\menu; use LogicException; +use oat\generis\model\GenerisRdf; use oat\oatbox\service\ConfigurableService; use oat\tao\model\featureFlag\FeatureFlagChecker; use oat\tao\model\featureFlag\FeatureFlagCheckerInterface; +use oat\tao\model\user\implementation\UserSettingsService; +use oat\tao\model\user\UserSettingsInterface; class SectionVisibilityFilter extends ConfigurableService implements SectionVisibilityFilterInterface { @@ -33,6 +36,8 @@ class SectionVisibilityFilter extends ConfigurableService implements SectionVisi public const OPTION_FEATURE_FLAG_SECTIONS = 'featureFlagSections'; public const OPTION_FEATURE_FLAG_SECTIONS_TO_HIDE = 'featureFlagSectionsToHide'; + //TODO:: Add sections hidden for simple mode + public const SIMPLE_MODE_HIDDEN_SECTIONS = []; /** * @throws LogicException */ @@ -53,10 +58,23 @@ public function isVisible(string $section): bool } } + if ($this->getUserSettingsService() + ->getCurrentUserSettings() + ->getSetting(UserSettingsInterface::INTERFACE_MODE) == GenerisRdf::PROPERTY_USER_INTERFACE_MODE_SIMPLE) { + if (in_array($section, self::SIMPLE_MODE_HIDDEN_SECTIONS)) { + return false; + } + } + return true; } private function getFeatureFlagChecker(): FeatureFlagCheckerInterface { return $this->getServiceLocator()->get(FeatureFlagChecker::class); } + + private function getUserSettingsService(): UserSettingsService + { + return $this->getServiceLocator()->get(UserSettingsService::class); + } } diff --git a/models/classes/user/UserSettingsFormFactory.php b/models/classes/user/UserSettingsFormFactory.php index f62f7feb34..e829528d27 100644 --- a/models/classes/user/UserSettingsFormFactory.php +++ b/models/classes/user/UserSettingsFormFactory.php @@ -73,6 +73,10 @@ public function createFormFields( $fields['data_lang'] = $userSettings->getDataLanguageCode(); } + if ($userSettings->getSetting(UserSettingsInterface::INTERFACE_MODE)) { + $fields['interface_mode'] = $userSettings->getSetting(UserSettingsInterface::INTERFACE_MODE); + } + return $fields; } diff --git a/models/classes/user/UserSettingsInterface.php b/models/classes/user/UserSettingsInterface.php index f6506fb8b1..94cae1d041 100644 --- a/models/classes/user/UserSettingsInterface.php +++ b/models/classes/user/UserSettingsInterface.php @@ -24,9 +24,15 @@ interface UserSettingsInterface { + const INTERFACE_MODE = 'interface_mode'; + public function getUILanguageCode(): ?string; public function getDataLanguageCode(): ?string; public function getTimezone(): string; + + public function setSetting(string $setting, $value): void; + + public function getSetting(string $setting); } diff --git a/models/classes/user/implementation/UserSettings.php b/models/classes/user/implementation/UserSettings.php index e47ffca3e2..bcfae59bc3 100644 --- a/models/classes/user/implementation/UserSettings.php +++ b/models/classes/user/implementation/UserSettings.php @@ -35,6 +35,9 @@ class UserSettings implements UserSettingsInterface /** @var string */ private $timezone; + /** @var array */ + public $settings = []; + public function __construct(string $timezone, string $uiLanguageCode = null, string $dataLanguageCode = null) { $this->timezone = $timezone; @@ -56,4 +59,14 @@ public function getTimezone(): string { return $this->timezone; } + + public function setSetting(string $setting, $value): void + { + $this->settings[$setting] = $value; + } + + public function getSetting(string $setting) + { + return $this->settings[$setting] ?? null; + } } diff --git a/models/classes/user/implementation/UserSettingsService.php b/models/classes/user/implementation/UserSettingsService.php index 2424a8ece7..f3ec322803 100644 --- a/models/classes/user/implementation/UserSettingsService.php +++ b/models/classes/user/implementation/UserSettingsService.php @@ -28,6 +28,7 @@ use oat\tao\model\user\UserSettingsInterface; use oat\tao\model\user\UserSettingsServiceInterface; use core_kernel_classes_Resource; +use tao_models_classes_UserService; class UserSettingsService implements UserSettingsServiceInterface { @@ -36,11 +37,20 @@ class UserSettingsService implements UserSettingsServiceInterface /** @var string */ private $defaultTimeZone; + /** + * @var tao_models_classes_UserService + */ + private $userService; - public function __construct(UserTimezoneServiceInterface $userTimezoneService, Ontology $ontology) + public function __construct( + UserTimezoneServiceInterface $userTimezoneService, + Ontology $ontology, + tao_models_classes_UserService $userService + ) { $this->defaultTimeZone = $userTimezoneService->getDefaultTimezone(); $this->ontology = $ontology; + $this->userService = $userService; } public function get(core_kernel_classes_Resource $user): UserSettingsInterface @@ -49,7 +59,8 @@ public function get(core_kernel_classes_Resource $user): UserSettingsInterface [ $this->ontology->getProperty(GenerisRdf::PROPERTY_USER_UILG), $this->ontology->getProperty(GenerisRdf::PROPERTY_USER_DEFLG), - $this->ontology->getProperty(GenerisRdf::PROPERTY_USER_TIMEZONE) + $this->ontology->getProperty(GenerisRdf::PROPERTY_USER_TIMEZONE), + $this->ontology->getProperty(GenerisRdf::PROPERTY_USER_INTERFACE_MODE) ] ); @@ -65,10 +76,24 @@ public function get(core_kernel_classes_Resource $user): UserSettingsInterface $timezone = (string) current($props[GenerisRdf::PROPERTY_USER_TIMEZONE]); } - return new UserSettings( + $userSettings = new UserSettings( $timezone ?? $this->defaultTimeZone, $uiLanguageCode ?? null, $dataLanguageCode ?? null ); + + if (!empty($props[GenerisRdf::PROPERTY_USER_INTERFACE_MODE])) { + $userSettings->setSetting( + UserSettingsInterface::INTERFACE_MODE, + current($props[GenerisRdf::PROPERTY_USER_INTERFACE_MODE])->getUri() + ); + } + + return $userSettings; + } + + public function getCurrentUserSettings(): UserSettingsInterface + { + return $this->get($this->userService->getCurrentUser()); } } From 11334e4302785fd82ebe717e86226f9fe0ebbc6e Mon Sep 17 00:00:00 2001 From: Nevermind23 Date: Tue, 11 Jun 2024 01:40:44 +0400 Subject: [PATCH 03/12] chore: Add dependencies --- models/classes/user/UserSettingsServiceProvider.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/models/classes/user/UserSettingsServiceProvider.php b/models/classes/user/UserSettingsServiceProvider.php index 87aae5eb13..1d4b6c438f 100644 --- a/models/classes/user/UserSettingsServiceProvider.php +++ b/models/classes/user/UserSettingsServiceProvider.php @@ -29,6 +29,7 @@ use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator; use tao_models_classes_LanguageService; +use tao_models_classes_UserService; use function Symfony\Component\DependencyInjection\Loader\Configurator\service; class UserSettingsServiceProvider implements ContainerServiceProviderInterface @@ -44,6 +45,7 @@ public function __invoke(ContainerConfigurator $configurator): void [ service(UserTimezoneServiceInterface::SERVICE_ID), service(Ontology::SERVICE_ID), + service(tao_models_classes_UserService::SERVICE_ID), ] ); From 4271a7455742404ec1b82fc0bdb99667fa7dc921 Mon Sep 17 00:00:00 2001 From: Nevermind23 Date: Tue, 11 Jun 2024 01:41:36 +0400 Subject: [PATCH 04/12] chore: Minor refactor --- models/classes/menu/SectionVisibilityFilter.php | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/models/classes/menu/SectionVisibilityFilter.php b/models/classes/menu/SectionVisibilityFilter.php index 1e8311bda7..3e2311efb1 100644 --- a/models/classes/menu/SectionVisibilityFilter.php +++ b/models/classes/menu/SectionVisibilityFilter.php @@ -58,9 +58,8 @@ public function isVisible(string $section): bool } } - if ($this->getUserSettingsService() - ->getCurrentUserSettings() - ->getSetting(UserSettingsInterface::INTERFACE_MODE) == GenerisRdf::PROPERTY_USER_INTERFACE_MODE_SIMPLE) { + $userSettings = $this->getUserSettingsService()->getCurrentUserSettings(); + if ($userSettings->getSetting(UserSettingsInterface::INTERFACE_MODE) == GenerisRdf::PROPERTY_USER_INTERFACE_MODE_SIMPLE) { if (in_array($section, self::SIMPLE_MODE_HIDDEN_SECTIONS)) { return false; } From b694892fcde4d4ca264ac4f6e4d5ede7b4e97907 Mon Sep 17 00:00:00 2001 From: Nevermind23 Date: Tue, 11 Jun 2024 03:16:10 +0400 Subject: [PATCH 05/12] chore: Update tests --- actions/class.UserSettings.php | 5 ++-- actions/form/class.UserSettings.php | 5 ++-- .../classes/menu/SectionVisibilityFilter.php | 9 ++++-- .../PasswordConstraintsServiceProvider.php | 2 ++ .../implementation/UserSettingsService.php | 7 ++++- .../menu/SectionVisibilityFilterTest.php | 8 ++++-- .../UserSettingsServiceTest.php | 28 +++++++++++++++++-- 7 files changed, 52 insertions(+), 12 deletions(-) diff --git a/actions/class.UserSettings.php b/actions/class.UserSettings.php index a53c9a4e74..ed8d844a05 100644 --- a/actions/class.UserSettings.php +++ b/actions/class.UserSettings.php @@ -30,6 +30,7 @@ use oat\generis\model\GenerisRdf; use oat\generis\model\OntologyAwareTrait; use oat\oatbox\user\UserLanguageServiceInterface; +use oat\tao\model\featureFlag\FeatureFlagChecker; use oat\tao\model\featureFlag\FeatureFlagCheckerInterface; use oat\tao\model\service\ApplicationService; use oat\tao\model\user\UserSettingsFormFactory; @@ -170,11 +171,11 @@ private function getLanguageService(): tao_models_classes_LanguageService return tao_models_classes_LanguageService::singleton(); } - private function getFeatureFlagChecker(): FeatureFlagCheckerInterface + private function getFeatureFlagChecker(): FeatureFlagChecker { return $this ->getPsrContainer() - ->get(FeatureFlagCheckerInterface::class); + ->get(FeatureFlagChecker::class); } private function isDemoMode(): bool diff --git a/actions/form/class.UserSettings.php b/actions/form/class.UserSettings.php index 78134fe4c9..5ef588c149 100644 --- a/actions/form/class.UserSettings.php +++ b/actions/form/class.UserSettings.php @@ -26,6 +26,7 @@ use oat\oatbox\service\ServiceManager; use oat\oatbox\user\UserLanguageServiceInterface; use oat\oatbox\user\UserTimezoneServiceInterface; +use oat\tao\model\featureFlag\FeatureFlagChecker; use oat\tao\model\featureFlag\FeatureFlagCheckerInterface; use Psr\Container\ContainerInterface; @@ -194,11 +195,11 @@ private function getLanguageService(): tao_models_classes_LanguageService return $this->languageService; } - private function getFeatureFlagChecker(): FeatureFlagCheckerInterface + private function getFeatureFlagChecker(): FeatureFlagChecker { return $this ->getContainer() - ->get(FeatureFlagCheckerInterface::class); + ->get(FeatureFlagChecker::class); } private function getContainer(): ContainerInterface diff --git a/models/classes/menu/SectionVisibilityFilter.php b/models/classes/menu/SectionVisibilityFilter.php index 3e2311efb1..5387b6d3e4 100644 --- a/models/classes/menu/SectionVisibilityFilter.php +++ b/models/classes/menu/SectionVisibilityFilter.php @@ -59,7 +59,10 @@ public function isVisible(string $section): bool } $userSettings = $this->getUserSettingsService()->getCurrentUserSettings(); - if ($userSettings->getSetting(UserSettingsInterface::INTERFACE_MODE) == GenerisRdf::PROPERTY_USER_INTERFACE_MODE_SIMPLE) { + if ( + $this->getFeatureFlagChecker()->isEnabled(FeatureFlagCheckerInterface::FEATURE_FLAG_SOLAR_DESIGN_ENABLED) + && $userSettings->getSetting(UserSettingsInterface::INTERFACE_MODE) == GenerisRdf::PROPERTY_USER_INTERFACE_MODE_SIMPLE + ) { if (in_array($section, self::SIMPLE_MODE_HIDDEN_SECTIONS)) { return false; } @@ -67,13 +70,13 @@ public function isVisible(string $section): bool return true; } - private function getFeatureFlagChecker(): FeatureFlagCheckerInterface + private function getFeatureFlagChecker(): FeatureFlagChecker { return $this->getServiceLocator()->get(FeatureFlagChecker::class); } private function getUserSettingsService(): UserSettingsService { - return $this->getServiceLocator()->get(UserSettingsService::class); + return $this->getServiceLocator()->getContainer()->get(UserSettingsService::class); } } diff --git a/models/classes/password/PasswordConstraintsServiceProvider.php b/models/classes/password/PasswordConstraintsServiceProvider.php index 3f898ce50e..8425880589 100644 --- a/models/classes/password/PasswordConstraintsServiceProvider.php +++ b/models/classes/password/PasswordConstraintsServiceProvider.php @@ -29,6 +29,7 @@ use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator; use tao_models_classes_LanguageService; +use tao_models_classes_UserService; use function Symfony\Component\DependencyInjection\Loader\Configurator\service; class PasswordConstraintsServiceProvider implements ContainerServiceProviderInterface @@ -44,6 +45,7 @@ public function __invoke(ContainerConfigurator $configurator): void [ service(UserTimezoneServiceInterface::SERVICE_ID), service(Ontology::SERVICE_ID), + service(tao_models_classes_UserService::SERVICE_ID), ] ); diff --git a/models/classes/user/implementation/UserSettingsService.php b/models/classes/user/implementation/UserSettingsService.php index f3ec322803..703b1a769e 100644 --- a/models/classes/user/implementation/UserSettingsService.php +++ b/models/classes/user/implementation/UserSettingsService.php @@ -94,6 +94,11 @@ public function get(core_kernel_classes_Resource $user): UserSettingsInterface public function getCurrentUserSettings(): UserSettingsInterface { - return $this->get($this->userService->getCurrentUser()); + $currentUser = $this->userService->getCurrentUser(); + if ($currentUser) { + return $this->get($currentUser); + } + + return new UserSettings($this->defaultTimeZone); } } diff --git a/test/unit/models/classes/menu/SectionVisibilityFilterTest.php b/test/unit/models/classes/menu/SectionVisibilityFilterTest.php index 84acad2acf..441c4953c3 100644 --- a/test/unit/models/classes/menu/SectionVisibilityFilterTest.php +++ b/test/unit/models/classes/menu/SectionVisibilityFilterTest.php @@ -25,6 +25,7 @@ use oat\generis\test\TestCase; use oat\tao\model\featureFlag\FeatureFlagChecker; use oat\tao\model\menu\SectionVisibilityFilter; +use oat\tao\model\user\implementation\UserSettingsService; use PHPUnit\Framework\MockObject\MockObject; class SectionVisibilityFilterTest extends TestCase @@ -37,9 +38,13 @@ class SectionVisibilityFilterTest extends TestCase /** @var FeatureFlagChecker|MockObject */ private $featureFlagChecker; + /** @var FeatureFlagChecker|MockObject */ + private $userSettingsService; + public function setUp(): void { $this->featureFlagChecker = $this->createMock(FeatureFlagChecker::class); + $this->userSettingsService = $this->createMock(UserSettingsService::class); $this->subject = new SectionVisibilityFilter( [ @@ -59,6 +64,7 @@ public function setUp(): void $this->subject->setServiceLocator( $this->getServiceLocatorMock([ FeatureFlagChecker::class => $this->featureFlagChecker, + UserSettingsService::class => $this->userSettingsService, ]) ); } @@ -75,7 +81,6 @@ public function testIsHidden(): void public function testIsHiddenLtiDisabled(): void { $this->featureFlagChecker - ->expects(self::once()) ->method('isEnabled') ->willReturn(false); @@ -93,7 +98,6 @@ public function testIsVisibleWithNoSections(): void public function testWhiteList($isEnabled, $result): void { $this->featureFlagChecker - ->expects(self::once()) ->method('isEnabled') ->willReturn($isEnabled); diff --git a/test/unit/user/implementation/UserSettingsServiceTest.php b/test/unit/user/implementation/UserSettingsServiceTest.php index cd91536ba2..cc4e66f60d 100644 --- a/test/unit/user/implementation/UserSettingsServiceTest.php +++ b/test/unit/user/implementation/UserSettingsServiceTest.php @@ -31,7 +31,9 @@ use oat\tao\model\user\implementation\UserSettingsService; use core_kernel_classes_Resource; use core_kernel_persistence_smoothsql_SmoothModel; +use oat\tao\model\user\UserSettingsInterface; use PHPUnit\Framework\MockObject\MockObject; +use tao_models_classes_UserService; class UserSettingsServiceTest extends TestCase { @@ -49,14 +51,19 @@ class UserSettingsServiceTest extends TestCase /** @var UserSettings|MockObject */ private $userSettings; + /** @var tao_models_classes_UserService|MockObject */ + private $userService; + public function setUp(): void { $this->userTimezoneService = $this->getUserTimezoneServiceMock(); $this->userSettings = $this->createMock(UserSettings::class); + $this->userService = $this->createMock(tao_models_classes_UserService::class); $this->sut = new UserSettingsService( $this->userTimezoneService, - $this->getOntologyMock() + $this->getOntologyMock(), + $this->userService ); } @@ -74,6 +81,22 @@ public function testGet( $this->assertEquals($expected->getUILanguageCode(), $settings->getUILanguageCode()); } + /** + * @dataProvider getDataProvider + */ + public function testGetCurrentUserSettings( + UserSettings $expected, + core_kernel_classes_Resource $user + ): void { + $this->userService->method('getCurrentUser')->willReturn($user); + + $result = $this->sut->getCurrentUserSettings(); + + $this->assertEquals($expected->getTimezone(), $result->getTimezone()); + $this->assertEquals($expected->getDataLanguageCode(), $result->getDataLanguageCode()); + $this->assertEquals($expected->getUILanguageCode(), $result->getUILanguageCode()); + } + public function getDataProvider(): array { return [ @@ -134,7 +157,8 @@ private function getUserMock( ->with([ $this->getOntologyMock()->getProperty(GenerisRdf::PROPERTY_USER_UILG), $this->getOntologyMock()->getProperty(GenerisRdf::PROPERTY_USER_DEFLG), - $this->getOntologyMock()->getProperty(GenerisRdf::PROPERTY_USER_TIMEZONE) + $this->getOntologyMock()->getProperty(GenerisRdf::PROPERTY_USER_TIMEZONE), + $this->getOntologyMock()->getProperty(GenerisRdf::PROPERTY_USER_INTERFACE_MODE) ]) ->willReturn($props); From 866580fa1a6fe2befdbf2bb426d91e6139f8eeae Mon Sep 17 00:00:00 2001 From: Nevermind23 Date: Tue, 11 Jun 2024 12:21:20 +0400 Subject: [PATCH 06/12] chore: Point generis to the dev branch --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 9d4ace48d4..1ff4c20dc0 100644 --- a/composer.json +++ b/composer.json @@ -67,7 +67,7 @@ "oat-sa/jig": "~0.2", "oat-sa/composer-npm-bridge": "~0.4.2||dev-master", "oat-sa/oatbox-extension-installer": "~1.1||dev-master", - "oat-sa/generis": ">=15.34", + "oat-sa/generis": "dev-feat/AUT-3625/content-creation-mode-switch", "composer/package-versions-deprecated": "^1.11", "paragonie/random_compat": "^2.0", "phpdocumentor/reflection-docblock": "^5.2", From b68be0cc8af4a6e291b6456c4a4436985a2ca720 Mon Sep 17 00:00:00 2001 From: Nevermind23 Date: Tue, 11 Jun 2024 12:43:18 +0400 Subject: [PATCH 07/12] chore: Styling update --- actions/class.UserSettings.php | 6 +++++- actions/form/class.UserSettings.php | 6 +++++- models/classes/menu/SectionVisibilityFilter.php | 8 ++++++-- .../password/PasswordConstraintsServiceProvider.php | 1 - models/classes/user/UserSettingsInterface.php | 2 +- models/classes/user/UserSettingsServiceProvider.php | 1 - .../classes/user/implementation/UserSettingsService.php | 3 +-- 7 files changed, 18 insertions(+), 9 deletions(-) diff --git a/actions/class.UserSettings.php b/actions/class.UserSettings.php index ed8d844a05..034b55992b 100644 --- a/actions/class.UserSettings.php +++ b/actions/class.UserSettings.php @@ -112,7 +112,11 @@ public function properties() $userSettingsData[GenerisRdf::PROPERTY_USER_DEFLG] = $dataLang->getUri(); } - if ($this->getFeatureFlagChecker()->isEnabled(FeatureFlagCheckerInterface::FEATURE_FLAG_SOLAR_DESIGN_ENABLED)) { + if ( + $this->getFeatureFlagChecker()->isEnabled( + FeatureFlagCheckerInterface::FEATURE_FLAG_SOLAR_DESIGN_ENABLED + ) + ) { $interfaceMode = $this->getResource($settingsForm->getValue('interface_mode')); $userSettingsData[GenerisRdf::PROPERTY_USER_INTERFACE_MODE] = $interfaceMode->getUri(); } diff --git a/actions/form/class.UserSettings.php b/actions/form/class.UserSettings.php index 5ef588c149..8af95ff25d 100644 --- a/actions/form/class.UserSettings.php +++ b/actions/form/class.UserSettings.php @@ -146,7 +146,11 @@ protected function initElements() $this->addTimezoneEl($this->form); - if ($this->getFeatureFlagChecker()->isEnabled(FeatureFlagCheckerInterface::FEATURE_FLAG_SOLAR_DESIGN_ENABLED)) { + if ( + $this->getFeatureFlagChecker()->isEnabled( + FeatureFlagCheckerInterface::FEATURE_FLAG_SOLAR_DESIGN_ENABLED + ) + ) { $this->addInterfaceModeEl($this->form); } } diff --git a/models/classes/menu/SectionVisibilityFilter.php b/models/classes/menu/SectionVisibilityFilter.php index 5387b6d3e4..81e3db329d 100644 --- a/models/classes/menu/SectionVisibilityFilter.php +++ b/models/classes/menu/SectionVisibilityFilter.php @@ -60,8 +60,12 @@ public function isVisible(string $section): bool $userSettings = $this->getUserSettingsService()->getCurrentUserSettings(); if ( - $this->getFeatureFlagChecker()->isEnabled(FeatureFlagCheckerInterface::FEATURE_FLAG_SOLAR_DESIGN_ENABLED) - && $userSettings->getSetting(UserSettingsInterface::INTERFACE_MODE) == GenerisRdf::PROPERTY_USER_INTERFACE_MODE_SIMPLE + $this->getFeatureFlagChecker()->isEnabled( + FeatureFlagCheckerInterface::FEATURE_FLAG_SOLAR_DESIGN_ENABLED + ) + && $userSettings->getSetting( + UserSettingsInterface::INTERFACE_MODE + ) == GenerisRdf::PROPERTY_USER_INTERFACE_MODE_SIMPLE ) { if (in_array($section, self::SIMPLE_MODE_HIDDEN_SECTIONS)) { return false; diff --git a/models/classes/password/PasswordConstraintsServiceProvider.php b/models/classes/password/PasswordConstraintsServiceProvider.php index 8425880589..7660d2ce21 100644 --- a/models/classes/password/PasswordConstraintsServiceProvider.php +++ b/models/classes/password/PasswordConstraintsServiceProvider.php @@ -28,7 +28,6 @@ use oat\tao\model\user\implementation\UserSettingsService; use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator; use tao_models_classes_LanguageService; - use tao_models_classes_UserService; use function Symfony\Component\DependencyInjection\Loader\Configurator\service; diff --git a/models/classes/user/UserSettingsInterface.php b/models/classes/user/UserSettingsInterface.php index 94cae1d041..81f3d28172 100644 --- a/models/classes/user/UserSettingsInterface.php +++ b/models/classes/user/UserSettingsInterface.php @@ -24,7 +24,7 @@ interface UserSettingsInterface { - const INTERFACE_MODE = 'interface_mode'; + public const INTERFACE_MODE = 'interface_mode'; public function getUILanguageCode(): ?string; diff --git a/models/classes/user/UserSettingsServiceProvider.php b/models/classes/user/UserSettingsServiceProvider.php index 1d4b6c438f..cd71dcc552 100644 --- a/models/classes/user/UserSettingsServiceProvider.php +++ b/models/classes/user/UserSettingsServiceProvider.php @@ -28,7 +28,6 @@ use oat\tao\model\user\implementation\UserSettingsService; use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator; use tao_models_classes_LanguageService; - use tao_models_classes_UserService; use function Symfony\Component\DependencyInjection\Loader\Configurator\service; diff --git a/models/classes/user/implementation/UserSettingsService.php b/models/classes/user/implementation/UserSettingsService.php index 703b1a769e..d28b521530 100644 --- a/models/classes/user/implementation/UserSettingsService.php +++ b/models/classes/user/implementation/UserSettingsService.php @@ -46,8 +46,7 @@ public function __construct( UserTimezoneServiceInterface $userTimezoneService, Ontology $ontology, tao_models_classes_UserService $userService - ) - { + ) { $this->defaultTimeZone = $userTimezoneService->getDefaultTimezone(); $this->ontology = $ontology; $this->userService = $userService; From dc40c89532674a9c05977f9491d6fa60c6270f72 Mon Sep 17 00:00:00 2001 From: Nevermind23 Date: Tue, 11 Jun 2024 12:54:39 +0400 Subject: [PATCH 08/12] chore: Styling update --- models/classes/password/PasswordConstraintsServiceProvider.php | 1 + models/classes/user/UserSettingsServiceProvider.php | 1 + 2 files changed, 2 insertions(+) diff --git a/models/classes/password/PasswordConstraintsServiceProvider.php b/models/classes/password/PasswordConstraintsServiceProvider.php index 7660d2ce21..6d8dcbfd9c 100644 --- a/models/classes/password/PasswordConstraintsServiceProvider.php +++ b/models/classes/password/PasswordConstraintsServiceProvider.php @@ -29,6 +29,7 @@ use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator; use tao_models_classes_LanguageService; use tao_models_classes_UserService; + use function Symfony\Component\DependencyInjection\Loader\Configurator\service; class PasswordConstraintsServiceProvider implements ContainerServiceProviderInterface diff --git a/models/classes/user/UserSettingsServiceProvider.php b/models/classes/user/UserSettingsServiceProvider.php index cd71dcc552..0d560b1fcd 100644 --- a/models/classes/user/UserSettingsServiceProvider.php +++ b/models/classes/user/UserSettingsServiceProvider.php @@ -29,6 +29,7 @@ use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator; use tao_models_classes_LanguageService; use tao_models_classes_UserService; + use function Symfony\Component\DependencyInjection\Loader\Configurator\service; class UserSettingsServiceProvider implements ContainerServiceProviderInterface From f4c5cf39b592f0885061457fe983c90a5d662b7b Mon Sep 17 00:00:00 2001 From: Saba <23014889+Nevermind23@users.noreply.github.com> Date: Wed, 12 Jun 2024 11:43:57 +0400 Subject: [PATCH 09/12] chore: Apply suggestions from code review Co-authored-by: Gabriel Felipe Soares Signed-off-by: Saba <23014889+Nevermind23@users.noreply.github.com> --- actions/class.UserSettings.php | 2 +- models/classes/menu/SectionVisibilityFilter.php | 2 ++ models/classes/user/implementation/UserSettingsService.php | 1 + test/unit/models/classes/menu/SectionVisibilityFilterTest.php | 2 +- 4 files changed, 5 insertions(+), 2 deletions(-) diff --git a/actions/class.UserSettings.php b/actions/class.UserSettings.php index 034b55992b..91408590f2 100644 --- a/actions/class.UserSettings.php +++ b/actions/class.UserSettings.php @@ -175,7 +175,7 @@ private function getLanguageService(): tao_models_classes_LanguageService return tao_models_classes_LanguageService::singleton(); } - private function getFeatureFlagChecker(): FeatureFlagChecker + private function getFeatureFlagChecker(): FeatureFlagCheckerInterface { return $this ->getPsrContainer() diff --git a/models/classes/menu/SectionVisibilityFilter.php b/models/classes/menu/SectionVisibilityFilter.php index 81e3db329d..e31c19ccd3 100644 --- a/models/classes/menu/SectionVisibilityFilter.php +++ b/models/classes/menu/SectionVisibilityFilter.php @@ -38,6 +38,7 @@ class SectionVisibilityFilter extends ConfigurableService implements SectionVisi //TODO:: Add sections hidden for simple mode public const SIMPLE_MODE_HIDDEN_SECTIONS = []; + /** * @throws LogicException */ @@ -59,6 +60,7 @@ public function isVisible(string $section): bool } $userSettings = $this->getUserSettingsService()->getCurrentUserSettings(); + if ( $this->getFeatureFlagChecker()->isEnabled( FeatureFlagCheckerInterface::FEATURE_FLAG_SOLAR_DESIGN_ENABLED diff --git a/models/classes/user/implementation/UserSettingsService.php b/models/classes/user/implementation/UserSettingsService.php index d28b521530..5e5195b1bd 100644 --- a/models/classes/user/implementation/UserSettingsService.php +++ b/models/classes/user/implementation/UserSettingsService.php @@ -94,6 +94,7 @@ public function get(core_kernel_classes_Resource $user): UserSettingsInterface public function getCurrentUserSettings(): UserSettingsInterface { $currentUser = $this->userService->getCurrentUser(); + if ($currentUser) { return $this->get($currentUser); } diff --git a/test/unit/models/classes/menu/SectionVisibilityFilterTest.php b/test/unit/models/classes/menu/SectionVisibilityFilterTest.php index 441c4953c3..aaa2498097 100644 --- a/test/unit/models/classes/menu/SectionVisibilityFilterTest.php +++ b/test/unit/models/classes/menu/SectionVisibilityFilterTest.php @@ -38,7 +38,7 @@ class SectionVisibilityFilterTest extends TestCase /** @var FeatureFlagChecker|MockObject */ private $featureFlagChecker; - /** @var FeatureFlagChecker|MockObject */ + /** @var UserSettingsService|MockObject */ private $userSettingsService; public function setUp(): void From ec260b5034d54fdc5745d187ae8297fe002a1a29 Mon Sep 17 00:00:00 2001 From: Nevermind23 Date: Wed, 12 Jun 2024 15:48:18 +0400 Subject: [PATCH 10/12] chore: Apply suggestions from PR review --- actions/class.UserSettings.php | 3 +- actions/form/class.UserSettings.php | 3 +- migrations/Version202406121231482235_tao.php | 31 +++++ .../classes/menu/SectionVisibilityFilter.php | 19 ++- .../classes/user/UserSettingsFormFactory.php | 2 +- models/classes/user/UserSettingsInterface.php | 18 ++- .../user/UserSettingsServiceProvider.php | 2 + .../user/implementation/UserSettings.php | 27 ++--- .../implementation/UserSettingsService.php | 18 ++- .../UserSettingsServiceTest.php | 113 +++++++++++++++--- 10 files changed, 182 insertions(+), 54 deletions(-) create mode 100644 migrations/Version202406121231482235_tao.php diff --git a/actions/class.UserSettings.php b/actions/class.UserSettings.php index 91408590f2..edbb48e401 100644 --- a/actions/class.UserSettings.php +++ b/actions/class.UserSettings.php @@ -34,6 +34,7 @@ use oat\tao\model\featureFlag\FeatureFlagCheckerInterface; use oat\tao\model\service\ApplicationService; use oat\tao\model\user\UserSettingsFormFactory; +use oat\tao\model\user\UserSettingsInterface; use oat\tao\model\user\UserSettingsServiceInterface; use oat\tao\model\user\implementation\UserSettingsService; use tao_helpers_form_FormContainer as FormContainer; @@ -117,7 +118,7 @@ public function properties() FeatureFlagCheckerInterface::FEATURE_FLAG_SOLAR_DESIGN_ENABLED ) ) { - $interfaceMode = $this->getResource($settingsForm->getValue('interface_mode')); + $interfaceMode = $this->getResource($settingsForm->getValue(UserSettingsInterface::INTERFACE_MODE)); $userSettingsData[GenerisRdf::PROPERTY_USER_INTERFACE_MODE] = $interfaceMode->getUri(); } diff --git a/actions/form/class.UserSettings.php b/actions/form/class.UserSettings.php index 8af95ff25d..21d2a52293 100644 --- a/actions/form/class.UserSettings.php +++ b/actions/form/class.UserSettings.php @@ -28,6 +28,7 @@ use oat\oatbox\user\UserTimezoneServiceInterface; use oat\tao\model\featureFlag\FeatureFlagChecker; use oat\tao\model\featureFlag\FeatureFlagCheckerInterface; +use oat\tao\model\user\UserSettingsInterface; use Psr\Container\ContainerInterface; /** @@ -157,7 +158,7 @@ protected function initElements() private function addInterfaceModeEl($form): void { - $interfaceModeElement = tao_helpers_form_FormFactory::getElement('interface_mode', 'Radiobox'); + $interfaceModeElement = tao_helpers_form_FormFactory::getElement(UserSettingsInterface::INTERFACE_MODE, 'Radiobox'); $interfaceModeElement->setDescription(__('Interface Mode')); $interfaceModeElement->setOptions($this->getInterfaceModeOptions()); $form->addElement($interfaceModeElement); diff --git a/migrations/Version202406121231482235_tao.php b/migrations/Version202406121231482235_tao.php new file mode 100644 index 0000000000..7b66c52b00 --- /dev/null +++ b/migrations/Version202406121231482235_tao.php @@ -0,0 +1,31 @@ +getUserSettingsService()->getCurrentUserSettings(); if ( - $this->getFeatureFlagChecker()->isEnabled( - FeatureFlagCheckerInterface::FEATURE_FLAG_SOLAR_DESIGN_ENABLED - ) - && $userSettings->getSetting( + $userSettings->getSetting( UserSettingsInterface::INTERFACE_MODE - ) == GenerisRdf::PROPERTY_USER_INTERFACE_MODE_SIMPLE + ) === GenerisRdf::PROPERTY_USER_INTERFACE_MODE_SIMPLE + && in_array($section, self::SIMPLE_MODE_HIDDEN_SECTIONS) ) { - if (in_array($section, self::SIMPLE_MODE_HIDDEN_SECTIONS)) { - return false; - } + return false; } return true; } - private function getFeatureFlagChecker(): FeatureFlagChecker + + private function getFeatureFlagChecker(): FeatureFlagCheckerInterface { - return $this->getServiceLocator()->get(FeatureFlagChecker::class); + return $this->getServiceManager()->getContainer()->get(FeatureFlagChecker::class); } private function getUserSettingsService(): UserSettingsService { - return $this->getServiceLocator()->getContainer()->get(UserSettingsService::class); + return $this->getServiceManager()->getContainer()->get(UserSettingsService::class); } } diff --git a/models/classes/user/UserSettingsFormFactory.php b/models/classes/user/UserSettingsFormFactory.php index e829528d27..345a710b6d 100644 --- a/models/classes/user/UserSettingsFormFactory.php +++ b/models/classes/user/UserSettingsFormFactory.php @@ -74,7 +74,7 @@ public function createFormFields( } if ($userSettings->getSetting(UserSettingsInterface::INTERFACE_MODE)) { - $fields['interface_mode'] = $userSettings->getSetting(UserSettingsInterface::INTERFACE_MODE); + $fields[UserSettingsInterface::INTERFACE_MODE] = $userSettings->getSetting(UserSettingsInterface::INTERFACE_MODE); } return $fields; diff --git a/models/classes/user/UserSettingsInterface.php b/models/classes/user/UserSettingsInterface.php index 81f3d28172..d2d3c17d1f 100644 --- a/models/classes/user/UserSettingsInterface.php +++ b/models/classes/user/UserSettingsInterface.php @@ -24,15 +24,25 @@ interface UserSettingsInterface { - public const INTERFACE_MODE = 'interface_mode'; - + public const INTERFACE_MODE = 'interfaceMode'; + public const UI_LANGUAGE_CODE = 'uiLanguageCode'; + public const DATA_LANGUAGE_CODE = 'dataLanguageCode'; + public const TIMEZONE = 'timezone'; + + /** + * @deprecated use getSetting instead + */ public function getUILanguageCode(): ?string; + /** + * @deprecated use getSetting instead + */ public function getDataLanguageCode(): ?string; + /** + * @deprecated use getSetting instead + */ public function getTimezone(): string; - public function setSetting(string $setting, $value): void; - public function getSetting(string $setting); } diff --git a/models/classes/user/UserSettingsServiceProvider.php b/models/classes/user/UserSettingsServiceProvider.php index 0d560b1fcd..4a01ac8cf0 100644 --- a/models/classes/user/UserSettingsServiceProvider.php +++ b/models/classes/user/UserSettingsServiceProvider.php @@ -25,6 +25,7 @@ use oat\generis\model\data\Ontology; use oat\generis\model\DependencyInjection\ContainerServiceProviderInterface; use oat\oatbox\user\UserTimezoneServiceInterface; +use oat\tao\model\featureFlag\FeatureFlagChecker; use oat\tao\model\user\implementation\UserSettingsService; use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator; use tao_models_classes_LanguageService; @@ -46,6 +47,7 @@ public function __invoke(ContainerConfigurator $configurator): void service(UserTimezoneServiceInterface::SERVICE_ID), service(Ontology::SERVICE_ID), service(tao_models_classes_UserService::SERVICE_ID), + service(FeatureFlagChecker::class), ] ); diff --git a/models/classes/user/implementation/UserSettings.php b/models/classes/user/implementation/UserSettings.php index bcfae59bc3..8cb7e2ed38 100644 --- a/models/classes/user/implementation/UserSettings.php +++ b/models/classes/user/implementation/UserSettings.php @@ -26,43 +26,36 @@ class UserSettings implements UserSettingsInterface { - /** @var string|null */ - private $dataLanguageCode; - - /** @var string|null */ - private $uiLanguageCode; - - /** @var string */ - private $timezone; - /** @var array */ - public $settings = []; + private $settings = []; public function __construct(string $timezone, string $uiLanguageCode = null, string $dataLanguageCode = null) { - $this->timezone = $timezone; - $this->uiLanguageCode = $uiLanguageCode; - $this->dataLanguageCode = $dataLanguageCode; + $this->setSetting(self::TIMEZONE, $timezone); + $this->setSetting(self::UI_LANGUAGE_CODE, $uiLanguageCode); + $this->setSetting(self::DATA_LANGUAGE_CODE, $dataLanguageCode); } public function getUILanguageCode(): ?string { - return $this->uiLanguageCode; + return $this->getSetting(self::UI_LANGUAGE_CODE); } public function getDataLanguageCode(): ?string { - return $this->dataLanguageCode; + return $this->getSetting(self::DATA_LANGUAGE_CODE); } public function getTimezone(): string { - return $this->timezone; + return $this->getSetting(self::TIMEZONE); } - public function setSetting(string $setting, $value): void + public function setSetting(string $setting, $value): UserSettingsInterface { $this->settings[$setting] = $value; + + return $this; } public function getSetting(string $setting) diff --git a/models/classes/user/implementation/UserSettingsService.php b/models/classes/user/implementation/UserSettingsService.php index 5e5195b1bd..3fcfbfd1c3 100644 --- a/models/classes/user/implementation/UserSettingsService.php +++ b/models/classes/user/implementation/UserSettingsService.php @@ -25,6 +25,7 @@ use oat\generis\model\data\Ontology; use oat\generis\model\GenerisRdf; use oat\oatbox\user\UserTimezoneServiceInterface; +use oat\tao\model\featureFlag\FeatureFlagCheckerInterface; use oat\tao\model\user\UserSettingsInterface; use oat\tao\model\user\UserSettingsServiceInterface; use core_kernel_classes_Resource; @@ -37,19 +38,23 @@ class UserSettingsService implements UserSettingsServiceInterface /** @var string */ private $defaultTimeZone; - /** - * @var tao_models_classes_UserService - */ + + /** @var tao_models_classes_UserService */ private $userService; + /** @var FeatureFlagCheckerInterface */ + private $featureFlagChecker; + public function __construct( UserTimezoneServiceInterface $userTimezoneService, Ontology $ontology, - tao_models_classes_UserService $userService + tao_models_classes_UserService $userService, + FeatureFlagCheckerInterface $featureFlagChecker ) { $this->defaultTimeZone = $userTimezoneService->getDefaultTimezone(); $this->ontology = $ontology; $this->userService = $userService; + $this->featureFlagChecker = $featureFlagChecker; } public function get(core_kernel_classes_Resource $user): UserSettingsInterface @@ -81,7 +86,10 @@ public function get(core_kernel_classes_Resource $user): UserSettingsInterface $dataLanguageCode ?? null ); - if (!empty($props[GenerisRdf::PROPERTY_USER_INTERFACE_MODE])) { + if ( + $this->featureFlagChecker->isEnabled(FeatureFlagCheckerInterface::FEATURE_FLAG_SOLAR_DESIGN_ENABLED) + && !empty($props[GenerisRdf::PROPERTY_USER_INTERFACE_MODE]) + ) { $userSettings->setSetting( UserSettingsInterface::INTERFACE_MODE, current($props[GenerisRdf::PROPERTY_USER_INTERFACE_MODE])->getUri() diff --git a/test/unit/user/implementation/UserSettingsServiceTest.php b/test/unit/user/implementation/UserSettingsServiceTest.php index cc4e66f60d..50fa485890 100644 --- a/test/unit/user/implementation/UserSettingsServiceTest.php +++ b/test/unit/user/implementation/UserSettingsServiceTest.php @@ -27,6 +27,7 @@ use oat\generis\test\OntologyMockTrait; use oat\generis\test\TestCase; use oat\oatbox\user\UserTimezoneServiceInterface; +use oat\tao\model\featureFlag\FeatureFlagCheckerInterface; use oat\tao\model\user\implementation\UserSettings; use oat\tao\model\user\implementation\UserSettingsService; use core_kernel_classes_Resource; @@ -54,16 +55,21 @@ class UserSettingsServiceTest extends TestCase /** @var tao_models_classes_UserService|MockObject */ private $userService; + /** @var FeatureFlagCheckerInterface|MockObject */ + private $featureFlagChecker; + public function setUp(): void { $this->userTimezoneService = $this->getUserTimezoneServiceMock(); $this->userSettings = $this->createMock(UserSettings::class); $this->userService = $this->createMock(tao_models_classes_UserService::class); + $this->featureFlagChecker = $this->createMock(FeatureFlagCheckerInterface::class); $this->sut = new UserSettingsService( $this->userTimezoneService, $this->getOntologyMock(), - $this->userService + $this->userService, + $this->featureFlagChecker ); } @@ -86,47 +92,121 @@ public function testGet( */ public function testGetCurrentUserSettings( UserSettings $expected, - core_kernel_classes_Resource $user + core_kernel_classes_Resource $user, + bool $isSolarDesignEnabled ): void { $this->userService->method('getCurrentUser')->willReturn($user); + $this->featureFlagChecker + ->method('isEnabled') + ->with(FeatureFlagCheckerInterface::FEATURE_FLAG_SOLAR_DESIGN_ENABLED) + ->willReturn($isSolarDesignEnabled); + $result = $this->sut->getCurrentUserSettings(); $this->assertEquals($expected->getTimezone(), $result->getTimezone()); $this->assertEquals($expected->getDataLanguageCode(), $result->getDataLanguageCode()); $this->assertEquals($expected->getUILanguageCode(), $result->getUILanguageCode()); + + $this->assertEquals( + $expected->getSetting(UserSettingsInterface::TIMEZONE), + $result->getSetting(UserSettingsInterface::TIMEZONE) + ); + $this->assertEquals( + $expected->getSetting(UserSettingsInterface::UI_LANGUAGE_CODE), + $result->getSetting(UserSettingsInterface::UI_LANGUAGE_CODE) + ); + $this->assertEquals( + $expected->getSetting(UserSettingsInterface::DATA_LANGUAGE_CODE), + $result->getSetting(UserSettingsInterface::DATA_LANGUAGE_CODE) + ); + $this->assertEquals( + $expected->getSetting(UserSettingsInterface::INTERFACE_MODE), + $result->getSetting(UserSettingsInterface::INTERFACE_MODE) + ); } public function getDataProvider(): array { return [ 'Settings for a user with no timezone' => [ - 'expected' => new UserSettings('Europe/Luxembourg', null, null), - 'user' => $this->getUserMock('', '', null), + 'expected' => $this->createUserSetting( null, null, 'Europe/Luxembourg'), + 'user' => $this->getUserMock(), + 'isSolarDesignEnabled' => true, ], 'Settings for a user with timezone set' => [ - 'expected' => new UserSettings('Europe/Madrid', null, null), - 'user' => $this->getUserMock('', '', 'Europe/Madrid'), + 'expected' => $this->createUserSetting( null, null, 'Europe/Madrid'), + 'user' => $this->getUserMock(null, null, 'Europe/Madrid'), + 'isSolarDesignEnabled' => true, ], 'Settings for a user with UI language set' => [ - 'expected' => new UserSettings('Europe/Madrid', 'uiLang', null), - 'user' => $this->getUserMock('uiLang', '', 'Europe/Madrid'), + 'expected' => $this->createUserSetting( 'uiLang', null, 'Europe/Madrid'), + 'user' => $this->getUserMock('uiLang', null, 'Europe/Madrid'), + 'isSolarDesignEnabled' => true, ], 'Settings for a user with data language set' => [ - 'expected' => new UserSettings('Europe/Madrid', null, 'defLang'), - 'user' => $this->getUserMock('', 'defLang', 'Europe/Madrid'), + 'expected' => $this->createUserSetting( null, 'defLang', 'Europe/Madrid'), + 'user' => $this->getUserMock(null, 'defLang', 'Europe/Madrid'), + 'isSolarDesignEnabled' => true, ], 'Settings for a user with UI and data language set' => [ - 'expected' => new UserSettings('Europe/Madrid', 'uiLang', 'defLang'), + 'expected' => $this->createUserSetting( 'uiLang', 'defLang', 'Europe/Madrid'), 'user' => $this->getUserMock('uiLang', 'defLang', 'Europe/Madrid'), + 'isSolarDesignEnabled' => true, + ], + 'Settings for a user with interface mode' => [ + 'expected' => $this->createUserSetting( + null, + null, + 'Europe/Madrid', + GenerisRdf::PROPERTY_USER_INTERFACE_MODE_ADVANCED + ), + 'user' => $this->getUserMock( + null, + null, + 'Europe/Madrid', + GenerisRdf::PROPERTY_USER_INTERFACE_MODE_ADVANCED + ), + 'isSolarDesignEnabled' => true, + ], + 'Settings for a user with interface mode when solar design disabled' => [ + 'expected' => $this->createUserSetting( + null, + null, + 'Europe/Madrid' + ), + 'user' => $this->getUserMock( + null, + null, + 'Europe/Madrid', + GenerisRdf::PROPERTY_USER_INTERFACE_MODE_ADVANCED + ), + 'isSolarDesignEnabled' => false, ], ]; } + private function createUserSetting( + string $uiLanguageUri = null, + string $defLangUri = null, + string $userTimezone = null, + string $userInterfaceMode = null + ): UserSettingsInterface { + $userSettings = new UserSettings($userTimezone); + + $userSettings->setSetting(UserSettingsInterface::INTERFACE_MODE, $userInterfaceMode); + $userSettings->setSetting(UserSettingsInterface::UI_LANGUAGE_CODE, $uiLanguageUri); + $userSettings->setSetting(UserSettingsInterface::DATA_LANGUAGE_CODE, $defLangUri); + $userSettings->setSetting(UserSettingsInterface::TIMEZONE, $userTimezone); + + return $userSettings; + } + private function getUserMock( - string $uiLanguageUri, - string $defLangUri, - ?string $userTimezone + string $uiLanguageUri = null, + string $defLangUri = null, + string $userTimezone = null, + string $userInterfaceMode = null ): core_kernel_classes_Resource { $props = []; if (!empty($uiLanguageUri)) { @@ -144,6 +224,11 @@ private function getUserMock( new \core_kernel_classes_Literal($userTimezone), ]; } + if (!empty($userInterfaceMode)) { + $props[GenerisRdf::PROPERTY_USER_INTERFACE_MODE] = [ + $this->getOntologyMock()->getResource($userInterfaceMode) + ]; + } $user = $this->createMock(core_kernel_classes_Resource::class); $user From 7c31987d24775e4aa5a1af5fc496fd8dd3f18d8a Mon Sep 17 00:00:00 2001 From: Nevermind23 Date: Wed, 12 Jun 2024 15:49:28 +0400 Subject: [PATCH 11/12] chore: Rename function --- actions/form/class.UserSettings.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/actions/form/class.UserSettings.php b/actions/form/class.UserSettings.php index 21d2a52293..3deb1837c0 100644 --- a/actions/form/class.UserSettings.php +++ b/actions/form/class.UserSettings.php @@ -152,11 +152,11 @@ protected function initElements() FeatureFlagCheckerInterface::FEATURE_FLAG_SOLAR_DESIGN_ENABLED ) ) { - $this->addInterfaceModeEl($this->form); + $this->addInterfaceModeElement($this->form); } } - private function addInterfaceModeEl($form): void + private function addInterfaceModeElement($form): void { $interfaceModeElement = tao_helpers_form_FormFactory::getElement(UserSettingsInterface::INTERFACE_MODE, 'Radiobox'); $interfaceModeElement->setDescription(__('Interface Mode')); From bfd237270e65b78f47120239203dcd59f4c84f1b Mon Sep 17 00:00:00 2001 From: Nevermind23 Date: Wed, 12 Jun 2024 16:09:10 +0400 Subject: [PATCH 12/12] chore: Remove XML editor tab on simple interface mode --- models/classes/action/ActionBlackList.php | 34 ++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/models/classes/action/ActionBlackList.php b/models/classes/action/ActionBlackList.php index 8018eee7df..7f72bb9004 100644 --- a/models/classes/action/ActionBlackList.php +++ b/models/classes/action/ActionBlackList.php @@ -23,8 +23,11 @@ namespace oat\tao\model\action; use Laminas\ServiceManager\ServiceLocatorAwareTrait; +use oat\generis\model\GenerisRdf; use oat\oatbox\service\ConfigurableService; use oat\tao\model\featureFlag\FeatureFlagChecker; +use oat\tao\model\user\implementation\UserSettingsService; +use oat\tao\model\user\UserSettingsInterface; class ActionBlackList extends ConfigurableService { @@ -35,9 +38,13 @@ class ActionBlackList extends ConfigurableService public const OPTION_DISABLED_ACTIONS_FLAG_MAP = 'disabledActionsMap'; public const OPTION_ENABLED_ACTIONS_BY_FEATURE_FLAG_MAP = 'enabledActionsByFeatureFlagMap'; + private const SIMPLE_INTERFACE_MODE_DISABLED_ACTION = [ + 'test-xml-editor' + ]; + public function isDisabled(string $action): bool { - return ($this->isDisabledByDefault($action) && !$this->isEnabledByFeatureFlag($action)) + return $this->isDisabledByInterfaceMode($action) || ($this->isDisabledByDefault($action) && !$this->isEnabledByFeatureFlag($action)) || $this->isDisabledByFeatureFlag($action); } @@ -64,4 +71,29 @@ private function getFeatureFlagChecker(): FeatureFlagChecker { return $this->getServiceLocator()->get(FeatureFlagChecker::class); } + + private function getUserSettingsService(): UserSettingsService + { + return $this->getServiceManager()->getContainer()->get(UserSettingsService::class); + + } + + private function isDisabledByInterfaceMode(string $action): bool + { + if (!in_array($action, self::SIMPLE_INTERFACE_MODE_DISABLED_ACTION)) { + return false; + } + + $userSettings = $this->getUserSettingsService()->getCurrentUserSettings(); + + if ( + $userSettings->getSetting( + UserSettingsInterface::INTERFACE_MODE + ) === GenerisRdf::PROPERTY_USER_INTERFACE_MODE_SIMPLE + ) { + return true; + } + + return false; + } }