diff --git a/lib/features/home/domain/extensions/session_extensions.dart b/lib/features/home/domain/extensions/session_extensions.dart index 8c36ed220..a1a063f6a 100644 --- a/lib/features/home/domain/extensions/session_extensions.dart +++ b/lib/features/home/domain/extensions/session_extensions.dart @@ -15,6 +15,7 @@ import 'package:jmap_dart_client/jmap/core/unsigned_int.dart'; import 'package:model/download_all/download_all_capability.dart'; import 'package:model/mailbox/mailbox_constants.dart'; import 'package:model/model.dart'; +import 'package:server_settings/server_settings/capability_server_settings.dart'; import 'package:tmail_ui_user/features/home/data/model/session_hive_obj.dart'; import 'package:tmail_ui_user/features/home/domain/converter/session_account_converter.dart'; import 'package:tmail_ui_user/features/home/domain/converter/session_capabilities_converter.dart'; @@ -29,6 +30,7 @@ extension SessionExtensions on Session { linagoraContactSupportCapability: ContactSupportCapability.deserialize, tmailContactCapabilityIdentifier: AutocompleteCapability.deserialize, linagoraDownloadAllCapability: DownloadAllCapability.deserialize, + capabilityServerSettings: SettingsCapability.deserialize, }; Map toJson() { @@ -139,4 +141,12 @@ extension SessionExtensions on Session { return false; } } + + bool isLanguageReadOnly(AccountId accountId) { + final settingsCapability = getCapabilityProperties( + accountId, + capabilityServerSettings, + ); + return settingsCapability?.readOnlyProperties?.contains('language') == true; + } } \ No newline at end of file diff --git a/lib/features/manage_account/presentation/manage_account_dashboard_controller.dart b/lib/features/manage_account/presentation/manage_account_dashboard_controller.dart index c521f8e7c..8ae32f154 100644 --- a/lib/features/manage_account/presentation/manage_account_dashboard_controller.dart +++ b/lib/features/manage_account/presentation/manage_account_dashboard_controller.dart @@ -15,6 +15,7 @@ import 'package:rule_filter/rule_filter/capability_rule_filter.dart'; import 'package:server_settings/server_settings/capability_server_settings.dart'; import 'package:tmail_ui_user/features/base/action/ui_action.dart'; import 'package:tmail_ui_user/features/base/reloadable/reloadable_controller.dart'; +import 'package:tmail_ui_user/features/home/domain/extensions/session_extensions.dart'; import 'package:tmail_ui_user/features/manage_account/domain/state/export_trace_log_state.dart'; import 'package:tmail_ui_user/features/manage_account/domain/state/get_all_vacation_state.dart'; import 'package:tmail_ui_user/features/manage_account/domain/state/update_vacation_state.dart'; @@ -235,6 +236,16 @@ class ManageAccountDashBoardController extends ReloadableController { } } + bool get isLanguageSettingDisplayed { + if (!isServerSettingsCapabilitySupported) return true; + + if (accountId.value == null || sessionCurrent == null) { + return false; + } + + return !sessionCurrent!.isLanguageReadOnly(accountId.value!); + } + bool get isVacationCapabilitySupported { if (accountId.value != null && sessionCurrent != null) { return CapabilityIdentifier.jmapVacationResponse.isSupported(sessionCurrent!, accountId.value!); diff --git a/lib/features/manage_account/presentation/manage_account_dashboard_view.dart b/lib/features/manage_account/presentation/manage_account_dashboard_view.dart index ec9403d41..c1d56131a 100644 --- a/lib/features/manage_account/presentation/manage_account_dashboard_view.dart +++ b/lib/features/manage_account/presentation/manage_account_dashboard_view.dart @@ -119,7 +119,11 @@ class ManageAccountDashBoardView extends GetWidget { subtitle: AppLocalizations.of(context).folderVisibilitySubtitle, () => controller.selectSettings(AccountMenuItem.mailboxVisibility) ), - Divider( - color: AppColor.colorDividerHorizontal, - height: 1, - indent: SettingsUtils.getHorizontalPadding(context, controller.responsiveUtils), - endIndent: SettingsUtils.getHorizontalPadding(context, controller.responsiveUtils) - ), - SettingFirstLevelTileBuilder( - AccountMenuItem.languageAndRegion.getName(AppLocalizations.of(context)), - AccountMenuItem.languageAndRegion.getIcon(controller.imagePaths), - () => controller.selectSettings(AccountMenuItem.languageAndRegion) - ), + Obx(() { + if (!controller.manageAccountDashboardController.isLanguageSettingDisplayed) { + return const SizedBox.shrink(); + } + + return Column(children: [ + Divider( + color: AppColor.colorDividerHorizontal, + height: 1, + indent: SettingsUtils.getHorizontalPadding(context, controller.responsiveUtils), + endIndent: SettingsUtils.getHorizontalPadding(context, controller.responsiveUtils) + ), + SettingFirstLevelTileBuilder( + AccountMenuItem.languageAndRegion.getName(AppLocalizations.of(context)), + AccountMenuItem.languageAndRegion.getIcon(controller.imagePaths), + () => controller.selectSettings(AccountMenuItem.languageAndRegion) + ), + ]); + }), Obx(() { if (controller.manageAccountDashboardController.isFcmCapabilitySupported && PlatformInfo.isMobile) { return Column(children: [ diff --git a/lib/features/manage_account/presentation/menu/settings/settings_view.dart b/lib/features/manage_account/presentation/menu/settings/settings_view.dart index 5f4ec03c7..099a2fcb2 100644 --- a/lib/features/manage_account/presentation/menu/settings/settings_view.dart +++ b/lib/features/manage_account/presentation/menu/settings/settings_view.dart @@ -197,7 +197,11 @@ class SettingsView extends GetWidget { case AccountMenuItem.profiles: return ProfilesView(responsiveUtils: controller.responsiveUtils); case AccountMenuItem.languageAndRegion: - return const LanguageAndRegionView(); + if (controller.manageAccountDashboardController.isLanguageSettingDisplayed) { + return const LanguageAndRegionView(); + } else { + return const SizedBox.shrink(); + } case AccountMenuItem.emailRules: if (controller.manageAccountDashboardController.isRuleFilterCapabilitySupported) { return EmailRulesView(); diff --git a/server_settings/lib/server_settings/capability_server_settings.dart b/server_settings/lib/server_settings/capability_server_settings.dart index cd55810f2..7f0353aac 100644 --- a/server_settings/lib/server_settings/capability_server_settings.dart +++ b/server_settings/lib/server_settings/capability_server_settings.dart @@ -1,3 +1,26 @@ import 'package:jmap_dart_client/jmap/core/capability/capability_identifier.dart'; +import 'package:jmap_dart_client/jmap/core/capability/capability_properties.dart'; +import 'package:json_annotation/json_annotation.dart'; -final capabilityServerSettings = CapabilityIdentifier(Uri.parse('com:linagora:params:jmap:settings')); \ No newline at end of file +part 'capability_server_settings.g.dart'; + +final capabilityServerSettings = CapabilityIdentifier(Uri.parse('com:linagora:params:jmap:settings')); + +@JsonSerializable() +class SettingsCapability extends CapabilityProperties { + SettingsCapability({this.readOnlyProperties}); + + final List? readOnlyProperties; + + factory SettingsCapability.fromJson(Map json) => + _$SettingsCapabilityFromJson(json); + + Map toJson() => _$SettingsCapabilityToJson(this); + + factory SettingsCapability.deserialize(Map json) { + return SettingsCapability.fromJson(json); + } + + @override + List get props => [readOnlyProperties]; +} \ No newline at end of file