ServiceModal function

void ServiceModal(
  1. dynamic context,
  2. Service service,
  3. Function callback,
  4. 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);

}