main_design2.0
zaid_daoud 12 months ago
parent 8541fce08f
commit 932841cbef

@ -1,16 +1,20 @@
import 'dart:convert';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:http/http.dart';
import 'package:logger/logger.dart';
import 'package:test_sa/controllers/api_routes/api_manager.dart';
import 'package:test_sa/controllers/api_routes/urls.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/models/pantry/pentry.dart';
import 'package:test_sa/models/user.dart';
import 'package:test_sa/models/visits/visit.dart';
import 'package:test_sa/models/visits/visits_group.dart';
import 'package:test_sa/models/visits/visits_search.dart';
import '../../../new_views/common_widgets/app_lazy_loading.dart';
class RegularVisitsProvider extends ChangeNotifier {
// number of items call in each request
final pageItemNumber = 12;
@ -144,13 +148,14 @@ class RegularVisitsProvider extends ChangeNotifier {
return pantry;
}
Future<int> updatePentry({
@required String host,
Future<int> updatePentry(
BuildContext context, {
@required User user,
@required Pentry pentry,
@required Visit visit,
}) async {
try {
showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading());
Response response;
Map<String, dynamic> body = pentry.toMap(visit.id);
body["id"] = visit.id;
@ -169,7 +174,12 @@ class RegularVisitsProvider extends ChangeNotifier {
if (response.statusCode >= 200 && response.statusCode < 300) {
reset(); //visit.status = pentry.ppmVisitStatus;
notifyListeners();
Fluttertoast.showToast(msg: context.translation.successfulRequestMessage);
Navigator.of(context).pop();
} else {
Fluttertoast.showToast(msg: "${context.translation.failedToCompleteRequest} ${jsonDecode(response.body)["message"]}");
}
Navigator.of(context).pop();
return response.statusCode;
} catch (error) {
return -1;

@ -53,6 +53,7 @@ import 'package:test_sa/providers/gas_request_providers/gas_status_provider.dart
import 'package:test_sa/providers/gas_request_providers/gas_types_provider.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/ppm_device_status_provider.dart';
import 'package:test_sa/providers/ppm_visit_status_provider.dart';
import 'package:test_sa/providers/service_request_providers/equipment_status_provider.dart';
import 'package:test_sa/providers/service_request_providers/first_action_provider.dart';
@ -179,6 +180,7 @@ class MyApp extends StatelessWidget {
ChangeNotifierProvider(create: (_) => ServiceTypeProvider()),
ChangeNotifierProvider(create: (_) => PPMVisitStatusProvider()),
ChangeNotifierProvider(create: (_) => PentryTaskStatusProvider()),
ChangeNotifierProvider(create: (_) => PPMDeviceStatusProvider()),
],
child: GestureDetector(
onTap: () {

@ -48,12 +48,16 @@ class Pentry {
this.localEngineerSignature});
Future<bool> validate() async {
if (ppmVisitStatus == null) {
await Fluttertoast.showToast(msg: "PPM Visit Status is Required");
return false;
}
if (actualVisitDate == null) {
await Fluttertoast.showToast(msg: "Actual visit date is Required");
return false;
}
if (expectedVisitDate == null) {
await Fluttertoast.showToast(msg: "expected visit date is Required");
await Fluttertoast.showToast(msg: "Expected visit date is Required");
return false;
}
if (timer?.startAt == null) {
@ -64,7 +68,6 @@ class Pentry {
await Fluttertoast.showToast(msg: "Please Stop The Timer");
return false;
}
if (ppmVisitStatus == null) return false;
if (status?.id == null) {
await Fluttertoast.showToast(msg: "Device Status is Required");
return false;
@ -75,8 +78,8 @@ class Pentry {
Map<String, dynamic> toMap(int visitId) {
Map<String, dynamic> map = {};
map["visitStatusId"] = ppmVisitStatus?.id?.toString();
if (status != null) map["deviceStatusId"] = status?.id?.toString();
map["visitStatusId"] = ppmVisitStatus?.id;
if (status != null) map["deviceStatusId"] = status?.id;
if (travelingHours != null) map["travelingHours"] = travelingHours;
//if(imageFile != null) map["file_attachement"] = base64Encode(imageFile.readAsBytesSync());
map["actualDate"] = actualVisitDate.toIso8601String();

@ -16,12 +16,12 @@ class PMKit {
return {
"id": id ?? 0,
"visitId": visitId,
if (itemCode != null) 'partCatalogItemId': (itemCode?.id).toString(),
// if(itemName != null) 'itemName': itemName,
if (itemCode != null) 'partCatalogItemId': (itemCode?.id),
if (itemName != null) 'itemName': itemName,
// if(preparationTimeFrame != null) 'preparationTimeFrame': preparationTimeFrame,
// if(kitFrequencyDemand != null) 'kitFrequencyDemand': kitFrequencyDemand,
// if(availability != null) 'availability': availability,
// if(quantityNeeded != null) 'quantityNeeded': quantityNeeded,
if (quantityNeeded != null) 'quantityNeeded': quantityNeeded,
// if(quantityReserved != null) 'quantityReserved': quantityReserved,
};
}

@ -28,31 +28,31 @@ class AppTextFormField extends StatefulWidget {
final Color backgroundColor;
final bool alignLabelWithHint;
const AppTextFormField({
Key key,
this.onSaved,
this.validator,
this.node,
this.onChange,
this.obscureText,
this.showPassword,
this.hintText,
this.labelText,
this.textInputType = TextInputType.text,
this.initialValue,
this.enable = true,
this.style,
this.textAlign,
this.suffixIcon,
this.prefixIcon,
this.prefixIconData,
this.prefixIconSize,
this.controller,
this.textInputAction,
this.onAction,
this.backgroundColor,
this.alignLabelWithHint
}) : super(key: key);
const AppTextFormField(
{Key key,
this.onSaved,
this.validator,
this.node,
this.onChange,
this.obscureText,
this.showPassword,
this.hintText,
this.labelText,
this.textInputType = TextInputType.text,
this.initialValue,
this.enable = true,
this.style,
this.textAlign,
this.suffixIcon,
this.prefixIcon,
this.prefixIconData,
this.prefixIconSize,
this.controller,
this.textInputAction,
this.onAction,
this.backgroundColor,
this.alignLabelWithHint})
: super(key: key);
@override
State<AppTextFormField> createState() => _AppTextFormFieldState();

@ -0,0 +1,35 @@
import 'dart:convert';
import 'package:http/http.dart';
import 'package:test_sa/models/lookup.dart';
import '../../controllers/api_routes/api_manager.dart';
import '../../controllers/api_routes/urls.dart';
import 'loading_list_notifier.dart';
class PPMDeviceStatusProvider extends LoadingListNotifier<Lookup> {
@override
Future getDate() async {
if (loading ?? false) return -2;
loading = true;
notifyListeners();
Response response;
try {
response = await ApiManager.instance.get(URLs.getPentryStatus);
} catch (error) {
loading = false;
stateCode = -1;
notifyListeners();
return -1;
}
stateCode = response.statusCode;
if (response.statusCode >= 200 && response.statusCode < 300) {
// client's request was successfully received
List listJson = json.decode(response.body)["data"];
items = listJson.map((department) => Lookup.fromJson(department)).toList();
}
loading = false;
notifyListeners();
return response.statusCode;
}
}

@ -1,5 +1,4 @@
import 'package:flutter/material.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:provider/provider.dart';
import 'package:test_sa/controllers/providers/api/regular_visits_provider.dart';
import 'package:test_sa/controllers/providers/api/user_provider.dart';
@ -50,25 +49,9 @@ class _EditPentryState extends State<EditPentry> with SingleTickerProviderStateM
setState(() {});
return;
}
_isLoading = true;
setState(() {});
_pentry.clearEmptyObjects();
int status = await _regularVisitsProvider.updatePentry(user: _userProvider.user, host: _settingProvider.host, pentry: _pentry, visit: widget.visit);
_isLoading = false;
setState(() {});
if (status >= 200 && status < 300) {
Fluttertoast.showToast(
msg: context.translation.successfulRequestMessage,
);
Navigator.of(context).pop();
Navigator.of(context).pop();
} else {
// String errorMessage = HttpStatusManger.getStatusMessage(
// status: status, subtitle: context.translation);
// Fluttertoast.showToast(
// msg: errorMessage,
// );
}
await _regularVisitsProvider.updatePentry(context, user: _userProvider.user, pentry: _pentry, visit: widget.visit);
}
@override
@ -134,40 +117,17 @@ class _EditPentryState extends State<EditPentry> with SingleTickerProviderStateM
PentryPMChecklistForm(models: _pentry.ppmCheckLists, enableValidate: _validate),
],
).expanded,
AppFilledButton(onPressed: () {}, label: context.translation.next).paddingOnly(top: 16),
// Padding(
// padding: const EdgeInsets.all(8.0),
// child: Row(
// children: [
// if (_tabController.index != 0)
// ASmallButton(
// text: context.translation.back,
// onPressed: () {
// _tabController.animateTo(
// _tabController.index - 1,
// );
// setState(() {});
// },
// ),
// const Spacer(),
// if (_tabController.index != _tabController.length - 1)
// ASmallButton(
// text: context.translation.next,
// onPressed: () {
// _tabController.animateTo(
// _tabController.index + 1,
// );
// setState(() {});
// },
// ),
// if (_tabController.index == _tabController.length - 1)
// ASmallButton(
// text: context.translation.update,
// onPressed: _onSubmit,
// ),
// ],
// ),
// ),
AppFilledButton(
onPressed: () {
if (_tabController.index == 3) {
_onSubmit();
} else {
_tabController.animateTo(_tabController.index + 1);
setState(() {});
}
},
label: _tabController.index == 3 ? context.translation.submit : context.translation.next,
).paddingOnly(top: 16),
],
).paddingAll(16),
),

@ -34,6 +34,14 @@ class _AutoCompletePartsFieldState extends State<AutoCompletePartsField> {
super.initState();
}
@override
void didUpdateWidget(covariant AutoCompletePartsField oldWidget) {
if (widget.initialValue != oldWidget.initialValue) {
_controller = TextEditingController(text: widget.initialValue);
}
super.didUpdateWidget(oldWidget);
}
@override
void dispose() {
_controller.dispose();

@ -35,6 +35,14 @@ class _AutoCompleteDeviceNumberFieldState extends State<AutoCompleteDeviceNumber
super.initState();
}
@override
void didUpdateWidget(covariant AutoCompleteDeviceNumberField oldWidget) {
if (widget.initialValue != oldWidget.initialValue) {
_controller = TextEditingController(text: widget.initialValue?.name);
}
super.didUpdateWidget(oldWidget);
}
@override
void dispose() {
_controller.dispose();

@ -47,6 +47,7 @@ class _PentryPMKitFormState extends State<PentryPMKitForm> {
);
}
final model = widget.models[index];
final TextEditingController controller = TextEditingController(text: model.quantityNeeded);
return Container(
padding: const EdgeInsets.all(16),
margin: EdgeInsets.only(bottom: 16.toScreenHeight),
@ -75,11 +76,12 @@ class _PentryPMKitFormState extends State<PentryPMKitForm> {
initialValue: (model.itemCode?.name ?? "").toString(),
onPick: (part) {
model.itemCode = Lookup(id: part.id, name: part?.sparePart?.partNo);
model.itemName = part?.sparePart?.partName;
},
),
8.height,
AppTextFormField(
initialValue: model.quantityNeeded,
controller: controller,
labelText: context.translation.quantity,
textInputType: TextInputType.number,
onChange: (text) {

@ -1,8 +1,10 @@
import 'package:flutter/material.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/models/pantry/ppm_check_list.dart';
import 'package:test_sa/new_views/app_style/app_color.dart';
import 'package:test_sa/new_views/common_widgets/app_text_form_field.dart';
class PentryPMChecklistForm extends StatefulWidget {
final List<PPMCheckList> models;
@ -32,6 +34,13 @@ class _PentryPMChecklistFormState extends State<PentryPMChecklistForm> {
initiallyExpanded: index == 0,
iconColor: AppColor.neutral50,
collapsedIconColor: AppColor.neutral50,
childrenPadding: EdgeInsets.symmetric(horizontal: 16.toScreenWidth, vertical: 8.toScreenHeight),
children: [
AppTextFormField(labelText: "Measured Value", initialValue: model.measuredValue, enable: false),
8.height,
AppTextFormField(labelText: context.translation.comment, initialValue: model.comment, enable: false),
8.height,
],
),
);
},

@ -6,6 +6,7 @@ import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/models/pantry/pentry.dart';
import 'package:test_sa/new_views/common_widgets/single_item_drop_down_menu.dart';
import 'package:test_sa/providers/ppm_device_status_provider.dart';
import 'package:test_sa/providers/ppm_visit_status_provider.dart';
import 'package:test_sa/views/widgets/e_signature/e_signature.dart';
import 'package:test_sa/views/widgets/timer/app_timer.dart';
@ -37,10 +38,9 @@ class _PentryTBSFormState extends State<PentryTBSForm> {
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
8.height,
/// required
SingleItemDropDownMenu<Lookup, PPMVisitStatusProvider>(
context: context,
initialValue: widget.model.ppmVisitStatus,
title: "PPM Visit Status",
onSelect: (value) {
if (value != null) {
@ -49,8 +49,6 @@ class _PentryTBSFormState extends State<PentryTBSForm> {
},
),
8.height,
/// required
AppTimer(
timer: widget.model.timer,
enabled: widget.model.timer.endAt == null,
@ -60,26 +58,17 @@ class _PentryTBSFormState extends State<PentryTBSForm> {
},
),
8.height,
// const ASubTitle("Status"),
// if (widget.enableValidate && widget.model.status == null)
// ASubTitle(
// context.translation.requiredWord,
// color: Colors.red,
// ),
// const SizedBox(
// height: 4,
// ),
// PentryStatusMenu(
// initialValue: widget.model.status,
// onSelect: (status) {
// widget.model.status = status;
// },
// ),
// const SizedBox(
// height: 8,
// ),
/// required
SingleItemDropDownMenu<Lookup, PPMDeviceStatusProvider>(
context: context,
initialValue: widget.model.status,
title: "Device Status",
onSelect: (value) {
if (value != null) {
widget.model.status = value;
}
},
),
8.height,
ADatePicker(
label: "Actual Visit Date",
date: widget.model.actualVisitDate,
@ -91,8 +80,6 @@ class _PentryTBSFormState extends State<PentryTBSForm> {
},
),
8.height,
/// required
ADatePicker(
label: "Expected Visit Date",
date: widget.model.expectedVisitDate,

Loading…
Cancel
Save