TF-3712 Add SettingsCapability to hide language setting

This commit is contained in:
DatDang
2025-06-04 11:32:24 +07:00
committed by Dat H. Pham
parent 787b9fadd3
commit b576a6d267
7 changed files with 76 additions and 15 deletions
@@ -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<String, dynamic> toJson() {
@@ -139,4 +141,12 @@ extension SessionExtensions on Session {
return false;
}
}
bool isLanguageReadOnly(AccountId accountId) {
final settingsCapability = getCapabilityProperties<SettingsCapability>(
accountId,
capabilityServerSettings,
);
return settingsCapability?.readOnlyProperties?.contains('language') == true;
}
}
@@ -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!);
@@ -119,7 +119,11 @@ class ManageAccountDashBoardView extends GetWidget<ManageAccountDashBoardControl
case AccountMenuItem.profiles:
return ProfilesView(responsiveUtils: controller.responsiveUtils);
case AccountMenuItem.languageAndRegion:
if (controller.isLanguageSettingDisplayed) {
return const LanguageAndRegionView();
} else {
return const SizedBox.shrink();
}
case AccountMenuItem.emailRules:
if (controller.isRuleFilterCapabilitySupported){
return EmailRulesView();
@@ -46,7 +46,8 @@ class ManageAccountMenuController extends GetxController with ContactSupportMixi
if (dashBoardController.isVacationCapabilitySupported)
AccountMenuItem.vacation,
AccountMenuItem.mailboxVisibility,
AccountMenuItem.languageAndRegion
if (dashBoardController.isLanguageSettingDisplayed)
AccountMenuItem.languageAndRegion,
];
listAccountMenuItem.value = newListMenuSetting;
@@ -128,6 +128,12 @@ class SettingsFirstLevelView extends GetWidget<SettingsController> {
subtitle: AppLocalizations.of(context).folderVisibilitySubtitle,
() => controller.selectSettings(AccountMenuItem.mailboxVisibility)
),
Obx(() {
if (!controller.manageAccountDashboardController.isLanguageSettingDisplayed) {
return const SizedBox.shrink();
}
return Column(children: [
Divider(
color: AppColor.colorDividerHorizontal,
height: 1,
@@ -139,6 +145,8 @@ class SettingsFirstLevelView extends GetWidget<SettingsController> {
AccountMenuItem.languageAndRegion.getIcon(controller.imagePaths),
() => controller.selectSettings(AccountMenuItem.languageAndRegion)
),
]);
}),
Obx(() {
if (controller.manageAccountDashboardController.isFcmCapabilitySupported && PlatformInfo.isMobile) {
return Column(children: [
@@ -197,7 +197,11 @@ class SettingsView extends GetWidget<SettingsController> {
case AccountMenuItem.profiles:
return ProfilesView(responsiveUtils: controller.responsiveUtils);
case AccountMenuItem.languageAndRegion:
if (controller.manageAccountDashboardController.isLanguageSettingDisplayed) {
return const LanguageAndRegionView();
} else {
return const SizedBox.shrink();
}
case AccountMenuItem.emailRules:
if (controller.manageAccountDashboardController.isRuleFilterCapabilitySupported) {
return EmailRulesView();
@@ -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';
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<String>? readOnlyProperties;
factory SettingsCapability.fromJson(Map<String, dynamic> json) =>
_$SettingsCapabilityFromJson(json);
Map<String, dynamic> toJson() => _$SettingsCapabilityToJson(this);
factory SettingsCapability.deserialize(Map<String, dynamic> json) {
return SettingsCapability.fromJson(json);
}
@override
List<Object?> get props => [readOnlyProperties];
}