ServiceModal function
void
ServiceModal(
- dynamic context,
- Service service,
- Function callback,
- Map permissions,
)
Implementation
void ServiceModal(context, Service service, Function callback, Map permissions) {
final language = Language();
bool permissionCreate = permissions['create'] == true;
bool permissionUpdate = permissions['update'] == true;
bool permissionDelete = permissions['delete'] == true;
bool isNew = service.isEmpty() || service.code == null ? true : false;
bool isDeleting = false;
bool isEnableForm = isNew;
final TextEditingController nameController = TextEditingController(text: service.getName());
final TextEditingController descController = TextEditingController(text: service.getDescription());
String serviceCode = service.getCode();
double currentPrice = service.getPrice();
bool serviceDisabled = service.disabled == true ? true : false;
Service getCurrentService(){
String code = isNew ? serviceCode : service.getCode();
return Service(
code: code,
name: nameController.text,
description: descController.text,
disabled: serviceDisabled,
price: currentPrice,
//measureId: '70',
quantity: 1
);
}
void confirm(action) {
try {
Service serviceToSave = getCurrentService();
if (action == 'create' || action == 'update') {
if(serviceCode == '') throw('Debe ingresar un código para el servicio');
if(nameController.text.toString() == '') throw('Debe ingresar un nombre para el servicio');
}
if (action == 'create' && !permissionCreate) throw('No tiene persmisos para crear servicios');
if (action == 'delete' && !permissionDelete) throw('No tiene persmisos para eliminar servicios');
if (action == 'update' && !permissionUpdate) throw('No tiene persmisos para actualizar servicios');
Navigator.of(context).pop();
callback(action, serviceToSave);
} catch(error) {
if(action == 'delete') Navigator.of(context).pop();
showSnackBar(context, SnackType.error, error.toString());
}
}
void restore(setStateModal) {
setStateModal(() {
isEnableForm = isNew ? true : false;
serviceCode = service.getCode();
nameController.text = service.getName();
descController.text = service.getDescription();
currentPrice = service.getPrice();
serviceDisabled = service.disabled == true ? true : false;
});
}
void duplicate(setStateModal){
Navigator.of(context).pop();
Service copyService = Service.fromObject(/* pageManager.deepCopyMap( */service.toSave()/* ) */);
ServiceModal(context, copyService, callback, permissions);
setStateModal((){
isNew = true;
isEnableForm = true;
nameController.text = '${service.getName()} copy';
descController.text = service.getDescription();
});
}
void updatePrice(setStateModal, price){
if(isEnableForm && currentPrice != price){
setStateModal(()=> currentPrice = price );
}
}
Widget child = StatefulBuilder(
builder: (BuildContext context, StateSetter setStateModal ) {
ColorScheme colorScheme = Theme.of(context).colorScheme;
final appColors = AppColors();
final appIcons = AppIcons();
String title = '';
Map options = {};
if (!isNew && !isEnableForm){
title = '';//language.translateDual('user', 'saved');
if(permissionDelete) options['delete'] = ()=>setStateModal(()=>isDeleting=true);
if(permissionUpdate) options['update'] = ()=>setStateModal(()=>isEnableForm=true);
if(permissionCreate) options['duplicate'] = ()=>duplicate(setStateModal);
} else if (!isNew && isEnableForm) {
title = language.translateDual('update', 'service');
if(permissionUpdate) options['confirm'] = ()=>confirm('update');
if(permissionUpdate) options['cancel'] = ()=>restore(setStateModal);
} else if (isNew && isEnableForm) {
title = language.translateDual('create', 'service');
if(permissionCreate) options['confirm'] = ()=>confirm('create');
}
return isDeleting
? ContentConfirmDelete(
title: 'Eliminar ${service.description}',
message: 'Tenga en cuenta que una vez eliminado este servicio no podra restaurarlo.',
onCancel: ()=>setStateModal(() { isDeleting = false; }),
onConfirm: ()=>confirm('delete'),
)
: Scaffold(
backgroundColor: colorScheme.surfaceVariant,
appBar: CustomAppBarModal(
showOnlyOption: true,
buttonType: ButtonType.icon,
options: options,
iconSwipe: !isEnableForm,
title: language.translateUpperCase(title),
centerTitle: true,
backgroundColor: colorScheme.surfaceVariant,
),
body: SingleChildScrollView(
padding: const EdgeInsets.fromLTRB(16, 16, 16, 16),
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
CustomTextCode(
disabled: !isNew,
prefix: isNew ? 'SERV' : '',
currentValue: isNew ? serviceCode : service.getCode(),
onChanged: (String result) => setStateModal(()=>serviceCode = result),
),
CustomTextField(
disabled: !isEnableForm,
labelText: language.translate('name'),
controller: nameController,
margin: const EdgeInsets.only(top: 16),
),
CustomTextField(
disabled: !isEnableForm,
labelText: language.translate('description'),
controller: descController,
margin: const EdgeInsets.only(top: 16, bottom: 16),
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
CustomToggleButton(
flex: 3,
padding: const EdgeInsets.only(left: 16),
disabled: !isEnableForm || !permissionUpdate ? true : false,
onPressed: ()=>setStateModal(()=>serviceDisabled = !serviceDisabled),
text: language.translateUpperCase('active'),
isOff: serviceDisabled,
colorOn: appColors.success
),
const SizedBox(width: 16),
CustomTileButton(
flex: 2,
height: 48,
disabled: !isEnableForm,
textTitle: language.translate('price'),
textAlign: TextAlign.end,
leftIcon: Icon(appIcons.currency, size: 20),
textSubtitle: currentPrice.toString(),
onPressed: ()=>ModalCalc(
context, 'price',
currentPrice.toString(),
(String result)=>updatePrice(setStateModal, double.parse(result)),
true
),
),
]
)
]
)
)
);
}
);
customAutoDialog(context, child);
}