|
|
|
@ -4,22 +4,22 @@ import 'package:provider/provider.dart';
|
|
|
|
import 'package:test_sa/controllers/validator/validator.dart';
|
|
|
|
import 'package:test_sa/controllers/validator/validator.dart';
|
|
|
|
import 'package:test_sa/extensions/int_extensions.dart';
|
|
|
|
import 'package:test_sa/extensions/int_extensions.dart';
|
|
|
|
import 'package:test_sa/extensions/text_extensions.dart';
|
|
|
|
import 'package:test_sa/extensions/text_extensions.dart';
|
|
|
|
import 'package:test_sa/models/lookup.dart';
|
|
|
|
|
|
|
|
import 'package:test_sa/models/new_models/site.dart';
|
|
|
|
|
|
|
|
import 'package:test_sa/modules/signup/models/company_model.dart';
|
|
|
|
import 'package:test_sa/modules/signup/models/company_model.dart';
|
|
|
|
import 'package:test_sa/modules/signup/models/group_model.dart';
|
|
|
|
import 'package:test_sa/modules/signup/models/group_model.dart';
|
|
|
|
import 'package:test_sa/modules/signup/models/signup_request_model.dart';
|
|
|
|
import 'package:test_sa/modules/signup/models/signup_request_model.dart';
|
|
|
|
|
|
|
|
import 'package:test_sa/modules/signup/models/site_model.dart';
|
|
|
|
|
|
|
|
import 'package:test_sa/modules/signup/models/department_model.dart';
|
|
|
|
import 'package:test_sa/modules/signup/providers/company_provider.dart';
|
|
|
|
import 'package:test_sa/modules/signup/providers/company_provider.dart';
|
|
|
|
import 'package:test_sa/modules/signup/providers/group_provider.dart';
|
|
|
|
import 'package:test_sa/modules/signup/providers/group_provider.dart';
|
|
|
|
import 'package:test_sa/modules/signup/providers/signup_provider.dart';
|
|
|
|
import 'package:test_sa/modules/signup/providers/signup_provider.dart';
|
|
|
|
|
|
|
|
import 'package:test_sa/modules/signup/providers/signup_site_provider.dart';
|
|
|
|
|
|
|
|
import 'package:test_sa/modules/signup/providers/signup_department_provider.dart';
|
|
|
|
import 'package:test_sa/new_views/app_style/app_color.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_filled_button.dart';
|
|
|
|
import 'package:test_sa/new_views/common_widgets/app_lazy_loading.dart';
|
|
|
|
import 'package:test_sa/new_views/common_widgets/app_lazy_loading.dart';
|
|
|
|
import 'package:test_sa/new_views/common_widgets/app_text_form_field.dart';
|
|
|
|
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/default_app_bar.dart';
|
|
|
|
import 'package:test_sa/new_views/common_widgets/single_item_drop_down_menu.dart';
|
|
|
|
import 'package:test_sa/new_views/common_widgets/single_item_drop_down_menu.dart';
|
|
|
|
import 'package:test_sa/providers/department_provider.dart';
|
|
|
|
|
|
|
|
import 'package:test_sa/providers/gas_request_providers/site_provider.dart';
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class SignUpScreen extends StatefulWidget {
|
|
|
|
class SignUpScreen extends StatefulWidget {
|
|
|
|
static const String routeName = "/signup_screen";
|
|
|
|
static const String routeName = "/signup_screen";
|
|
|
|
@ -33,10 +33,11 @@ class SignUpScreen extends StatefulWidget {
|
|
|
|
class _SignUpScreenState extends State<SignUpScreen> {
|
|
|
|
class _SignUpScreenState extends State<SignUpScreen> {
|
|
|
|
final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
|
|
|
|
final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
late AssetGroupProvider _assetGroupProvider;
|
|
|
|
late CompanyProvider _companyProvider;
|
|
|
|
late CompanyProvider _companyProvider;
|
|
|
|
late GroupProvider _groupProvider;
|
|
|
|
|
|
|
|
late SignUpProvider _signUpProvider;
|
|
|
|
late SignUpProvider _signUpProvider;
|
|
|
|
late DepartmentProvider _departmentProvider;
|
|
|
|
late SignupSiteProvider _siteProvider;
|
|
|
|
|
|
|
|
late SignupDepartmentProvider _departmentProvider;
|
|
|
|
|
|
|
|
|
|
|
|
// Form field controllers
|
|
|
|
// Form field controllers
|
|
|
|
final TextEditingController _employeeIdController = TextEditingController();
|
|
|
|
final TextEditingController _employeeIdController = TextEditingController();
|
|
|
|
@ -47,11 +48,11 @@ class _SignUpScreenState extends State<SignUpScreen> {
|
|
|
|
final TextEditingController _roleController = TextEditingController();
|
|
|
|
final TextEditingController _roleController = TextEditingController();
|
|
|
|
|
|
|
|
|
|
|
|
// Selected values
|
|
|
|
// Selected values
|
|
|
|
|
|
|
|
AssetGroup? _selectedAssetGroup;
|
|
|
|
Company? _selectedCompany;
|
|
|
|
Company? _selectedCompany;
|
|
|
|
Group? _selectedGroup;
|
|
|
|
SiteModel? _selectedSite;
|
|
|
|
Site? _selectedSite;
|
|
|
|
SiteModel? _selectedSite;
|
|
|
|
Lookup? _selectedDepartment;
|
|
|
|
DepartmentModel? _selectedDepartment;
|
|
|
|
|
|
|
|
|
|
|
|
bool _isHMGGroup = false;
|
|
|
|
bool _isHMGGroup = false;
|
|
|
|
bool _employeeFetched = false;
|
|
|
|
bool _employeeFetched = false;
|
|
|
|
bool _isSubmitting = false;
|
|
|
|
bool _isSubmitting = false;
|
|
|
|
@ -60,8 +61,7 @@ class _SignUpScreenState extends State<SignUpScreen> {
|
|
|
|
void initState() {
|
|
|
|
void initState() {
|
|
|
|
super.initState();
|
|
|
|
super.initState();
|
|
|
|
WidgetsBinding.instance.addPostFrameCallback((_) {
|
|
|
|
WidgetsBinding.instance.addPostFrameCallback((_) {
|
|
|
|
_companyProvider.getData();
|
|
|
|
_assetGroupProvider.getData();
|
|
|
|
_groupProvider.getData();
|
|
|
|
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@ -78,10 +78,11 @@ class _SignUpScreenState extends State<SignUpScreen> {
|
|
|
|
|
|
|
|
|
|
|
|
@override
|
|
|
|
@override
|
|
|
|
Widget build(BuildContext context) {
|
|
|
|
Widget build(BuildContext context) {
|
|
|
|
|
|
|
|
_assetGroupProvider = Provider.of<AssetGroupProvider>(context);
|
|
|
|
_companyProvider = Provider.of<CompanyProvider>(context);
|
|
|
|
_companyProvider = Provider.of<CompanyProvider>(context);
|
|
|
|
_groupProvider = Provider.of<GroupProvider>(context);
|
|
|
|
|
|
|
|
_signUpProvider = Provider.of<SignUpProvider>(context);
|
|
|
|
_signUpProvider = Provider.of<SignUpProvider>(context);
|
|
|
|
_departmentProvider = Provider.of<DepartmentProvider>(context);
|
|
|
|
_siteProvider = Provider.of<SignupSiteProvider>(context);
|
|
|
|
|
|
|
|
_departmentProvider = Provider.of<SignupDepartmentProvider>(context);
|
|
|
|
|
|
|
|
|
|
|
|
return Scaffold(
|
|
|
|
return Scaffold(
|
|
|
|
backgroundColor: AppColor.scaffoldBackground(context),
|
|
|
|
backgroundColor: AppColor.scaffoldBackground(context),
|
|
|
|
@ -93,13 +94,15 @@ class _SignUpScreenState extends State<SignUpScreen> {
|
|
|
|
child: Column(
|
|
|
|
child: Column(
|
|
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
|
|
children: [
|
|
|
|
children: [
|
|
|
|
_buildCompanyDropdown(),
|
|
|
|
_buildAssetGroupDropdown(),
|
|
|
|
16.height,
|
|
|
|
|
|
|
|
_buildGroupDropdown(),
|
|
|
|
|
|
|
|
16.height,
|
|
|
|
16.height,
|
|
|
|
if (_selectedGroup != null) ..._buildDynamicFields(),
|
|
|
|
if (_selectedAssetGroup != null) ...[
|
|
|
|
|
|
|
|
_buildCompanyDropdown(),
|
|
|
|
|
|
|
|
16.height,
|
|
|
|
|
|
|
|
],
|
|
|
|
|
|
|
|
if (_selectedCompany != null) ..._buildDynamicFields(),
|
|
|
|
24.height,
|
|
|
|
24.height,
|
|
|
|
_buildSubmitButton(),
|
|
|
|
if (_selectedCompany != null) _buildSubmitButton(),
|
|
|
|
],
|
|
|
|
],
|
|
|
|
),
|
|
|
|
),
|
|
|
|
),
|
|
|
|
),
|
|
|
|
@ -107,42 +110,55 @@ class _SignUpScreenState extends State<SignUpScreen> {
|
|
|
|
);
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
Widget _buildCompanyDropdown() {
|
|
|
|
Widget _buildAssetGroupDropdown() {
|
|
|
|
return SingleItemDropDownMenu<Company, CompanyProvider>(
|
|
|
|
return SingleItemDropDownMenu<AssetGroup, AssetGroupProvider>(
|
|
|
|
context: context,
|
|
|
|
context: context,
|
|
|
|
title: "Company",
|
|
|
|
title: "Asset Group",
|
|
|
|
initialValue: _selectedCompany,
|
|
|
|
initialValue: _selectedAssetGroup,
|
|
|
|
showAsFullScreenDialog: false,
|
|
|
|
showAsFullScreenDialog: false,
|
|
|
|
showAsBottomSheet: true,
|
|
|
|
showAsBottomSheet: true,
|
|
|
|
onSelect: (value) {
|
|
|
|
onSelect: (value) {
|
|
|
|
setState(() {
|
|
|
|
setState(() {
|
|
|
|
_selectedCompany = value;
|
|
|
|
_selectedAssetGroup = value;
|
|
|
|
|
|
|
|
_selectedCompany = null;
|
|
|
|
|
|
|
|
_clearForm();
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
if (value?.id != null) {
|
|
|
|
|
|
|
|
_companyProvider.getData(id: value!.id);
|
|
|
|
|
|
|
|
// Clear sites and departments when asset group changes
|
|
|
|
|
|
|
|
_signUpProvider.reset();
|
|
|
|
|
|
|
|
// Clear sites and departments when asset group changes
|
|
|
|
|
|
|
|
_signUpProvider.reset();
|
|
|
|
|
|
|
|
}
|
|
|
|
},
|
|
|
|
},
|
|
|
|
validator: (value) {
|
|
|
|
validator: (value) {
|
|
|
|
if (value == null) return "Company is required";
|
|
|
|
if (value == null) return "Asset Group is required";
|
|
|
|
return null;
|
|
|
|
return null;
|
|
|
|
},
|
|
|
|
},
|
|
|
|
);
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
Widget _buildGroupDropdown() {
|
|
|
|
Widget _buildCompanyDropdown() {
|
|
|
|
return SingleItemDropDownMenu<Group, GroupProvider>(
|
|
|
|
return SingleItemDropDownMenu<Company, CompanyProvider>(
|
|
|
|
context: context,
|
|
|
|
context: context,
|
|
|
|
title: "Group",
|
|
|
|
title: "Company",
|
|
|
|
initialValue: _selectedGroup,
|
|
|
|
initialValue: _selectedCompany,
|
|
|
|
showAsFullScreenDialog: false,
|
|
|
|
showAsFullScreenDialog: false,
|
|
|
|
showAsBottomSheet: true,
|
|
|
|
showAsBottomSheet: true,
|
|
|
|
onSelect: (value) {
|
|
|
|
onSelect: (value) {
|
|
|
|
setState(() {
|
|
|
|
setState(() {
|
|
|
|
_selectedGroup = value;
|
|
|
|
_selectedCompany = value;
|
|
|
|
_isHMGGroup = value?.code == 'HMG';
|
|
|
|
_isHMGGroup = value?.companyName?.toUpperCase() == 'HMG';
|
|
|
|
_employeeFetched = false;
|
|
|
|
_employeeFetched = false;
|
|
|
|
_clearForm();
|
|
|
|
_clearForm();
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
// Clear sites and departments when company changes
|
|
|
|
|
|
|
|
_signUpProvider.reset();
|
|
|
|
|
|
|
|
// Clear sites and departments when company changes
|
|
|
|
|
|
|
|
_signUpProvider.reset();
|
|
|
|
},
|
|
|
|
},
|
|
|
|
validator: (value) {
|
|
|
|
validator: (value) {
|
|
|
|
if (value == null) return "Group is required";
|
|
|
|
if (value == null) return "Company is required";
|
|
|
|
return null;
|
|
|
|
return null;
|
|
|
|
},
|
|
|
|
},
|
|
|
|
);
|
|
|
|
);
|
|
|
|
@ -191,21 +207,45 @@ class _SignUpScreenState extends State<SignUpScreen> {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
Widget _buildEmployeeIdField() {
|
|
|
|
Widget _buildEmployeeIdField() {
|
|
|
|
return AppTextFormField(
|
|
|
|
return Row(
|
|
|
|
controller: _employeeIdController,
|
|
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
|
|
labelText: "Employee ID",
|
|
|
|
children: [
|
|
|
|
hintText: "Enter Employee ID",
|
|
|
|
Expanded(
|
|
|
|
textInputType: TextInputType.number,
|
|
|
|
child: AppTextFormField(
|
|
|
|
validator: (value) {
|
|
|
|
controller: _employeeIdController,
|
|
|
|
if (value == null || value.isEmpty) return "Employee ID is required";
|
|
|
|
labelText: "Employee ID",
|
|
|
|
if (!Validator.isNumeric(value)) return "Employee ID must be numeric";
|
|
|
|
hintText: "Enter Employee ID",
|
|
|
|
return null;
|
|
|
|
textInputType: TextInputType.number,
|
|
|
|
},
|
|
|
|
validator: (value) {
|
|
|
|
onChange: (value) {
|
|
|
|
if (value == null || value.isEmpty) return "Employee ID is required";
|
|
|
|
if (value.isNotEmpty && Validator.isNumeric(value)) {
|
|
|
|
if (!Validator.isNumeric(value)) return "Employee ID must be numeric";
|
|
|
|
_fetchEmployeeDetails(value);
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
},
|
|
|
|
},
|
|
|
|
),
|
|
|
|
|
|
|
|
),
|
|
|
|
|
|
|
|
12.width,
|
|
|
|
|
|
|
|
Container(
|
|
|
|
|
|
|
|
margin: EdgeInsets.only(top: 8.toScreenHeight),
|
|
|
|
|
|
|
|
child: AppFilledButton(
|
|
|
|
|
|
|
|
label: "Search",
|
|
|
|
|
|
|
|
height: 48,
|
|
|
|
|
|
|
|
width: 100,
|
|
|
|
|
|
|
|
loading: _signUpProvider.loading,
|
|
|
|
|
|
|
|
disableButton: _signUpProvider.loading,
|
|
|
|
|
|
|
|
onPressed: () {
|
|
|
|
|
|
|
|
if (_employeeIdController.text.isEmpty) {
|
|
|
|
|
|
|
|
Fluttertoast.showToast(msg: "Please enter Employee ID");
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!Validator.isNumeric(_employeeIdController.text)) {
|
|
|
|
|
|
|
|
Fluttertoast.showToast(msg: "Employee ID must be numeric");
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
_fetchEmployeeDetails(_employeeIdController.text);
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
),
|
|
|
|
|
|
|
|
),
|
|
|
|
|
|
|
|
],
|
|
|
|
);
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@ -283,7 +323,7 @@ class _SignUpScreenState extends State<SignUpScreen> {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
Widget _buildSiteDropdown() {
|
|
|
|
Widget _buildSiteDropdown() {
|
|
|
|
return SingleItemDropDownMenu<Site, SiteProvider>(
|
|
|
|
return SingleItemDropDownMenu<SiteModel, SignupSiteProvider>(
|
|
|
|
context: context,
|
|
|
|
context: context,
|
|
|
|
title: "Site",
|
|
|
|
title: "Site",
|
|
|
|
initialValue: _selectedSite,
|
|
|
|
initialValue: _selectedSite,
|
|
|
|
@ -294,8 +334,9 @@ class _SignUpScreenState extends State<SignUpScreen> {
|
|
|
|
_selectedSite = value;
|
|
|
|
_selectedSite = value;
|
|
|
|
_selectedDepartment = null;
|
|
|
|
_selectedDepartment = null;
|
|
|
|
});
|
|
|
|
});
|
|
|
|
if (value != null) {
|
|
|
|
// Fetch departments when site is selected
|
|
|
|
_departmentProvider.getData(id: value.id?.toInt());
|
|
|
|
if (_selectedAssetGroup?.id != null) {
|
|
|
|
|
|
|
|
_departmentProvider.getData(id: _selectedAssetGroup!.id);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
},
|
|
|
|
},
|
|
|
|
validator: (value) {
|
|
|
|
validator: (value) {
|
|
|
|
@ -306,7 +347,7 @@ class _SignUpScreenState extends State<SignUpScreen> {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
Widget _buildDepartmentDropdown() {
|
|
|
|
Widget _buildDepartmentDropdown() {
|
|
|
|
return SingleItemDropDownMenu<Lookup, DepartmentProvider>(
|
|
|
|
return SingleItemDropDownMenu<DepartmentModel, SignupDepartmentProvider>(
|
|
|
|
context: context,
|
|
|
|
context: context,
|
|
|
|
title: "Department",
|
|
|
|
title: "Department",
|
|
|
|
initialValue: _selectedDepartment,
|
|
|
|
initialValue: _selectedDepartment,
|
|
|
|
@ -350,20 +391,11 @@ class _SignUpScreenState extends State<SignUpScreen> {
|
|
|
|
final employee = await _signUpProvider.getEmployeeFromERP(employeeId);
|
|
|
|
final employee = await _signUpProvider.getEmployeeFromERP(employeeId);
|
|
|
|
|
|
|
|
|
|
|
|
if (employee != null) {
|
|
|
|
if (employee != null) {
|
|
|
|
if (employee.existsInAtoms == true) {
|
|
|
|
|
|
|
|
if (mounted) {
|
|
|
|
|
|
|
|
_showAlreadyExistsDialog();
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
_clearForm();
|
|
|
|
|
|
|
|
_employeeIdController.clear();
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
setState(() {
|
|
|
|
setState(() {
|
|
|
|
_employeeFetched = true;
|
|
|
|
_employeeFetched = true;
|
|
|
|
_fullNameController.text = employee.fullName ?? '';
|
|
|
|
_fullNameController.text = employee.employeeName ?? '';
|
|
|
|
_emailController.text = employee.email ?? '';
|
|
|
|
_emailController.text = employee.employeeEmailAddress ?? '';
|
|
|
|
_mobileController.text = employee.mobileNumber ?? '';
|
|
|
|
_mobileController.text = employee.employeeMobileNumber ?? '';
|
|
|
|
});
|
|
|
|
});
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
setState(() {
|
|
|
|
setState(() {
|
|
|
|
@ -410,6 +442,16 @@ class _SignUpScreenState extends State<SignUpScreen> {
|
|
|
|
return;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (_selectedSite == null) {
|
|
|
|
|
|
|
|
Fluttertoast.showToast(msg: "Please select a site");
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (_selectedDepartment == null) {
|
|
|
|
|
|
|
|
Fluttertoast.showToast(msg: "Please select a department");
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
setState(() {
|
|
|
|
setState(() {
|
|
|
|
_isSubmitting = true;
|
|
|
|
_isSubmitting = true;
|
|
|
|
});
|
|
|
|
});
|
|
|
|
@ -423,14 +465,14 @@ class _SignUpScreenState extends State<SignUpScreen> {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
final request = SignUpRequestModel(
|
|
|
|
final request = SignUpRequestModel(
|
|
|
|
companyCode: _selectedCompany?.code,
|
|
|
|
companyCode: _selectedCompany?.id?.toString(),
|
|
|
|
groupCode: _selectedGroup?.code,
|
|
|
|
groupCode: _selectedAssetGroup?.id?.toString(),
|
|
|
|
employeeId: _isHMGGroup ? _employeeIdController.text : null,
|
|
|
|
employeeId: _isHMGGroup ? _employeeIdController.text : null,
|
|
|
|
fullName: _fullNameController.text,
|
|
|
|
fullName: _fullNameController.text,
|
|
|
|
email: _emailController.text,
|
|
|
|
email: _emailController.text,
|
|
|
|
mobileNumber: _mobileController.text,
|
|
|
|
mobileNumber: _mobileController.text,
|
|
|
|
extensionNumber: _extensionController.text.isEmpty ? null : _extensionController.text,
|
|
|
|
extensionNumber: _extensionController.text.isEmpty ? null : _extensionController.text,
|
|
|
|
siteId: _selectedSite?.id?.toInt(),
|
|
|
|
siteId: _selectedSite?.id,
|
|
|
|
departmentId: _selectedDepartment?.id,
|
|
|
|
departmentId: _selectedDepartment?.id,
|
|
|
|
role: _roleController.text,
|
|
|
|
role: _roleController.text,
|
|
|
|
);
|
|
|
|
);
|
|
|
|
|