Merge branch 'zaid-development' into 'master'

Preventive Maintenance Screen

See merge request haroon6138/cloudsolutions-atoms!8
merge-requests/9/merge
Sikander Saleem 2 years ago
commit af5726fe38

@ -72,11 +72,9 @@ class RegularVisitsProvider extends ChangeNotifier {
if (response.statusCode >= 200 && response.statusCode < 300) { if (response.statusCode >= 200 && response.statusCode < 300) {
// client's request was successfully received // client's request was successfully received
try { try {
List requestsListJson = List requestsListJson = json.decode(utf8.decode(response.bodyBytes).replaceAll("\\", ""));
json.decode(utf8.decode(response.bodyBytes).replaceAll("\\", "")); List<Visit> visitsList = requestsListJson.map((request) => Visit.fromJson(request)).toList();
List<Visit> visits = visits.addAll(visitsList);
requestsListJson.map((request) => Visit.fromJson(request)).toList();
visits.addAll(visits);
if (visits.length == pageItemNumber) { if (visits.length == pageItemNumber) {
nextPage = true; nextPage = true;
} else { } else {
@ -149,22 +147,22 @@ class RegularVisitsProvider extends ChangeNotifier {
} }
Future<int> updatePentry({ Future<int> updatePentry({
required String host, required String? host,
required User user, required User? user,
required Pentry pentry, required Pentry? pentry,
required Visit visit, required Visit? visit,
}) async { }) async {
try { try {
Response response; Response response;
Map<String, String> body = pentry.toMap(); Map<String, String>? body = pentry?.toMap();
body["uid"] = user.id ?? ""; body?["uid"] = user?.id ?? "";
body["token"] = user.token ?? ""; body?["token"] = user?.token ?? "";
response = await post( response = await post(
Uri.parse("$host${URLs.updatePentry}/${visit.id}"), Uri.parse("$host${URLs.updatePentry}/${visit?.id}"),
body: body, body: body,
); );
if (response.statusCode >= 200 && response.statusCode < 300) { if (response.statusCode >= 200 && response.statusCode < 300) {
visit.status = pentry.ppmVisitStatus; visit?.status = pentry?.ppmVisitStatus;
notifyListeners(); notifyListeners();
} }
return response.statusCode; return response.statusCode;

@ -44,21 +44,15 @@ class Pentry {
Map<String, String> toMap() { Map<String, String> toMap() {
Map<String, String> map = {}; Map<String, String> map = {};
if (ppmVisitStatus != null) if (ppmVisitStatus != null) map["visit_status"] = ppmVisitStatus!.id.toString();
map["visit_status"] = ppmVisitStatus!.id.toString();
if (status != null) map["pentry_status"] = status!.id.toString(); if (status != null) map["pentry_status"] = status!.id.toString();
if (travelingHours != null) map["traveling_hours"] = travelingHours!; if (travelingHours != null) map["traveling_hours"] = travelingHours!;
if (imageFile != null) if (imageFile != null) map["file_attachement"] = base64Encode(imageFile!.readAsBytesSync());
map["file_attachement"] = base64Encode(imageFile!.readAsBytesSync()); map["actual_date"] = ((actualVisitDate?.millisecondsSinceEpoch ?? 0) / 1000).toStringAsFixed(0);
map["actual_date"] = ((actualVisitDate?.millisecondsSinceEpoch ?? 0) / 1000)
.toStringAsFixed(0);
if (timer != null) { if (timer != null) {
map["start_date"] = map["start_date"] = ((timer!.startAt?.millisecondsSinceEpoch ?? 0) / 1000).toStringAsFixed(0);
((timer!.startAt?.millisecondsSinceEpoch??0) / 1000).toStringAsFixed(0); map["end_date"] = (((timer!.endAt)?.millisecondsSinceEpoch ?? 0) / 1000).toStringAsFixed(0);
map["end_date"] = map["working_hours"] = ((timer!.durationInSecond ?? 0) / 60 / 60).toStringAsFixed(5);
(((timer!.endAt)?.millisecondsSinceEpoch??0) / 1000).toStringAsFixed(0);
map["working_hours"] =
((timer!.durationInSecond??0) / 60 / 60).toStringAsFixed(5);
} }
// if(contacts?.isNotEmpty == true) { // if(contacts?.isNotEmpty == true) {
// for(int i = 0;i<contacts.length;i++){ // for(int i = 0;i<contacts.length;i++){
@ -67,10 +61,8 @@ class Pentry {
// }); // });
// } // }
// } // }
map["ppmCheckLists"] = map["ppmCheckLists"] = jsonEncode(ppmCheckLists?.map((e) => e.toMap()).toList());
jsonEncode(ppmCheckLists?.map((e) => e.toMap()).toList()); map["calibrationTools"] = jsonEncode(calibrationTools?.map((e) => e.toMap()).toList());
map["calibrationTools"] =
jsonEncode(calibrationTools?.map((e) => e.toMap()).toList());
map["pmKits"] = jsonEncode(pmKits?.map((e) => e.toMap()).toList()); map["pmKits"] = jsonEncode(pmKits?.map((e) => e.toMap()).toList());
return map; return map;
} }
@ -85,34 +77,24 @@ class Pentry {
List<PMKit> pmKits = []; List<PMKit> pmKits = [];
if (map['pmKits'] != null) { if (map['pmKits'] != null) {
pmKits = (map['pmKits'] as List<dynamic>) pmKits = (map['pmKits'] as List<dynamic>).map((e) => PMKit.fromMap(e as Map<String, dynamic>)).toList();
.map((e) => PMKit.fromMap(e as Map<String, dynamic>))
.toList();
} }
List<PPMCheckList> ppmCheckLists = []; List<PPMCheckList> ppmCheckLists = [];
if (map['ppmCheckLists'] != null) { if (map['ppmCheckLists'] != null) {
ppmCheckLists = (map['ppmCheckLists'] as List<dynamic>) ppmCheckLists = (map['ppmCheckLists'] as List<dynamic>).map((e) => PPMCheckList.fromMap(e as Map<String, dynamic>)).toList();
.map((e) => PPMCheckList.fromMap(e as Map<String, dynamic>))
.toList();
} }
List<CalibrationTool> calibrationTools = []; List<CalibrationTool> calibrationTools = [];
if (map['calibrationTools'] != null) { if (map['calibrationTools'] != null) {
calibrationTools = (map['calibrationTools'] as List<dynamic>) calibrationTools = (map['calibrationTools'] as List<dynamic>).map((e) => CalibrationTool.fromMap(e as Map<String, dynamic>)).toList();
.map((e) => CalibrationTool.fromMap(e as Map<String, dynamic>))
.toList();
} }
return Pentry( return Pentry(
status: Lookup.fromJson(map["pentry_status"]), status: Lookup.fromJson(map["pentry_status"]),
ppmVisitStatus: Lookup.fromJson(map["visit_status"]), ppmVisitStatus: Lookup.fromJson(map["visit_status"]),
actualVisitDate: getDate(map["actual_date"]), actualVisitDate: getDate(map["actual_date"]),
travelingHours: map["traveling_hours"], travelingHours: map["traveling_hours"],
timer: TimerModel( timer: TimerModel(startAt: getDate(map["start_date"]), endAt: getDate(map["end_date"]), durationInSecond: (int.tryParse(map["working_hours"] ?? "") ?? 0) * 60 * 60),
startAt: getDate(map["start_date"]),
endAt: getDate(map["end_date"]),
durationInSecond:
(int.tryParse(map["working_hours"] ?? "") ?? 0) * 60 * 60),
// contacts: contacts, // contacts: contacts,
ppmCheckLists: ppmCheckLists, ppmCheckLists: ppmCheckLists,
calibrationTools: calibrationTools, calibrationTools: calibrationTools,
@ -120,9 +102,7 @@ class Pentry {
); );
} }
static getDate(String date) { static getDate(String? date) {
return date.isEmpty return date == null || date.isEmpty ? null : DateTime.fromMillisecondsSinceEpoch((int.tryParse(date) ?? 0) * 1000);
? null
: DateTime.fromMillisecondsSinceEpoch((int.tryParse(date) ?? 0) * 1000);
} }
} }

@ -1,7 +1,6 @@
import '../lookup.dart'; import '../lookup.dart';
class PMKit{ class PMKit {
Lookup? itemCode; Lookup? itemCode;
String? itemName; String? itemName;
String? preparationTimeFrame; String? preparationTimeFrame;
@ -10,37 +9,29 @@ class PMKit{
String? quantityNeeded; String? quantityNeeded;
String? quantityReserved; String? quantityReserved;
PMKit({ PMKit({this.itemCode, this.itemName, this.preparationTimeFrame, this.kitFrequencyDemand, this.availability, this.quantityNeeded, this.quantityReserved});
this.itemCode,
this.itemName,
this.preparationTimeFrame,
this.kitFrequencyDemand,
this.availability,
this.quantityNeeded,
this.quantityReserved
});
Map<String, String> toMap() { Map<String, String> toMap() {
return { return {
if(itemCode != null) 'itemCode': (itemCode?.id).toString(), if (itemCode != null) 'itemCode': (itemCode?.id).toString(),
if(itemName != null) 'itemName': itemName!, if (itemName != null) 'itemName': itemName!,
if(preparationTimeFrame != null) 'preparationTimeFrame': preparationTimeFrame!, if (preparationTimeFrame != null) 'preparationTimeFrame': preparationTimeFrame!,
if(kitFrequencyDemand != null) 'kitFrequencyDemand': kitFrequencyDemand!, if (kitFrequencyDemand != null) 'kitFrequencyDemand': kitFrequencyDemand!,
if(availability != null) 'availability': availability!, if (availability != null) 'availability': availability!,
if(quantityNeeded != null) 'quantityNeeded': quantityNeeded!, if (quantityNeeded != null) 'quantityNeeded': quantityNeeded!,
if(quantityReserved != null) 'quantityReserved': quantityReserved!, if (quantityReserved != null) 'quantityReserved': quantityReserved!,
}; };
} }
factory PMKit.fromMap(Map<String, dynamic> map) { factory PMKit.fromMap(Map<String, dynamic> map) {
return PMKit( return PMKit(
itemCode: Lookup.fromJson(map['itemCode']), itemCode: Lookup.fromJson(map['itemCode']),
itemName: map['itemName'] as String, itemName: map['itemName'] as String?,
preparationTimeFrame: map['preparationTimeFrame'] as String, preparationTimeFrame: map['preparationTimeFrame'] as String?,
kitFrequencyDemand: map['kitFrequencyDemand'] as String, kitFrequencyDemand: map['kitFrequencyDemand'] as String?,
availability: map['availability'] as String, availability: map['availability'] as String?,
quantityNeeded: map['quantityNeeded'] as String, quantityNeeded: map['quantityNeeded'] as String?,
quantityReserved: map['quantityReserved'] as String, quantityReserved: map['quantityReserved'] as String?,
); );
} }
} }

@ -1,7 +1,6 @@
import '../lookup.dart'; import '../lookup.dart';
class PPMCheckList{ class PPMCheckList {
Lookup? status; Lookup? status;
String? title; String? title;
String? comment; String? comment;
@ -16,19 +15,19 @@ class PPMCheckList{
Map<String, String> toMap() { Map<String, String> toMap() {
return { return {
if(status != null) 'status': status!.id.toString(), if (status != null) 'status': status!.id.toString(),
if(title != null) 'title': title!, if (title != null) 'title': title!,
if(comment != null) 'comment': comment!, if (comment != null) 'comment': comment!,
if(measuredValue != null) 'measuredValue': measuredValue!, if (measuredValue != null) 'measuredValue': measuredValue!,
}; };
} }
factory PPMCheckList.fromMap(Map<String, dynamic> map) { factory PPMCheckList.fromMap(Map<String, dynamic> map) {
return PPMCheckList( return PPMCheckList(
status: Lookup.fromJson(map['status']), status: Lookup.fromJson(map['status']),
title: map['title'] as String, title: map['title'] as String?,
comment: map['comment'] as String, comment: map['comment'] as String?,
measuredValue: map['measuredValue'] as String, measuredValue: map['measuredValue'] as String?,
); );
} }
} }

@ -1,7 +1,6 @@
import '../lookup.dart'; import '../lookup.dart';
class Visit{ class Visit {
String? id; String? id;
String? serialNumber; String? serialNumber;
String? expectDate; String? expectDate;
@ -42,7 +41,7 @@ class Visit{
this.deviceNumber, this.deviceNumber,
}); });
factory Visit.fromJson(Map<String,dynamic> parsedJson){ factory Visit.fromJson(Map<String, dynamic> parsedJson) {
return Visit( return Visit(
id: parsedJson["nid"], id: parsedJson["nid"],
serialNumber: parsedJson["title"], serialNumber: parsedJson["title"],
@ -61,10 +60,10 @@ class Visit{
contactStatus: parsedJson["contactStatus"], contactStatus: parsedJson["contactStatus"],
images: List<String>.from(parsedJson["images"] ?? []), images: List<String>.from(parsedJson["images"] ?? []),
status: Lookup( status: Lookup(
id: int.tryParse(parsedJson["status"] ?? "-1")??-1, // actual value (0,1,2) id: int.tryParse(parsedJson["status"] ?? "-1") ?? -1, // actual value (0,1,2)
label: parsedJson["status_value"] // text value label: parsedJson["status_value"] // text value
), ),
assignTo: parsedJson["assigned_to"], assignTo: parsedJson["assigned_to"],
); );
} }
} }

@ -20,50 +20,48 @@ import '../../../../widgets/pentry/pentry_ppm_check_list_form.dart';
class EditPentry extends StatefulWidget { class EditPentry extends StatefulWidget {
final Pentry? pentry; final Pentry? pentry;
final Visit? visit; final Visit? visit;
const EditPentry({Key? key,this.pentry, this.visit}) : super(key: key);
const EditPentry({Key? key, this.pentry, this.visit}) : super(key: key);
@override @override
State<EditPentry> createState() => _EditPentryState(); State<EditPentry> createState() => _EditPentryState();
} }
class _EditPentryState extends State<EditPentry> with SingleTickerProviderStateMixin{ class _EditPentryState extends State<EditPentry> with SingleTickerProviderStateMixin {
bool _isLoading = false; bool _isLoading = false;
bool _validate = false; bool _validate = false;
late Subtitle _subtitle; Subtitle? _subtitle;
late UserProvider _userProvider; late UserProvider _userProvider;
late SettingProvider _settingProvider; late SettingProvider _settingProvider;
late RegularVisitsProvider _regularVisitsProvider; late RegularVisitsProvider _regularVisitsProvider;
late Pentry _pentry; Pentry? _pentry;
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>(); final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
late TabController _tabController; late final TabController _tabController;
_onSubmit() async { _onSubmit() async {
_validate = true; _validate = true;
if(!_pentry.validate()) { if (!(_pentry?.validate() ?? false)) {
setState(() { }); setState(() {});
return; return;
} }
_isLoading = true; _isLoading = true;
setState(() {}); setState(() {});
int status = await _regularVisitsProvider.updatePentry( int status = await _regularVisitsProvider.updatePentry(user: _userProvider.user, host: _settingProvider.host, pentry: _pentry, visit: widget.visit);
user: _userProvider.user!, _isLoading = false;
host: _settingProvider.host??"",
pentry: _pentry,
visit: widget.visit!
);
_isLoading =false;
setState(() {}); setState(() {});
if(status >= 200 && status < 300){ if (status >= 200 && status < 300) {
Fluttertoast.showToast( if (_subtitle != null) {
msg: _subtitle.requestCompleteSuccessfully, Fluttertoast.showToast(
); msg: _subtitle!.requestCompleteSuccessfully,
);
}
// Navigator.of(context).pop(); // Navigator.of(context).pop();
}else{ } else {
String errorMessage = HttpStatusManger.getStatusMessage( String errorMessage = HttpStatusManger.getStatusMessage(status: status, subtitle: _subtitle);
status: status, subtitle: _subtitle);
Fluttertoast.showToast( Fluttertoast.showToast(
msg: errorMessage, msg: errorMessage,
); );
@ -72,7 +70,7 @@ class _EditPentryState extends State<EditPentry> with SingleTickerProviderStateM
@override @override
void initState() { void initState() {
_pentry = widget.pentry!; _pentry = widget.pentry;
_tabController = TabController(length: 4, vsync: this); _tabController = TabController(length: 4, vsync: this);
super.initState(); super.initState();
} }
@ -85,7 +83,7 @@ class _EditPentryState extends State<EditPentry> with SingleTickerProviderStateM
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
_subtitle = AppLocalization.of(context)!.subtitle!; _subtitle = AppLocalization.of(context)?.subtitle;
_userProvider = Provider.of<UserProvider>(context); _userProvider = Provider.of<UserProvider>(context);
_settingProvider = Provider.of<SettingProvider>(context); _settingProvider = Provider.of<SettingProvider>(context);
_regularVisitsProvider = Provider.of<RegularVisitsProvider>(context); _regularVisitsProvider = Provider.of<RegularVisitsProvider>(context);
@ -98,91 +96,101 @@ class _EditPentryState extends State<EditPentry> with SingleTickerProviderStateM
stateCode: 200, stateCode: 200,
onRefresh: () async {}, onRefresh: () async {},
child: Column( child: Column(
children: [ children: [
Material( Material(
color: Theme.of(context).colorScheme.primary, color: Theme.of(context).colorScheme.primary,
child: Padding( child: Padding(
padding: const EdgeInsets.all(2.0), padding: const EdgeInsets.all(2.0),
child: TabBar( child: TabBar(
controller: _tabController, controller: _tabController,
isScrollable: true, isScrollable: true,
onTap: (index){ onTap: (index) {
setState(() {}); setState(() {});
}, },
tabs: const [ tabs: const [
Tab(text: "PPM Check List",), Tab(
Tab(text: "Calibration Tools",), text: "PPM Check List",
Tab(text: "PK Kits",), ),
Tab(text: "Pentry",), Tab(
]), text: "Calibration Tools",
),
Tab(
text: "PK Kits",
),
Tab(
text: "Pentry",
),
]),
),
),
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,
),
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: _subtitle?.back,
onPressed: () {
_tabController.animateTo(
_tabController.index - 1,
);
setState(() {});
},
),
const Spacer(),
if (_tabController.index != _tabController.length - 1)
ASmallButton(
text: _subtitle?.next,
onPressed: () {
_tabController.animateTo(
_tabController.index + 1,
);
setState(() {});
},
),
if (_tabController.index == _tabController.length - 1)
ASmallButton(
text: _subtitle?.update,
onPressed: _onSubmit,
),
],
),
),
)
],
),
), ),
),
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,
),
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: _subtitle.back,
onPressed: (){
_tabController.animateTo(_tabController.index - 1,);
setState(() {});
},
),
const Spacer(),
if(_tabController.index != _tabController.length -1)
ASmallButton(
text: _subtitle.next,
onPressed: (){
_tabController.animateTo(_tabController.index + 1,);
setState(() {});
},
),
if(_tabController.index == _tabController.length -1)
ASmallButton(
text: _subtitle.update,
onPressed: _onSubmit,
),
],
),
),
)
],
),
),
], ],
) ),
), ),
), ),
); );
} }
} }

@ -4,20 +4,22 @@ import '../../../controllers/localization/localization.dart';
import '../../../models/subtitle.dart'; import '../../../models/subtitle.dart';
import '../../app_style/sizing.dart'; import '../../app_style/sizing.dart';
import 'date_picker.dart'; import 'date_picker.dart';
class FromToDateBar extends StatefulWidget { class FromToDateBar extends StatefulWidget {
final DateTime from; final DateTime? from;
final DateTime to; final DateTime? to;
final Function(DateTime)? onPickFrom; final Function(DateTime)? onPickFrom;
final Function(DateTime)? onPickTo; final Function(DateTime)? onPickTo;
const FromToDateBar({Key? key, required this.from, required this.to, this.onPickFrom, this.onPickTo}) : super(key: key); const FromToDateBar({Key? key, required this.from, required this.to, this.onPickFrom, this.onPickTo}) : super(key: key);
@override @override
_FromToDateBarState createState() => _FromToDateBarState(); _FromToDateBarState createState() => _FromToDateBarState();
} }
class _FromToDateBarState extends State<FromToDateBar> { class _FromToDateBarState extends State<FromToDateBar> {
late DateTime _from; late DateTime? _from;
late DateTime _to; late DateTime? _to;
@override @override
void initState() { void initState() {
@ -32,22 +34,18 @@ class _FromToDateBarState extends State<FromToDateBar> {
return Row( return Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly, mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [ children: [
Column( Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
Text( Text(
_subtitle?.from??'', _subtitle?.from ?? '',
style: Theme.of(context).textTheme.bodyText1?.copyWith( style: Theme.of(context).textTheme.bodyText1?.copyWith(fontSize: 12, fontWeight: FontWeight.normal),
fontSize: 12,
fontWeight: FontWeight.normal
),
textScaleFactor: AppStyle.getScaleFactor(context), textScaleFactor: AppStyle.getScaleFactor(context),
), ),
ADatePicker( ADatePicker(
date: _from, date: _from,
from: DateTime(1950), from: DateTime(1950),
onDatePicker: (date){ onDatePicker: (date) {
_from = date; _from = date;
setState(() {}); setState(() {});
widget.onPickFrom!(date); widget.onPickFrom!(date);
@ -59,17 +57,14 @@ class _FromToDateBarState extends State<FromToDateBar> {
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
Text( Text(
_subtitle?.to??"", _subtitle?.to ?? "",
style: Theme.of(context).textTheme.bodyText1?.copyWith( style: Theme.of(context).textTheme.bodyText1?.copyWith(fontSize: 12, fontWeight: FontWeight.normal),
fontSize: 12,
fontWeight: FontWeight.normal
),
textScaleFactor: AppStyle.getScaleFactor(context), textScaleFactor: AppStyle.getScaleFactor(context),
), ),
ADatePicker( ADatePicker(
date: _to, date: _to,
from: DateTime(1950), from: DateTime(1950),
onDatePicker: (date){ onDatePicker: (date) {
_to = date; _to = date;
setState(() {}); setState(() {});
widget.onPickTo!(date); widget.onPickTo!(date);

@ -13,7 +13,9 @@ class PentryPPMCheckListForm extends StatefulWidget {
final List<PPMCheckList>? models; final List<PPMCheckList>? models;
final bool? enableValidate; final bool? enableValidate;
const PentryPPMCheckListForm({ const PentryPPMCheckListForm({
Key? key, this.models, this.enableValidate, Key? key,
this.models,
this.enableValidate,
}) : super(key: key); }) : super(key: key);
@override @override
@ -21,99 +23,112 @@ class PentryPPMCheckListForm extends StatefulWidget {
} }
class _PentryPPMCheckListFormState extends State<PentryPPMCheckListForm> { class _PentryPPMCheckListFormState extends State<PentryPPMCheckListForm> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final subtitle = AppLocalization.of(context)?.subtitle; final subtitle = AppLocalization.of(context)?.subtitle;
return ListView.builder( return ListView.builder(
padding: EdgeInsets.only( padding: EdgeInsets.only(
top: 12 * AppStyle.getScaleFactor(context), top: 12 * AppStyle.getScaleFactor(context), left: 12 * AppStyle.getScaleFactor(context), right: 12 * AppStyle.getScaleFactor(context), bottom: 80 * AppStyle.getScaleFactor(context)),
left: 12 * AppStyle.getScaleFactor(context), itemCount: (widget.models?.length ?? 0) + 1,
right: 12 * AppStyle.getScaleFactor(context), itemBuilder: (context, index) {
bottom: 80 * AppStyle.getScaleFactor(context) if (index == widget.models?.length) {
), return AButton(
itemCount: (widget.models?.length??0) + 1, text: subtitle?.add ?? "",
itemBuilder: (context,index){ onPressed: () {
if(index == widget.models?.length){ widget.models?.add(PPMCheckList());
return AButton( setState(() {});
text: subtitle?.add??"",
onPressed: (){
widget.models!.add(PPMCheckList());
setState(() {});
},
);
}
final model = widget.models![index];
return ListView(
shrinkWrap: true,
physics: const ClampingScrollPhysics(),
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
ASubTitle("#${index+1}"),
if(index != 0)
ASmallButton(
color: Theme.of(context).colorScheme.error,
text: subtitle!.delete,
onPressed: (){
widget.models!.remove(model);
setState(() {});
},
),
],
),
const SizedBox(height: 8,),
const ASubTitle("Task"),
const SizedBox(height: 4,),
ATextFormField(
initialValue: (model.title ?? "").toString(),
textAlign: TextAlign.center,
style: Theme.of(context).textTheme.subtitle1,
textInputType: TextInputType.text,
onChange: (value){
model.title = value;
},
),
const SizedBox(height: 8,),
ASubTitle(subtitle?.status??""),
const SizedBox(height: 4,),
PentryTaskStatusMenu(
initialValue: model.status,
onSelect: (status){
model.status = status;
}, },
), );
const SizedBox(height: 8,), }
const ASubTitle("Comment"), final model = widget.models?[index];
const SizedBox(height: 4,), return ListView(
ATextFormField( shrinkWrap: true,
initialValue: (model.comment ?? "").toString(), physics: const ClampingScrollPhysics(),
textAlign: TextAlign.center, children: [
style: Theme.of(context).textTheme.subtitle1, Row(
textInputType: TextInputType.text, mainAxisAlignment: MainAxisAlignment.spaceBetween,
onChange: (value){ children: [
model.comment = value; ASubTitle("#${index + 1}"),
}, if (index != 0)
), ASmallButton(
const SizedBox(height: 8,), color: Theme.of(context).colorScheme.error,
const ASubTitle("Measured Value"), text: subtitle?.delete,
const SizedBox(height: 4,), onPressed: () {
ATextFormField( widget.models?.remove(model);
initialValue: (model.measuredValue ?? "").toString(), setState(() {});
textAlign: TextAlign.center, },
style: Theme.of(context).textTheme.subtitle1, ),
textInputType: TextInputType.text, ],
onChange: (value){ ),
model.measuredValue = value; const SizedBox(
}, height: 8,
), ),
const SizedBox(height: 8,), const ASubTitle("Task"),
Divider(color: Theme.of(context).textTheme.titleMedium?.color,), const SizedBox(
], height: 4,
); ),
} ATextFormField(
); initialValue: (model?.title ?? "").toString(),
textAlign: TextAlign.center,
style: Theme.of(context).textTheme.subtitle1,
textInputType: TextInputType.text,
onChange: (value) {
model?.title = value;
},
),
const SizedBox(
height: 8,
),
ASubTitle(subtitle?.status ?? ""),
const SizedBox(
height: 4,
),
PentryTaskStatusMenu(
initialValue: model?.status,
onSelect: (status) {
model?.status = status;
},
),
const SizedBox(
height: 8,
),
const ASubTitle("Comment"),
const SizedBox(
height: 4,
),
ATextFormField(
initialValue: (model?.comment ?? "").toString(),
textAlign: TextAlign.center,
style: Theme.of(context).textTheme.subtitle1,
textInputType: TextInputType.text,
onChange: (value) {
model?.comment = value;
},
),
const SizedBox(
height: 8,
),
const ASubTitle("Measured Value"),
const SizedBox(
height: 4,
),
ATextFormField(
initialValue: (model?.measuredValue ?? "").toString(),
textAlign: TextAlign.center,
style: Theme.of(context).textTheme.subtitle1,
textInputType: TextInputType.text,
onChange: (value) {
model?.measuredValue = value;
},
),
const SizedBox(
height: 8,
),
Divider(
color: Theme.of(context).textTheme.titleMedium?.color,
),
],
);
});
} }
} }

@ -29,8 +29,7 @@ class VisitsSearchDialog extends StatefulWidget {
VisitsSearchDialogState createState() => VisitsSearchDialogState(); VisitsSearchDialogState createState() => VisitsSearchDialogState();
} }
class VisitsSearchDialogState extends State<VisitsSearchDialog> class VisitsSearchDialogState extends State<VisitsSearchDialog> with TickerProviderStateMixin {
with TickerProviderStateMixin {
VisitsSearch? _search; VisitsSearch? _search;
List<Lookup> status = const [ List<Lookup> status = const [
Lookup( Lookup(
@ -195,8 +194,7 @@ class VisitsSearchDialogState extends State<VisitsSearchDialog>
children: List.generate( children: List.generate(
contactStatus.length, contactStatus.length,
(index) { (index) {
bool isSelected = bool isSelected = _search?.contactStatus == contactStatus[index].key;
_search?.contactStatus == contactStatus[index].key;
return FilterItem( return FilterItem(
isSelected: isSelected, isSelected: isSelected,
onSelected: () { onSelected: () {
@ -220,8 +218,8 @@ class VisitsSearchDialogState extends State<VisitsSearchDialog>
height: 4.0 * AppStyle.getScaleFactor(context), height: 4.0 * AppStyle.getScaleFactor(context),
), ),
FromToDateBar( FromToDateBar(
from: _search!.actualDateFrom!, from: _search?.actualDateFrom,
to: _search!.actualDateTo!, to: _search?.actualDateTo,
onPickFrom: (date) { onPickFrom: (date) {
_search?.actualDateFrom = date; _search?.actualDateFrom = date;
}, },
@ -237,11 +235,8 @@ class VisitsSearchDialogState extends State<VisitsSearchDialog>
height: 4.0 * AppStyle.getScaleFactor(context), height: 4.0 * AppStyle.getScaleFactor(context),
), ),
FromToDateBar( FromToDateBar(
from: _search?.expectedDateFrom ?? from: _search?.expectedDateFrom ?? DateTime(today.year, today.month, 1),
DateTime(today.year, today.month, 1), to: _search?.expectedDateTo ?? DateTime(today.year, (today.month + 1).clamp(1, 12), today.month == 12 ? 31 : 0),
to: _search?.expectedDateTo ??
DateTime(today.year, (today.month + 1).clamp(1, 12),
today.month == 12 ? 31 : 0),
onPickFrom: (date) { onPickFrom: (date) {
_search?.expectedDateFrom = date; _search?.expectedDateFrom = date;
}, },
@ -252,8 +247,7 @@ class VisitsSearchDialogState extends State<VisitsSearchDialog>
Visibility( Visibility(
visible: _search?.toSearchString().isNotEmpty ?? false, visible: _search?.toSearchString().isNotEmpty ?? false,
child: Padding( child: Padding(
padding: padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 16),
const EdgeInsets.symmetric(vertical: 8, horizontal: 16),
child: AButton( child: AButton(
padding: EdgeInsets.zero, padding: EdgeInsets.zero,
text: subtitle?.clearSearch ?? '', text: subtitle?.clearSearch ?? '',

@ -26,11 +26,11 @@ class SingleStatusMenuState extends State<SingleStatusMenu> {
@override @override
void didUpdateWidget(covariant SingleStatusMenu oldWidget) { void didUpdateWidget(covariant SingleStatusMenu oldWidget) {
if (widget.initialStatus != null) { if (widget.initialStatus != null) {
_selectedStatus = widget.statuses?.firstWhere((element) { _selectedStatus = widget.initialStatus?.id != null
return element.id == widget.initialStatus?.id; ? widget.statuses?.firstWhere((element) {
}); return element.id == widget.initialStatus?.id;
} else { })
_selectedStatus = null; : null;
} }
super.didUpdateWidget(oldWidget); super.didUpdateWidget(oldWidget);
} }
@ -38,9 +38,11 @@ class SingleStatusMenuState extends State<SingleStatusMenu> {
@override @override
void initState() { void initState() {
if (widget.initialStatus != null) { if (widget.initialStatus != null) {
_selectedStatus = widget.statuses?.firstWhere((element) { _selectedStatus = widget.initialStatus?.id != null
return element.id == widget.initialStatus?.id; ? widget.statuses?.firstWhere((element) {
}); return element.id == widget.initialStatus?.id;
})
: null;
} }
super.initState(); super.initState();
@ -87,9 +89,7 @@ class SingleStatusMenuState extends State<SingleStatusMenu> {
value: value, value: value,
child: Text( child: Text(
value.label ?? '', value.label ?? '',
style: Theme.of(context).textTheme.titleMedium?.copyWith( style: Theme.of(context).textTheme.titleMedium?.copyWith(color: Theme.of(context).primaryColor, fontWeight: FontWeight.w600),
color: Theme.of(context).primaryColor,
fontWeight: FontWeight.w600),
), ),
); );
}).toList(), }).toList(),

Loading…
Cancel
Save