Implementato filtro avanzato per Ultimi arrivi fornitori.

This commit is contained in:
Giuseppe Scorrano 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;

View File

@ -0,0 +1,136 @@
<?xml version="1.0" encoding="utf-8"?>
<layout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<data>
<variable
name="viewmodel"
type="it.integry.integrywmsnative.gest.ultimi_arrivi_fornitore.dialog.DialogUltimiArriviFornitoreFiltroAvanzato.DialogUltimiArriviFiltroAvanzatoViewModel" />
</data>
<androidx.cardview.widget.CardView
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:cardCornerRadius="12dp"
app:cardElevation="0dp">
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="16dp">
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/title_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
style="@style/TextViewMaterial.DialogTitle"
android:text="@string/dialog_vendita_filtro_avanzato"
android:gravity="center_horizontal"
android:layout_marginBottom="12dp"/>
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/input_cod_rag_soc"
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox.Dense.ExposedDropdownMenu"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:imeOptions="actionNext"
android:nextFocusDown="@id/input_data_doc"
android:hint="@string/rag_soc">
<androidx.appcompat.widget.AppCompatAutoCompleteTextView
android:id="@+id/filled_exposed_dropdown_rag_soc"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:singleLine="true"
android:ellipsize="end"
android:imeOptions="actionNext"
android:nextFocusDown="@id/input_data_doc"
app:binding="@{viewmodel.ragSoc}" />
</com.google.android.material.textfield.TextInputLayout>
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/input_data_doc"
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/ship_date">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/filled_exposed_dropdown_data_doc"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="textNoSuggestions"
android:focusable="false"
android:singleLine="true"
app:binding="@{viewmodel.dataDoc}"/>
</com.google.android.material.textfield.TextInputLayout>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="24dp"
android:layout_marginEnd="24dp"
android:layout_marginTop="8dp">
<androidx.constraintlayout.widget.Guideline
android:id="@+id/buttons_guideline"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_percent="0.5"/>
<com.google.android.material.button.MaterialButton
android:id="@+id/neutral_btn"
android:layout_width="0dp"
android:layout_height="wrap_content"
style="@style/Button.PrimaryOutline"
android:layout_marginLeft="8dp"
android:layout_marginRight="8dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toStartOf="@id/buttons_guideline"
app:strokeColor="@color/colorPrimary"
android:text="@string/reset"/>
<com.google.android.material.button.MaterialButton
android:id="@+id/positive_btn"
android:layout_width="0dp"
android:layout_height="wrap_content"
style="@style/Button.PrimaryFull"
android:layout_marginLeft="8dp"
android:layout_marginRight="8dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="@id/buttons_guideline"
app:layout_constraintEnd_toEndOf="parent"
android:text="@string/confirm"/>
</androidx.constraintlayout.widget.ConstraintLayout>
</LinearLayout>
</ScrollView>
</androidx.cardview.widget.CardView>
</layout>