diff --git a/src/bundle/DependencyInjection/Configuration/Parser/AdminUiParser.php b/src/bundle/DependencyInjection/Configuration/Parser/AdminUiParser.php new file mode 100644 index 0000000000..c50215dddc --- /dev/null +++ b/src/bundle/DependencyInjection/Configuration/Parser/AdminUiParser.php @@ -0,0 +1,82 @@ + UserMode::EXPERT, + 'smart' => UserMode::SMART, + ]; + + /** + * @param array $scopeSettings + */ + public function mapConfig( + array &$scopeSettings, + $currentScope, + ContextualizerInterface $contextualizer + ): void { + if (empty($scopeSettings['admin_ui'])) { + return; + } + + $settings = $scopeSettings['admin_ui']; + + $this->addUserModeParameters($settings, $currentScope, $contextualizer); + } + + public function addSemanticConfig(NodeBuilder $nodeBuilder): void + { + $root = $nodeBuilder->arrayNode('admin_ui'); + $root->children() + ->enumNode('default_user_mode') + ->info('Default user mode setting') + ->values(['smart', 'expert']) + ->end() + ->end(); + } + + /** + * @param array $settings + */ + private function addUserModeParameters( + array $settings, + string $currentScope, + ContextualizerInterface $contextualizer + ): void { + $userMode = $settings['default_user_mode']; + + if (!array_key_exists($userMode, self::MODES)) { + return; + } + + $contextualizer->setContextualParameter( + 'admin_ui.default_user_mode', + $currentScope, + self::MODES[$userMode] + ); + } +} diff --git a/src/bundle/IbexaAdminUiBundle.php b/src/bundle/IbexaAdminUiBundle.php index b168dd5996..521a9a9e49 100644 --- a/src/bundle/IbexaAdminUiBundle.php +++ b/src/bundle/IbexaAdminUiBundle.php @@ -72,6 +72,7 @@ private function getConfigParsers(): array new Parser\SubtreePath(), new Parser\LimitationValueTemplates(), new Parser\Assets(), + new Parser\AdminUiParser(), ]; } } diff --git a/src/bundle/Resources/config/default_parameters.yaml b/src/bundle/Resources/config/default_parameters.yaml index d96d7a7a44..8be5cee2f0 100644 --- a/src/bundle/Resources/config/default_parameters.yaml +++ b/src/bundle/Resources/config/default_parameters.yaml @@ -76,3 +76,5 @@ parameters: ibexa.io.multifile_upload.max_file_size: 5242880 ibexa.admin_ui.content_tree.node_factory.max_location_ids_in_single_aggregation: 100 + + ibexa.site_access.config.default.admin_ui.default_user_mode: '1' diff --git a/src/bundle/Resources/config/services/user_settings.yaml b/src/bundle/Resources/config/services/user_settings.yaml index 8a9fbf0897..84e4139290 100644 --- a/src/bundle/Resources/config/services/user_settings.yaml +++ b/src/bundle/Resources/config/services/user_settings.yaml @@ -25,3 +25,12 @@ services: tags: - { name: ibexa.user.setting.value, identifier: in_context_translation, group: location, priority: 60 } - { name: ibexa.user.setting.mapper.form, identifier: in_context_translation } + + Ibexa\AdminUi\UserSetting\Group\UserModeGroup: + tags: + - { name: ibexa.user.setting.group, identifier: mode, priority: -10 } + + Ibexa\AdminUi\UserSetting\UserMode: + tags: + - { name: ibexa.user.setting.value, identifier: user_mode, group: mode, priority: 10 } + - { name: ibexa.user.setting.mapper.form, identifier: user_mode } diff --git a/src/bundle/Resources/translations/ibexa_user_settings.en.xliff b/src/bundle/Resources/translations/ibexa_user_settings.en.xliff index 7a0ce0b32c..f05504af18 100644 --- a/src/bundle/Resources/translations/ibexa_user_settings.en.xliff +++ b/src/bundle/Resources/translations/ibexa_user_settings.en.xliff @@ -56,6 +56,11 @@ Date and Time will be displayed in this format: key: settings.datetime_format.preview_label + + Mode + Mode + key: settings.group.mode.name + Toggle In-Context translation feature Toggle In-Context translation feature @@ -76,6 +81,51 @@ In-Context translation key: settings.in_context_translation.value.title + + Mode + Mode + key: user.setting.mode.description + + + Expert + Expert + key: user.setting.mode.expert + + + Smart mode – A clean and intuitive interface with a simplified content structure, designed for new and non-advanced users. Features include:

+
    +
  • Quick preview
  • +
  • Hidden Technical Details tab
  • +
  • Hidden Locations and Versions tabs in Content items
  • +
+

Expert mode – Tailored for experienced users familiar with Ibexa DXP. Provides comprehensive insights into the technical aspects of Content structure, including:

+
    +
  • Technical Details tab
  • +
  • Location: Archived versions
  • +
]]> + Smart mode – A clean and intuitive interface with a simplified content structure, designed for new and non-advanced users. Features include:

+
    +
  • Quick preview
  • +
  • Hidden Technical Details tab
  • +
  • Hidden Locations and Versions tabs in Content items
  • +
+

Expert mode – Tailored for experienced users familiar with Ibexa DXP. Provides comprehensive insights into the technical aspects of Content structure, including:

+
    +
  • Technical Details tab
  • +
  • Location: Archived versions
  • +
]]>
+ key: user.setting.mode.help +
+ + Mode + Mode + key: user.setting.mode.name + + + Smart + Smart + key: user.setting.mode.smart + diff --git a/src/lib/Form/Type/User/UserModeChoiceType.php b/src/lib/Form/Type/User/UserModeChoiceType.php new file mode 100644 index 0000000000..8ce56ea399 --- /dev/null +++ b/src/lib/Form/Type/User/UserModeChoiceType.php @@ -0,0 +1,33 @@ +setDefaults([ + 'translation_domain' => 'ibexa_user_settings', + 'choices' => [ + 'user.setting.mode.smart' => UserMode::SMART, + 'user.setting.mode.expert' => UserMode::EXPERT, + ], + ]); + } + + public function getParent(): string + { + return ChoiceType::class; + } +} diff --git a/src/lib/UserSetting/Group/UserModeGroup.php b/src/lib/UserSetting/Group/UserModeGroup.php new file mode 100644 index 0000000000..3885023027 --- /dev/null +++ b/src/lib/UserSetting/Group/UserModeGroup.php @@ -0,0 +1,44 @@ + $values + */ + public function __construct( + TranslatorInterface $translator, + array $values = [] + ) { + $this->translator = $translator; + parent::__construct($values); + } + + public function getName(): string + { + return $this->translator->trans( + /** @Desc("Mode") */ + 'settings.group.mode.name', + [], + 'ibexa_user_settings' + ); + } + + public function getDescription(): string + { + return ''; + } +} diff --git a/src/lib/UserSetting/UserMode.php b/src/lib/UserSetting/UserMode.php new file mode 100644 index 0000000000..b1a9faab9d --- /dev/null +++ b/src/lib/UserSetting/UserMode.php @@ -0,0 +1,113 @@ +configResolver = $configResolver; + $this->translator = $translator; + } + + public function getName(): string + { + return $this->translator->trans( + 'user.setting.mode.name', + [], + 'ibexa_user_settings' + ); + } + + public function getDescription(): string + { + return $this->translator->trans( + 'user.setting.mode.description', + [], + 'ibexa_user_settings' + ); + } + + public function getDisplayValue(string $storageValue): string + { + $translationMap = [ + self::EXPERT => $this->translator->trans('user.setting.mode.expert', [], 'ibexa_user_settings'), + self::SMART => $this->translator->trans('user.setting.mode.smart', [], 'ibexa_user_settings'), + ]; + + return $translationMap[$storageValue] ?? $storageValue; + } + + public function getDefaultValue(): string + { + return $this->configResolver->getParameter('admin_ui.default_user_mode'); + } + + public function mapFieldForm( + FormBuilderInterface $formBuilder, + ValueDefinitionInterface $value + ): FormBuilderInterface { + return $formBuilder->create( + 'value', + UserModeChoiceType::class, + [ + 'label' => 'user.setting.mode.name', + 'expanded' => true, + 'multiple' => false, + 'translation_domain' => 'ibexa_user_settings', + 'help' => $this->translator->trans('user.setting.mode.help', [], 'ibexa_user_settings'), + 'help_html' => true, + ] + ); + } + + public static function getTranslationMessages(): array + { + return [ + (new Message('user.setting.mode.help', 'ibexa_user_settings')) + ->setDesc( + '

Smart mode – A clean and intuitive interface with a simplified content + structure, designed for new and non-advanced users. Features include:

+ +

Expert mode – Tailored for experienced users familiar with Ibexa DXP. + Provides comprehensive insights into the technical aspects of Content structure, including:

+ ' + ), + (new Message('user.setting.mode.expert', 'ibexa_user_settings'))->setDesc('Expert'), + (new Message('user.setting.mode.smart', 'ibexa_user_settings'))->setDesc('Smart'), + (new Message('user.setting.mode.name', 'ibexa_user_settings'))->setDesc('Mode'), + (new Message('user.setting.mode.description', 'ibexa_user_settings'))->setDesc('Mode'), + ]; + } +}