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,109 +93,84 @@ 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(
isLoading: _isLoading, isLoading: _isLoading,
isFailedLoading: false, isFailedLoading: false,
stateCode: 200, stateCode: 200,
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( child: TabBar(
padding: const EdgeInsets.all(2.0), controller: _tabController,
child: TabBar( isScrollable: true,
controller: _tabController, padding: EdgeInsets.zero,
isScrollable: true, labelColor: AppColor.neutral60,
onTap: (index) { unselectedLabelColor: AppColor.neutral20,
setState(() {}); indicatorPadding: const EdgeInsets.all(4),
}, indicator: BoxDecoration(color: Theme.of(context).cardColor, borderRadius: BorderRadius.circular(13)),
tabs: const [ onTap: (index) {
Tab( setState(() {});
text: "PPM Check List", },
), tabs: [
Tab( Tab(text: "TBS", height: 57.toScreenHeight),
text: "Calibration Tools", Tab(text: "Calibration Tool", height: 57.toScreenHeight),
), Tab(text: "PM Kit", height: 57.toScreenHeight),
Tab( Tab(text: "PPM Checklist", height: 57.toScreenHeight),
text: "PM Kits", ],
),
Tab(
text: "PM Entry",
),
],
),
),
), ),
Expanded( ),
child: Stack( TabBarView(
children: [ physics: const NeverScrollableScrollPhysics(),
TabBarView( controller: _tabController,
physics: const NeverScrollableScrollPhysics(), children: [
controller: _tabController, PentryTBSForm(model: _pentry, enableValidate: _validate),
children: [ PentryCalibrationToolForm(models: _pentry.calibrationTools, enableValidate: _validate),
PentryPPMCheckListForm( PentryPMKitForm(models: _pentry.pmKits, enableValidate: _validate, assetId: widget.visit?.deviceId),
models: _pentry.ppmCheckLists, PentryPMChecklistForm(models: _pentry.ppmCheckLists, enableValidate: _validate),
enableValidate: _validate, ],
), ).expanded,
PentryCalibrationToolForm( AppFilledButton(onPressed: () {}, label: context.translation.next).paddingOnly(top: 16),
models: _pentry.calibrationTools, // Padding(
enableValidate: _validate, // padding: const EdgeInsets.all(8.0),
), // child: Row(
PentryPMKitForm( // children: [
models: _pentry.pmKits, // if (_tabController.index != 0)
enableValidate: _validate, // ASmallButton(
assetId: widget.visit?.deviceId, // text: context.translation.back,
), // onPressed: () {
PentryInfoForm( // _tabController.animateTo(
model: _pentry, // _tabController.index - 1,
enableValidate: _validate, // );
), // setState(() {});
], // },
), // ),
Align( // const Spacer(),
alignment: Alignment.bottomCenter, // if (_tabController.index != _tabController.length - 1)
child: Padding( // ASmallButton(
padding: const EdgeInsets.all(8.0), // text: context.translation.next,
child: Row( // onPressed: () {
children: [ // _tabController.animateTo(
if (_tabController.index != 0) // _tabController.index + 1,
ASmallButton( // );
text: context.translation.back, // setState(() {});
onPressed: () { // },
_tabController.animateTo( // ),
_tabController.index - 1, // if (_tabController.index == _tabController.length - 1)
); // ASmallButton(
setState(() {}); // text: context.translation.update,
}, // onPressed: _onSubmit,
), // ),
const Spacer(), // ],
if (_tabController.index != _tabController.length - 1) // ),
ASmallButton( // ),
text: context.translation.next, ],
onPressed: () { ).paddingAll(16),
_tabController.animateTo( ),
_tabController.index + 1,
);
setState(() {});
},
),
if (_tabController.index == _tabController.length - 1)
ASmallButton(
text: context.translation.update,
onPressed: _onSubmit,
),
],
),
),
)
],
),
),
],
)),
), ),
); );
} }

@ -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,208 +1,159 @@
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( child: Column(
padding: EdgeInsets.only( crossAxisAlignment: CrossAxisAlignment.stretch,
top: 12 * AppStyle.getScaleFactor(context), left: 12 * AppStyle.getScaleFactor(context), right: 12 * AppStyle.getScaleFactor(context), bottom: 80 * AppStyle.getScaleFactor(context)), children: [
child: SingleChildScrollView( 8.height,
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch, /// required
children: [ SingleItemDropDownMenu<Lookup, PPMVisitStatusProvider>(
const SizedBox( context: context,
height: 8, title: "PPM Visit Status",
), onSelect: (value) {
const ASubTitle("PPM Visit Status"), if (value != null) {
if (widget.enableValidate && widget.model.ppmVisitStatus == null) widget.model.ppmVisitStatus = value;
ASubTitle( }
context.translation.requiredWord, },
color: Colors.red, ),
), 8.height,
const SizedBox(
height: 4, /// required
), AppTimer(
PentryVisitsStatusMenu( timer: widget.model.timer,
initialValue: widget.model.ppmVisitStatus, enabled: widget.model.timer.endAt == null,
onSelect: (status) { onChange: (timer) async {
if (status != null) { widget.model.timer = timer;
widget.model.ppmVisitStatus = status; return true;
} },
}, ),
), 8.height,
const SizedBox( // const ASubTitle("Status"),
height: 8, // if (widget.enableValidate && widget.model.status == null)
), // ASubTitle(
const ASubTitle("Timer"), // context.translation.requiredWord,
if (widget.enableValidate && widget.model?.timer?.endAt == null) // color: Colors.red,
ASubTitle( // ),
context.translation.requiredWord, // const SizedBox(
color: Colors.red, // height: 4,
), // ),
const SizedBox( // PentryStatusMenu(
height: 4, // initialValue: widget.model.status,
), // onSelect: (status) {
AppTimer( // widget.model.status = status;
timer: widget.model.timer, // },
enabled: widget.model.timer.endAt == null, // ),
onChange: (timer) async { // const SizedBox(
widget.model.timer = timer; // height: 8,
return true; // ),
},
), /// required
const SizedBox( ADatePicker(
height: 8, label: "Actual Visit Date",
), date: widget.model.actualVisitDate,
const ASubTitle("Status"), from: DateTime.now().subtract(const Duration(days: 30)),
if (widget.enableValidate && widget.model.status == null) onDatePicker: (date) {
ASubTitle( if (date == null) return;
context.translation.requiredWord, widget.model.actualVisitDate = date;
color: Colors.red, setState(() {});
), },
const SizedBox( ),
height: 4, 8.height,
),
PentryStatusMenu( /// required
initialValue: widget.model.status, ADatePicker(
onSelect: (status) { label: "Expected Visit Date",
widget.model.status = status; date: widget.model.expectedVisitDate,
}, from: DateTime.now().subtract(const Duration(days: 30)),
), onDatePicker: (date) {
const SizedBox( if (date == null) return;
height: 8, widget.model.expectedVisitDate = date;
), setState(() {});
const ASubTitle("Actual Visit Date"), },
if (widget.enableValidate && widget.model.actualVisitDate == null) ),
ASubTitle( 8.height,
context.translation.requiredWord, // const ASubTitle("Traveling Hours"),
color: Colors.red, // const SizedBox(
), // height: 4,
const SizedBox( // ),
height: 4, // ATextFormField(
), // initialValue: (widget.model.travelingHours ?? "").toString(),
ADatePicker( // textAlign: TextAlign.center,
date: widget.model.actualVisitDate, // style: Theme.of(context).textTheme.titleMedium,
from: DateTime.now().subtract(const Duration(days: 30)), // textInputType: TextInputType.number,
onDatePicker: (date) { // onChange: (value) {
if (date == null) return; // widget.model.travelingHours = value;
widget.model.actualVisitDate = date; // },
setState(() {}); // ),
}, 8.height,
), MultiFilesPicker(label: "Attach Image", files: widget.model.files),
const SizedBox( // AMiniOneFilePicker(
height: 8, // //error: _validate && _serviceReport.image == null,
), // file: widget.model.file,
const ASubTitle("Expected Visit Date"), // onPick: (file) {
if (widget.enableValidate && widget.model.expectedVisitDate == null) // widget.model.file = file;
ASubTitle( // },
context.translation.requiredWord, // ),
color: Colors.red, 8.height,
), ESignature(
const SizedBox( title: "Nurse Signature",
height: 4, oldSignature: widget.model.signatureNurse,
), newSignature: widget.model.localNurseSignature,
ADatePicker( onChange: (signature) {
date: widget.model.expectedVisitDate, // if (signature == null || signature.isEmpty) {
from: DateTime.now().subtract(const Duration(days: 30)), // return;
onDatePicker: (date) { // }
if (date == null) return; widget.model.localNurseSignature = signature;
widget.model.expectedVisitDate = date; widget.model.signatureNurse = "${DateTime.now().toIso8601String()}.png|${base64Encode(signature)}";
setState(() {}); },
}, ),
), 8.height,
const SizedBox( ESignature(
height: 8, title: context.translation.engSign,
), oldSignature: widget.model.signatureEngineer,
const ASubTitle("Traveling Hours"), newSignature: widget.model.localEngineerSignature,
const SizedBox( onChange: (signature) {
height: 4, // if (signature == null || signature.isEmpty) {
), // return;
ATextFormField( // }
initialValue: (widget.model.travelingHours ?? "").toString(), widget.model.localEngineerSignature = signature;
textAlign: TextAlign.center, widget.model.signatureEngineer = "${DateTime.now().toIso8601String()}.png|${base64Encode(signature)}";
style: Theme.of(context).textTheme.titleMedium, },
textInputType: TextInputType.number, ),
onChange: (value) { 8.height,
widget.model.travelingHours = value; ],
},
),
const SizedBox(height: 12),
MultiFilesPicker(label: "PPM Attachments", files: widget.model.files),
// AMiniOneFilePicker(
// //error: _validate && _serviceReport.image == null,
// file: widget.model.file,
// onPick: (file) {
// widget.model.file = file;
// },
// ),
const SizedBox(
height: 8,
),
const ASubTitle("Nurse Signature"),
ESignature(
oldSignature: widget.model.signatureNurse,
newSignature: widget.model.localNurseSignature,
onChange: (signature) {
if (signature == null || signature.isEmpty) {
return;
}
widget.model.localNurseSignature = signature;
widget.model.signatureNurse = "${DateTime.now().toIso8601String()}.png|${base64Encode(signature)}";
},
),
const SizedBox(
height: 8,
),
const ASubTitle("Engineer Signature"),
ESignature(
oldSignature: widget.model.signatureEngineer,
newSignature: widget.model.localEngineerSignature,
onChange: (signature) {
if (signature == null || signature.isEmpty) {
return;
}
widget.model.localEngineerSignature = signature;
widget.model.signatureEngineer = "${DateTime.now().toIso8601String()}.png|${base64Encode(signature)}";
},
),
const SizedBox(
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
? const SizedBox.square(
dimension: 18,
child: CircularProgressIndicator(
color: Colors.white,
))
: Row(
children: [
if (widget.enabled) Icon(_running ? Icons.pause : Icons.play_arrow),
Expanded(
child: Center(
child: ValueListenableBuilder<String>(
valueListenable: _period,
builder: (context, value, _) {
return Text(
value,
style: widget.enabled ? widget.style : widget.style?.copyWith(color: Colors.black54),
);
}),
),
),
],
),
), ),
); child: _loading
? const SizedBox.square(dimension: 18, child: CircularProgressIndicator(color: Colors.white))
: Row(
children: [
Expanded(
child: ValueListenableBuilder<String>(
valueListenable: _period,
builder: (context, value, _) {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
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;
@ -40,29 +37,18 @@ class _VisitsListState extends State<VisitsList> {
} }
return Stack( return Stack(
children: [ children: [
Column( LazyLoading(
children: [ nextPage: widget.nextPage,
LazyLoading( onLazyLoad: widget.onLazyLoad,
nextPage: widget.nextPage, child: ListView.builder(
onLazyLoad: widget.onLazyLoad, itemCount: widget.visits.length,
child: ListView.builder( padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8),
itemCount: widget.visits.length, itemBuilder: (context, itemIndex) {
padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8), Visit visit = widget.visits[itemIndex];
itemBuilder: (context, itemIndex) { // bool isSelected = _selectedVisits.contains(visit);
Visit visit = widget.visits[itemIndex]; return VisitItem(visit: visit);
// bool isSelected = _selectedVisits.contains(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