PPM TBS DONE

design_3.0_demo_module
zaid_daoud 2 years ago
parent 3299c0c7a4
commit 3464666485

@ -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/gas_types_provider.dart';
import 'package:test_sa/providers/gas_request_providers/site_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/loading_list_notifier.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/equipment_status_provider.dart';
import 'package:test_sa/providers/service_request_providers/first_action_provider.dart'; import 'package:test_sa/providers/service_request_providers/first_action_provider.dart';
import 'package:test_sa/providers/service_request_providers/loan_availability_provider.dart'; import 'package:test_sa/providers/service_request_providers/loan_availability_provider.dart';
@ -176,6 +177,7 @@ class MyApp extends StatelessWidget {
ChangeNotifierProvider(create: (_) => LoanAvailabilityProvider()), ChangeNotifierProvider(create: (_) => LoanAvailabilityProvider()),
ChangeNotifierProvider(create: (_) => ReasonProvider()), ChangeNotifierProvider(create: (_) => ReasonProvider()),
ChangeNotifierProvider(create: (_) => ServiceTypeProvider()), ChangeNotifierProvider(create: (_) => ServiceTypeProvider()),
ChangeNotifierProvider(create: (_) => PPMVisitStatusProvider()),
], ],
child: GestureDetector( child: GestureDetector(
onTap: () { onTap: () {

@ -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 PPMVisitStatusProvider extends LoadingListNotifier<Lookup> {
@override
Future getDate() async {
if (loading ?? false) return -2;
loading = true;
notifyListeners();
Response response;
try {
response = await ApiManager.instance.get(URLs.getPentryVisitStatus);
} 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,18 +1,20 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:fluttertoast/fluttertoast.dart'; import 'package:fluttertoast/fluttertoast.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:test_sa/controllers/localization/localization.dart';
import 'package:test_sa/controllers/providers/api/regular_visits_provider.dart'; import 'package:test_sa/controllers/providers/api/regular_visits_provider.dart';
import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart';
import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart';
import 'package:test_sa/extensions/context_extension.dart'; import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/models/pantry/calibration_tools.dart'; import 'package:test_sa/models/pantry/calibration_tools.dart';
import 'package:test_sa/models/pantry/pentry.dart'; import 'package:test_sa/models/pantry/pentry.dart';
import 'package:test_sa/models/pantry/pm_kit.dart'; import 'package:test_sa/models/pantry/pm_kit.dart';
import 'package:test_sa/models/pantry/ppm_check_list.dart'; import 'package:test_sa/models/pantry/ppm_check_list.dart';
import 'package:test_sa/models/subtitle.dart';
import 'package:test_sa/models/visits/visit.dart'; import 'package:test_sa/models/visits/visit.dart';
import 'package:test_sa/views/widgets/buttons/app_small_button.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/default_app_bar.dart';
import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart';
import 'package:test_sa/views/widgets/pentry/pentry_calibration_tool_form.dart'; import 'package:test_sa/views/widgets/pentry/pentry_calibration_tool_form.dart';
import 'package:test_sa/views/widgets/pentry/pentry_pm_kit_form.dart'; import 'package:test_sa/views/widgets/pentry/pentry_pm_kit_form.dart';
@ -91,6 +93,7 @@ class _EditPentryState extends State<EditPentry> with SingleTickerProviderStateM
_settingProvider = Provider.of<SettingProvider>(context); _settingProvider = Provider.of<SettingProvider>(context);
_regularVisitsProvider = Provider.of<RegularVisitsProvider>(context); _regularVisitsProvider = Provider.of<RegularVisitsProvider>(context);
return Scaffold( return Scaffold(
appBar: DefaultAppBar(title: context.translation.preventiveMaintenance),
key: _scaffoldKey, key: _scaffoldKey,
body: SafeArea( body: SafeArea(
child: LoadingManager( child: LoadingManager(
@ -100,101 +103,75 @@ class _EditPentryState extends State<EditPentry> with SingleTickerProviderStateM
onRefresh: () async {}, onRefresh: () async {},
child: Column( child: Column(
children: [ children: [
Material( Container(
color: Theme.of(context).colorScheme.primary, decoration: BoxDecoration(color: AppColor.neutral30, borderRadius: BorderRadius.circular(16)),
child: Padding(
padding: const EdgeInsets.all(2.0),
child: TabBar( child: TabBar(
controller: _tabController, controller: _tabController,
isScrollable: true, isScrollable: true,
padding: EdgeInsets.zero,
labelColor: AppColor.neutral60,
unselectedLabelColor: AppColor.neutral20,
indicatorPadding: const EdgeInsets.all(4),
indicator: BoxDecoration(color: Theme.of(context).cardColor, borderRadius: BorderRadius.circular(13)),
onTap: (index) { onTap: (index) {
setState(() {}); setState(() {});
}, },
tabs: const [ tabs: [
Tab( Tab(text: "TBS", height: 57.toScreenHeight),
text: "PPM Check List", Tab(text: "Calibration Tool", height: 57.toScreenHeight),
), Tab(text: "PM Kit", height: 57.toScreenHeight),
Tab( Tab(text: "PPM Checklist", height: 57.toScreenHeight),
text: "Calibration Tools",
),
Tab(
text: "PM Kits",
),
Tab(
text: "PM Entry",
),
], ],
), ),
), ),
),
Expanded(
child: Stack(
children: [
TabBarView( TabBarView(
physics: const NeverScrollableScrollPhysics(), physics: const NeverScrollableScrollPhysics(),
controller: _tabController, controller: _tabController,
children: [ children: [
PentryPPMCheckListForm( PentryTBSForm(model: _pentry, enableValidate: _validate),
models: _pentry.ppmCheckLists, PentryCalibrationToolForm(models: _pentry.calibrationTools, enableValidate: _validate),
enableValidate: _validate, PentryPMKitForm(models: _pentry.pmKits, enableValidate: _validate, assetId: widget.visit?.deviceId),
), PentryPMChecklistForm(models: _pentry.ppmCheckLists, enableValidate: _validate),
PentryCalibrationToolForm(
models: _pentry.calibrationTools,
enableValidate: _validate,
),
PentryPMKitForm(
models: _pentry.pmKits,
enableValidate: _validate,
assetId: widget.visit?.deviceId,
),
PentryInfoForm(
model: _pentry,
enableValidate: _validate,
),
],
),
Align(
alignment: Alignment.bottomCenter,
child: 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,
),
], ],
), ).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,
// ),
// ],
// ),
// ),
], ],
).paddingAll(16),
), ),
), ),
],
)),
),
); );
} }
} }

@ -7,7 +7,7 @@ import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/models/visits/visit.dart'; import 'package:test_sa/models/visits/visit.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/views/pages/user/visits/pantry/future_edit_pently.dart'; import 'package:test_sa/views/pages/user/visits/pantry/edit_pentry.dart';
import '../../../../controllers/providers/api/user_provider.dart'; import '../../../../controllers/providers/api/user_provider.dart';
import '../../../../models/enums/user_types.dart'; import '../../../../models/enums/user_types.dart';
@ -80,7 +80,7 @@ class VisitDetailsPage extends StatelessWidget {
if (userProvider.user.type == UsersTypes.engineer && visit.status.value != 5 && visit.status.value != 3) if (userProvider.user.type == UsersTypes.engineer && visit.status.value != 5 && visit.status.value != 3)
AppFilledButton( AppFilledButton(
onPressed: () { onPressed: () {
Navigator.of(context).push(MaterialPageRoute(builder: (_) => FutureEditPentry(visit: visit))); Navigator.of(context).push(MaterialPageRoute(builder: (_) => EditPentry(visit: visit, pentry: visit.pentry)));
}, },
label: context.translation.updateRequest, label: context.translation.updateRequest,
).paddingAll(16), ).paddingAll(16),

@ -1,6 +1,5 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:test_sa/controllers/localization/localization.dart';
import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart';
import 'package:test_sa/extensions/context_extension.dart'; import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/models/pantry/calibration_tools.dart'; import 'package:test_sa/models/pantry/calibration_tools.dart';
@ -14,11 +13,7 @@ import 'package:test_sa/views/widgets/titles/app_sub_title.dart';
class PentryCalibrationToolForm extends StatefulWidget { class PentryCalibrationToolForm extends StatefulWidget {
final List<CalibrationTool> models; final List<CalibrationTool> models;
final bool enableValidate; final bool enableValidate;
const PentryCalibrationToolForm({ const PentryCalibrationToolForm({Key key, this.models, this.enableValidate}) : super(key: key);
Key key,
this.models,
this.enableValidate,
}) : super(key: key);
@override @override
State<PentryCalibrationToolForm> createState() => _PentryCalibrationToolFormState(); State<PentryCalibrationToolForm> createState() => _PentryCalibrationToolFormState();
@ -27,7 +22,6 @@ class PentryCalibrationToolForm extends StatefulWidget {
class _PentryCalibrationToolFormState extends State<PentryCalibrationToolForm> { class _PentryCalibrationToolFormState extends State<PentryCalibrationToolForm> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final userProvider = Provider.of<UserProvider>(context); final userProvider = Provider.of<UserProvider>(context);
return ListView.builder( return ListView.builder(
padding: EdgeInsets.only( padding: EdgeInsets.only(

@ -1,80 +1,56 @@
import 'dart:convert'; import 'dart:convert';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:test_sa/controllers/providers/api/user_provider.dart';
import 'package:test_sa/extensions/context_extension.dart'; import 'package:test_sa/extensions/context_extension.dart';
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/models/pantry/pentry.dart';
import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/new_views/common_widgets/single_item_drop_down_menu.dart';
import 'package:test_sa/views/widgets/app_text_form_field.dart'; import 'package:test_sa/providers/ppm_visit_status_provider.dart';
import 'package:test_sa/views/widgets/date_and_time/date_picker.dart';
import 'package:test_sa/views/widgets/e_signature/e_signature.dart'; import 'package:test_sa/views/widgets/e_signature/e_signature.dart';
import 'package:test_sa/views/widgets/status/pentry/pentry_visit_status_mune.dart';
import 'package:test_sa/views/widgets/timer/app_timer.dart'; import 'package:test_sa/views/widgets/timer/app_timer.dart';
import 'package:test_sa/views/widgets/titles/app_sub_title.dart';
import '../date_and_time/date_picker.dart';
import '../images/multi_image_picker.dart'; import '../images/multi_image_picker.dart';
import '../status/pentry/pentry_status_mune.dart';
class PentryInfoForm extends StatefulWidget { class PentryTBSForm extends StatefulWidget {
final Pentry model; final Pentry model;
final bool enableValidate; final bool enableValidate;
const PentryInfoForm({ const PentryTBSForm({
Key key, Key key,
this.model, this.model,
this.enableValidate, this.enableValidate,
}) : super(key: key); }) : super(key: key);
@override @override
State<PentryInfoForm> createState() => _PentryInfoFormState(); State<PentryTBSForm> createState() => _PentryTBSFormState();
} }
class _PentryInfoFormState extends State<PentryInfoForm> { class _PentryTBSFormState extends State<PentryTBSForm> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
widget.model?.files ??= []; widget.model?.files ??= [];
final userProvider = Provider.of<UserProvider>(context); return SingleChildScrollView(
return Padding(
padding: EdgeInsets.only(
top: 12 * AppStyle.getScaleFactor(context), left: 12 * AppStyle.getScaleFactor(context), right: 12 * AppStyle.getScaleFactor(context), bottom: 80 * AppStyle.getScaleFactor(context)),
child: SingleChildScrollView(
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch, crossAxisAlignment: CrossAxisAlignment.stretch,
children: [ children: [
const SizedBox( 8.height,
height: 8,
), /// required
const ASubTitle("PPM Visit Status"), SingleItemDropDownMenu<Lookup, PPMVisitStatusProvider>(
if (widget.enableValidate && widget.model.ppmVisitStatus == null) context: context,
ASubTitle( title: "PPM Visit Status",
context.translation.requiredWord, onSelect: (value) {
color: Colors.red, if (value != null) {
), widget.model.ppmVisitStatus = value;
const SizedBox(
height: 4,
),
PentryVisitsStatusMenu(
initialValue: widget.model.ppmVisitStatus,
onSelect: (status) {
if (status != null) {
widget.model.ppmVisitStatus = status;
} }
}, },
), ),
const SizedBox( 8.height,
height: 8,
), /// required
const ASubTitle("Timer"),
if (widget.enableValidate && widget.model?.timer?.endAt == null)
ASubTitle(
context.translation.requiredWord,
color: Colors.red,
),
const SizedBox(
height: 4,
),
AppTimer( AppTimer(
timer: widget.model.timer, timer: widget.model.timer,
enabled: widget.model.timer.endAt == null, enabled: widget.model.timer.endAt == null,
@ -83,37 +59,29 @@ class _PentryInfoFormState extends State<PentryInfoForm> {
return true; return true;
}, },
), ),
const SizedBox( 8.height,
height: 8, // const ASubTitle("Status"),
), // if (widget.enableValidate && widget.model.status == null)
const ASubTitle("Status"), // ASubTitle(
if (widget.enableValidate && widget.model.status == null) // context.translation.requiredWord,
ASubTitle( // color: Colors.red,
context.translation.requiredWord, // ),
color: Colors.red, // const SizedBox(
), // height: 4,
const SizedBox( // ),
height: 4, // PentryStatusMenu(
), // initialValue: widget.model.status,
PentryStatusMenu( // onSelect: (status) {
initialValue: widget.model.status, // widget.model.status = status;
onSelect: (status) { // },
widget.model.status = status; // ),
}, // const SizedBox(
), // height: 8,
const SizedBox( // ),
height: 8,
), /// required
const ASubTitle("Actual Visit Date"),
if (widget.enableValidate && widget.model.actualVisitDate == null)
ASubTitle(
context.translation.requiredWord,
color: Colors.red,
),
const SizedBox(
height: 4,
),
ADatePicker( ADatePicker(
label: "Actual Visit Date",
date: widget.model.actualVisitDate, date: widget.model.actualVisitDate,
from: DateTime.now().subtract(const Duration(days: 30)), from: DateTime.now().subtract(const Duration(days: 30)),
onDatePicker: (date) { onDatePicker: (date) {
@ -122,19 +90,11 @@ class _PentryInfoFormState extends State<PentryInfoForm> {
setState(() {}); setState(() {});
}, },
), ),
const SizedBox( 8.height,
height: 8,
), /// required
const ASubTitle("Expected Visit Date"),
if (widget.enableValidate && widget.model.expectedVisitDate == null)
ASubTitle(
context.translation.requiredWord,
color: Colors.red,
),
const SizedBox(
height: 4,
),
ADatePicker( ADatePicker(
label: "Expected Visit Date",
date: widget.model.expectedVisitDate, date: widget.model.expectedVisitDate,
from: DateTime.now().subtract(const Duration(days: 30)), from: DateTime.now().subtract(const Duration(days: 30)),
onDatePicker: (date) { onDatePicker: (date) {
@ -143,24 +103,22 @@ class _PentryInfoFormState extends State<PentryInfoForm> {
setState(() {}); setState(() {});
}, },
), ),
const SizedBox( 8.height,
height: 8, // const ASubTitle("Traveling Hours"),
), // const SizedBox(
const ASubTitle("Traveling Hours"), // height: 4,
const SizedBox( // ),
height: 4, // ATextFormField(
), // initialValue: (widget.model.travelingHours ?? "").toString(),
ATextFormField( // textAlign: TextAlign.center,
initialValue: (widget.model.travelingHours ?? "").toString(), // style: Theme.of(context).textTheme.titleMedium,
textAlign: TextAlign.center, // textInputType: TextInputType.number,
style: Theme.of(context).textTheme.titleMedium, // onChange: (value) {
textInputType: TextInputType.number, // widget.model.travelingHours = value;
onChange: (value) { // },
widget.model.travelingHours = value; // ),
}, 8.height,
), MultiFilesPicker(label: "Attach Image", files: widget.model.files),
const SizedBox(height: 12),
MultiFilesPicker(label: "PPM Attachments", files: widget.model.files),
// AMiniOneFilePicker( // AMiniOneFilePicker(
// //error: _validate && _serviceReport.image == null, // //error: _validate && _serviceReport.image == null,
// file: widget.model.file, // file: widget.model.file,
@ -168,42 +126,35 @@ class _PentryInfoFormState extends State<PentryInfoForm> {
// widget.model.file = file; // widget.model.file = file;
// }, // },
// ), // ),
const SizedBox( 8.height,
height: 8,
),
const ASubTitle("Nurse Signature"),
ESignature( ESignature(
title: "Nurse Signature",
oldSignature: widget.model.signatureNurse, oldSignature: widget.model.signatureNurse,
newSignature: widget.model.localNurseSignature, newSignature: widget.model.localNurseSignature,
onChange: (signature) { onChange: (signature) {
if (signature == null || signature.isEmpty) { // if (signature == null || signature.isEmpty) {
return; // return;
} // }
widget.model.localNurseSignature = signature; widget.model.localNurseSignature = signature;
widget.model.signatureNurse = "${DateTime.now().toIso8601String()}.png|${base64Encode(signature)}"; widget.model.signatureNurse = "${DateTime.now().toIso8601String()}.png|${base64Encode(signature)}";
}, },
), ),
const SizedBox( 8.height,
height: 8,
),
const ASubTitle("Engineer Signature"),
ESignature( ESignature(
title: context.translation.engSign,
oldSignature: widget.model.signatureEngineer, oldSignature: widget.model.signatureEngineer,
newSignature: widget.model.localEngineerSignature, newSignature: widget.model.localEngineerSignature,
onChange: (signature) { onChange: (signature) {
if (signature == null || signature.isEmpty) { // if (signature == null || signature.isEmpty) {
return; // return;
} // }
widget.model.localEngineerSignature = signature; widget.model.localEngineerSignature = signature;
widget.model.signatureEngineer = "${DateTime.now().toIso8601String()}.png|${base64Encode(signature)}"; widget.model.signatureEngineer = "${DateTime.now().toIso8601String()}.png|${base64Encode(signature)}";
}, },
), ),
const SizedBox( 8.height,
height: 8,
),
], ],
), ),
),
); );
} }
} }

@ -1,5 +1,4 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:test_sa/controllers/localization/localization.dart';
import 'package:test_sa/extensions/context_extension.dart'; import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/models/pantry/ppm_check_list.dart'; import 'package:test_sa/models/pantry/ppm_check_list.dart';
import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/app_style/sizing.dart';
@ -9,24 +8,23 @@ import 'package:test_sa/views/widgets/buttons/app_small_button.dart';
import 'package:test_sa/views/widgets/status/pentry/pentry_task_status_mune.dart'; import 'package:test_sa/views/widgets/status/pentry/pentry_task_status_mune.dart';
import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; import 'package:test_sa/views/widgets/titles/app_sub_title.dart';
class PentryPPMCheckListForm extends StatefulWidget { class PentryPMChecklistForm extends StatefulWidget {
final List<PPMCheckList> models; final List<PPMCheckList> models;
final bool enableValidate; final bool enableValidate;
const PentryPPMCheckListForm({ const PentryPMChecklistForm({
Key key, Key key,
this.models, this.models,
this.enableValidate, this.enableValidate,
}) : super(key: key); }) : super(key: key);
@override @override
State<PentryPPMCheckListForm> createState() => _PentryPPMCheckListFormState(); State<PentryPMChecklistForm> createState() => _PentryPMChecklistFormState();
} }
class _PentryPPMCheckListFormState extends State<PentryPPMCheckListForm> { class _PentryPMChecklistFormState extends State<PentryPMChecklistForm> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return ListView.builder( return ListView.builder(
padding: EdgeInsets.only( padding: EdgeInsets.only(
top: 12 * AppStyle.getScaleFactor(context), left: 12 * AppStyle.getScaleFactor(context), right: 12 * AppStyle.getScaleFactor(context), bottom: 80 * AppStyle.getScaleFactor(context)), top: 12 * AppStyle.getScaleFactor(context), left: 12 * AppStyle.getScaleFactor(context), right: 12 * AppStyle.getScaleFactor(context), bottom: 80 * AppStyle.getScaleFactor(context)),

@ -1,10 +1,14 @@
import 'dart:async'; import 'dart:async';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/models/timer_model.dart'; import 'package:test_sa/models/timer_model.dart';
import 'package:test_sa/views/app_style/colors.dart';
import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/app_style/sizing.dart';
import '../../../new_views/app_style/app_color.dart';
class AppTimer extends StatefulWidget { class AppTimer extends StatefulWidget {
final TimerModel timer; final TimerModel timer;
final Future<bool> Function(TimerModel) onChange; final Future<bool> Function(TimerModel) onChange;
@ -96,37 +100,36 @@ class _AppTimerState extends State<AppTimer> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return SizedBox( return Container(
width: 100 * AppStyle.getScaleFactor(context), width: 100 * AppStyle.getScaleFactor(context),
height: 28 * AppStyle.getScaleFactor(context), height: 56.toScreenHeight,
child: ElevatedButton( padding: EdgeInsets.symmetric(horizontal: 16.toScreenWidth),
style: ElevatedButton.styleFrom( decoration: BoxDecoration(
minimumSize: const Size(1, 1), padding: EdgeInsets.all(4 * AppStyle.getScaleFactor(context)), backgroundColor: _running ? AColors.green[300] : AColors.grey, foregroundColor: Colors.black), color: Theme.of(context).cardColor,
onPressed: _loading || widget.enabled == false ? null : _onPressed, borderRadius: BorderRadius.circular(10),
),
child: _loading child: _loading
? const SizedBox.square( ? const SizedBox.square(dimension: 18, child: CircularProgressIndicator(color: Colors.white))
dimension: 18,
child: CircularProgressIndicator(
color: Colors.white,
))
: Row( : Row(
children: [ children: [
if (widget.enabled) Icon(_running ? Icons.pause : Icons.play_arrow),
Expanded( Expanded(
child: Center(
child: ValueListenableBuilder<String>( child: ValueListenableBuilder<String>(
valueListenable: _period, valueListenable: _period,
builder: (context, value, _) { builder: (context, value, _) {
return Text( return Column(
value, crossAxisAlignment: CrossAxisAlignment.start,
style: widget.enabled ? widget.style : widget.style?.copyWith(color: Colors.black54), mainAxisAlignment: MainAxisAlignment.center,
children: [
"Timer".tinyFont(context),
value.bodyText(context).custom(color: AppColor.neutral50),
],
); );
}), },
), ),
), ),
if (widget.enabled) Icon(_running ? Icons.pause : Icons.play_arrow),
], ],
), ),
), ).onPress(_loading || widget.enabled == false ? () {} : _onPressed);
);
} }
} }

@ -11,7 +11,7 @@ import 'package:test_sa/views/pages/user/visits/visit_details.dart';
import '../../../controllers/providers/api/user_provider.dart'; import '../../../controllers/providers/api/user_provider.dart';
import '../../../extensions/text_extensions.dart'; import '../../../extensions/text_extensions.dart';
import '../../app_style/colors.dart'; import '../../app_style/colors.dart';
import '../../pages/user/visits/pantry/future_edit_pently.dart'; import '../../pages/user/visits/pantry/edit_pentry.dart';
import '../requests/request_status.dart'; import '../requests/request_status.dart';
class VisitItem extends StatelessWidget { class VisitItem extends StatelessWidget {
@ -89,7 +89,7 @@ class VisitItem extends StatelessWidget {
children: [ children: [
if (userProvider.user.type == UsersTypes.engineer && visit.status.value != 5 && visit.status.value != 3) if (userProvider.user.type == UsersTypes.engineer && visit.status.value != 5 && visit.status.value != 3)
"edit".toSvgAsset(height: 48, width: 48).onPress(() { "edit".toSvgAsset(height: 48, width: 48).onPress(() {
Navigator.of(context).push(MaterialPageRoute(builder: (_) => FutureEditPentry(visit: visit))); Navigator.of(context).push(MaterialPageRoute(builder: (_) => EditPentry(visit: visit, pentry: visit.pentry)));
}), }),
Text(visit.createdOn != null ? visit.createdOn.toServiceRequestCardFormat : "", textAlign: TextAlign.end, style: AppTextStyles.tinyFont.copyWith(color: const Color(0xFF3B3D4A))), Text(visit.createdOn != null ? visit.createdOn.toServiceRequestCardFormat : "", textAlign: TextAlign.end, style: AppTextStyles.tinyFont.copyWith(color: const Color(0xFF3B3D4A))),
], ],

@ -1,15 +1,12 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:test_sa/extensions/context_extension.dart'; import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/models/visits/visit.dart'; import 'package:test_sa/models/visits/visit.dart';
import 'package:test_sa/new_views/common_widgets/app_filled_button.dart';
import 'package:test_sa/views/widgets/loaders/lazy_loading.dart'; import 'package:test_sa/views/widgets/loaders/lazy_loading.dart';
import 'package:test_sa/views/widgets/loaders/no_item_found.dart'; import 'package:test_sa/views/widgets/loaders/no_item_found.dart';
import 'package:test_sa/views/widgets/visits/visit_item.dart'; import 'package:test_sa/views/widgets/visits/visit_item.dart';
import '../../../controllers/providers/api/user_provider.dart'; import '../../../controllers/providers/api/user_provider.dart';
import '../../../models/enums/user_types.dart';
class VisitsList extends StatefulWidget { class VisitsList extends StatefulWidget {
final List<Visit> visits; final List<Visit> visits;
@ -39,8 +36,6 @@ class _VisitsListState extends State<VisitsList> {
return NoItemFound(message: context.translation.noVisitsFound); return NoItemFound(message: context.translation.noVisitsFound);
} }
return Stack( return Stack(
children: [
Column(
children: [ children: [
LazyLoading( LazyLoading(
nextPage: widget.nextPage, nextPage: widget.nextPage,
@ -54,15 +49,6 @@ class _VisitsListState extends State<VisitsList> {
return VisitItem(visit: visit); return VisitItem(visit: visit);
}, },
), ),
).expanded,
if (userProvider.user.type == UsersTypes.normal_user)
AppFilledButton(
onPressed: () {
Navigator.push(context, MaterialPageRoute(builder: (context) => Container()));
},
label: context.translation.createNewRequest,
).paddingAll(16),
],
), ),
// Align( // Align(
// alignment: Alignment.bottomLeft, // alignment: Alignment.bottomLeft,

Loading…
Cancel
Save