Add a button to choose to query inventaire from search
This commit is contained in:
@@ -43,7 +43,7 @@ function openBook() {
|
|||||||
<p>{{error}}</p>
|
<p>{{error}}</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="columns no-padding box container has-background-dark">
|
<div class="columns no-padding box container has-background-dark">
|
||||||
<div class="media column no-margin" @click="openBook">
|
<div class="media column no-margin clickable" @click="openBook">
|
||||||
<div class="media-left">
|
<div class="media-left">
|
||||||
<figure class="image mb-3">
|
<figure class="image mb-3">
|
||||||
<img v-bind:src="imagePathOrDefault" v-bind:alt="title">
|
<img v-bind:src="imagePathOrDefault" v-bind:alt="title">
|
||||||
@@ -55,7 +55,7 @@ function openBook() {
|
|||||||
<div class="has-text-text-65 is-size-6" v-if="props.description">{{description}}</div>
|
<div class="has-text-text-65 is-size-6" v-if="props.description">{{description}}</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="column is-narrow">
|
<div v-if="!inventaireid" class="column is-narrow">
|
||||||
<button @click="" class="button is-large verticalbutton">
|
<button @click="" class="button is-large verticalbutton">
|
||||||
<span class="icon" :title="$t('booklistelement.wantread')">
|
<span class="icon" :title="$t('booklistelement.wantread')">
|
||||||
<b-icon-eye-fill v-if="props.wantread" />
|
<b-icon-eye-fill v-if="props.wantread" />
|
||||||
@@ -85,6 +85,10 @@ img {
|
|||||||
width:auto;
|
width:auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.clickable {
|
||||||
|
cursor:pointer
|
||||||
|
}
|
||||||
|
|
||||||
.box {
|
.box {
|
||||||
transition:ease-in-out 0.04s;
|
transition:ease-in-out 0.04s;
|
||||||
margin-bottom: 15px;
|
margin-bottom: 15px;
|
||||||
|
|||||||
@@ -30,7 +30,7 @@
|
|||||||
<p>{{error}}</p>
|
<p>{{error}}</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="columns no-padding box container has-background-dark">
|
<div class="columns no-padding box container has-background-dark">
|
||||||
<div class="media column no-margin" @click="openBook">
|
<div class="media column no-margin clickable" @click="openBook">
|
||||||
<div class="media-left">
|
<div class="media-left">
|
||||||
<figure class="image mb-3">
|
<figure class="image mb-3">
|
||||||
<img v-bind:src="imagePathOrDefault" v-bind:alt="title">
|
<img v-bind:src="imagePathOrDefault" v-bind:alt="title">
|
||||||
@@ -55,6 +55,11 @@ img {
|
|||||||
width:auto;
|
width:auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.clickable {
|
||||||
|
cursor:pointer
|
||||||
|
}
|
||||||
|
|
||||||
.box {
|
.box {
|
||||||
transition:ease-in-out 0.04s;
|
transition:ease-in-out 0.04s;
|
||||||
margin-bottom: 15px;
|
margin-bottom: 15px;
|
||||||
|
|||||||
@@ -15,6 +15,12 @@
|
|||||||
authorId: Number
|
authorId: Number
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const forceSearchInventaire = ref(false);
|
||||||
|
|
||||||
|
const searchInventaire = computed(() => {
|
||||||
|
return forceSearchInventaire.value || (data.value !== null && data.value['inventaire'])
|
||||||
|
});
|
||||||
|
|
||||||
let data = ref(null);
|
let data = ref(null);
|
||||||
let error = ref(null);
|
let error = ref(null);
|
||||||
|
|
||||||
@@ -27,9 +33,11 @@
|
|||||||
|
|
||||||
|
|
||||||
function fetchData(searchTerm, authorId) {
|
function fetchData(searchTerm, authorId) {
|
||||||
|
data.value = null;
|
||||||
|
error.value = null;
|
||||||
if (searchTerm != null) {
|
if (searchTerm != null) {
|
||||||
const lang = navigator.language.substring(0,2);
|
const lang = navigator.language.substring(0,2);
|
||||||
getSearchBooks(data, error, searchTerm, lang, limit, offset.value);
|
getSearchBooks(data, error, searchTerm, lang, forceSearchInventaire.value, limit, offset.value);
|
||||||
} else if (authorId != null) {
|
} else if (authorId != null) {
|
||||||
getAuthorBooks(data, error, authorId, limit, offset.value);
|
getAuthorBooks(data, error, authorId, limit, offset.value);
|
||||||
}
|
}
|
||||||
@@ -46,15 +54,26 @@
|
|||||||
fetchData(props.searchterm, props.authorId);
|
fetchData(props.searchterm, props.authorId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function toggleSearchInventaire() {
|
||||||
|
pageNumber.value = 1;
|
||||||
|
forceSearchInventaire.value = !forceSearchInventaire.value;
|
||||||
|
fetchData(props.searchterm, props.authorId)
|
||||||
|
window.scrollTo(0,0);
|
||||||
|
}
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<div class="booksearch my-2">
|
<div class="booksearch my-2">
|
||||||
|
<h1 class="title" v-if="data && data.inventaire">{{$t('searchbook.importinventaire')}}</h1>
|
||||||
<div v-if="error">{{$t('searchbook.error', {error: error.message})}}</div>
|
<div v-if="error">{{$t('searchbook.error', {error: error.message})}}</div>
|
||||||
<div v-else-if="data && data.books && data.books.length > 0">
|
<div v-else-if="data && data.books && data.books.length > 0">
|
||||||
<div class="booksearchlist" v-for="book in data.books" :key="book.id">
|
<div class="booksearchlist" v-for="book in data.books" :key="book.id">
|
||||||
<BookListElement v-bind="book" />
|
<BookListElement v-bind="book" />
|
||||||
</div>
|
</div>
|
||||||
|
<div v-if="!searchInventaire || forceSearchInventaire" class="box container clickable has-background-dark" @click="toggleSearchInventaire">
|
||||||
|
<div class="is-size-4">{{searchInventaire ? $t('searchbook.backtosearch') : $t('searchbook.searchinventaire')}}</div>
|
||||||
|
</div>
|
||||||
<Pagination
|
<Pagination
|
||||||
:pageNumber="pageNumber"
|
:pageNumber="pageNumber"
|
||||||
:pageTotal="pageTotal"
|
:pageTotal="pageTotal"
|
||||||
@@ -66,5 +85,10 @@
|
|||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<style scoped></style>
|
<style scoped>
|
||||||
|
|
||||||
|
.clickable {
|
||||||
|
cursor:pointer
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
|||||||
@@ -41,8 +41,8 @@ export function getMyBooks(data, error, arg, limit, offset) {
|
|||||||
return useFetch(data, error, baseUrl + '/mybooks/' + arg + "?" + queryParams.toString());
|
return useFetch(data, error, baseUrl + '/mybooks/' + arg + "?" + queryParams.toString());
|
||||||
}
|
}
|
||||||
|
|
||||||
export function getSearchBooks(data, error, searchterm, lang, limit, offset) {
|
export function getSearchBooks(data, error, searchterm, lang, searchInventaire, limit, offset) {
|
||||||
const queryParams = new URLSearchParams({lang: lang, limit: limit, offset: offset});
|
const queryParams = new URLSearchParams({lang: lang, inventaire: searchInventaire, limit: limit, offset: offset});
|
||||||
return useFetch(data, error, baseUrl + '/search/' + encodeURIComponent(searchterm) + "?" + queryParams.toString());
|
return useFetch(data, error, baseUrl + '/search/' + encodeURIComponent(searchterm) + "?" + queryParams.toString());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -36,7 +36,10 @@
|
|||||||
"searchbook": {
|
"searchbook": {
|
||||||
"error": "Error when loading books: {error}",
|
"error": "Error when loading books: {error}",
|
||||||
"loading": "Loading...",
|
"loading": "Loading...",
|
||||||
"noresult": "No results found."
|
"noresult": "No results found.",
|
||||||
|
"importinventaire": "Import from inventaire.io",
|
||||||
|
"searchinventaire": "Load more results from inventaire.io",
|
||||||
|
"backtosearch": "Go back to regular search"
|
||||||
},
|
},
|
||||||
"booklistelement": {
|
"booklistelement": {
|
||||||
"read": "Read",
|
"read": "Read",
|
||||||
|
|||||||
@@ -36,7 +36,10 @@
|
|||||||
"searchbook": {
|
"searchbook": {
|
||||||
"error": "Erreur pendant le chargement des livres: {error}",
|
"error": "Erreur pendant le chargement des livres: {error}",
|
||||||
"loading": "Chargement...",
|
"loading": "Chargement...",
|
||||||
"noresult": "Aucun résultat trouvé."
|
"noresult": "Aucun résultat trouvé.",
|
||||||
|
"importinventaire": "Importer depuis inventaire.io",
|
||||||
|
"searchinventaire": "Charger plus de résultats depuis inventaire.io",
|
||||||
|
"backtosearch": "Retourner à la recherche"
|
||||||
},
|
},
|
||||||
"booklistelement": {
|
"booklistelement": {
|
||||||
"read": "Lu",
|
"read": "Lu",
|
||||||
|
|||||||
@@ -6,7 +6,8 @@ type AuthorGet struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type BookSearchGetParam struct {
|
type BookSearchGetParam struct {
|
||||||
Lang string `form:"lang" binding:"max=5"`
|
Lang string `form:"lang" binding:"max=5"`
|
||||||
|
Inventaire bool `form:"inventaire"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type BookPostCreate struct {
|
type BookPostCreate struct {
|
||||||
|
|||||||
@@ -31,8 +31,9 @@ type BookUserGetBook struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type BookSearchGet struct {
|
type BookSearchGet struct {
|
||||||
Count int64 `json:"count"`
|
Count int64 `json:"count"`
|
||||||
Books []BookSearchGetBook `json:"books"`
|
Inventaire bool `json:"inventaire"`
|
||||||
|
Books []BookSearchGetBook `json:"books"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type BookSearchGetBook struct {
|
type BookSearchGetBook struct {
|
||||||
|
|||||||
@@ -36,20 +36,21 @@ func GetSearchBooksHandler(ac appcontext.AppContext) {
|
|||||||
myvalidator.ReturnErrorsAsJsonResponse(&ac, err)
|
myvalidator.ReturnErrorsAsJsonResponse(&ac, err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
books, err := query.FetchBookSearchGet(ac.Db, user.ID, searchterm, limit, offset)
|
|
||||||
if err != nil {
|
|
||||||
myvalidator.ReturnErrorsAsJsonResponse(&ac, err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
var returnedBooks dto.BookSearchGet
|
var returnedBooks dto.BookSearchGet
|
||||||
if len(books) > 0 {
|
if !params.Inventaire {
|
||||||
|
books, err := query.FetchBookSearchGet(ac.Db, user.ID, searchterm, limit, offset)
|
||||||
|
if err != nil {
|
||||||
|
myvalidator.ReturnErrorsAsJsonResponse(&ac, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
count, err := query.FetchBookSearchGetCount(ac.Db, user.ID, searchterm)
|
count, err := query.FetchBookSearchGetCount(ac.Db, user.ID, searchterm)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
myvalidator.ReturnErrorsAsJsonResponse(&ac, err)
|
myvalidator.ReturnErrorsAsJsonResponse(&ac, err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
returnedBooks = dto.BookSearchGet{Count: count, Books: books}
|
returnedBooks = dto.BookSearchGet{Count: count, Inventaire: false, Books: books}
|
||||||
} else {
|
}
|
||||||
|
if params.Inventaire || len(returnedBooks.Books) == 0 {
|
||||||
queryResult, err := inventaire.CallInventaireSearch(searchterm, params.Lang, limit, offset)
|
queryResult, err := inventaire.CallInventaireSearch(searchterm, params.Lang, limit, offset)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
myvalidator.ReturnErrorsAsJsonResponse(&ac, err)
|
myvalidator.ReturnErrorsAsJsonResponse(&ac, err)
|
||||||
@@ -80,5 +81,5 @@ func InventaireBooksToBookSearchGet(results inventaire.InventaireSearchResult) d
|
|||||||
}
|
}
|
||||||
books = append(books, bookSearchGetBook)
|
books = append(books, bookSearchGetBook)
|
||||||
}
|
}
|
||||||
return dto.BookSearchGet{Count: results.Total, Books: books}
|
return dto.BookSearchGet{Count: results.Total, Inventaire: true, Books: books}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user