loan design in progress
parent
659f2029dc
commit
255691f47a
@ -0,0 +1,95 @@
|
|||||||
|
import 'package:test_sa/models/lookup.dart';
|
||||||
|
import 'package:test_sa/models/new_models/building.dart';
|
||||||
|
import 'package:test_sa/models/new_models/site.dart';
|
||||||
|
|
||||||
|
class LoanFormModel {
|
||||||
|
String? docName;
|
||||||
|
String? docNumber;
|
||||||
|
String? docEmail;
|
||||||
|
String? itemDescription;
|
||||||
|
String? requestDescription;
|
||||||
|
String? model;
|
||||||
|
String? manufacturer;
|
||||||
|
Lookup? loanProvided;
|
||||||
|
String? vendorName;
|
||||||
|
String? vendorRepresentativeName;
|
||||||
|
String? vendorNumber;
|
||||||
|
String? vendorEmail;
|
||||||
|
Site? site;
|
||||||
|
Building? building;
|
||||||
|
List<LoanAttachments>? loanAttachment;
|
||||||
|
|
||||||
|
LoanFormModel({
|
||||||
|
this.docName,
|
||||||
|
this.docNumber,
|
||||||
|
this.docEmail,
|
||||||
|
this.itemDescription,
|
||||||
|
this.requestDescription,
|
||||||
|
this.model,
|
||||||
|
this.manufacturer,
|
||||||
|
this.loanProvided,
|
||||||
|
this.vendorName,
|
||||||
|
this.vendorRepresentativeName,
|
||||||
|
this.vendorNumber,
|
||||||
|
this.vendorEmail,
|
||||||
|
this.loanAttachment,
|
||||||
|
this.site,
|
||||||
|
this.building,
|
||||||
|
});
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() {
|
||||||
|
return {
|
||||||
|
"docName": docName,
|
||||||
|
"docNumber": docNumber,
|
||||||
|
"docEmail": docEmail,
|
||||||
|
"itemDescription": itemDescription,
|
||||||
|
"requestDescription": requestDescription,
|
||||||
|
"model": model,
|
||||||
|
"manufacturer": manufacturer,
|
||||||
|
"loanProvided": loanProvided?.toJson(),
|
||||||
|
"vendorName": vendorName,
|
||||||
|
"vendorRepresentativeName": vendorRepresentativeName,
|
||||||
|
"vendorNumber": vendorNumber,
|
||||||
|
"vendorEmail": vendorEmail,
|
||||||
|
'site' : site?.toJson(),
|
||||||
|
'building' : building?.toJson(),
|
||||||
|
"loanAttachment": loanAttachment != null ? loanAttachment!.map((v) => v.toJson()).toList() : [],
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
class LoanAttachments {
|
||||||
|
LoanAttachments({
|
||||||
|
this.id,
|
||||||
|
this.name,
|
||||||
|
this.originalName,
|
||||||
|
});
|
||||||
|
|
||||||
|
LoanAttachments.fromJson(dynamic json) {
|
||||||
|
id = json['id'];
|
||||||
|
name = json['name'];
|
||||||
|
originalName = json['originalName'];
|
||||||
|
}
|
||||||
|
|
||||||
|
num? id;
|
||||||
|
String? name;
|
||||||
|
String? originalName;
|
||||||
|
|
||||||
|
LoanAttachments copyWith({
|
||||||
|
num? id, // Parameter is now nullable
|
||||||
|
String? name, // Parameter is now nullable
|
||||||
|
String? originalName, // Parameter is now nullable
|
||||||
|
}) =>
|
||||||
|
LoanAttachments(
|
||||||
|
id: id ?? this.id,
|
||||||
|
name: name ?? this.name,
|
||||||
|
originalName: originalName ?? this.originalName,
|
||||||
|
);
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() {
|
||||||
|
final map = <String, dynamic>{};
|
||||||
|
map['id'] = id;
|
||||||
|
map['name'] = name;
|
||||||
|
map['originalName'] = originalName;
|
||||||
|
return map;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,301 @@
|
|||||||
|
import 'dart:convert';
|
||||||
|
import 'dart:io';
|
||||||
|
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:provider/provider.dart';
|
||||||
|
import 'package:test_sa/controllers/providers/api/device_transfer_provider.dart';
|
||||||
|
import 'package:test_sa/dashboard_latest/dashboard_provider.dart';
|
||||||
|
import 'package:test_sa/extensions/context_extension.dart';
|
||||||
|
import 'package:test_sa/extensions/int_extensions.dart';
|
||||||
|
import 'package:test_sa/extensions/string_extensions.dart';
|
||||||
|
import 'package:test_sa/extensions/text_extensions.dart';
|
||||||
|
import 'package:test_sa/extensions/widget_extensions.dart';
|
||||||
|
import 'package:test_sa/models/device/asset.dart';
|
||||||
|
import 'package:test_sa/models/enums/user_types.dart';
|
||||||
|
import 'package:test_sa/models/generic_attachment_model.dart';
|
||||||
|
import 'package:test_sa/models/lookup.dart';
|
||||||
|
import 'package:test_sa/models/new_models/mapped_sites.dart';
|
||||||
|
import 'package:test_sa/models/new_models/room_model.dart';
|
||||||
|
import 'package:test_sa/models/new_models/site.dart';
|
||||||
|
import 'package:test_sa/models/new_models/task_request/task_request_model.dart';
|
||||||
|
import 'package:test_sa/models/new_models/task_request/task_type_model.dart';
|
||||||
|
import 'package:test_sa/models/service_request/pending_service_request_model.dart';
|
||||||
|
import 'package:test_sa/modules/cm_module/utilities/service_request_utils.dart';
|
||||||
|
import 'package:test_sa/modules/cm_module/views/components/action_button/footer_action_button.dart';
|
||||||
|
import 'package:test_sa/modules/loan_module/models/loan_form_model.dart';
|
||||||
|
import 'package:test_sa/modules/loan_module/provider/loan_provider.dart';
|
||||||
|
import 'package:test_sa/new_views/app_style/app_color.dart';
|
||||||
|
import 'package:test_sa/new_views/common_widgets/app_filled_button.dart';
|
||||||
|
import 'package:test_sa/new_views/common_widgets/app_text_form_field.dart';
|
||||||
|
import 'package:test_sa/new_views/common_widgets/single_item_drop_down_menu.dart';
|
||||||
|
import 'package:test_sa/providers/gas_request_providers/site_provider.dart';
|
||||||
|
import 'package:test_sa/providers/loading_list_notifier.dart';
|
||||||
|
import 'package:test_sa/providers/task_request_provider/task_job_provider.dart';
|
||||||
|
import 'package:test_sa/providers/task_request_provider/task_request_provider.dart';
|
||||||
|
import 'package:test_sa/views/widgets/date_and_time/date_picker.dart';
|
||||||
|
import 'package:test_sa/views/widgets/equipment/asset_picker.dart';
|
||||||
|
import 'package:test_sa/views/widgets/images/multi_image_picker.dart';
|
||||||
|
|
||||||
|
import '../../../../../../new_views/common_widgets/default_app_bar.dart';
|
||||||
|
|
||||||
|
class CreateLoanRequestView extends StatefulWidget {
|
||||||
|
static const String id = "/create-loan";
|
||||||
|
|
||||||
|
const CreateLoanRequestView({Key? key}) : super(key: key);
|
||||||
|
|
||||||
|
@override
|
||||||
|
_CreateLoanRequestViewState createState() => _CreateLoanRequestViewState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _CreateLoanRequestViewState extends State<CreateLoanRequestView> with TickerProviderStateMixin {
|
||||||
|
final List<GenericAttachmentModel> attachments = [];
|
||||||
|
final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
|
||||||
|
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
|
||||||
|
Asset? device;
|
||||||
|
TaskType? selectedType;
|
||||||
|
final LoanFormModel _loanFormModel = LoanFormModel();
|
||||||
|
TextEditingController commentController = TextEditingController();
|
||||||
|
|
||||||
|
@override
|
||||||
|
void initState() {
|
||||||
|
// TODO: implement initState
|
||||||
|
super.initState();
|
||||||
|
Provider.of<TaskTypeProvider>(context, listen: false).reset();
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return Scaffold(
|
||||||
|
key: _scaffoldKey,
|
||||||
|
appBar: DefaultAppBar(title: 'Loan Request'.addTranslation),
|
||||||
|
body: Form(
|
||||||
|
key: _formKey,
|
||||||
|
child: Column(
|
||||||
|
children: [
|
||||||
|
SingleChildScrollView(
|
||||||
|
child: Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
contactInfoSection(),
|
||||||
|
16.height,
|
||||||
|
itemDetailsSection(),
|
||||||
|
16.height,
|
||||||
|
vendorDetailsSection(),
|
||||||
|
23.height,
|
||||||
|
AttachmentPicker(
|
||||||
|
label: context.translation.attachments,
|
||||||
|
attachment: attachments,
|
||||||
|
buttonColor: AppColor.black10,
|
||||||
|
onlyImages: false,
|
||||||
|
buttonIcon: 'image-plus'.toSvgAsset(color: context.isDark ? AppColor.primary10 : AppColor.neutral120),
|
||||||
|
//verify this if not required delete this ..
|
||||||
|
onChange: (attachments) {
|
||||||
|
attachments = attachments;
|
||||||
|
setState(() {});
|
||||||
|
},
|
||||||
|
),
|
||||||
|
],
|
||||||
|
).toShadowContainer(context).paddingAll(16),
|
||||||
|
).expanded,
|
||||||
|
FooterActionButton.footerContainer(
|
||||||
|
context: context,
|
||||||
|
child: AppFilledButton(
|
||||||
|
buttonColor: AppColor.primary10,
|
||||||
|
label: context.translation.submitRequest,
|
||||||
|
onPressed: _submit,
|
||||||
|
// buttonColor: AppColor.primary10,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget contactInfoSection() {
|
||||||
|
return Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
context.translation.contactInfo.heading6(context).custom(color: AppColor.black10),
|
||||||
|
8.height,
|
||||||
|
AppTextFormField(
|
||||||
|
labelText: "Name",
|
||||||
|
backgroundColor: AppColor.fieldBgColor(context),
|
||||||
|
textAlign: TextAlign.center,
|
||||||
|
hintText: "Doc Name",
|
||||||
|
labelStyle: AppTextStyles.textFieldLabelStyle,
|
||||||
|
hintStyle: AppTextStyles.textFieldLabelStyle,
|
||||||
|
textInputType: TextInputType.text,
|
||||||
|
showShadow: false,
|
||||||
|
onSaved: (value) {
|
||||||
|
_loanFormModel.docName = value;
|
||||||
|
},
|
||||||
|
style: Theme.of(context).textTheme.titleMedium,
|
||||||
|
),
|
||||||
|
8.height,
|
||||||
|
AppTextFormField(
|
||||||
|
labelText: "Number",
|
||||||
|
backgroundColor: AppColor.fieldBgColor(context),
|
||||||
|
textAlign: TextAlign.center,
|
||||||
|
hintText: "Doc Number",
|
||||||
|
labelStyle: AppTextStyles.textFieldLabelStyle,
|
||||||
|
hintStyle: AppTextStyles.textFieldLabelStyle,
|
||||||
|
textInputType: TextInputType.phone,
|
||||||
|
showShadow: false,
|
||||||
|
onSaved: (value) {
|
||||||
|
_loanFormModel.docNumber = value;
|
||||||
|
},
|
||||||
|
style: Theme.of(context).textTheme.titleMedium,
|
||||||
|
),
|
||||||
|
8.height,
|
||||||
|
AppTextFormField(
|
||||||
|
labelText: "Email",
|
||||||
|
backgroundColor: AppColor.fieldBgColor(context),
|
||||||
|
textAlign: TextAlign.center,
|
||||||
|
hintText: "Doc Email",
|
||||||
|
labelStyle: AppTextStyles.textFieldLabelStyle,
|
||||||
|
hintStyle: AppTextStyles.textFieldLabelStyle,
|
||||||
|
textInputType: TextInputType.emailAddress,
|
||||||
|
showShadow: false,
|
||||||
|
onSaved: (value) {
|
||||||
|
_loanFormModel.docEmail = value;
|
||||||
|
},
|
||||||
|
style: Theme.of(context).textTheme.titleMedium,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget itemDetailsSection() {
|
||||||
|
return Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
'Item Details'.addTranslation.heading6(context).custom(color: AppColor.black10),
|
||||||
|
8.height,
|
||||||
|
AppTextFormField(
|
||||||
|
labelText: "Name",
|
||||||
|
backgroundColor: AppColor.fieldBgColor(context),
|
||||||
|
textAlign: TextAlign.center,
|
||||||
|
hintText: "Doc Name",
|
||||||
|
labelStyle: AppTextStyles.textFieldLabelStyle,
|
||||||
|
hintStyle: AppTextStyles.textFieldLabelStyle,
|
||||||
|
textInputType: TextInputType.text,
|
||||||
|
showShadow: false,
|
||||||
|
onSaved: (value) {
|
||||||
|
_loanFormModel.docName = value;
|
||||||
|
},
|
||||||
|
style: Theme.of(context).textTheme.titleMedium,
|
||||||
|
),
|
||||||
|
8.height,
|
||||||
|
AppTextFormField(
|
||||||
|
labelText: "Number",
|
||||||
|
backgroundColor: AppColor.fieldBgColor(context),
|
||||||
|
textAlign: TextAlign.center,
|
||||||
|
hintText: "Doc Number",
|
||||||
|
labelStyle: AppTextStyles.textFieldLabelStyle,
|
||||||
|
hintStyle: AppTextStyles.textFieldLabelStyle,
|
||||||
|
textInputType: TextInputType.phone,
|
||||||
|
showShadow: false,
|
||||||
|
onSaved: (value) {
|
||||||
|
_loanFormModel.docNumber = value;
|
||||||
|
},
|
||||||
|
style: Theme.of(context).textTheme.titleMedium,
|
||||||
|
),
|
||||||
|
8.height,
|
||||||
|
AppTextFormField(
|
||||||
|
labelText: "Email",
|
||||||
|
backgroundColor: AppColor.fieldBgColor(context),
|
||||||
|
textAlign: TextAlign.center,
|
||||||
|
hintText: "Doc Email",
|
||||||
|
labelStyle: AppTextStyles.textFieldLabelStyle,
|
||||||
|
hintStyle: AppTextStyles.textFieldLabelStyle,
|
||||||
|
textInputType: TextInputType.emailAddress,
|
||||||
|
showShadow: false,
|
||||||
|
onSaved: (value) {
|
||||||
|
_loanFormModel.docEmail = value;
|
||||||
|
},
|
||||||
|
style: Theme.of(context).textTheme.titleMedium,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
Widget vendorDetailsSection() {
|
||||||
|
return Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
'Vendor Details'.addTranslation.heading6(context).custom(color: AppColor.black10),
|
||||||
|
8.height,
|
||||||
|
AppTextFormField(
|
||||||
|
labelText: "Name",
|
||||||
|
backgroundColor: AppColor.fieldBgColor(context),
|
||||||
|
textAlign: TextAlign.center,
|
||||||
|
hintText: "Doc Name",
|
||||||
|
labelStyle: AppTextStyles.textFieldLabelStyle,
|
||||||
|
hintStyle: AppTextStyles.textFieldLabelStyle,
|
||||||
|
textInputType: TextInputType.text,
|
||||||
|
showShadow: false,
|
||||||
|
onSaved: (value) {
|
||||||
|
_loanFormModel.docName = value;
|
||||||
|
},
|
||||||
|
style: Theme.of(context).textTheme.titleMedium,
|
||||||
|
),
|
||||||
|
8.height,
|
||||||
|
AppTextFormField(
|
||||||
|
labelText: "Number",
|
||||||
|
backgroundColor: AppColor.fieldBgColor(context),
|
||||||
|
textAlign: TextAlign.center,
|
||||||
|
hintText: "Doc Number",
|
||||||
|
labelStyle: AppTextStyles.textFieldLabelStyle,
|
||||||
|
hintStyle: AppTextStyles.textFieldLabelStyle,
|
||||||
|
textInputType: TextInputType.phone,
|
||||||
|
showShadow: false,
|
||||||
|
onSaved: (value) {
|
||||||
|
_loanFormModel.docNumber = value;
|
||||||
|
},
|
||||||
|
style: Theme.of(context).textTheme.titleMedium,
|
||||||
|
),
|
||||||
|
8.height,
|
||||||
|
AppTextFormField(
|
||||||
|
labelText: "Email",
|
||||||
|
backgroundColor: AppColor.fieldBgColor(context),
|
||||||
|
textAlign: TextAlign.center,
|
||||||
|
hintText: "Doc Email",
|
||||||
|
labelStyle: AppTextStyles.textFieldLabelStyle,
|
||||||
|
hintStyle: AppTextStyles.textFieldLabelStyle,
|
||||||
|
textInputType: TextInputType.emailAddress,
|
||||||
|
showShadow: false,
|
||||||
|
onSaved: (value) {
|
||||||
|
_loanFormModel.docEmail = value;
|
||||||
|
},
|
||||||
|
style: Theme.of(context).textTheme.titleMedium,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget scanAssetButton() {
|
||||||
|
return AssetPicker(
|
||||||
|
device: device,
|
||||||
|
showLoading: false,
|
||||||
|
borderColor: AppColor.black20,
|
||||||
|
onPick: (asset) async {
|
||||||
|
device = asset;
|
||||||
|
setState(() {});
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> _submit() async {
|
||||||
|
if (_formKey.currentState!.validate()) {
|
||||||
|
_formKey.currentState!.save();
|
||||||
|
|
||||||
|
_loanFormModel?.loanAttachment = [];
|
||||||
|
for (var item in attachments) {
|
||||||
|
String fileName = ServiceRequestUtils.isLocalUrl(item.name ?? '') ? ("${item.name ?? ''.split("/").last}|${base64Encode(File(item.name ?? '').readAsBytesSync())}") : item.name ?? '';
|
||||||
|
_loanFormModel?.loanAttachment?.add(LoanAttachments(id: item.id, name: fileName));
|
||||||
|
}
|
||||||
|
LoanProvider loanProvider = Provider.of<LoanProvider>(context, listen: false);
|
||||||
|
// await loanProvider.addLoanRequest(context: context, task: _loanFormModel!);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,8 @@
|
|||||||
|
import 'package:flutter/cupertino.dart';
|
||||||
|
|
||||||
|
class LoanProvider extends ChangeNotifier {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue