search logic added to desktop tenders

This commit is contained in:
amirrezaghabeli
2025-09-22 09:28:09 +03:30
parent 2e2718a92e
commit f70229ab30
9 changed files with 200 additions and 51 deletions
+35 -6
View File
@@ -1,3 +1,5 @@
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart';
import 'package:provider/provider.dart';
@@ -61,7 +63,9 @@ class _DesktopTendersPageState extends State<DesktopTendersPage> {
builder: (context, vm, child) {
if (vm.isLoading) {
return const Center(
child: CircularProgressIndicator(color: AppColors.jellyBean),
child: CircularProgressIndicator(
color: AppColors.jellyBean,
),
);
}
if (vm.errorMessage != null) {
@@ -105,18 +109,43 @@ class _DesktopTendersPageState extends State<DesktopTendersPage> {
}
}
class _SearchBox extends StatelessWidget {
class _SearchBox extends StatefulWidget {
const _SearchBox();
@override
State<_SearchBox> createState() => _SearchBoxState();
}
class _SearchBoxState extends State<_SearchBox> {
final TextEditingController _searchController = TextEditingController();
Timer? _debounceTimer;
@override
void dispose() {
_searchController.dispose();
_debounceTimer?.cancel();
super.dispose();
}
void _onSearchChanged(String query) {
_debounceTimer?.cancel();
_debounceTimer = Timer(const Duration(milliseconds: 500), () {
final viewModel = context.read<TendersViewModel>();
viewModel.searchTenders(query);
});
}
@override
Widget build(BuildContext context) {
return SizedBox(
height: 48.0.h(),
width: 680,
child: TextField(
style: TextStyle(fontSize: 16.0.sp(), color: AppColors.grey0),
controller: _searchController,
onChanged: _onSearchChanged,
style: TextStyle(fontSize: 16.0.sp(), color: AppColors.grey60),
decoration: InputDecoration(
hintText: 'Search',
hintText: TendersStrings.search,
hintStyle: TextStyle(fontSize: 16.0.sp(), color: AppColors.grey60),
prefixIcon: Padding(
padding: EdgeInsets.all(12.0.w()),
@@ -221,8 +250,8 @@ class _DesktopPagination extends StatelessWidget {
onTap: () async {
final selectedPage = await showDialog<int>(
context: context,
builder: (context) =>
PageSelectionDialog(totalPages: totalPages),
builder:
(context) => PageSelectionDialog(totalPages: totalPages),
);
if (selectedPage != null) {
onPageSelected(selectedPage);
+19 -1
View File
@@ -1,13 +1,31 @@
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:tm_app/views/shared/responsive_builder.dart';
import '../../../view_models/tenders_view_model.dart';
import 'd_tenders_page.dart';
import 'm_tenders_page.dart';
import 't_tenders_page.dart';
class TendersScreen extends StatelessWidget {
class TendersScreen extends StatefulWidget {
const TendersScreen({super.key});
@override
State<TendersScreen> createState() => _TendersScreenState();
}
class _TendersScreenState extends State<TendersScreen> {
late final TendersViewModel viewModel;
@override
void initState() {
viewModel = context.read<TendersViewModel>();
WidgetsBinding.instance.addPostFrameCallback((_) {
viewModel.getTenders(context: context);
});
super.initState();
}
@override
Widget build(BuildContext context) {
return const ResponsiveBuilder(
@@ -10,6 +10,7 @@ class TendersStrings {
static const String tenderDeadlineLabel = 'Deadline';
static const String contracts = 'Contracts';
static const String notifications = 'Notifications';
static const String of= 'Of';
static const String of = 'Of';
static const String page = 'Page';
static const String search = 'Search tenders...';
}