diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/accettazione_picking/AccettazionePickingActivity.java b/app/src/main/java/it/integry/integrywmsnative/gest/accettazione_picking/AccettazionePickingActivity.java index b993ed1e..9d32ba24 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/accettazione_picking/AccettazionePickingActivity.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/accettazione_picking/AccettazionePickingActivity.java @@ -21,6 +21,8 @@ import java.math.BigDecimal; import java.util.ArrayList; import java.util.Date; import java.util.List; +import java.util.Map; +import java.util.Objects; import javax.inject.Inject; @@ -33,6 +35,7 @@ import it.integry.integrywmsnative.core.barcode_reader.BarcodeManager; import it.integry.integrywmsnative.core.data_cache.DataCache; import it.integry.integrywmsnative.core.di.BindableBoolean; import it.integry.integrywmsnative.core.expansion.BaseActivity; +import it.integry.integrywmsnative.core.expansion.OnGeneralChangedCallback; import it.integry.integrywmsnative.core.expansion.RunnableArgs; import it.integry.integrywmsnative.core.expansion.RunnableArgss; import it.integry.integrywmsnative.core.model.MtbAart; @@ -50,19 +53,24 @@ import it.integry.integrywmsnative.core.utility.UtilityToast; import it.integry.integrywmsnative.databinding.ActivityAccettazioneOrdineInevasoBinding; import it.integry.integrywmsnative.gest.accettazione.dto.OrdineAccettazioneInevasoDTO; import it.integry.integrywmsnative.gest.accettazione.dto.SitArtOrdDTO; -import it.integry.integrywmsnative.gest.accettazione_picking.ui.AccettazioneListAdapter; -import it.integry.integrywmsnative.gest.accettazione_picking.ui.AccettazioneListModel; import it.integry.integrywmsnative.gest.accettazione_picking.dto.AccettazioneOrdineInevasoOrderBy; import it.integry.integrywmsnative.gest.accettazione_picking.dto.PickingObjectDTO; +import it.integry.integrywmsnative.gest.accettazione_picking.filters.AccettazionePickingFiltroOrdineViewModel; +import it.integry.integrywmsnative.gest.accettazione_picking.filters.FilterCodArtLayoutView; +import it.integry.integrywmsnative.gest.accettazione_picking.filters.FilterDescrLayoutView; import it.integry.integrywmsnative.gest.accettazione_picking.rest.RecoverMtbColt; +import it.integry.integrywmsnative.gest.accettazione_picking.ui.AccettazioneListAdapter; +import it.integry.integrywmsnative.gest.accettazione_picking.ui.AccettazioneListModel; import it.integry.integrywmsnative.gest.lista_bancali.ListaBancaliActivity; import it.integry.integrywmsnative.gest.spedizione.exceptions.InvalidPesoKGException; import it.integry.integrywmsnative.gest.spedizione.model.PickedQuantityDTO; +import it.integry.integrywmsnative.ui.filter_chips.FilterChipDTO; +import it.integry.integrywmsnative.ui.filter_chips.FilterChipView; import it.integry.integrywmsnative.view.bottom_sheet__lu_content.BottomSheetFragmentLUContentView; import it.integry.integrywmsnative.view.bottom_sheet__lu_content.BottomSheetFragmentLUContentViewModel; import it.integry.integrywmsnative.view.dialogs.base.DialogSimpleMessageView; -import it.integry.integrywmsnative.view.dialogs.input_quantity_v2.DialogInputQuantityV2View; import it.integry.integrywmsnative.view.dialogs.input_quantity_v2.DialogInputQuantityV2DTO; +import it.integry.integrywmsnative.view.dialogs.input_quantity_v2.DialogInputQuantityV2View; import it.integry.integrywmsnative.view.dialogs.note_aggiuntive_lu.NoteAggiuntiveLUDialog; public class AccettazionePickingActivity extends BaseActivity implements AccettazionePickingViewModel.Listener, BottomSheetFragmentLUContentViewModel.Listener, BottomSheetFragmentLUContentView.Listener { @@ -72,6 +80,8 @@ public class AccettazionePickingActivity extends BaseActivity implements Accetta @Inject AccettazionePickingViewModel mViewModel; + private final AccettazionePickingFiltroOrdineViewModel mAppliedFilterViewModel = new AccettazionePickingFiltroOrdineViewModel(); + private BottomSheetFragmentLUContentViewModel mBottomSheetFragmentLUContentViewModel; private final ObservableArrayList mAccettazioneMutableData = new ObservableArrayList<>(); @@ -123,6 +133,7 @@ public class AccettazionePickingActivity extends BaseActivity implements Accetta this.initVars(); this.initBarcodeReader(); this.initRecyclerView(); + this.initFilters(); String codMdep = SettingsManager.i().getUserSession().getDepo().getCodMdep(); @@ -130,7 +141,122 @@ public class AccettazionePickingActivity extends BaseActivity implements Accetta mViewModel.init(mOrders, mSitArts, codMdep); } - @Override + private void initFilters() { + + var onPredicateChanged = new OnGeneralChangedCallback() { + @Override + public void run() { + refreshList(); + } + }; + + mAppliedFilterViewModel.getCurrentCodArtPredicate().addOnPropertyChangedCallback(onPredicateChanged); + mAppliedFilterViewModel.getCurrentDescrPredicate().addOnPropertyChangedCallback(onPredicateChanged); + + List filterList = Stream.of(AccettazionePickingBindings.AVAILABLE_FILTERS.entrySet()) + .map(Map.Entry::getValue) + .sortBy(FilterChipDTO::getPosizione) + .toList(); + + for (FilterChipDTO filterChipDTO : filterList) { + + FilterChipView filterChipView = new FilterChipView( + this, + filterChipDTO.getFilterChipText(), + v -> initBottomSheetDialogFilter(filterChipDTO)); + + switch (filterChipDTO.getID()) { + case AccettazionePickingBindings.COD_ART_FILTER_ID: + mAppliedFilterViewModel.getCurrentCodArtPredicate().addOnPropertyChangedCallback(new OnGeneralChangedCallback() { + @Override + public void run() { + if (mAppliedFilterViewModel.getCurrentCodArtPredicate().get() == null) { + filterChipView.disableCloseIcon(); + + mBindings.filterChipsGroup.removeView(filterChipView); + mBindings.filterChipsGroup.addView(filterChipView); + mBindings.filterChips.smoothScrollTo(0, 0); + } else { + filterChipView.enableCloseIcon(); + + mBindings.filterChipsGroup.removeView(filterChipView); + mBindings.filterChipsGroup.addView(filterChipView, 0); + mBindings.filterChips.smoothScrollTo(0, 0); + } + } + }); + filterChipView.setOnResetClicked(() -> mAppliedFilterViewModel.getCurrentCodArtPredicate().set(null)); + break; + case AccettazionePickingBindings.DESCR_FILTER_ID: + mAppliedFilterViewModel.getCurrentDescrPredicate().addOnPropertyChangedCallback(new OnGeneralChangedCallback() { + @Override + public void run() { + if (mAppliedFilterViewModel.getCurrentDescrPredicate().get() == null) { + filterChipView.disableCloseIcon(); + + mBindings.filterChipsGroup.removeView(filterChipView); + mBindings.filterChipsGroup.addView(filterChipView); + mBindings.filterChips.smoothScrollTo(0, 0); + } else { + filterChipView.enableCloseIcon(); + + mBindings.filterChipsGroup.removeView(filterChipView); + mBindings.filterChipsGroup.addView(filterChipView, 0); + mBindings.filterChips.smoothScrollTo(0, 0); + } + } + }); + filterChipView.setOnResetClicked(() -> mAppliedFilterViewModel.getCurrentDescrPredicate().set(null)); + break; + } + + this.mBindings.filterChipsGroup.addView(filterChipView); + } + } + + + private void initBottomSheetDialogFilter(FilterChipDTO filterChipDTO) { + + filterChipDTO + .getFilterLayoutView() + .setFilterName(filterChipDTO.getFilterChipText()) + .setContext(this); + + var filterLayoutView = filterChipDTO + .getFilterLayoutView(); + + switch (filterChipDTO.getID()) { + case AccettazionePickingBindings.COD_ART_FILTER_ID: + ((FilterCodArtLayoutView) filterLayoutView) + .setAll(mAppliedFilterViewModel.getAllCodArts()) + .setAvailable(mAppliedFilterViewModel.getAvailableCodArts()) + .setOnFilterApplied(mAppliedFilterViewModel::setCodArtFilter) + .setPreselected(Stream.of(Objects.requireNonNull(mViewModel.getPickingList().getValue())) + .filter(mAppliedFilterViewModel.getCurrentCodArtPredicate().get() == null ? + x -> false : + mAppliedFilterViewModel.getCurrentCodArtPredicate().get()) + .map(x -> x.getSitArtOrdDTO().getCodMart()) + .toList()); + break; + case AccettazionePickingBindings.DESCR_FILTER_ID: + ((FilterDescrLayoutView) filterLayoutView) + .setAll(mAppliedFilterViewModel.getAllDescrs()) + .setAvailable(mAppliedFilterViewModel.getAvailableDescrs()) + .setOnFilterApplied(mAppliedFilterViewModel::setDescrFilter) + .setPreselected(Stream.of(Objects.requireNonNull(mViewModel.getPickingList().getValue())) + .filter(mAppliedFilterViewModel.getCurrentDescrPredicate().get() == null ? + x -> false : + mAppliedFilterViewModel.getCurrentDescrPredicate().get()) + .map(x -> x.getSitArtOrdDTO().getDescrizioneEstesaArt()) + .toList()); + break; + + } + + filterLayoutView.show(getSupportFragmentManager(), "TAG"); + } + + @Override public boolean onSupportNavigateUp() { onBackPressed(); return true; @@ -189,6 +315,8 @@ public class AccettazionePickingActivity extends BaseActivity implements Accetta this.mBindings.accettazionePickingList.setLayoutManager(new LinearLayoutManager(this)); this.mViewModel.getPickingList().observe(this, updatedData -> { + mAppliedFilterViewModel.init(updatedData); + refreshList(); }); @@ -198,9 +326,28 @@ public class AccettazionePickingActivity extends BaseActivity implements Accetta } private void refreshList() { - this.mAccettazioneMutableData.clear(); - this.mAccettazioneMutableData.addAll(convertDataModelToListModel(this.mViewModel.getPickingList().getValue())); - this.noItemsToPick.set(!isThereAnyItemToPick(this.mViewModel.getPickingList().getValue())); + this.onLoadingStarted(); + + //new Thread(() -> { + + runOnUiThread(() -> { + List tmpList; + + if (mAppliedFilterViewModel != null) { + mAppliedFilterViewModel.applyAllTests(); + tmpList = mAppliedFilterViewModel.getMutableFilteredOrderList().getValue(); + } else { + tmpList = mViewModel.getPickingList().getValue(); + } + + var list = convertDataModelToListModel(tmpList); + + this.mAccettazioneMutableData.clear(); + this.mAccettazioneMutableData.addAll(list); + this.noItemsToPick.set(!isThereAnyItemToPick(tmpList)); + + this.onLoadingEnded(); + }); } private List convertDataModelToListModel(List dataList) { diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/accettazione_picking/AccettazionePickingBindings.java b/app/src/main/java/it/integry/integrywmsnative/gest/accettazione_picking/AccettazionePickingBindings.java new file mode 100644 index 00000000..f09189db --- /dev/null +++ b/app/src/main/java/it/integry/integrywmsnative/gest/accettazione_picking/AccettazionePickingBindings.java @@ -0,0 +1,29 @@ +package it.integry.integrywmsnative.gest.accettazione_picking; + +import java.util.HashMap; + +import it.integry.integrywmsnative.gest.accettazione_picking.filters.FilterCodArtLayoutView; +import it.integry.integrywmsnative.gest.accettazione_picking.filters.FilterDescrLayoutView; +import it.integry.integrywmsnative.ui.filter_chips.FilterChipDTO; + +public class AccettazionePickingBindings { + + public static final int COD_ART_FILTER_ID = 0; + public static final int DESCR_FILTER_ID = 1; + + public static final HashMap AVAILABLE_FILTERS = new HashMap<>() { + { + put(COD_ART_FILTER_ID, new FilterChipDTO() + .setID(COD_ART_FILTER_ID) + .setPosizione(0) + .setFilterChipText("Codice articolo") + .setFilterLayoutView(new FilterCodArtLayoutView())); + + put(DESCR_FILTER_ID, new FilterChipDTO() + .setID(DESCR_FILTER_ID) + .setPosizione(1) + .setFilterChipText("Descrizione articolo") + .setFilterLayoutView(new FilterDescrLayoutView())); + }}; + +} diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/accettazione_picking/filters/AccettazionePickingFiltroOrdineViewModel.java b/app/src/main/java/it/integry/integrywmsnative/gest/accettazione_picking/filters/AccettazionePickingFiltroOrdineViewModel.java new file mode 100644 index 00000000..741841bf --- /dev/null +++ b/app/src/main/java/it/integry/integrywmsnative/gest/accettazione_picking/filters/AccettazionePickingFiltroOrdineViewModel.java @@ -0,0 +1,128 @@ +package it.integry.integrywmsnative.gest.accettazione_picking.filters; + +import androidx.databinding.ObservableField; +import androidx.lifecycle.MutableLiveData; + +import com.annimon.stream.Stream; +import com.annimon.stream.function.Predicate; + +import java.util.List; +import java.util.Objects; + +import it.integry.integrywmsnative.gest.accettazione_picking.dto.PickingObjectDTO; + +public class AccettazionePickingFiltroOrdineViewModel { + + private final ObservableField> currentCodArtPredicate = new ObservableField<>(); + private final ObservableField> currentDescrPredicate = new ObservableField<>(); + + + private List initialOrderList; + private final MutableLiveData> currentFilteredOrderList = new MutableLiveData<>(); + + public void init(List initialList) { + this.initialOrderList = initialList; + this.currentFilteredOrderList.setValue(this.initialOrderList); + } + + public MutableLiveData> getMutableFilteredOrderList() { + return this.currentFilteredOrderList; + } + + + + public void setCodArtFilter(List codArts) { + if (codArts == null || codArts.isEmpty()) currentCodArtPredicate.set(null); + else { + currentCodArtPredicate.set(o -> codArts.contains(o.getSitArtOrdDTO().getCodMart())); + } + } + + + public void setDescrFilter(List descrs) { + if (descrs == null || descrs.isEmpty()) currentDescrPredicate.set(null); + else { + currentDescrPredicate.set(o -> descrs.contains(o.getSitArtOrdDTO().getDescrizioneEstesaArt())); + } + } + + + public void applyAllTests() { + + List returnList = null; + + if (currentCodArtPredicate.get() == null && + currentDescrPredicate.get() == null) { + returnList = this.initialOrderList; + } else { + Stream tmpStream = Stream.of(this.initialOrderList) + .filter(x -> + (currentCodArtPredicate.get() == null || (currentCodArtPredicate.get().test(x))) && + (currentDescrPredicate.get() == null || (currentDescrPredicate.get().test(x))) + ); + + returnList = tmpStream.toList(); + } + + this.currentFilteredOrderList.setValue(returnList); + } + + public ObservableField> getCurrentCodArtPredicate() { + return currentCodArtPredicate; + } + + public ObservableField> getCurrentDescrPredicate() { + return currentDescrPredicate; + } + + public List getAllCodArts() { + return Stream + .of(Objects.requireNonNull(initialOrderList)) + .filter(x -> x.getSitArtOrdDTO().getCodMart() != null) + .sortBy(x -> x.getSitArtOrdDTO().getCodMart()) + .map(x -> x.getSitArtOrdDTO().getCodMart() != null ? x.getSitArtOrdDTO().getCodMart() : null) + .distinct() + .toList(); + } + + public List getAvailableCodArts() { + + if (currentDescrPredicate.get() == null) { + return getAllCodArts(); + } else { + return Stream.of(this.initialOrderList) + .filter(x -> + (currentDescrPredicate.get() == null || (currentDescrPredicate.get().test(x))) + ) + .map(x -> x.getSitArtOrdDTO().getCodMart()) + .distinct() + .toList(); + } + } + + public List getAllDescrs() { + return Stream + .of(Objects.requireNonNull(initialOrderList)) + .filter(x -> x.getSitArtOrdDTO().getDescrizioneEstesaArt() != null) + .sortBy(x -> x.getSitArtOrdDTO().getDescrizioneEstesaArt()) + .map(x -> x.getSitArtOrdDTO().getDescrizioneEstesaArt() != null ? x.getSitArtOrdDTO().getDescrizioneEstesaArt() : null) + .distinct() + .toList(); + } + + public List getAvailableDescrs() { + + if (currentCodArtPredicate.get() == null) { + return getAllDescrs(); + } else { + return Stream.of(this.initialOrderList) + .filter(x -> + (currentCodArtPredicate.get() == null || (currentCodArtPredicate.get().test(x))) + ) + .map(x -> x.getSitArtOrdDTO().getDescrizioneEstesaArt()) + .distinct() + .toList(); + } + } + +} diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/accettazione_picking/filters/FilterCodArtLayoutView.java b/app/src/main/java/it/integry/integrywmsnative/gest/accettazione_picking/filters/FilterCodArtLayoutView.java new file mode 100644 index 00000000..67feac50 --- /dev/null +++ b/app/src/main/java/it/integry/integrywmsnative/gest/accettazione_picking/filters/FilterCodArtLayoutView.java @@ -0,0 +1,184 @@ +package it.integry.integrywmsnative.gest.accettazione_picking.filters; + +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.databinding.DataBindingUtil; +import androidx.lifecycle.MutableLiveData; + +import com.annimon.stream.ComparatorCompat; +import com.annimon.stream.Stream; +import com.ravikoradiya.liveadapter.LiveAdapter; + +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; +import java.util.Objects; + +import it.integry.integrywmsnative.BR; +import it.integry.integrywmsnative.R; +import it.integry.integrywmsnative.core.di.BindableBoolean; +import it.integry.integrywmsnative.core.expansion.RunnableArgs; +import it.integry.integrywmsnative.core.utility.UtilityBoolean; +import it.integry.integrywmsnative.databinding.LayoutFilterCodArtBinding; +import it.integry.integrywmsnative.ui.filter_chips.FilterLayoutView; + +public class FilterCodArtLayoutView extends FilterLayoutView { + + protected LayoutFilterCodArtBinding mBindings; + + private List all; + private List available; + private List preselected = new ArrayList<>(); + private List hidden = new ArrayList<>(); + private final MutableLiveData> listModel = new MutableLiveData<>(); + + private RunnableArgs> onFilterApplied; + + @Nullable + @Override + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + mBindings = DataBindingUtil.inflate(inflater, R.layout.layout_filter_cod_art, container, false); + this.mBindings.setView(this); + + refreshList(); + + this.setSearchView(this.mBindings.searchView, newFilter -> { + hidden = Stream.of(all) + .filter(x -> !x.toUpperCase(Locale.ROOT).contains(newFilter.toUpperCase(Locale.ROOT)) && + !x.toUpperCase(Locale.ROOT).contains(newFilter.toUpperCase(Locale.ROOT))) + .toList(); + + refreshList(); + }); + + + new LiveAdapter(listModel, getViewLifecycleOwner(), BR.item) + .map(ListModel.class, R.layout.layout_filter_cod_art__list_item) + .into(this.mBindings.recyclerview); + + return mBindings.getRoot(); + } + + + public void onConfirm() { + if (onFilterApplied == null) return; + + this.onFilterApplied.run(Stream.of(Objects.requireNonNull(listModel.getValue())) + .filter(x -> x.selected.get()) + .map(x -> x.originalModel) + .toList()); + + dismiss(); + } + + private void refreshList() { + ComparatorCompat c = + ComparatorCompat + .chain(new ComparatorCompat((x, y) -> UtilityBoolean.toInt(x.getSelected().get()) - UtilityBoolean.toInt(y.getSelected().get()))) + .thenComparing(new ComparatorCompat<>((x, y) -> UtilityBoolean.toInt(x.getEnabled().get()) - UtilityBoolean.toInt(y.getEnabled().get()))) + .thenComparing(new ComparatorCompat<>((x, y) -> y.getOriginalModel().compareToIgnoreCase(x.getOriginalModel()))) + .reversed(); + + + listModel.setValue(Stream.of(getAll()) + .filter(x -> !hidden.contains(x)) + .map(x -> { + var selectedBoolean = new BindableBoolean(preselected.contains(x)); + selectedBoolean.addOnPropertyChangedCallback(() -> { + if (selectedBoolean.get()) preselected.add(x); + else preselected.remove(x); + }); + + return new ListModel() + .setSelected(selectedBoolean) + .setEnabled(new BindableBoolean(available.contains(x))) + .setOriginalModel(x); + }) + .sorted(c) + .toList()); + } + + public List getAll() { + return all; + } + + public FilterCodArtLayoutView setAll(List all) { + this.all = all; + return this; + } + + public List getAvailable() { + return available; + } + + public FilterCodArtLayoutView setAvailable(List available) { + this.available = available; + return this; + } + + public List getPreselected() { + return preselected; + } + + public FilterCodArtLayoutView setPreselected(List preselected) { + this.preselected = preselected; + return this; + } + + public RunnableArgs> getOnFilterApplied() { + return onFilterApplied; + } + + public FilterCodArtLayoutView setOnFilterApplied(RunnableArgs> onFilterApplied) { + this.onFilterApplied = onFilterApplied; + return this; + } + + public List getHidden() { + return hidden; + } + + public FilterCodArtLayoutView setHidden(List hidden) { + this.hidden = hidden; + return this; + } + + public static class ListModel { + private BindableBoolean selected = new BindableBoolean(); + private BindableBoolean enabled = new BindableBoolean(); + private String originalModel; + + public BindableBoolean getSelected() { + return selected; + } + + public ListModel setSelected(BindableBoolean selected) { + this.selected = selected; + return this; + } + + public BindableBoolean getEnabled() { + return enabled; + } + + public ListModel setEnabled(BindableBoolean enabled) { + this.enabled = enabled; + return this; + } + + public String getOriginalModel() { + return originalModel; + } + + public ListModel setOriginalModel(String originalModel) { + this.originalModel = originalModel; + return this; + } + } + +} diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/accettazione_picking/filters/FilterDescrLayoutView.java b/app/src/main/java/it/integry/integrywmsnative/gest/accettazione_picking/filters/FilterDescrLayoutView.java new file mode 100644 index 00000000..2c21f806 --- /dev/null +++ b/app/src/main/java/it/integry/integrywmsnative/gest/accettazione_picking/filters/FilterDescrLayoutView.java @@ -0,0 +1,184 @@ +package it.integry.integrywmsnative.gest.accettazione_picking.filters; + +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.databinding.DataBindingUtil; +import androidx.lifecycle.MutableLiveData; + +import com.annimon.stream.ComparatorCompat; +import com.annimon.stream.Stream; +import com.ravikoradiya.liveadapter.LiveAdapter; + +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; +import java.util.Objects; + +import it.integry.integrywmsnative.BR; +import it.integry.integrywmsnative.R; +import it.integry.integrywmsnative.core.di.BindableBoolean; +import it.integry.integrywmsnative.core.expansion.RunnableArgs; +import it.integry.integrywmsnative.core.utility.UtilityBoolean; +import it.integry.integrywmsnative.databinding.LayoutFilterDescrBinding; +import it.integry.integrywmsnative.ui.filter_chips.FilterLayoutView; + +public class FilterDescrLayoutView extends FilterLayoutView { + + protected LayoutFilterDescrBinding mBindings; + + private List all; + private List available; + private List preselected = new ArrayList<>(); + private List hidden = new ArrayList<>(); + private final MutableLiveData> listModel = new MutableLiveData<>(); + + private RunnableArgs> onFilterApplied; + + @Nullable + @Override + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + mBindings = DataBindingUtil.inflate(inflater, R.layout.layout_filter_descr, container, false); + this.mBindings.setView(this); + + refreshList(); + + this.setSearchView(this.mBindings.searchView, newFilter -> { + hidden = Stream.of(all) + .filter(x -> !x.toUpperCase(Locale.ROOT).contains(newFilter.toUpperCase(Locale.ROOT)) && + !x.toUpperCase(Locale.ROOT).contains(newFilter.toUpperCase(Locale.ROOT))) + .toList(); + + refreshList(); + }); + + + new LiveAdapter(listModel, getViewLifecycleOwner(), BR.item) + .map(ListModel.class, R.layout.layout_filter_descr__list_item) + .into(this.mBindings.recyclerview); + + return mBindings.getRoot(); + } + + + public void onConfirm() { + if (onFilterApplied == null) return; + + this.onFilterApplied.run(Stream.of(Objects.requireNonNull(listModel.getValue())) + .filter(x -> x.selected.get()) + .map(x -> x.originalModel) + .toList()); + + dismiss(); + } + + private void refreshList() { + ComparatorCompat c = + ComparatorCompat + .chain(new ComparatorCompat((x, y) -> UtilityBoolean.toInt(x.getSelected().get()) - UtilityBoolean.toInt(y.getSelected().get()))) + .thenComparing(new ComparatorCompat<>((x, y) -> UtilityBoolean.toInt(x.getEnabled().get()) - UtilityBoolean.toInt(y.getEnabled().get()))) + .thenComparing(new ComparatorCompat<>((x, y) -> y.getOriginalModel().compareToIgnoreCase(x.getOriginalModel()))) + .reversed(); + + + listModel.setValue(Stream.of(getAll()) + .filter(x -> !hidden.contains(x)) + .map(x -> { + var selectedBoolean = new BindableBoolean(preselected.contains(x)); + selectedBoolean.addOnPropertyChangedCallback(() -> { + if (selectedBoolean.get()) preselected.add(x); + else preselected.remove(x); + }); + + return new ListModel() + .setSelected(selectedBoolean) + .setEnabled(new BindableBoolean(available.contains(x))) + .setOriginalModel(x); + }) + .sorted(c) + .toList()); + } + + public List getAll() { + return all; + } + + public FilterDescrLayoutView setAll(List all) { + this.all = all; + return this; + } + + public List getAvailable() { + return available; + } + + public FilterDescrLayoutView setAvailable(List available) { + this.available = available; + return this; + } + + public List getPreselected() { + return preselected; + } + + public FilterDescrLayoutView setPreselected(List preselected) { + this.preselected = preselected; + return this; + } + + public RunnableArgs> getOnFilterApplied() { + return onFilterApplied; + } + + public FilterDescrLayoutView setOnFilterApplied(RunnableArgs> onFilterApplied) { + this.onFilterApplied = onFilterApplied; + return this; + } + + public List getHidden() { + return hidden; + } + + public FilterDescrLayoutView setHidden(List hidden) { + this.hidden = hidden; + return this; + } + + public static class ListModel { + private BindableBoolean selected = new BindableBoolean(); + private BindableBoolean enabled = new BindableBoolean(); + private String originalModel; + + public BindableBoolean getSelected() { + return selected; + } + + public ListModel setSelected(BindableBoolean selected) { + this.selected = selected; + return this; + } + + public BindableBoolean getEnabled() { + return enabled; + } + + public ListModel setEnabled(BindableBoolean enabled) { + this.enabled = enabled; + return this; + } + + public String getOriginalModel() { + return originalModel; + } + + public ListModel setOriginalModel(String originalModel) { + this.originalModel = originalModel; + return this; + } + } + +} diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/ordini_uscita_elenco/OrdiniUscitaElencoFragment.java b/app/src/main/java/it/integry/integrywmsnative/gest/ordini_uscita_elenco/OrdiniUscitaElencoFragment.java index b79eadab..a88ded8a 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/ordini_uscita_elenco/OrdiniUscitaElencoFragment.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/ordini_uscita_elenco/OrdiniUscitaElencoFragment.java @@ -262,7 +262,10 @@ public class OrdiniUscitaElencoFragment extends BaseFragment implements ITitledF mAppliedFilterViewModel.getCurrentDataConsPredicate().addOnPropertyChangedCallback(onPredicateChanged); mAppliedFilterViewModel.getCurrentGruppoMercPredicate().addOnPropertyChangedCallback(onPredicateChanged); - List filterList = Stream.of(OrdiniUscitaElencoBindings.AVAILABLE_FILTERS.entrySet()).map(Map.Entry::getValue).sortBy(FilterChipDTO::getPosizione).toList(); + List filterList = Stream.of(OrdiniUscitaElencoBindings.AVAILABLE_FILTERS.entrySet()) + .map(Map.Entry::getValue) + .sortBy(FilterChipDTO::getPosizione) + .toList(); for (FilterChipDTO filterChipDTO : filterList) { diff --git a/app/src/main/res/layout/activity_accettazione_ordine_inevaso.xml b/app/src/main/res/layout/activity_accettazione_ordine_inevaso.xml index 108e3ee8..fa9161ba 100644 --- a/app/src/main/res/layout/activity_accettazione_ordine_inevaso.xml +++ b/app/src/main/res/layout/activity_accettazione_ordine_inevaso.xml @@ -48,6 +48,24 @@ app:layout_collapseMode="pin" style="@style/AppTheme.NewMaterial.Text" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/layout_filter_cod_art__list_item.xml b/app/src/main/res/layout/layout_filter_cod_art__list_item.xml new file mode 100644 index 00000000..6a3d78c5 --- /dev/null +++ b/app/src/main/res/layout/layout_filter_cod_art__list_item.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/layout_filter_descr.xml b/app/src/main/res/layout/layout_filter_descr.xml new file mode 100644 index 00000000..973b2c76 --- /dev/null +++ b/app/src/main/res/layout/layout_filter_descr.xml @@ -0,0 +1,114 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/layout_filter_descr__list_item.xml b/app/src/main/res/layout/layout_filter_descr__list_item.xml new file mode 100644 index 00000000..296a24b3 --- /dev/null +++ b/app/src/main/res/layout/layout_filter_descr__list_item.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file