Implementation
static Future<void> dorm(UDormResponse item, {VoidCallback? onDone}) async {
final (UResponse<UDormResponse>? fetched, _, _) = await UServices.hotel.readDormById(
p: UIdParams(
id: item.id,
selectorArgs: const UDormSelectorArgs(media: UMediaSelectorArgs()),
),
);
final UDormResponse dorm = fetched?.result ?? item;
final UDormJson d = dorm.jsonData;
final List<int> tags = List<int>.from(dorm.tags);
List<String> highlights = List<String>.from(d.highlights);
List<UPlaceNearby> nearby = List<UPlaceNearby>.from(d.nearby);
List<UPlaceFaq> faqs = List<UPlaceFaq>.from(d.faqs);
final TextEditingController website = TextEditingController(text: d.website);
final TextEditingController whatsapp = TextEditingController(text: d.whatsapp);
final TextEditingController instagram = TextEditingController(text: d.instagram);
final TextEditingController telegram = TextEditingController(text: d.telegram);
final TextEditingController curfew = TextEditingController(text: d.curfewTime);
final TextEditingController minStay = TextEditingController(text: d.minimumStayMonths?.toString());
final TextEditingController walk = TextEditingController(text: d.universityWalkMinutes?.toString());
final TextEditingController policies = TextEditingController(text: d.policies);
final TextEditingController howToGetThere = TextEditingController(text: d.howToGetThere);
final UAdminMediaDraft draft = UAdminMediaDraft();
final List<UMediaResponse> media = (dorm.media ?? <UMediaResponse>[]).sortedForGallery();
await _open(
title: "${U.s.detailsAndPhotos} — ${dorm.title}",
onDone: onDone,
body: (BuildContext context, StateSetter setState) => Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
UAdminSection(
title: U.s.visibility,
children: <Widget>[
UAdminTagChips<TagDorm>(title: U.s.featured, options: const <TagDorm>[TagDorm.featured], tags: tags),
UAdminTagChips<TagDorm>(title: U.s.approval, options: TagDorm.values.group(400), tags: tags, single: true),
],
),
UAdminSection(
title: U.s.photos,
children: <Widget>[UAdminMediaManager(media: media, draft: draft)],
),
UAdminSection(
title: U.s.details,
children: <Widget>[
UAdminStringList(title: U.s.highlights, items: highlights, addLabel: U.s.addHighlight, onChanged: (List<String> v) => highlights = v),
URow(
children: <Widget>[
UTextField(expanded: 1, controller: curfew, labelText: U.s.curfewTime, margin: const EdgeInsets.symmetric(vertical: 6)),
const SizedBox(width: 8),
UTextField(expanded: 1, controller: walk, labelText: U.s.universityWalkMinutes, keyboardType: TextInputType.number, margin: const EdgeInsets.symmetric(vertical: 6)),
],
),
UAdminTagChips<TagDorm>(title: U.s.acceptedResidents, options: TagDorm.values.group(300), tags: tags),
],
),
UAdminSection(
title: U.s.amenities,
children: <Widget>[UAdminTagChips<TagDorm>(title: U.s.amenities, options: TagDorm.values.group(500), tags: tags)],
),
UAdminSection(
title: U.s.servicesIncluded,
children: <Widget>[
UAdminTagChips<TagDorm>(title: U.s.includedInRent, options: TagDorm.values.group(700), tags: tags),
UAdminTagChips<TagDorm>(title: U.s.mealServices, options: TagDorm.values.group(600), tags: tags),
],
),
UAdminSection(
title: U.s.policies,
children: <Widget>[
_text(minStay, U.s.minimumStayMonths, number: true),
_text(policies, U.s.policies, lines: 3),
],
),
UAdminSection(title: U.s.socialMedia, children: <Widget>[_text(website, U.s.website), _text(whatsapp, U.s.whatsapp), _text(instagram, U.s.instagram), _text(telegram, U.s.telegram)]),
UAdminSection(
title: U.s.nearbyPlaces,
children: <Widget>[
_text(howToGetThere, U.s.howToGetThere, lines: 2),
UAdminNearbyEditor(items: nearby, onChanged: (List<UPlaceNearby> v) => nearby = v),
],
),
UAdminSection(
title: U.s.faqs,
children: <Widget>[UAdminFaqEditor(items: faqs, onChanged: (List<UPlaceFaq> v) => faqs = v)],
),
],
),
save: () async {
final (UEmptyResponse? ok, UEmptyResponse? error, String? exception) = await UServices.hotel.updateDorm(
p: UDormUpdateParams(
id: dorm.id,
tags: tags,
highlights: highlights,
website: _str(website),
whatsapp: _str(whatsapp),
instagram: _str(instagram),
telegram: _str(telegram),
curfewTime: _str(curfew),
minimumStayMonths: _int(minStay),
universityWalkMinutes: _int(walk),
policies: _str(policies),
howToGetThere: _str(howToGetThere),
nearby: nearby,
faqs: faqs,
),
);
if (!_isOk(ok, error, exception)) return false;
await UAdminMediaSync.apply(draft: draft, existing: media, dormId: dorm.id);
return true;
},
);
}