helper class added to enable and disable fields

This commit is contained in:
Alex
2026-04-08 19:57:04 -06:00
parent 5f9d7a848c
commit b6bee250df
5 changed files with 71 additions and 93 deletions

View File

@@ -15,6 +15,7 @@ import com.example.petstoremobile.dtos.*;
import com.example.petstoremobile.utils.DialogUtils; import com.example.petstoremobile.utils.DialogUtils;
import com.example.petstoremobile.utils.Resource; import com.example.petstoremobile.utils.Resource;
import com.example.petstoremobile.utils.SpinnerUtils; import com.example.petstoremobile.utils.SpinnerUtils;
import com.example.petstoremobile.utils.UIUtils;
import com.example.petstoremobile.viewmodels.AdoptionViewModel; import com.example.petstoremobile.viewmodels.AdoptionViewModel;
import com.example.petstoremobile.viewmodels.CustomerViewModel; import com.example.petstoremobile.viewmodels.CustomerViewModel;
import com.example.petstoremobile.viewmodels.PetViewModel; import com.example.petstoremobile.viewmodels.PetViewModel;
@@ -97,21 +98,18 @@ public class AdoptionDetailFragment extends Fragment {
SpinnerUtils.setupStringSpinner(requireContext(), binding.spinnerAdoptionStatus, STATUSES); SpinnerUtils.setupStringSpinner(requireContext(), binding.spinnerAdoptionStatus, STATUSES);
// Pet spinner disabled by default until customer is selected // Pet spinner disabled by default until customer is selected
binding.spinnerAdoptionPet.setEnabled(false); UIUtils.setViewsEnabled(false, binding.spinnerAdoptionPet);
binding.spinnerAdoptionPet.setAlpha(0.5f);
// Listener to enable pet spinner based on customer selection // Listener to enable pet spinner based on customer selection
binding.spinnerAdoptionCustomer.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { binding.spinnerAdoptionCustomer.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override @Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
if (position > 0) { if (position > 0) {
binding.spinnerAdoptionPet.setEnabled(true); UIUtils.setViewsEnabled(true, binding.spinnerAdoptionPet);
binding.spinnerAdoptionPet.setAlpha(1.0f);
} else { } else {
if (!isEditing) { if (!isEditing) {
binding.spinnerAdoptionPet.setSelection(0); binding.spinnerAdoptionPet.setSelection(0);
binding.spinnerAdoptionPet.setEnabled(false); UIUtils.setViewsEnabled(false, binding.spinnerAdoptionPet);
binding.spinnerAdoptionPet.setAlpha(0.5f);
} }
} }
} }
@@ -266,8 +264,7 @@ public class AdoptionDetailFragment extends Fragment {
binding.tvAdoptionId.setVisibility(View.GONE); binding.tvAdoptionId.setVisibility(View.GONE);
// Explicitly disable in add mode // Explicitly disable in add mode
binding.spinnerAdoptionPet.setEnabled(false); UIUtils.setViewsEnabled(false, binding.spinnerAdoptionPet);
binding.spinnerAdoptionPet.setAlpha(0.5f);
} }
} }
@@ -294,8 +291,7 @@ public class AdoptionDetailFragment extends Fragment {
// In edit mode, if a customer is already set, ensure pet spinner is enabled // In edit mode, if a customer is already set, ensure pet spinner is enabled
if (preselectedCustomerId != -1) { if (preselectedCustomerId != -1) {
binding.spinnerAdoptionPet.setEnabled(true); UIUtils.setViewsEnabled(true, binding.spinnerAdoptionPet);
binding.spinnerAdoptionPet.setAlpha(1.0f);
} }
} else if (resource.status == Resource.Status.ERROR) { } else if (resource.status == Resource.Status.ERROR) {
Toast.makeText(getContext(), "Failed to load adoption: " + resource.message, Toast.LENGTH_SHORT).show(); Toast.makeText(getContext(), "Failed to load adoption: " + resource.message, Toast.LENGTH_SHORT).show();

View File

@@ -16,6 +16,7 @@ import com.example.petstoremobile.dtos.*;
import com.example.petstoremobile.utils.DialogUtils; import com.example.petstoremobile.utils.DialogUtils;
import com.example.petstoremobile.utils.Resource; import com.example.petstoremobile.utils.Resource;
import com.example.petstoremobile.utils.SpinnerUtils; import com.example.petstoremobile.utils.SpinnerUtils;
import com.example.petstoremobile.utils.UIUtils;
import com.example.petstoremobile.viewmodels.AppointmentViewModel; import com.example.petstoremobile.viewmodels.AppointmentViewModel;
import com.example.petstoremobile.viewmodels.CustomerViewModel; import com.example.petstoremobile.viewmodels.CustomerViewModel;
import com.example.petstoremobile.viewmodels.PetViewModel; import com.example.petstoremobile.viewmodels.PetViewModel;
@@ -109,9 +110,8 @@ public class AppointmentDetailFragment extends Fragment {
SpinnerUtils.setupStringSpinner(requireContext(), binding.spinnerHour, hours); SpinnerUtils.setupStringSpinner(requireContext(), binding.spinnerHour, hours);
SpinnerUtils.setupStringSpinner(requireContext(), binding.spinnerMinute, new String[]{"00","15","30","45"}); SpinnerUtils.setupStringSpinner(requireContext(), binding.spinnerMinute, new String[]{"00","15","30","45"});
// Pet spinner disabled by default // Pet and Staff spinners disabled by until parent selection
binding.spinnerPet.setEnabled(false); UIUtils.setViewsEnabled(false, binding.spinnerPet, binding.spinnerStaff);
binding.spinnerPet.setAlpha(0.5f);
// Listener to load pets based on selected customer // Listener to load pets based on selected customer
binding.spinnerCustomer.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { binding.spinnerCustomer.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@@ -121,16 +121,14 @@ public class AppointmentDetailFragment extends Fragment {
DropdownDTO selectedCustomer = customerList.get(position - 1); DropdownDTO selectedCustomer = customerList.get(position - 1);
loadPets(selectedCustomer.getId()); loadPets(selectedCustomer.getId());
if (!isEditing) { if (!isEditing) {
binding.spinnerPet.setEnabled(true); UIUtils.setViewsEnabled(true, binding.spinnerPet);
binding.spinnerPet.setAlpha(1.0f);
} }
} else { } else {
petList.clear(); petList.clear();
refreshPetSpinner(); refreshPetSpinner();
if (!isEditing) { if (!isEditing) {
binding.spinnerPet.setSelection(0); binding.spinnerPet.setSelection(0);
binding.spinnerPet.setEnabled(false); UIUtils.setViewsEnabled(false, binding.spinnerPet);
binding.spinnerPet.setAlpha(0.5f);
} }
} }
} }
@@ -146,9 +144,16 @@ public class AppointmentDetailFragment extends Fragment {
if (position > 0 && position <= storeList.size()) { if (position > 0 && position <= storeList.size()) {
DropdownDTO selectedStore = storeList.get(position - 1); DropdownDTO selectedStore = storeList.get(position - 1);
loadStaff(selectedStore.getId()); loadStaff(selectedStore.getId());
if (!isPastAppointment) {
UIUtils.setViewsEnabled(true, binding.spinnerStaff);
}
} else { } else {
staffList.clear(); staffList.clear();
refreshStaffSpinner(); refreshStaffSpinner();
if (!isEditing) {
binding.spinnerStaff.setSelection(0);
UIUtils.setViewsEnabled(false, binding.spinnerStaff);
}
} }
} }
@@ -303,19 +308,8 @@ public class AppointmentDetailFragment extends Fragment {
binding.tvAppointmentId.setVisibility(View.VISIBLE); binding.tvAppointmentId.setVisibility(View.VISIBLE);
binding.btnDeleteAppointment.setVisibility(View.VISIBLE); binding.btnDeleteAppointment.setVisibility(View.VISIBLE);
binding.spinnerCustomer.setEnabled(false); UIUtils.setViewsEnabled(false, binding.spinnerCustomer, binding.spinnerStore, binding.spinnerPet, binding.spinnerService);
binding.spinnerStore.setEnabled(false); UIUtils.setViewsAlpha(0.5f, binding.tvLabelCustomer, binding.tvLabelStore, binding.tvLabelPet, binding.tvLabelService);
binding.spinnerPet.setEnabled(false);
binding.spinnerService.setEnabled(false);
binding.spinnerCustomer.setAlpha(0.5f);
binding.spinnerStore.setAlpha(0.5f);
binding.spinnerPet.setAlpha(0.5f);
binding.spinnerService.setAlpha(0.5f);
binding.tvLabelCustomer.setAlpha(0.5f);
binding.tvLabelStore.setAlpha(0.5f);
binding.tvLabelPet.setAlpha(0.5f);
binding.tvLabelService.setAlpha(0.5f);
loadAppointmentData(); loadAppointmentData();
} else { } else {
@@ -324,19 +318,9 @@ public class AppointmentDetailFragment extends Fragment {
binding.btnDeleteAppointment.setVisibility(View.GONE); binding.btnDeleteAppointment.setVisibility(View.GONE);
binding.tvAppointmentId.setVisibility(View.GONE); binding.tvAppointmentId.setVisibility(View.GONE);
binding.spinnerCustomer.setEnabled(true); UIUtils.setViewsEnabled(true, binding.spinnerCustomer, binding.spinnerStore, binding.spinnerService);
binding.spinnerStore.setEnabled(true); UIUtils.setViewsEnabled(false, binding.spinnerPet, binding.spinnerStaff);
binding.spinnerPet.setEnabled(false); UIUtils.setViewsAlpha(1.0f, binding.tvLabelCustomer, binding.tvLabelStore, binding.tvLabelPet, binding.tvLabelService, binding.tvLabelStaff);
binding.spinnerPet.setAlpha(0.5f);
binding.spinnerService.setEnabled(true);
binding.spinnerCustomer.setAlpha(1.0f);
binding.spinnerStore.setAlpha(1.0f);
binding.spinnerService.setAlpha(1.0f);
binding.tvLabelCustomer.setAlpha(1.0f);
binding.tvLabelStore.setAlpha(1.0f);
binding.tvLabelPet.setAlpha(1.0f);
binding.tvLabelService.setAlpha(1.0f);
} }
} }
@@ -416,8 +400,7 @@ public class AppointmentDetailFragment extends Fragment {
if ("Cancelled".equalsIgnoreCase(currentStatus)) { if ("Cancelled".equalsIgnoreCase(currentStatus)) {
isPastAppointment = true; isPastAppointment = true;
disableAllExceptStatus(); disableAllExceptStatus();
binding.spinnerAppointmentStatus.setEnabled(false); UIUtils.setViewsEnabled(false, binding.spinnerAppointmentStatus);
binding.spinnerAppointmentStatus.setAlpha(0.5f);
binding.btnSaveAppointment.setVisibility(View.GONE); binding.btnSaveAppointment.setVisibility(View.GONE);
return; return;
} }
@@ -445,36 +428,18 @@ public class AppointmentDetailFragment extends Fragment {
* Disables all input fields except the status spinner * Disables all input fields except the status spinner
*/ */
private void disableAllExceptStatus() { private void disableAllExceptStatus() {
binding.spinnerCustomer.setEnabled(false); UIUtils.setViewsEnabled(false,
binding.spinnerStore.setEnabled(false); binding.spinnerCustomer, binding.spinnerStore, binding.spinnerPet,
binding.spinnerPet.setEnabled(false); binding.spinnerService, binding.spinnerStaff, binding.etAppointmentDate,
binding.spinnerService.setEnabled(false); binding.spinnerHour, binding.spinnerMinute);
binding.spinnerStaff.setEnabled(false);
binding.etAppointmentDate.setEnabled(false); UIUtils.setViewsAlpha(0.5f,
binding.spinnerHour.setEnabled(false); binding.tvLabelCustomer, binding.tvLabelStore, binding.tvLabelPet,
binding.spinnerMinute.setEnabled(false); binding.tvLabelService, binding.tvLabelStaff, binding.tvLabelDate,
binding.tvLabelTime);
float disabledAlpha = 0.5f;
binding.spinnerCustomer.setAlpha(disabledAlpha);
binding.spinnerStore.setAlpha(disabledAlpha);
binding.spinnerPet.setAlpha(disabledAlpha);
binding.spinnerService.setAlpha(disabledAlpha);
binding.spinnerStaff.setAlpha(disabledAlpha);
binding.etAppointmentDate.setAlpha(disabledAlpha);
binding.spinnerHour.setAlpha(disabledAlpha);
binding.spinnerMinute.setAlpha(disabledAlpha);
binding.tvLabelCustomer.setAlpha(disabledAlpha);
binding.tvLabelStore.setAlpha(disabledAlpha);
binding.tvLabelPet.setAlpha(disabledAlpha);
binding.tvLabelService.setAlpha(disabledAlpha);
binding.tvLabelStaff.setAlpha(disabledAlpha);
binding.tvLabelDate.setAlpha(disabledAlpha);
binding.tvLabelTime.setAlpha(disabledAlpha);
// Keep status enabled // Keep status enabled
binding.spinnerAppointmentStatus.setEnabled(true); UIUtils.setViewsEnabled(true, binding.spinnerAppointmentStatus);
binding.spinnerAppointmentStatus.setAlpha(1.0f);
} }
/** /**

View File

@@ -25,6 +25,7 @@ import com.example.petstoremobile.utils.DialogUtils;
import com.example.petstoremobile.utils.InputValidator; import com.example.petstoremobile.utils.InputValidator;
import com.example.petstoremobile.utils.Resource; import com.example.petstoremobile.utils.Resource;
import com.example.petstoremobile.utils.SpinnerUtils; import com.example.petstoremobile.utils.SpinnerUtils;
import com.example.petstoremobile.utils.UIUtils;
import com.example.petstoremobile.viewmodels.CustomerViewModel; import com.example.petstoremobile.viewmodels.CustomerViewModel;
import com.example.petstoremobile.viewmodels.PetViewModel; import com.example.petstoremobile.viewmodels.PetViewModel;
import com.example.petstoremobile.viewmodels.StoreViewModel; import com.example.petstoremobile.viewmodels.StoreViewModel;
@@ -221,10 +222,7 @@ public class PetDetailFragment extends Fragment {
binding.btnDeletePet.setVisibility(View.VISIBLE); binding.btnDeletePet.setVisibility(View.VISIBLE);
// Disable species and breed fields in edit mode // Disable species and breed fields in edit mode
binding.etPetSpecies.setEnabled(false); UIUtils.setViewsEnabled(false, binding.etPetSpecies, binding.etPetBreed);
binding.etPetBreed.setEnabled(false);
binding.etPetSpecies.setAlpha(0.5f);
binding.etPetBreed.setAlpha(0.5f);
loadPetData(); loadPetData();
} else { } else {
@@ -237,10 +235,7 @@ public class PetDetailFragment extends Fragment {
binding.btnSavePet.setText("Add"); binding.btnSavePet.setText("Add");
// Enable species and breed fields in edit mode // Enable species and breed fields in edit mode
binding.etPetSpecies.setEnabled(true); UIUtils.setViewsEnabled(true, binding.etPetSpecies, binding.etPetBreed);
binding.etPetBreed.setEnabled(true);
binding.etPetSpecies.setAlpha(1.0f);
binding.etPetBreed.setAlpha(1.0f);
} }
} }
@@ -345,21 +340,17 @@ public class PetDetailFragment extends Fragment {
//Disable the customer spinner if the status is "Available" //Disable the customer spinner if the status is "Available"
if ("Available".equalsIgnoreCase(status)) { if ("Available".equalsIgnoreCase(status)) {
binding.spinnerCustomer.setSelection(0); binding.spinnerCustomer.setSelection(0);
binding.spinnerCustomer.setEnabled(false); UIUtils.setViewsEnabled(false, binding.spinnerCustomer);
binding.spinnerCustomer.setAlpha(0.5f);
} else { } else {
binding.spinnerCustomer.setEnabled(true); UIUtils.setViewsEnabled(true, binding.spinnerCustomer);
binding.spinnerCustomer.setAlpha(1.0f);
} }
//Disable the store spinner if the status is "Owned" //Disable the store spinner if the status is "Owned"
if ("Owned".equalsIgnoreCase(status)) { if ("Owned".equalsIgnoreCase(status)) {
binding.spinnerStore.setSelection(0); binding.spinnerStore.setSelection(0);
binding.spinnerStore.setEnabled(false); UIUtils.setViewsEnabled(false, binding.spinnerStore);
binding.spinnerStore.setAlpha(0.5f);
} else { } else {
binding.spinnerStore.setEnabled(true); UIUtils.setViewsEnabled(true, binding.spinnerStore);
binding.spinnerStore.setAlpha(1.0f);
} }
} }
@@ -378,4 +369,4 @@ public class PetDetailFragment extends Fragment {
((TextView) selectedView).setError(null); ((TextView) selectedView).setError(null);
} }
} }
} }

View File

@@ -15,6 +15,7 @@ import com.example.petstoremobile.viewmodels.*;
import com.example.petstoremobile.utils.SpinnerUtils; import com.example.petstoremobile.utils.SpinnerUtils;
import com.example.petstoremobile.utils.DialogUtils; import com.example.petstoremobile.utils.DialogUtils;
import com.example.petstoremobile.utils.Resource; import com.example.petstoremobile.utils.Resource;
import com.example.petstoremobile.utils.UIUtils;
import dagger.hilt.android.AndroidEntryPoint; import dagger.hilt.android.AndroidEntryPoint;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.*; import java.util.*;
@@ -80,9 +81,10 @@ public class SaleDetailFragment extends Fragment {
// Hide save and input controls for view only // Hide save and input controls for view only
if (viewOnly) { if (viewOnly) {
binding.btnSaveSale.setVisibility(View.GONE); binding.btnSaveSale.setVisibility(View.GONE);
binding.spinnerSaleStore.setEnabled(false); UIUtils.setViewsEnabled(false,
binding.spinnerSaleCustomer.setEnabled(false); binding.spinnerSaleStore,
binding.spinnerPaymentMethod.setEnabled(false); binding.spinnerSaleCustomer,
binding.spinnerPaymentMethod);
binding.llAddItemRow.setVisibility(View.GONE); binding.llAddItemRow.setVisibility(View.GONE);
binding.llExtraInfo.setVisibility(View.VISIBLE); binding.llExtraInfo.setVisibility(View.VISIBLE);
} }

View File

@@ -66,4 +66,28 @@ public class UIUtils {
@Override public void afterTextChanged(Editable s) {} @Override public void afterTextChanged(Editable s) {}
}); });
} }
/**
* Sets the enabled state and alpha for multiple views.
* Alpha is set to 1.0f when enabled and 0.5f when disabled.
*/
public static void setViewsEnabled(boolean enabled, View... views) {
for (View v : views) {
if (v != null) {
v.setEnabled(enabled);
v.setAlpha(enabled ? 1.0f : 0.5f);
}
}
}
/**
* Sets the alpha for multiple views.
*/
public static void setViewsAlpha(float alpha, View... views) {
for (View v : views) {
if (v != null) {
v.setAlpha(alpha);
}
}
}
} }