initial your tenders
This commit is contained in:
@@ -16,7 +16,7 @@ class AppConfig {
|
||||
// // Handle different platforms for local development
|
||||
if (kIsWeb) {
|
||||
// For web, use localhost
|
||||
return 'http://localhost:8081';
|
||||
return 'http://localhost:8090';
|
||||
} else {
|
||||
// For Android emulator, use 10.0.2.2 (special IP for host machine)
|
||||
return 'http://10.0.2.2:8081';
|
||||
|
||||
@@ -3,10 +3,25 @@ import 'package:tm_app/data/services/model/tender_approvals_response/tender_appr
|
||||
import 'package:tm_app/data/services/your_tenders_service.dart';
|
||||
|
||||
class YourTendersRepository {
|
||||
final YourTendersService yourTendersService;
|
||||
YourTendersRepository({required this.yourTendersService});
|
||||
final YourTendersService _yourTendersService;
|
||||
YourTendersRepository({required YourTendersService yourTendersService})
|
||||
: _yourTendersService = yourTendersService;
|
||||
|
||||
Future<Result<TenderApprovalsResponse>> getApprovedTenders() {
|
||||
return yourTendersService.getApprovedTenders();
|
||||
return _yourTendersService.getApprovedTenders();
|
||||
}
|
||||
|
||||
Future<Result<TenderApprovalsResponse>> getTenders({
|
||||
required int limit,
|
||||
required int offset,
|
||||
required String createdFrom,
|
||||
required String createdTo,
|
||||
}) {
|
||||
return _yourTendersService.getTenders(
|
||||
limit: limit,
|
||||
offset: offset,
|
||||
createdFrom: createdFrom,
|
||||
createdTo: createdTo,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,4 +1,18 @@
|
||||
class YourTendersApi {
|
||||
static const String tenderApprovalsStatus =
|
||||
'/api/v1/tender-approvals?status=submitted';
|
||||
|
||||
static const String tenderApproval = '/api/v1/tender-approvals';
|
||||
|
||||
static String getTenders({
|
||||
required int limit,
|
||||
required int offset,
|
||||
required String createdFrom,
|
||||
required String createdTo,
|
||||
}) {
|
||||
if (createdFrom.isNotEmpty && createdTo.isNotEmpty) {
|
||||
return '$tenderApproval?limit=$limit&offset=$offset&created_from=$createdFrom&created_to=$createdTo';
|
||||
}
|
||||
return '$tenderApproval?limit=$limit&offset=$offset';
|
||||
}
|
||||
}
|
||||
|
||||
@@ -19,4 +19,23 @@ class YourTendersService {
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
Future<Result<TenderApprovalsResponse>> getTenders({
|
||||
required int limit,
|
||||
required int offset,
|
||||
required String createdFrom,
|
||||
required String createdTo,
|
||||
}) async {
|
||||
final result = await _networkManager.makeRequest(
|
||||
YourTendersApi.getTenders(
|
||||
limit: limit,
|
||||
offset: offset,
|
||||
createdFrom: createdFrom,
|
||||
createdTo: createdTo,
|
||||
),
|
||||
(json) => TenderApprovalsResponse.fromJson(json),
|
||||
method: 'GET',
|
||||
);
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,9 +6,7 @@ import 'package:tm_app/data/services/model/tender_approvals_response/tender_appr
|
||||
|
||||
class YourTendersViewModel with ChangeNotifier {
|
||||
final YourTendersRepository yourTendersRepository;
|
||||
YourTendersViewModel({required this.yourTendersRepository}) {
|
||||
getApprovedTenders();
|
||||
}
|
||||
YourTendersViewModel({required this.yourTendersRepository});
|
||||
|
||||
bool isLoading = false;
|
||||
String? errorMessage;
|
||||
@@ -20,10 +18,14 @@ class YourTendersViewModel with ChangeNotifier {
|
||||
final _fmt = DateFormat('yyyy/MM/dd');
|
||||
|
||||
String get startDateFormatted =>
|
||||
selectedDateRange?.start != null ? _fmt.format(selectedDateRange!.start) : 'YYYY/MM/DD';
|
||||
selectedDateRange?.start != null
|
||||
? _fmt.format(selectedDateRange!.start)
|
||||
: 'YYYY/MM/DD';
|
||||
|
||||
String get endDateFormatted =>
|
||||
selectedDateRange?.end != null ? _fmt.format(selectedDateRange!.end) : 'YYYY/MM/DD';
|
||||
selectedDateRange?.end != null
|
||||
? _fmt.format(selectedDateRange!.end)
|
||||
: 'YYYY/MM/DD';
|
||||
|
||||
Future<void> getApprovedTenders() async {
|
||||
isLoading = true;
|
||||
@@ -45,6 +47,35 @@ class YourTendersViewModel with ChangeNotifier {
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
Future<void> getTenders({
|
||||
required int limit,
|
||||
required int offset,
|
||||
required String createdFrom,
|
||||
required String createdTo,
|
||||
}) async {
|
||||
isLoading = true;
|
||||
notifyListeners();
|
||||
|
||||
final result = await yourTendersRepository.getTenders(
|
||||
limit: limit,
|
||||
offset: offset,
|
||||
createdFrom: createdFrom,
|
||||
createdTo: createdTo,
|
||||
);
|
||||
switch (result) {
|
||||
case Ok<TenderApprovalsResponse>():
|
||||
data = result.value;
|
||||
errorMessage = null;
|
||||
break;
|
||||
case Error<TenderApprovalsResponse>():
|
||||
errorMessage = result.error.toString();
|
||||
break;
|
||||
}
|
||||
|
||||
isLoading = false;
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
// --- Filter Actions ---
|
||||
void setDateRange(DateTimeRange? range) {
|
||||
selectedDateRange = range;
|
||||
|
||||
@@ -169,7 +169,8 @@ class TenderCard extends StatelessWidget {
|
||||
Widget _tenderDescription() {
|
||||
return Text(
|
||||
tender.description ?? '',
|
||||
maxLines: 7,
|
||||
maxLines: 4,
|
||||
overflow: TextOverflow.ellipsis,
|
||||
style: TextStyle(
|
||||
color: AppColors.grey70,
|
||||
fontSize: 16.0.sp(),
|
||||
|
||||
@@ -1,13 +1,35 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:tm_app/core/utils/size_config.dart';
|
||||
import 'package:tm_app/view_models/your_tenders_view_model.dart';
|
||||
import 'package:tm_app/views/shared/responsive_builder.dart';
|
||||
import 'package:tm_app/views/your_tenders/pages/your_tenders_desktop_page.dart';
|
||||
import 'package:tm_app/views/your_tenders/pages/your_tenders_mobile_page.dart';
|
||||
import 'package:tm_app/views/your_tenders/pages/your_tenders_tablet_page.dart';
|
||||
|
||||
class YourTendersScreen extends StatelessWidget {
|
||||
class YourTendersScreen extends StatefulWidget {
|
||||
const YourTendersScreen({super.key});
|
||||
|
||||
@override
|
||||
State<YourTendersScreen> createState() => _YourTendersScreenState();
|
||||
}
|
||||
|
||||
class _YourTendersScreenState extends State<YourTendersScreen> {
|
||||
late final YourTendersViewModel viewModel;
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
viewModel = context.read<YourTendersViewModel>();
|
||||
WidgetsBinding.instance.addPostFrameCallback((_) {
|
||||
viewModel.getTenders(
|
||||
limit: 10,
|
||||
offset: 0,
|
||||
createdFrom: '',
|
||||
createdTo: '',
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
SizeConfig.init(context);
|
||||
|
||||
@@ -64,7 +64,9 @@ class TendersFilterDialog extends StatelessWidget {
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Text(
|
||||
start == null ? YourTendersStrings.startDate : viewModel.startDateFormatted,
|
||||
start == null
|
||||
? YourTendersStrings.startDate
|
||||
: viewModel.startDateFormatted,
|
||||
style: TextStyle(
|
||||
fontSize: 16.0.sp(),
|
||||
fontWeight: FontWeight.w400,
|
||||
@@ -72,7 +74,9 @@ class TendersFilterDialog extends StatelessWidget {
|
||||
),
|
||||
),
|
||||
Text(
|
||||
end == null ? YourTendersStrings.endDate : viewModel.endDateFormatted,
|
||||
end == null
|
||||
? YourTendersStrings.endDate
|
||||
: viewModel.endDateFormatted,
|
||||
style: TextStyle(
|
||||
fontSize: 16.0.sp(),
|
||||
fontWeight: FontWeight.w400,
|
||||
@@ -158,6 +162,18 @@ class TendersFilterDialog extends StatelessWidget {
|
||||
isEnabled: true,
|
||||
onPressed: () {
|
||||
context.pop();
|
||||
if (vm.selectedStatus ==
|
||||
YourTendersStrings.tendersSubmitted) {
|
||||
vm.getApprovedTenders();
|
||||
}
|
||||
if (vm.selectedStatus == YourTendersStrings.all) {
|
||||
vm.getTenders(
|
||||
limit: 10,
|
||||
offset: 0,
|
||||
createdFrom: vm.startDateFormatted,
|
||||
createdTo: vm.endDateFormatted,
|
||||
);
|
||||
}
|
||||
},
|
||||
text: YourTendersStrings.confirm,
|
||||
textColor: AppColors.mainBlue,
|
||||
|
||||
Reference in New Issue
Block a user