From 862ece691a125d57a87d811aff1d2a258691d487 Mon Sep 17 00:00:00 2001 From: Nikitha Date: Sun, 29 Mar 2026 16:33:27 -0600 Subject: [PATCH] purchaseorder view Purchase Order view only so changes only to view --- .../adapters/PurchaseOrderAdapter.java | 78 ++++++++++ .../petstoremobile/api/PurchaseOrderApi.java | 19 +++ .../petstoremobile/dtos/PurchaseOrderDTO.java | 39 +++++ .../listfragments/PurchaseOrderFragment.java | 139 ++++++++++++++++++ .../petstoremobile/models/PurchaseOrder.java | 31 ++++ .../res/layout/fragment_purchase_order.xml | 67 +++++++++ .../layout/fragment_purchase_order_detail.xml | 124 ++++++++++++++++ .../main/res/layout/item_purchase_order.xml | 70 +++++++++ 8 files changed, 567 insertions(+) create mode 100644 android/app/src/main/java/com/example/petstoremobile/adapters/PurchaseOrderAdapter.java create mode 100644 android/app/src/main/java/com/example/petstoremobile/api/PurchaseOrderApi.java create mode 100644 android/app/src/main/java/com/example/petstoremobile/dtos/PurchaseOrderDTO.java create mode 100644 android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/PurchaseOrderFragment.java create mode 100644 android/app/src/main/java/com/example/petstoremobile/models/PurchaseOrder.java create mode 100644 android/app/src/main/res/layout/fragment_purchase_order.xml create mode 100644 android/app/src/main/res/layout/fragment_purchase_order_detail.xml create mode 100644 android/app/src/main/res/layout/item_purchase_order.xml diff --git a/android/app/src/main/java/com/example/petstoremobile/adapters/PurchaseOrderAdapter.java b/android/app/src/main/java/com/example/petstoremobile/adapters/PurchaseOrderAdapter.java new file mode 100644 index 00000000..2d66e672 --- /dev/null +++ b/android/app/src/main/java/com/example/petstoremobile/adapters/PurchaseOrderAdapter.java @@ -0,0 +1,78 @@ +package com.example.petstoremobile.adapters; + +import android.graphics.Color; +import android.view.*; +import android.widget.TextView; +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; +import com.example.petstoremobile.R; +import com.example.petstoremobile.dtos.PurchaseOrderDTO; +import java.util.List; + +public class PurchaseOrderAdapter extends RecyclerView.Adapter { + + private List list; + private OnPurchaseOrderClickListener listener; + + public interface OnPurchaseOrderClickListener { + void onPurchaseOrderClick(int position); + } + + public PurchaseOrderAdapter(List list, OnPurchaseOrderClickListener listener) { + this.list = list; + this.listener = listener; + } + + public static class POViewHolder extends RecyclerView.ViewHolder { + TextView tvId, tvSupplier, tvDate, tvStatus; + + public POViewHolder(@NonNull View v) { + super(v); + tvId = v.findViewById(R.id.tvPOId); + tvSupplier = v.findViewById(R.id.tvPOSupplier); + tvDate = v.findViewById(R.id.tvPODate); + tvStatus = v.findViewById(R.id.tvPOStatus); + } + } + + @NonNull + @Override + public POViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View v = LayoutInflater.from(parent.getContext()) + .inflate(R.layout.item_purchase_order, parent, false); + return new POViewHolder(v); + } + + @Override + public void onBindViewHolder(@NonNull POViewHolder holder, int position) { + PurchaseOrderDTO po = list.get(position); + holder.tvId.setText("PO #" + (po.getPurchaseOrderId() != null ? po.getPurchaseOrderId() : "")); + holder.tvSupplier.setText("Supplier: " + (po.getSupplierName() != null ? po.getSupplierName() : "")); + holder.tvDate.setText("Date: " + (po.getOrderDate() != null ? po.getOrderDate() : "")); + + String status = po.getStatus() != null ? po.getStatus() : ""; + holder.tvStatus.setText(status); + + switch (status) { + case "Completed": + holder.tvStatus.setBackgroundColor(Color.parseColor("#4CAF50")); + break; + case "Pending": + holder.tvStatus.setBackgroundColor(Color.parseColor("#FF9800")); + break; + case "Cancelled": + holder.tvStatus.setBackgroundColor(Color.parseColor("#F44336")); + break; + default: + holder.tvStatus.setBackgroundColor(Color.parseColor("#9E9E9E")); + break; + } + + holder.itemView.setOnClickListener(v -> listener.onPurchaseOrderClick(position)); + } + + @Override + public int getItemCount() { + return list.size(); + } +} \ No newline at end of file diff --git a/android/app/src/main/java/com/example/petstoremobile/api/PurchaseOrderApi.java b/android/app/src/main/java/com/example/petstoremobile/api/PurchaseOrderApi.java new file mode 100644 index 00000000..1e4f4ffe --- /dev/null +++ b/android/app/src/main/java/com/example/petstoremobile/api/PurchaseOrderApi.java @@ -0,0 +1,19 @@ +package com.example.petstoremobile.api; + +import com.example.petstoremobile.dtos.PageResponse; +import com.example.petstoremobile.dtos.PurchaseOrderDTO; +import retrofit2.Call; +import retrofit2.http.GET; +import retrofit2.http.Path; +import retrofit2.http.Query; + +public interface PurchaseOrderApi { + + @GET("api/v1/purchase-orders") + Call> getAllPurchaseOrders( + @Query("page") int page, + @Query("size") int size); + + @GET("api/v1/purchase-orders/{id}") + Call getPurchaseOrderById(@Path("id") Long id); +} \ No newline at end of file diff --git a/android/app/src/main/java/com/example/petstoremobile/dtos/PurchaseOrderDTO.java b/android/app/src/main/java/com/example/petstoremobile/dtos/PurchaseOrderDTO.java new file mode 100644 index 00000000..d7a392ea --- /dev/null +++ b/android/app/src/main/java/com/example/petstoremobile/dtos/PurchaseOrderDTO.java @@ -0,0 +1,39 @@ +package com.example.petstoremobile.dtos; + +public class PurchaseOrderDTO { + private Long purchaseOrderId; + private Long supId; + private String supplierName; + private String orderDate; + private String status; + private String createdAt; + private String updatedAt; + + public Long getPurchaseOrderId() { + return purchaseOrderId; + } + + public Long getSupId() { + return supId; + } + + public String getSupplierName() { + return supplierName; + } + + public String getOrderDate() { + return orderDate; + } + + public String getStatus() { + return status; + } + + public String getCreatedAt() { + return createdAt; + } + + public String getUpdatedAt() { + return updatedAt; + } +} \ No newline at end of file diff --git a/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/PurchaseOrderFragment.java b/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/PurchaseOrderFragment.java new file mode 100644 index 00000000..76527f09 --- /dev/null +++ b/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/PurchaseOrderFragment.java @@ -0,0 +1,139 @@ +package com.example.petstoremobile.fragments.listfragments; + +import android.os.Bundle; +import android.text.*; +import android.util.Log; +import android.view.*; +import android.widget.*; +import androidx.fragment.app.Fragment; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; +import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; +import com.example.petstoremobile.R; +import com.example.petstoremobile.adapters.PurchaseOrderAdapter; +import com.example.petstoremobile.api.RetrofitClient; +import com.example.petstoremobile.dtos.PageResponse; +import com.example.petstoremobile.dtos.PurchaseOrderDTO; +import com.example.petstoremobile.fragments.ListFragment; +import com.example.petstoremobile.fragments.listfragments.detailfragments.PurchaseOrderDetailFragment; +import java.util.*; +import retrofit2.*; + +public class PurchaseOrderFragment extends Fragment + implements PurchaseOrderAdapter.OnPurchaseOrderClickListener { + + private List poList = new ArrayList<>(); + private List filteredList = new ArrayList<>(); + private PurchaseOrderAdapter adapter; + private SwipeRefreshLayout swipeRefresh; + private EditText etSearch; + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + View view = inflater.inflate(R.layout.fragment_purchase_order, container, false); + + setupRecyclerView(view); + setupSearch(view); + setupSwipeRefresh(view); + loadData(); + + ImageButton hamburger = view.findViewById(R.id.btnHamburgerPO); + hamburger.setOnClickListener(v -> { + ListFragment lf = (ListFragment) getParentFragment(); + if (lf != null) + lf.openDrawer(); + }); + + return view; + } + + private void setupRecyclerView(View view) { + RecyclerView rv = view.findViewById(R.id.recyclerViewPO); + adapter = new PurchaseOrderAdapter(filteredList, this); + rv.setLayoutManager(new LinearLayoutManager(getContext())); + rv.setAdapter(adapter); + } + + private void setupSearch(View view) { + etSearch = view.findViewById(R.id.etSearchPO); + etSearch.addTextChangedListener(new TextWatcher() { + public void beforeTextChanged(CharSequence s, int a, int b, int c) { + } + + public void afterTextChanged(Editable s) { + } + + public void onTextChanged(CharSequence s, int a, int b, int c) { + filter(s.toString()); + } + }); + } + + private void setupSwipeRefresh(View view) { + swipeRefresh = view.findViewById(R.id.swipeRefreshPO); + swipeRefresh.setOnRefreshListener(this::loadData); + } + + private void filter(String query) { + filteredList.clear(); + if (query.isEmpty()) { + filteredList.addAll(poList); + } else { + String lower = query.toLowerCase(); + for (PurchaseOrderDTO po : poList) { + if ((po.getSupplierName() != null && po.getSupplierName().toLowerCase().contains(lower)) + || (po.getStatus() != null && po.getStatus().toLowerCase().contains(lower))) { + filteredList.add(po); + } + } + } + adapter.notifyDataSetChanged(); + } + + private void loadData() { + if (swipeRefresh != null) + swipeRefresh.setRefreshing(true); + RetrofitClient.getPurchaseOrderApi(requireContext()).getAllPurchaseOrders(0, 100) + .enqueue(new Callback>() { + public void onResponse(Call> c, + Response> r) { + if (swipeRefresh != null) + swipeRefresh.setRefreshing(false); + if (r.isSuccessful() && r.body() != null) { + poList.clear(); + poList.addAll(r.body().getContent()); + filter(etSearch != null ? etSearch.getText().toString() : ""); + } else { + Toast.makeText(getContext(), "Failed to load purchase orders", + Toast.LENGTH_SHORT).show(); + } + } + + public void onFailure(Call> c, Throwable t) { + if (swipeRefresh != null) + swipeRefresh.setRefreshing(false); + Log.e("POFragment", t.getMessage()); + } + }); + } + + private void openDetail(int position) { + PurchaseOrderDetailFragment detail = new PurchaseOrderDetailFragment(); + Bundle args = new Bundle(); + PurchaseOrderDTO po = filteredList.get(position); + args.putLong("purchaseOrderId", po.getPurchaseOrderId()); + args.putString("supplierName", po.getSupplierName()); + args.putString("orderDate", po.getOrderDate()); + args.putString("status", po.getStatus()); + detail.setArguments(args); + ListFragment lf = (ListFragment) getParentFragment(); + if (lf != null) + lf.loadFragment(detail); + } + + @Override + public void onPurchaseOrderClick(int position) { + openDetail(position); + } +} \ No newline at end of file diff --git a/android/app/src/main/java/com/example/petstoremobile/models/PurchaseOrder.java b/android/app/src/main/java/com/example/petstoremobile/models/PurchaseOrder.java new file mode 100644 index 00000000..971ff400 --- /dev/null +++ b/android/app/src/main/java/com/example/petstoremobile/models/PurchaseOrder.java @@ -0,0 +1,31 @@ +package com.example.petstoremobile.models; + +public class PurchaseOrder { + private int purchaseOrderId; + private String supplierName; + private String orderDate; + private String status; + + public PurchaseOrder(int purchaseOrderId, String supplierName, String orderDate, String status) { + this.purchaseOrderId = purchaseOrderId; + this.supplierName = supplierName; + this.orderDate = orderDate; + this.status = status; + } + + public int getPurchaseOrderId() { + return purchaseOrderId; + } + + public String getSupplierName() { + return supplierName; + } + + public String getOrderDate() { + return orderDate; + } + + public String getStatus() { + return status; + } +} diff --git a/android/app/src/main/res/layout/fragment_purchase_order.xml b/android/app/src/main/res/layout/fragment_purchase_order.xml new file mode 100644 index 00000000..ea11397d --- /dev/null +++ b/android/app/src/main/res/layout/fragment_purchase_order.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/android/app/src/main/res/layout/fragment_purchase_order_detail.xml b/android/app/src/main/res/layout/fragment_purchase_order_detail.xml new file mode 100644 index 00000000..7cd5dff0 --- /dev/null +++ b/android/app/src/main/res/layout/fragment_purchase_order_detail.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +