Merge Attachments Branch #155

Merged
RecentRunner merged 7 commits from AttachmentsToChat into main 2026-04-08 13:44:13 -06:00
12 changed files with 55 additions and 215 deletions
Showing only changes of commit 30ae416ba4 - Show all commits

View File

@@ -2,8 +2,6 @@ package com.example.petstoremobile.fragments.listfragments;
import android.graphics.Color;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
@@ -22,7 +20,6 @@ import com.example.petstoremobile.adapters.AdoptionAdapter;
import com.example.petstoremobile.databinding.FragmentAdoptionBinding;
import com.example.petstoremobile.dtos.AdoptionDTO;
import com.example.petstoremobile.dtos.StoreDTO;
import com.example.petstoremobile.fragments.ListFragment;
import com.example.petstoremobile.utils.BulkDeleteHandler;
import com.example.petstoremobile.utils.Resource;
import com.example.petstoremobile.utils.SpinnerUtils;
@@ -87,15 +84,7 @@ public class AdoptionFragment extends Fragment implements AdoptionAdapter.OnAdop
binding.fabAddAdoption.setOnClickListener(v -> openDetail(-1));
binding.btnHamburgerAdoption.setOnClickListener(v -> {
Fragment parent = getParentFragment();
if (parent != null) {
Fragment grandParent = parent.getParentFragment();
if (grandParent instanceof ListFragment) {
((ListFragment) grandParent).openDrawer();
}
}
});
UIUtils.setupHamburgerMenu(binding.btnHamburgerAdoption, this);
binding.btnToggleCalendarModeAdoption.setOnClickListener(v -> toggleCalendarMode());
@@ -219,13 +208,7 @@ public class AdoptionFragment extends Fragment implements AdoptionAdapter.OnAdop
* Sets up the search bar for filtering
*/
private void setupSearch() {
binding.etSearchAdoption.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) {
loadAdoptions();
}
@Override public void afterTextChanged(Editable s) {}
});
UIUtils.attachSearch(binding.etSearchAdoption, this::loadAdoptions);
}
/**

View File

@@ -10,8 +10,6 @@ import androidx.lifecycle.ViewModelProvider;
import androidx.navigation.fragment.NavHostFragment;
import androidx.recyclerview.widget.LinearLayoutManager;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
@@ -23,7 +21,6 @@ import com.example.petstoremobile.adapters.AppointmentAdapter;
import com.example.petstoremobile.databinding.FragmentAppointmentBinding;
import com.example.petstoremobile.dtos.AppointmentDTO;
import com.example.petstoremobile.dtos.StoreDTO;
import com.example.petstoremobile.fragments.ListFragment;
import com.example.petstoremobile.utils.BulkDeleteHandler;
import com.example.petstoremobile.utils.Resource;
import com.example.petstoremobile.utils.SpinnerUtils;
@@ -95,15 +92,7 @@ public class AppointmentFragment extends Fragment implements AppointmentAdapter.
binding.fabAddAppointment.setOnClickListener(v -> openAppointmentDetails(-1));
binding.btnHamburger.setOnClickListener(v -> {
Fragment parent = getParentFragment();
if (parent != null) {
Fragment grandParent = parent.getParentFragment();
if (grandParent instanceof ListFragment) {
((ListFragment) grandParent).openDrawer();
}
}
});
UIUtils.setupHamburgerMenu(binding.btnHamburger, this);
binding.btnToggleCalendarMode.setOnClickListener(v -> toggleCalendarMode());
@@ -244,13 +233,7 @@ public class AppointmentFragment extends Fragment implements AppointmentAdapter.
* Configures the search bar for filtering.
*/
private void setupSearch() {
binding.etSearchAppointment.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) {
loadAppointmentData();
}
@Override public void afterTextChanged(Editable s) {}
});
UIUtils.attachSearch(binding.etSearchAppointment, this::loadAppointmentData);
}
/**

View File

@@ -1,8 +1,6 @@
package com.example.petstoremobile.fragments.listfragments;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
@@ -22,7 +20,6 @@ import com.example.petstoremobile.adapters.InventoryAdapter;
import com.example.petstoremobile.databinding.FragmentInventoryBinding;
import com.example.petstoremobile.dtos.InventoryDTO;
import com.example.petstoremobile.dtos.StoreDTO;
import com.example.petstoremobile.fragments.ListFragment;
import com.example.petstoremobile.utils.BulkDeleteHandler;
import com.example.petstoremobile.utils.UIUtils;
import com.example.petstoremobile.viewmodels.InventoryViewModel;
@@ -80,15 +77,7 @@ public class InventoryFragment extends Fragment implements InventoryAdapter.OnIn
binding.fabAddInventory.setOnClickListener(v -> openDetail(null));
binding.btnHamburger.setOnClickListener(v -> {
Fragment parent = getParentFragment();
if (parent != null) {
Fragment grandParent = parent.getParentFragment();
if (grandParent instanceof ListFragment) {
((ListFragment) grandParent).openDrawer();
}
}
});
UIUtils.setupHamburgerMenu(binding.btnHamburger, this);
return binding.getRoot();
}
@@ -123,13 +112,7 @@ public class InventoryFragment extends Fragment implements InventoryAdapter.OnIn
* Sets up the search bar for filtering.
*/
private void setupSearch() {
binding.etSearchInventory.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) {
loadInventory(true);
}
@Override public void afterTextChanged(Editable s) {}
});
UIUtils.attachSearch(binding.etSearchInventory, () -> loadInventory(true));
}
/**

View File

@@ -9,8 +9,6 @@ import androidx.lifecycle.ViewModelProvider;
import androidx.navigation.fragment.NavHostFragment;
import androidx.recyclerview.widget.LinearLayoutManager;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
@@ -23,7 +21,6 @@ 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;
import com.example.petstoremobile.fragments.ListFragment;
import com.example.petstoremobile.utils.BulkDeleteHandler;
import com.example.petstoremobile.utils.Resource;
import com.example.petstoremobile.utils.SpinnerUtils;
@@ -81,15 +78,7 @@ public class PetFragment extends Fragment implements PetAdapter.OnPetClickListen
binding.fabAddPet.setOnClickListener(v -> openPetDetails());
binding.btnHamburger.setOnClickListener(v -> {
Fragment parent = getParentFragment();
if (parent != null) {
Fragment grandParent = parent.getParentFragment();
if (grandParent instanceof ListFragment) {
((ListFragment) grandParent).openDrawer();
}
}
});
UIUtils.setupHamburgerMenu(binding.btnHamburger, this);
return binding.getRoot();
}
@@ -135,13 +124,7 @@ public class PetFragment extends Fragment implements PetAdapter.OnPetClickListen
* Configures the search bar.
*/
private void setupSearch() {
binding.etSearchPet.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) {
loadPetData();
}
@Override public void afterTextChanged(Editable s) {}
});
UIUtils.attachSearch(binding.etSearchPet, this::loadPetData);
}
/**

View File

@@ -9,8 +9,6 @@ import androidx.lifecycle.ViewModelProvider;
import androidx.navigation.fragment.NavHostFragment;
import androidx.recyclerview.widget.LinearLayoutManager;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
@@ -22,7 +20,6 @@ import com.example.petstoremobile.adapters.ProductAdapter;
import com.example.petstoremobile.databinding.FragmentProductBinding;
import com.example.petstoremobile.dtos.CategoryDTO;
import com.example.petstoremobile.dtos.ProductDTO;
import com.example.petstoremobile.fragments.ListFragment;
import com.example.petstoremobile.utils.Resource;
import com.example.petstoremobile.utils.SpinnerUtils;
import com.example.petstoremobile.utils.UIUtils;
@@ -72,15 +69,7 @@ public class ProductFragment extends Fragment implements ProductAdapter.OnProduc
binding.fabAddProduct.setOnClickListener(v -> openProductDetails(-1));
binding.btnHamburgerProduct.setOnClickListener(v -> {
Fragment parent = getParentFragment();
if (parent != null) {
Fragment grandParent = parent.getParentFragment();
if (grandParent instanceof ListFragment) {
((ListFragment) grandParent).openDrawer();
}
}
});
UIUtils.setupHamburgerMenu(binding.btnHamburgerProduct, this);
return binding.getRoot();
}
@@ -113,13 +102,7 @@ public class ProductFragment extends Fragment implements ProductAdapter.OnProduc
* Configures the search bar for triggering data load from backend.
*/
private void setupSearch() {
binding.etSearchProduct.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) {
loadProductData();
}
@Override public void afterTextChanged(Editable s) {}
});
UIUtils.attachSearch(binding.etSearchProduct, this::loadProductData);
}
/**

View File

@@ -1,8 +1,6 @@
package com.example.petstoremobile.fragments.listfragments;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
@@ -22,7 +20,6 @@ import com.example.petstoremobile.databinding.FragmentProductSupplierBinding;
import com.example.petstoremobile.dtos.ProductDTO;
import com.example.petstoremobile.dtos.ProductSupplierDTO;
import com.example.petstoremobile.dtos.SupplierDTO;
import com.example.petstoremobile.fragments.ListFragment;
import com.example.petstoremobile.utils.BulkDeleteHandler;
import com.example.petstoremobile.utils.Resource;
import com.example.petstoremobile.utils.SpinnerUtils;
@@ -80,15 +77,7 @@ public class ProductSupplierFragment extends Fragment
binding.fabAddPS.setOnClickListener(v -> openDetail(-1));
binding.btnHamburgerPS.setOnClickListener(v -> {
Fragment parent = getParentFragment();
if (parent != null) {
Fragment grandParent = parent.getParentFragment();
if (grandParent instanceof ListFragment) {
((ListFragment) grandParent).openDrawer();
}
}
});
UIUtils.setupHamburgerMenu(binding.btnHamburgerPS, this);
return binding.getRoot();
}
@@ -143,13 +132,7 @@ public class ProductSupplierFragment extends Fragment
* Configures the search bar for filtering.
*/
private void setupSearch() {
binding.etSearchPS.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) {
loadData();
}
@Override public void afterTextChanged(Editable s) {}
});
UIUtils.attachSearch(binding.etSearchPS, this::loadData);
}
/**

View File

@@ -1,8 +1,6 @@
package com.example.petstoremobile.fragments.listfragments;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
@@ -21,7 +19,6 @@ import com.example.petstoremobile.adapters.PurchaseOrderAdapter;
import com.example.petstoremobile.databinding.FragmentPurchaseOrderBinding;
import com.example.petstoremobile.dtos.PurchaseOrderDTO;
import com.example.petstoremobile.dtos.StoreDTO;
import com.example.petstoremobile.fragments.ListFragment;
import com.example.petstoremobile.utils.Resource;
import com.example.petstoremobile.utils.SpinnerUtils;
import com.example.petstoremobile.utils.UIUtils;
@@ -68,15 +65,7 @@ public class PurchaseOrderFragment extends Fragment
setupSwipeRefresh();
setupFilterToggle();
binding.btnHamburgerPO.setOnClickListener(v -> {
Fragment parent = getParentFragment();
if (parent != null) {
Fragment grandParent = parent.getParentFragment();
if (grandParent instanceof ListFragment) {
((ListFragment) grandParent).openDrawer();
}
}
});
UIUtils.setupHamburgerMenu(binding.btnHamburgerPO, this);
return binding.getRoot();
}
@@ -108,13 +97,7 @@ public class PurchaseOrderFragment extends Fragment
* Configures the search bar for filtering.
*/
private void setupSearch() {
binding.etSearchPO.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) {
loadData();
}
@Override public void afterTextChanged(Editable s) {}
});
UIUtils.attachSearch(binding.etSearchPO, this::loadData);
}
/**

View File

@@ -8,8 +8,6 @@ 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;
@@ -21,7 +19,6 @@ import com.example.petstoremobile.adapters.SaleAdapter;
import com.example.petstoremobile.databinding.FragmentSaleBinding;
import com.example.petstoremobile.dtos.SaleDTO;
import com.example.petstoremobile.dtos.StoreDTO;
import com.example.petstoremobile.fragments.ListFragment;
import com.example.petstoremobile.utils.Resource;
import com.example.petstoremobile.utils.SpinnerUtils;
import com.example.petstoremobile.utils.UIUtils;
@@ -72,15 +69,7 @@ public class SaleFragment extends Fragment implements SaleAdapter.OnSaleClickLis
setupFilterToggle();
loadSales(true);
binding.btnHamburger.setOnClickListener(v -> {
Fragment parent = getParentFragment();
if (parent != null) {
Fragment grandParent = parent.getParentFragment();
if (grandParent instanceof ListFragment) {
((ListFragment) grandParent).openDrawer();
}
}
});
UIUtils.setupHamburgerMenu(binding.btnHamburger, this);
binding.fabAddSale.setOnClickListener(v ->
NavHostFragment.findNavController(this).navigate(R.id.nav_sale_detail));
@@ -149,14 +138,7 @@ public class SaleFragment extends Fragment implements SaleAdapter.OnSaleClickLis
}
private void setupSearch() {
binding.etSearchSale.addTextChangedListener(new TextWatcher() {
@Override public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
@Override public void afterTextChanged(Editable s) {}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
loadSales(true);
}
});
UIUtils.attachSearch(binding.etSearchSale, () -> loadSales(true));
}
private void setupSwipeRefresh() {

View File

@@ -1,8 +1,6 @@
package com.example.petstoremobile.fragments.listfragments;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
@@ -21,9 +19,7 @@ import com.example.petstoremobile.R;
import com.example.petstoremobile.adapters.ServiceAdapter;
import com.example.petstoremobile.databinding.FragmentServiceBinding;
import com.example.petstoremobile.dtos.ServiceDTO;
import com.example.petstoremobile.fragments.ListFragment;
import com.example.petstoremobile.utils.BulkDeleteHandler;
import com.example.petstoremobile.utils.Resource;
import com.example.petstoremobile.utils.UIUtils;
import com.example.petstoremobile.viewmodels.ServiceViewModel;
@@ -78,15 +74,7 @@ public class ServiceFragment extends Fragment implements ServiceAdapter.OnServic
binding.fabAddService.setOnClickListener(v -> openDetail(null));
binding.btnHamburger.setOnClickListener(v -> {
Fragment parent = getParentFragment();
if (parent != null) {
Fragment grandParent = parent.getParentFragment();
if (grandParent instanceof ListFragment) {
((ListFragment) grandParent).openDrawer();
}
}
});
UIUtils.setupHamburgerMenu(binding.btnHamburger, this);
return binding.getRoot();
}
@@ -121,13 +109,7 @@ public class ServiceFragment extends Fragment implements ServiceAdapter.OnServic
* Sets up the search bar for filtering.
*/
private void setupSearch() {
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) {
loadServices(true);
}
@Override public void afterTextChanged(Editable s) {}
});
UIUtils.attachSearch(binding.etSearchService, () -> loadServices(true));
}
/**

View File

@@ -1,7 +1,6 @@
package com.example.petstoremobile.fragments.listfragments;
import android.os.Bundle;
import android.text.*;
import android.util.Log;
import android.view.*;
import android.widget.*;
@@ -17,7 +16,6 @@ import com.example.petstoremobile.adapters.EmployeeAdapter;
import com.example.petstoremobile.api.RetrofitClient;
import com.example.petstoremobile.dtos.EmployeeDTO;
import com.example.petstoremobile.dtos.PageResponse;
import com.example.petstoremobile.fragments.ListFragment;
import com.example.petstoremobile.utils.UIUtils;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import java.util.*;
@@ -48,7 +46,7 @@ public class StaffFragment extends Fragment implements EmployeeAdapter.OnEmploye
fab.setOnClickListener(v -> openDetail(-1));
ImageButton hamburger = view.findViewById(R.id.btnHamburgerStaff);
hamburger.setOnClickListener(v -> openDrawer());
UIUtils.setupHamburgerMenu(hamburger, this);
ImageButton btnToggleFilter = view.findViewById(R.id.btnToggleFilterStaff);
UIUtils.setupFilterToggle(btnToggleFilter, layoutFilter, etSearch);
@@ -56,16 +54,6 @@ public class StaffFragment extends Fragment implements EmployeeAdapter.OnEmploye
return view;
}
private void openDrawer() {
Fragment parent = getParentFragment();
if (parent != null) {
Fragment grandParent = parent.getParentFragment();
if (grandParent instanceof ListFragment) {
((ListFragment) grandParent).openDrawer();
}
}
}
private void setupRecyclerView(View view) {
RecyclerView rv = view.findViewById(R.id.recyclerViewStaff);
adapter = new EmployeeAdapter(filteredList, this);
@@ -75,13 +63,7 @@ public class StaffFragment extends Fragment implements EmployeeAdapter.OnEmploye
private void setupSearch(View view) {
etSearch = view.findViewById(R.id.etSearchStaff);
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());
}
});
UIUtils.attachSearch(etSearch, () -> filter(etSearch.getText().toString()));
}
private void setupSwipeRefresh(View view) {

View File

@@ -9,8 +9,6 @@ import androidx.lifecycle.ViewModelProvider;
import androidx.navigation.fragment.NavHostFragment;
import androidx.recyclerview.widget.LinearLayoutManager;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
@@ -21,7 +19,6 @@ import com.example.petstoremobile.R;
import com.example.petstoremobile.adapters.SupplierAdapter;
import com.example.petstoremobile.databinding.FragmentSupplierBinding;
import com.example.petstoremobile.dtos.SupplierDTO;
import com.example.petstoremobile.fragments.ListFragment;
import com.example.petstoremobile.utils.BulkDeleteHandler;
import com.example.petstoremobile.utils.Resource;
import com.example.petstoremobile.utils.UIUtils;
@@ -68,16 +65,7 @@ public class SupplierFragment extends Fragment implements SupplierAdapter.OnSupp
//Add button to opens the add dialog
binding.fabAddSupplier.setOnClickListener(v -> openSupplierDetails(-1));
//Make the hamburger button open the drawer from listFragment
binding.btnHamburger.setOnClickListener(v -> {
Fragment parent = getParentFragment();
if (parent != null) {
Fragment grandParent = parent.getParentFragment();
if (grandParent instanceof ListFragment) {
((ListFragment) grandParent).openDrawer();
}
}
});
UIUtils.setupHamburgerMenu(binding.btnHamburger, this);
return binding.getRoot();
}
@@ -112,13 +100,7 @@ public class SupplierFragment extends Fragment implements SupplierAdapter.OnSupp
* Configures the search bar for filtering.
*/
private void setupSearch() {
binding.etSearchSupplier.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) {
loadSupplierData();
}
@Override public void afterTextChanged(Editable s) {}
});
UIUtils.attachSearch(binding.etSearchSupplier, this::loadSupplierData);
}
/**

View File

@@ -1,20 +1,23 @@
package com.example.petstoremobile.utils;
import android.telephony.PhoneNumberFormattingTextWatcher;
import android.text.Editable;
import android.text.InputFilter;
import android.text.TextWatcher;
import android.view.View;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.Spinner;
import com.example.petstoremobile.R;
import androidx.fragment.app.Fragment;
import com.example.petstoremobile.fragments.ListFragment;
/**
* Utility class for shared UI component logic and formatting.
*/
public class UIUtils {
/**
* Formats an EditText for to phone format
* Formats an EditText to phone format.
*/
public static void formatPhoneInput(EditText editText) {
editText.addTextChangedListener(new PhoneNumberFormattingTextWatcher("CA"));
@@ -42,4 +45,32 @@ public class UIUtils {
}
});
}
/**
* Simplifies setting up the hamburger menu to open the navigation drawer.
*/
public static void setupHamburgerMenu(ImageButton btnHamburger, Fragment fragment) {
btnHamburger.setOnClickListener(v -> {
Fragment parent = fragment.getParentFragment();
if (parent != null) {
Fragment grandParent = parent.getParentFragment();
if (grandParent instanceof ListFragment) {
((ListFragment) grandParent).openDrawer();
}
}
});
}
/**
* Attaches a simplified TextWatcher to an EditText for search functionality.
*/
public static void attachSearch(EditText etSearch, Runnable onQueryChanged) {
etSearch.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) {
onQueryChanged.run();
}
@Override public void afterTextChanged(Editable s) {}
});
}
}