From 7f417ff31112093141496c8e891d2315020d4d60 Mon Sep 17 00:00:00 2001 From: ggurdin <46800240+ggurdin@users.noreply.github.com> Date: Tue, 6 May 2025 17:18:24 -0400 Subject: [PATCH] chore: make dropdowns in bot settings popup visually disabled for non-admins (#2701) --- .../conversation_bot_settings_form.dart | 80 +++++-------------- .../widgets/p_language_dropdown.dart | 21 ++++- 2 files changed, 37 insertions(+), 64 deletions(-) diff --git a/lib/pangea/chat_settings/widgets/conversation_bot/conversation_bot_settings_form.dart b/lib/pangea/chat_settings/widgets/conversation_bot/conversation_bot_settings_form.dart index 3b02985c7..c4fd9ca7c 100644 --- a/lib/pangea/chat_settings/widgets/conversation_bot/conversation_bot_settings_form.dart +++ b/lib/pangea/chat_settings/widgets/conversation_bot/conversation_bot_settings_form.dart @@ -3,7 +3,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; import 'package:fluffychat/pangea/chat_settings/models/bot_options_model.dart'; -import 'package:fluffychat/pangea/chat_settings/widgets/conversation_bot/conversation_bot_no_permission_dialog.dart'; import 'package:fluffychat/pangea/chat_settings/widgets/language_level_dropdown.dart'; import 'package:fluffychat/pangea/learning_settings/enums/language_level_type_enum.dart'; import 'package:fluffychat/pangea/learning_settings/utils/p_language_store.dart'; @@ -45,68 +44,29 @@ class ConversationBotSettingsForm extends StatelessWidget { Widget build(BuildContext context) { return Column( children: [ - InkWell( - onTap: hasPermission ? null : () => showNoPermissionDialog(context), - child: PLanguageDropdown( - decorationText: L10n.of(context).targetLanguage, - languages: - MatrixState.pangeaController.pLanguageStore.targetOptions, - onChange: (lang) => hasPermission && enabled - ? onUpdateBotLanguage(lang.langCode) - : null, - initialLanguage: botOptions.targetLanguage != null - ? PLanguageStore.byLangCode(botOptions.targetLanguage!) - : null, - ), + PLanguageDropdown( + decorationText: L10n.of(context).targetLanguage, + languages: MatrixState.pangeaController.pLanguageStore.targetOptions, + onChange: (lang) => hasPermission && enabled + ? onUpdateBotLanguage(lang.langCode) + : null, + initialLanguage: botOptions.targetLanguage != null + ? PLanguageStore.byLangCode(botOptions.targetLanguage!) + : null, + enabled: enabled && hasPermission, ), const SizedBox(height: 12), - InkWell( - onTap: hasPermission ? null : () => showNoPermissionDialog(context), - child: LanguageLevelDropdown( - initialLevel: botOptions.languageLevel, - onChanged: hasPermission && enabled - ? (value) => - onUpdateBotLanguageLevel(value as LanguageLevelTypeEnum?) - : null, - validator: (value) => enabled && value == null - ? L10n.of(context).enterLanguageLevel - : null, - enabled: enabled, - ), + LanguageLevelDropdown( + initialLevel: botOptions.languageLevel, + onChanged: hasPermission && enabled + ? (value) => + onUpdateBotLanguageLevel(value as LanguageLevelTypeEnum?) + : null, + validator: (value) => enabled && value == null + ? L10n.of(context).enterLanguageLevel + : null, + enabled: enabled && hasPermission, ), - // const SizedBox(height: 12), - // Align( - // alignment: Alignment.centerLeft, - // child: Padding( - // padding: const EdgeInsets.symmetric(vertical: 12), - // child: Text( - // L10n.of(context).conversationBotModeSelectDescription, - // style: Theme.of(context).textTheme.titleLarge, - // ), - // ), - // ), - // InkWell( - // onTap: hasPermission ? null : () => showNoPermissionDialog(context), - // child: ConversationBotModeSelect( - // initialMode: hasUpdatedMode ? botOptions.mode : null, - // onChanged: hasPermission && enabled ? onUpdateBotMode : null, - // enabled: enabled, - // validator: (value) { - // return value == null && enabled - // ? L10n.of(context).botModeValidation - // : null; - // }, - // ), - // ), - // const SizedBox(height: 12), - // ConversationBotModeDynamicZone( - // discussionTopicController: discussionTopicController, - // discussionKeywordsController: discussionKeywordsController, - // customSystemPromptController: customSystemPromptController, - // enabled: enabled, - // hasPermission: hasPermission, - // mode: hasUpdatedMode ? botOptions.mode : null, - // ), ], ); } diff --git a/lib/pangea/learning_settings/widgets/p_language_dropdown.dart b/lib/pangea/learning_settings/widgets/p_language_dropdown.dart index 0fa8a9c84..433d04270 100644 --- a/lib/pangea/learning_settings/widgets/p_language_dropdown.dart +++ b/lib/pangea/learning_settings/widgets/p_language_dropdown.dart @@ -21,6 +21,7 @@ class PLanguageDropdown extends StatefulWidget { final String? Function(LanguageModel?)? validator; final Color? backgroundColor; final bool hasError; + final bool enabled; const PLanguageDropdown({ super.key, @@ -34,6 +35,7 @@ class PLanguageDropdown extends StatefulWidget { this.validator, this.backgroundColor, this.hasError = false, + this.enabled = true, }); @override @@ -87,12 +89,14 @@ class PLanguageDropdownState extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ DropdownButtonFormField2( + enableFeedback: widget.enabled, customButton: widget.initialLanguage != null && sortedLanguages.contains(widget.initialLanguage) ? LanguageDropDownEntry( languageModel: widget.initialLanguage!, isL2List: widget.isL2List, isDropdown: true, + enabled: widget.enabled, ) : null, menuItemStyleData: const MenuItemStyleData( @@ -131,6 +135,7 @@ class PLanguageDropdownState extends State { if (widget.showMultilingual) DropdownMenuItem( value: LanguageModel.multiLingual(context), + enabled: widget.enabled, child: LanguageDropDownEntry( languageModel: LanguageModel.multiLingual(context), isL2List: widget.isL2List, @@ -150,12 +155,13 @@ class PLanguageDropdownState extends State { child: LanguageDropDownEntry( languageModel: languageModel, isL2List: widget.isL2List, + enabled: widget.enabled, ), ), ), ), ], - onChanged: (value) => widget.onChange(value!), + onChanged: widget.enabled ? (value) => widget.onChange(value!) : null, value: widget.initialLanguage, validator: (value) => widget.validator?.call(value), dropdownSearchData: DropdownSearchData( @@ -210,20 +216,25 @@ class LanguageDropDownEntry extends StatelessWidget { final LanguageModel languageModel; final bool isL2List; final bool isDropdown; + final bool enabled; const LanguageDropDownEntry({ super.key, required this.languageModel, required this.isL2List, this.isDropdown = false, + this.enabled = true, }); @override Widget build(BuildContext context) { return Row( children: [ - LanguageFlag( - language: languageModel, + Opacity( + opacity: enabled ? 1 : 0.5, + child: LanguageFlag( + language: languageModel, + ), ), const SizedBox(width: 10), Expanded( @@ -232,7 +243,9 @@ class LanguageDropDownEntry extends StatelessWidget { Text( languageModel.getDisplayName(context) ?? "", style: const TextStyle().copyWith( - color: Theme.of(context).textTheme.bodyLarge!.color, + color: enabled + ? Theme.of(context).textTheme.bodyLarge!.color + : Theme.of(context).disabledColor, fontSize: 14, ), overflow: TextOverflow.ellipsis,