Refactor completion of documents routing and UI components

- Removed unused mobile route for completion of documents.
- Updated app routes to reflect the removal of the mobile route.
- Enhanced the desktop and mobile pages for completion of documents with improved layout and added TabletDesktopAppbar.
- Introduced meeting time handling in TenderDetailActions, integrating new bottom sheet and dialog components for better user interaction.
- Added meeting time state management in TenderDetailViewModel.
- Cleaned up deprecated files related to meeting time selection.
This commit is contained in:
amirrezaghabeli
2025-10-13 14:51:39 +03:30
parent be6b0bbe98
commit 919b9fb2ed
14 changed files with 448 additions and 282 deletions
@@ -3,30 +3,38 @@ import 'package:provider/provider.dart';
import 'package:tm_app/core/theme/colors.dart';
import 'package:tm_app/core/utils/size_config.dart';
import 'package:tm_app/view_models/tender_detail_view_model.dart';
import 'package:tm_app/views/detail/widgets/select_meeting_time_bottom_sheet.dart';
import 'package:tm_app/views/detail/widgets/show_select_meeting_time_bottom_sheet.dart';
import 'package:tm_app/views/detail/widgets/meeting_time_bottom_sheet.dart';
import 'package:tm_app/views/detail/widgets/meeting_time_dialog.dart';
import 'package:tm_app/views/shared/base_button.dart';
import 'package:tm_app/views/shared/select_submission_bottom_sheet.dart';
import '../../../core/constants/tender_approval_status.dart';
import '../../../core/constants/tender_submision_mode.dart';
import '../../../core/routes/app_routes.dart';
import '../../../core/utils/app_toast.dart';
import '../../../data/services/model/tender_data/tender_data.dart';
import '../../shared/select_submission_dialog.dart';
import '../strings/tender_details_strings.dart';
class TenderDetailActions extends StatelessWidget {
class TenderDetailActions extends StatefulWidget {
final bool isScreenBig;
final TenderData detail;
final TenderDetailViewModel viewModel;
const TenderDetailActions({
required this.isScreenBig,
required this.detail,
required this.viewModel,
super.key,
});
@override
State<TenderDetailActions> createState() => _TenderDetailActionsState();
}
class _TenderDetailActionsState extends State<TenderDetailActions> {
@override
Widget build(BuildContext context) {
return isScreenBig
return widget.isScreenBig
? _webActions()
: Column(
children: [
@@ -60,25 +68,34 @@ class TenderDetailActions extends StatelessWidget {
onConfirm: (String value) {
if (value ==
TenderSubmissionMode.selfApply.value) {
viewModel.submitTenderApproval(
tenderId: detail.id!,
submissionMode: value,
// viewModel.submitTenderApproval(
// tenderId: widget.detail.id!,
// submissionMode: value,
// );
const CompletionOfDocumentsRouteData().push(
context,
);
} else if (value ==
TenderSubmissionMode.partnership.value) {
Future.delayed(Duration.zero, () {
showDialog(
context: context,
builder: (context) {
return SelectMeetingTimeBottomSheet(
onConfirm: (String value) {
const CompletionOfDocumentsRouteData()
.push(context);
},
isDialog: false,
);
},
);
if (context.mounted) {
showModalBottomSheet(
context: context,
builder: (_) {
return MeetingTimeBottomSheet(
onConfirm: (value) {
AppToast.success(
context,
TenderDetailsStrings
.meetingTimeSuccessfullySet,
);
},
);
},
);
}
});
}
},
@@ -112,7 +129,7 @@ class TenderDetailActions extends StatelessWidget {
borderWidth: 1,
onPressed: () {
viewModel.rejectTenderApproval(
tenderId: detail.id!,
tenderId: widget.detail.id!,
submissionMode: TenderSubmissionMode.selfApply.value,
);
},
@@ -148,7 +165,7 @@ class TenderDetailActions extends StatelessWidget {
borderWidth: 1,
onPressed: () {
viewModel.rejectTenderApproval(
tenderId: detail.id!,
tenderId: widget.detail.id!,
submissionMode: TenderSubmissionMode.selfApply.value,
);
},
@@ -177,7 +194,7 @@ class TenderDetailActions extends StatelessWidget {
if (viewModel.status ==
TenderApprovalStatus.submitted.value) {
viewModel.submitTenderApproval(
tenderId: detail.id!,
tenderId: widget.detail.id!,
submissionMode: TenderSubmissionMode.selfApply.value,
);
} else {
@@ -189,20 +206,29 @@ class TenderDetailActions extends StatelessWidget {
onConfirm: (String value) {
if (value ==
TenderSubmissionMode.selfApply.value) {
const FinalCompletionOfDocumentsRouteData()
.push(context);
if (context.mounted) {
const FinalCompletionOfDocumentsRouteData()
.push(context);
}
} else if (value ==
TenderSubmissionMode.partnership.value) {
WidgetsBinding.instance.addPostFrameCallback((
timeStamp,
) {
showSelectMeetingTimeDialog(
context: context,
onConfirm: (String value) {
const CompletionOfDocumentsRouteData()
.push(context);
},
);
Future.delayed(Duration.zero, () {
if (context.mounted) {
showDialog(
context: context,
builder: (context) {
return MeetingTimeDialog(
onConfirm: (value) {
AppToast.success(
context,
TenderDetailsStrings
.meetingTimeSuccessfullySet,
);
},
);
},
);
}
});
}
},
@@ -216,22 +242,36 @@ class TenderDetailActions extends StatelessWidget {
onConfirm: (String value) {
if (value ==
TenderSubmissionMode.selfApply.value) {
viewModel.submitTenderApproval(
tenderId: detail.id!,
submissionMode: value,
);
// viewModel.submitTenderApproval(
// tenderId: widget.detail.id!,
// submissionMode: value,
// );
if (context.mounted) {
const FinalCompletionOfDocumentsRouteData()
.push(context);
}
} else if (value ==
TenderSubmissionMode.partnership.value) {
showDialog(
context: context,
builder: (context) {
return SelectMeetingTimeBottomSheet(
onConfirm: (String value) {
const CompletionOfDocumentsRouteData()
.push(context);
return MeetingTimeBottomSheet(
onConfirm: (value) {
AppToast.success(
context,
TenderDetailsStrings
.meetingTimeSuccessfullySet,
);
},
isDialog: false,
);
// return MeetingTimeDialog(
// onConfirm: (String value) {
// if (context.mounted) {
// const CompletionOfDocumentsRouteData()
// .push(context);
// }
// },
// );
},
);
}