From 526650bd98c0ee3d31c7c8ca2a28b57b0b62d29f Mon Sep 17 00:00:00 2001 From: Alex <78383757+Lextical@users.noreply.github.com> Date: Wed, 8 Apr 2026 00:22:25 -0600 Subject: [PATCH 1/6] fix minor bugs and UI inconsistancy --- .../adapters/EmployeeAdapter.java | 53 ++++--- .../petstoremobile/adapters/SaleAdapter.java | 8 +- .../example/petstoremobile/api/SaleApi.java | 5 +- .../listfragments/AnalyticsFragment.java | 2 +- .../fragments/listfragments/PetFragment.java | 3 + .../fragments/listfragments/SaleFragment.java | 135 +++++++++++----- .../listfragments/StaffFragment.java | 18 ++- .../AppointmentDetailFragment.java | 2 +- .../detailfragments/PetDetailFragment.java | 17 ++ .../ProductDetailFragment.java | 7 +- .../detailfragments/RefundFragment.java | 2 +- .../PetProfileFragment.java | 27 +++- .../repositories/SaleRepository.java | 4 +- .../viewmodels/SaleViewModel.java | 4 +- .../main/res/layout/fragment_pet_profile.xml | 35 ++++- .../app/src/main/res/layout/fragment_sale.xml | 110 ++++++++++--- .../src/main/res/layout/fragment_staff.xml | 66 ++++++-- .../app/src/main/res/layout/item_employee.xml | 148 ++++++++++-------- android/app/src/main/res/layout/item_sale.xml | 137 +++++++++------- android/app/src/res/layout/item_sale.xml | 101 ++++++++++++ .../backend/controller/SaleController.java | 3 +- .../backend/repository/SaleRepository.java | 7 +- .../petshop/backend/service/SaleService.java | 17 +- 23 files changed, 665 insertions(+), 246 deletions(-) create mode 100644 android/app/src/res/layout/item_sale.xml diff --git a/android/app/src/main/java/com/example/petstoremobile/adapters/EmployeeAdapter.java b/android/app/src/main/java/com/example/petstoremobile/adapters/EmployeeAdapter.java index e860e30e..3dca0d7c 100644 --- a/android/app/src/main/java/com/example/petstoremobile/adapters/EmployeeAdapter.java +++ b/android/app/src/main/java/com/example/petstoremobile/adapters/EmployeeAdapter.java @@ -2,10 +2,12 @@ package com.example.petstoremobile.adapters; import android.graphics.Color; import android.view.*; +import android.widget.ImageView; import android.widget.TextView; import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView; import com.example.petstoremobile.R; +import com.example.petstoremobile.databinding.ItemEmployeeBinding; import com.example.petstoremobile.dtos.EmployeeDTO; import java.util.List; @@ -24,47 +26,48 @@ public class EmployeeAdapter extends RecyclerView.Adapter listener.onEmployeeClick(position)); } diff --git a/android/app/src/main/java/com/example/petstoremobile/adapters/SaleAdapter.java b/android/app/src/main/java/com/example/petstoremobile/adapters/SaleAdapter.java index 503186be..deca5624 100644 --- a/android/app/src/main/java/com/example/petstoremobile/adapters/SaleAdapter.java +++ b/android/app/src/main/java/com/example/petstoremobile/adapters/SaleAdapter.java @@ -1,11 +1,12 @@ package com.example.petstoremobile.adapters; -import android.graphics.Color; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import androidx.annotation.NonNull; +import androidx.core.content.ContextCompat; import androidx.recyclerview.widget.RecyclerView; +import com.example.petstoremobile.R; import com.example.petstoremobile.databinding.ItemSaleBinding; import com.example.petstoremobile.dtos.SaleDTO; import java.util.List; @@ -53,11 +54,10 @@ public class SaleAdapter extends RecyclerView.Adapter listener.onSaleClick(position)); diff --git a/android/app/src/main/java/com/example/petstoremobile/api/SaleApi.java b/android/app/src/main/java/com/example/petstoremobile/api/SaleApi.java index 72bfd8f4..c7261b16 100644 --- a/android/app/src/main/java/com/example/petstoremobile/api/SaleApi.java +++ b/android/app/src/main/java/com/example/petstoremobile/api/SaleApi.java @@ -15,7 +15,10 @@ public interface SaleApi { @GET("api/v1/sales") Call> getAllSales( @Query("page") int page, - @Query("size") int size); + @Query("size") int size, + @Query("query") String query, + @Query("paymentMethod") String paymentMethod, + @Query("sortBy") String sortBy); @GET("api/v1/sales/{id}") Call getSaleById(@Path("id") Long id); diff --git a/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/AnalyticsFragment.java b/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/AnalyticsFragment.java index c9eca2dd..a1e49971 100644 --- a/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/AnalyticsFragment.java +++ b/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/AnalyticsFragment.java @@ -75,7 +75,7 @@ public class AnalyticsFragment extends Fragment { tvAvgTransaction.setText("..."); tvTotalItems.setText("..."); - RetrofitClient.getSaleApi(requireContext()).getAllSales(0, 1000) + RetrofitClient.getSaleApi(requireContext()).getAllSales(0, 1000, null, null, null) .enqueue(new Callback>() { public void onResponse(Call> c, Response> r) { diff --git a/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/PetFragment.java b/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/PetFragment.java index 578022c3..096f1212 100644 --- a/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/PetFragment.java +++ b/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/PetFragment.java @@ -19,6 +19,7 @@ import android.widget.Toast; import com.example.petstoremobile.R; import com.example.petstoremobile.adapters.PetAdapter; +import com.example.petstoremobile.api.auth.TokenManager; import com.example.petstoremobile.databinding.FragmentPetBinding; import com.example.petstoremobile.dtos.PetDTO; import com.example.petstoremobile.dtos.StoreDTO; @@ -48,6 +49,7 @@ public class PetFragment extends Fragment implements PetAdapter.OnPetClickListen private BulkDeleteHandler bulkDeleteHandler; @Inject @Named("baseUrl") String baseUrl; + @Inject TokenManager tokenManager; /** * Initializes the fragment and its associated ViewModels. @@ -272,6 +274,7 @@ public class PetFragment extends Fragment implements PetAdapter.OnPetClickListen private void setupRecyclerView() { adapter = new PetAdapter(petList, this); adapter.setBaseUrl(baseUrl); + adapter.setToken(tokenManager.getToken()); binding.recyclerViewPets.setLayoutManager(new LinearLayoutManager(getContext())); binding.recyclerViewPets.setAdapter(adapter); } diff --git a/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/SaleFragment.java b/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/SaleFragment.java index dc882fff..5908a5d8 100644 --- a/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/SaleFragment.java +++ b/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/SaleFragment.java @@ -7,11 +7,14 @@ import androidx.fragment.app.Fragment; import androidx.lifecycle.ViewModelProvider; import androidx.navigation.fragment.NavHostFragment; import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; import android.text.Editable; import android.text.TextWatcher; +import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.Toast; import com.example.petstoremobile.R; import com.example.petstoremobile.adapters.SaleAdapter; @@ -19,9 +22,11 @@ import com.example.petstoremobile.databinding.FragmentSaleBinding; import com.example.petstoremobile.dtos.SaleDTO; import com.example.petstoremobile.fragments.ListFragment; import com.example.petstoremobile.utils.Resource; +import com.example.petstoremobile.utils.SpinnerUtils; import com.example.petstoremobile.viewmodels.SaleViewModel; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import dagger.hilt.android.AndroidEntryPoint; @@ -29,12 +34,19 @@ import dagger.hilt.android.AndroidEntryPoint; @AndroidEntryPoint public class SaleFragment extends Fragment implements SaleAdapter.OnSaleClickListener { + private static final String TAG = "SaleFragment"; + private static final int PAGE_SIZE = 20; + private FragmentSaleBinding binding; - private List saleList = new ArrayList<>(); - private List filteredList = new ArrayList<>(); + private final List saleList = new ArrayList<>(); private SaleAdapter adapter; private SaleViewModel saleViewModel; + // Pagination + private int currentPage = 0; + private boolean isLastPage = false; + private boolean isLoading = false; + @Override public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { @@ -49,8 +61,10 @@ public class SaleFragment extends Fragment implements SaleAdapter.OnSaleClickLis setupRecyclerView(); setupSearch(); + setupPaymentMethodFilter(); setupSwipeRefresh(); - loadSales(); + setupFilterToggle(); + loadSales(true); binding.btnHamburger.setOnClickListener(v -> { Fragment parent = getParentFragment(); @@ -69,6 +83,28 @@ public class SaleFragment extends Fragment implements SaleAdapter.OnSaleClickLis NavHostFragment.findNavController(this).navigate(R.id.nav_refund)); } + 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); + binding.etSearchSale.setText(""); + binding.spinnerPaymentMethod.setSelection(0); + } + }); + } + + private void setupPaymentMethodFilter() { + List paymentMethods = Arrays.asList("Cash", "Card"); + SpinnerUtils.populateWhiteSpinner(requireContext(), binding.spinnerPaymentMethod, paymentMethods, + s -> s, "All Payments", null, s -> (long) s.hashCode()); + + SpinnerUtils.setupFilterSpinner(binding.spinnerPaymentMethod, () -> loadSales(true)); + } + @Override public void onDestroyView() { super.onDestroyView(); @@ -76,9 +112,24 @@ public class SaleFragment extends Fragment implements SaleAdapter.OnSaleClickLis } private void setupRecyclerView() { - adapter = new SaleAdapter(filteredList, this); + adapter = new SaleAdapter(saleList, this); binding.recyclerViewSales.setLayoutManager(new LinearLayoutManager(getContext())); binding.recyclerViewSales.setAdapter(adapter); + + binding.recyclerViewSales.addOnScrollListener(new RecyclerView.OnScrollListener() { + @Override + public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) { + if (dy <= 0) return; + LinearLayoutManager lm = (LinearLayoutManager) binding.recyclerViewSales.getLayoutManager(); + if (lm == null) return; + int visible = lm.getChildCount(); + int total = lm.getItemCount(); + int firstVis = lm.findFirstVisibleItemPosition(); + if (!isLoading && !isLastPage && (visible + firstVis) >= total - 3) { + loadSales(false); + } + } + }); } private void setupSearch() { @@ -87,50 +138,64 @@ public class SaleFragment extends Fragment implements SaleAdapter.OnSaleClickLis @Override public void afterTextChanged(Editable s) {} @Override public void onTextChanged(CharSequence s, int start, int before, int count) { - filterSales(s.toString()); + loadSales(true); } }); } - private void filterSales(String query) { - filteredList.clear(); - if (query.isEmpty()) { - filteredList.addAll(saleList); - } else { - String lower = query.toLowerCase(); - for (SaleDTO s : saleList) { - if ((s.getEmployeeName() != null && s.getEmployeeName().toLowerCase().contains(lower)) - || (s.getSaleDate() != null && s.getSaleDate().toLowerCase().contains(lower)) - || (s.getPaymentMethod() != null && s.getPaymentMethod().toLowerCase().contains(lower)) - || (s.getSaleId() != null && String.valueOf(s.getSaleId()).contains(lower))) { - filteredList.add(s); - } - } - } - if (adapter != null) adapter.notifyDataSetChanged(); - } - private void setupSwipeRefresh() { - binding.swipeRefreshSale.setOnRefreshListener(() -> { - loadSales(); - }); + binding.swipeRefreshSale.setOnRefreshListener(() -> loadSales(true)); } - private void loadSales() { - saleViewModel.getAllSales(0, 200).observe(getViewLifecycleOwner(), resource -> { - binding.swipeRefreshSale.setRefreshing(false); - if (resource.status == Resource.Status.SUCCESS && resource.data != null) { - saleList.clear(); - saleList.addAll(resource.data.getContent()); - filterSales(binding.etSearchSale.getText() != null - ? binding.etSearchSale.getText().toString() : ""); + private void loadSales(boolean reset) { + if (isLoading) return; + + if (reset) { + currentPage = 0; + isLastPage = false; + } + + String query = binding.etSearchSale != null ? binding.etSearchSale.getText().toString().trim() : ""; + if (query.isEmpty()) query = null; + + String paymentMethod = null; + if (binding.spinnerPaymentMethod.getSelectedItemPosition() > 0) { + paymentMethod = (String) binding.spinnerPaymentMethod.getSelectedItem(); + } + + saleViewModel.getAllSales(currentPage, PAGE_SIZE, query, paymentMethod, "saleDate,desc").observe(getViewLifecycleOwner(), resource -> { + if (resource == null) return; + + switch (resource.status) { + case LOADING: + isLoading = true; + binding.swipeRefreshSale.setRefreshing(true); + break; + case SUCCESS: + isLoading = false; + binding.swipeRefreshSale.setRefreshing(false); + if (resource.data != null) { + if (reset) saleList.clear(); + saleList.addAll(resource.data.getContent()); + adapter.notifyDataSetChanged(); + isLastPage = resource.data.isLast(); + if (!isLastPage) currentPage++; + } + break; + case ERROR: + isLoading = false; + binding.swipeRefreshSale.setRefreshing(false); + Log.e(TAG, "Error loading sales: " + resource.message); + Toast.makeText(getContext(), "Failed to load sales: " + resource.message, Toast.LENGTH_SHORT).show(); + break; } }); } @Override public void onSaleClick(int position) { - SaleDTO sale = filteredList.get(position); + if (position < 0 || position >= saleList.size()) return; + SaleDTO sale = saleList.get(position); Bundle args = new Bundle(); if (sale.getSaleId() != null) { args.putLong("saleId", sale.getSaleId()); diff --git a/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/StaffFragment.java b/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/StaffFragment.java index 1c8fcf4e..63879d9c 100644 --- a/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/StaffFragment.java +++ b/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/StaffFragment.java @@ -29,12 +29,15 @@ public class StaffFragment extends Fragment implements EmployeeAdapter.OnEmploye private EmployeeAdapter adapter; private SwipeRefreshLayout swipeRefresh; private EditText etSearch; + private LinearLayout layoutFilter; @Override public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_staff, container, false); + layoutFilter = view.findViewById(R.id.layoutFilterStaff); + setupRecyclerView(view); setupSearch(view); setupSwipeRefresh(view); @@ -46,6 +49,15 @@ public class StaffFragment extends Fragment implements EmployeeAdapter.OnEmploye ImageButton hamburger = view.findViewById(R.id.btnHamburgerStaff); hamburger.setOnClickListener(v -> openDrawer()); + ImageButton btnToggleFilter = view.findViewById(R.id.btnToggleFilterStaff); + btnToggleFilter.setOnClickListener(v -> { + if (layoutFilter.getVisibility() == View.VISIBLE) { + layoutFilter.setVisibility(View.GONE); + } else { + layoutFilter.setVisibility(View.VISIBLE); + } + }); + return view; } @@ -112,8 +124,10 @@ public class StaffFragment extends Fragment implements EmployeeAdapter.OnEmploye employeeList.addAll(r.body().getContent()); filter(etSearch != null ? etSearch.getText().toString() : ""); } else { - Toast.makeText(getContext(), "Failed to load staff", - Toast.LENGTH_SHORT).show(); + if (getContext() != null) { + Toast.makeText(getContext(), "Failed to load staff", + Toast.LENGTH_SHORT).show(); + } } } public void onFailure(Call> c, Throwable t) { 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 7757f156..1081462a 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 @@ -415,7 +415,7 @@ public class AppointmentDetailFragment extends Fragment { } else if (errorMessage.toLowerCase().contains("not available")) { showNoAvailabilityDialog(); } else { - Toast.makeText(getContext(), "Operation failed", Toast.LENGTH_SHORT).show(); + Toast.makeText(getContext(), errorMessage, Toast.LENGTH_SHORT).show(); } } else { Toast.makeText(getContext(), "Something went wrong", Toast.LENGTH_SHORT).show(); diff --git a/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/detailfragments/PetDetailFragment.java b/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/detailfragments/PetDetailFragment.java index 62d8bf42..ea08d16d 100644 --- a/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/detailfragments/PetDetailFragment.java +++ b/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/detailfragments/PetDetailFragment.java @@ -220,6 +220,13 @@ public class PetDetailFragment extends Fragment { binding.tvPetId.setText("ID: " + petId); binding.tvPetId.setVisibility(View.VISIBLE); binding.btnDeletePet.setVisibility(View.VISIBLE); + + // Disable species and breed fields in edit mode + binding.etPetSpecies.setEnabled(false); + binding.etPetBreed.setEnabled(false); + binding.etPetSpecies.setAlpha(0.5f); + binding.etPetBreed.setAlpha(0.5f); + loadPetData(); } else { // Pet is being added @@ -229,6 +236,12 @@ public class PetDetailFragment extends Fragment { binding.tvPetId.setVisibility(View.GONE); binding.btnDeletePet.setVisibility(View.GONE); binding.btnSavePet.setText("Add"); + + // Enable species and breed fields in edit mode + binding.etPetSpecies.setEnabled(true); + binding.etPetBreed.setEnabled(true); + binding.etPetSpecies.setAlpha(1.0f); + binding.etPetBreed.setAlpha(1.0f); } } @@ -334,16 +347,20 @@ public class PetDetailFragment extends Fragment { if ("Available".equalsIgnoreCase(status)) { binding.spinnerCustomer.setSelection(0); binding.spinnerCustomer.setEnabled(false); + binding.spinnerCustomer.setAlpha(0.5f); } else { binding.spinnerCustomer.setEnabled(true); + binding.spinnerCustomer.setAlpha(1.0f); } //Disable the store spinner if the status is "Owned" if ("Owned".equalsIgnoreCase(status)) { binding.spinnerStore.setSelection(0); binding.spinnerStore.setEnabled(false); + binding.spinnerStore.setAlpha(0.5f); } else { binding.spinnerStore.setEnabled(true); + binding.spinnerStore.setAlpha(1.0f); } } diff --git a/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/detailfragments/ProductDetailFragment.java b/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/detailfragments/ProductDetailFragment.java index 48a988d2..d2527d71 100644 --- a/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/detailfragments/ProductDetailFragment.java +++ b/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/detailfragments/ProductDetailFragment.java @@ -11,6 +11,7 @@ import androidx.lifecycle.ViewModelProvider; import androidx.navigation.fragment.NavHostFragment; import com.bumptech.glide.Glide; +import com.bumptech.glide.load.engine.DiskCacheStrategy; import com.example.petstoremobile.R; import com.example.petstoremobile.api.*; import com.example.petstoremobile.api.auth.TokenManager; @@ -73,7 +74,11 @@ public class ProductDetailFragment extends Fragment { @Override public void onImagePicked(Uri uri) { photoUri = uri; - Glide.with(ProductDetailFragment.this).load(uri).into(binding.ivProductImage); + Glide.with(ProductDetailFragment.this) + .load(uri) + .diskCacheStrategy(DiskCacheStrategy.NONE) + .skipMemoryCache(true) + .into(binding.ivProductImage); hasImage = true; isImageChanged = true; isImageRemoved = false; diff --git a/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/detailfragments/RefundFragment.java b/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/detailfragments/RefundFragment.java index a53b5402..3249e8d2 100644 --- a/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/detailfragments/RefundFragment.java +++ b/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/detailfragments/RefundFragment.java @@ -101,7 +101,7 @@ public class RefundFragment extends Fragment { } private void loadAllSales() { - RetrofitClient.getSaleApi(requireContext()).getAllSales(0, 1000) + RetrofitClient.getSaleApi(requireContext()).getAllSales(0, 1000, null, null, null) .enqueue(new Callback>() { public void onResponse(Call> c, Response> r) { diff --git a/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/listprofilefragments/PetProfileFragment.java b/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/listprofilefragments/PetProfileFragment.java index 9e876c69..371e5c20 100644 --- a/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/listprofilefragments/PetProfileFragment.java +++ b/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/listprofilefragments/PetProfileFragment.java @@ -131,11 +131,30 @@ public class PetProfileFragment extends Fragment { binding.tvPetPrice.setText("$0.00"); } - // Display owner name if available, otherwise show No Owner - if (pet.getCustomerName() != null && !pet.getCustomerName().isEmpty()) { - binding.tvPetOwner.setText(pet.getCustomerName()); + String status = pet.getPetStatus(); + + // Display owner name only if the pet is Adopted or Owned + if ("Adopted".equalsIgnoreCase(status) || "Owned".equalsIgnoreCase(status)) { + binding.layoutPetOwner.setVisibility(View.VISIBLE); + if (pet.getCustomerName() != null && !pet.getCustomerName().isEmpty()) { + binding.tvPetOwner.setText(pet.getCustomerName()); + } else { + binding.tvPetOwner.setText("No Owner"); + } } else { - binding.tvPetOwner.setText("No Owner"); + binding.layoutPetOwner.setVisibility(View.GONE); + } + + // Display store name only if the pet is Adopted or Available + if ("Available".equalsIgnoreCase(status) || "Adopted".equalsIgnoreCase(status)) { + binding.layoutPetStore.setVisibility(View.VISIBLE); + if (pet.getStoreName() != null && !pet.getStoreName().isEmpty()) { + binding.tvPetStore.setText(pet.getStoreName()); + } else { + binding.tvPetStore.setText("No Store"); + } + } else { + binding.layoutPetStore.setVisibility(View.GONE); } } else if (resource.status == Resource.Status.ERROR) { Toast.makeText(getContext(), "Failed to load pet data: " + resource.message, Toast.LENGTH_SHORT).show(); diff --git a/android/app/src/main/java/com/example/petstoremobile/repositories/SaleRepository.java b/android/app/src/main/java/com/example/petstoremobile/repositories/SaleRepository.java index 4068c472..370b28a9 100644 --- a/android/app/src/main/java/com/example/petstoremobile/repositories/SaleRepository.java +++ b/android/app/src/main/java/com/example/petstoremobile/repositories/SaleRepository.java @@ -20,8 +20,8 @@ public class SaleRepository extends BaseRepository { this.saleApi = saleApi; } - public LiveData>> getAllSales(int page, int size) { - return executeCall(saleApi.getAllSales(page, size)); + public LiveData>> getAllSales(int page, int size, String query, String paymentMethod, String sortBy) { + return executeCall(saleApi.getAllSales(page, size, query, paymentMethod, sortBy)); } public LiveData> getSaleById(Long id) { diff --git a/android/app/src/main/java/com/example/petstoremobile/viewmodels/SaleViewModel.java b/android/app/src/main/java/com/example/petstoremobile/viewmodels/SaleViewModel.java index aca186f6..4bdd337e 100644 --- a/android/app/src/main/java/com/example/petstoremobile/viewmodels/SaleViewModel.java +++ b/android/app/src/main/java/com/example/petstoremobile/viewmodels/SaleViewModel.java @@ -21,8 +21,8 @@ public class SaleViewModel extends ViewModel { this.saleRepository = saleRepository; } - public LiveData>> getAllSales(int page, int size) { - return saleRepository.getAllSales(page, size); + public LiveData>> getAllSales(int page, int size, String query, String paymentMethod, String sortBy) { + return saleRepository.getAllSales(page, size, query, paymentMethod, sortBy); } public LiveData> getSaleById(Long id) { diff --git a/android/app/src/main/res/layout/fragment_pet_profile.xml b/android/app/src/main/res/layout/fragment_pet_profile.xml index f5af4445..25f2214c 100644 --- a/android/app/src/main/res/layout/fragment_pet_profile.xml +++ b/android/app/src/main/res/layout/fragment_pet_profile.xml @@ -222,13 +222,15 @@ + android:padding="16dp" + android:visibility="gone"> + + + + + + + + diff --git a/android/app/src/main/res/layout/fragment_sale.xml b/android/app/src/main/res/layout/fragment_sale.xml index cea233df..b5256f3d 100644 --- a/android/app/src/main/res/layout/fragment_sale.xml +++ b/android/app/src/main/res/layout/fragment_sale.xml @@ -29,35 +29,101 @@ 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"> -