126 lines
4.8 KiB
Dart
126 lines
4.8 KiB
Dart
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<ResourceType> 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)),
|
||
);
|
||
}
|
||
}
|