Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Search 101 #106

Merged
merged 3 commits into from
Sep 15, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ class VacancyDbConverter {
)
}

fun map(vacancy: Vacancy): VacancyEntity{
fun map(vacancy: Vacancy): VacancyEntity {

return VacancyEntity(
id = vacancy.id,
Expand All @@ -32,8 +32,8 @@ class VacancyDbConverter {
employerName = vacancy.employerName,
employerLogoUrl = vacancy.employerLogoUrl,
salaryCurrency = vacancy.salaryCurrency,
salaryFrom = vacancy.salaryFrom?.filterNot{it.isWhitespace()}?.toInt(),
salaryTo = vacancy.salaryTo?.filterNot{it.isWhitespace()}?.toInt(),
salaryFrom = vacancy.salaryFrom?.filterNot { it.isWhitespace() }?.toInt(),
salaryTo = vacancy.salaryTo?.filterNot { it.isWhitespace() }?.toInt(),
getCurrentDate()
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,19 +12,23 @@ import android.view.inputmethod.EditorInfo
import android.view.inputmethod.InputMethodManager
import androidx.core.os.bundleOf
import androidx.navigation.fragment.findNavController
import com.google.gson.Gson
import org.koin.androidx.viewmodel.ext.android.viewModel
import ru.practicum.android.diploma.R
import ru.practicum.android.diploma.databinding.FragmentSettingFiltersBinding
import ru.practicum.android.diploma.details.presentation.ui.VacancyFragment
import ru.practicum.android.diploma.filters.domain.models.Filters
import ru.practicum.android.diploma.filters.presentation.FiltersViewModel
import ru.practicum.android.diploma.filters.presentation.models.FiltersDataState
import ru.practicum.android.diploma.filters.presentation.models.ShowViewState
import ru.practicum.android.diploma.search.ui.SearchFragment
import ru.practicum.android.diploma.util.BindingFragment

class FragmentSettingFilters:BindingFragment<FragmentSettingFiltersBinding>() {
class FragmentSettingFilters : BindingFragment<FragmentSettingFiltersBinding>() {

val viewModel by viewModel<FiltersViewModel>()
var bundle:Bundle? = null
var bundle: Bundle? = null
private lateinit var getFilters: Filters

override fun createBinding(
inflater: LayoutInflater,
Expand All @@ -35,7 +39,7 @@ class FragmentSettingFilters:BindingFragment<FragmentSettingFiltersBinding>() {

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
viewModel.getShowViewStateLiveData().observe(requireActivity()){showView(it)}
viewModel.getShowViewStateLiveData().observe(requireActivity()) { showView(it) }
switchToPlaceOfWorkScreen()
switchToIndustriesScreen()
back()
Expand All @@ -50,8 +54,8 @@ class FragmentSettingFilters:BindingFragment<FragmentSettingFiltersBinding>() {
false
}
}
binding.salaryEditText.setOnFocusChangeListener{_, hasFocus ->
if(hasFocus){
binding.salaryEditText.setOnFocusChangeListener { _, hasFocus ->
if (hasFocus) {
binding.clearIcon.visibility = View.GONE
}

Expand All @@ -61,9 +65,9 @@ class FragmentSettingFilters:BindingFragment<FragmentSettingFiltersBinding>() {
override fun beforeTextChanged(s: CharSequence?, p1: Int, p2: Int, p3: Int) {}

override fun onTextChanged(s: CharSequence?, p1: Int, p2: Int, p3: Int) {
if(s.isNullOrEmpty()){
if (s.isNullOrEmpty()) {
viewModel.addSalary("0")
}else{
} else {
viewModel.addSalary(s.toString())
}

Expand All @@ -75,7 +79,7 @@ class FragmentSettingFilters:BindingFragment<FragmentSettingFiltersBinding>() {
})


viewModel.getFiltersStateLiveData().observe(requireActivity()){
viewModel.getFiltersStateLiveData().observe(requireActivity()) {
render(it)
}

Expand All @@ -95,7 +99,11 @@ class FragmentSettingFilters:BindingFragment<FragmentSettingFiltersBinding>() {
}
binding.buttonApply.setOnClickListener {
viewModel.writeFilters()
findNavController().navigateUp() }
findNavController().navigate(
R.id.action_settingFilters_to_searchFragment,
SearchFragment.createArgs(Gson().toJson(getFilters))
)
}
binding.clearIcon.setOnClickListener {
binding.salaryEditText.text?.clear()
}
Expand All @@ -104,35 +112,42 @@ class FragmentSettingFilters:BindingFragment<FragmentSettingFiltersBinding>() {
}

}

private fun hideKeyBoard() {
val inputMethodManager =
requireContext().getSystemService(Context.INPUT_METHOD_SERVICE) as? InputMethodManager
inputMethodManager?.hideSoftInputFromWindow(binding.salaryEditText.windowToken, 0)
binding.salaryEditText.clearFocus()

}
fun switchToPlaceOfWorkScreen(){
binding.placeOfWorkButton.setOnClickListener{

fun switchToPlaceOfWorkScreen() {
binding.placeOfWorkButton.setOnClickListener {
findNavController().navigate(R.id.action_settingFilters_to_fragmentPlaceOfWork)
}
}
fun switchToIndustriesScreen(){
binding.industryButton.setOnClickListener{

fun switchToIndustriesScreen() {
binding.industryButton.setOnClickListener {
bundle = bundleOf(SCREEN to INDUSTRIES)
findNavController().navigate(R.id.action_settingFilters_to_fragmentChooseFilter, bundle)
}
}
fun back(){

fun back() {
binding.arrowback.setOnClickListener {
findNavController().navigateUp()
}
}

private fun render(state: FiltersDataState) {
when (state) {
is FiltersDataState.filtersData -> showFiltersData(state.filters)
}
}

private fun showFiltersData(filters: Filters) {
getFilters = filters
var placeOfWork = ""
var industries = ""
filters.countryName?.let {
Expand All @@ -142,46 +157,52 @@ class FragmentSettingFilters:BindingFragment<FragmentSettingFiltersBinding>() {
binding.placeOfWorkClear.visibility = View.VISIBLE
}
filters.areasNames?.let {
placeOfWork+=", $it"
placeOfWork += ", $it"
binding.placeOfWorkEditText.setText(placeOfWork)
}
filters.industriesName?.let {
industries+="$it "
industries += "$it "
binding.industryEditText.setText(industries)
binding.industryButton.visibility = View.INVISIBLE
binding.industryClear.visibility = View.VISIBLE
}
if(filters.salary!=0)binding.salaryEditText.setText(filters.salary.toString())
if (filters.salary != 0) binding.salaryEditText.setText(filters.salary.toString())

if(filters.onlyWithSalary!=false)binding.filterCheckbox.isChecked = true
if (filters.onlyWithSalary != false) binding.filterCheckbox.isChecked = true

}
private fun clearPlaceWork(){

private fun clearPlaceWork() {
binding.placeOfWorkEditText.text?.clear()
binding.placeOfWorkClear.visibility = View.GONE
binding.placeOfWorkButton.visibility = View.VISIBLE
viewModel.clearCountry()
viewModel.clearRegion()
}
private fun clearIndustries(){

private fun clearIndustries() {
binding.industryEditText.text?.clear()
binding.industryClear.visibility = View.GONE
binding.industryButton.visibility = View.VISIBLE
viewModel.clearIndustries()
}
private fun showView(state: ShowViewState){
when(state){

private fun showView(state: ShowViewState) {
when (state) {
is ShowViewState.showClearIcon -> showClearIcon()
is ShowViewState.hideClearIcon -> hideClearIcon()
}
}
fun showClearIcon(){

fun showClearIcon() {
binding.clearIcon.visibility = View.VISIBLE
}
fun hideClearIcon(){

fun hideClearIcon() {
binding.clearIcon.visibility = View.GONE
}
companion object{

companion object {
const val SCREEN = "screen"
const val COUNTRIES = "COUNTRIES"
const val REGION = "REGION"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ class SearchRepositoryImpl(
vacancyDto.area.name,
vacancyDto.employer.name,
found = foundValue,
vacancyDto.employer.logo_urls?.original,
vacancyDto.employer.logoUrls?.original,
getSymbol(vacancyDto.salary?.currency),
createValue(vacancyDto.salary?.from),
createValue(vacancyDto.salary?.to),
Expand Down
Original file line number Diff line number Diff line change
@@ -1,31 +1,40 @@
package ru.practicum.android.diploma.search.data.dto.models

import android.os.Parcelable
import com.google.gson.annotations.SerializedName
import kotlinx.android.parcel.Parcelize

@Parcelize
data class VacancyDto(
val accept_incomplete_resumes: Boolean,
val alternate_url: String,
val apply_alternate_url: String,
@SerializedName("accept_incomplete_resumes")
val acceptIncompleteResumes: Boolean,
@SerializedName("alternate_url")
val alternateUrl: String,
@SerializedName("apply_alternate_url")
val applyAlternateUrl: String,
val area: Area,
val department: Department?,
val employer: Employer,
val has_test: Boolean,
@SerializedName("has_test")
val hasTest: Boolean,
val id: String,
val name: String,
val professional_roles: List<ProfessionalRoles>,
val published_at: String,
@SerializedName("professional_roles")
val professionalRoles: List<ProfessionalRoles>,
@SerializedName("published_at")
val publishedAt: String,
val relations: Array<String>?,
val response_letter_required: Boolean,
@SerializedName("response_letter_required")
val responseLetterRequired: Boolean,
val salary: Salary?,
val type: Type,
val url: String,
val snippet: Snippet,
val found: Int,
val page: Int,
val pages: Int,
val per_page: Int,
@SerializedName("per_page")
val perPage: Int,
) : Parcelable

@Parcelize
Expand All @@ -43,14 +52,18 @@ data class Department(

@Parcelize
data class Employer(
val accredited_it_employer: Boolean,
val alternate_url: String?,
@SerializedName("accredited_it_employer")
val accreditedItEmployer: Boolean,
@SerializedName("alternate_url")
val alternateUrl: String?,
val id: String?,
val logo_urls: LogoUrls?,
@SerializedName("logo_urls")
val logoUrls: LogoUrls?,
val name: String,
val trusted: Boolean,
val url: String?,
val vacancies_url: String?,
@SerializedName("vacancies_url")
val vacanciesUrl: String?,
) : Parcelable

@Parcelize
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,5 +10,5 @@ data class Vacancy(
val salaryCurrency: String?,
val salaryFrom: String?,
val salaryTo: String?,
val pages:Int
val pages: Int
)
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import android.view.View
import android.view.ViewGroup
import android.view.inputmethod.EditorInfo
import android.view.inputmethod.InputMethodManager
import androidx.core.os.bundleOf
import androidx.lifecycle.lifecycleScope
import androidx.navigation.fragment.findNavController
import androidx.recyclerview.widget.LinearLayoutManager
Expand All @@ -18,6 +19,7 @@ import org.koin.androidx.viewmodel.ext.android.viewModel
import ru.practicum.android.diploma.R
import ru.practicum.android.diploma.databinding.FragmentSearchBinding
import ru.practicum.android.diploma.details.presentation.ui.VacancyFragment
import ru.practicum.android.diploma.filters.domain.models.Filters
import ru.practicum.android.diploma.search.domain.SearchState
import ru.practicum.android.diploma.search.domain.models.Vacancy
import ru.practicum.android.diploma.util.BindingFragment
Expand All @@ -27,11 +29,11 @@ import ru.practicum.android.diploma.util.debounce

class SearchFragment : BindingFragment<FragmentSearchBinding>() {

lateinit var vacancy: Vacancy
private lateinit var adapter: VacancyAdapter
private lateinit var onVacancyClickDebounce: (Vacancy) -> Unit
private lateinit var vacancySearchDebounce: (String) -> Unit
private val viewModel by viewModel<SearchViewModel>()
private lateinit var filters: Filters

override fun createBinding(
inflater: LayoutInflater,
Expand All @@ -53,6 +55,10 @@ class SearchFragment : BindingFragment<FragmentSearchBinding>() {
changeFilterIcon(state)
}

viewModel.saveTextLiveData.observe(viewLifecycleOwner) { text ->
binding.searchEditText.setText(text)
}

initAdapter()
listener()
}
Expand All @@ -64,8 +70,17 @@ class SearchFragment : BindingFragment<FragmentSearchBinding>() {
}

private fun listener() {
if (arguments != null) {
val jsonFilters = requireArguments().getString(FILTERS)

if (jsonFilters != null) {
filters = Gson().fromJson(jsonFilters, Filters::class.java)
viewModel.showFilters(filters)
}
} else {
viewModel.showFiltersState()
}

viewModel.showFilters()

vacancySearchDebounce = debounce<String>(
SEARCH_DEBOUNCE_DELAY,
Expand Down Expand Up @@ -138,7 +153,8 @@ class SearchFragment : BindingFragment<FragmentSearchBinding>() {
private fun showVacanciesList(vacancies: List<Vacancy>, foundValue: Int) {

binding.searchResult.visibility = View.VISIBLE
binding.searchResult.text = "Найдено $foundValue вакансий"
binding.searchResult.text =
resources.getQuantityString(R.plurals.search_result_number, foundValue, foundValue)
binding.searchRecyclerView.visibility = View.VISIBLE
binding.placeholderImage.visibility = View.GONE
binding.progressBarForLoad.visibility = View.GONE
Expand Down Expand Up @@ -280,6 +296,9 @@ class SearchFragment : BindingFragment<FragmentSearchBinding>() {
companion object {
private const val CLICK_DEBOUNCE_DELAY = 1000L
private const val SEARCH_DEBOUNCE_DELAY = 2000L
private const val FILTERS = "filters"

fun createArgs(jsonFilters: String?): Bundle? = bundleOf(FILTERS to jsonFilters)
}

}
Loading