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 65e04b93..f363c602 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 @@ -111,6 +111,7 @@ public class DialogOrdineProduzioneFiltroAvanzato { viewModel.numOrds.refresh(); + viewModel.codJcoms.refresh(); } diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/ultime_consegne_cliente/UltimeConsegneClienteFragment.java b/app/src/main/java/it/integry/integrywmsnative/gest/ultime_consegne_cliente/UltimeConsegneClienteFragment.java index c850a715..e2fed21a 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/ultime_consegne_cliente/UltimeConsegneClienteFragment.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/ultime_consegne_cliente/UltimeConsegneClienteFragment.java @@ -11,17 +11,22 @@ import androidx.appcompat.widget.AppCompatTextView; import androidx.databinding.DataBindingUtil; import androidx.fragment.app.Fragment; import it.integry.integrywmsnative.R; +import it.integry.integrywmsnative.core.interfaces.IFilterableFragment; import it.integry.integrywmsnative.core.interfaces.IScrollableFragment; +import it.integry.integrywmsnative.core.interfaces.ISearcableFragment; import it.integry.integrywmsnative.core.interfaces.ITitledFragment; import it.integry.integrywmsnative.databinding.FragmentMainUltimeConsegneClienteBinding; +import it.integry.integrywmsnative.gest.ultime_consegne_cliente.dialog.DialogUltimeConsegneFiltroAvanzato; import it.integry.integrywmsnative.gest.ultime_consegne_cliente.viewmodel.UltimeConsegneClienteViewModel; import it.integry.integrywmsnative.ui.ElevatedToolbar; -public class UltimeConsegneClienteFragment extends Fragment implements ITitledFragment, IScrollableFragment { +public class UltimeConsegneClienteFragment extends Fragment implements ITitledFragment, IScrollableFragment, IFilterableFragment { private Runnable mOnPreDestroy; private ElevatedToolbar mToolbar; + private UltimeConsegneClienteViewModel mViewModel; + public UltimeConsegneClienteFragment() { // Required empty public constructor } @@ -41,7 +46,9 @@ public class UltimeConsegneClienteFragment extends Fragment implements ITitledFr FragmentMainUltimeConsegneClienteBinding mBinding = DataBindingUtil.inflate(LayoutInflater.from(getActivity()), R.layout.fragment_main_ultime_consegne_cliente, container, false); - mBinding.setViewmodel(new UltimeConsegneClienteViewModel(getActivity(), mBinding)); + mViewModel = new UltimeConsegneClienteViewModel(getActivity(), mBinding); + + mBinding.setViewmodel(mViewModel); mToolbar.setRecyclerView(mBinding.recyclerView); @@ -69,4 +76,9 @@ public class UltimeConsegneClienteFragment extends Fragment implements ITitledFr public void setOnPreDestroy(Runnable onPreDestroy) { mOnPreDestroy = onPreDestroy; } + + @Override + public void onFilterClick() { + mViewModel.openFilterDialog(); + } } 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 new file mode 100644 index 00000000..d70be5fc --- /dev/null +++ b/app/src/main/java/it/integry/integrywmsnative/gest/ultime_consegne_cliente/dialog/DialogUltimeConsegneFiltroAvanzato.java @@ -0,0 +1,203 @@ +package it.integry.integrywmsnative.gest.ultime_consegne_cliente.dialog; + +import android.app.AlertDialog; +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.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; + +public class DialogUltimeConsegneFiltroAvanzato { + + private AlertDialog mAlert; + private Context mContext; + private DialogUltimeConsegneFiltroAvanzatoViewModel mBaseViewModel; + private RunnableArgss, DialogUltimeConsegneFiltroAvanzatoViewModel> 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, + DialogUltimeConsegneFiltroAvanzatoViewModel baseViewModel, + RunnableArgss, DialogUltimeConsegneFiltroAvanzatoViewModel> onDismiss) { + return new DialogUltimeConsegneFiltroAvanzato(context, items, baseViewModel, onDismiss).mAlert; + } + + + public DialogUltimeConsegneFiltroAvanzato(final Context context, + final List items, + DialogUltimeConsegneFiltroAvanzatoViewModel baseViewModel, + RunnableArgss, DialogUltimeConsegneFiltroAvanzatoViewModel> onDismiss) { + mContext = context; + mItems = items; + mBaseViewModel = baseViewModel; + mOnDismiss = onDismiss; + + DialogUltimeConsegneFiltroAvanzatoViewModel viewModel = baseViewModel != null ? baseViewModel : new DialogUltimeConsegneFiltroAvanzatoViewModel(); + + LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); + DialogUltimeConsegneFiltroAvanzatoBinding binding = DataBindingUtil.inflate(inflater, R.layout.dialog_ultime_consegne_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(DialogUltimeConsegneFiltroAvanzatoViewModel viewModel) { + viewModel.ragSoc.set(null); + viewModel.dataDoc.set(null); + } + + private void initView(DialogUltimeConsegneFiltroAvanzatoBinding bindings, DialogUltimeConsegneFiltroAvanzatoViewModel 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(DialogUltimeConsegneFiltroAvanzatoViewModel 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 DialogUltimeConsegneFiltroAvanzatoViewModel { + + public BindableString ragSoc = new BindableString(); + public BindableString dataDoc = new BindableString(); + + public Date dataDocDate; + } + +} diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/ultime_consegne_cliente/viewmodel/UltimeConsegneClienteViewModel.java b/app/src/main/java/it/integry/integrywmsnative/gest/ultime_consegne_cliente/viewmodel/UltimeConsegneClienteViewModel.java index 7d0270a2..ff306b46 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/ultime_consegne_cliente/viewmodel/UltimeConsegneClienteViewModel.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/ultime_consegne_cliente/viewmodel/UltimeConsegneClienteViewModel.java @@ -16,6 +16,7 @@ import it.integry.integrywmsnative.core.settings.SettingsManager; import it.integry.integrywmsnative.core.utility.UtilityExceptions; import it.integry.integrywmsnative.core.utility.UtilityProgress; import it.integry.integrywmsnative.databinding.FragmentMainUltimeConsegneClienteBinding; +import it.integry.integrywmsnative.gest.ultime_consegne_cliente.dialog.DialogUltimeConsegneFiltroAvanzato; import it.integry.integrywmsnative.gest.ultime_consegne_cliente.rest.UltimeConsegneClienteRESTConsumer; import it.integry.integrywmsnative.gest.picking_resi.PickingResiActivity; import it.integry.integrywmsnative.core.rest.model.DocumentoResoDTO; @@ -25,7 +26,11 @@ public class UltimeConsegneClienteViewModel { private Context mContext; private FragmentMainUltimeConsegneClienteBinding mBinding; + private UltimeConsegneMainListAdapter mAdapter; private List mItems; + private List mRenderedItems = new ArrayList<>(); + + private DialogUltimeConsegneFiltroAvanzato.DialogUltimeConsegneFiltroAvanzatoViewModel mAppliedFilterViewModel; public UltimeConsegneClienteViewModel(Context context, FragmentMainUltimeConsegneClienteBinding binding) { this.mContext = context; @@ -39,6 +44,24 @@ public class UltimeConsegneClienteViewModel { }); } + public void openFilterDialog() { + DialogUltimeConsegneFiltroAvanzato.make(mContext, mItems, mAppliedFilterViewModel, (filteredOrderList, filter) -> { + mAppliedFilterViewModel = filter; + + if(filteredOrderList != null){ + + refreshItems(filteredOrderList); + } + + }).show(); + } + + + public void refreshItems(List items){ + mRenderedItems.clear(); + mRenderedItems.addAll(items); + mAdapter.updateItems(mRenderedItems); + } private void initList() { @@ -50,7 +73,9 @@ public class UltimeConsegneClienteViewModel { null, consegne -> { this.mItems = consegne; + this.initDataAdapter(consegne); + refreshRenderedOrdini(consegne); progressDialog.dismiss(); }, ex -> { @@ -58,13 +83,18 @@ public class UltimeConsegneClienteViewModel { }); } + private void refreshRenderedOrdini(List items) { + mRenderedItems.clear(); + if(items != null) mRenderedItems.addAll(items); + } + private void initDataAdapter(ArrayList dataset) { - UltimeConsegneMainListAdapter adapter = new UltimeConsegneMainListAdapter(mContext, dataset); - adapter.setOnSelectionChanged(this::onSingleSelectionChanged); + mAdapter = new UltimeConsegneMainListAdapter(mContext, dataset); + mAdapter.setOnSelectionChanged(this::onSingleSelectionChanged); mBinding.recyclerView.setHasFixedSize(true); mBinding.recyclerView.setLayoutManager(new LinearLayoutManager(mContext)); - mBinding.recyclerView.setAdapter(adapter); + mBinding.recyclerView.setAdapter(mAdapter); mBinding.fastscroll.setRecyclerView(mBinding.recyclerView); } diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/ultime_consegne_cliente/viewmodel/UltimeConsegneMainListAdapter.java b/app/src/main/java/it/integry/integrywmsnative/gest/ultime_consegne_cliente/viewmodel/UltimeConsegneMainListAdapter.java index b86ef60e..abaff9d6 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/ultime_consegne_cliente/viewmodel/UltimeConsegneMainListAdapter.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/ultime_consegne_cliente/viewmodel/UltimeConsegneMainListAdapter.java @@ -36,10 +36,6 @@ public class UltimeConsegneMainListAdapter extends SectionedRecyclerViewAdapter< private RunnableArgs mOnSelectionChanged; -// private TextDrawable.IShapeBuilder smallIconBuilder; -// private TextDrawable.IShapeBuilder mediumIconBuilder; -// private TextDrawable.IShapeBuilder largeIconBuilder; - @Override public String getSectionTitle(int position) { return mSectionTitleItems.get(position); @@ -74,56 +70,8 @@ public class UltimeConsegneMainListAdapter extends SectionedRecyclerViewAdapter< super(); this.mContext = context; 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(); - - -// smallIconBuilder = TextDrawable.builder() -// .beginConfig() -// .width(40) -// .height(40) -// .fontSize(24) -// .useFont(ResourcesCompat.getFont(mContext, R.font.google_sans_regular)) -// .endConfig(); -// -// mediumIconBuilder = TextDrawable.builder() -// .beginConfig() -// .width(40) -// .height(40) -// .fontSize(20) -// .useFont(ResourcesCompat.getFont(mContext, R.font.google_sans_regular)) -// .endConfig(); -// -// largeIconBuilder = TextDrawable.builder() -// .beginConfig() -// .width(40) -// .height(40) -// .fontSize(16) -// .useFont(ResourcesCompat.getFont(mContext, R.font.google_sans_regular)) -// .endConfig(); + updateItems(sort(dataset)); } @@ -153,16 +101,6 @@ public class UltimeConsegneMainListAdapter extends SectionedRecyclerViewAdapter< holder.mBinding.badge1.setText(String.valueOf(consegna.getNumDoc())); -// String numDoc = "" + consegna.getNumDoc(); - -// if(numDoc.length() <= 2) { -// holder.mBinding.startIcon.setImageDrawable(smallIconBuilder.buildRound(numDoc, ContextCompat.getColor(mContext, R.color.colorPrimary))); -// } else if(numDoc.length() == 3) { -// holder.mBinding.startIcon.setImageDrawable(mediumIconBuilder.buildRound(numDoc, ContextCompat.getColor(mContext, R.color.colorPrimary))); -// } else if(numDoc.length() == 4) { -// holder.mBinding.startIcon.setImageDrawable(largeIconBuilder.buildRound(numDoc, ContextCompat.getColor(mContext, R.color.colorPrimary))); -// } - try { Calendar calendarNow = UtilityDate.getCalendarInstance(); Calendar calendarDataDoc = UtilityDate.getCalendarInstance(); @@ -215,6 +153,40 @@ public class UltimeConsegneMainListAdapter extends SectionedRecyclerViewAdapter< } + + public void updateItems(List updatedDataset) { + mDataset.clear(); + mDataset.addAll(sort(updatedDataset)); + notifyDataSetChanged(); + notifyDataChanged(); + } + + + private List sort(List dataset) { + this.mSectionTitleItems = new ArrayList<>(); + + List sortedDataset = Stream.of(dataset) + .sortBy(DocumentoResoDTO::getRagSoc) + .toList(); + + + Stream.of(sortedDataset) + .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 sortedDataset; + } + public void setOnSelectionChanged(RunnableArgs mSelectionChanged) { this.mOnSelectionChanged = mSelectionChanged; } 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 85a80e9a..bbc9a902 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 @@ -91,7 +91,7 @@ public class DialogVenditaFiltroAvanzato { .setView(binding.getRoot()); binding.setViewmodel(viewModel); - initViewModelNew(viewModel, binding); + initViewModelNew(viewModel); initView(binding, viewModel); currentAlert = alertDialog.create(); @@ -209,7 +209,7 @@ public class DialogVenditaFiltroAvanzato { } - private void initViewModelNew(DialogVenditaFiltroAvanzatoViewModel viewModel, DialogVenditaFiltroAvanzatoBinding bindings) { + private void initViewModelNew(DialogVenditaFiltroAvanzatoViewModel viewModel) { BindableString.registerListener(viewModel.idViaggio, value -> { if(UtilityString.isNullOrEmpty(value)) currentIdViaggioPredicate = null; else { diff --git a/app/src/main/res/layout/dialog_ultime_consegne_filtro_avanzato.xml b/app/src/main/res/layout/dialog_ultime_consegne_filtro_avanzato.xml new file mode 100644 index 00000000..e11c1cf5 --- /dev/null +++ b/app/src/main/res/layout/dialog_ultime_consegne_filtro_avanzato.xml @@ -0,0 +1,136 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_vendita_filtro_avanzato.xml b/app/src/main/res/layout/dialog_vendita_filtro_avanzato.xml index 5a35575b..a5ea480f 100644 --- a/app/src/main/res/layout/dialog_vendita_filtro_avanzato.xml +++ b/app/src/main/res/layout/dialog_vendita_filtro_avanzato.xml @@ -190,11 +190,11 @@ + android:id="@+id/input_data_cons" + style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:hint="@string/ship_date"> Termini di consegna Automezzo Deposito + Ragione sociale ID Viaggio Agente Vettore @@ -277,7 +278,7 @@ Articoli in griglia: Griglia: Seleziona / Crea ordine - Agigungi + Aggiungi Chiudi ed esporta ordine Chiudi ordine \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 6f482fc1..a3bf5f2d 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -186,6 +186,7 @@ Terms of delivery Vehicle Deposit + Company name Travel ID Agent Carrier