diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/prod_accettazione_ord_produzione/dialog/DialogOrdineProduzioneFiltroAvanzato.java b/app/src/main/java/it/integry/integrywmsnative/gest/prod_accettazione_ord_produzione/dialog/DialogOrdineProduzioneFiltroAvanzato.java index f363c602..58d97159 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/prod_accettazione_ord_produzione/dialog/DialogOrdineProduzioneFiltroAvanzato.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/prod_accettazione_ord_produzione/dialog/DialogOrdineProduzioneFiltroAvanzato.java @@ -1,6 +1,6 @@ package it.integry.integrywmsnative.gest.prod_accettazione_ord_produzione.dialog; -import android.app.AlertDialog; +import androidx.appcompat.app.AlertDialog; import android.content.Context; import android.graphics.Color; import android.graphics.drawable.ColorDrawable; diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/ultime_consegne_cliente/dialog/DialogUltimeConsegneFiltroAvanzato.java b/app/src/main/java/it/integry/integrywmsnative/gest/ultime_consegne_cliente/dialog/DialogUltimeConsegneFiltroAvanzato.java index d70be5fc..8b3005e2 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/ultime_consegne_cliente/dialog/DialogUltimeConsegneFiltroAvanzato.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/ultime_consegne_cliente/dialog/DialogUltimeConsegneFiltroAvanzato.java @@ -1,6 +1,6 @@ package it.integry.integrywmsnative.gest.ultime_consegne_cliente.dialog; -import android.app.AlertDialog; +import androidx.appcompat.app.AlertDialog; import android.app.DatePickerDialog; import android.content.Context; import android.graphics.Color; diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/ultimi_arrivi_fornitore/UltimiArriviFornitoreFragment.java b/app/src/main/java/it/integry/integrywmsnative/gest/ultimi_arrivi_fornitore/UltimiArriviFornitoreFragment.java index 13bf9b3a..efa4f595 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/ultimi_arrivi_fornitore/UltimiArriviFornitoreFragment.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/ultimi_arrivi_fornitore/UltimiArriviFornitoreFragment.java @@ -20,6 +20,7 @@ import java.util.ArrayList; import java.util.List; import it.integry.integrywmsnative.R; +import it.integry.integrywmsnative.core.interfaces.IFilterableFragment; import it.integry.integrywmsnative.core.rest.model.DocumentoResoDTO; import it.integry.integrywmsnative.core.interfaces.IScrollableFragment; import it.integry.integrywmsnative.core.interfaces.ITitledFragment; @@ -29,13 +30,14 @@ import it.integry.integrywmsnative.core.utility.UtilityProgress; import it.integry.integrywmsnative.databinding.FragmentUltimiArriviFornitoreBinding; import it.integry.integrywmsnative.gest.picking_resi.PickingResiActivity; import it.integry.integrywmsnative.gest.ultimi_arrivi_fornitore.core.UltimiArriviFornitoreListAdapter; +import it.integry.integrywmsnative.gest.ultimi_arrivi_fornitore.dialog.DialogUltimiArriviFornitoreFiltroAvanzato; import it.integry.integrywmsnative.gest.ultimi_arrivi_fornitore.rest.UltimiArriviFornitoreRESTConsumer; import it.integry.integrywmsnative.ui.ElevatedToolbar; /** * A simple {@link Fragment} subclass. */ -public class UltimiArriviFornitoreFragment extends Fragment implements ITitledFragment, IScrollableFragment { +public class UltimiArriviFornitoreFragment extends Fragment implements ITitledFragment, IScrollableFragment, IFilterableFragment { private Runnable mOnPreDestroy; private ElevatedToolbar mToolbar; @@ -43,6 +45,11 @@ public class UltimiArriviFornitoreFragment extends Fragment implements ITitledFr private FragmentUltimiArriviFornitoreBinding mBinding; private List mItems; + private List mRenderedItems = new ArrayList<>(); + + private UltimiArriviFornitoreListAdapter mAdapter; + + private DialogUltimiArriviFornitoreFiltroAvanzato.DialogUltimiArriviFiltroAvanzatoViewModel mAppliedFilterViewModel; public UltimiArriviFornitoreFragment() { // Required empty public constructor @@ -116,7 +123,9 @@ public class UltimiArriviFornitoreFragment extends Fragment implements ITitledFr null, consegne -> { this.mItems = consegne; + this.initDataAdapter(consegne); + refreshRenderedOrdini(consegne); progressDialog.dismiss(); }, ex -> { @@ -124,13 +133,19 @@ public class UltimiArriviFornitoreFragment extends Fragment implements ITitledFr }); } + + private void refreshRenderedOrdini(List items) { + mRenderedItems.clear(); + if(items != null) mRenderedItems.addAll(items); + } + private void initDataAdapter(ArrayList dataset) { - UltimiArriviFornitoreListAdapter adapter = new UltimiArriviFornitoreListAdapter(getActivity(), dataset); - adapter.setOnSelectionChanged(this::onSingleSelectionChanged); + mAdapter = new UltimiArriviFornitoreListAdapter(getActivity(), dataset); + mAdapter.setOnSelectionChanged(this::onSingleSelectionChanged); mBinding.recyclerView.setHasFixedSize(true); mBinding.recyclerView.setLayoutManager(new LinearLayoutManager(getActivity())); - mBinding.recyclerView.setAdapter(adapter); + mBinding.recyclerView.setAdapter(mAdapter); mBinding.fastscroll.setRecyclerView(mBinding.recyclerView); } @@ -166,4 +181,23 @@ public class UltimiArriviFornitoreFragment extends Fragment implements ITitledFr PickingResiActivity.startActivity(getActivity(), getText(R.string.ultime_arrivi_fornitore_title).toString(), selectedConsegne, -1); } + @Override + public void onFilterClick() { + DialogUltimiArriviFornitoreFiltroAvanzato.make(getActivity(), mItems, mAppliedFilterViewModel, (filteredOrderList, filter) -> { + mAppliedFilterViewModel = filter; + + if(filteredOrderList != null){ + + refreshItems(filteredOrderList); + } + + }).show(); + } + + + private void refreshItems(List items){ + mRenderedItems.clear(); + mRenderedItems.addAll(items); + mAdapter.updateItems(mRenderedItems); + } } diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/ultimi_arrivi_fornitore/core/UltimiArriviFornitoreListAdapter.java b/app/src/main/java/it/integry/integrywmsnative/gest/ultimi_arrivi_fornitore/core/UltimiArriviFornitoreListAdapter.java index 30b8c768..a34152fe 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/ultimi_arrivi_fornitore/core/UltimiArriviFornitoreListAdapter.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/ultimi_arrivi_fornitore/core/UltimiArriviFornitoreListAdapter.java @@ -70,29 +70,7 @@ public class UltimiArriviFornitoreListAdapter extends SectionedRecyclerViewAdapt this.mDataset = new ArrayList<>(); this.mSectionTitleItems = new ArrayList<>(); - this.mDataset = Stream.of(dataset) - .sortBy(DocumentoResoDTO::getRagSoc) - .toList(); - - - Stream.of(mDataset) - .map(DocumentoResoDTO::getRagSoc) - .distinct() - .forEach(x -> { - this.mSectionTitleItems.add(String.valueOf(x.charAt(0))); - - long count = Stream.of(dataset) - .filter(y -> y.getRagSoc().equalsIgnoreCase(x)) - .count(); - - - for(int i = 0; i < count; i++) this.mSectionTitleItems.add(String.valueOf(x.charAt(0))); - }); - - long count = Stream.of(dataset) - .filter(x -> UtilityString.isNullOrEmpty(x.getRagSoc())) - .count(); - + mDataset.addAll(sort(dataset)); } @@ -171,9 +149,42 @@ public class UltimiArriviFornitoreListAdapter extends SectionedRecyclerViewAdapt } + + public void updateItems(List updatedDataset) { + mDataset.clear(); + mDataset.addAll(sort(updatedDataset)); + notifyDataSetChanged(); + notifyDataChanged(); + } + + public void setOnSelectionChanged(RunnableArgs mSelectionChanged) { this.mOnSelectionChanged = mSelectionChanged; } + private List sort(List dataset) { + List items = Stream.of(dataset) + .sortBy(DocumentoResoDTO::getRagSoc) + .toList(); + + + Stream.of(items) + .map(DocumentoResoDTO::getRagSoc) + .distinct() + .forEach(x -> { + this.mSectionTitleItems.add(String.valueOf(x.charAt(0))); + + long count = Stream.of(dataset) + .filter(y -> y.getRagSoc().equalsIgnoreCase(x)) + .count(); + + + for(int i = 0; i < count; i++) this.mSectionTitleItems.add(String.valueOf(x.charAt(0))); + }); + return items; + + } + + } diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/ultimi_arrivi_fornitore/dialog/DialogUltimiArriviFornitoreFiltroAvanzato.java b/app/src/main/java/it/integry/integrywmsnative/gest/ultimi_arrivi_fornitore/dialog/DialogUltimiArriviFornitoreFiltroAvanzato.java new file mode 100644 index 00000000..d0f4a6b5 --- /dev/null +++ b/app/src/main/java/it/integry/integrywmsnative/gest/ultimi_arrivi_fornitore/dialog/DialogUltimiArriviFornitoreFiltroAvanzato.java @@ -0,0 +1,206 @@ +package it.integry.integrywmsnative.gest.ultimi_arrivi_fornitore.dialog; + +import android.app.DatePickerDialog; +import android.content.Context; +import android.graphics.Color; +import android.graphics.drawable.ColorDrawable; +import android.view.LayoutInflater; +import android.view.WindowManager; +import android.widget.ArrayAdapter; + +import androidx.appcompat.app.AlertDialog; +import androidx.databinding.DataBindingUtil; + +import com.annimon.stream.Stream; +import com.annimon.stream.function.Predicate; + +import java.util.Calendar; +import java.util.Date; +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.RunnableArgss; +import it.integry.integrywmsnative.core.rest.model.DocumentoResoDTO; +import it.integry.integrywmsnative.core.utility.UtilityDate; +import it.integry.integrywmsnative.core.utility.UtilityString; +import it.integry.integrywmsnative.databinding.DialogUltimeConsegneFiltroAvanzatoBinding; +import it.integry.integrywmsnative.databinding.DialogUltimiArriviFornitoreFiltroAvanzatoBinding; +import it.integry.integrywmsnative.gest.ultime_consegne_cliente.dialog.DialogUltimeConsegneFiltroAvanzato; + +public class DialogUltimiArriviFornitoreFiltroAvanzato { + + private AlertDialog mAlert; + private Context mContext; + private DialogUltimiArriviFiltroAvanzatoViewModel mBaseViewModel; + private RunnableArgss, DialogUltimiArriviFiltroAvanzatoViewModel> mOnDismiss; + + + + private ArrayAdapter arrayAdapterRagSoc; + + private List mItems; + private List mFilteredItems; + + private Predicate currentRagSocPredicate = null; + private Predicate currentDataDocPredicate = null; + + public static AlertDialog make(final Context context, + final List items, + DialogUltimiArriviFiltroAvanzatoViewModel baseViewModel, + RunnableArgss, DialogUltimiArriviFiltroAvanzatoViewModel> onDismiss) { + return new DialogUltimiArriviFornitoreFiltroAvanzato(context, items, baseViewModel, onDismiss).mAlert; + } + + public DialogUltimiArriviFornitoreFiltroAvanzato(final Context context, + final List items, + DialogUltimiArriviFiltroAvanzatoViewModel baseViewModel, + RunnableArgss, DialogUltimiArriviFiltroAvanzatoViewModel> onDismiss) { + mContext = context; + mItems = items; + mBaseViewModel = baseViewModel; + mOnDismiss = onDismiss; + + DialogUltimiArriviFiltroAvanzatoViewModel viewModel = baseViewModel != null ? baseViewModel : new DialogUltimiArriviFiltroAvanzatoViewModel(); + + LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); + DialogUltimiArriviFornitoreFiltroAvanzatoBinding binding = DataBindingUtil.inflate(inflater, R.layout.dialog_ultimi_arrivi_fornitore_filtro_avanzato, null, false); + + final AlertDialog.Builder dialog = new AlertDialog.Builder(context) + .setView(binding.getRoot()); + + binding.setViewmodel(viewModel); + initViewModelNew(viewModel); + initView(binding, viewModel); + + mAlert = dialog.create(); + mAlert.setCanceledOnTouchOutside(false); + + mAlert.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE); + mAlert.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); + + binding.positiveBtn.setOnClickListener(view -> { + mAlert.dismiss(); + }); + + binding.neutralBtn.setOnClickListener(view -> { + resetAll(viewModel); + }); + + + mAlert.setOnDismissListener(dialogInterface -> { + if(mOnDismiss != null) mOnDismiss.run(mFilteredItems, viewModel); + }); + + refreshList(); + + } + + private void resetAll(DialogUltimiArriviFiltroAvanzatoViewModel viewModel) { + viewModel.ragSoc.set(null); + viewModel.dataDoc.set(null); + } + + private void initView(DialogUltimiArriviFornitoreFiltroAvanzatoBinding bindings, DialogUltimiArriviFiltroAvanzatoViewModel viewModel) { + + arrayAdapterRagSoc = new ArrayAdapter(mContext, R.layout.dialog_vendita_filtro_avanzato__single_item); + arrayAdapterRagSoc.addAll(getAvailableRagSocs(false)); + bindings.filledExposedDropdownRagSoc.setAdapter(arrayAdapterRagSoc); + + bindings.filledExposedDropdownDataDoc.setOnClickListener(view -> { + Calendar c = UtilityDate.getCalendarInstance(); + + if(viewModel.dataDocDate != null) { + c.setTime(viewModel.dataDocDate); + } + + int mYear = c.get(Calendar.YEAR); + int mMonth = c.get(Calendar.MONTH); + int mDay = c.get(Calendar.DAY_OF_MONTH); + + DatePickerDialog datePickerDialog = new DatePickerDialog(mContext, + (view2, year, month, day) -> { + + viewModel.dataDocDate = new GregorianCalendar(year, month, day).getTime(); + viewModel.dataDoc.set(UtilityDate.formatDate(viewModel.dataDocDate, UtilityDate.COMMONS_DATE_FORMATS.DMY_HUMAN)); + + }, mYear, mMonth, mDay); + datePickerDialog.show(); + }); + + + viewModel.ragSoc.refresh(); + viewModel.dataDoc.refresh(); + } + + private void initViewModelNew(DialogUltimiArriviFiltroAvanzatoViewModel viewModel) { + + BindableString.resetListeners(viewModel.ragSoc); + BindableString.registerListener(viewModel.ragSoc, value -> { + if (UtilityString.isNullOrEmpty(value)) currentRagSocPredicate = null; + else { + currentRagSocPredicate = o -> o.getRagSoc().equalsIgnoreCase(viewModel.ragSoc.get()); + } + + refreshList(); + }); + + BindableString.resetListeners(viewModel.dataDoc); + BindableString.registerListener(viewModel.dataDoc, value -> { + if (UtilityString.isNullOrEmpty(value)) currentDataDocPredicate = null; + else { + currentDataDocPredicate = o -> o.getDataDocD().equals(viewModel.dataDocDate); + } + + refreshList(); + + arrayAdapterRagSoc.clear(); + arrayAdapterRagSoc.addAll(getAvailableRagSocs(true)); + }); + } + + private List getAvailableRagSocs(boolean skipRecalc) { + if(currentDataDocPredicate == null){ + mFilteredItems = mItems; + } else if(!skipRecalc){ + Stream tmpStream = Stream.of(mItems) + .filter(x -> + (currentDataDocPredicate == null || (currentDataDocPredicate.test(x))) + ); + + mFilteredItems = tmpStream.toList(); + } + + return Stream.of(mFilteredItems).map(DocumentoResoDTO::getRagSoc).distinct().withoutNulls().toList(); + } + + + private void refreshList() { + + if(currentRagSocPredicate == null && currentDataDocPredicate == null){ + mFilteredItems = mItems; + } else { + Stream tmpStream = Stream.of(mItems) + .filter(x -> + (currentRagSocPredicate == null || (currentRagSocPredicate.test(x))) && + (currentDataDocPredicate== null || (currentDataDocPredicate.test(x))) + ); + + mFilteredItems = tmpStream.toList(); + } + + + } + + + + public class DialogUltimiArriviFiltroAvanzatoViewModel { + + public BindableString ragSoc = new BindableString(); + public BindableString dataDoc = new BindableString(); + + public Date dataDocDate; + } + +} 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 bbc9a902..bd49de29 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,6 +1,6 @@ package it.integry.integrywmsnative.gest.vendita.dialogs; -import android.app.AlertDialog; +import androidx.appcompat.app.AlertDialog; import android.app.DatePickerDialog; import android.content.Context; diff --git a/app/src/main/java/it/integry/integrywmsnative/view/dialogs/base/DialogSimpleMessageHelper.java b/app/src/main/java/it/integry/integrywmsnative/view/dialogs/base/DialogSimpleMessageHelper.java index 8e98734d..964ac72e 100644 --- a/app/src/main/java/it/integry/integrywmsnative/view/dialogs/base/DialogSimpleMessageHelper.java +++ b/app/src/main/java/it/integry/integrywmsnative/view/dialogs/base/DialogSimpleMessageHelper.java @@ -1,7 +1,7 @@ package it.integry.integrywmsnative.view.dialogs.base; import android.app.Activity; -import android.app.AlertDialog; +import androidx.appcompat.app.AlertDialog; import android.app.Dialog; import android.content.Context; import android.content.res.ColorStateList; diff --git a/app/src/main/java/it/integry/integrywmsnative/view/dialogs/input_quantity/DialogInputQuantity.java b/app/src/main/java/it/integry/integrywmsnative/view/dialogs/input_quantity/DialogInputQuantity.java index 8f9b41d6..dce07584 100644 --- a/app/src/main/java/it/integry/integrywmsnative/view/dialogs/input_quantity/DialogInputQuantity.java +++ b/app/src/main/java/it/integry/integrywmsnative/view/dialogs/input_quantity/DialogInputQuantity.java @@ -1,6 +1,6 @@ package it.integry.integrywmsnative.view.dialogs.input_quantity; -import android.app.AlertDialog; +import androidx.appcompat.app.AlertDialog; import android.app.DatePickerDialog; import android.app.Dialog; import android.app.ProgressDialog; diff --git a/app/src/main/res/layout/dialog_ultimi_arrivi_fornitore_filtro_avanzato.xml b/app/src/main/res/layout/dialog_ultimi_arrivi_fornitore_filtro_avanzato.xml new file mode 100644 index 00000000..b6c3b0c7 --- /dev/null +++ b/app/src/main/res/layout/dialog_ultimi_arrivi_fornitore_filtro_avanzato.xml @@ -0,0 +1,136 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file