Untitled

 avatar
unknown
plain_text
a month ago
52 kB
2
Indexable
import 'dart:convert';
import 'package:amatia/services/color-constants.dart';
import 'package:amatia/services/custom_widgets.dart';
import 'package:dropdown_search/dropdown_search.dart';
import 'package:flutter/material.dart';
import 'package:google_fonts/google_fonts.dart';
import 'package:provider/provider.dart';
import 'package:rounded_loading_button/rounded_loading_button.dart';
import '../../custom_widgets/autocomplete_modal_widget.dart';
import '../../providers/data-class.dart';
import '../../providers/form-data-provider.dart';
import 'package:path/path.dart' as path;
import '../../providers/home_provider.dart';
import '../../providers/service_provider.dart';
import '../../services/custom-input-formatters.dart';
import '../../services/page-redirect-provider.dart';
import '../../services/web_viewer_page.dart';

class DynamicFormPage extends StatefulWidget {
  const DynamicFormPage(
      {Key? key,
      this.formId,
      this.formTitle,
      this.predefinedValues,
      this.elementDetails,
      this.formData})
      : super(key: key);
  final List<Map<String, dynamic>>? formData;
  final Map<String, dynamic>? elementDetails;
  final String? formId;
  final String? formTitle;
  final Map<String, dynamic>? predefinedValues;

  @override
  State<DynamicFormPage> createState() => _DynamicFormPageState(
      elementDetails: elementDetails,
      formId: formId,
      formTitle: formTitle,
      predefinedValues: predefinedValues,
      formData: formData);
}

class _DynamicFormPageState extends State<DynamicFormPage> {
  _DynamicFormPageState(
      {this.formId,
      this.formTitle,
      this.predefinedValues,
      this.elementDetails,
      this.formData});

  final List<Map<String, dynamic>>? formData;
  final Map<String, dynamic>? elementDetails;
  final String? formId;
  final String? formTitle;
  final Map<String, dynamic>? predefinedValues;
  FocusNode dropdownFocusNode = FocusNode();

  @override
  void initState() {
    // print("elementDetails === ${jsonEncode(widget.elementDetails)}");
    if (formData == null) {
      Provider.of<FormDataProvider>(context, listen: false).fetchFormDetails(
          context, formId, formTitle, predefinedValues, elementDetails);
      String pendingMsg = Provider.of<DashboardProvider>(context, listen: false)
          .getFormPendingMessage(formId);
      // print("pendingMsg === $pendingMsg");
      if (pendingMsg != "") {
        Future.delayed(const Duration(seconds: 1), () async {
          await customAlert(context,
              header: "Atención!",
              okText: "¡Comprendo!",
              body: pendingMsg,
              barrierDismissible: false);
          Provider.of<FormDataProvider>(context, listen: false)
              .checkDraftReport(context, formId: formId);
        });
      } else {
        Future.delayed(const Duration(seconds: 1), () {
          Provider.of<FormDataProvider>(context, listen: false)
              .checkDraftReport(context, formId: formId);
        });
      }
    } else {
      Provider.of<FormDataProvider>(context, listen: false).populateFormDetails(
          context,
          formData: formData,
          formId: formId,
          formTitle: formTitle,
          predefinedValues: predefinedValues,
          elementDetails: elementDetails);
    }

    super.initState();
  }

  int count = 0;
  @override
  Widget build(BuildContext context) {
    return Consumer<FormDataProvider>(builder: (context, providerData, child) {
      // log("providerData.dynamicFormList === ${jsonEncode(providerData.dynamicFormList)}");
      // for (Map<String, dynamic>? item
      // in providerData.dynamicFormList ?? [])
      // if (item!['control_type'] == "html"){
      //   print("item == ${jsonEncode(item)}");
      // }
      return Scaffold(
          appBar: AppBar(
            backgroundColor: CustomColor.primary,
            elevation: 0,
            title: CustomTextTitle(
              formTitle ?? "",
              fontSize: FontSizes.s16,
              fontWeight: FontWeight.w500,
              maxLines: 2,
            ),
            iconTheme: const IconThemeData(
              color: Colors.white, // Change the color of the AppBar buttons
            ),
            titleTextStyle: GoogleFonts.roboto(
              color: Colors.white, // Change the color of the AppBar title text
              fontSize: 16.0,
            ),
          ),
          body: (providerData.showLoader || providerData.showButtonLoader)
              ? customLoader()
              : Form(
                  key: providerData.dynamicFormKey,
                  child: ListView(
                    addAutomaticKeepAlives: true,
                    padding: const EdgeInsets.symmetric(
                        vertical: 20, horizontal: 20),
                    children: [
                      if (Provider.of<ServiceProvider>(context, listen: true)
                              .isInternetConnected ==
                          false)
                        Container(
                          decoration: BoxDecoration(
                              color: CustomColor.error.withOpacity(0.4),
                              borderRadius: BorderRadius.circular(4.0),
                              border: Border.all(color: CustomColor.error)),
                          padding: const EdgeInsets.all(10),
                          margin: const EdgeInsets.only(bottom: 10),
                          child: CustomTextTitle(
                            "No tiene acceso a Internet!",
                            fontSize: FontSizes.s16,
                            textAlign: TextAlign.center,
                            color: CustomColor.error,
                          ),
                        ),
                      // text,textarea,dropdown,radio,checkbox,date,datetime,file
                      for (Map<String, dynamic>? item
                          in providerData.dynamicFormList ?? [])
                        Container(
                          decoration: BoxDecoration(
                            color: item!["has_comment_field"] == '1'
                                ? CustomColor.pageBackground.withOpacity(0.5)
                                : null,
                            borderRadius: BorderRadius.circular(6),
                            border: item["has_comment_field"] == '1'
                                ? Border.all(color: CustomColor.border)
                                : null,
                          ),
                          padding: EdgeInsets.symmetric(
                              horizontal:
                                  item["has_comment_field"] == '1' ? 10 : 0),
                          margin: EdgeInsets.symmetric(
                              vertical:
                                  item["has_comment_field"] == '1' ? 10 : 0),
                          child: Column(
                            mainAxisAlignment: MainAxisAlignment.start,
                            crossAxisAlignment: CrossAxisAlignment.start,
                            children: [
                              if (item.isNotEmpty == true &&
                                  providerData.fieldGroupValidationFilter(
                                      context, item["field_group"]))
                                Row(
                                  crossAxisAlignment: CrossAxisAlignment.center,
                                  children: [
                                    Expanded(
                                        child: getWidgetContainer(
                                            item, providerData)),
                                    const SizedBox(
                                      width: 10,
                                    ),
                                    getInformationIcon(item)
                                  ],
                                ),
                              if (item["has_comment_field"] == '1')
                                CustomInputField(
                                  width: double.maxFinite,
                                  containerColor: CustomColor.pageBackground,
                                  hintTextColor: Colors.grey,
                                  margin:
                                      const EdgeInsets.only(bottom: 10, top: 5),
                                  maxLines:
                                      item['control_type'] == "text" ? 1 : null,
                                  hintText: item["comment_placeholder"] ?? "",
                                  onChanged: (value) =>
                                      providerData.setInputFieldValue(
                                          item['id'].toString(), value,
                                          isAdditional: true),
                                  fontSize: FontSizes.s14,
                                  initialValue: providerData
                                      .additionalData[item['id'].toString()],
                                )
                            ],
                          ),
                        ),

                      ///---- Submit Button -----
                      // Container(
                      //   margin: const EdgeInsets.symmetric(vertical: 15),
                      //   child: RoundedLoadingButton(
                      //     color: CustomColor.primary,
                      //     borderRadius: 4.0,
                      //     width: double.maxFinite,
                      //     successColor: Colors.green,
                      //     controller: providerData.submitButtonController,
                      //     onPressed: ()=>providerData.onFormSubmit(context),
                      //     child: CustomTextTitle("Guardar", color: Colors.white,),
                      //   ),
                      // ),
                      //
                      // Container(
                      //   margin: const EdgeInsets.symmetric(vertical: 0),
                      //   child: RoundedLoadingButton(
                      //     color: CustomColor.primary,
                      //     borderRadius: 4.0,
                      //     width: double.maxFinite,
                      //     successColor: Colors.green,
                      //     controller: providerData.submitButtonController,
                      //     onPressed: ()=>providerData.onFormSubmit(context, downloadReport: true, title: formTitle),
                      //     child: CustomTextTitle("Descargar reporte", color: Colors.white,),
                      //   ),
                      // ),

                      Container(
                        width: double.maxFinite,
                        margin: const EdgeInsets.symmetric(vertical: 15),
                        child: Row(
                          children: [
                            if (providerData
                                    .currentFormElementDetails["formType"] !=
                                "calendar-inspection")
                              Expanded(
                                child: RoundedLoadingButton(
                                  color: CustomColor.lightTextColor,
                                  borderRadius: 4.0,
                                  width: double.maxFinite,
                                  successColor: Colors.green,
                                  valueColor: Colors.green,
                                  controller:
                                      providerData.downloadButtonController,
                                  onPressed: () => providerData
                                      .saveAsDraft(context, formId: formId),
                                  child: Row(
                                    mainAxisAlignment: MainAxisAlignment.center,
                                    children: [
                                      Icon(
                                        Icons.save,
                                        color: CustomColor.primary,
                                      ),
                                      const SizedBox(
                                        width: 5,
                                      ),
                                      CustomTextTitle(
                                        "Guardar borrador",
                                        color: CustomColor.primary,
                                        fontSize: 14,
                                      ),
                                    ],
                                  ),
                                ),
                              ),
                            if (providerData
                                    .currentFormElementDetails["formType"] !=
                                "calendar-inspection")
                              const SizedBox(
                                width: 15,
                              ),
                            Expanded(
                              child: RoundedLoadingButton(
                                  color: CustomColor.primary,
                                  borderRadius: 4.0,
                                  width: double.maxFinite,
                                  successColor: Colors.green,
                                  controller:
                                      providerData.submitButtonController,
                                  onPressed: () =>
                                      providerData.onFormSubmit(context),
                                  child: Row(
                                    mainAxisAlignment: MainAxisAlignment.center,
                                    children: [
                                      const Icon(
                                        Icons.upload,
                                        color: Colors.white,
                                      ),
                                      const SizedBox(
                                        width: 5,
                                      ),
                                      CustomTextTitle(
                                        Provider.of<ServiceProvider>(context,
                                                        listen: true)
                                                    .isInternetConnected ==
                                                false
                                            ? "Enviar sin conexión "
                                            : "Guardar",
                                        color: Colors.white,
                                        fontSize: 14,
                                      ),
                                    ],
                                  )),
                            ),
                          ],
                        ),
                      ),
                      const SizedBox(
                        height: 10,
                      ),
                      Row(
                        children: [
                          Expanded(
                              child: GestureDetector(
                                  onTap: () => providerData.onFormSubmit(
                                      context,
                                      downloadReport: true,
                                      title: formTitle),
                                  child: Row(
                                    mainAxisAlignment: MainAxisAlignment.center,
                                    children: [
                                      const Icon(Icons.download,
                                          color: Color(0xFF2e2e2e)),
                                      const SizedBox(width: 5),
                                      CustomTextTitle(
                                        "Descargar reporte",
                                        color: CustomColor.darkTextColor,
                                        fontSize: 14,
                                      ),
                                    ],
                                  )))
                        ],
                      ),
                      const SizedBox(
                        height: 20,
                      ),
                    ],
                  ),
                ));
    });
  }

  Widget filterWidget(String? valueData) {
    if (valueData == null) {
      return CustomTextTitle("Subir archivo", fontSize: FontSizes.s14);
    } else if (valueData == 'processing') {
      return CustomTextTitle("Procesando...", fontSize: FontSizes.s14);
    } else {
      String ext = path.extension(valueData);
      // print("ext === $ext");
      if (ext == ".png" || ext == ".jpg" || ext == ".jpeg") {
        return Container(
          padding: const EdgeInsets.only(top: 10, bottom: 5),
          child: Image.network(
            valueData,
            height: 80,
          ),
        );
      } else {
        return Icon(
          Icons.file_copy,
          color: CustomColor.primary,
        );
      }
    }
  }

  Widget getWidgetContainer(
      Map<String, dynamic> item, FormDataProvider providerData) {
    //989: null, 990: null, 971: null, 972: null
    if (item['has_autocomplete'].toString().toLowerCase() == "yes") {
      return Container(
        margin: EdgeInsets.only(bottom: 10),
        child: Column(
          children: [
            CustomTextTitle(
                "${item['label_es'] ?? " "}${item['is_require'] == "1" ? " *" : ""}",
                color: CustomColor.primary,
                fontSize: 14,
                maxLines: 10),
            const SizedBox(
              height: 10,
            ),
            AutocompleteModal(
              item,
              onChanged: (Map<String, dynamic> selectedValue) =>
                  providerData.setInputFieldValue(
                      item['id'].toString(), selectedValue),
              selectedValue: providerData.valeData[item['id'].toString()],
              validator: (value) {
                if (value?.trim().isEmpty == true &&
                    item['is_require'] == "1") {
                  return "El campo es requerido y debe ser diligenciado";
                }
                return null;
              },
            ),

          ],
        ),
      );
    }
    if (item['id'].toString() == "989" ||
        item['id'].toString() == "990" ||
        item['id'].toString() == "972")
    // print("-----------${item['id']} ---- ${providerData.valeData[item['id'].toString()]}");
    // print("invalid field id --- ${item['id'].toString()}");

    if (item['control_type'] == "html") {
      return Container(
        decoration: BoxDecoration(
            color: Colors.white,
            borderRadius: BorderRadius.circular(8),
            border: Border.all(color: CustomColor.border),
            boxShadow: [
              BoxShadow(
                  color: Colors.grey.shade200, spreadRadius: 1, blurRadius: 8)
            ]),
        margin: EdgeInsets.only(bottom: 10, top: 10),
        height: double.parse((item['html_height'] ?? 300).toString()),
        child: ClipRRect(
          borderRadius: BorderRadius.circular(8),
          child: WebViewerPage(url: (item["label_es"]), showAppBar: false),
        ),
      );
    }
    if ((item['control_type'] == "text" ||
            item['control_type'] == "textarea") &&
        item['status'] == "Active") {
      return CustomInputField(
        keyboardType: (item['validation'] == "positiveinteger" ||
                item['validation'] == "number")
            ? TextInputType.number
            : null,
        inputFormatters: [
          if (item['validation'] == "positiveinteger")
            CustomPositiveIntegerFormatter(),
          if (item['validation'] == "alphanumeric")
            CustomAlphanumericFormatter(),
          if (item['validation'] == "number") CustomNumberFormatter(),
          if (item['validation'] == "lettersonly") CustomLettersOnlyFormatter(),
          if (item['validation'] == "integer") CustomSignedIntegerFormatter(),
          if (item['validation'] == "letterswithbasicpunc")
            CustomLettersWithBasicPunctuationFormatter()
        ],
        key: Key(item['id'].toString()),
        width: double.maxFinite,
        containerColor: CustomColor.pageBackground,
        hintTextColor: CustomColor.darkTextColor,
        margin: const EdgeInsets.symmetric(vertical: 10),
        maxLines: item['control_type'] == "text" ? 1 : null,
        hintText:
            "${item['label_es'] ?? " "}${item['is_require'] == "1" ? " *" : ""}",
        labelText: "",
        customLabelWidget: CustomTextTitle(
            "${item['label_es'] ?? " "}${item['is_require'] == "1" ? " *" : ""}",
            color: CustomColor.primary,
            fontSize: 15,
            maxLines: 10),
        onChanged: (value) =>
            providerData.setInputFieldValue(item['id'].toString(), value),
        fontSize: FontSizes.s15,
        initialValue: providerData.valeData[item['id'].toString()],
        validator: (value) {
          if (value?.trim().isEmpty == true && item['is_require'] == "1") {
            return "El campo es requerido y debe ser diligenciado";
          }
          return null;
        },
      );
    } else if (item['control_type'] == "label" &&
        item['label_es'] != null &&
        item['label_es'] != "") {
      return customLabelText(item['label_es'] ?? "",
          color: CustomColor.pageBackground);
    } else if (item['control_type'] == "file" && item['status'] == "Active") {
      return Container(
          key: Key(item['id'].toString()),
          margin: const EdgeInsets.symmetric(vertical: 10),
          decoration: BoxDecoration(
              color: Provider.of<ServiceProvider>(context, listen: true)
                          .isInternetConnected ==
                      true
                  ? CustomColor.lightTextColor
                  : CustomColor.border.withOpacity(0.3),
              borderRadius: BorderRadius.circular(4.0)),
          child: Column(
            crossAxisAlignment: CrossAxisAlignment.start,
            children: [
              CustomTextTitle(
                  "${item['label_es'] ?? " "}${item['is_require'] == "1" ? " *" : ""}",
                  color: CustomColor.primary,
                  fontSize: 14,
                  maxLines: 10),
              const SizedBox(
                height: 5,
              ),
              InputDecorator(
                  decoration: InputDecoration(
                    contentPadding: const EdgeInsets.only(
                        left: 20, right: 10, top: 7.5, bottom: 5),
                    border: OutlineInputBorder(
                      borderRadius: BorderRadius.circular(4.0),
                    ),
                    enabledBorder: OutlineInputBorder(
                      borderSide: BorderSide(color: CustomColor.border),
                      borderRadius: BorderRadius.circular(4.0),
                    ),
                  ),
                  child: Column(
                      crossAxisAlignment: CrossAxisAlignment.start,
                      children: [
                        Row(
                          crossAxisAlignment: CrossAxisAlignment.center,
                          children: [
                            Expanded(
                              flex: 3,
                              child: filterWidget(
                                  providerData.valeData[item['id'].toString()]),
                            ),
                            const SizedBox(
                              width: 5,
                            ),
                            Expanded(
                                flex: 2,
                                child: providerData
                                            .valeData[item['id'].toString()] ==
                                        "processing"
                                    ? customLoader(radius: 20)
                                    : CustomButton(
                                        providerData.valeData[
                                                    item['id'].toString()] ==
                                                null
                                            ? "Subir archivo"
                                            : "Cambiar archivo",
                                        elevation: 0,
                                        borderRadius: 4.0,
                                        height: 35,
                                        fixedHeight: 35,
                                        margin: EdgeInsets.zero,
                                        fontSizes: FontSizes.s10,
                                        onPressed: Provider.of<ServiceProvider>(
                                                        context,
                                                        listen: true)
                                                    .isInternetConnected ==
                                                true
                                            ? () =>
                                                providerData.chooseImageSource(
                                                    context,
                                                    item['id'].toString())
                                            : null,
                                        disabledColor: Colors.grey,
                                      ))
                          ],
                        ),
                        const SizedBox(
                          height: 5,
                        ),
                        CustomTextTitle(
                          "Tipos de archivo: .jpeg, .jpg, .png, .pdf, .docx, .doc, .xls, .xlsx",
                          fontSize: FontSizes.s10,
                          color: CustomColor.darkTextColor.withOpacity(0.5),
                        ),
                        const SizedBox(
                          height: 10,
                        ),
                        if (Provider.of<ServiceProvider>(context, listen: true)
                                .isInternetConnected ==
                            false)
                          CustomTextTitle(
                            "¡Esta función solo está disponible en línea!",
                            color: CustomColor.error,
                            fontSize: FontSizes.s12,
                          )
                      ]))
            ],
          ));
    } else if (item['control_type'] == "dropdown" &&
        item['status'] == "Active") {
      // return Container(height: 50, width: double.maxFinite, color: Colors.red,);
      return Container(
          key: Key(item['id'].toString()),
          margin: const EdgeInsets.symmetric(vertical: 10),
          // color: CustomColor.lightTextColor,
          child: Column(
            crossAxisAlignment: CrossAxisAlignment.start,
            children: [
              CustomTextTitle(
                  "${item['label_es'] ?? " "}${item['is_require'] == "1" ? " *" : ""}",
                  color: CustomColor.primary,
                  fontSize: 14,
                  maxLines: 10),
              const SizedBox(
                height: 5,
              ),
              DropdownSearch<DropDownData>(
                popupProps: PopupProps.bottomSheet(
                  bottomSheetProps: BottomSheetProps(
                    backgroundColor: CustomColor.pageBackground,
                    enableDrag: false,
                  ),
                  title: Container(
                    padding: const EdgeInsets.only(left: 15),
                    color: CustomColor.primary,
                    child: Row(
                      mainAxisAlignment: MainAxisAlignment.spaceBetween,
                      children: [
                        Expanded(
                          child: CustomTextTitle(
                            item['label_es'],
                            fontSize: FontSizes.s16,
                            color: CustomColor.lightTextColor,
                          ),
                        ),
                        IconButton(
                          icon: Icon(Icons.close, color: Colors.white),
                          onPressed: () {
                            Navigator.of(context).pop();
                          },
                        ),
                      ],
                    ),
                  ),
                  emptyBuilder: (context, data) => Center(
                    child: CustomTextTitle(
                      "¡Datos no encontrados!",
                      fontSize: FontSizes.s16,
                    ),
                  ),
                  itemBuilder: (context, data, isSelected) {
                    return ListTile(
                      dense: true,
                      minVerticalPadding: 0,
                      contentPadding:
                          const EdgeInsets.symmetric(horizontal: 15),
                      horizontalTitleGap: 0,
                      title: CustomTextTitle(data.option_value,
                          fontSize: FontSizes.s12,
                          fontWeight: FontWeight.w400,
                          color: isSelected
                              ? CustomColor.primary
                              : CustomColor.darkTextColor,
                          maxLines: 2),
                    );
                  },
                ),
                itemAsString: (DropDownData? u) => u?.option_value ?? "",
                items: item["select_master_key"] == ""
                    ? providerData.getSplitValues(item["options"])
                    : providerData.checkConditionValues(item),
                dropdownDecoratorProps: DropDownDecoratorProps(
                  dropdownSearchDecoration: InputDecoration(
                    contentPadding: const EdgeInsets.symmetric(
                        horizontal: 20, vertical: 20),
                    // labelText: "${item['label_es'] ?? " "}${item['is_require']=="1"?" *":""}",
                    hintText: item['label_es'] ?? "",
                    iconColor: CustomColor.border,
                    suffixIconColor: CustomColor.border,
                    labelStyle: GoogleFonts.roboto(
                        color: CustomColor.primary, fontSize: FontSizes.s16),
                    border: OutlineInputBorder(
                      borderRadius: BorderRadius.circular(4.0),
                    ),
                    enabledBorder: OutlineInputBorder(
                      borderSide: BorderSide(color: CustomColor.border),
                      borderRadius: BorderRadius.circular(4.0),
                    ),
                    focusedBorder: OutlineInputBorder(
                      borderSide: BorderSide(color: CustomColor.border),
                      borderRadius: BorderRadius.circular(4.0),
                    ),
                  ),
                ),
                onBeforePopupOpening: (_) async {
                  FocusManager.instance.primaryFocus?.unfocus();
                  await Future.delayed(
                      Duration(milliseconds: 300)); // Short delay
                  return true;
                },
                onChanged: (DropDownData? value) {
                  // print("item === $item");
                  providerData.setDropdownValue(
                      value!,
                      item['id'].toString(),
                      item["is_conditional_question"],
                      (item["condition"] == "" ||
                              item["condition"] == null ||
                              item["condition"].toString() == "[]")
                          ? {}
                          : jsonDecode(item["condition"]));
                },
                selectedItem: providerData.findSelectedItem(
                    providerData.valeData[item['id'].toString()],
                    item['id'].toString(),
                    item["select_master_key"] == ""
                        ? providerData.getSplitValues(item["options"])
                        : providerData.checkConditionValues(item)),
                dropdownBuilder: (context, data) {
                  return CustomTextTitle(
                    data?.option_value ?? "Seleccione",
                    fontSize: FontSizes.s12,
                    fontWeight: FontWeight.w500,
                  );
                },
                validator: (value) {
                  // print("validator ${item['id']} === $value");
                  if (providerData.valeData[item['id'].toString()] == null &&
                      item['is_require'] == "1") {
                    return "El campo es requerido y debe ser diligenciado";
                  }
                  return null;
                },
              )
            ],
          ));
    } else if (item['control_type'] == "multiselect_dropdown" &&
        item['status'] == "Active") {
      return InkWell(
        onTap: () {
          providerData.chooseMultiSelectOptions(
              context,
              item["select_master_key"] == ""
                  ? providerData.getSplitValues(item["options"])
                  : providerData.checkConditionValues(item),
              (item['label_es'] ?? ""),
              item['id'].toString());
        },
        child: Container(
          key: Key(item['id'].toString()),
          margin: const EdgeInsets.symmetric(vertical: 10),
          child: Column(
            crossAxisAlignment: CrossAxisAlignment.start,
            children: [
              CustomTextTitle(
                  "${item['label_es'] ?? " "}${item['is_require'] == "1" ? " *" : ""}",
                  color: CustomColor.primary,
                  fontSize: 14,
                  maxLines: 10),
              const SizedBox(
                height: 5,
              ),
              InputDecorator(
                  decoration: InputDecoration(
                    contentPadding: const EdgeInsets.symmetric(
                        horizontal: 12, vertical: 12),
                    border: OutlineInputBorder(
                      borderRadius: BorderRadius.circular(4.0),
                    ),
                    enabledBorder: OutlineInputBorder(
                      borderSide: BorderSide(color: CustomColor.border),
                      borderRadius: BorderRadius.circular(4.0),
                    ),
                  ),
                  child: Column(
                    crossAxisAlignment: CrossAxisAlignment.start,
                    children: [
                      if (providerData.valeData[item['id'].toString()] ==
                              null ||
                          providerData.valeData[item['id'].toString()].length ==
                              0)
                        CustomTextTitle(
                          "Seleccione",
                          fontSize: FontSizes.s12,
                          fontWeight: FontWeight.w500,
                        ),
                      for (String element
                          in providerData.valeData[item['id'].toString()] ?? [])
                        Container(
                          margin: const EdgeInsets.symmetric(vertical: 3),
                          padding: const EdgeInsets.all(8),
                          decoration: BoxDecoration(
                              color: CustomColor.border.withOpacity(0.5),
                              borderRadius: BorderRadius.circular(4)),
                          width: double.maxFinite,
                          child: CustomTextTitle(
                            providerData.getSelectedItemValue(
                                element,
                                item["select_master_key"] == ""
                                    ? providerData
                                        .getSplitValues(item["options"])
                                    : providerData.checkConditionValues(item)),
                            fontSize: FontSizes.s14,
                            fontWeight: FontWeight.w500,
                            color: CustomColor.darkTextColor,
                            maxLines: 10,
                          ),
                        )
                    ],
                  ))
            ],
          ),
        ),
      );
    } else if (item['control_type'] == "datetime" &&
        item['status'] == "Active") {
      return InkWell(
          key: Key(item['id'].toString()),
          splashColor: Colors.transparent,
          hoverColor: Colors.transparent,
          onTap: () =>
              providerData.selectDateTime(item['id'].toString(), context),
          child: Container(
              margin: const EdgeInsets.symmetric(vertical: 10),
              color: CustomColor.lightTextColor,
              child: Column(
                  crossAxisAlignment: CrossAxisAlignment.start,
                  children: [
                    CustomTextTitle(
                        "${item['label_es'] ?? " "}${item['is_require'] == "1" ? " *" : ""}",
                        color: CustomColor.primary,
                        fontSize: 14,
                        maxLines: 10),
                    const SizedBox(
                      height: 5,
                    ),
                    InputDecorator(
                      decoration: InputDecoration(
                        contentPadding: const EdgeInsets.symmetric(
                            horizontal: 20, vertical: 20),
                        border: OutlineInputBorder(
                          borderRadius: BorderRadius.circular(4.0),
                        ),
                        enabledBorder: OutlineInputBorder(
                          borderSide: BorderSide(color: CustomColor.border),
                          borderRadius: BorderRadius.circular(4.0),
                        ),
                      ),
                      child: CustomTextTitle(
                        providerData.valeData[item['id'].toString()] ??
                            "18/04/2022 09:30 AM",
                        fontSize: FontSizes.s14,
                        color:
                            providerData.valeData[item['id'].toString()] == null
                                ? CustomColor.textColor
                                : CustomColor.darkTextColor,
                      ),
                    ),
                  ])));
    } else if (item['control_type'] == "date" && item['status'] == "Active") {
      return InkWell(
          key: Key(item['id'].toString()),
          splashColor: Colors.transparent,
          hoverColor: Colors.transparent,
          onTap: () =>
              providerData.selectDateOnly(item['id'].toString(), context),
          child: Container(
              margin: const EdgeInsets.symmetric(vertical: 10),
              color: CustomColor.lightTextColor,
              child: Column(
                  crossAxisAlignment: CrossAxisAlignment.start,
                  children: [
                    CustomTextTitle(
                        "${item['label_es'] ?? " "}${item['is_require'] == "1" ? " *" : ""}",
                        color: CustomColor.primary,
                        fontSize: 14,
                        maxLines: 10),
                    const SizedBox(
                      height: 5,
                    ),
                    InputDecorator(
                      decoration: InputDecoration(
                        contentPadding: const EdgeInsets.symmetric(
                            horizontal: 20, vertical: 20),
                        border: OutlineInputBorder(
                          borderRadius: BorderRadius.circular(4.0),
                        ),
                        enabledBorder: OutlineInputBorder(
                          borderSide: BorderSide(color: CustomColor.border),
                          borderRadius: BorderRadius.circular(4.0),
                        ),
                      ),
                      child: CustomTextTitle(
                        providerData.valeData[item['id'].toString()] ??
                            "18/04/2022",
                        fontSize: FontSizes.s14,
                        color:
                            providerData.valeData[item['id'].toString()] == null
                                ? CustomColor.textColor
                                : CustomColor.darkTextColor,
                      ),
                    ),
                  ])));
    } else if (item['control_type'] == "checkbox" &&
        item['status'] == "Active") {
      return Container(
          key: Key(item['id'].toString()),
          margin: const EdgeInsets.symmetric(vertical: 10),
          child: Column(
            crossAxisAlignment: CrossAxisAlignment.start,
            children: [
              CustomTextTitle(
                  "${item['label_es'] ?? " "}${item['is_require'] == "1" ? " *" : ""}",
                  color: CustomColor.primary,
                  fontSize: 14,
                  maxLines: 10),
              const SizedBox(
                height: 5,
              ),
              InputDecorator(
                decoration: InputDecoration(
                  contentPadding:
                      const EdgeInsets.symmetric(horizontal: 0, vertical: 10),
                  border: OutlineInputBorder(
                    borderRadius: BorderRadius.circular(4.0),
                  ),
                  enabledBorder: OutlineInputBorder(
                    borderSide: BorderSide(color: CustomColor.border),
                    borderRadius: BorderRadius.circular(4.0),
                  ),
                ),
                child: Column(
                  children: [
                    for (DropDownData options in item["select_master_key"] == ""
                        ? providerData.getSplitValues(item["options"])
                        : providerData
                            .dropdownValues[item['id'].toString()]!['dataSet'])
                      CheckboxListTile(
                        activeColor: CustomColor.primary,
                        dense: true,
                        value: providerData.valeData[item['id'].toString()]
                                .contains(options.id) ??
                            false,
                        onChanged: (bool? value) =>
                            providerData.setCheckBoxValue(
                                item['id'].toString(), value, options.id),
                        title: CustomTextTitle(options.option_value,
                            fontSize: FontSizes.s16,
                            fontWeight: FontWeight.w400,
                            maxLines: 10),
                      ),
                  ],
                ),
              )
            ],
          ));
    } else if (item['control_type'] == "radio" && item['status'] == "Active") {
      return Container(
        key: Key(item['id'].toString()),
        margin: const EdgeInsets.symmetric(vertical: 10),
        child: Column(crossAxisAlignment: CrossAxisAlignment.start, children: [
          CustomTextTitle(
              "${item['label_es'] ?? " "}${item['is_require'] == "1" ? " *" : ""}",
              color: CustomColor.primary,
              fontSize: 14,
              maxLines: 10),
          const SizedBox(
            height: 5,
          ),
          InputDecorator(
              decoration: InputDecoration(
                contentPadding: const EdgeInsets.all(0),
                border: OutlineInputBorder(
                  borderRadius: BorderRadius.circular(4.0),
                ),
                enabledBorder: OutlineInputBorder(
                  borderSide: BorderSide(color: CustomColor.border),
                  borderRadius: BorderRadius.circular(4.0),
                ),
              ),
              child: Column(
                crossAxisAlignment: CrossAxisAlignment.start,
                children: [
                  Column(
                    mainAxisAlignment: MainAxisAlignment.start,
                    mainAxisSize: MainAxisSize.min,
                    crossAxisAlignment: CrossAxisAlignment.start,
                    children: [
                      for (DropDownData options
                          in item["select_master_key"] == ""
                              ? providerData.getSplitValues(item["options"])
                              : providerData.dropdownValues[
                                  item['id'].toString()]!['dataSet'])
                        RadioListTile(
                          dense: true,
                          value: options.id,
                          groupValue:
                              providerData.valeData[item['id'].toString()],
                          activeColor: CustomColor.primary,
                          onChanged: (value) => providerData.setRadioValue(
                              item['id'].toString(), value),
                          title: CustomTextTitle(
                            options.option_value,
                            fontSize: FontSizes.s14,
                            fontWeight: FontWeight.w500,
                          ),
                        ),
                    ],
                  )
                ],
              ))
        ]),
      );
    } else if (item['control_type'] == "heading" &&
        item['status'] == "Active") {
      return Container(
        margin: const EdgeInsets.symmetric(vertical: 10),
        color: CustomColor.lightTextColor,
        child: CustomTextTitle(
          item['label_es'],
          fontSize: 16,
          maxLines: 10,
        ),
      );
    } else if (item['control_type'] == "subform") {
      return CustomButton(
        item['label_es'] == ""
            ? "Test (${jsonDecode(item['form_data']).length})"
            : item['label_es'] +
                " (${providerData.getCount(item['id'].toString()) ?? 0})",
        textColor: CustomColor.lightTextColor,
        margin: const EdgeInsets.symmetric(vertical: 10),
        elevation: 0,
        borderRadius: 6.0,
        fontSizes: FontSizes.s16,
        onPressed: () => providerData.openSubForm(context, item),
        maxLines: 10,
      );
    } else if (item['control_type'] == "signature") {
      return Container(
          key: Key(item['id'].toString()),
          margin: const EdgeInsets.symmetric(vertical: 10),
          child: Column(
            crossAxisAlignment: CrossAxisAlignment.start,
            children: [
              CustomTextTitle(
                  "${item['label_es'] ?? " "}${item['is_require'] == "1" ? " *" : ""}",
                  color: CustomColor.primary,
                  fontSize: 14,
                  maxLines: 10),
              const SizedBox(
                height: 5,
              ),
              InputDecorator(
                  decoration: InputDecoration(
                    contentPadding: const EdgeInsets.only(
                        left: 20, right: 10, top: 7.5, bottom: 5),
                    border: OutlineInputBorder(
                      borderRadius: BorderRadius.circular(4.0),
                    ),
                    enabledBorder: OutlineInputBorder(
                      borderSide: BorderSide(color: CustomColor.border),
                      borderRadius: BorderRadius.circular(4.0),
                    ),
                  ),
                  child: Column(
                      crossAxisAlignment: CrossAxisAlignment.start,
                      children: [
                        Row(
                          crossAxisAlignment: CrossAxisAlignment.center,
                          mainAxisAlignment: MainAxisAlignment.center,
                          children: [
                            Expanded(
                              flex: 3,
                              child: (providerData.valeData[
                                              item['id'].toString()] ==
                                          null ||
                                      providerData.valeData[
                                              item['id'].toString()] ==
                                          "processing")
                                  ? CustomTextTitle("Firma",
                                      fontSize: FontSizes.s14)
                                  : Image.memory(
                                      providerData.b64toUnit8List(providerData
                                          .valeData[item['id'].toString()]),
                                      height: 80,
                                    ),
                            ),
                            const SizedBox(
                              width: 5,
                            ),
                            Expanded(
                                flex: 2,
                                child: providerData
                                            .valeData[item['id'].toString()] ==
                                        "processing"
                                    ? customLoader(radius: 20)
                                    : CustomButton(
                                        "Dibujar firma",
                                        elevation: 0,
                                        borderRadius: 4.0,
                                        height: 35,
                                        fixedHeight: 35,
                                        margin: EdgeInsets.zero,
                                        fontSizes: FontSizes.s10,
                                        onPressed: () =>
                                            providerData.uploadSignature(
                                                context, item['id'].toString()),
                                      ))
                          ],
                        ),
                      ]))
            ],
          ));
    } else {
      return Container();
    }
  }

  Widget getInformationIcon(Map<String, dynamic> item) {
    // print("tool_tip - ${item["tool_tip_link"]}--${item["tool_tip"]}");
    if ((item["tool_tip"] == null || item["tool_tip"] == "") &&
        (item["tool_tip_link"] == null || item["tool_tip_link"] == "")) {
      return Container();
    }
    if ((item["tool_tip"] != null && item["tool_tip"] != "") &&
        (item["tool_tip_link"] != null && item["tool_tip_link"] != "")) {
      return Container(
        margin: const EdgeInsets.only(top: 20),
        child: InkWell(
          child: const Icon(
            Icons.info_outline,
            color: Colors.black,
          ),
          onTap: () => customAlert(
            context,
            okText: "Ok",
            header: item['label_es'],
            body: item["tool_tip"],
            button2: true,
            openLinkUrl: item["tool_tip_link"],
          ),
        ),
      );
    }
    if ((item["tool_tip"] != null && item["tool_tip"] != "") &&
        (item["tool_tip_link"] == null || item["tool_tip_link"] == "")) {
      return Container(
        margin: const EdgeInsets.only(top: 20),
        child: InkWell(
          child: const Icon(
            Icons.info_outline,
            color: Colors.black,
          ),
          onTap: () => customAlert(
            context,
            okText: "Ok",
            header: item['label_es'],
            body: item["tool_tip"],
          ),
        ),
      );
    }
    if ((item["tool_tip"] == null || item["tool_tip"] == "") &&
        (item["tool_tip_link"] != null && item["tool_tip_link"] != "")) {
      return Container(
        margin: const EdgeInsets.only(top: 20),
        child: InkWell(
          child: const Icon(
            Icons.info_outline,
            color: Colors.black,
          ),
          onTap: () => pushModalPage(
            context,
            WebViewerPage(
              url: item["tool_tip_link"],
              pageHeaderTitle: item['label_es'],
            ),
          ),
        ),
      );
    }
    return Container();
  }
}
Editor is loading...
Leave a Comment