From 7e322b41ab26c0b1b0a4c7bacca24d1e63530cd7 Mon Sep 17 00:00:00 2001 From: TAMARA JERINIC Date: Tue, 13 Dec 2022 03:41:52 +0100 Subject: Izmenjeni dijalozi za filtriranje i sortiranje. Omogućeni prikupljanje i validacija unosa sa dijaloga. Dodata funkcija za filtriranje i sortiranje na back. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Backend/Api/Api/Controllers/PostController.cs | 10 +- Backend/Api/Api/Interfaces/IPostService.cs | 1 + Backend/Api/Api/Models/Post.cs | 27 +++ Backend/Api/Api/Services/PostService.cs | 73 +++++++ .../brzodolokacije/Fragments/FragmentShowPosts.kt | 138 +++++++++++++- .../java/com/example/brzodolokacije/Models/Post.kt | 20 +- .../src/main/res/layout/bottom_sheet_filter.xml | 211 +++++++++++++++++---- .../app/src/main/res/layout/bottom_sheet_sort.xml | 48 ++++- 8 files changed, 469 insertions(+), 59 deletions(-) diff --git a/Backend/Api/Api/Controllers/PostController.cs b/Backend/Api/Api/Controllers/PostController.cs index 9168462..c4156f0 100644 --- a/Backend/Api/Api/Controllers/PostController.cs +++ b/Backend/Api/Api/Controllers/PostController.cs @@ -199,12 +199,20 @@ namespace Api.Controllers { return Ok(await _postService.TrendingTags()); } + [HttpGet("userFavouritePosts")] [Authorize(Roles = "User")] public async Task>> getUserFavouritePosts() { return Ok(await _postService.userFavouritePosts()); } + + [HttpGet("posts/getAllPostsFilterSort")] + [Authorize(Roles = "User")] + public async Task>> GetAllPostsFilterSort([FromBody] FilterSort fs) + { + return Ok(await _postService.GetAllPostsFilterSort(fs)); + } - } + } } diff --git a/Backend/Api/Api/Interfaces/IPostService.cs b/Backend/Api/Api/Interfaces/IPostService.cs index aafc61a..919f3cf 100644 --- a/Backend/Api/Api/Interfaces/IPostService.cs +++ b/Backend/Api/Api/Interfaces/IPostService.cs @@ -32,5 +32,6 @@ namespace Api.Interfaces Task> BestPostForAllLocationsInRadius(Coords coords, double radius); Task UserStats(string userid); Task> userFavouritePosts(); + Task> GetAllPostsFilterSort(FilterSort fs); } } \ No newline at end of file diff --git a/Backend/Api/Api/Models/Post.cs b/Backend/Api/Api/Models/Post.cs index 9c0c429..955431f 100644 --- a/Backend/Api/Api/Models/Post.cs +++ b/Backend/Api/Api/Models/Post.cs @@ -122,5 +122,32 @@ namespace Api.Models { public TagR tagr { get; set; } public PostSendPage page { get; set; } + } + + public class FilterSort + { + public List posts { get; set; } + public bool sort { get; set; } + public bool filter { get; set; } + public bool filterDate { get; set; } + public bool filterRating { get; set; } + public bool filterViews{ get; set; } + public DateTime filterDateFrom { get; set; } + public DateTime filterDateTo { get; set; } + public int filterRatingFrom { get; set; } + public int filterRatingTo { get; set; } + public int filterViewsFrom { get; set; } + public int filterViewsTo { get; set; } + + public bool sortLatest { get; set; } + public bool sortOldest { get; set; } + public bool sortBest{ get; set; } + public bool sortMostViews{ get; set; } + + + + + + } } diff --git a/Backend/Api/Api/Services/PostService.cs b/Backend/Api/Api/Services/PostService.cs index 7ba5401..e6fa9fb 100644 --- a/Backend/Api/Api/Services/PostService.cs +++ b/Backend/Api/Api/Services/PostService.cs @@ -4,6 +4,7 @@ using Api.Models; using MongoDB.Driver; using MongoDB.Bson.Serialization.Attributes; using MongoDB.Bson; +using System.Diagnostics; namespace Api.Services { @@ -726,6 +727,78 @@ namespace Api.Services return posts; } + public async Task> GetAllPostsFilterSort(FilterSort fs) + { + List allPosts = fs.posts; + List filteredPosts = allPosts; + List fsPosts=allPosts; + + if (fs.filter) + { + if (fs.filterRatingFrom>=0) + { + filteredPosts =filteredPosts.FindAll(post => post.ratings >fs.filterRatingFrom); + } + if (fs.filterRatingTo >= 0) + { + filteredPosts = filteredPosts.FindAll(post => post.ratings < fs.filterRatingTo); + } + if(fs.filterViewsFrom >= 0) + { + filteredPosts = filteredPosts.FindAll(post => post.views > fs.filterViewsFrom); + } + if(fs.filterViewsTo >= 0) + { + filteredPosts = filteredPosts.FindAll(post => post.views < fs.filterViewsTo); + } + if(fs.filterDateFrom!=null) + { + filteredPosts = filteredPosts.FindAll(post => post.createdAt > fs.filterDateFrom); + } + if(fs.filterDateTo!=null) + { + filteredPosts = filteredPosts.FindAll(post => post.createdAt < fs.filterDateTo); + } + } + + if (fs.sort) + { + if (fs.sortBest) + { + fsPosts = filteredPosts.OrderByDescending(o => o.ratings).ToList(); + } + if (fs.sortLatest) + { + fsPosts = filteredPosts.OrderByDescending(o => o.createdAt).ToList(); + } + if (fs.sortMostViews) + { + fsPosts = filteredPosts.OrderByDescending(o => o.views).ToList(); + } + if (fs.sortOldest) + { + fsPosts = filteredPosts.OrderBy(p => p.createdAt).ToList(); + } + } + + if(!fs.filter && !fs.sort) + { + return allPosts; + } + else if(!fs.filter && fs.sort) + { + return fsPosts; + } + else if(fs.filter && !fs.sort) + { + return filteredPosts; + } + else + { + return filteredPosts; + } + + } } } diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentShowPosts.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentShowPosts.kt index 8bcbd72..cf8eb22 100644 --- a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentShowPosts.kt +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentShowPosts.kt @@ -19,6 +19,7 @@ import androidx.swiperefreshlayout.widget.SwipeRefreshLayout import com.example.brzodolokacije.Activities.NavigationActivity import com.example.brzodolokacije.Adapters.ShowPostsAdapter import com.example.brzodolokacije.Adapters.ShowPostsGridViewAdapter +import com.example.brzodolokacije.Models.FilterSort import com.example.brzodolokacije.Models.Location import com.example.brzodolokacije.Models.PostPreview import com.example.brzodolokacije.Models.SearchParams @@ -30,11 +31,14 @@ import com.example.brzodolokacije.paging.SearchPostsViewModel import com.example.brzodolokacije.paging.SearchPostsViewModelFactory import com.google.android.material.bottomsheet.BottomSheetDialog import com.google.android.material.button.MaterialButton +import kotlinx.android.synthetic.main.activity_splash_page.* +import kotlinx.android.synthetic.main.bottom_sheet_sort.* import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.launch import retrofit2.Call import retrofit2.Response +import java.util.Date class FragmentShowPosts : Fragment(), SwipeRefreshLayout.OnRefreshListener { @@ -56,6 +60,11 @@ class FragmentShowPosts : Fragment(), SwipeRefreshLayout.OnRefreshListener { private lateinit var searchBar: AutoCompleteTextView var responseLocations:MutableList?=null var selectedLocation:com.example.brzodolokacije.Models.Location?=null + private lateinit var obj:FilterSort + + private lateinit var filter:Button + private lateinit var removeFilter:Button + private lateinit var sort:Button override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -65,6 +74,8 @@ class FragmentShowPosts : Fragment(), SwipeRefreshLayout.OnRefreshListener { adapterVar=ShowPostsAdapter(requireActivity()) linearManagerVar= LinearLayoutManager(activity) //gridManagerVar=GridLayoutManager(activity,2) + + } fun searchText(){ if(searchBar.text==null || searchBar.text.toString().trim()=="") @@ -204,17 +215,125 @@ class FragmentShowPosts : Fragment(), SwipeRefreshLayout.OnRefreshListener { swipeRefreshLayout?.isRefreshing=true requestToBack(searchParams!!) }) +////////////////////////////////////////////////////////////////// + //filter sort validacija + + + //filter dialog + var bottomSheetDialogFilter: BottomSheetDialog + bottomSheetDialogFilter = BottomSheetDialog(requireContext()) + bottomSheetDialogFilter.setContentView(R.layout.bottom_sheet_filter) + + //sort dialog + var bottomSheetDialogSort: BottomSheetDialog + bottomSheetDialogSort = BottomSheetDialog(requireContext()) + bottomSheetDialogSort.setContentView(R.layout.bottom_sheet_sort) + + + btnFilter=rootView.findViewById(R.id.btnSortType) btnSort=rootView.findViewById(R.id.btnSortDirection) + var dateFrom=bottomSheetDialogFilter.findViewById(R.id.filterDateFrom)as EditText + var dateFromDate:Date + var dateTo=bottomSheetDialogFilter.findViewById(R.id.filterDateTo) as EditText + var dateToDate:Date + var ratingFrom=bottomSheetDialogFilter.findViewById(R.id.filterRatingFrom) as EditText + var ratingTo=bottomSheetDialogFilter.findViewById(R.id.filterRatingTo) as EditText + var viewsFrom=bottomSheetDialogFilter.findViewById(R.id.filterViewsFrom) as EditText + var viewsTo=bottomSheetDialogFilter.findViewById(R.id.filterViewsTo) as EditText + + + var removeFilter = bottomSheetDialogFilter.findViewById(R.id.btnBSFFilterRemove) as Button + + obj=FilterSort(false,false,0,5,0,1000000000,false,false,false,false) + obj.filter=false + obj.sort=false + + btnFilter.setOnClickListener{ - showBottomSheetFilter() + bottomSheetDialogFilter.show() + var filter = bottomSheetDialogFilter.findViewById(R.id.btnBSFFilter) as Button + + filter.setOnClickListener { + //validacija unosa + Toast.makeText(activity, "Method called From Fragment", Toast.LENGTH_LONG).show(); + if(!dateFrom.text.equals("")){ + obj.filter=true } + else if(!dateTo.text.equals("")){ + obj.filter=true + } + if(ratingFrom.text.toString().trim().toInt()>=0){ + obj.filter=true + obj.filterRatingFrom=ratingFrom.text.toString().toInt() + + } + else{ + ///toast + } + if(ratingTo.text.toString().trim().toInt()>=0){ + obj.filter=true + obj.filterRatingTo=ratingTo.text.toString().toInt() + } + else{ + //toast + } + if(viewsFrom.text.toString().trim().toInt()>=0){ + obj.filter=true + obj.filterViewsFrom=viewsFrom.text.toString().toInt() + } + else{ + //toast + } + if(viewsTo.text.toString().trim().toInt()>=0){ + obj.filter=true + obj.filterViewsTo=viewsTo.text.toString().trim().toInt() + } + else{ + //toast + } + + + } } btnSort.setOnClickListener{ - showBottomSheetSort() + bottomSheetDialogSort.show() + var sort = bottomSheetDialogSort.findViewById(R.id.btnSortPosts) as Button + var radioGroup = bottomSheetDialogSort.findViewById(R.id.radioGroup)as RadioGroup + + sort.setOnClickListener { + val selectedRadioButtonId: Int = radioGroup.checkedRadioButtonId + if (selectedRadioButtonId != -1) { + var selectedRadioButton = + bottomSheetDialogSort.findViewById(selectedRadioButtonId) as RadioButton + val string: String = selectedRadioButton.text.toString().trim() + if (string.equals("Najnovije")) { + obj.sort = true + obj.sortLatest = true + } else if (string.equals("Najstarije")) { + obj.sort = true + obj.sortOldest = true + } else if (string.equals("Najbolje ocenjeno")) { + obj.sort = true + obj.sortBest = true + } else if (string.equals("Najviše pregleda")) { + obj.sort = true + obj.sortMostViews = true + } else { + obj.sort = false + } + + } else { + textView.text = "Nothing selected from the radio group" + } + + } } + + ///////////////////////////////////////////////////////////////////////////// + searchBar=rootView.findViewById(R.id.etFragmentShowPostsSearch) as AutoCompleteTextView searchButton=rootView.findViewById(R.id.mbFragmentHomePageSearch) as MaterialButton setUpSpinner() @@ -266,23 +385,28 @@ class FragmentShowPosts : Fragment(), SwipeRefreshLayout.OnRefreshListener { } } - +/* private fun showBottomSheetFilter() { var bottomSheetDialog: BottomSheetDialog bottomSheetDialog = BottomSheetDialog(requireContext()) bottomSheetDialog.setContentView(R.layout.bottom_sheet_filter) bottomSheetDialog.show() - var dateFrom=bottomSheetDialog.findViewById(R.id.dateFromBSF)as EditText - var dateTo=bottomSheetDialog.findViewById(R.id.dateToBSF) as EditText - var location=bottomSheetDialog.findViewById(R.id.locationBSF) as EditText + var dateFrom=bottomSheetDialog.findViewById(R.id.filterDateFrom)as EditText + var dateTo=bottomSheetDialog.findViewById(R.id.filterDateTo) as EditText + var ratingFrom=bottomSheetDialog.findViewById(R.id.filterRatingFrom) as EditText + var ratingTo=bottomSheetDialog.findViewById(R.id.filterRatingTo) as EditText + var viewsFrom=bottomSheetDialog.findViewById(R.id.filterViewsFrom) as EditText + var viewsTo=bottomSheetDialog.findViewById(R.id.filterViewsTo) as EditText var filter = bottomSheetDialog.findViewById(R.id.btnBSFFilter) as Button + var removeFilter = bottomSheetDialog.findViewById(R.id.btnBSFFilterRemove) as Button filter.setOnClickListener { //povezati sa back-om + } } private fun showBottomSheetSort() { @@ -292,4 +416,6 @@ class FragmentShowPosts : Fragment(), SwipeRefreshLayout.OnRefreshListener { bottomSheetDialogSort.show() } + + */ } \ No newline at end of file diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Models/Post.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Models/Post.kt index 8f07bca..a3858a7 100644 --- a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Models/Post.kt +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Models/Post.kt @@ -93,4 +93,22 @@ data class SearchParams( var locationId: String, var sorttype:Int, var filterdate:Int -) \ No newline at end of file +) + +data class FilterSort( + //var posts: MutableList, + var sort:Boolean, + var filter:Boolean, + + //var filterDateFrom:Date, + //var filterDateTo:Date, + var filterRatingFrom:Int, + var filterRatingTo:Int, + var filterViewsFrom:Int, + var filterViewsTo:Int, + + var sortLatest:Boolean, + var sortOldest:Boolean, + var sortBest:Boolean, + var sortMostViews:Boolean + ) \ No newline at end of file diff --git a/Client/BrzoDoLokacije/app/src/main/res/layout/bottom_sheet_filter.xml b/Client/BrzoDoLokacije/app/src/main/res/layout/bottom_sheet_filter.xml index 249c654..5862c60 100644 --- a/Client/BrzoDoLokacije/app/src/main/res/layout/bottom_sheet_filter.xml +++ b/Client/BrzoDoLokacije/app/src/main/res/layout/bottom_sheet_filter.xml @@ -32,8 +32,8 @@ app:layout_constraintTop_toBottomOf="@+id/textView7" /> @@ -59,13 +59,13 @@ android:layout_height="wrap_content" android:layout_marginTop="20dp" android:layout_marginEnd="8dp" - android:text="Do" - app:layout_constraintEnd_toStartOf="@+id/dateToBSF" + android:text="Do:" + app:layout_constraintEnd_toStartOf="@+id/filterDateTo" app:layout_constraintTop_toBottomOf="@+id/textView8" /> + + + + + app:layout_constraintTop_toBottomOf="@+id/filterDateFrom" /> + + + + + +