KonectarEvents/lib/contacts_module/ui_screen/new_editinteraction.dart

1501 lines
62 KiB
Dart

import 'dart:convert';
import 'dart:io';
// import 'package:konectar_events/constants.dart';
// import 'package:konectar_events/textScalar.dart';
// import 'package:konectar_events/ui_screen/interactionform/model/interaction_data.dart';
// import 'package:konectar_events/ui_screen/interactionform/model/save_interaction.dart';
// import 'package:konectar_events/ui_screen/interactionform/util.dart';
// import 'package:konectar_events/ui_screen/interactionform/viewinteractionprovider.dart';
// import 'package:konectar_events/ui_screen/interactionform/widget/custombutton.dart';
// import 'package:konectar_events/ui_screen/interactionform/widget/customrangeslider.dart';
// import 'package:konectar_events/ui_screen/interactionform/widget/interatciontextfield.dart';
// import 'package:konectar_events/ui_screen/interactionform/widget/responsive_ext.dart';
import 'package:konectar_events/contacts_module/constants.dart';
import 'package:konectar_events/contacts_module/ui_screen/interactionform/model/interaction_data.dart';
import 'package:konectar_events/contacts_module/ui_screen/interactionform/model/save_interaction.dart';
import 'package:konectar_events/contacts_module/ui_screen/interactionform/util.dart';
import 'package:konectar_events/contacts_module/ui_screen/interactionform/viewinteractionprovider.dart';
import 'package:konectar_events/contacts_module/ui_screen/interactionform/widget/custombutton.dart';
import 'package:konectar_events/contacts_module/ui_screen/interactionform/widget/customrangeslider.dart';
import 'package:konectar_events/contacts_module/ui_screen/interactionform/widget/interatciontextfield.dart';
import 'package:konectar_events/contacts_module/ui_screen/interactionform/widget/responsive_ext.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_carousel_widget/flutter_carousel_widget.dart';
import 'package:intl/intl.dart';
import 'package:path_provider/path_provider.dart';
import 'package:provider/provider.dart';
import 'package:dropdown_button2/dropdown_button2.dart';
import 'package:permission_handler/permission_handler.dart';
// import 'package:pwa_ios/widgets/custombutton.dart';
// import 'package:pwa_ios/widgets/customrangeslider.dart';
// import 'package:pwa_ios/widgets/interatciontextfield.dart';
import 'package:file_picker/file_picker.dart';
// import 'package:pwa_ios/widgets/responsive_ext.dart';
import 'package:path/path.dart' as p;
class EditInteractionScreen1 extends StatefulWidget {
// int index;
// String form;
SaveInteraction saveInteraction;
EditInteractionScreen1(
{super.key,
// required this.index,
// required this.form,
required this.saveInteraction});
@override
State<EditInteractionScreen1> createState() => _EditInteractionScreenState();
}
class _EditInteractionScreenState extends State<EditInteractionScreen1> {
List<dynamic> interactionReponseList = [];
List<SectionList> sectionList = [];
List<TextEditingController> textEditingControllerList = [];
int textfieldIndex = 0;
String dropdownvalue = 'Select value';
String? fileName;
final TextEditingController textEditingController = TextEditingController();
final CarouselController _controller = CarouselController();
int _currentPage = 0;
late int _totalPages =
Provider.of<ViewInteractionProvider>(context, listen: false)
.interactionReponseList
.length;
@override
void dispose() {
super.dispose();
// WidgetsBinding.instance.addPostFrameCallback((timeStamp) {
// Provider.of<ViewInteractionProvider>(context, listen: false).dispose();
// });
}
@override
void initState() {
WidgetsBinding.instance.addPostFrameCallback((timeStamp) {
// initConfig();
// if (mytimer!.isActive) {
// cancelTimer();
// }
init();
});
super.initState();
}
initConfig() async {
// await Provider.of<InteractionProvider>(context, listen: false)
// .init(widget.index);
await Provider.of<ViewInteractionProvider>(context, listen: false)
.initConfigData();
// setState(() {});
}
init() async {
// await Provider.of<InteractionProvider>(context, listen: false)
// .init(widget.index);
await Provider.of<ViewInteractionProvider>(context, listen: false)
.initSavedForm(widget.saveInteraction);
setState(() {});
}
@override
Widget build(BuildContext context) {
return Consumer<ViewInteractionProvider>(
builder: (BuildContext context, provider, Widget? child) {
// print("build context");
// print("Providerr_is: ${provider.multipletextEditingControllerList}");
return GestureDetector(
onTap: () {
FocusScope.of(context).requestFocus(FocusNode());
},
child: OrientationBuilder(builder: (context, orientation) {
return SafeArea(
child: Scaffold(
appBar: AppBar(
title: Text(
widget.saveInteraction.id,
style: TextStyle(
fontSize: isTablet ? 22 : 14, color: Colors.white),
),
// backgroundColor: const Color(0xFF2b9af3),
automaticallyImplyLeading: false,
actions: [saveActions(provider)],
leading: InkWell(
onTap: () async {
await provider.disposeValues().then((value) {
Navigator.pop(context);
});
},
child: const Icon(
Icons.arrow_back_ios,
color: Colors.white,
),
),
),
body: Column(
mainAxisSize: MainAxisSize.min,
children: [
Expanded(
// child: ListView.builder(
// itemCount: provider.interactionReponseList.length,
// padding: EdgeInsets.zero,
// cacheExtent: double.parse(
// provider.interactionReponseList.length.toString()),
// itemBuilder: (context, index) {
// var item = provider.interactionReponseList[index];
// sectionList = item.sectionList;
child: FlutterCarousel(
options: CarouselOptions(
onPageChanged: (index, reason) {
setState(() {
_currentPage = index;
});
// Example: Perform actions when reaching the last page
// if (_currentPage == _totalPages - 1) {
// print('Reached the last page!');
// // Add your actions here
// }
},
controller: _controller,
height: MediaQuery.of(context)
.size
.height, // Adjust as needed
// aspectRatio: 16 / 9, // Optional aspect ratio adjustment
//viewportFraction: 0.9,
viewportFraction: 1.0,
initialPage: 0,
enableInfiniteScroll: false,
reverse: false,
autoPlay: false,
autoPlayInterval: Duration(seconds: 3),
autoPlayAnimationDuration:
Duration(milliseconds: 800),
autoPlayCurve: Curves.fastOutSlowIn,
enlargeCenterPage: false,
disableCenter: false,
showIndicator: true,
scrollDirection: Axis.horizontal,
slideIndicator: CircularWaveSlideIndicator(
slideIndicatorOptions: SlideIndicatorOptions(
alignment: Alignment.bottomCenter,
currentIndicatorColor: Constants.k2color,
indicatorBackgroundColor: Colors.grey),
),
),
items: provider.interactionReponseList.map((item) {
sectionList = item.sectionList;
print("Item_sectionListt11: ${item.sectionName}");
print("Item_sectionListt: ${item.sectionList}");
return ListView(
children: [
Padding(
padding: const EdgeInsets.all(10.0),
child: Text(
item.sectionName,
textAlign: TextAlign.center,
style: const TextStyle(
color: Colors.black,
fontWeight: FontWeight.normal,
fontSize: 18.0),
),
),
Container(
color: Colors.white,
child: Padding(
padding: const EdgeInsets.only(top: 0.0),
child: Column(
crossAxisAlignment:
CrossAxisAlignment.center,
children: [
GridView.count(
physics:
const NeverScrollableScrollPhysics(),
// crossAxisCount:
// context.responsive<int>(
// 1,
// sm: 1, // small
// md: 1, // medium
// lg: sectionList.length == 1
// ? 1
// : 4, // large
// xl: 3, // extra large screen
// ),
crossAxisCount: context.responsive<int>(
1,
sm: 1, // small
md: 2, // medium
lg: sectionList.length == 1
? 1
: 3, // large
xl: 3, // extra large screen
),
mainAxisSpacing:
sectionList.length == 1 || !isTablet
? 1
: 3.5,
shrinkWrap: true,
padding: EdgeInsets.zero,
childAspectRatio:
sectionList.length == 1
? orientation ==
Orientation.landscape
? 10
: 4.8
: isTablet
? 2.8
: 3.5,
children: List.generate(
sectionList.length,
(i) {
// print(sectionList);
SectionList sectionItem =
sectionList[i];
dropdownvalue = sectionItem
.widget ==
InteractionWidget.DROPDOWN
? sectionItem.value ?? "Select"
: ' ';
List<InputClass> list = sectionItem
.widget ==
InteractionWidget
.DROPDOWN ||
sectionItem.widget ==
InteractionWidget
.AUTOCOMPLETE ||
sectionItem.widget ==
InteractionWidget
.MULTISELECT
? provider.getData2(sectionItem)
: [];
provider.checkboxlist = sectionItem
.widget ==
InteractionWidget.CHECKBOX
? provider.getData2(sectionItem)
: [];
return Column(
crossAxisAlignment:
CrossAxisAlignment.start,
children: [
sectionItem.widget ==
InteractionWidget
.BUTTON &&
sectionItem.input ==
'add'
? const SizedBox.shrink()
: Padding(
padding:
const EdgeInsets
.only(
left: 8.0,
right: 8.0),
// child: Text(
// '${sectionItem.name}:*',
// style: TextStyle(
// color: Colors
// .orange
// .shade800,
// fontSize:
// isTablet
// ? 18
// : 12,
// ),
// ),
child: Text(
sectionItem.isRequired
? '${sectionItem.name}:*'
: '${sectionItem.name}:',
style: TextStyle(
color: Colors.orange
.shade800,
fontSize: 18.0,
// fontSize: isTablet
// ? 18
// : 12,
),
),
),
// SizedBox(
// height:
// isTablet ? 15 : 5,
// ),
returnWidget(
sectionItem: sectionItem,
item: item,
provider: provider,
list: list,
gridIndex: i,
listIndex: 0,
widgetData:
sectionItem.widget!,
multiple: false),
// SizedBox(
// height: isTablet ? 15 : 5,
// ),
],
);
},
),
),
// SizedBox(
// height: isTablet ? 15 : 5,
// ),
item.multiple
? gridViewWidget(
provider,
item.sectionName,
item.multipleList ?? [],
orientation,
item,
0)
: const SizedBox.shrink(),
provider.interactionReponseList.length ==
0 - 1
? saveActions(provider)
: const SizedBox.shrink()
//const Spacer(),
],
),
),
),
],
);
}).toList(),
),
),
// const Spacer(),
// saveActions(provider),
Padding(
padding: const EdgeInsets.only(bottom: 8.0),
child: Align(
alignment: Alignment.bottomCenter,
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Flexible(
child: OutlinedButton(
style: OutlinedButton.styleFrom(
shape: CircleBorder()),
onPressed: () {
//if (_currentPageIndex > _totalPages - 1)
_controller.previousPage();
},
child: Padding(
padding: EdgeInsets.all(8.0),
child: Icon(
Icons.arrow_back,
color: Constants.k2color,
),
),
),
),
Flexible(
child: OutlinedButton(
style: OutlinedButton.styleFrom(
shape: CircleBorder()),
// onPressed: () {
// _controller.nextPage(
// duration: Duration(milliseconds: 300),
// curve: Curves.ease,
// );
// },
onPressed: () {
_controller.nextPage(
duration: Duration(milliseconds: 300),
curve: Curves.ease,
);
},
child: Padding(
padding: EdgeInsets.all(8.0),
child: Icon(
Icons.arrow_forward,
color: Constants.k2color,
),
),
),
),
],
),
),
),
],
)),
);
}),
);
});
}
Widget returnWidget({
required SectionList sectionItem,
required FormFieldData item,
required ViewInteractionProvider provider,
required List<InputClass> list,
required int gridIndex,
required int listIndex,
required InteractionWidget widgetData,
required bool multiple,
}) {
switch (widgetData) {
case InteractionWidget.CHECKBOX:
return (sectionItem.inputList!.length >= 5)
? customMultiselectDropdown(
sectionItem, provider, sectionItem.inputList!, multiple)
: buildCheckbox(sectionItem, item.sectionName, provider, multiple);
case InteractionWidget.AUTOCOMPLETE:
return customAutoCompletedropdown(
sectionItem, provider, list, multiple);
case InteractionWidget.MULTISELECT:
return customMultiselectDropdown(sectionItem, provider, list, multiple);
case InteractionWidget.RADIO:
print("Radiiooooo");
return (sectionItem.inputList!.length >= 5)
? customdropdown(
sectionItem, provider, sectionItem.inputList!, multiple)
: buildRadio(sectionItem, provider);
case InteractionWidget.LABEL:
return Text(sectionItem.input!);
case InteractionWidget.RANGESLIDER:
return CustomRangeSlider(
sliderPos: sectionItem.selectedValue!.isNotEmpty
? double.parse(sectionItem.selectedValue!.last.toString())
: 10.0,
onChanged: (val) {
setState(() {
sectionItem.selectedValue = [];
sectionItem.selectedId = val.toString();
sectionItem.selectedValue!.add(val.toInt());
});
},
);
case InteractionWidget.BUTTON:
return sectionItem.input == 'add'
? const Offstage(
offstage: true,
child: Text("Visible"),
)
: Row(
children: [
CustomButton(
backgroundColor: const Color.fromARGB(255, 233, 229, 229),
onPressed: () async {
if (sectionItem.selectedValue!.isNotEmpty) {
showFilesAlertDialog(context,
sectionItem.fileName!.join(','), sectionItem);
} else {
sectionItem.selectedValue = [];
sectionItem.extension = [];
sectionItem.fileName = [];
await getEncodedFile(sectionItem);
}
setState(() {});
},
width: 120,
height: 40,
fontsize: 12,
textColor: Colors.black,
title: sectionItem.name),
const SizedBox(
width: 5,
),
Text(
sectionItem.selectedValue!.isNotEmpty
? 'File Uploaded'
: 'No file uploaded',
style: TextStyle(
color: sectionItem.selectedValue!.isNotEmpty
? Colors.green
: Colors.red),
),
],
);
case InteractionWidget.TEXT:
return sectionItem.input == 'Date'
? buildDateWidget(sectionItem)
: sectionItem.input == "textArea"
? Expanded(
child: Padding(
padding: const EdgeInsets.only(left: 8.0, right: 8.0),
child: InteractionTextField(
maxchars: int.parse(sectionItem.chars ?? "0"),
controller: sectionItem.controller!,
labelText: sectionItem.name,
// maxlines: 4,
// minlines: 3,
onChanged: (val) {
sectionItem.selectedValue = [];
setState(() {});
sectionItem.selectedValue!.add(val);
},
),
),
)
: Expanded(
child: Padding(
padding: const EdgeInsets.only(left: 8.0, right: 8.0),
child: SizedBox(
// width: isTablet ? 200 : MediaQuery.of(context).size.width,
width: MediaQuery.of(context).size.width,
height: isTablet ? 50 : 40,
child: InteractionTextField(
maxchars: int.parse(sectionItem.chars ?? "0"),
controller: sectionItem.controller!,
inputType: sectionItem.input == "number"
? TextInputType.number
: TextInputType.name,
labelText: sectionItem.name,
onChanged: (val) {
sectionItem.selectedValue = [];
provider.setTextValue(val, sectionItem, multiple);
},
),
),
),
);
case InteractionWidget.DROPDOWN:
// return customdropdown(sectionItem, provider, list, multiple);
return customAutoCompletedropdown(
sectionItem, provider, list, multiple);
}
}
Widget buildDateWidget(SectionList sectionItem) {
return Padding(
padding: const EdgeInsets.only(left: 8.0, right: 8.0),
child: SizedBox(
// width: isTablet ? 200 : MediaQuery.of(context).size.width,
width: MediaQuery.of(context).size.width,
// height: isTablet ? 50 : 40,
child: TextField(
controller:
sectionItem.controller, //editing controller of this TextField
decoration: InputDecoration(
// border: OutlineInputBorder(),
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(10.0),
),
labelStyle: const TextStyle(fontSize: 16),
suffixIcon: const Icon(Icons.calendar_today), //icon of text field
labelText: "Enter Date" //label text of field
),
readOnly: true, //set it true, so that user will not able to edit text
onTap: () async {
DateTime? pickedDate = await showDatePicker(
context: context,
initialDate: DateTime.now(),
firstDate: DateTime(
2000), //DateTime.now() - not to allow to choose before today.
lastDate: DateTime(2101));
if (pickedDate != null) {
print(
pickedDate); //pickedDate output format => 2021-03-10 00:00:00.000
String formattedDate =
DateFormat('yyyy-MM-dd').format(pickedDate);
print(
formattedDate); //formatted date output using intl package => 2021-03-16
//you can implement different kind of Date Format here according to your requirement
setState(() {
sectionItem.controller!.text = formattedDate;
sectionItem.selectedValue = [];
sectionItem.selectedValue!
.add(formattedDate); //set output date to TextField value.
});
} else {
print("Date is not selected");
}
},
),
),
);
}
Widget saveActions(ViewInteractionProvider provider) {
return Align(
alignment: Alignment.centerRight,
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
Padding(
//padding: const EdgeInsets.all(4.0),
padding: const EdgeInsets.only(top: 8.0, bottom: 8.0, right: 5.0),
child: CustomButton(
backgroundColor: Colors.green.shade500,
onPressed: () async {
// if (textFieldsValidation(provider).isEmpty) {
await provider.saveJsonObject(context,
widget.saveInteraction.intId, widget.saveInteraction);
// showAlertDialog(context, widget.saveInteraction.id);
print("Validation_isss: ${provider.isLoading}");
if (provider.isLoading == false) {
print("Validation_false");
showAlertDialog1(context, "Please fill all the fields");
} else {
showAlertDialog(context, widget.saveInteraction.id);
print("Validation_True");
}
// } else {
// _displaySnackBar(textFieldsValidation(provider));
// }
},
textColor: Colors.white,
title: "Update",
// height: 40,
// width: isTablet ? 120 : 80,
height: MediaQuery.of(context).size.height * 0.2,
fontsize: isTablet ? 16 : 12,
),
),
SizedBox(
width: isTablet ? 20 : 2,
),
],
),
);
}
Widget buildRadio(SectionList sectionItem, ViewInteractionProvider provider) {
List<InputClass> list = provider.getData2(sectionItem);
// .map((itemWord) => InputClass.fromJson(itemWord))
// .toList();
return Padding(
padding: const EdgeInsets.only(left: 8.0, right: 8.0),
child: SizedBox(
// width: isTablet ? 250 : MediaQuery.of(context).size.width,
width: MediaQuery.of(context).size.width,
child: Row(
children: <Widget>[
for (InputClass value in list)
Row(
children: [
Radio(
value: value.name,
activeColor: Colors.black,
groupValue: provider.radioValue,
onChanged: (String? value) {
setState(() {
// print(value);
provider.radioValue = value!;
int index =
list.indexWhere((element) => element.name == value);
sectionItem.selectedValue!.add(list[index].id);
});
},
),
Text(value.name),
],
),
],
),
),
);
}
Widget buildCheckbox(SectionList sectionItem, String sectionName,
ViewInteractionProvider provider, bool multiple) {
return Padding(
padding: const EdgeInsets.only(left: 8.0, right: 8.0),
child: SizedBox(
// width: 250,
width: MediaQuery.of(context).size.width,
child: Row(
children: <Widget>[
for (var value in provider.checkboxlist)
Row(
children: [
CheckboxListTile(
dense: true,
value: value.ischecked ?? false,
activeColor: Colors.black,
checkColor: Colors.white,
onChanged: (bool? newvalue) {
value.ischecked = newvalue!;
provider.setcheckBoxValue(sectionItem, sectionName,
newvalue, value.id, multiple);
//setState(() {});
},
),
Text(value.name),
],
),
],
),
),
);
}
Widget customdropdown(SectionList sectionItem,
ViewInteractionProvider provider, List<InputClass> list, bool multiple) {
// sectionItem.value = '';
// print("%%%%${sectionItem.selectedValue!.last}");
print("ItemList_is: $list");
if (list.isEmpty) {
print("###list empty###");
list = [];
InputClass inputClass =
InputClass(id: "no value", name: "Select ${sectionItem.name}");
list.add(inputClass);
sectionItem.selectedObject = list[0];
}
// InputClass selectedObj = list[0];
return Padding(
padding: const EdgeInsets.only(left: 8.0, right: 8.0),
child: SizedBox(
// width: isTablet ? 200 : MediaQuery.of(context).size.width,
// height: isTablet ? 60 : 40,
width: MediaQuery.of(context).size.width,
child: DropdownButtonFormField2<InputClass>(
isExpanded: true,
decoration: InputDecoration(
isDense: true,
// Add Horizontal padding using menuItemStyleData.padding so it matches
// the menu padding when button's width is not specified.
contentPadding: const EdgeInsets.symmetric(vertical: 5),
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(10.0),
),
// Add more decoration..
),
hint: Text(
'Select ${sectionItem.name}',
style: const TextStyle(fontSize: 14),
),
items: list
.map((item) => DropdownMenuItem<InputClass>(
value: item,
child: Text(
item.name,
style: const TextStyle(
fontSize: 14,
),
),
))
.toList(),
value: sectionItem.selectedValue!.isNotEmpty
? list[list.indexWhere(
(element) => element.id == sectionItem.selectedValue!.last,
)]
: list[0],
// // provider.getDropDownValue(sectionItem.value!, sectionItem, list)
// sectionItem.value ?? list[0].name,
validator: (value) {
if (value == null) {
return 'Please select ${sectionItem.name}';
}
return null;
},
onChanged: (value) {
//Do something when selected item is changed.
sectionItem.selectedObject = value!;
sectionItem.value = value.id;
provider.setDropDownValue(value.id, sectionItem, multiple, value);
print("selected ${sectionItem.value}");
// setState(() {});
},
onSaved: (value) {
sectionItem.selectedObject = value!;
sectionItem.value = value.id;
provider.setDropDownValue(value.id, sectionItem, multiple, value);
// setState(() {});
},
buttonStyleData: const ButtonStyleData(
padding: EdgeInsets.only(right: 8),
),
iconStyleData: const IconStyleData(
icon: Icon(
Icons.arrow_drop_down,
color: Colors.black45,
),
iconSize: 24,
),
dropdownStyleData: DropdownStyleData(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(15),
),
),
menuItemStyleData: const MenuItemStyleData(
padding: EdgeInsets.symmetric(horizontal: 16),
),
),
),
);
}
Widget customAutoCompletedropdown(SectionList sectionItem,
ViewInteractionProvider provider, List<InputClass> list, bool multiple) {
// sectionItem.value = list[0].name;
if (list.isEmpty) {
list = sectionItem.inputList!;
}
//InputClass selectedObj = list[0];
return Padding(
padding: const EdgeInsets.only(left: 8.0, right: 8.0),
child: SizedBox(
// width: isTablet ? 200 : MediaQuery.of(context).size.width,
// height: isTablet ? 60 : 40,
width: MediaQuery.of(context).size.width,
child: DropdownButtonHideUnderline(
child: DropdownButtonFormField2<InputClass>(
isExpanded: true,
decoration: InputDecoration(
// Add Horizontal padding using menuItemStyleData.padding so it matches
// the menu padding when button's width is not specified.
contentPadding: const EdgeInsets.symmetric(vertical: 5),
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(10),
),
// Add more decoration..
),
hint: Text(
'Select Item',
style: TextStyle(
fontSize: 14,
color: Theme.of(context).hintColor,
),
),
items: list
.map((item) => DropdownMenuItem(
value: item,
child: Text(
item.name,
style: const TextStyle(
fontSize: 14,
),
),
))
.toList(),
value: sectionItem.selectedObject,
onSaved: (value) {
sectionItem.selectedObject = value!;
provider.setAutoCompleteValue(value.id, sectionItem, multiple);
sectionItem.value = value.name;
},
onChanged: (value) {
// setState(() {
sectionItem.selectedObject = value!;
provider.setAutoCompleteValue(value.id, sectionItem, multiple);
sectionItem.value = value.name;
// setState(() {});
//});
},
buttonStyleData: const ButtonStyleData(
padding: EdgeInsets.symmetric(horizontal: 16),
height: 40,
width: 200,
),
dropdownStyleData: const DropdownStyleData(
maxHeight: 200,
),
menuItemStyleData: const MenuItemStyleData(
height: 40,
),
dropdownSearchData: DropdownSearchData(
searchController: textEditingController,
searchInnerWidgetHeight: 50,
searchInnerWidget: Container(
height: 50,
padding: const EdgeInsets.only(
top: 8,
bottom: 4,
right: 8,
left: 8,
),
child: TextFormField(
expands: true,
maxLines: null,
controller: textEditingController,
decoration: InputDecoration(
isDense: true,
contentPadding: const EdgeInsets.symmetric(
horizontal: 10,
vertical: 18,
),
hintText: 'Search for an item...',
hintStyle: const TextStyle(fontSize: 12),
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(10),
),
),
),
),
searchMatchFn: (item, searchValue) {
return item.value!.name.toString().contains(searchValue);
},
),
//This to clear the search value when you close the menu
onMenuStateChange: (isOpen) {
if (!isOpen) {
textEditingController.clear();
}
},
),
),
),
);
}
Widget customMultiselectDropdown(SectionList sectionItem,
ViewInteractionProvider provider, List<InputClass> list, bool multiple) {
if (list.isEmpty) {
list = sectionItem.inputList!;
}
InputClass selectedObj = list[0];
return Padding(
padding: const EdgeInsets.only(left: 8.0, right: 8.0),
child: SizedBox(
// width: isTablet ? 200 : MediaQuery.of(context).size.width,
// height: isTablet ? 60 : 40,
width: MediaQuery.of(context).size.width,
child: DropdownButtonHideUnderline(
child: DropdownButtonFormField2<InputClass>(
isExpanded: true,
decoration: InputDecoration(
isDense: true,
// Add Horizontal padding using menuItemStyleData.padding so it matches
// the menu padding when button's width is not specified.
contentPadding: const EdgeInsets.symmetric(vertical: 5),
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(10),
),
// Add more decoration..
),
hint: Text(
'Select Items',
style: TextStyle(
fontSize: 14,
color: Theme.of(context).hintColor,
),
),
items: list.map((item) {
return DropdownMenuItem(
value: item,
//disable default onTap to avoid closing menu when selecting an item
enabled: false,
child: StatefulBuilder(
builder: (context, menuSetState) {
final isSelected =
sectionItem.selectedValue!.contains(item.name);
return InkWell(
onTap: () {
isSelected
? sectionItem.selectedValue!.remove(item.name)
: sectionItem.selectedValue!.add(item.name);
//This rebuilds the StatefulWidget to update the button's text
setState(() {});
//This rebuilds the dropdownMenu Widget to update the check mark
menuSetState(() {});
},
child: Container(
height: double.infinity,
padding: const EdgeInsets.symmetric(horizontal: 16.0),
child: Row(
children: [
if (isSelected)
const Icon(Icons.check_box_outlined)
else
const Icon(Icons.check_box_outline_blank),
const SizedBox(width: 16),
Expanded(
child: Text(
item.name,
style: const TextStyle(
fontSize: 14,
),
),
),
],
),
),
);
},
),
);
}).toList(),
//Use last selected item as the current value so if we've limited menu height, it scroll to last item.
value: selectedObj,
// ? null
// : provider.selectedItems.last,
onChanged: (value) {
selectedObj = value!;
provider.setAutoCompleteValue(value.id, sectionItem, multiple);
sectionItem.value = value.name;
},
onSaved: (value) {
selectedObj = value!;
provider.setAutoCompleteValue(value.id, sectionItem, multiple);
sectionItem.value = value.name;
},
selectedItemBuilder: (context) {
return list.map(
(item) {
return Container(
alignment: AlignmentDirectional.center,
child: Text(
sectionItem.selectedValue!.join(', '),
style: const TextStyle(
fontSize: 14,
overflow: TextOverflow.ellipsis,
),
maxLines: 1,
),
);
},
).toList();
},
buttonStyleData: const ButtonStyleData(
padding: EdgeInsets.only(left: 16, right: 8),
height: 40,
width: 140,
),
menuItemStyleData: const MenuItemStyleData(
height: 40,
padding: EdgeInsets.zero,
),
),
),
),
);
}
Widget gridViewWidget(
ViewInteractionProvider provider,
String sectionName,
List<SectionList> sectionList,
Orientation orientation,
FormFieldData item,
int listIndex) {
print("SectionListtt:isss: $sectionList");
List<SectionList> pooja = sectionList;
print("Pooja: $pooja");
List<List<SectionList>> convertedArray = [];
print("Provider Length: ${item.sectionList.length}");
for (int i = 0; i < sectionList.length; i += item.sectionList.length + 1) {
print("Section List11111: $sectionList");
print("item.sectionList.length List11111: ${item.sectionList.length}");
convertedArray
.add(sectionList.sublist(i, i + item.sectionList.length + 1));
}
print("ConvertedArrayEditMulti.leangth: $convertedArray");
print("ConvertedArray.leangth: ${convertedArray.length}");
return Column(
children: [
for (var i = 0; i < convertedArray.length; i++)
DecoratedBox(
decoration: BoxDecoration(
color: i % 2 == 0
? Color.fromARGB(133, 213, 241, 254)
: Colors.white,
),
child: Wrap(
children: [
//GestureDetector(child: Text("data")),
GridView.builder(
physics: const NeverScrollableScrollPhysics(),
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: context.responsive<int>(
1,
sm: 1, // small
md: 2, // medium
lg: sectionList.length == 1
? 1
: (sectionList.length >= 1 ? 3 : 3), // large
xl: 3, // extra large screen
),
mainAxisSpacing:
sectionList.length == 1 || !isTablet ? 1 : 2,
childAspectRatio: sectionList.length == 1
? orientation == Orientation.landscape
? 10
: 4.8
: isTablet
? 2.8
: 3.0,
),
shrinkWrap: true,
padding: EdgeInsets.zero,
itemCount: convertedArray[i].length,
itemBuilder: (context, index) {
SectionList sectionItem = convertedArray[i][index];
dropdownvalue =
sectionItem.widget == InteractionWidget.DROPDOWN
? sectionItem.value ?? "Select"
: ' ';
List<InputClass> list =
sectionItem.widget == InteractionWidget.DROPDOWN ||
sectionItem.widget ==
InteractionWidget.AUTOCOMPLETE ||
sectionItem.widget ==
InteractionWidget.MULTISELECT
? provider.getData2(sectionItem)
: [];
provider.checkboxlist =
sectionItem.widget == InteractionWidget.CHECKBOX
? provider.getData2(sectionItem)
: [];
return SizedBox(
height: MediaQuery.of(context).size.height,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
sectionItem.widget == InteractionWidget.BUTTON &&
sectionItem.param == 'add' ||
sectionItem.param == 'deletebtn'
? const SizedBox.shrink()
: Padding(
padding: const EdgeInsets.only(
left: 8.0, right: 8.0),
child: Text(
sectionItem.isRequired
? '${sectionItem.name}:*'
: '${sectionItem.name}:',
style: TextStyle(
color: Colors.orange.shade800,
fontSize: 18.0,
// fontSize: isTablet
// ? 18
// : 12,
),
)),
const SizedBox(
height: 15,
),
sectionItem.widget == InteractionWidget.BUTTON
? sectionItem.input == 'chooseFile'
? Row(
children: [
CustomButton(
backgroundColor:
const Color.fromARGB(
255, 233, 229, 229),
onPressed: () async {
if (sectionItem.selectedValue!
.isNotEmpty) {
showFilesAlertDialog(
context,
sectionItem.fileName!
.join(','),
sectionItem);
} else {
sectionItem.selectedValue =
[];
sectionItem.extension = [];
sectionItem.fileName = [];
await getEncodedFile(
sectionItem);
}
setState(() {});
},
width: 120,
height: 40,
fontsize: 12,
textColor: Colors.black,
title: sectionItem.name),
const SizedBox(
width: 5,
),
Text(
sectionItem
.selectedValue!.isNotEmpty
? 'File uploaded'
: 'No file uploaded',
style: TextStyle(
color: sectionItem
.selectedValue!
.isNotEmpty
? Colors.green
: Colors.red),
),
],
)
: isTablet
? IconButton(
onPressed: () {
provider.deleteMultipleRows(
sectionItem.gid!,
sectionList[i],
sectionName);
setState(() {});
},
icon: const Icon(
Icons.cancel,
size: 30,
color: Color.fromARGB(
255, 8, 39, 92),
),
)
: Padding(
padding: const EdgeInsets.only(
left: 8.0, right: 8.0),
child: CustomButton(
backgroundColor:
const Color.fromARGB(
255, 233, 75, 75),
onPressed: () {
provider.deleteMultipleRows(
sectionItem.gid!,
sectionList[i],
sectionName);
setState(() {});
},
// width: 80,
// height: 30,
height: 40,
fontsize: 12,
textColor: Colors.white,
title: "Delete"),
)
: returnWidget(
sectionItem: sectionItem,
item: item,
provider: provider,
list: list,
gridIndex: i,
listIndex: listIndex,
widgetData: sectionItem.widget!,
multiple: true),
],
),
);
}),
],
),
),
],
);
}
String textFieldsValidation(ViewInteractionProvider provider) {
if (provider.sectionList
.any((element) => element.controller!.text.isEmpty)) {
return 'Fields cannot be empty';
}
if (provider.textEditingControllerList.isNotEmpty) {
if (provider.validateTextFields()) {
return 'Fields cannot be empty';
}
}
if (provider.multipletextEditingControllerList.isNotEmpty) {
if (provider.validateMultipleRows()) {
return 'Fields cannot be empty';
}
}
return '';
}
_displaySnackBar(String msg) {
final snackBar = SnackBar(
content: Text(
msg,
style: const TextStyle(fontSize: 20.0, fontWeight: FontWeight.bold),
));
ScaffoldMessenger.of(context).showSnackBar(snackBar);
//scaffoldKeyLogin.currentState!.showSnackBar(snackBar);
}
Future<void> getEncodedFile(SectionList sectionItem) async {
String base64Image = '';
var status = Platform.isAndroid
? await Permission.manageExternalStorage.status
: await Permission.storage.status;
if (status.isGranted) {
FilePickerResult? result =
await FilePicker.platform.pickFiles(allowMultiple: true);
if (result != null) {
print(result.files.first.path);
print(result.files.last.path);
for (var files in result.files) {
File file = File(files.path!);
print("check file path : ${file.path}");
fileName = file.path.split('/').last;
// Get the application folder directory
Directory? directory = Platform.isAndroid
? await getExternalStorageDirectory() //FOR ANDROID
: await getApplicationDocumentsDirectory();
String newPath = ""; //FOR ios
String convertedDirectoryPath = (directory?.path).toString();
print("see the converted directory path $convertedDirectoryPath");
newPath = "$convertedDirectoryPath/konectar/files";
print("new path :$newPath");
directory = Directory(newPath);
if (!await directory.exists()) {
await directory.create(recursive: true);
}
File newFile = await file.copy('${directory.path}/$fileName');
print("new path is ${newFile.path}");
final extension = p.extension(newFile.path);
List<int> imageBytes = await newFile.readAsBytes();
Uint8List imageUint8List = Uint8List.fromList(imageBytes);
base64Image = base64Encode(imageUint8List);
sectionItem.selectedValue!.add(base64Image);
sectionItem.extension!.add(extension);
sectionItem.fileName!.add(fileName);
}
}
} else {
print("not permitted");
await requestPermission(Platform.isAndroid
? Permission.manageExternalStorage
: Permission.storage);
}
}
Future<void> requestPermission(Permission permission) async {
final status = await permission.request();
setState(() {
print(status);
});
}
showAlertDialog(BuildContext context, String record) {
// set up the buttons
// ViewInteractionProvider provider =
// Provider.of<ViewInteractionProvider>(context, listen: false);
Widget cancelButton = TextButton(
child: const Text("Ok"),
onPressed: () async {
Navigator.of(context).pop();
Navigator.of(context).pop();
},
);
// set up the AlertDialog
AlertDialog alert = AlertDialog(
title: const Text(""),
content: Text("Form $record Updated Successfully!"),
actions: [
cancelButton,
],
);
// show the dialog
showDialog(
context: context,
builder: (BuildContext context) {
return alert;
},
);
}
showAlertDialog1(BuildContext context, String record) {
// set up the buttons
// ViewInteractionProvider provider =
// Provider.of<ViewInteractionProvider>(context, listen: false);
Widget cancelButton = TextButton(
child: const Text("Ok"),
onPressed: () async {
Navigator.of(context).pop();
},
);
// set up the AlertDialog
AlertDialog alert = AlertDialog(
title: const Text(""),
content: Text(record),
actions: [
cancelButton,
],
);
// show the dialog
showDialog(
context: context,
builder: (BuildContext context) {
return alert;
},
);
}
showFilesAlertDialog(
BuildContext context, String files, SectionList sectionItem) {
// set up the buttons
// ViewInteractionProvider provider =
// Provider.of<ViewInteractionProvider>(context, listen: false);
Widget cancelButton = TextButton(
child: const Text("Upload"),
onPressed: () async {
Navigator.of(context).pop();
sectionItem.selectedValue = [];
sectionItem.extension = [];
sectionItem.fileName = [];
await getEncodedFile(sectionItem);
},
);
Widget okButton = TextButton(
child: const Text("Cancel"),
onPressed: () async {
Navigator.of(context).pop();
},
);
// set up the AlertDialog
AlertDialog alert = AlertDialog(
title: const Text(""),
content: Text(
"Following File(s) $files uploaded .Do you still want to upload files ?",
style: const TextStyle(fontSize: 15),
),
actions: [cancelButton, okButton],
);
// show the dialog
showDialog(
context: context,
builder: (BuildContext context) {
return alert;
},
);
}
}