Skip to content

Commit

Permalink
Merge pull request #71 from aless2003/default-search-lang
Browse files Browse the repository at this point in the history
Default search lang
  • Loading branch information
aless2003 authored Oct 15, 2023
2 parents 5a33814 + f2349f4 commit 7e80cbe
Show file tree
Hide file tree
Showing 3 changed files with 94 additions and 23 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,12 @@

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;

import java.util.HashMap;
import java.util.Map;

import lombok.Getter;
import lombok.Setter;
import online.hatsunemiku.tachideskvaadinui.data.settings.reader.ReaderSettings;
import org.jetbrains.annotations.NotNull;
import org.springframework.lang.NonNull;
Expand All @@ -28,11 +31,17 @@ public class Settings {
@JsonProperty("mangaReaderSettings")
private final Map<Integer, ReaderSettings> mangaReaderSettings;

@JsonProperty("defaultSearchLang")
@Getter
@Setter
private String defaultSearchLang;

@JsonCreator
public Settings(
@NotNull @JsonProperty("url") String url,
@JsonProperty("defaultReaderSettings") ReaderSettings defaultReaderSettings,
@JsonProperty("mangaReaderSettings") Map<Integer, ReaderSettings> mangaReaderSettings) {
@JsonProperty("mangaReaderSettings") Map<Integer, ReaderSettings> mangaReaderSettings,
@JsonProperty("defaultSearchLang") String defaultSearchLang) {

if (defaultReaderSettings == null) {
defaultReaderSettings = new ReaderSettings();
Expand All @@ -45,6 +54,7 @@ public Settings(
this.url = url;
this.defaultReaderSettings = defaultReaderSettings;
this.mangaReaderSettings = new HashMap<>(mangaReaderSettings);
this.defaultSearchLang = defaultSearchLang;
}

public Settings(@NotNull String url) {
Expand Down Expand Up @@ -91,4 +101,14 @@ public void addMangaReaderSettings(int mangaId, ReaderSettings readerSettings) {
public boolean hasMangaReaderSettings(int mangaId) {
return mangaReaderSettings.containsKey(mangaId);
}

/**
* Checks if the User has a default search language set.
*
* @return {@code true} if the manga reader has a default search language set, {@code false}
* otherwise.
*/
public boolean hasDefaultSearchLang() {
return defaultSearchLang != null && !defaultSearchLang.isEmpty();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import com.vaadin.flow.component.Svg;
import com.vaadin.flow.component.UI;
import com.vaadin.flow.component.button.Button;
import com.vaadin.flow.component.combobox.ComboBox;
import com.vaadin.flow.component.dependency.CssImport;
import com.vaadin.flow.component.html.Div;
import com.vaadin.flow.component.html.Image;
Expand All @@ -33,7 +34,6 @@
import lombok.extern.slf4j.Slf4j;
import online.hatsunemiku.tachideskvaadinui.component.card.MangaCard;
import online.hatsunemiku.tachideskvaadinui.component.combo.LangComboBox;
import online.hatsunemiku.tachideskvaadinui.component.events.source.LanguageListChangeEvent;
import online.hatsunemiku.tachideskvaadinui.data.settings.Settings;
import online.hatsunemiku.tachideskvaadinui.data.tachidesk.Manga;
import online.hatsunemiku.tachideskvaadinui.data.tachidesk.Source;
Expand All @@ -54,7 +54,7 @@
public class SearchView extends StandardLayout implements HasUrlParameter<String> {

private final Div searchResults;
private final LangComboBox langFilter;
private final ComboBox<String> langFilter;
private final SuperTextField searchField;
private final SourceService sourceService;
private final SearchService searchService;
Expand All @@ -70,7 +70,7 @@ public SearchView(
searchResults = new Div();

SuperTextField searchField = createSearchField();
LangComboBox langFilter = createLanguageComboBox(sourceService);
var langFilter = createLanguageComboBox(sourceService);

this.searchField = searchField;
this.langFilter = langFilter;
Expand Down Expand Up @@ -109,20 +109,28 @@ public SearchView(
}

@NotNull
private LangComboBox createLanguageComboBox(SourceService sourceService) {
LangComboBox langFilter = new LangComboBox();
private ComboBox<String> createLanguageComboBox(SourceService sourceService) {
ComboBox<String> langFilter = new LangComboBox();
langFilter.addClassName("search-lang-filter");

addListener(LanguageListChangeEvent.class, langFilter);
CompletableFuture.runAsync(
() -> {
var sources = sourceService.getSources();
var langs = sources.stream().map(Source::getLang).distinct().toList();
LanguageListChangeEvent event = new LanguageListChangeEvent(this, langs);
fireEvent(event);
});
var sources = sourceService.getSources();
var langs = sources.stream().map(Source::getLang).distinct().toList();
if (!langs.isEmpty()) {
langFilter.setItems(langs);

Settings settings = settingsService.getSettings();
if (settings.hasDefaultSearchLang()) {
langFilter.setValue(settings.getDefaultSearchLang());
}
}

langFilter.addValueChangeListener(e -> runSearch(searchField));
langFilter.addValueChangeListener(
e -> {
if (!e.isFromClient()) {
return;
}
runSearch(searchField);
});

return langFilter;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,16 +6,21 @@

package online.hatsunemiku.tachideskvaadinui.view;

import com.vaadin.flow.component.combobox.ComboBox;
import com.vaadin.flow.component.dependency.CssImport;
import com.vaadin.flow.component.formlayout.FormLayout;
import com.vaadin.flow.data.binder.Binder;
import com.vaadin.flow.data.binder.ValidationResult;
import com.vaadin.flow.router.Route;
import java.util.ArrayList;
import online.hatsunemiku.tachideskvaadinui.data.settings.Settings;
import online.hatsunemiku.tachideskvaadinui.data.settings.event.SettingsEventPublisher;
import online.hatsunemiku.tachideskvaadinui.data.tachidesk.Source;
import online.hatsunemiku.tachideskvaadinui.services.SettingsService;
import online.hatsunemiku.tachideskvaadinui.services.SourceService;
import online.hatsunemiku.tachideskvaadinui.view.layout.StandardLayout;
import org.apache.commons.validator.routines.UrlValidator;
import org.jetbrains.annotations.NotNull;
import org.vaadin.miki.superfields.text.SuperTextField;

@Route("settings")
Expand All @@ -25,7 +30,10 @@ public class SettingsView extends StandardLayout {
private static final UrlValidator urlValidator = new UrlValidator(UrlValidator.ALLOW_LOCAL_URLS);
private final SettingsEventPublisher settingsEventPublisher;

public SettingsView(SettingsService settingsService, SettingsEventPublisher eventPublisher) {
public SettingsView(
SettingsService settingsService,
SettingsEventPublisher eventPublisher,
SourceService sourceService) {
super("Settings");
setClassName("settings-view");

Expand All @@ -34,8 +42,48 @@ public SettingsView(SettingsService settingsService, SettingsEventPublisher even
FormLayout content = new FormLayout();
content.setClassName("settings-content");

SuperTextField urlField = new SuperTextField("URL");
Binder<Settings> binder = new Binder<>(Settings.class);
SuperTextField urlField = createUrlFieldWithValidation(binder);
var defaultSearchLangField = createSearchLangField(sourceService, binder);

binder.setBean(settingsService.getSettings());

content.add(urlField, defaultSearchLangField);

setContent(content);
}

private ComboBox<String> createSearchLangField(
SourceService sourceService, Binder<Settings> binder) {
ComboBox<String> defaultSearchLang = new ComboBox<>("Default Search Language");
defaultSearchLang.setAllowCustomValue(false);

var sources = sourceService.getSources();
var langs = new ArrayList<>(sources.stream().map(Source::getLang).distinct().toList());
defaultSearchLang.setItems(langs);

binder
.forField(defaultSearchLang)
.withValidator(
(lang, context) -> {
if (lang == null || lang.isEmpty()) {
return ValidationResult.error("Default Search Language cannot be empty");
}

if (lang.equals("Loading...")) {
return ValidationResult.error("Default Search Language cannot be Loading...");
}

return ValidationResult.ok();
})
.bind(Settings::getDefaultSearchLang, Settings::setDefaultSearchLang);

return defaultSearchLang;
}

@NotNull
private SuperTextField createUrlFieldWithValidation(Binder<Settings> binder) {
SuperTextField urlField = new SuperTextField("URL");
binder
.forField(urlField)
.withValidator(
Expand All @@ -62,11 +110,6 @@ public SettingsView(SettingsService settingsService, SettingsEventPublisher even
settings.setUrl(url);
settingsEventPublisher.publishUrlChangeEvent(this, url);
});

binder.setBean(settingsService.getSettings());

content.add(urlField);

setContent(content);
return urlField;
}
}

0 comments on commit 7e80cbe

Please sign in to comment.