supplier attachment, extend demo period and submit evaluation.

design_3.0_demo_module
Sikander Saleem 2 weeks ago
parent 1a2845337b
commit b20f42848b

@ -125,12 +125,14 @@ extension IntExtensionsDemoRequest on int {
return DemoRequestStepEnum.qAuditorRejectAccept; return DemoRequestStepEnum.qAuditorRejectAccept;
case 5: case 5:
return DemoRequestStepEnum.updateRequest; return DemoRequestStepEnum.updateRequest;
case 21:
return DemoRequestStepEnum.updateRequest;
return DemoRequestStepEnum.viewOnly; return DemoRequestStepEnum.viewOnly;
case 15: case 15:
return DemoRequestStepEnum.extendDemoPeriod; return DemoRequestStepEnum.extendDemoPeriod;
default: default:
// return DemoRequestStepEnum.viewOnly; return DemoRequestStepEnum.viewOnly;
return DemoRequestStepEnum.updateRequest;
} }
} }
} }

@ -21,6 +21,7 @@ import 'package:test_sa/modules/cm_module/views/components/bottom_sheets/service
import 'package:test_sa/modules/cm_module/views/components/verify_arrival_view.dart'; import 'package:test_sa/modules/cm_module/views/components/verify_arrival_view.dart';
import 'package:test_sa/modules/cm_module/views/forms/asset_retired/verify_asset_detail.dart'; import 'package:test_sa/modules/cm_module/views/forms/asset_retired/verify_asset_detail.dart';
import 'package:test_sa/modules/demo_module/demo_extension_bottom_sheet.dart'; import 'package:test_sa/modules/demo_module/demo_extension_bottom_sheet.dart';
import 'package:test_sa/modules/demo_module/evaluation_form_page.dart';
import 'package:test_sa/modules/demo_module/models/demo_request_model.dart'; import 'package:test_sa/modules/demo_module/models/demo_request_model.dart';
import 'package:test_sa/modules/demo_module/provider/demo_provider.dart'; import 'package:test_sa/modules/demo_module/provider/demo_provider.dart';
import 'package:test_sa/modules/demo_module/update_demo-request_view.dart'; import 'package:test_sa/modules/demo_module/update_demo-request_view.dart';
@ -445,12 +446,7 @@ class FooterActionButton {
// maxWidth: true, // maxWidth: true,
buttonColor: AppColor.primary10, buttonColor: AppColor.primary10,
onPressed: () async { onPressed: () async {
bool? isRefresh = await Navigator.push( bool? isRefresh = await Navigator.push(context, MaterialPageRoute(builder: (context) => EvaluationFormPage()));
context,
MaterialPageRoute(
builder: (context) => UpdateDemoRequestView(
dataModel: dataModel,
)));
if (isRefresh == true) { if (isRefresh == true) {
refreshData(); refreshData();
} }

@ -85,6 +85,7 @@ class _DemoDetailViewPageState extends State<DemoDetailViewPage> {
if (snapshot.data == null) return const NoDataFound().center; if (snapshot.data == null) return const NoDataFound().center;
List<DemoAttachments> allAttachments = snapshot.data!.demoAttachments! ?? []; List<DemoAttachments> allAttachments = snapshot.data!.demoAttachments! ?? [];
List<DemoAttachments> suppAttachments = snapshot.data!.supplierDemoAttachments! ?? [];
DemoRequestModel demoData = snapshot.data!; DemoRequestModel demoData = snapshot.data!;
@ -126,12 +127,22 @@ class _DemoDetailViewPageState extends State<DemoDetailViewPage> {
images: allAttachments.map((e) => URLs.getFileUrl(e.attachmentName ?? '') ?? '').toList(), images: allAttachments.map((e) => URLs.getFileUrl(e.attachmentName ?? '') ?? '').toList(),
types: allAttachments.map((e) => e.documentType?.name ?? '').toList()), types: allAttachments.map((e) => e.documentType?.name ?? '').toList()),
], ],
if (suppAttachments.isNotEmpty) ...[
const Divider().defaultStyle(context),
Text(
"Supplier Attachments".addTranslation,
style: AppTextStyles.heading6.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50),
),
FilesList(
showAsListView: true,
images: suppAttachments.map((e) => URLs.getFileUrl(e.attachmentName ?? '') ?? '').toList(),
types: suppAttachments.map((e) => e.documentType?.name ?? '').toList()),
],
], ],
).toShadowContainer(context, padding: 12), ).toShadowContainer(context, padding: 12),
).expanded, ).expanded,
FooterActionButton.demoRequestDetailsFooterWidget( FooterActionButton.demoRequestDetailsFooterWidget(
demoRequestStage: demoData.status!.demoRequestStepEnum!, demoRequestStage: demoData.status!.demoRequestStepEnum!,
// demoRequestStage: DemoRequestStepEnum.updateRequest,
dataModel: demoData, dataModel: demoData,
status: demoData.status!, status: demoData.status!,
context: context, context: context,

@ -121,6 +121,46 @@ class _EvaluationFormPageState extends State<EvaluationFormPage> {
children: [ children: [
'Clinical practice after using the new technology'.addTranslation.bodyText(context).custom(color: AppColor.black10), 'Clinical practice after using the new technology'.addTranslation.bodyText(context).custom(color: AppColor.black10),
16.height, 16.height,
AppTextFormField(
initialValue: "",
hintText: "Some Comments",
labelText: "Advantages",
validator: (value) {
if ((value ?? "").isEmpty) return "Mandatory";
return null;
},
style: TextStyle(fontWeight: FontWeight.w500, fontSize: context.isTablet() ? 16 : 12, color: context.isDark ? Colors.white : const Color(0xff3B3D4A)),
labelStyle: TextStyle(fontWeight: FontWeight.w500, fontSize: context.isTablet() ? 16 : 12, color: context.isDark ? Colors.white : const Color(0xff767676)),
floatingLabelStyle: TextStyle(fontWeight: FontWeight.w500, fontSize: context.isTablet() ? 16 : 12, color: context.isDark ? Colors.white : const Color(0xff3B3D4A)),
backgroundColor: AppColor.fieldBgColor(context),
showShadow: false,
textInputType: TextInputType.multiline,
makeMultiLinesNull: false,
onChange: (value) {
formData['advantages'] = value;
},
),
8.height,
AppTextFormField(
initialValue: "",
hintText: "Some Comments",
labelText: "Disadvantages",
validator: (value) {
if ((value ?? "").isEmpty) return "Mandatory";
return null;
},
style: TextStyle(fontWeight: FontWeight.w500, fontSize: context.isTablet() ? 16 : 12, color: context.isDark ? Colors.white : const Color(0xff3B3D4A)),
labelStyle: TextStyle(fontWeight: FontWeight.w500, fontSize: context.isTablet() ? 16 : 12, color: context.isDark ? Colors.white : const Color(0xff767676)),
floatingLabelStyle: TextStyle(fontWeight: FontWeight.w500, fontSize: context.isTablet() ? 16 : 12, color: context.isDark ? Colors.white : const Color(0xff3B3D4A)),
backgroundColor: AppColor.fieldBgColor(context),
showShadow: false,
textInputType: TextInputType.multiline,
makeMultiLinesNull: false,
onChange: (value) {
formData['disadvantages'] = value;
},
),
8.height,
AppTextFormField( AppTextFormField(
initialValue: "", initialValue: "",
hintText: "Some Comments", hintText: "Some Comments",
@ -324,7 +364,7 @@ class _EvaluationFormPageState extends State<EvaluationFormPage> {
textInputType: TextInputType.multiline, textInputType: TextInputType.multiline,
makeMultiLinesNull: false, makeMultiLinesNull: false,
onChange: (value) { onChange: (value) {
// _demoFormModel.docName = value; formData['additionalComments'] = value;
}, },
), ),
]).toShadowContainer(context, borderRadius: 20); ]).toShadowContainer(context, borderRadius: 20);
@ -342,7 +382,7 @@ class _EvaluationFormPageState extends State<EvaluationFormPage> {
bool isSuccess = await demoProvider.addDemoTrialOutcome(formData); bool isSuccess = await demoProvider.addDemoTrialOutcome(formData);
Utils.hideLoading(context); Utils.hideLoading(context);
if (isSuccess) { if (isSuccess) {
Navigator.pop(context); Navigator.pop(context, true);
} }
} }
} }

@ -29,6 +29,7 @@ class DemoRequestModel {
SuppEngineerWorkOrders? suppPerson; SuppEngineerWorkOrders? suppPerson;
Lookup? status; Lookup? status;
List<DemoAttachments>? demoAttachments; List<DemoAttachments>? demoAttachments;
List<DemoAttachments>? supplierDemoAttachments;
dynamic demoAsset; dynamic demoAsset;
dynamic demoInstallationTaskJob; dynamic demoInstallationTaskJob;
dynamic demoPullOutTaskJob; dynamic demoPullOutTaskJob;
@ -58,6 +59,7 @@ class DemoRequestModel {
this.suppPerson, this.suppPerson,
this.status, this.status,
this.demoAttachments, this.demoAttachments,
this.supplierDemoAttachments,
this.demoAsset, this.demoAsset,
this.demoInstallationTaskJob, this.demoInstallationTaskJob,
this.demoPullOutTaskJob, this.demoPullOutTaskJob,
@ -88,6 +90,7 @@ class DemoRequestModel {
suppPerson = json['suppPerson'] != null ? (SuppEngineerWorkOrders.fromJson(json['suppPerson'])) : null; suppPerson = json['suppPerson'] != null ? (SuppEngineerWorkOrders.fromJson(json['suppPerson'])) : null;
status = json['status'] != null ? (Lookup.fromJson(json['status'])) : null; status = json['status'] != null ? (Lookup.fromJson(json['status'])) : null;
demoAttachments = json['demoAttachments'] != null ? (json['demoAttachments'] as List).map((e) => DemoAttachments.fromJson(e)).toList() : null; demoAttachments = json['demoAttachments'] != null ? (json['demoAttachments'] as List).map((e) => DemoAttachments.fromJson(e)).toList() : null;
supplierDemoAttachments = json['supplierDemoAttachments'] != null ? (json['supplierDemoAttachments'] as List).map((e) => DemoAttachments.fromJson(e)).toList() : null;
demoAsset = json['demoAsset']; demoAsset = json['demoAsset'];
demoInstallationTaskJob = json['demoInstallationTaskJob']; demoInstallationTaskJob = json['demoInstallationTaskJob'];
demoPullOutTaskJob = json['demoPullOutTaskJob']; demoPullOutTaskJob = json['demoPullOutTaskJob'];
@ -111,6 +114,7 @@ class DemoRequestModel {
"supplierId": supplier?.id, "supplierId": supplier?.id,
"suppPersonId": suppPerson?.id, "suppPersonId": suppPerson?.id,
"demoAttachments": demoAttachments != null ? demoAttachments!.map((v) => v.toJson()).toList() : [], "demoAttachments": demoAttachments != null ? demoAttachments!.map((v) => v.toJson()).toList() : [],
"supplierDemoAttachments": supplierDemoAttachments != null ? supplierDemoAttachments!.map((v) => v.toJson()).toList() : [],
}; };
} }
} }

@ -44,7 +44,7 @@ class DemoProvider extends ChangeNotifier {
Map<String, dynamic> payload = {"demoRequestId": requestId, "isApproved": status}; Map<String, dynamic> payload = {"demoRequestId": requestId, "isApproved": status};
Response response = await ApiManager.instance.post(URLs.updateDemoRequestByAssessor, body: payload, showToast: false); Response response = await ApiManager.instance.post(URLs.updateDemoRequestByAssessor, body: payload, showToast: false);
if (response.statusCode >= 200 && response.statusCode < 300) { if (response.statusCode >= 200 && response.statusCode < 300) {
String message = (jsonDecode(response.body)["data"] ?? "") + " " + (jsonDecode(response.body)["message"] ?? ""); String message = (jsonDecode(response.body)["message"] ?? "");
Fluttertoast.showToast(msg: message ?? "", toastLength: Toast.LENGTH_LONG); Fluttertoast.showToast(msg: message ?? "", toastLength: Toast.LENGTH_LONG);
return true; return true;
} }
@ -58,9 +58,12 @@ class DemoProvider extends ChangeNotifier {
try { try {
Response response = await ApiManager.instance.post(URLs.updateDemoRequest, body: body, showToast: false); Response response = await ApiManager.instance.post(URLs.updateDemoRequest, body: body, showToast: false);
if (response.statusCode >= 200 && response.statusCode < 300) { if (response.statusCode >= 200 && response.statusCode < 300) {
String message = (jsonDecode(response.body)["data"] ?? "") + " " + (jsonDecode(response.body)["message"] ?? ""); String message = (jsonDecode(response.body)["message"] ?? "");
Fluttertoast.showToast(msg: message ?? "", toastLength: Toast.LENGTH_LONG); Fluttertoast.showToast(msg: message ?? "", toastLength: Toast.LENGTH_LONG);
return true; return true;
} else if (response.statusCode >= 400 && response.statusCode < 500) {
String message = (jsonDecode(response.body)["message"] ?? "");
Fluttertoast.showToast(msg: message ?? "", toastLength: Toast.LENGTH_LONG);
} }
return false; return false;
} catch (error) { } catch (error) {
@ -73,7 +76,7 @@ class DemoProvider extends ChangeNotifier {
Map<String, dynamic> payload = {"demoRequestId": requestId, "demoPeriodId": demoPeriodId, "isDemoPeriodExtentionRequired": isUpdateRequired}; Map<String, dynamic> payload = {"demoRequestId": requestId, "demoPeriodId": demoPeriodId, "isDemoPeriodExtentionRequired": isUpdateRequired};
Response response = await ApiManager.instance.post(URLs.updateDemoPeriodByRequester, body: payload, showToast: false); Response response = await ApiManager.instance.post(URLs.updateDemoPeriodByRequester, body: payload, showToast: false);
if (response.statusCode >= 200 && response.statusCode < 300) { if (response.statusCode >= 200 && response.statusCode < 300) {
String message = (jsonDecode(response.body)["data"] ?? "") + " " + (jsonDecode(response.body)["message"] ?? ""); String message = (jsonDecode(response.body)["message"] ?? "");
Fluttertoast.showToast(msg: message ?? "", toastLength: Toast.LENGTH_LONG); Fluttertoast.showToast(msg: message ?? "", toastLength: Toast.LENGTH_LONG);
return true; return true;
} }
@ -110,7 +113,7 @@ class DemoProvider extends ChangeNotifier {
try { try {
Response response = await ApiManager.instance.post(URLs.addDemoTrialOutcome, body: body, showToast: false); Response response = await ApiManager.instance.post(URLs.addDemoTrialOutcome, body: body, showToast: false);
if (response.statusCode >= 200 && response.statusCode < 300) { if (response.statusCode >= 200 && response.statusCode < 300) {
String message = (jsonDecode(response.body)["data"] ?? "") + " " + (jsonDecode(response.body)["message"] ?? ""); String message = (jsonDecode(response.body)["message"] ?? "");
Fluttertoast.showToast(msg: message ?? "", toastLength: Toast.LENGTH_LONG); Fluttertoast.showToast(msg: message ?? "", toastLength: Toast.LENGTH_LONG);
return true; return true;
} }

@ -34,6 +34,7 @@ import 'package:test_sa/providers/work_order/vendor_provider.dart';
import 'package:test_sa/views/widgets/images/multi_image_picker.dart'; import 'package:test_sa/views/widgets/images/multi_image_picker.dart';
import '../../../../../../new_views/common_widgets/default_app_bar.dart'; import '../../../../../../new_views/common_widgets/default_app_bar.dart';
import '../../models/new_models/department.dart'; import '../../models/new_models/department.dart';
import 'demo_document_lookup_provider.dart';
import 'models/demo_form_model.dart'; import 'models/demo_form_model.dart';
class UpdateDemoRequestView extends StatefulWidget { class UpdateDemoRequestView extends StatefulWidget {
@ -47,7 +48,7 @@ class UpdateDemoRequestView extends StatefulWidget {
} }
class _UpdateDemoRequestViewState extends State<UpdateDemoRequestView> with TickerProviderStateMixin { class _UpdateDemoRequestViewState extends State<UpdateDemoRequestView> with TickerProviderStateMixin {
final List<DemoAttachments> attachments = []; final List<GenericAttachmentModel> attachments = [];
final GlobalKey<FormState> _formKey = GlobalKey<FormState>(); final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>(); final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
DemoFormModel _demoFormModel = DemoFormModel(); DemoFormModel _demoFormModel = DemoFormModel();
@ -65,6 +66,7 @@ class _UpdateDemoRequestViewState extends State<UpdateDemoRequestView> with Tick
late SiteProvider siteProvider; late SiteProvider siteProvider;
late DemoProvider demoProvider; late DemoProvider demoProvider;
bool isLoading = true; bool isLoading = true;
Lookup? demoDocumentLookup;
@override @override
void initState() { void initState() {
@ -161,7 +163,7 @@ class _UpdateDemoRequestViewState extends State<UpdateDemoRequestView> with Tick
for (final item in widget.dataModel.demoAttachments!) { for (final item in widget.dataModel.demoAttachments!) {
if ((item.attachmentName ?? '').isNotEmpty) { if ((item.attachmentName ?? '').isNotEmpty) {
attachments.add( attachments.add(
DemoAttachments(attachmentName: item.attachmentName, id: item.id ?? 0, originalName: item.originalName), GenericAttachmentModel(name: item.attachmentName, id: item.id ?? 0, originalName: item.originalName, documentTypeId: item.documentType),
); );
} }
} }
@ -197,14 +199,36 @@ class _UpdateDemoRequestViewState extends State<UpdateDemoRequestView> with Tick
16.height, 16.height,
...vendorDetailsSection(), ...vendorDetailsSection(),
16.height, 16.height,
// AttachmentPicker( "Attachments".bodyText(context).custom(color: AppColor.black10),
// label: context.translation.attachments, 8.height,
// attachment: attachments, SingleItemDropDownMenu<Lookup, DemoDocumentLookupProvider>(
// buttonColor: AppColor.black10, context: context,
// onlyImages: false, height: 56.toScreenHeight,
// showAsListView: true, title: "Document Type",
// buttonIcon: 'image-plus'.toSvgAsset(color: context.isDark ? AppColor.primary10 : AppColor.neutral120), initialValue: demoDocumentLookup,
// ), showShadow: false,
validator: (value) {
if (value == null) return "Mandatory";
return null;
},
backgroundColor: AppColor.fieldBgColor(context),
showAsBottomSheet: true,
onSelect: (value) {
demoDocumentLookup = value;
setState(() {});
},
),
16.height,
AttachmentPicker(
label: context.translation.attachments,
attachment: attachments,
buttonColor: AppColor.black10.withOpacity(demoDocumentLookup != null ? 1 : .4),
onlyImages: false,
documentType: demoDocumentLookup,
enabled: demoDocumentLookup != null,
showAsListView: true,
buttonIcon: 'image-plus'.toSvgAsset(color: (context.isDark ? AppColor.primary10 : AppColor.neutral120).withOpacity(demoDocumentLookup != null ? 1 : .4)),
),
], ],
).toShadowContainer(context, borderRadius: 20), ).toShadowContainer(context, borderRadius: 20),
).expanded, ).expanded,
@ -496,11 +520,18 @@ class _UpdateDemoRequestViewState extends State<UpdateDemoRequestView> with Tick
'${'Vendor Name'.addTranslation}: ${_demoFormModel.vendorName?.cleanupWhitespace.capitalizeFirstOfEach}', '${'Vendor Name'.addTranslation}: ${_demoFormModel.vendorName?.cleanupWhitespace.capitalizeFirstOfEach}',
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral120), style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral120),
), ),
8.height,
Text( Text(
'${'Representative Name'.addTranslation}: ${_demoFormModel.vendorRepresentativeName?.cleanupWhitespace.capitalizeFirstOfEach}', '${'Representative Name'.addTranslation}: ${_demoFormModel.vendorRepresentativeName?.cleanupWhitespace.capitalizeFirstOfEach}',
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral120), style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral120),
), ),
Text(
'${'Contact'.addTranslation}: ${_demoFormModel.vendorContactNumber?.cleanupWhitespace.capitalizeFirstOfEach}',
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral120),
),
Text(
'${'Email'.addTranslation}: ${_demoFormModel.vendorEmail?.cleanupWhitespace.capitalizeFirstOfEach}',
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral120),
),
], ],
8.height, 8.height,
@ -582,9 +613,9 @@ class _UpdateDemoRequestViewState extends State<UpdateDemoRequestView> with Tick
_demoFormModel.demoAttachment = []; _demoFormModel.demoAttachment = [];
// _demoFormModel.id = 3; // _demoFormModel.id = 3;
for (var item in attachments) { for (var item in attachments) {
// String fileName = CMRequestUtils.isLocalUrl(item.name ?? '') ? ("${item.name ?? ''.split("/").last}|${base64Encode(File(item.name ?? '').readAsBytesSync())}") : item.name ?? ''; String fileName = CMRequestUtils.isLocalUrl(item.name ?? '') ? ("${item.name ?? ''.split("/").last}|${base64Encode(File(item.name ?? '').readAsBytesSync())}") : item.name ?? '';
//Todo need to pass attachmentType id as well. //Todo need to pass attachmentType id as well.
// _demoFormModel.demoAttachment?.add(DemoAttachments(id: item.id, demoRequestId: _demoFormModel.id ?? 0, attachmentName: fileName)); _demoFormModel.demoAttachment?.add(DemoAttachments(id: item.id, demoRequestId: _demoFormModel.id ?? 0, attachmentName: fileName,originalName: fileName, documentTypeId: item.documentTypeId!.id));
} }
Utils.showLoading(context); Utils.showLoading(context);
DemoProvider demoProvider = Provider.of<DemoProvider>(context, listen: false); DemoProvider demoProvider = Provider.of<DemoProvider>(context, listen: false);

Loading…
Cancel
Save