From b9611d13fc9449e733add6beb3f996dc7f3281a5 Mon Sep 17 00:00:00 2001 From: bayang Date: Tue, 26 Jul 2022 20:47:36 +0200 Subject: [PATCH] feat: add possibility to write reviews --- README.md | 5 + screenshots/review_modal.jpg | Bin 0 -> 30060 bytes src/jelu-ui/package-lock.json | 39 +- src/jelu-ui/package.json | 2 + src/jelu-ui/src/App.vue | 5 + src/jelu-ui/src/assets/style.css | 7 + src/jelu-ui/src/components/BookCard.vue | 49 ++- src/jelu-ui/src/components/BookDataCard.vue | 297 ++++++++++++++ src/jelu-ui/src/components/BookDetail.vue | 128 +++++- src/jelu-ui/src/components/BookList.vue | 7 +- src/jelu-ui/src/components/BookReviews.vue | 83 ++++ src/jelu-ui/src/components/ReviewCard.vue | 106 +++++ src/jelu-ui/src/components/ReviewDetail.vue | 67 +++ src/jelu-ui/src/components/ReviewModal.vue | 205 ++++++++++ src/jelu-ui/src/components/ToReadList.vue | 2 +- src/jelu-ui/src/components/Welcome.vue | 2 +- src/jelu-ui/src/declarations.d.ts | 2 + src/jelu-ui/src/locales/en.json | 16 +- src/jelu-ui/src/model/Review.ts | 31 ++ src/jelu-ui/src/router.ts | 11 + src/jelu-ui/src/services/DataService.ts | 380 +++++++++++++----- .../bayang/jelu/config/SecurityConfig.kt | 5 +- .../jelu/controllers/BooksController.kt | 3 +- .../jelu/controllers/ReviewsController.kt | 84 ++++ .../controllers/UserMessagesController.kt | 4 +- .../jelu/controllers/UsersController.kt | 3 + .../github/bayang/jelu/dao/BookRepository.kt | 4 + .../bayang/jelu/dao/ReviewRepository.kt | 105 +++++ .../io/github/bayang/jelu/dao/ReviewTable.kt | 49 +++ .../io/github/bayang/jelu/dto/ReviewDto.kt | 30 ++ .../github/bayang/jelu/service/BookService.kt | 3 +- .../bayang/jelu/service/ReviewService.kt | 49 +++ .../jelu/service/exports/CsvExportService.kt | 2 +- src/main/resources/liquibase.xml | 37 ++ .../bayang/jelu/service/BookServiceTest.kt | 16 +- .../jelu/service/ReadingEventServiceTest.kt | 8 +- .../bayang/jelu/service/ReviewServiceTest.kt | 112 ++++++ .../service/exports/CsvExportServiceTest.kt | 2 +- .../service/imports/CsvImportServiceTest.kt | 4 +- 39 files changed, 1805 insertions(+), 159 deletions(-) create mode 100644 screenshots/review_modal.jpg create mode 100644 src/jelu-ui/src/components/BookDataCard.vue create mode 100644 src/jelu-ui/src/components/BookReviews.vue create mode 100644 src/jelu-ui/src/components/ReviewCard.vue create mode 100644 src/jelu-ui/src/components/ReviewDetail.vue create mode 100644 src/jelu-ui/src/components/ReviewModal.vue create mode 100644 src/jelu-ui/src/model/Review.ts create mode 100644 src/main/kotlin/io/github/bayang/jelu/controllers/ReviewsController.kt create mode 100644 src/main/kotlin/io/github/bayang/jelu/dao/ReviewRepository.kt create mode 100644 src/main/kotlin/io/github/bayang/jelu/dao/ReviewTable.kt create mode 100644 src/main/kotlin/io/github/bayang/jelu/dto/ReviewDto.kt create mode 100644 src/main/kotlin/io/github/bayang/jelu/service/ReviewService.kt create mode 100644 src/test/kotlin/io/github/bayang/jelu/service/ReviewServiceTest.kt diff --git a/README.md b/README.md index 070b7644..532dc45d 100644 --- a/README.md +++ b/README.md @@ -36,6 +36,7 @@ All your data is now located into a single-file database which can be saved anyw * Provide some stats about your readings * Multi user support * provides an API +* Write reviews and share them, see the reviews of other users on your instance ## Usage @@ -167,6 +168,10 @@ Embed code and preview : ![](screenshots/embed.png) +Review creation : + +![](screenshots/review_modal.jpg) + ## Roadmap * Koreader integration (https://koreader.rocks/) diff --git a/screenshots/review_modal.jpg b/screenshots/review_modal.jpg new file mode 100644 index 0000000000000000000000000000000000000000..149201042001ae6dfcf83e758f80907e0d4b1565 GIT binary patch literal 30060 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 Ke3gie{(k^`eeenZ literal 0 HcmV?d00001 diff --git a/src/jelu-ui/package-lock.json b/src/jelu-ui/package-lock.json index 60173e50..2c4e2963 100644 --- a/src/jelu-ui/package-lock.json +++ b/src/jelu-ui/package-lock.json @@ -1,12 +1,12 @@ { "name": "jelu-ui", - "version": "0.20.0", + "version": "0.25.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "jelu-ui", - "version": "0.20.0", + "version": "0.25.1", "dependencies": { "@formkit/i18n": "^1.0.0-beta.7-c3de75f", "@formkit/tailwindcss": "^1.0.0-beta.7-c3de75f", @@ -30,6 +30,8 @@ "vue-chartjs": "^4.1.0", "vue-i18n": "^9.1.9", "vue-router": "4.0.14", + "vue-star-rating": "^2.1.0", + "vue3-star-ratings": "^1.1.0", "vuejs-sidebar-menu": "^1.0.0", "vuex": "^4.0.2" }, @@ -3653,6 +3655,14 @@ "vue": "^3.2.0" } }, + "node_modules/vue-star-rating": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/vue-star-rating/-/vue-star-rating-2.1.0.tgz", + "integrity": "sha512-LnhuQPi4hkRg7egKls+iqtL1U0RTN2gQkdLsJN7acyynMsSc9epHLzk8McJS+bR0OzfG98zNFq7mxAyuSb/okQ==", + "dependencies": { + "vue": "^3.0.0" + } + }, "node_modules/vue-tsc": { "version": "0.34.6", "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-0.34.6.tgz", @@ -3668,6 +3678,17 @@ "typescript": "*" } }, + "node_modules/vue3-star-ratings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/vue3-star-ratings/-/vue3-star-ratings-1.1.0.tgz", + "integrity": "sha512-dDGZAn64N9DvaJxCm0Zoy+2pauWioK4ayj7iAH89sVTxMbmrPkhlC9B527PL+t1wcPWH0wIZaFZZp5OMO5hRrA==", + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "vue": "^3.0.5" + } + }, "node_modules/vuejs-sidebar-menu": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/vuejs-sidebar-menu/-/vuejs-sidebar-menu-1.0.0.tgz", @@ -6233,6 +6254,14 @@ "@vue/devtools-api": "^6.0.0" } }, + "vue-star-rating": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/vue-star-rating/-/vue-star-rating-2.1.0.tgz", + "integrity": "sha512-LnhuQPi4hkRg7egKls+iqtL1U0RTN2gQkdLsJN7acyynMsSc9epHLzk8McJS+bR0OzfG98zNFq7mxAyuSb/okQ==", + "requires": { + "vue": "^3.0.0" + } + }, "vue-tsc": { "version": "0.34.6", "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-0.34.6.tgz", @@ -6242,6 +6271,12 @@ "@volar/vue-typescript": "0.34.6" } }, + "vue3-star-ratings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/vue3-star-ratings/-/vue3-star-ratings-1.1.0.tgz", + "integrity": "sha512-dDGZAn64N9DvaJxCm0Zoy+2pauWioK4ayj7iAH89sVTxMbmrPkhlC9B527PL+t1wcPWH0wIZaFZZp5OMO5hRrA==", + "requires": {} + }, "vuejs-sidebar-menu": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/vuejs-sidebar-menu/-/vuejs-sidebar-menu-1.0.0.tgz", diff --git a/src/jelu-ui/package.json b/src/jelu-ui/package.json index ad657263..4b961030 100644 --- a/src/jelu-ui/package.json +++ b/src/jelu-ui/package.json @@ -31,6 +31,8 @@ "vue-chartjs": "^4.1.0", "vue-i18n": "^9.1.9", "vue-router": "4.0.14", + "vue-star-rating": "^2.1.0", + "vue3-star-ratings": "^1.1.0", "vuejs-sidebar-menu": "^1.0.0", "vuex": "^4.0.2" }, diff --git a/src/jelu-ui/src/App.vue b/src/jelu-ui/src/App.vue index aea1982d..65860fb9 100644 --- a/src/jelu-ui/src/App.vue +++ b/src/jelu-ui/src/App.vue @@ -43,6 +43,11 @@ store.dispatch('getUser') // } }) .catch(() => { + if (store.state.route != null && store.state.route.name === "review-detail") { + router.push(store.state.route) + initialLoad.value = false + return + } initialLoad.value = false console.log("catch in App") router.push({ name: 'login' }).then(() => { console.log("ok nav") }).catch(() => { console.log("error nav") }) diff --git a/src/jelu-ui/src/assets/style.css b/src/jelu-ui/src/assets/style.css index bb132c8e..c2922d89 100644 --- a/src/jelu-ui/src/assets/style.css +++ b/src/jelu-ui/src/assets/style.css @@ -169,6 +169,13 @@ width: min(600px, 90vw); } +.review-modal { + /* margin: 30px; */ + @apply m-5 sm:p-5; + height: min(600px, 70vh); + width: min(600px, 85vw); +} + .small-cover { @apply w-28; } diff --git a/src/jelu-ui/src/components/BookCard.vue b/src/jelu-ui/src/components/BookCard.vue index e296967a..54f3b51d 100644 --- a/src/jelu-ui/src/components/BookCard.vue +++ b/src/jelu-ui/src/components/BookCard.vue @@ -145,21 +145,26 @@ watch(checked, (newVal, oldVal) => { > -
- cover image - cover placeholder -
+ +
+ cover image + cover placeholder +
+
{ {{ book.book.title }} -

- {{ book.book.title }} -

+ +
+import { useProgrammatic } from "@oruga-ui/oruga-next" +import { until } from '@vueuse/core' +import { computed, Ref, ref, watch } from 'vue' +import { useI18n } from 'vue-i18n' +import { useRouter } from 'vue-router' +import useDates from '../composables/dates' +import { Book, UserBook } from '../model/Book' +import dataService from "../services/DataService" +import { ObjectUtils } from '../utils/ObjectUtils' +import EditBookModal from "./EditBookModal.vue" + +const { t, d } = useI18n({ + inheritLocale: true, + useScope: 'global' + }) + +const props = defineProps<{ + book: Book, + owned: boolean|null, + toRead: boolean|null, + links: boolean|null, + bookLink: boolean|null, + addBook: boolean +}>() + +const router = useRouter() +const { oruga } = useProgrammatic(); +console.log(oruga) + +const { formatDate, formatDateString } = useDates() + +const getBookIsLoading: Ref = ref(false) + +const hasExternalLink = computed(() => props.book.amazonId != null + || props.book.goodreadsId != null + || props.book.googleId != null + || props.book.librarythingId != null) + +const userbookId: Ref = ref(null) +const bookCanBeAdded: Ref = ref(false) + +const getUserbookId = async () => { + bookCanBeAdded.value = false + await until(props.book.id).not.toBeNull() + console.log("book id " + props.book.id) + dataService.findUserBookByCriteria(null, props.book.id, null, null, 0, 10) + .then(res => { + if (!res.empty) { + if (res.content.length > 0 && res.content[0].id != null) { + userbookId.value = res.content[0].id + } else { + bookCanBeAdded.value = true + } + } else { + bookCanBeAdded.value = true + } + }) +} + +watch(() => props.book.id, (newVal, oldVal) => { + console.log("props.book.id ") + console.log(newVal + " " + oldVal) + bookCanBeAdded.value = false + if (newVal !== oldVal && props.book.id != null) { + getUserbookId() + } +}) + +const toggleEdit = (book: UserBook) => { + if (book.id == null) { + console.log("book") + console.log(book) + oruga.modal.open({ + component: EditBookModal, + trapFocus: true, + active: true, + canCancel: ['x', 'button', 'outside'], + scroll: 'clip', + props: { + "book" : book, + canAddEvent: true + }, + onClose: modalClosed + }); + } +} + +function modalClosed() { + console.log("modal closed from data card") + router.push({ name: 'book-reviews', params: { bookId: props.book.id } }) +} + + + + + + diff --git a/src/jelu-ui/src/components/BookDetail.vue b/src/jelu-ui/src/components/BookDetail.vue index 72795542..4c59bc3d 100644 --- a/src/jelu-ui/src/components/BookDetail.vue +++ b/src/jelu-ui/src/components/BookDetail.vue @@ -1,5 +1,5 @@ @@ -311,6 +389,20 @@ getBook() > +

+
+ + {{ t('reviews.all_reviews') }} + +
+
+

+ {{ t('reviews.my_reviews') }} : +

+
+ +
+
{ const getBooks = () => { getBookIsLoading.value = true - dataService.findUserBookByCriteria(eventTypes.value, toReadAsBool.value, + dataService.findUserBookByCriteria(eventTypes.value, null, toReadAsBool.value, ownedAsBool.value, pageAsNumber.value - 1, perPage.value, sortQuery.value) .then(res => { @@ -99,11 +99,6 @@ const throttledGetBooks = useThrottleFn(() => { getBooks() }, 100, false) -// const sortOrderUpdated = (newval: string) => { -// console.log('sortOrderUpdated ' + newval) -// sortOrder.value = newval -// } - onMounted(() => { console.log("Component is mounted!"); try { diff --git a/src/jelu-ui/src/components/BookReviews.vue b/src/jelu-ui/src/components/BookReviews.vue new file mode 100644 index 00000000..091d3bcf --- /dev/null +++ b/src/jelu-ui/src/components/BookReviews.vue @@ -0,0 +1,83 @@ + + + + + diff --git a/src/jelu-ui/src/components/ReviewCard.vue b/src/jelu-ui/src/components/ReviewCard.vue new file mode 100644 index 00000000..a6df2f0f --- /dev/null +++ b/src/jelu-ui/src/components/ReviewCard.vue @@ -0,0 +1,106 @@ + + + + + diff --git a/src/jelu-ui/src/components/ReviewDetail.vue b/src/jelu-ui/src/components/ReviewDetail.vue new file mode 100644 index 00000000..219f036c --- /dev/null +++ b/src/jelu-ui/src/components/ReviewDetail.vue @@ -0,0 +1,67 @@ + + + + + diff --git a/src/jelu-ui/src/components/ReviewModal.vue b/src/jelu-ui/src/components/ReviewModal.vue new file mode 100644 index 00000000..1e2c68fe --- /dev/null +++ b/src/jelu-ui/src/components/ReviewModal.vue @@ -0,0 +1,205 @@ + + +