From 5823152c56c27a2c9d15ece27b641fd59f9fda96 Mon Sep 17 00:00:00 2001 From: Alex <78383757+Lextical@users.noreply.github.com> Date: Tue, 7 Apr 2026 04:12:29 -0600 Subject: [PATCH] updated search for service to call api --- .../petstoremobile/api/ServiceApi.java | 4 +- .../listfragments/ServiceFragment.java | 54 +++++++-------- .../AppointmentDetailFragment.java | 2 +- .../repositories/ServiceRepository.java | 4 +- .../viewmodels/ServiceViewModel.java | 4 +- .../src/main/res/layout/fragment_service.xml | 66 +++++++++++++++---- 6 files changed, 90 insertions(+), 44 deletions(-) diff --git a/android/app/src/main/java/com/example/petstoremobile/api/ServiceApi.java b/android/app/src/main/java/com/example/petstoremobile/api/ServiceApi.java index a8e4ed32..b659a95f 100644 --- a/android/app/src/main/java/com/example/petstoremobile/api/ServiceApi.java +++ b/android/app/src/main/java/com/example/petstoremobile/api/ServiceApi.java @@ -18,7 +18,9 @@ public interface ServiceApi { @GET("api/v1/services") Call> getAllServices( @Query("page") int page, - @Query("size") int size + @Query("size") int size, + @Query("q") String query, + @Query("sort") String sort ); // Get service by id diff --git a/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/ServiceFragment.java b/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/ServiceFragment.java index ff8e1bb5..bda282ce 100644 --- a/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/ServiceFragment.java +++ b/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/ServiceFragment.java @@ -34,7 +34,6 @@ public class ServiceFragment extends Fragment implements ServiceAdapter.OnServic private FragmentServiceBinding binding; private List serviceList = new ArrayList<>(); - private List filteredList = new ArrayList<>(); private ServiceAdapter adapter; private ServiceViewModel viewModel; @@ -58,6 +57,7 @@ public class ServiceFragment extends Fragment implements ServiceAdapter.OnServic setupRecyclerView(); setupSearch(); setupSwipeRefresh(); + setupFilterToggle(); loadServiceData(); //Add button to opens the add dialog @@ -83,6 +83,24 @@ public class ServiceFragment extends Fragment implements ServiceAdapter.OnServic binding = null; } + /** + * Sets up the filter toggle button to show/hide the filter layout. + */ + private void setupFilterToggle() { + binding.btnToggleFilter.setOnClickListener(v -> { + if (binding.layoutFilter.getVisibility() == View.GONE) { + binding.layoutFilter.setVisibility(View.VISIBLE); + binding.btnToggleFilter.setImageResource(android.R.drawable.ic_menu_close_clear_cancel); + } else { + binding.layoutFilter.setVisibility(View.GONE); + binding.btnToggleFilter.setImageResource(android.R.drawable.ic_menu_search); + + // Reset search when closing + binding.etSearchService.setText(""); + } + }); + } + /** * Configures the search bar for filtering. */ @@ -90,31 +108,12 @@ public class ServiceFragment extends Fragment implements ServiceAdapter.OnServic binding.etSearchService.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) {} @Override public void onTextChanged(CharSequence s, int start, int before, int count) { - filterServices(s.toString()); + loadServiceData(); } @Override public void afterTextChanged(Editable s) {} }); } - /** - * Filters the service list based on the search query across name and description fields. - */ - private void filterServices(String query) { - filteredList.clear(); - if (query.isEmpty()) { - filteredList.addAll(serviceList); - } else { - String lower = query.toLowerCase(); - for (ServiceDTO s : serviceList) { - if ((s.getServiceName() != null && s.getServiceName().toLowerCase().contains(lower)) - || (s.getServiceDesc() != null && s.getServiceDesc().toLowerCase().contains(lower))) { - filteredList.add(s); - } - } - } - adapter.notifyDataSetChanged(); - } - /** * Sets up the SwipeRefreshLayout to allow manual reloading of service data. */ @@ -131,7 +130,7 @@ public class ServiceFragment extends Fragment implements ServiceAdapter.OnServic //if editing a service, add the service id to the bundle if (position != -1) { - ServiceDTO service = filteredList.get(position); + ServiceDTO service = serviceList.get(position); args.putLong("serviceId", service.getServiceId()); } @@ -150,8 +149,11 @@ public class ServiceFragment extends Fragment implements ServiceAdapter.OnServic * Fetches all service data from the server through the ViewModel and updates the UI. */ private void loadServiceData() { - //Load all services from the backend using viewModel - viewModel.getAllServices(0, 100).observe(getViewLifecycleOwner(), resource -> { + String query = binding.etSearchService != null ? binding.etSearchService.getText().toString().trim() : ""; + if (query.isEmpty()) query = null; + + //Load services from the backend with query and default sort + viewModel.getAllServices(0, 100, query, "serviceName").observe(getViewLifecycleOwner(), resource -> { if (resource == null) return; // Check the status to see if the resource is loaded and display the data @@ -166,7 +168,7 @@ public class ServiceFragment extends Fragment implements ServiceAdapter.OnServic if (resource.data != null) { serviceList.clear(); serviceList.addAll(resource.data.getContent()); - filterServices(binding.etSearchService != null ? binding.etSearchService.getText().toString() : ""); + adapter.notifyDataSetChanged(); } break; case ERROR: @@ -185,7 +187,7 @@ public class ServiceFragment extends Fragment implements ServiceAdapter.OnServic * Initializes the RecyclerView with a layout manager and adapter for services. */ private void setupRecyclerView() { - adapter = new ServiceAdapter(filteredList, this); + adapter = new ServiceAdapter(serviceList, this); binding.recyclerViewServices.setLayoutManager(new LinearLayoutManager(getContext())); binding.recyclerViewServices.setAdapter(adapter); } diff --git a/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/detailfragments/AppointmentDetailFragment.java b/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/detailfragments/AppointmentDetailFragment.java index 3b757b87..d497f529 100644 --- a/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/detailfragments/AppointmentDetailFragment.java +++ b/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/detailfragments/AppointmentDetailFragment.java @@ -155,7 +155,7 @@ public class AppointmentDetailFragment extends Fragment { * Loads the list of services from the API. */ private void loadServices() { - serviceViewModel.getAllServices(0, 200).observe(getViewLifecycleOwner(), resource -> { + serviceViewModel.getAllServices(0, 200, null, "serviceName").observe(getViewLifecycleOwner(), resource -> { if (resource.status == Resource.Status.SUCCESS && resource.data != null) { serviceList = resource.data.getContent(); refreshServiceSpinner(); diff --git a/android/app/src/main/java/com/example/petstoremobile/repositories/ServiceRepository.java b/android/app/src/main/java/com/example/petstoremobile/repositories/ServiceRepository.java index eac8bb32..7787c36a 100644 --- a/android/app/src/main/java/com/example/petstoremobile/repositories/ServiceRepository.java +++ b/android/app/src/main/java/com/example/petstoremobile/repositories/ServiceRepository.java @@ -23,8 +23,8 @@ public class ServiceRepository extends BaseRepository { /** * Retrieves a paginated list of all services from the API. */ - public LiveData>> getAllServices(int page, int size) { - return executeCall(serviceApi.getAllServices(page, size)); + public LiveData>> getAllServices(int page, int size, String query, String sort) { + return executeCall(serviceApi.getAllServices(page, size, query, sort)); } /** diff --git a/android/app/src/main/java/com/example/petstoremobile/viewmodels/ServiceViewModel.java b/android/app/src/main/java/com/example/petstoremobile/viewmodels/ServiceViewModel.java index be4cee20..142ac85b 100644 --- a/android/app/src/main/java/com/example/petstoremobile/viewmodels/ServiceViewModel.java +++ b/android/app/src/main/java/com/example/petstoremobile/viewmodels/ServiceViewModel.java @@ -24,8 +24,8 @@ public class ServiceViewModel extends ViewModel { /** * Fetches a paginated list of all services. */ - public LiveData>> getAllServices(int page, int size) { - return repository.getAllServices(page, size); + public LiveData>> getAllServices(int page, int size, String query, String sort) { + return repository.getAllServices(page, size, query, sort); } /** diff --git a/android/app/src/main/res/layout/fragment_service.xml b/android/app/src/main/res/layout/fragment_service.xml index a74f261a..46e7b524 100644 --- a/android/app/src/main/res/layout/fragment_service.xml +++ b/android/app/src/main/res/layout/fragment_service.xml @@ -29,27 +29,69 @@ android:contentDescription="Open menu"/> + android:textStyle="bold" + android:layout_marginStart="8dp"/> + + - + android:orientation="vertical" + android:paddingStart="12dp" + android:paddingEnd="12dp" + android:paddingTop="10dp" + android:paddingBottom="10dp" + android:visibility="gone" + android:background="@color/primary_dark" + android:elevation="4dp"> + + + + + + + + + +