diff --git a/app/generate_screendocs/sequence_utils.dart b/app/generate_screendocs/sequence_utils.dart index fe70c1a9..95c87dcb 100644 --- a/app/generate_screendocs/sequence_utils.dart +++ b/app/generate_screendocs/sequence_utils.dart @@ -127,7 +127,7 @@ Future _interactWithDrugListItem( // ignore: avoid_print print(contextDetails); // ignore: avoid_print - print('Avilable drug items:'); + print('Available drug items:'); final availableItems = find.descendant( of: listFinder, matching: find.byType(itemType, skipOffstage: false), @@ -154,9 +154,9 @@ Future interactWithDrugInSelection( ) async { await _interactWithDrugListItem( tester, - itemKey: 'drug-checkbox-tile-${drug.toLowerCase()}-all', + itemKey: 'drug-selection-tile-${drug.toLowerCase()}-all', listKey: 'drug-selection', - itemType: CheckboxListTileWrapper, + itemType: SwitchListTile, scroll: scroll, tap: tap, raiseException: raiseException, diff --git a/app/lib/common/widgets/checkbox_list_tile_wrapper.dart b/app/lib/common/widgets/checkbox_list_tile_wrapper.dart deleted file mode 100644 index 9370b2b3..00000000 --- a/app/lib/common/widgets/checkbox_list_tile_wrapper.dart +++ /dev/null @@ -1,39 +0,0 @@ -import '../module.dart'; - -class CheckboxListTileWrapper extends StatelessWidget { - const CheckboxListTileWrapper({ - super.key, - required this.title, - required this.isChecked, - required this.onChanged, - this.subtitle, - this.isEnabled = true, - this.contentPadding, - }); - - final String title; - final String? subtitle; - final bool isChecked; - // ignore: avoid_positional_boolean_parameters - final void Function(bool?) onChanged; - final bool isEnabled; - final EdgeInsetsGeometry? contentPadding; - - @override - Widget build(BuildContext context) { - return ListTile( - enabled: isEnabled, - title: Text(title, style: PharMeTheme.textTheme.bodyLarge), - subtitle: subtitle != null - ? Text(subtitle!, style: PharMeTheme.textTheme.bodyMedium) - : null, - contentPadding: contentPadding, - onTap: () => isEnabled ? onChanged(!isChecked) : null, - leading: CheckboxWrapper( - isEnabled: isEnabled, - isChecked: isChecked, - onChanged: onChanged, - ), - ); - } -} \ No newline at end of file diff --git a/app/lib/common/widgets/drug_activity_selection.dart b/app/lib/common/widgets/drug_activity_selection.dart new file mode 100644 index 00000000..f6b4ab2c --- /dev/null +++ b/app/lib/common/widgets/drug_activity_selection.dart @@ -0,0 +1,57 @@ +import '../module.dart'; + +typedef SetDrugActivityFunction = void Function({ + required Drug drug, + required bool? value, +}); + +SwitchListTile buildDrugActivitySelection({ + Key? key, + required BuildContext context, + required Drug drug, + required String title, + String? subtitle, + required SetDrugActivityFunction setActivity, + required bool isActive, + required bool disabled, + EdgeInsetsGeometry? contentPadding, +}) => SwitchListTile.adaptive( + key: key, + value: isActive, + activeColor: PharMeTheme.primaryColor, + title: Text(title), + subtitle: subtitle.isNotNullOrBlank ? Text(subtitle!, style: PharMeTheme.textTheme.bodyMedium): null, + contentPadding: contentPadding, + onChanged: disabled ? null : (newValue) { + if (isInhibitor(drug.name)) { + showAdaptiveDialog( + context: context, + builder: (context) => DialogWrapper( + title: context.l10n.drugs_page_active_warn_header, + content: DialogContentText( + context.l10n.drugs_page_active_warn, + ), + actions: [ + DialogAction( + onPressed: () => Navigator.pop( + context, + 'Cancel', + ), + text: context.l10n.action_cancel, + ), + DialogAction( + onPressed: () { + Navigator.pop(context, 'OK'); + setActivity(drug: drug, value: newValue); + }, + text: context.l10n.action_continue, + isDestructive: true, + ), + ], + ), + ); + } else { + setActivity(drug: drug, value: newValue); + } + }, +); \ No newline at end of file diff --git a/app/lib/common/widgets/drug_list/builder.dart b/app/lib/common/widgets/drug_list/builder.dart index a0193f21..6591d6fa 100644 --- a/app/lib/common/widgets/drug_list/builder.dart +++ b/app/lib/common/widgets/drug_list/builder.dart @@ -1,5 +1,12 @@ import '../../module.dart'; +class DrugItemsBuildParams { + DrugItemsBuildParams({required this.isEditable, required this.setActivity}); + + final bool isEditable; + final SetDrugActivityFunction setActivity; +} + List buildDrugList( BuildContext context, DrugListState state, @@ -10,13 +17,13 @@ List buildDrugList( BuildContext context, List drugs, { - Map? buildParams, + DrugItemsBuildParams? buildParams, bool showDrugInteractionIndicator, } ) buildDrugItems = buildDrugCards, bool showDrugInteractionIndicator = false, bool useDrugClass = true, - Map? drugItemsBuildParams, + DrugItemsBuildParams? drugItemsBuildParams, } ) { List buildDrugList( diff --git a/app/lib/common/widgets/drug_list/drug_items/drug_cards.dart b/app/lib/common/widgets/drug_list/drug_items/drug_cards.dart index f773824a..16a84f25 100644 --- a/app/lib/common/widgets/drug_list/drug_items/drug_cards.dart +++ b/app/lib/common/widgets/drug_list/drug_items/drug_cards.dart @@ -5,7 +5,7 @@ List buildDrugCards( BuildContext context, List drugs, { - Map? buildParams, + DrugItemsBuildParams? buildParams, bool showDrugInteractionIndicator = false, } ) { diff --git a/app/lib/common/widgets/drug_list/drug_items/drug_selection_list.dart b/app/lib/common/widgets/drug_list/drug_items/drug_selection_list.dart index 0d35d703..95f6fece 100644 --- a/app/lib/common/widgets/drug_list/drug_items/drug_selection_list.dart +++ b/app/lib/common/widgets/drug_list/drug_items/drug_selection_list.dart @@ -5,7 +5,7 @@ List buildDrugSelectionList( BuildContext context, List drugs, { - Map? buildParams, + DrugItemsBuildParams? buildParams, bool showDrugInteractionIndicator = false, } ) { @@ -19,14 +19,14 @@ List buildDrugSelectionList( style: TextStyle(fontStyle: FontStyle.italic), ), )] - : _buildCheckboxList( + : _buildSelectionList( context, activeDrugs, buildParams, showDrugInteractionIndicator, keyPrefix: 'active', ); - final allDrugsList = _buildCheckboxList( + final allDrugsList = _buildSelectionList( context, drugs, buildParams, @@ -49,21 +49,21 @@ List buildDrugSelectionList( ]; } -List _buildCheckboxList( +List _buildSelectionList( BuildContext context, List drugs, - Map buildParams, + DrugItemsBuildParams buildParams, bool showDrugInteractionIndicator, { required String keyPrefix } ) { - final onCheckboxChange = buildParams['onCheckboxChange']; - final checkboxesEnabled = buildParams['checkboxesEnabled']; return drugs.map( - (drug) => CheckboxListTileWrapper( - key: Key('drug-checkbox-tile-${drug.name}-$keyPrefix'), - isEnabled: checkboxesEnabled, - isChecked: drug.isActive, - onChanged: (value) => onCheckboxChange(drug, value), + (drug) => buildDrugActivitySelection( + key: Key('drug-selection-tile-${drug.name}-$keyPrefix'), + context: context, + drug: drug, + disabled: !buildParams.isEditable, + isActive: drug.isActive, + setActivity: buildParams.setActivity, title: formatDrugName(drug, showDrugInteractionIndicator), subtitle: (drug.annotations.brandNames.isNotEmpty) ? formatBrandNames(context, drug) : diff --git a/app/lib/common/widgets/drug_search/builder.dart b/app/lib/common/widgets/drug_search/builder.dart index 8a13d328..6705924e 100644 --- a/app/lib/common/widgets/drug_search/builder.dart +++ b/app/lib/common/widgets/drug_search/builder.dart @@ -25,7 +25,7 @@ class DrugSearch extends HookWidget { BuildContext context, List drugs, { - Map? buildParams, + DrugItemsBuildParams? buildParams, bool showDrugInteractionIndicator, } ) buildDrugItems; @@ -33,7 +33,7 @@ class DrugSearch extends HookWidget { final DrugListCubit cubit; final DrugListState state; final ActiveDrugs activeDrugs; - final Map? drugItemsBuildParams; + final DrugItemsBuildParams? drugItemsBuildParams; @override Widget build(BuildContext context) { diff --git a/app/lib/common/widgets/module.dart b/app/lib/common/widgets/module.dart index 9668571d..c5f35238 100644 --- a/app/lib/common/widgets/module.dart +++ b/app/lib/common/widgets/module.dart @@ -1,10 +1,10 @@ export 'annotation_table.dart'; -export 'checkbox_list_tile_wrapper.dart'; export 'checkbox_wrapper.dart'; export 'dialog_action.dart'; export 'dialog_content_text.dart'; export 'dialog_wrapper.dart'; export 'direction_button.dart'; +export 'drug_activity_selection.dart'; export 'drug_list/builder.dart'; export 'drug_list/cubit.dart'; export 'drug_list/drug_items/drug_cards.dart'; diff --git a/app/lib/drug/cubit.dart b/app/lib/drug/cubit.dart index a2a39cd3..ccab438d 100644 --- a/app/lib/drug/cubit.dart +++ b/app/lib/drug/cubit.dart @@ -12,8 +12,7 @@ class DrugCubit extends Cubit { final ActiveDrugs activeDrugs; - // ignore: avoid_positional_boolean_parameters - Future setActivity(Drug drug, bool? value) async { + Future setActivity({required Drug drug, required bool? value}) async { if (value == null) return; emit(DrugState.loading()); await activeDrugs.changeActivity(drug.name, value); diff --git a/app/lib/drug/pages/drug.dart b/app/lib/drug/pages/drug.dart index cdc2cd34..69a87474 100644 --- a/app/lib/drug/pages/drug.dart +++ b/app/lib/drug/pages/drug.dart @@ -56,8 +56,7 @@ class DrugPage extends StatelessWidget { DrugAnnotationCards( drug, isActive: drug.isActive, - setActivity: ({ value }) => - context.read().setActivity(drug, value), + setActivity: context.read().setActivity, disabled: loading, ), SizedBox(height: PharMeTheme.mediumSpace), diff --git a/app/lib/drug/widgets/annotation_cards/drug.dart b/app/lib/drug/widgets/annotation_cards/drug.dart index 7ad8ada5..a503cb19 100644 --- a/app/lib/drug/widgets/annotation_cards/drug.dart +++ b/app/lib/drug/widgets/annotation_cards/drug.dart @@ -11,7 +11,7 @@ class DrugAnnotationCards extends StatelessWidget { final Drug drug; final bool isActive; - final void Function({ bool? value }) setActivity; + final SetDrugActivityFunction setActivity; final bool disabled; @override @@ -22,43 +22,14 @@ class DrugAnnotationCards extends StatelessWidget { innerPadding: EdgeInsets.symmetric(horizontal: PharMeTheme.mediumSpace), child: Column( children: [ - SwitchListTile.adaptive( - value: isActive, - activeColor: PharMeTheme.primaryColor, - title: Text(context.l10n.drugs_page_text_active), + buildDrugActivitySelection( + context: context, + drug: drug, + setActivity: setActivity, + title: context.l10n.drugs_page_text_active, + isActive: isActive, + disabled: disabled, contentPadding: EdgeInsets.zero, - onChanged: disabled ? null : (newValue) { - if (isInhibitor(drug.name)) { - showAdaptiveDialog( - context: context, - builder: (context) => DialogWrapper( - title: context.l10n.drugs_page_active_warn_header, - content: DialogContentText( - context.l10n.drugs_page_active_warn, - ), - actions: [ - DialogAction( - onPressed: () => Navigator.pop( - context, - 'Cancel', - ), - text: context.l10n.action_cancel, - ), - DialogAction( - onPressed: () { - Navigator.pop(context, 'OK'); - setActivity(value: newValue); - }, - text: context.l10n.action_continue, - isDestructive: true, - ), - ], - ), - ); - } else { - setActivity(value: newValue); - } - }, ), if (isInhibitor(drug.name)) ...[ SizedBox(height: PharMeTheme.smallSpace), diff --git a/app/lib/drug_selection/cubit.dart b/app/lib/drug_selection/cubit.dart index 4d0af2c3..87017c67 100644 --- a/app/lib/drug_selection/cubit.dart +++ b/app/lib/drug_selection/cubit.dart @@ -10,8 +10,10 @@ class DrugSelectionCubit extends Cubit { final ActiveDrugs activeDrugs; - // ignore: avoid_positional_boolean_parameters - Future updateDrugActivity(Drug drug, bool? value) async { + Future updateDrugActivity({ + required Drug drug, + required bool? value, + }) async { if (value == null) return; emit(DrugSelectionState.updating()); await activeDrugs.changeActivity(drug.name, value); diff --git a/app/lib/drug_selection/pages/drug_selection.dart b/app/lib/drug_selection/pages/drug_selection.dart index d9b4bf96..92411130 100644 --- a/app/lib/drug_selection/pages/drug_selection.dart +++ b/app/lib/drug_selection/pages/drug_selection.dart @@ -100,12 +100,10 @@ class DrugSelectionPage extends HookWidget { keepPosition: true, useDrugClass: false, buildDrugItems: buildDrugSelectionList, - drugItemsBuildParams: { - 'checkboxesEnabled': _isEditable(state), - 'onCheckboxChange': (drug, value) => context - .read() - .updateDrugActivity(drug, value), - }, + drugItemsBuildParams: DrugItemsBuildParams( + isEditable: _isEditable(state), + setActivity: context.read().updateDrugActivity, + ), showDrugInteractionIndicator: !concludesOnboarding, ), );