Implementato filtro avanzato per Ultimi arrivi fornitori.

This commit is contained in:
2019-11-11 15:35:14 +01:00
parent 300b1e4529
commit b25c94f38d
9 changed files with 419 additions and 32 deletions

View File

@@ -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;

View File

@@ -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;

View File

@@ -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<DocumentoResoDTO> mItems;
private List<DocumentoResoDTO> 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<DocumentoResoDTO> items) {
mRenderedItems.clear();
if(items != null) mRenderedItems.addAll(items);
}
private void initDataAdapter(ArrayList<DocumentoResoDTO> 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<DocumentoResoDTO> items){
mRenderedItems.clear();
mRenderedItems.addAll(items);
mAdapter.updateItems(mRenderedItems);
}
}

View File

@@ -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<DocumentoResoDTO> updatedDataset) {
mDataset.clear();
mDataset.addAll(sort(updatedDataset));
notifyDataSetChanged();
notifyDataChanged();
}
public void setOnSelectionChanged(RunnableArgs<DocumentoResoDTO> mSelectionChanged) {
this.mOnSelectionChanged = mSelectionChanged;
}
private List<DocumentoResoDTO> sort(List<DocumentoResoDTO> dataset) {
List<DocumentoResoDTO> 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;
}
}

View File

@@ -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<List<DocumentoResoDTO>, DialogUltimiArriviFiltroAvanzatoViewModel> mOnDismiss;
private ArrayAdapter<String> arrayAdapterRagSoc;
private List<DocumentoResoDTO> mItems;
private List<DocumentoResoDTO> mFilteredItems;
private Predicate<DocumentoResoDTO> currentRagSocPredicate = null;
private Predicate<DocumentoResoDTO> currentDataDocPredicate = null;
public static AlertDialog make(final Context context,
final List<DocumentoResoDTO> items,
DialogUltimiArriviFiltroAvanzatoViewModel baseViewModel,
RunnableArgss<List<DocumentoResoDTO>, DialogUltimiArriviFiltroAvanzatoViewModel> onDismiss) {
return new DialogUltimiArriviFornitoreFiltroAvanzato(context, items, baseViewModel, onDismiss).mAlert;
}
public DialogUltimiArriviFornitoreFiltroAvanzato(final Context context,
final List<DocumentoResoDTO> items,
DialogUltimiArriviFiltroAvanzatoViewModel baseViewModel,
RunnableArgss<List<DocumentoResoDTO>, 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<String> getAvailableRagSocs(boolean skipRecalc) {
if(currentDataDocPredicate == null){
mFilteredItems = mItems;
} else if(!skipRecalc){
Stream<DocumentoResoDTO> 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<DocumentoResoDTO> 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;
}
}

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;