From 93cd8227c19eaef31d5303aed1bd396a12fd5d53 Mon Sep 17 00:00:00 2001 From: Gius95 Date: Thu, 6 Dec 2018 00:26:05 +0100 Subject: [PATCH] Implementati primi filtri per DialogFiltroAvanzatoVendita. --- .../core/di/BindableString.java | 16 ++ .../core/utility/UtilityToast.java | 13 + .../gest/vendita/MainVenditaFragment.java | 27 +- .../vendita/core/MainListVenditaAdapter.java | 6 + .../dialogs/DialogVenditaFiltroAvanzato.java | 252 +++++++++++++++++- .../DialogVenditaFiltroAvanzatoViewModel.java | 8 + .../vendita/dto/OrdineVenditaInevasoDTO.java | 11 +- .../bottom_sheet_modal_background.xml | 10 + .../layout/dialog_vendita_filtro_avanzato.xml | 55 ++++ app/src/main/res/values-it/strings.xml | 4 + app/src/main/res/values/strings.xml | 4 + 11 files changed, 390 insertions(+), 16 deletions(-) create mode 100644 app/src/main/java/it/integry/integrywmsnative/core/utility/UtilityToast.java create mode 100644 app/src/main/res/drawable/bottom_sheet_modal_background.xml diff --git a/app/src/main/java/it/integry/integrywmsnative/core/di/BindableString.java b/app/src/main/java/it/integry/integrywmsnative/core/di/BindableString.java index 77c5ef33..288df64f 100644 --- a/app/src/main/java/it/integry/integrywmsnative/core/di/BindableString.java +++ b/app/src/main/java/it/integry/integrywmsnative/core/di/BindableString.java @@ -1,9 +1,12 @@ package it.integry.integrywmsnative.core.di; import android.databinding.BaseObservable; +import android.databinding.Observable; import org.parceler.Parcel; +import it.integry.integrywmsnative.core.expansion.RunnableArgs; + @Parcel public class BindableString extends BaseObservable { String value; @@ -22,4 +25,17 @@ public class BindableString extends BaseObservable { public boolean isEmpty() { return value == null || value.isEmpty(); } + + + + + + public static void registerListener(BindableString bindableString, RunnableArgs onValueChanged) { + bindableString.addOnPropertyChangedCallback(new OnPropertyChangedCallback() { + @Override + public void onPropertyChanged(Observable sender, int propertyId) { + if(onValueChanged != null) onValueChanged.run(bindableString.get()); + } + }); + } } diff --git a/app/src/main/java/it/integry/integrywmsnative/core/utility/UtilityToast.java b/app/src/main/java/it/integry/integrywmsnative/core/utility/UtilityToast.java new file mode 100644 index 00000000..1987e54a --- /dev/null +++ b/app/src/main/java/it/integry/integrywmsnative/core/utility/UtilityToast.java @@ -0,0 +1,13 @@ +package it.integry.integrywmsnative.core.utility; + +import android.widget.Toast; + +import it.integry.integrywmsnative.MainApplication; + +public class UtilityToast { + + public static void showToast(String message) { + Toast.makeText(MainApplication.Context, message, Toast.LENGTH_LONG).show(); + } + +} diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/vendita/MainVenditaFragment.java b/app/src/main/java/it/integry/integrywmsnative/gest/vendita/MainVenditaFragment.java index 360a6ad9..511b72ac 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/vendita/MainVenditaFragment.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/vendita/MainVenditaFragment.java @@ -30,6 +30,7 @@ import it.integry.integrywmsnative.core.interfaces.ISelectAllFragment; import it.integry.integrywmsnative.core.model.MtbColt; import it.integry.integrywmsnative.core.settings.SettingsManager; import it.integry.integrywmsnative.core.utility.UtilityExceptions; +import it.integry.integrywmsnative.core.utility.UtilityToast; import it.integry.integrywmsnative.databinding.FragmentMainVenditaBinding; import it.integry.integrywmsnative.core.interfaces.ITitledFragment; import it.integry.integrywmsnative.gest.vendita.core.MainListVenditaAdapter; @@ -51,6 +52,7 @@ public class MainVenditaFragment extends Fragment implements ITitledFragment, IR private MainListVenditaAdapter mAdapter; + private List mOriginalOrderList; private List groupedOrdiniInevasi; public MainVenditaFragment() { @@ -112,12 +114,15 @@ public class MainVenditaFragment extends Fragment implements ITitledFragment, IR @Override public void onLoadSuccess(List ordini) { Toast.makeText(getActivity(), "Caricati " + ordini.size() + " ordini", Toast.LENGTH_LONG).show(); - groupOrdiniAndMakeRecycler(ordini); + mOriginalOrderList = ordini; + groupOrdini(ordini); + initRecyclerView(); progress.dismiss(); } @Override public void onLoadFail(Exception ex) { + mOriginalOrderList = new ArrayList<>(); progress.dismiss(); String errorMessage = CommonRESTException.tryRecognizeThenGetMessage(ex); @@ -128,7 +133,7 @@ public class MainVenditaFragment extends Fragment implements ITitledFragment, IR } - private void groupOrdiniAndMakeRecycler(List ordini){ + private void groupOrdini(List ordini){ groupedOrdiniInevasi = new ArrayList<>(); @@ -204,10 +209,18 @@ public class MainVenditaFragment extends Fragment implements ITitledFragment, IR }); + + } + + private void initRecyclerView() { mAdapter = new MainListVenditaAdapter(getActivity(), groupedOrdiniInevasi, onGroupSelectionChanged); mBinding.venditaMainList.setAdapter(mAdapter); } + private void refreshRecyclerView() { + mAdapter.updateItems(groupedOrdiniInevasi); + } + RunnableArgs onGroupSelectionChanged = dto -> { List selectedOrders = mHelper.getSelectedOrders(groupedOrdiniInevasi); @@ -321,7 +334,15 @@ public class MainVenditaFragment extends Fragment implements ITitledFragment, IR @Override public void onFilterClick() { - DialogVenditaFiltroAvanzato.makeBase(getActivity()).show(); + DialogVenditaFiltroAvanzato.make(getActivity(), mOriginalOrderList, filteredOrderList -> { + + if(filteredOrderList != null){ + + groupOrdini(filteredOrderList); + refreshRecyclerView(); + } + + }).show(); } } diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/vendita/core/MainListVenditaAdapter.java b/app/src/main/java/it/integry/integrywmsnative/gest/vendita/core/MainListVenditaAdapter.java index bf38dace..846ba592 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/vendita/core/MainListVenditaAdapter.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/vendita/core/MainListVenditaAdapter.java @@ -47,6 +47,12 @@ public class MainListVenditaAdapter extends RecyclerView.Adapter updatedDataset) { + mDataset.clear(); + mDataset.addAll(updatedDataset); + notifyDataSetChanged(); + } + // Create new views (invoked by the layout manager) @Override diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/vendita/dialogs/DialogVenditaFiltroAvanzato.java b/app/src/main/java/it/integry/integrywmsnative/gest/vendita/dialogs/DialogVenditaFiltroAvanzato.java index b3c7b445..7c4baf06 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/vendita/dialogs/DialogVenditaFiltroAvanzato.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/vendita/dialogs/DialogVenditaFiltroAvanzato.java @@ -1,26 +1,57 @@ package it.integry.integrywmsnative.gest.vendita.dialogs; import android.app.AlertDialog; +import android.app.DatePickerDialog; import android.content.Context; +import android.content.DialogInterface; import android.databinding.DataBindingUtil; -import android.databinding.ViewDataBinding; +import android.support.design.widget.BottomSheetBehavior; import android.view.LayoutInflater; +import android.widget.ArrayAdapter; + +import com.annimon.stream.Stream; +import com.annimon.stream.function.Predicate; + +import java.util.Calendar; +import java.util.GregorianCalendar; +import java.util.List; import it.integry.integrywmsnative.R; +import it.integry.integrywmsnative.core.di.BindableString; +import it.integry.integrywmsnative.core.expansion.RunnableArgs; +import it.integry.integrywmsnative.core.utility.UtilityDate; +import it.integry.integrywmsnative.core.utility.UtilityString; import it.integry.integrywmsnative.databinding.DialogVenditaFiltroAvanzatoBinding; +import it.integry.integrywmsnative.gest.vendita.dto.OrdineVenditaInevasoDTO; public class DialogVenditaFiltroAvanzato { - private static AlertDialog currentAlert; - private static Context currentContext; + private AlertDialog currentAlert; + private Context currentContext; - private static DialogVenditaFiltroAvanzatoViewModel currentViewModel; + private RunnableArgs> currentOnFilterDone; - public static AlertDialog makeBase(final Context context) { + private List currentOrderList; + private List currentFilteredOrderList; + + private Predicate currentNumOrdsPredicate = null; + private Predicate currentClientePredicate = null; + private Predicate currentDataConsPredicate = null; + private Predicate currentTermConsPredicate = null; + private Predicate currentAutomezzoPredicate = null; + + public static AlertDialog make(final Context context, final List ordersList, RunnableArgs> onDismiss) { + return new DialogVenditaFiltroAvanzato(context, ordersList, onDismiss).currentAlert; + } + + private DialogVenditaFiltroAvanzato(final Context context, final List ordersList, RunnableArgs> onDismiss) { currentContext = context; - currentViewModel = new DialogVenditaFiltroAvanzatoViewModel(); + currentOrderList = ordersList; + currentOnFilterDone = onDismiss; + + DialogVenditaFiltroAvanzatoViewModel viewModel = new DialogVenditaFiltroAvanzatoViewModel(); LayoutInflater inflater = (LayoutInflater) context.getSystemService( Context.LAYOUT_INFLATER_SERVICE ); @@ -29,15 +60,214 @@ public class DialogVenditaFiltroAvanzato { final AlertDialog.Builder alertDialog = new AlertDialog.Builder(context) .setView(contentView.getRoot()) .setPositiveButton(context.getText(R.string.confirm), null) - .setNegativeButton(context.getText(R.string.abort), null); - - contentView.setViewmodel(currentViewModel); - + .setNegativeButton(context.getText(R.string.abort), null) + .setNeutralButton(context.getText(R.string.reset), (dialogInterface, i) -> { + resetAll(viewModel); + }); + contentView.setViewmodel(viewModel); + initViewModel(viewModel); + initView(contentView, viewModel); currentAlert = alertDialog.create(); currentAlert.setCanceledOnTouchOutside(false); - return currentAlert; + + currentAlert.setOnDismissListener(dialogInterface -> { + if(currentOnFilterDone != null) currentOnFilterDone.run(currentFilteredOrderList); + }); + + refreshList(); } + + private void resetAll(DialogVenditaFiltroAvanzatoViewModel viewModel) { + viewModel.numOrds.set(null); + viewModel.cliente.set(null); + viewModel.dataConsegna.set(null); + viewModel.terminiConsegna.set(null); + viewModel.automezzo.set(null); + } + + private void initView(DialogVenditaFiltroAvanzatoBinding bindings, DialogVenditaFiltroAvanzatoViewModel viewModel) { + + bindings.inputDataCons.setOnClickListener(view -> { + Calendar c = Calendar.getInstance(); + + if(viewModel.dataConsegnaDate != null) { + c.setTime(viewModel.dataConsegnaDate); + } + + int mYear = c.get(Calendar.YEAR); + int mMonth = c.get(Calendar.MONTH); + int mDay = c.get(Calendar.DAY_OF_MONTH); + + DatePickerDialog datePickerDialog = new DatePickerDialog(currentContext, + (view2, year, month, day) -> { + + viewModel.dataConsegnaDate = new GregorianCalendar(year, month, day).getTime(); + viewModel.dataConsegna.set(UtilityDate.formatDate(viewModel.dataConsegnaDate, UtilityDate.COMMONS_DATE_FORMATS.DMY_HUMAN)); + + }, mYear, mMonth, mDay); + datePickerDialog.show(); + }); + + bindings.inputTermCons.setOnClickListener(view -> { + + AlertDialog.Builder builderSingle = new AlertDialog.Builder(currentContext); + builderSingle.setTitle(R.string.terms_of_delivery); + + final ArrayAdapter arrayAdapter = new ArrayAdapter(currentContext, android.R.layout.select_dialog_singlechoice); + arrayAdapter.addAll(getAvailableTermCons()); + + builderSingle.setAdapter(arrayAdapter, (dialogInterface, i) -> { + viewModel.terminiConsegna.set(arrayAdapter.getItem(i)); + }); + builderSingle.show(); + + }); + + bindings.inputAutomezzo.setOnClickListener(view -> { + + AlertDialog.Builder builderSingle = new AlertDialog.Builder(currentContext); + builderSingle.setTitle(R.string.vehicle); + + final ArrayAdapter arrayAdapter = new ArrayAdapter(currentContext, android.R.layout.select_dialog_singlechoice); + arrayAdapter.addAll(getAvailableAutomezzi()); + + builderSingle.setAdapter(arrayAdapter, (dialogInterface, i) -> { + viewModel.automezzo.set(arrayAdapter.getItem(i)); + }); + builderSingle.show(); + + }); + + } + + private void initViewModel(DialogVenditaFiltroAvanzatoViewModel viewModel) { + + BindableString.registerListener(viewModel.numOrds, value -> { + if(UtilityString.isNullOrEmpty(value)) currentNumOrdsPredicate = null; + else { + String numOrdTrimmed = value.replaceAll(" ", ""); + String[] numOrdsSplitted = numOrdTrimmed.split(","); + + List numOrdsInteger = Stream.of(numOrdsSplitted) + .withoutNulls() + .map(Integer::parseInt).toList(); + + currentNumOrdsPredicate = o -> numOrdsInteger.contains(o.getNumOrd()); + } + + refreshList(); + }); + + + + BindableString.registerListener(viewModel.cliente, value -> { + if(UtilityString.isNullOrEmpty(value)) currentClientePredicate = null; + else { + currentClientePredicate = o -> o.getRagSocOrd().toLowerCase().contains(value); + } + + refreshList(); + }); + + + + BindableString.registerListener(viewModel.dataConsegna, value -> { + if(UtilityString.isNullOrEmpty(value)) currentDataConsPredicate = null; + else { + currentDataConsPredicate = o -> o.getDataConsD().equals(viewModel.dataConsegnaDate); + } + + refreshList(); + }); + + + + BindableString.registerListener(viewModel.terminiConsegna, value -> { + if(UtilityString.isNullOrEmpty(value)) currentTermConsPredicate = null; + else { + currentTermConsPredicate = o -> o.getTermCons() != null && o.getTermCons().toLowerCase().contains(value); + } + + refreshList(); + }); + + + + BindableString.registerListener(viewModel.automezzo, value -> { + if(UtilityString.isNullOrEmpty(value)) currentAutomezzoPredicate = null; + else { + currentAutomezzoPredicate = o -> o.getCodAuto().toLowerCase().contains(value); + } + + refreshList(); + }); + + + } + + private List getAvailableTermCons() { + if(currentNumOrdsPredicate == null && currentClientePredicate == null && currentDataConsPredicate == null && currentTermConsPredicate == null){ + currentFilteredOrderList = currentOrderList; + } else { + Stream tmpStream = Stream.of(currentOrderList) + .filter(x -> + (currentNumOrdsPredicate == null || (currentNumOrdsPredicate != null && currentNumOrdsPredicate.test(x))) && + (currentClientePredicate == null || (currentClientePredicate != null && currentClientePredicate.test(x))) && + (currentDataConsPredicate == null || (currentDataConsPredicate != null && currentDataConsPredicate.test(x))) && + (currentAutomezzoPredicate == null || (currentAutomezzoPredicate != null && currentAutomezzoPredicate.test(x))) + ); + + currentFilteredOrderList = tmpStream.toList(); + } + + return Stream.of(currentFilteredOrderList).map(x -> x.getTermCons()).distinct().withoutNulls().toList(); + } + + private List getAvailableAutomezzi() { + if(currentNumOrdsPredicate == null && currentClientePredicate == null && currentDataConsPredicate == null && currentTermConsPredicate == null){ + currentFilteredOrderList = currentOrderList; + } else { + Stream tmpStream = Stream.of(currentOrderList) + .filter(x -> + (currentNumOrdsPredicate == null || (currentNumOrdsPredicate != null && currentNumOrdsPredicate.test(x))) && + (currentClientePredicate == null || (currentClientePredicate != null && currentClientePredicate.test(x))) && + (currentDataConsPredicate == null || (currentDataConsPredicate != null && currentDataConsPredicate.test(x))) && + (currentTermConsPredicate == null || (currentTermConsPredicate != null && currentTermConsPredicate.test(x))) + ); + + currentFilteredOrderList = tmpStream.toList(); + } + + return Stream.of(currentFilteredOrderList).map(x -> x.getCodAuto()).distinct().withoutNulls().toList(); + } + + private void refreshList() { + + if(currentNumOrdsPredicate == null && currentClientePredicate == null && currentDataConsPredicate == null && currentTermConsPredicate == null){ + currentFilteredOrderList = currentOrderList; + } else { + Stream tmpStream = Stream.of(currentOrderList) + .filter(x -> + (currentNumOrdsPredicate == null || (currentNumOrdsPredicate != null && currentNumOrdsPredicate.test(x))) && + (currentClientePredicate == null || (currentClientePredicate != null && currentClientePredicate.test(x))) && + (currentDataConsPredicate == null || (currentDataConsPredicate != null && currentDataConsPredicate.test(x))) && + (currentTermConsPredicate == null || (currentTermConsPredicate != null && currentTermConsPredicate.test(x))) && + (currentAutomezzoPredicate == null || (currentAutomezzoPredicate != null && currentAutomezzoPredicate.test(x))) + ); + + //if(currentNumOrdsPredicate != null) tmpStream = tmpStream.filter(currentNumOrdsPredicate); + //if(currentClientePredicate != null) tmpStream = tmpStream.filter(currentClientePredicate); + //if(currentDataConsPredicate != null) tmpStream = tmpStream.filter(currentDataConsPredicate); + //if(currentTermConsPredicate != null) tmpStream = tmpStream.filter(currentTermConsPredicate); + //if(currentClientePredicate != null) tmpStream = tmpStream.filter(currentClientePredicate); + + currentFilteredOrderList = tmpStream.toList(); + } + + + } + } diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/vendita/dialogs/DialogVenditaFiltroAvanzatoViewModel.java b/app/src/main/java/it/integry/integrywmsnative/gest/vendita/dialogs/DialogVenditaFiltroAvanzatoViewModel.java index 37755d79..22bb6a58 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/vendita/dialogs/DialogVenditaFiltroAvanzatoViewModel.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/vendita/dialogs/DialogVenditaFiltroAvanzatoViewModel.java @@ -1,5 +1,9 @@ package it.integry.integrywmsnative.gest.vendita.dialogs; +import android.support.design.widget.BottomSheetBehavior; + +import java.util.Date; + import it.integry.integrywmsnative.core.di.BindableFloat; import it.integry.integrywmsnative.core.di.BindableInteger; import it.integry.integrywmsnative.core.di.BindableString; @@ -8,6 +12,10 @@ public class DialogVenditaFiltroAvanzatoViewModel { public BindableString numOrds = new BindableString(); public BindableString cliente = new BindableString(); + public BindableString dataConsegna = new BindableString(); + public BindableString terminiConsegna = new BindableString(); + public BindableString automezzo = new BindableString(); + public Date dataConsegnaDate; } diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/vendita/dto/OrdineVenditaInevasoDTO.java b/app/src/main/java/it/integry/integrywmsnative/gest/vendita/dto/OrdineVenditaInevasoDTO.java index 17e49370..72415d11 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/vendita/dto/OrdineVenditaInevasoDTO.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/vendita/dto/OrdineVenditaInevasoDTO.java @@ -8,6 +8,8 @@ import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; +import it.integry.integrywmsnative.core.utility.UtilityLogger; + public class OrdineVenditaInevasoDTO implements Parcelable { private String data; @@ -378,9 +380,14 @@ public class OrdineVenditaInevasoDTO implements Parcelable { return dataCons; } - public Date getDataConsD() throws ParseException { + public Date getDataConsD() { SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); - return sdf.parse(getDataConsS()); + try { + return sdf.parse(getDataConsS()); + } catch (ParseException e) { + UtilityLogger.errorMe(e); + return null; + } } public OrdineVenditaInevasoDTO setDataCons(String dataCons) { diff --git a/app/src/main/res/drawable/bottom_sheet_modal_background.xml b/app/src/main/res/drawable/bottom_sheet_modal_background.xml new file mode 100644 index 00000000..4d78ebff --- /dev/null +++ b/app/src/main/res/drawable/bottom_sheet_modal_background.xml @@ -0,0 +1,10 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_vendita_filtro_avanzato.xml b/app/src/main/res/layout/dialog_vendita_filtro_avanzato.xml index b773e8ba..219bbeea 100644 --- a/app/src/main/res/layout/dialog_vendita_filtro_avanzato.xml +++ b/app/src/main/res/layout/dialog_vendita_filtro_avanzato.xml @@ -65,8 +65,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 6627744e..1b399548 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -18,6 +18,7 @@ Attenzione OK Annulla + Resetta Evasi @@ -141,6 +142,9 @@ Numero ordine Cliente + Data consegna + Termini di consegna + Automezzo Nessun articolo trovato diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 5a958a6d..ce190d3a 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -27,6 +27,7 @@ Warning OK Abort + Reset Dispatched No description Description @@ -150,6 +151,9 @@ Orders number Customer + Ship date + Terms of delivery + Vehicle No items found Do you want print the label?