Implementati primi filtri per DialogFiltroAvanzatoVendita.

This commit is contained in:
Gius95 2018-12-06 00:26:05 +01:00
parent 08431d3e44
commit 93cd8227c1
11 changed files with 390 additions and 16 deletions

View File

@ -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<String> onValueChanged) {
bindableString.addOnPropertyChangedCallback(new OnPropertyChangedCallback() {
@Override
public void onPropertyChanged(Observable sender, int propertyId) {
if(onValueChanged != null) onValueChanged.run(bindableString.get());
}
});
}
}

View File

@ -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();
}
}

View File

@ -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<OrdineVenditaInevasoDTO> mOriginalOrderList;
private List<OrdineVenditaGroupedInevasoDTO> groupedOrdiniInevasi;
public MainVenditaFragment() {
@ -112,12 +114,15 @@ public class MainVenditaFragment extends Fragment implements ITitledFragment, IR
@Override
public void onLoadSuccess(List<OrdineVenditaInevasoDTO> 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<OrdineVenditaInevasoDTO> ordini){
private void groupOrdini(List<OrdineVenditaInevasoDTO> 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<OrdineVenditaGroupedInevasoDTO> onGroupSelectionChanged = dto -> {
List<OrdineVenditaGroupedInevasoDTO> 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();
}
}

View File

@ -47,6 +47,12 @@ public class MainListVenditaAdapter extends RecyclerView.Adapter<MainListVendita
mOnGroupSelected = onGroupSelected;
}
public void updateItems(List<OrdineVenditaGroupedInevasoDTO> updatedDataset) {
mDataset.clear();
mDataset.addAll(updatedDataset);
notifyDataSetChanged();
}
// Create new views (invoked by the layout manager)
@Override

View File

@ -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<List<OrdineVenditaInevasoDTO>> currentOnFilterDone;
public static AlertDialog makeBase(final Context context) {
private List<OrdineVenditaInevasoDTO> currentOrderList;
private List<OrdineVenditaInevasoDTO> currentFilteredOrderList;
private Predicate<OrdineVenditaInevasoDTO> currentNumOrdsPredicate = null;
private Predicate<OrdineVenditaInevasoDTO> currentClientePredicate = null;
private Predicate<OrdineVenditaInevasoDTO> currentDataConsPredicate = null;
private Predicate<OrdineVenditaInevasoDTO> currentTermConsPredicate = null;
private Predicate<OrdineVenditaInevasoDTO> currentAutomezzoPredicate = null;
public static AlertDialog make(final Context context, final List<OrdineVenditaInevasoDTO> ordersList, RunnableArgs<List<OrdineVenditaInevasoDTO>> onDismiss) {
return new DialogVenditaFiltroAvanzato(context, ordersList, onDismiss).currentAlert;
}
private DialogVenditaFiltroAvanzato(final Context context, final List<OrdineVenditaInevasoDTO> ordersList, RunnableArgs<List<OrdineVenditaInevasoDTO>> 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<String> 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<String> 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<Integer> 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<String> getAvailableTermCons() {
if(currentNumOrdsPredicate == null && currentClientePredicate == null && currentDataConsPredicate == null && currentTermConsPredicate == null){
currentFilteredOrderList = currentOrderList;
} else {
Stream<OrdineVenditaInevasoDTO> 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<String> getAvailableAutomezzi() {
if(currentNumOrdsPredicate == null && currentClientePredicate == null && currentDataConsPredicate == null && currentTermConsPredicate == null){
currentFilteredOrderList = currentOrderList;
} else {
Stream<OrdineVenditaInevasoDTO> 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<OrdineVenditaInevasoDTO> 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();
}
}
}

View File

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

View File

@ -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) {

View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners
android:topLeftRadius="16dp"
android:topRightRadius="16dp" />
<padding android:top="16dp" />
<solid android:color="@color/white" />
</shape>

View File

@ -65,8 +65,63 @@
</android.support.design.widget.TextInputLayout>
<android.support.design.widget.TextInputLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:hintTextAppearance="@style/hint_text">
<android.support.design.widget.TextInputEditText
android:id="@+id/input_data_cons"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="textNoSuggestions"
android:hint="@string/ship_date"
android:focusable="false"
app:binding="@{viewmodel.dataConsegna}"/>
</android.support.design.widget.TextInputLayout>
<android.support.design.widget.TextInputLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:hintTextAppearance="@style/hint_text">
<android.support.design.widget.TextInputEditText
android:id="@+id/input_term_cons"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="textNoSuggestions"
android:hint="@string/terms_of_delivery"
android:focusable="false"
app:binding="@{viewmodel.terminiConsegna}"/>
</android.support.design.widget.TextInputLayout>
<android.support.design.widget.TextInputLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:hintTextAppearance="@style/hint_text">
<android.support.design.widget.TextInputEditText
android:id="@+id/input_automezzo"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="textNoSuggestions"
android:hint="@string/vehicle"
android:focusable="false"
app:binding="@{viewmodel.automezzo}"/>
</android.support.design.widget.TextInputLayout>
</LinearLayout>
</android.support.v7.widget.CardView>
</layout>

View File

@ -18,6 +18,7 @@
<string name="warning">Attenzione</string>
<string name="ok">OK</string>
<string name="abort">Annulla</string>
<string name="reset">Resetta</string>
<string name="dispatched">Evasi</string>
@ -141,6 +142,9 @@
<string name="num_ords">Numero ordine</string>
<string name="customer">Cliente</string>
<string name="ship_date">Data consegna</string>
<string name="terms_of_delivery">Termini di consegna</string>
<string name="vehicle">Automezzo</string>
<string name="no_items_found_message">Nessun articolo trovato</string>
<string name="ask_print_message"><![CDATA[Si vuole procedere con la stampa dell\'etichetta?]]></string>

View File

@ -27,6 +27,7 @@
<string name="warning">Warning</string>
<string name="ok">OK</string>
<string name="abort">Abort</string>
<string name="reset">Reset</string>
<string name="dispatched">Dispatched</string>
<string name="no_description">No description</string>
<string name="description">Description</string>
@ -150,6 +151,9 @@
<string name="num_ords">Orders number</string>
<string name="customer">Customer</string>
<string name="ship_date">Ship date</string>
<string name="terms_of_delivery">Terms of delivery</string>
<string name="vehicle">Vehicle</string>
<string name="no_items_found_message">No items found</string>
<string name="ask_print_message">Do you want print the label?</string>