PPM TBS DONE

main_design2.0
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/site_provider.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/first_action_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: (_) => ReasonProvider()),
ChangeNotifierProvider(create: (_) => ServiceTypeProvider()),
ChangeNotifierProvider(create: (_) => PPMVisitStatusProvider()),
],
child: GestureDetector(
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:fluttertoast/fluttertoast.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/user_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/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/pentry.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/subtitle.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/pentry/pentry_calibration_tool_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);
_regularVisitsProvider = Provider.of<RegularVisitsProvider>(context);
return Scaffold(
appBar: DefaultAppBar(title: context.translation.preventiveMaintenance),
key: _scaffoldKey,
body: SafeArea(
child: LoadingManager(
isLoading: _isLoading,
isFailedLoading: false,
stateCode: 200,
onRefresh: () async {},
child: Column(
children: [
Material(
color: Theme.of(context).colorScheme.primary,
child: Padding(
padding: const EdgeInsets.all(2.0),
child: TabBar(
controller: _tabController,
isScrollable: true,
onTap: (index) {
setState(() {});
},
tabs: const [
Tab(
text: "PPM Check List",
),
Tab(
text: "Calibration Tools",
),
Tab(
text: "PM Kits",
),
Tab(
text: "PM Entry",
),
],
),
),
isLoading: _isLoading,
isFailedLoading: false,
stateCode: 200,
onRefresh: () async {},
child: Column(
children: [
Container(
decoration: BoxDecoration(color: AppColor.neutral30, borderRadius: BorderRadius.circular(16)),
child: TabBar(
controller: _tabController,
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) {
setState(() {});
},
tabs: [
Tab(text: "TBS", height: 57.toScreenHeight),
Tab(text: "Calibration Tool", height: 57.toScreenHeight),
Tab(text: "PM Kit", height: 57.toScreenHeight),
Tab(text: "PPM Checklist", height: 57.toScreenHeight),
],
),
Expanded(
child: Stack(
children: [
TabBarView(
physics: const NeverScrollableScrollPhysics(),
controller: _tabController,
children: [
PentryPPMCheckListForm(
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,
),
],
),
),
)
],
),
),
],
)),
),
TabBarView(
physics: const NeverScrollableScrollPhysics(),
controller: _tabController,
children: [
PentryTBSForm(model: _pentry, enableValidate: _validate),
PentryCalibrationToolForm(models: _pentry.calibrationTools, enableValidate: _validate),
PentryPMKitForm(models: _pentry.pmKits, enableValidate: _validate, assetId: widget.visit?.deviceId),
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,
// ),
// ],
// ),
// ),
],
).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/models/visits/visit.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 '../../../../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)
AppFilledButton(
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,
).paddingAll(16),

@ -1,6 +1,5 @@
import 'package:flutter/material.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/extensions/context_extension.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 {
final List<CalibrationTool> models;
final bool enableValidate;
const PentryCalibrationToolForm({
Key key,
this.models,
this.enableValidate,
}) : super(key: key);
const PentryCalibrationToolForm({Key key, this.models, this.enableValidate}) : super(key: key);
@override
State<PentryCalibrationToolForm> createState() => _PentryCalibrationToolFormState();
@ -27,7 +22,6 @@ class PentryCalibrationToolForm extends StatefulWidget {
class _PentryCalibrationToolFormState extends State<PentryCalibrationToolForm> {
@override
Widget build(BuildContext context) {
final userProvider = Provider.of<UserProvider>(context);
return ListView.builder(
padding: EdgeInsets.only(

@ -1,208 +1,159 @@
import 'dart:convert';
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/int_extensions.dart';
import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/models/pantry/pentry.dart';
import 'package:test_sa/views/app_style/sizing.dart';
import 'package:test_sa/views/widgets/app_text_form_field.dart';
import 'package:test_sa/views/widgets/date_and_time/date_picker.dart';
import 'package:test_sa/new_views/common_widgets/single_item_drop_down_menu.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/status/pentry/pentry_visit_status_mune.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 '../status/pentry/pentry_status_mune.dart';
class PentryInfoForm extends StatefulWidget {
class PentryTBSForm extends StatefulWidget {
final Pentry model;
final bool enableValidate;
const PentryInfoForm({
const PentryTBSForm({
Key key,
this.model,
this.enableValidate,
}) : super(key: key);
@override
State<PentryInfoForm> createState() => _PentryInfoFormState();
State<PentryTBSForm> createState() => _PentryTBSFormState();
}
class _PentryInfoFormState extends State<PentryInfoForm> {
class _PentryTBSFormState extends State<PentryTBSForm> {
@override
Widget build(BuildContext context) {
widget.model?.files ??= [];
final userProvider = Provider.of<UserProvider>(context);
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(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
const SizedBox(
height: 8,
),
const ASubTitle("PPM Visit Status"),
if (widget.enableValidate && widget.model.ppmVisitStatus == null)
ASubTitle(
context.translation.requiredWord,
color: Colors.red,
),
const SizedBox(
height: 4,
),
PentryVisitsStatusMenu(
initialValue: widget.model.ppmVisitStatus,
onSelect: (status) {
if (status != null) {
widget.model.ppmVisitStatus = status;
}
},
),
const SizedBox(
height: 8,
),
const ASubTitle("Timer"),
if (widget.enableValidate && widget.model?.timer?.endAt == null)
ASubTitle(
context.translation.requiredWord,
color: Colors.red,
),
const SizedBox(
height: 4,
),
AppTimer(
timer: widget.model.timer,
enabled: widget.model.timer.endAt == null,
onChange: (timer) async {
widget.model.timer = timer;
return true;
},
),
const SizedBox(
height: 8,
),
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,
),
const ASubTitle("Actual Visit Date"),
if (widget.enableValidate && widget.model.actualVisitDate == null)
ASubTitle(
context.translation.requiredWord,
color: Colors.red,
),
const SizedBox(
height: 4,
),
ADatePicker(
date: widget.model.actualVisitDate,
from: DateTime.now().subtract(const Duration(days: 30)),
onDatePicker: (date) {
if (date == null) return;
widget.model.actualVisitDate = date;
setState(() {});
},
),
const SizedBox(
height: 8,
),
const ASubTitle("Expected Visit Date"),
if (widget.enableValidate && widget.model.expectedVisitDate == null)
ASubTitle(
context.translation.requiredWord,
color: Colors.red,
),
const SizedBox(
height: 4,
),
ADatePicker(
date: widget.model.expectedVisitDate,
from: DateTime.now().subtract(const Duration(days: 30)),
onDatePicker: (date) {
if (date == null) return;
widget.model.expectedVisitDate = date;
setState(() {});
},
),
const SizedBox(
height: 8,
),
const ASubTitle("Traveling Hours"),
const SizedBox(
height: 4,
),
ATextFormField(
initialValue: (widget.model.travelingHours ?? "").toString(),
textAlign: TextAlign.center,
style: Theme.of(context).textTheme.titleMedium,
textInputType: TextInputType.number,
onChange: (value) {
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,
),
],
),
return SingleChildScrollView(
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
8.height,
/// required
SingleItemDropDownMenu<Lookup, PPMVisitStatusProvider>(
context: context,
title: "PPM Visit Status",
onSelect: (value) {
if (value != null) {
widget.model.ppmVisitStatus = value;
}
},
),
8.height,
/// required
AppTimer(
timer: widget.model.timer,
enabled: widget.model.timer.endAt == null,
onChange: (timer) async {
widget.model.timer = timer;
return true;
},
),
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
ADatePicker(
label: "Actual Visit Date",
date: widget.model.actualVisitDate,
from: DateTime.now().subtract(const Duration(days: 30)),
onDatePicker: (date) {
if (date == null) return;
widget.model.actualVisitDate = date;
setState(() {});
},
),
8.height,
/// required
ADatePicker(
label: "Expected Visit Date",
date: widget.model.expectedVisitDate,
from: DateTime.now().subtract(const Duration(days: 30)),
onDatePicker: (date) {
if (date == null) return;
widget.model.expectedVisitDate = date;
setState(() {});
},
),
8.height,
// const ASubTitle("Traveling Hours"),
// const SizedBox(
// height: 4,
// ),
// ATextFormField(
// initialValue: (widget.model.travelingHours ?? "").toString(),
// textAlign: TextAlign.center,
// style: Theme.of(context).textTheme.titleMedium,
// textInputType: TextInputType.number,
// onChange: (value) {
// widget.model.travelingHours = value;
// },
// ),
8.height,
MultiFilesPicker(label: "Attach Image", files: widget.model.files),
// AMiniOneFilePicker(
// //error: _validate && _serviceReport.image == null,
// file: widget.model.file,
// onPick: (file) {
// widget.model.file = file;
// },
// ),
8.height,
ESignature(
title: "Nurse Signature",
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)}";
},
),
8.height,
ESignature(
title: context.translation.engSign,
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)}";
},
),
8.height,
],
),
);
}

@ -1,5 +1,4 @@
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/models/pantry/ppm_check_list.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/titles/app_sub_title.dart';
class PentryPPMCheckListForm extends StatefulWidget {
class PentryPMChecklistForm extends StatefulWidget {
final List<PPMCheckList> models;
final bool enableValidate;
const PentryPPMCheckListForm({
const PentryPMChecklistForm({
Key key,
this.models,
this.enableValidate,
}) : super(key: key);
@override
State<PentryPPMCheckListForm> createState() => _PentryPPMCheckListFormState();
State<PentryPMChecklistForm> createState() => _PentryPMChecklistFormState();
}
class _PentryPPMCheckListFormState extends State<PentryPPMCheckListForm> {
class _PentryPMChecklistFormState extends State<PentryPMChecklistForm> {
@override
Widget build(BuildContext context) {
return ListView.builder(
padding: EdgeInsets.only(
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 '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/views/app_style/colors.dart';
import 'package:test_sa/views/app_style/sizing.dart';
import '../../../new_views/app_style/app_color.dart';
class AppTimer extends StatefulWidget {
final TimerModel timer;
final Future<bool> Function(TimerModel) onChange;
@ -96,37 +100,36 @@ class _AppTimerState extends State<AppTimer> {
@override
Widget build(BuildContext context) {
return SizedBox(
return Container(
width: 100 * AppStyle.getScaleFactor(context),
height: 28 * AppStyle.getScaleFactor(context),
child: ElevatedButton(
style: ElevatedButton.styleFrom(
minimumSize: const Size(1, 1), padding: EdgeInsets.all(4 * AppStyle.getScaleFactor(context)), backgroundColor: _running ? AColors.green[300] : AColors.grey, foregroundColor: Colors.black),
onPressed: _loading || widget.enabled == false ? null : _onPressed,
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),
);
}),
),
),
],
),
height: 56.toScreenHeight,
padding: EdgeInsets.symmetric(horizontal: 16.toScreenWidth),
decoration: BoxDecoration(
color: Theme.of(context).cardColor,
borderRadius: BorderRadius.circular(10),
),
);
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 '../../../extensions/text_extensions.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';
class VisitItem extends StatelessWidget {
@ -89,7 +89,7 @@ class VisitItem extends StatelessWidget {
children: [
if (userProvider.user.type == UsersTypes.engineer && visit.status.value != 5 && visit.status.value != 3)
"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))),
],

@ -1,15 +1,12 @@
import 'package:flutter/material.dart';
import 'package:provider/provider.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/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/no_item_found.dart';
import 'package:test_sa/views/widgets/visits/visit_item.dart';
import '../../../controllers/providers/api/user_provider.dart';
import '../../../models/enums/user_types.dart';
class VisitsList extends StatefulWidget {
final List<Visit> visits;
@ -40,29 +37,18 @@ class _VisitsListState extends State<VisitsList> {
}
return Stack(
children: [
Column(
children: [
LazyLoading(
nextPage: widget.nextPage,
onLazyLoad: widget.onLazyLoad,
child: ListView.builder(
itemCount: widget.visits.length,
padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8),
itemBuilder: (context, itemIndex) {
Visit visit = widget.visits[itemIndex];
// 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),
],
LazyLoading(
nextPage: widget.nextPage,
onLazyLoad: widget.onLazyLoad,
child: ListView.builder(
itemCount: widget.visits.length,
padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8),
itemBuilder: (context, itemIndex) {
Visit visit = widget.visits[itemIndex];
// bool isSelected = _selectedVisits.contains(visit);
return VisitItem(visit: visit);
},
),
),
// Align(
// alignment: Alignment.bottomLeft,

Loading…
Cancel
Save