Convert (Start Date & End Date) to Timer

pull/1/head
zaid_daoud 2 years ago
parent 147351bd10
commit 45b66e6b2a

@ -44,7 +44,6 @@ class DeviceTransferProvider extends ChangeNotifier {
// failed _loading = false
bool isLoading;
Hospital hospital;
Buildings building;
Floors floor;
@ -179,8 +178,8 @@ class DeviceTransferProvider extends ChangeNotifier {
"senderMachineStatusId": newModel.status.id,
"senderComment": newModel.comment,
"senderWorkingHours": newModel.workingHours,
"senderStartDate": newModel.startDate?.toIso8601String(),
"senderEndDate": newModel.endDate?.toIso8601String(),
"senderStartDate": newModel.timer?.startAt?.toIso8601String(),
"senderEndDate": newModel.timer?.endAt?.toIso8601String(),
"senderTravelingHours": newModel.travelingHours,
"senderAttachmentName": "${newModel.signature}.png",
"destSiteId": oldModel.receiver.client.id,
@ -189,8 +188,8 @@ class DeviceTransferProvider extends ChangeNotifier {
"receiverMachineStatusId": oldModel.receiver.status.id ?? "",
"receiverComment": oldModel.receiver.comment,
"receiverWorkingHours": oldModel.receiver.workingHours,
"receiverStartDate": oldModel.receiver.startDate?.toIso8601String(),
"receiverEndDate": oldModel.receiver.endDate?.toIso8601String(),
"receiverStartDate": oldModel.receiver.timer?.startAt?.toIso8601String(),
"receiverEndDate": oldModel.receiver.timer?.endAt?.toIso8601String(),
"receiverTravelingHours": oldModel.receiver.travelingHours,
"receiverAttachmentName": "${oldModel.receiver.signature}.png",
});
@ -202,8 +201,8 @@ class DeviceTransferProvider extends ChangeNotifier {
"senderMachineStatusId": oldModel.sender.status.id,
"senderComment": oldModel.sender.comment,
"senderWorkingHours": oldModel.sender.workingHours,
"senderStartDate": oldModel.sender.startDate?.toIso8601String(),
"senderEndDate": oldModel.sender.endDate?.toIso8601String(),
"senderStartDate": oldModel.sender.timer?.startAt?.toIso8601String(),
"senderEndDate": oldModel.sender.timer?.endAt?.toIso8601String(),
"senderTravelingHours": oldModel.sender.travelingHours,
"senderAttachmentName": "${oldModel.sender.signature}.png",
"destSiteId": newModel.client.id,
@ -212,8 +211,8 @@ class DeviceTransferProvider extends ChangeNotifier {
"receiverMachineStatusId": newModel.status?.id ?? "",
"receiverComment": newModel.comment,
"receiverWorkingHours": newModel.workingHours,
"receiverStartDate": newModel.startDate?.toIso8601String(),
"receiverEndDate": newModel.endDate?.toIso8601String(),
"receiverStartDate": newModel.timer?.startAt?.toIso8601String(),
"receiverEndDate": newModel.timer?.endAt?.toIso8601String(),
"receiverTravelingHours": newModel.travelingHours,
"receiverAttachmentName": "${newModel.signature}.png",
});
@ -247,5 +246,4 @@ class DeviceTransferProvider extends ChangeNotifier {
return -1;
}
}
}

@ -1,4 +1,5 @@
import 'dart:convert';
import 'dart:developer';
import 'package:flutter/cupertino.dart';
import 'package:http/http.dart';
@ -320,9 +321,9 @@ class ServiceRequestsProvider extends ChangeNotifier {
"currentSituation": null,
"repairLocation": report.repairLocation?.toMap(),
"reason": report.reason?.toMap(),
"startofWorkTime": report.startDate?.toIso8601String() ?? "",
"endofWorkTime": report.endDate?.toIso8601String() ?? "",
"workingHours": ((report?.endDate?.difference(report?.startDate)?.inMinutes ?? 0) / 60),
"startofWorkTime": report.timer?.startAt?.toIso8601String() ?? "",
"endofWorkTime": report.timer?.endAt?.toIso8601String() ?? "",
"workingHours": report?.workingHours,
"travelingHours": report.travelingHours,
"travelingExpenses": report.travelingExpense ?? 0,
if (report.faultDescription != null) "faultDescription": report.faultDescription.toJson(),
@ -399,12 +400,14 @@ class ServiceRequestsProvider extends ChangeNotifier {
if (response.statusCode >= 200 && response.statusCode < 300) {
// client's request was successfully received
Map<String, dynamic> listJson = json.decode(response.body)["data"];
log(listJson?.toString());
callRequestForWorkOrder = CallRequestForWorkOrder.fromJson(listJson);
}
notifyListeners();
return callRequestForWorkOrder;
} catch (error) {
print(error);
return null;
}
}

@ -82,7 +82,7 @@ class Asset {
Department department;
String room;
String testsDay;
String purchasingPrice;
num purchasingPrice;
String nbv;
String currency;
String poNo;

@ -5,6 +5,8 @@ import 'package:test_sa/models/device/device_transfer_info.dart';
import 'package:test_sa/models/hospital.dart';
import 'package:test_sa/models/lookup.dart';
import '../timer_model.dart';
class DeviceTransfer {
int id;
String userId;
@ -53,14 +55,19 @@ class DeviceTransfer {
destDepartmentName: parsedJson["destDepartmentName"],
destFloor: parsedJson["destFloor"],
destRoom: parsedJson["destRoom"],
destSiteName: parsedJson["destSiteName"]
),
destSiteName: parsedJson["destSiteName"]),
sender: DeviceTransferInfo(
travelingHours: parsedJson["senderTravelingHours"],
comment: parsedJson["senderComment"],
workingHours: parsedJson["senderWorkingHours"],
startDate: parsedJson["senderStartDate"]==null ? null:DateTime.parse(parsedJson["senderStartDate"]),
endDate: parsedJson["senderEndDate"]==null ? null:DateTime.parse(parsedJson["senderEndDate"]),
timer: TimerModel(
startAt: DateTime.tryParse(parsedJson["senderStartDate"] ?? ""),
endAt: DateTime.tryParse(parsedJson["senderEndDate"] ?? ""),
durationInSecond: ((parsedJson["workingHours"] ?? 0) * 60 * 60).toInt(),
stopped: parsedJson["workingHours"] == null ? null : true,
),
// startDate: parsedJson["senderStartDate"] == null ? null : DateTime.parse(parsedJson["senderStartDate"]),
// endDate: parsedJson["senderEndDate"] == null ? null : DateTime.parse(parsedJson["senderEndDate"]),
userId: parsedJson["senderAssignedEmployeeId"],
userName: parsedJson["senderAssignedEmployeeName"],
assignedEmployeeName: parsedJson["senderAssignedEmployeeName"],
@ -80,8 +87,11 @@ class DeviceTransfer {
travelingHours: parsedJson["receiverTravelingHours"],
comment: parsedJson["receiverComment"],
workingHours: parsedJson["receiverWorkingHours"],
startDate: parsedJson["receiverStartDate"]==null ? null:DateTime.parse(parsedJson["receiverStartDate"]),
endDate: parsedJson["receiverEndDate"]==null ? null:DateTime.parse(parsedJson["receiverEndDate"]),
timer: parsedJson["receiverStartDate"] != null || parsedJson["receiverEndDate"] != null
? TimerModel(startAt: DateTime.tryParse(parsedJson["receiverStartDate"] ?? ""), endAt: DateTime.tryParse(parsedJson["receiverEndDate"] ?? ""))
: null,
// startDate: parsedJson["receiverStartDate"] == null ? null : DateTime.parse(parsedJson["receiverStartDate"]),
// endDate: parsedJson["receiverEndDate"] == null ? null : DateTime.parse(parsedJson["receiverEndDate"]),
userId: parsedJson["receiverAssignedEmployeeId"],
userName: parsedJson["receiverAssignedEmployeeName"],
assignedEmployeeName: parsedJson["receiverAssignedEmployeeName"],

@ -2,19 +2,22 @@ import 'package:test_sa/models/department.dart';
import 'package:test_sa/models/hospital.dart';
import 'package:test_sa/models/lookup.dart';
import '../timer_model.dart';
class DeviceTransferInfo {
String userId;
String comment;
Hospital client;
Department department;
String workingHours;
DateTime startDate;
DateTime endDate;
// DateTime startDate;
// DateTime endDate;
String travelingHours;
String userName;
String signature;
String assignedEmployeeName;
Lookup status;
TimerModel timer;
DeviceTransferInfo({
this.userId,
@ -23,12 +26,13 @@ class DeviceTransferInfo {
this.client,
this.userName,
this.travelingHours,
this.startDate,
this.endDate,
// this.startDate,
// this.endDate,
this.workingHours,
this.signature,
this.status,
this.assignedEmployeeName
this.assignedEmployeeName,
this.timer,
});
Map<String, String> toJson(bool isSender) {
@ -37,8 +41,10 @@ class DeviceTransferInfo {
if (comment != null && comment.isNotEmpty) body["${baseKey}comment"] = comment;
if (workingHours != null && workingHours.isNotEmpty) body["${baseKey}working_hours"] = workingHours;
if (startDate != null) body["${baseKey}start_date"] = startDate?.toIso8601String();
if (endDate != null) body["${baseKey}end_date"] = endDate?.toIso8601String();
// if (startDate != null) body["${baseKey}start_date"] = startDate?.toIso8601String();
// if (endDate != null) body["${baseKey}end_date"] = endDate?.toIso8601String();
if (timer?.startAt != null) body["${baseKey}start_date"] = timer?.startAt?.toIso8601String();
if (timer?.endAt != null) body["${baseKey}end_date"] = timer?.endAt?.toIso8601String();
if (travelingHours != null && travelingHours.isNotEmpty) body["${baseKey}travel_hours"] = travelingHours;
if (status != null) body["${baseKey}status"] = status.id.toString();
if (signature != null && signature.isNotEmpty) body["${baseKey}image"] = signature;
@ -57,8 +63,9 @@ class DeviceTransferInfo {
client = Hospital.fromHospital(old.client);
department = Department.fromDepartment(old.department);
workingHours = old.workingHours;
startDate = old.startDate;
endDate = old.endDate;
// startDate = old.startDate;
// endDate = old.endDate;
timer = old.timer;
travelingHours = old.travelingHours;
comment = old.comment;
if (withSignature) signature = old.signature;
@ -68,8 +75,14 @@ class DeviceTransferInfo {
factory DeviceTransferInfo.fromJson(Map<String, dynamic> parsedJson, String key) {
return DeviceTransferInfo(
workingHours: parsedJson["${key}working_hours"],
startDate: parsedJson["${key}start_date"],
endDate: parsedJson["${key}end_date"],
// startDate: parsedJson["${key}start_date"],
// endDate: parsedJson["${key}end_date"],
timer: TimerModel(
startAt: DateTime.tryParse(parsedJson["${key}start_date"] ?? ""),
endAt: DateTime.tryParse(parsedJson["${key}end_date"] ?? ""),
durationInSecond: ((parsedJson["${key}working_hours"] ?? 0) * 60 * 60).toInt(),
stopped: parsedJson["${key}working_hours"] == null || (parsedJson["${key}working_hours"] as String).isEmpty ? null : true,
),
travelingHours: parsedJson["${key}travel_hours"],
userName: parsedJson["${key}name"],
signature: parsedJson["${key}image"],

@ -117,7 +117,12 @@ class Pentry {
actualVisitDate: DateTime.tryParse(map["actualDate"] ?? ""),
expectedVisitDate: DateTime.tryParse(map["expectedDate"] ?? ""),
travelingHours: map["travelingHours"],
timer: TimerModel(startAt: DateTime.tryParse(map["startDate"] ?? ""), endAt: DateTime.tryParse(map["endDate"] ?? ""), durationInSecond: (int.tryParse(map["workingHours"] ?? "") ?? 0) * 60 * 60),
timer: TimerModel(
startAt: DateTime.tryParse(map["startDate"] ?? ""),
endAt: DateTime.tryParse(map["endDate"] ?? ""),
durationInSecond: (int.tryParse(map["workingHours"] ?? "") ?? 0) * 60 * 60,
stopped: map["workingHours"] == null ? null : true,
),
// contacts: contacts,
ppmCheckLists: ppmCheckLists,
calibrationTools: calibrationTools,

@ -13,8 +13,8 @@ class ServiceReport {
int id;
double operatingHours;
DateTime visitDate;
DateTime endDate;
DateTime startDate;
// DateTime endDate;
// DateTime startDate;
Lookup assetType;
Lookup callLastSituation;
Lookup currentSituation;
@ -45,10 +45,10 @@ class ServiceReport {
String reviewComment;
FaultDescription faultDescription;
ServiceReport(
{this.id,
ServiceReport({
this.id,
this.visitDate,
this.endDate,
// this.endDate,
this.assetType,
this.equipmentStatus,
this.type,
@ -76,9 +76,10 @@ class ServiceReport {
this.comment,
this.repairLocation,
this.travelingExpense,
this.startDate,
// this.startDate,
this.reviewComment,
this.faultDescription});
this.faultDescription,
});
Map<String, dynamic> toMap(ServiceRequest request) {
Map<String, dynamic> _map = {};
@ -139,9 +140,12 @@ class ServiceReport {
_map["engSignature"] = signatureEngineer;
_map["comment"] = comment;
_map["travelingExpenses"] = travelingExpense;
_map["startofWorkTime"] = startDate.toIso8601String();
_map["endofWorkTime"] = endDate.toIso8601String();
_map["workingHours"] = endDate?.difference(startDate)?.inHours ?? 0;
// _map["startofWorkTime"] = startDate.toIso8601String();
// _map["endofWorkTime"] = endDate.toIso8601String();
// _map["workingHours"] = endDate?.difference(startDate)?.inHours ?? 0;
if (timer?.startAt != null) _map["startofWorkTime"] = timer?.startAt?.toIso8601String();
if (timer?.endAt != null) _map["endofWorkTime"] = timer?.endAt?.toIso8601String();
_map["workingHours"] = workingHours;
_map["reviewComment"] = reviewComment;
return _map;
}
@ -192,8 +196,8 @@ class ServiceReport {
faultDescription: parsedJson['faultDescription'] != null ? FaultDescription.fromJson(parsedJson['faultDescription']) : null,
// faultDescription: parsedJson["faultDescription"],
startDate: DateTime.tryParse(parsedJson["startofWorkTime"]?? ""),
endDate: DateTime.tryParse(parsedJson["endofWorkTime"]??""),
// startDate: DateTime.tryParse(parsedJson["startofWorkTime"] ?? ""),
// endDate: DateTime.tryParse(parsedJson["endofWorkTime"] ?? ""),
//invoiceCode: parsedJson["invoice_code"],
//invoiceNumber: parsedJson["invoice_no"],
//jobSheetNumber: parsedJson["job_sheet_no"],
@ -206,7 +210,11 @@ class ServiceReport {
visitDate: DateTime.tryParse(parsedJson["visitDate"]),
workingHours: parsedJson["workingHours"],
timer: TimerModel(
startAt: DateTime.tryParse(parsedJson["startofWorkTime"]??""), endAt: DateTime.tryParse(parsedJson["endofWorkTime"]??""), durationInSecond: ((parsedJson["workingHours"] ?? 0) * 60 * 60).toInt()),
startAt: DateTime.tryParse(parsedJson["startofWorkTime"] ?? ""),
endAt: DateTime.tryParse(parsedJson["endofWorkTime"] ?? ""),
durationInSecond: ((parsedJson["workingHours"] ?? 0) * 60 * 60).toInt(),
stopped: parsedJson["workingHours"] == null ? null : true,
),
//workPreformed: parsedJson["work_performed"],
device: Device.fromJson(parsedJson["callRequest"]["asset"]),
signatureNurse: URLs.getFileUrl(parsedJson["nurseSignature"]),

@ -1,4 +1,5 @@
import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/models/timer_model.dart';
import '../fault_description.dart';
@ -21,8 +22,8 @@ class SearchWorkOrder {
this.currentSituation,
this.repairLocation,
this.reason,
this.startofWorkTime,
this.endofWorkTime,
// this.startofWorkTime,
// this.endofWorkTime,
this.workingHours,
this.travelingHours,
this.travelingExpenses,
@ -36,6 +37,7 @@ class SearchWorkOrder {
this.engSignature,
this.nurseSignature,
this.woParentDto,
this.timer,
});
SearchWorkOrder.fromJson(dynamic json) {
@ -66,8 +68,13 @@ class SearchWorkOrder {
currentSituation = json['currentSituation'] != null ? Lookup.fromJson(json['currentSituation']) : null;
repairLocation = json['repairLocation'] != null ? Lookup.fromJson(json['repairLocation']) : null;
reason = json['reason'] != null ? Lookup.fromJson(json['reason']) : null;
startofWorkTime = json['startofWorkTime'];
endofWorkTime = json['endofWorkTime'];
// startofWorkTime = json['startofWorkTime'];
// endofWorkTime = json['endofWorkTime'];
if (json['startofWorkTime'] != null || json['endofWorkTime'] != null) {
timer = TimerModel();
}
if (json['startofWorkTime'] != null) timer.startAt = DateTime.tryParse(json['startofWorkTime']);
if (json['endofWorkTime'] != null) timer.endAt = DateTime.tryParse(json['endofWorkTime']);
workingHours = json['workingHours'];
travelingHours = json['travelingHours'];
travelingExpenses = json['travelingExpenses'];
@ -121,8 +128,9 @@ class SearchWorkOrder {
if (wo.currentSituation != null) currentSituation = Lookup.fromJson((wo.currentSituation)?.toMap() ?? {});
repairLocation = Lookup.fromJson((wo.repairLocation ?? repairLocation)?.toMap() ?? {});
reason = Lookup.fromJson((wo.reason ?? reason)?.toMap() ?? {});
startofWorkTime = wo.startofWorkTime ?? startofWorkTime;
endofWorkTime = wo.endofWorkTime ?? endofWorkTime;
// startofWorkTime = wo.startofWorkTime ?? startofWorkTime;
// endofWorkTime = wo.endofWorkTime ?? endofWorkTime;
timer = wo.timer ?? timer;
workingHours = wo.workingHours ?? workingHours;
travelingHours = wo.travelingHours ?? travelingHours;
travelingExpenses = wo.travelingExpenses ?? travelingExpenses;
@ -155,8 +163,8 @@ class SearchWorkOrder {
Lookup currentSituation;
Lookup repairLocation;
Lookup reason;
String startofWorkTime;
String endofWorkTime;
// String startofWorkTime;
// String endofWorkTime;
num workingHours;
num travelingHours;
num travelingExpenses;
@ -170,6 +178,8 @@ class SearchWorkOrder {
String engSignature;
String nurseSignature;
WoParentDto woParentDto;
TimerModel timer;
SearchWorkOrder copyWith({
num id,
num parentWOId,
@ -188,8 +198,8 @@ class SearchWorkOrder {
Lookup currentSituation,
Lookup repairLocation,
Lookup reason,
String startofWorkTime,
String endofWorkTime,
// String startofWorkTime,
// String endofWorkTime,
num workingHours,
num travelingHours,
num travelingExpenses,
@ -203,6 +213,7 @@ class SearchWorkOrder {
String engSignature,
String nurseSignature,
WoParentDto woParentDto,
TimerModel timer,
}) =>
SearchWorkOrder(
id: id ?? this.id,
@ -222,8 +233,8 @@ class SearchWorkOrder {
currentSituation: currentSituation ?? this.currentSituation,
repairLocation: repairLocation ?? this.repairLocation,
reason: reason ?? this.reason,
startofWorkTime: startofWorkTime ?? this.startofWorkTime,
endofWorkTime: endofWorkTime ?? this.endofWorkTime,
// startofWorkTime: startofWorkTime ?? this.startofWorkTime,
// endofWorkTime: endofWorkTime ?? this.endofWorkTime,
workingHours: workingHours ?? this.workingHours,
travelingHours: travelingHours ?? this.travelingHours,
travelingExpenses: travelingExpenses ?? this.travelingExpenses,
@ -237,6 +248,7 @@ class SearchWorkOrder {
engSignature: engSignature ?? this.engSignature,
nurseSignature: nurseSignature ?? this.nurseSignature,
woParentDto: woParentDto ?? this.woParentDto,
timer: timer ?? this.timer,
);
Map<String, dynamic> toJson() {
final map = <String, dynamic>{};
@ -269,14 +281,16 @@ class SearchWorkOrder {
map['calllastSituation'] = calllastSituation.toMap();
}
map['currentSituation'] = currentSituation?.toMap();
if (repairLocation != null) {
if (repairLocation?.id != null) {
map['repairLocation'] = repairLocation.toMap();
}
if (reason != null) {
map['reason'] = reason.toMap();
}
map['startofWorkTime'] = startofWorkTime;
map['endofWorkTime'] = endofWorkTime;
// map['startofWorkTime'] = startofWorkTime;
// map['endofWorkTime'] = endofWorkTime;
map['startofWorkTime'] = timer?.startAt?.toIso8601String();
map['endofWorkTime'] = timer?.endAt?.toIso8601String();
map['workingHours'] = workingHours;
map['travelingHours'] = travelingHours;
map['travelingExpenses'] = travelingExpenses;

@ -2,6 +2,7 @@ class TimerModel {
DateTime startAt;
DateTime endAt;
int durationInSecond;
bool stopped;
TimerModel({this.startAt, this.endAt, this.durationInSecond});
TimerModel({this.startAt, this.endAt, this.durationInSecond, this.stopped});
}

@ -19,8 +19,7 @@ import 'package:test_sa/views/widgets/status/gas_refill/gas_status.dart';
import 'package:test_sa/views/widgets/titles/app_sub_title.dart';
import '../../../../controllers/localization/localization.dart';
import '../../../controllers/validator/validator.dart';
import '../../widgets/date_and_time/time_picker.dart';
import '../../widgets/timer/app_timer.dart';
class UpdateDeviceTransfer extends StatefulWidget {
final DeviceTransfer model;
@ -46,6 +45,13 @@ class _UpdateDeviceTransferState extends State<UpdateDeviceTransfer> {
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
_update() async {
if (_formModel?.workingHours == null || _formModel.workingHours.isEmpty) {
await Fluttertoast.showToast(msg: "Working Hours Timer Isn't Started");
return;
} else if ((_formModel?.timer?.stopped ?? false) == false) {
await Fluttertoast.showToast(msg: "Stop The Timer");
return;
}
_validate = true;
if (!_formKey.currentState.validate()) {
setState(() {});
@ -152,96 +158,23 @@ class _UpdateDeviceTransferState extends State<UpdateDeviceTransfer> {
const SizedBox(
height: 16,
),
ASubTitle(_subtitle.workingHours),
const SizedBox(height: 8),
Row(
children: [
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
const ASubTitle("Start of Work"),
SizedBox(
height: 8 * AppStyle.getScaleFactor(context),
),
ADateTimePicker(
date: _formModel.startDate,
from: DateTime.now().subtract(const Duration(days: 365)),
to: DateTime.now().add(const Duration(days: 365)),
onDateTimePicker: (date) {
_formModel.startDate = date;
_formModel.workingHours = ((_formModel.endDate?.difference(_formModel.startDate)?.inMinutes ?? 0) / 60)?.toStringAsFixed(2)?.toString() ?? 0;
setState(() {});
child: AppTimer(
timer: _formModel.timer,
onChange: (timer) async {
_formModel.timer = timer;
_formModel.workingHours = (((timer?.durationInSecond ?? 0) / 60) / 60)?.toStringAsFixed(2) ?? "0";
return true;
},
),
],
),
),
const SizedBox(width: 8),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
const ASubTitle("End of Work"),
SizedBox(
height: 8 * AppStyle.getScaleFactor(context),
),
ADateTimePicker(
date: _formModel.endDate,
from: DateTime.now().subtract(const Duration(days: 365)),
to: DateTime.now().add(const Duration(days: 365)),
onDateTimePicker: (date) {
_formModel.endDate = date;
_formModel.workingHours = ((_formModel.endDate?.difference(_formModel.startDate)?.inMinutes ?? 0) / 60)?.toStringAsFixed(2)?.toString() ?? 0;
setState(() {});
},
),
],
),
),
],
),
const SizedBox(height: 4),
ASubTitle(_subtitle.workingHours),
const SizedBox(height: 4),
ATextFormField(
initialValue: null,
textAlign: TextAlign.center,
hintText: _formModel.startDate == null ? "0" : ((_formModel.endDate?.difference(_formModel.startDate)?.inMinutes ?? 0) / 60)?.toStringAsFixed(2)?.toString() ?? "0",
enable: false,
style: Theme.of(context).textTheme.subtitle1,
//validator: (value) => Validator.isNumeric(value) ? null : _subtitle.requiredWord,
textInputType: TextInputType.number,
onSaved: (value) {
// _serviceReport.workHours = value;
},
),
// ASubTitle(_subtitle.workingHours),
// const SizedBox(
// height: 4,
// ),
// ATextFormField(
// initialValue: _formModel?.workingHours,
// textAlign: TextAlign.center,
// style: Theme.of(context).textTheme.subtitle1,
// textInputType: TextInputType.number,
// onSaved: (value) {
// _formModel.workingHours = value;
// },
// ),
// const SizedBox(height: 8,),
// const ASubTitle("Sender Department"),
// if(_validate && _formModel.senderDepartment == null)
// ASubTitle(_subtitle.requiredWord,color: Colors.red,),
// const SizedBox(height: 4,),
// DepartmentButton(
// department: _formModel.senderDepartment,
// onDepartmentPick: (department){
// _formModel.senderDepartment = department;
// setState(() {});
// },
// ),
const SizedBox(
height: 8,
),
const SizedBox(height: 16),
ASubTitle(_subtitle.status),
const SizedBox(
height: 4,
@ -249,8 +182,7 @@ class _UpdateDeviceTransferState extends State<UpdateDeviceTransfer> {
GasStatusMenu(
initialValue: _formModel.status,
onSelect: (status) {
if(status==null)
return;
if (status == null) return;
_formModel.status = status;
setState(() {});
},

@ -74,7 +74,7 @@ class _CreateSubWorkOrderPageState extends State<CreateSubWorkOrderPage> {
_callRequestForWorkOrder = await Provider.of<ServiceRequestsProvider>(context).getCallRequestForWorkOrder(callId: widget.workOrder.callRequest.id.toString());
await assetTypesProvider.getTypes();
_subWorkOrders?.assetType = assetTypesProvider.statuses?.firstWhere(
(element) => element.value == _callRequestForWorkOrder.assetType,
(element) => element.value == _callRequestForWorkOrder?.assetType,
orElse: () => null,
);
setState(() {
@ -223,8 +223,7 @@ class _CreateSubWorkOrderPageState extends State<CreateSubWorkOrderPage> {
initialValue: _subWorkOrders?.faultDescription,
onSelect: (status) {
_subWorkOrders.faultDescription = status;
if(mounted)
setState(() {});
if (mounted) setState(() {});
},
),
],
@ -318,11 +317,8 @@ class _CreateSubWorkOrderPageState extends State<CreateSubWorkOrderPage> {
_validate = true;
setState(() {});
if (validate()) {
if (_subWorkOrders.startofWorkTime == null) {
Fluttertoast.showToast(msg: "${subtitle.startDate} required");
return;
} else if (_subWorkOrders.endofWorkTime == null) {
Fluttertoast.showToast(msg: "${subtitle.endDate} required");
if (_subWorkOrders.timer?.startAt == null || _subWorkOrders.timer?.endAt == null) {
Fluttertoast.showToast(msg: "Working hours required");
return;
} else if (_subWorkOrders.calllastSituation == null) {
Fluttertoast.showToast(msg: "${subtitle.callLastSituation} required");

@ -135,8 +135,6 @@ class _SparePartsBottomSheetState extends State<SparePartsBottomSheet> {
return PartItem(
part: part,
onEdit: (qty) {
print("sss${spare.qty}");
print(qty);
spare.qty = qty;
},
onDelete: (part) {

@ -1,4 +1,5 @@
import 'package:flutter/material.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:provider/provider.dart';
import 'package:test_sa/models/service_request/search_work_order.dart';
import 'package:test_sa/models/subtitle.dart';
@ -10,8 +11,7 @@ import 'package:test_sa/views/widgets/status/report/service_report_repair_locati
import '../../../controllers/localization/localization.dart';
import '../../../controllers/providers/api/status_drop_down/report/service_report_maintenance_situation_provider.dart';
import '../../app_style/sizing.dart';
import '../../widgets/date_and_time/time_picker.dart';
import '../../widgets/timer/app_timer.dart';
import '../../widgets/titles/app_sub_title.dart';
class WorkOrderDetailsBottomSheet extends StatefulWidget {
@ -78,75 +78,23 @@ class _WorkOrderDetailsBottomSheetState extends State<WorkOrderDetailsBottomShee
},
),
const SizedBox(height: 8),
ASubTitle(subtitle.workingHours),
const SizedBox(height: 8),
Row(
children: [
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
const ASubTitle("Start of Work"),
SizedBox(
height: 8 * AppStyle.getScaleFactor(context),
),
ADateTimePicker(
date: DateTime.tryParse(_workOrder.startofWorkTime ?? ""),
from: DateTime.now().subtract(const Duration(days: 365)),
to: DateTime.now(),
onDateTimePicker: (date) {
_workOrder.startofWorkTime = date?.toIso8601String();
setState(() {});
},
),
],
),
),
const SizedBox(width: 8),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
const ASubTitle("End of Work"),
SizedBox(
height: 8 * AppStyle.getScaleFactor(context),
),
ADateTimePicker(
date: DateTime.tryParse(_workOrder.endofWorkTime ?? ""),
from: DateTime.now().subtract(const Duration(days: 365)),
to: DateTime.now(),
onDateTimePicker: (date) {
_workOrder.endofWorkTime = date?.toIso8601String();
setState(() {});
child: AppTimer(
timer: _workOrder.timer,
onChange: (timer) async {
_workOrder.timer = timer;
_workOrder.workingHours = num.tryParse((((timer?.durationInSecond ?? 0) / 60) / 60)?.toStringAsFixed(2) ?? "0");
return true;
},
),
],
),
),
],
),
const SizedBox(height: 8),
ASubTitle(subtitle.workingHours),
const SizedBox(height: 4),
ATextFormField(
textAlign: TextAlign.center,
labelText: _workOrder.startofWorkTime == null
? "0"
: ((DateTime.tryParse(_workOrder.endofWorkTime ?? "")?.difference(DateTime.tryParse(_workOrder.startofWorkTime ?? ""))?.inMinutes ?? 0) / 60)
?.toStringAsFixed(2)
?.toString() ??
"0",
enable: false,
style: Theme.of(context).textTheme.titleMedium,
// validator: (value) => Validator.isNumeric(value) ? null : _subtitle.requiredWord,
textInputType: TextInputType.number,
onSaved: (value) {
_workOrder.workingHours = double.tryParse(
((DateTime.tryParse(_workOrder.endofWorkTime ?? "")?.difference(DateTime.tryParse(_workOrder.startofWorkTime ?? ""))?.inMinutes ?? 0) / 60)
?.toStringAsFixed(2)
?.toString() ??
"0");
},
),
const SizedBox(height: 8),
const SizedBox(height: 16),
ATextFormField(
labelText: "Travel Hours",
initialValue: _workOrder.travelingHours?.toString(),
@ -206,6 +154,13 @@ class _WorkOrderDetailsBottomSheetState extends State<WorkOrderDetailsBottomShee
AButton(
text: subtitle.submit,
onPressed: () async {
if (_workOrder?.workingHours == null) {
await Fluttertoast.showToast(msg: "Working Hours Timer Isn't Started");
return;
} else if ((_workOrder?.timer?.stopped ?? false) == false) {
await Fluttertoast.showToast(msg: "Stop The Timer");
return;
}
_formKey.currentState.save();
widget.subWorkOrder.copyFrom(_workOrder);
Navigator.pop(context);

@ -288,73 +288,73 @@ class _RequestGasRefillState extends State<RequestGasRefill> {
),
],
),
if (_userProvider.user?.type == UsersTypes.engineer)
Column(
children: [
Row(
children: [
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
const ASubTitle("Start of Work"),
SizedBox(
height: 8 * AppStyle.getScaleFactor(context),
),
ADateTimePicker(
date: _gasRefillProvider.startDate,
from: DateTime.now().subtract(const Duration(days: 365)),
to: DateTime.now().add(const Duration(days: 365)),
onDateTimePicker: (date) {
_gasRefillProvider.startDate = date;
setState(() {});
},
),
],
),
),
const SizedBox(width: 8),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
const ASubTitle("End of Work"),
SizedBox(
height: 8 * AppStyle.getScaleFactor(context),
),
ADateTimePicker(
date: _gasRefillProvider.endDate,
from: DateTime.now().subtract(const Duration(days: 365)),
to: DateTime.now().add(const Duration(days: 365)),
onDateTimePicker: (date) {
_gasRefillProvider.endDate = date;
setState(() {});
},
),
],
),
),
],
),
const SizedBox(height: 8),
ASubTitle(_subtitle.workingHours),
const SizedBox(height: 4),
ATextFormField(
initialValue: null,
textAlign: TextAlign.center,
hintText: _gasRefillProvider.startDate == null
? "0"
: ((_gasRefillProvider.endDate?.difference(_gasRefillProvider.startDate)?.inMinutes ?? 0) / 60)?.toStringAsFixed(2)?.toString() ?? "0",
enable: false,
style: Theme.of(context).textTheme.subtitle1,
validator: (value) => Validator.isNumeric(value) ? null : _subtitle.requiredWord,
textInputType: TextInputType.number,
onSaved: (value) {
// _serviceReport.workHours = value;
},
),
],
),
// if (_userProvider.user?.type == UsersTypes.engineer)
// Column(
// children: [
// Row(
// children: [
// Expanded(
// child: Column(
// crossAxisAlignment: CrossAxisAlignment.stretch,
// children: [
// const ASubTitle("Start of Work"),
// SizedBox(
// height: 8 * AppStyle.getScaleFactor(context),
// ),
// ADateTimePicker(
// date: _gasRefillProvider.startDate,
// from: DateTime.now().subtract(const Duration(days: 365)),
// to: DateTime.now().add(const Duration(days: 365)),
// onDateTimePicker: (date) {
// _gasRefillProvider.startDate = date;
// setState(() {});
// },
// ),
// ],
// ),
// ),
// const SizedBox(width: 8),
// Expanded(
// child: Column(
// crossAxisAlignment: CrossAxisAlignment.stretch,
// children: [
// const ASubTitle("End of Work"),
// SizedBox(
// height: 8 * AppStyle.getScaleFactor(context),
// ),
// ADateTimePicker(
// date: _gasRefillProvider.endDate,
// from: DateTime.now().subtract(const Duration(days: 365)),
// to: DateTime.now().add(const Duration(days: 365)),
// onDateTimePicker: (date) {
// _gasRefillProvider.endDate = date;
// setState(() {});
// },
// ),
// ],
// ),
// ),
// ],
// ),
// const SizedBox(height: 8),
// ASubTitle(_subtitle.workingHours),
// const SizedBox(height: 4),
// ATextFormField(
// initialValue: null,
// textAlign: TextAlign.center,
// hintText: _gasRefillProvider.startDate == null
// ? "0"
// : ((_gasRefillProvider.endDate?.difference(_gasRefillProvider.startDate)?.inMinutes ?? 0) / 60)?.toStringAsFixed(2)?.toString() ?? "0",
// enable: false,
// style: Theme.of(context).textTheme.subtitle1,
// validator: (value) => Validator.isNumeric(value) ? null : _subtitle.requiredWord,
// textInputType: TextInputType.number,
// onSaved: (value) {
// // _serviceReport.workHours = value;
// },
// ),
// ],
// ),
if (widget.gasRefillModel == null)
Column(
crossAxisAlignment: CrossAxisAlignment.start,

@ -23,24 +23,21 @@ import 'package:test_sa/views/widgets/app_text_form_field.dart';
import 'package:test_sa/views/widgets/buttons/app_back_button.dart';
import 'package:test_sa/views/widgets/buttons/app_button.dart';
import 'package:test_sa/views/widgets/date_and_time/date_picker.dart';
import 'package:test_sa/views/widgets/date_and_time/time_picker.dart';
import 'package:test_sa/views/widgets/e_signature/e_signature.dart';
import 'package:test_sa/views/widgets/equipment/auto_complete_devices_field.dart';
import 'package:test_sa/views/widgets/images/mini_one_image_picker.dart';
import 'package:test_sa/views/widgets/loaders/loading_manager.dart';
import 'package:test_sa/views/widgets/parts/auto_complete_parts_field.dart';
import 'package:test_sa/views/widgets/parts/part_item.dart';
import 'package:test_sa/views/widgets/status/employee/engineers_mune.dart';
import 'package:test_sa/views/widgets/status/report/service_report_equipment_status.dart';
import 'package:test_sa/views/widgets/status/report/service_report_last_call.dart';
import 'package:test_sa/views/widgets/status/report/service_report_reasons.dart';
import 'package:test_sa/views/widgets/status/report/service_report_status.dart';
import 'package:test_sa/views/widgets/titles/app_sub_title.dart';
import '../../../../../controllers/providers/api/status_drop_down/report/service_types_provider.dart';
import '../../../../widgets/speech_to_text/speech_to_text.dart';
import '../../../../widgets/status/report/service_report_fault_description.dart';
import '../../../../widgets/status/report/service_report_repair_location.dart';
import '../../../../widgets/timer/app_timer.dart';
class CreateServiceReport extends StatefulWidget {
static final String id = "/create-service-report";
@ -418,71 +415,23 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
SizedBox(
height: 8 * AppStyle.getScaleFactor(context),
),
ASubTitle(_subtitle.workingHours),
const SizedBox(height: 8),
Row(
children: [
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
const ASubTitle("Start of Work"),
SizedBox(
height: 8 * AppStyle.getScaleFactor(context),
),
ADateTimePicker(
date: _serviceReport.startDate,
from: DateTime.now().subtract(const Duration(days: 365)),
to: DateTime.now().add(const Duration(days: 365)),
onDateTimePicker: (date) {
_serviceReport.startDate = date;
setState(() {});
child: AppTimer(
timer: _serviceReport.timer,
onChange: (timer) async {
_serviceReport.timer = timer;
_serviceReport.workingHours = num.tryParse((((timer?.durationInSecond ?? 0) / 60) / 60)?.toStringAsFixed(2) ?? "0");
return true;
},
),
],
),
),
const SizedBox(width: 8),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
const ASubTitle("End of Work"),
SizedBox(
height: 8 * AppStyle.getScaleFactor(context),
),
ADateTimePicker(
date: _serviceReport.endDate,
from: DateTime.now().subtract(const Duration(days: 365)),
to: DateTime.now().add(const Duration(days: 365)),
onDateTimePicker: (date) {
_serviceReport.endDate = date;
setState(() {});
},
),
],
),
),
],
),
const SizedBox(height: 8),
ASubTitle(_subtitle.workingHours),
const SizedBox(height: 4),
ATextFormField(
initialValue: null,
textAlign: TextAlign.center,
hintText: _serviceReport.startDate == null
? "0"
: ((_serviceReport?.endDate?.difference(_serviceReport?.startDate)?.inMinutes ?? 0) / 60)?.toStringAsFixed(2)?.toString() ?? "0",
enable: false,
style: Theme.of(context).textTheme.subtitle1,
validator: (value) => Validator.isNumeric(value) ? null : _subtitle.requiredWord,
textInputType: TextInputType.number,
onSaved: (value) {
// _serviceReport.workHours = value;
},
),
const SizedBox(
height: 8,
),
const SizedBox(height: 16),
// device sn
Visibility(
visible: widget.request.deviceSerialNumber == null,
@ -636,7 +585,7 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
enable: false,
hintText: _serviceReport.faultDescription?.workPerformed ?? "",
controller: _workPreformedController,
style: Theme.of(context).textTheme.subtitle1,
style: Theme.of(context).textTheme.titleMedium,
validator: (value) => Validator.hasValue(value) ? null : _subtitle.requiredWord,
textInputType: TextInputType.multiline,
onSaved: (value) {
@ -701,7 +650,7 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
),
ATextFormField(
initialValue: _serviceReport?.travelingExpense?.toString(),
hintText: _subtitle.travelingExpense,
hintText: "i.e 3, 3.5, 4",
textAlign: TextAlign.center,
style: Theme.of(context).textTheme.titleMedium,
textInputType: TextInputType.number,
@ -929,9 +878,9 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
),
Column(
children: List.generate(_serviceReport.parts.length, (index) {
Part _part = _serviceReport.parts[index];
Part part = _serviceReport.parts[index];
return PartItem(
part: _part,
part: part,
onDelete: (part) {
_serviceReport.parts.remove(part);
setState(() {});

@ -24,22 +24,17 @@ import 'package:test_sa/views/widgets/app_text_form_field.dart';
import 'package:test_sa/views/widgets/buttons/app_back_button.dart';
import 'package:test_sa/views/widgets/buttons/app_button.dart';
import 'package:test_sa/views/widgets/date_and_time/date_picker.dart';
import 'package:test_sa/views/widgets/date_and_time/time_picker.dart';
import 'package:test_sa/views/widgets/e_signature/e_signature.dart';
import 'package:test_sa/views/widgets/equipment/auto_complete_devices_field.dart';
import 'package:test_sa/views/widgets/images/mini_one_image_picker.dart';
import 'package:test_sa/views/widgets/loaders/loading_manager.dart';
import 'package:test_sa/views/widgets/parts/auto_complete_parts_field.dart';
import 'package:test_sa/views/widgets/parts/part_item.dart';
import 'package:test_sa/views/widgets/status/employee/engineers_mune.dart';
import 'package:test_sa/views/widgets/status/report/service_report_equipment_status.dart';
import 'package:test_sa/views/widgets/status/report/service_report_fault_description.dart';
import 'package:test_sa/views/widgets/status/report/service_report_last_call.dart';
import 'package:test_sa/views/widgets/status/report/service_report_reasons.dart';
import 'package:test_sa/views/widgets/status/report/service_report_repair_location.dart';
import 'package:test_sa/views/widgets/status/report/service_report_status.dart';
import 'package:test_sa/views/widgets/status/report/service_report_type.dart';
import 'package:test_sa/views/widgets/status/report/service_status.dart';
import 'package:test_sa/views/widgets/timer/app_timer.dart';
import 'package:test_sa/views/widgets/titles/app_sub_title.dart';
@ -617,71 +612,25 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
// },
// ),
// const SizedBox(height: 8,),
const SizedBox(height: 8),
ASubTitle(_subtitle.workingHours),
const SizedBox(height: 8),
Row(
children: [
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
const ASubTitle("Start of Work"),
SizedBox(
height: 8 * AppStyle.getScaleFactor(context),
),
ADateTimePicker(
date: _serviceReport.startDate,
from: DateTime.now().subtract(const Duration(days: 365)),
to: DateTime.now().add(const Duration(days: 365)),
onDateTimePicker: (date) {
_serviceReport.startDate = date;
setState(() {});
},
),
],
),
),
const SizedBox(width: 8),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
const ASubTitle("End of Work"),
SizedBox(
height: 8 * AppStyle.getScaleFactor(context),
),
ADateTimePicker(
date: _serviceReport.endDate,
from: DateTime.now().subtract(const Duration(days: 365)),
to: DateTime.now().add(const Duration(days: 365)),
onDateTimePicker: (date) {
_serviceReport.endDate = date;
setState(() {});
},
),
],
child: AppTimer(
timer: _serviceReport.timer,
enabled: false,
// onChange: (timer) async {
// _serviceReport.timer = timer;
// _serviceReport.workingHours = num.tryParse((((timer?.durationInSecond ?? 0) / 60) / 60)?.toStringAsFixed(2) ?? "0");
// return true;
// },
),
),
],
),
const SizedBox(height: 8),
ASubTitle(_subtitle.workingHours),
const SizedBox(height: 4),
ATextFormField(
initialValue: null,
textAlign: TextAlign.center,
hintText: _serviceReport.startDate == null
? "0"
: ((_serviceReport?.endDate?.difference(_serviceReport?.startDate)?.inMinutes ?? 0) / 60)?.toStringAsFixed(2)?.toString() ?? "0",
enable: false,
style: Theme.of(context).textTheme.subtitle1,
validator: (value) => Validator.isNumeric(value) ? null : _subtitle.requiredWord,
textInputType: TextInputType.number,
onSaved: (value) {
// _serviceReport.workHours = value;
},
),
const SizedBox(
height: 8,
),
const SizedBox(height: 16),
if (_showCommentField)
const SizedBox(
height: 8,
@ -711,8 +660,7 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
onSelect: (status) {
print("faluttt:${status?.toJson()}");
_serviceReport.faultDescription = status;
if(mounted)
setState(() {});
if (mounted) setState(() {});
},
),
const SizedBox(height: 8),
@ -1058,6 +1006,13 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
AButton(
text: _subtitle.update,
onPressed: () async {
if (_serviceReport?.workingHours == null) {
await Fluttertoast.showToast(msg: "Working Hours Timer Isn't Started");
return;
} else if ((_serviceReport?.timer?.stopped ?? false) == false) {
await Fluttertoast.showToast(msg: "Stop The Timer");
return;
}
_validate = true;
print("jere1245");
// if (!_formKey.currentState.validate()) {

@ -39,7 +39,11 @@ class _PartItemState extends State<PartItem> {
iconData: Icons.add,
color: Theme.of(context).primaryColor,
onPressed: () {
if (widget.onEdit == null) {
++widget.part.quantity;
} else {
widget.onEdit(++widget.part.quantity);
}
setState(() {});
},
),
@ -49,7 +53,11 @@ class _PartItemState extends State<PartItem> {
onPressed: widget.part.quantity < 2
? null
: () {
if (widget.onEdit == null) {
--widget.part.quantity;
} else {
widget.onEdit(--widget.part.quantity);
}
setState(() {});
},
),

@ -9,11 +9,13 @@ class AppTimer extends StatefulWidget {
final TimerModel timer;
final Future<bool> Function(TimerModel) onChange;
final TextStyle style;
final bool enabled;
const AppTimer({
Key key,
this.timer,
this.onChange,
this.style,
this.enabled = true,
}) : super(key: key);
@override
@ -32,7 +34,7 @@ class _AppTimerState extends State<AppTimer> {
_startTimer() async {
if (!_running) {
final time = DateTime.now();
bool result = await widget.onChange(TimerModel(startAt: time, endAt: null, durationInSecond: _delay));
bool result = await widget.onChange(TimerModel(startAt: time, endAt: null, durationInSecond: _delay, stopped: false));
if (!result) return;
_running = true;
@ -52,7 +54,7 @@ class _AppTimerState extends State<AppTimer> {
_stopTimer() async {
final time = DateTime.now();
final tempStartAt = _startAt.add(Duration(seconds: _delay));
bool result = await widget.onChange(TimerModel(startAt: tempStartAt, endAt: time, durationInSecond: _delay));
bool result = await widget.onChange(TimerModel(startAt: tempStartAt, endAt: time, durationInSecond: _delay, stopped: true));
if (!result) return;
_running = false;
_endAt = time;
@ -99,7 +101,7 @@ class _AppTimerState extends State<AppTimer> {
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 ? null : _onPressed,
onPressed: _loading || widget.enabled == false ? null : _onPressed,
child: _loading
? const SizedBox.square(
dimension: 18,
@ -108,7 +110,7 @@ class _AppTimerState extends State<AppTimer> {
))
: Row(
children: [
Icon(_running ? Icons.pause : Icons.play_arrow),
if (widget.enabled) Icon(_running ? Icons.pause : Icons.play_arrow),
Expanded(
child: Center(
child: ValueListenableBuilder<String>(
@ -116,7 +118,7 @@ class _AppTimerState extends State<AppTimer> {
builder: (context, value, _) {
return Text(
value,
style: widget.style,
style: widget.enabled ? widget.style : widget.style?.copyWith(color: Colors.black54),
);
}),
),

Loading…
Cancel
Save