manager-app/lib/Screens/Resources/select_resource_modal.dart

126 lines
4.8 KiB
Dart
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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)),
);
}
}