|
|
|
|
@ -1,3 +1,4 @@
|
|
|
|
|
import 'package:flutter/gestures.dart';
|
|
|
|
|
import 'package:flutter/material.dart';
|
|
|
|
|
import 'package:provider/provider.dart';
|
|
|
|
|
import 'package:test_sa/controllers/api_routes/urls.dart';
|
|
|
|
|
@ -8,12 +9,15 @@ import 'package:test_sa/extensions/text_extensions.dart';
|
|
|
|
|
import 'package:test_sa/extensions/widget_extensions.dart';
|
|
|
|
|
import 'package:test_sa/models/all_requests_and_count_model.dart';
|
|
|
|
|
import 'package:test_sa/models/new_models/task_request/task_request_model.dart';
|
|
|
|
|
import 'package:test_sa/modules/cm_module/utilities/service_request_utils.dart';
|
|
|
|
|
import 'package:test_sa/modules/cm_module/views/components/action_button/footer_action_button.dart';
|
|
|
|
|
import 'package:test_sa/new_views/common_widgets/default_app_bar.dart';
|
|
|
|
|
import 'package:test_sa/new_views/common_widgets/working_time_tile.dart';
|
|
|
|
|
import 'package:test_sa/providers/task_request_provider/task_request_provider.dart';
|
|
|
|
|
import 'package:test_sa/views/widgets/images/files_list.dart';
|
|
|
|
|
import 'package:test_sa/views/widgets/loaders/app_loading.dart';
|
|
|
|
|
import 'package:test_sa/views/widgets/requests/request_status.dart';
|
|
|
|
|
import 'package:test_sa/views/widgets/total_working_time_detail_bottomsheet.dart';
|
|
|
|
|
|
|
|
|
|
import '../../../../controllers/providers/api/user_provider.dart';
|
|
|
|
|
import '../../../../models/enums/user_types.dart';
|
|
|
|
|
@ -121,6 +125,7 @@ class _TaskRequestDetailsViewState extends State<TaskRequestDetailsView> {
|
|
|
|
|
],
|
|
|
|
|
),
|
|
|
|
|
],
|
|
|
|
|
showWorkingTime(taskModel?.taskJobActivityEngineerTimers ?? []),
|
|
|
|
|
if ((taskProvider.taskRequestModel?.taskJobContactPersons ?? []).isNotEmpty) ...[contactInfoCard(context, taskProvider.taskRequestModel!)],
|
|
|
|
|
if (taskProvider.taskRequestModel?.callComment != null) ...[
|
|
|
|
|
const Divider().defaultStyle(context),
|
|
|
|
|
@ -166,6 +171,53 @@ class _TaskRequestDetailsViewState extends State<TaskRequestDetailsView> {
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Widget showWorkingTime(List<TaskJobActivityEngineerTimer> timer) {
|
|
|
|
|
double totalWorkingHours = timer.fold<double>(0.0, (sum, item) {
|
|
|
|
|
if (item.startDate == null || item.endDate == null) return sum;
|
|
|
|
|
try {
|
|
|
|
|
final start = DateTime.parse(item.startDate!);
|
|
|
|
|
final end = DateTime.parse(item.endDate!);
|
|
|
|
|
|
|
|
|
|
final diffInHours = end.difference(start).inSeconds / 3600.0; // convert to hours
|
|
|
|
|
|
|
|
|
|
return sum + diffInHours;
|
|
|
|
|
} catch (_) {
|
|
|
|
|
return sum;
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
String totalHourString = (totalWorkingHours > 0.0) ? ServiceRequestUtils.formatTotalWorkingHours(totalWorkingHours) : totalWorkingHours.toString();
|
|
|
|
|
|
|
|
|
|
return RichText(
|
|
|
|
|
text: TextSpan(
|
|
|
|
|
text: "${context.translation.totalWorkingTime}: ",
|
|
|
|
|
style: TextStyle(
|
|
|
|
|
fontSize: 14.toScreenWidth, fontWeight: FontWeight.w500, fontStyle: FontStyle.normal, decoration: TextDecoration.none, color: context.isDark ? AppColor.neutral10 : AppColor.neutral20),
|
|
|
|
|
children: [
|
|
|
|
|
TextSpan(text: "$totalHourString ", style: AppTextStyles.bodyText),
|
|
|
|
|
const WidgetSpan(
|
|
|
|
|
child: Icon(Icons.info_outline_rounded, color: AppColor.primary10, size: 14),
|
|
|
|
|
),
|
|
|
|
|
],
|
|
|
|
|
),
|
|
|
|
|
).onPress(() => showModalBottomSheet(
|
|
|
|
|
context: context,
|
|
|
|
|
isDismissible: true,
|
|
|
|
|
shape: const RoundedRectangleBorder(
|
|
|
|
|
borderRadius: BorderRadius.vertical(top: Radius.circular(20)),
|
|
|
|
|
),
|
|
|
|
|
clipBehavior: Clip.antiAliasWithSaveLayer,
|
|
|
|
|
builder: (BuildContext context) => TotalWorkingTimeDetailBottomSheet(
|
|
|
|
|
timerList: timer.map((e) {
|
|
|
|
|
return TimerHistoryModel(
|
|
|
|
|
id: e.id,
|
|
|
|
|
startTime: e.startDate,
|
|
|
|
|
endTime: e.endDate,
|
|
|
|
|
workingHours: e.totalWorkingHour,
|
|
|
|
|
);
|
|
|
|
|
}).toList()),
|
|
|
|
|
));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Widget contactInfoCard(BuildContext context, TaskData? taskModel) {
|
|
|
|
|
return Column(
|
|
|
|
|
mainAxisSize: MainAxisSize.min,
|
|
|
|
|
|