import 'package:flutter/material.dart'; import 'package:manager_app/Screens/Resources/resource_formatting.dart'; import 'package:manager_app/Screens/Resources/resources_screen.dart'; import 'package:manager_app/constants.dart'; import 'package:manager_app/l10n/app_localizations.dart'; import 'package:manager_api_new/api.dart'; /// Sélecteur de ressource : la Médiathèque encastrée dans la coquille de dialogue. /// /// Seul le cadre est repris ici — le contenu, c'est `ResourcesScreen`, il appartient /// au lot Médiathèque. Ce qui change : la coquille de `confirmation_dialog.dart` à la /// place de l'`AlertDialog` à rayon 20, et surtout un corps souple sous la hauteur /// disponible au lieu d'un `0,85 × hauteur` figé qui débordait de l'`AlertDialog` /// (hauteur − 48) et provoquait un défilement dans un défilement. /// /// ⛔ La largeur `0,85` reste telle quelle : le rail de facettes de la Médiathèque /// (`v1-mediatheque-plan.md` §3.3) est dimensionné sur cette hypothèse. dynamic showSelectResourceModal(String text, int maxLines, List resourceTypes, BuildContext mainContext, bool isSelect, bool isAddButton, bool isRemoveButton) async { Size size = MediaQuery.of(mainContext).size; var result = await showDialog( context: mainContext, builder: (BuildContext context) { final l = AppLocalizations.of(context)!; return Dialog( shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(kRadiusShell), side: const BorderSide(color: kLine), ), clipBehavior: Clip.antiAlias, insetPadding: const EdgeInsets.symmetric( horizontal: kSpace7, vertical: kSpace7), child: SizedBox( width: size.width * 0.85, child: Column( mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.stretch, children: [ Padding( padding: const EdgeInsets.fromLTRB(kSpace6, kSpace5, kSpace4, kSpace5), child: Row( children: [ Expanded(child: Text(text, style: kTitleCard)), if (resourceTypes.isNotEmpty && resourceTypes.length < resource_types.length) Padding( padding: const EdgeInsets.only(right: kSpace3), child: _TypeChip( label: resourceTypes .map((type) => resourceTypeLabel(l, type)) .join(' · '), ), ), IconButton( icon: const Icon(Icons.close, size: 20, color: kInk3), tooltip: l.cancel, onPressed: () => Navigator.of(context).pop(), ), ], ), ), const Divider(height: 1, thickness: 1, color: kLineSoft), Flexible( child: ResourcesScreen( isAddButton: isAddButton, isSelect: isSelect, isRemoveButton: isRemoveButton, onGetResult: (ResourceDTO? resource) { if (resource != null) { Navigator.pop(context, resource); } }, resourceTypes: resourceTypes, ), ), Container( padding: const EdgeInsets.all(kSpace4), decoration: const BoxDecoration( color: kSurface2, border: Border(top: BorderSide(color: kLineSoft)), ), child: Row( children: [ if (isSelect) Expanded( child: Text(l.selectResourceHint, style: kTextHint), ) else const Spacer(), TextButton( onPressed: () => Navigator.of(context).pop(), child: Text(l.cancel, style: const TextStyle(fontSize: 13, color: kInk2)), ), ], ), ), ], ), ), ); }, ); return result; } class _TypeChip extends StatelessWidget { const _TypeChip({required this.label}); final String label; @override Widget build(BuildContext context) { return Container( padding: const EdgeInsets.symmetric(horizontal: kSpace4, vertical: kSpace1), decoration: BoxDecoration( color: kSurface3, borderRadius: BorderRadius.circular(kRadiusPill), ), child: Text(label, style: const TextStyle(fontSize: 12, color: kInk2)), ); } }