|
|
|
|
@ -1,3 +1,7 @@
|
|
|
|
|
import 'dart:convert';
|
|
|
|
|
import 'dart:developer';
|
|
|
|
|
import 'dart:io';
|
|
|
|
|
|
|
|
|
|
import 'package:flutter/material.dart';
|
|
|
|
|
import 'package:provider/provider.dart';
|
|
|
|
|
import 'package:test_sa/extensions/context_extension.dart';
|
|
|
|
|
@ -7,13 +11,14 @@ import 'package:test_sa/extensions/text_extensions.dart';
|
|
|
|
|
import 'package:test_sa/extensions/widget_extensions.dart';
|
|
|
|
|
import 'package:test_sa/helper/utils.dart';
|
|
|
|
|
import 'package:test_sa/models/device/asset.dart';
|
|
|
|
|
import 'package:test_sa/models/generic_attachment_model.dart';
|
|
|
|
|
import 'package:test_sa/models/lookup.dart';
|
|
|
|
|
import 'package:test_sa/models/new_models/traf_customer.dart';
|
|
|
|
|
import 'package:test_sa/models/new_models/traf_department.dart';
|
|
|
|
|
import 'package:test_sa/models/new_models/users_based_on_search_model.dart';
|
|
|
|
|
import 'package:test_sa/modules/cm_module/cm_request_utils.dart';
|
|
|
|
|
import 'package:test_sa/modules/cm_module/views/components/action_button/footer_action_button.dart';
|
|
|
|
|
import 'package:test_sa/modules/traf_module/asset_auto_complete_field.dart';
|
|
|
|
|
import 'package:test_sa/modules/traf_module/traf_request_detail_page.dart';
|
|
|
|
|
import 'package:test_sa/modules/traf_module/update_traf_request_page.dart';
|
|
|
|
|
import 'package:test_sa/modules/traf_module/users_auto_complete_field.dart';
|
|
|
|
|
import 'package:test_sa/new_views/app_style/app_color.dart';
|
|
|
|
|
import 'package:test_sa/new_views/common_widgets/app_filled_button.dart';
|
|
|
|
|
@ -21,11 +26,12 @@ import 'package:test_sa/new_views/common_widgets/app_text_form_field.dart';
|
|
|
|
|
import 'package:test_sa/new_views/common_widgets/default_app_bar.dart';
|
|
|
|
|
import 'package:test_sa/new_views/common_widgets/multiple_item_drop_down_menu.dart';
|
|
|
|
|
import 'package:test_sa/new_views/common_widgets/single_item_drop_down_menu.dart';
|
|
|
|
|
import 'package:test_sa/providers/loading_list_notifier.dart';
|
|
|
|
|
import 'package:test_sa/providers/lookups/customer_lookup_provider.dart';
|
|
|
|
|
import 'package:test_sa/providers/lookups/department_lookup_provider.dart';
|
|
|
|
|
import 'package:test_sa/providers/lookups/request_type_lookup_provider.dart';
|
|
|
|
|
import 'package:test_sa/providers/lookups/yes_no_lookup_provider.dart';
|
|
|
|
|
import 'package:test_sa/views/widgets/equipment/asset_picker.dart';
|
|
|
|
|
import 'package:test_sa/views/widgets/images/multi_image_picker.dart';
|
|
|
|
|
|
|
|
|
|
import 'traf_request_model.dart';
|
|
|
|
|
import 'traf_request_provider.dart';
|
|
|
|
|
@ -52,27 +58,47 @@ class _CreateTRAFRequestPageState extends State<CreateTRAFRequestPage> {
|
|
|
|
|
Lookup? otherServicesEffects;
|
|
|
|
|
Lookup? useInCombination;
|
|
|
|
|
|
|
|
|
|
TrafCustomer? selectedSite;
|
|
|
|
|
TrafDepartment? selectedDepartment;
|
|
|
|
|
|
|
|
|
|
TrafRequestDataModel? trafRequest;
|
|
|
|
|
|
|
|
|
|
List<Lookup> abc = [];
|
|
|
|
|
|
|
|
|
|
List<TrafDepartment> departments = [];
|
|
|
|
|
List<UsersBasedOnSearchModel> userBasedOnSearch = [];
|
|
|
|
|
List<GenericAttachmentModel> attachments = [];
|
|
|
|
|
|
|
|
|
|
FocusNode otherServicesEffectsNode = FocusNode();
|
|
|
|
|
FocusNode useInCombinationNode = FocusNode();
|
|
|
|
|
FocusNode departmentNode = FocusNode();
|
|
|
|
|
FocusNode siteDepartmentNode = FocusNode();
|
|
|
|
|
|
|
|
|
|
@override
|
|
|
|
|
void initState() {
|
|
|
|
|
super.initState();
|
|
|
|
|
trafRequest = TrafRequestDataModel(id: 0, attachments: [], departments: [], qty: 1);
|
|
|
|
|
resetProviders();
|
|
|
|
|
WidgetsBinding.instance.addPostFrameCallback((_) {
|
|
|
|
|
final requestTypeProvider = Provider.of<RequestTypeLookupProvider>(context, listen: false);
|
|
|
|
|
final yesNoProvider = Provider.of<YesNoLookupProvider>(context, listen: false);
|
|
|
|
|
final customerProvider = Provider.of<CustomerLookupProvider>(context, listen: false);
|
|
|
|
|
if (requestTypeProvider.items.isEmpty) {
|
|
|
|
|
requestTypeProvider.reset();
|
|
|
|
|
}
|
|
|
|
|
if (yesNoProvider.items.isEmpty) {
|
|
|
|
|
yesNoProvider.reset();
|
|
|
|
|
}
|
|
|
|
|
final userId = context.userProvider.user?.userID;
|
|
|
|
|
if (customerProvider.items.isEmpty && userId != null && userId.isNotEmpty) {
|
|
|
|
|
customerProvider.getDataByUserId(userId);
|
|
|
|
|
}
|
|
|
|
|
log('user id is ${userId}');
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void resetProviders() {
|
|
|
|
|
Provider.of<RequestTypeLookupProvider>(context, listen: false).reset();
|
|
|
|
|
// Provider.of<YesNoLookupProvider>(context, listen: false).reset();
|
|
|
|
|
Provider.of<YesNoLookupProvider>(context, listen: false).reset();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@override
|
|
|
|
|
@ -83,7 +109,7 @@ class _CreateTRAFRequestPageState extends State<CreateTRAFRequestPage> {
|
|
|
|
|
@override
|
|
|
|
|
Widget build(BuildContext context) {
|
|
|
|
|
return Scaffold(
|
|
|
|
|
appBar: const DefaultAppBar(title: "TRAF Request"),
|
|
|
|
|
appBar: const DefaultAppBar(title: "Assessment of Need & Technology"),
|
|
|
|
|
body: Form(
|
|
|
|
|
key: _formKey,
|
|
|
|
|
child: Column(
|
|
|
|
|
@ -180,6 +206,48 @@ class _CreateTRAFRequestPageState extends State<CreateTRAFRequestPage> {
|
|
|
|
|
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50, fontWeight: FontWeight.w600),
|
|
|
|
|
),
|
|
|
|
|
12.height,
|
|
|
|
|
SingleItemDropDownMenu<TrafCustomer, CustomerLookupProvider>(
|
|
|
|
|
context: context,
|
|
|
|
|
showAsBottomSheet: true,
|
|
|
|
|
backgroundColor: AppColor.neutral100,
|
|
|
|
|
showShadow: false,
|
|
|
|
|
title: "Site",
|
|
|
|
|
requestById: int.tryParse(context.userProvider.user?.userID ?? ''),
|
|
|
|
|
initialValue: selectedSite,
|
|
|
|
|
onSelect: (value) {
|
|
|
|
|
selectedSite = value;
|
|
|
|
|
trafRequest?.siteId = value?.customerId;
|
|
|
|
|
// Reset department when site changes
|
|
|
|
|
selectedDepartment = null;
|
|
|
|
|
trafRequest?.departmentId = null;
|
|
|
|
|
|
|
|
|
|
// Reset and fetch department data based on selected site
|
|
|
|
|
Provider.of<DepartmentLookupProvider>(context, listen: false).reset();
|
|
|
|
|
if (selectedSite != null && selectedSite!.customerId != null) {
|
|
|
|
|
// Fetch departments for the selected site
|
|
|
|
|
Provider.of<DepartmentLookupProvider>(context, listen: false).getData(id: selectedSite!.customerId);
|
|
|
|
|
siteDepartmentNode.requestFocus();
|
|
|
|
|
}
|
|
|
|
|
setState(() {});
|
|
|
|
|
},
|
|
|
|
|
),
|
|
|
|
|
12.height,
|
|
|
|
|
SingleItemDropDownMenu<TrafDepartment, DepartmentLookupProvider>(
|
|
|
|
|
context: context,
|
|
|
|
|
showAsBottomSheet: true,
|
|
|
|
|
backgroundColor: AppColor.neutral100,
|
|
|
|
|
showShadow: false,
|
|
|
|
|
title: "Department",
|
|
|
|
|
requestById: null,
|
|
|
|
|
// initialValue: selectedDepartment,
|
|
|
|
|
enabled: selectedSite != null,
|
|
|
|
|
onSelect: (value) {
|
|
|
|
|
selectedDepartment = value;
|
|
|
|
|
trafRequest?.departmentId = value?.id?.toString();
|
|
|
|
|
setState(() {});
|
|
|
|
|
},
|
|
|
|
|
),
|
|
|
|
|
12.height,
|
|
|
|
|
AppTextFormField(
|
|
|
|
|
initialValue: "",
|
|
|
|
|
labelText: "How would the requested technology solve the current situation and/or serve the purpose?",
|
|
|
|
|
@ -443,7 +511,18 @@ class _CreateTRAFRequestPageState extends State<CreateTRAFRequestPage> {
|
|
|
|
|
trafRequest?.usedWithCombination = value;
|
|
|
|
|
},
|
|
|
|
|
),
|
|
|
|
|
]
|
|
|
|
|
],
|
|
|
|
|
12.height,
|
|
|
|
|
AttachmentPicker(
|
|
|
|
|
label: context.translation.attachFiles,
|
|
|
|
|
attachment: attachments,
|
|
|
|
|
buttonColor: AppColor.black10,
|
|
|
|
|
onlyImages: false,
|
|
|
|
|
buttonIcon: 'image-plus'.toSvgAsset(color: AppColor.neutral120),
|
|
|
|
|
onChange: (attachment) {
|
|
|
|
|
attachments = attachment;
|
|
|
|
|
},
|
|
|
|
|
),
|
|
|
|
|
],
|
|
|
|
|
).toShadowContainer(context, padding: 12, borderRadius: 20),
|
|
|
|
|
16.height,
|
|
|
|
|
@ -491,10 +570,25 @@ class _CreateTRAFRequestPageState extends State<CreateTRAFRequestPage> {
|
|
|
|
|
"Pick asset".showToast;
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Validate site and department selection
|
|
|
|
|
if (selectedSite == null) {
|
|
|
|
|
"Please select a site".showToast;
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (selectedDepartment == null) {
|
|
|
|
|
"Please select a department".showToast;
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!_formKey.currentState!.validate()) return;
|
|
|
|
|
|
|
|
|
|
trafRequest?.employeeId = context.userProvider.user?.userID;
|
|
|
|
|
trafRequest?.siteId = context.userProvider.user?.clientId;
|
|
|
|
|
// Set site and department IDs from selected dropdowns
|
|
|
|
|
trafRequest?.siteId = selectedSite?.customerId;
|
|
|
|
|
trafRequest?.departmentId = selectedDepartment?.id;
|
|
|
|
|
|
|
|
|
|
trafRequest?.trafContacts = [];
|
|
|
|
|
trafRequest?.trafContacts = userBasedOnSearch.map((item) => TrafContacts(id: 0, trafId: 0, name: item.userName, userId: item.userId)).toList();
|
|
|
|
|
|
|
|
|
|
@ -521,8 +615,17 @@ class _CreateTRAFRequestPageState extends State<CreateTRAFRequestPage> {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Process attachments similar to CreateCMRequest
|
|
|
|
|
trafRequest?.attachments = [];
|
|
|
|
|
for (var item in attachments) {
|
|
|
|
|
String fileName = CMRequestUtils.isLocalUrl(item.name ?? '') ? ("${item.name ?? ''.split("/").last}|${base64Encode(File(item.name ?? '').readAsBytesSync())}") : item.name ?? '';
|
|
|
|
|
trafRequest?.attachments!.add(
|
|
|
|
|
Attachments(id: 0, trafId: 0, attachmentName: fileName),
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Utils.showLoading(context);
|
|
|
|
|
bool isSuccess = await Provider.of<TrafRequestProvider>(context, listen: false).addTraf(trafRequest!.toJson());
|
|
|
|
|
bool isSuccess = await Provider.of<TrafRequestProvider>(context, listen: false).addTraf(trafRequest!.toJsonNew());
|
|
|
|
|
Utils.hideLoading(context);
|
|
|
|
|
if (isSuccess) {
|
|
|
|
|
Navigator.pop(context);
|
|
|
|
|
|