diff --git a/src/auto-imports.d.ts b/src/auto-imports.d.ts index 03da606..8d80de6 100644 --- a/src/auto-imports.d.ts +++ b/src/auto-imports.d.ts @@ -243,6 +243,7 @@ declare global { const useRafFn: typeof import('@vueuse/core')['useRafFn'] const useRefHistory: typeof import('@vueuse/core')['useRefHistory'] const useResizeObserver: typeof import('@vueuse/core')['useResizeObserver'] + const useReviewStore: typeof import('./store/review')['useReviewStore'] const useRoute: typeof import('vue-router')['useRoute'] const useRouter: typeof import('vue-router')['useRouter'] const useScreenOrientation: typeof import('@vueuse/core')['useScreenOrientation'] @@ -560,6 +561,7 @@ declare module 'vue' { readonly useRafFn: UnwrapRef readonly useRefHistory: UnwrapRef readonly useResizeObserver: UnwrapRef + readonly useReviewStore: UnwrapRef readonly useRoute: UnwrapRef readonly useRouter: UnwrapRef readonly useScreenOrientation: UnwrapRef @@ -870,6 +872,7 @@ declare module '@vue/runtime-core' { readonly useRafFn: UnwrapRef readonly useRefHistory: UnwrapRef readonly useResizeObserver: UnwrapRef + readonly useReviewStore: UnwrapRef readonly useRoute: UnwrapRef readonly useRouter: UnwrapRef readonly useScreenOrientation: UnwrapRef diff --git a/src/components.d.ts b/src/components.d.ts index a31b312..1840dcb 100644 --- a/src/components.d.ts +++ b/src/components.d.ts @@ -26,15 +26,9 @@ declare module 'vue' { Navbar: typeof import('./components/Navbar.vue')['default'] NBadge: typeof import('naive-ui')['NBadge'] NButton: typeof import('naive-ui')['NButton'] - NCard: typeof import('naive-ui')['NCard'] NConfigProvider: typeof import('naive-ui')['NConfigProvider'] NDataTable: typeof import('naive-ui')['NDataTable'] NDialogProvider: typeof import('naive-ui')['NDialogProvider'] - NDrawer: typeof import('naive-ui')['NDrawer'] - NDrawerContent: typeof import('naive-ui')['NDrawerContent'] - NDynamicTags: typeof import('naive-ui')['NDynamicTags'] - NForm: typeof import('naive-ui')['NForm'] - NFormItem: typeof import('naive-ui')['NFormItem'] NIcon: typeof import('naive-ui')['NIcon'] NInput: typeof import('naive-ui')['NInput'] NLayout: typeof import('naive-ui')['NLayout'] @@ -42,16 +36,11 @@ declare module 'vue' { NLayoutSider: typeof import('naive-ui')['NLayoutSider'] NMenu: typeof import('naive-ui')['NMenu'] NMessageProvider: typeof import('naive-ui')['NMessageProvider'] - NModal: typeof import('naive-ui')['NModal'] NNotificationProvider: typeof import('naive-ui')['NNotificationProvider'] NPageHeader: typeof import('naive-ui')['NPageHeader'] NPopselect: typeof import('naive-ui')['NPopselect'] - NSelect: typeof import('naive-ui')['NSelect'] - NSpace: typeof import('naive-ui')['NSpace'] - NSwitch: typeof import('naive-ui')['NSwitch'] - NTreeSelect: typeof import('naive-ui')['NTreeSelect'] - NUpload: typeof import('naive-ui')['NUpload'] ProductsManagement: typeof import('./components/Products/ProductsManagement.vue')['default'] + ReviewManagement: typeof import('./components/Review/ReviewManagement.vue')['default'] RouterLink: typeof import('vue-router')['RouterLink'] RouterView: typeof import('vue-router')['RouterView'] Sidebar: typeof import('./components/Sidebar.vue')['default'] diff --git a/src/components/Review/ReviewManagement.vue b/src/components/Review/ReviewManagement.vue new file mode 100644 index 0000000..38fe5f6 --- /dev/null +++ b/src/components/Review/ReviewManagement.vue @@ -0,0 +1,144 @@ + + + + + diff --git a/src/mocks/handlers/review.handler.ts b/src/mocks/handlers/review.handler.ts new file mode 100644 index 0000000..c860c89 --- /dev/null +++ b/src/mocks/handlers/review.handler.ts @@ -0,0 +1,42 @@ +import { HttpResponse, http } from 'msw' +import { faker } from '@faker-js/faker' +import _ from 'lodash' +import { CreatePagedResponse } from '../handlers.utility' +import type { Review } from '~/models/Review' + +const reviews = _.times(65, createFakeReview) +const handlers = [ + http.get('/api/review/', ({ request }) => { + const response = CreatePagedResponse(request, reviews) + return HttpResponse.json(response, { status: 200 }) + }), +] + +function createFakeReview(): Review { + return { + id: faker.number.int().toString(), + date: faker.date.past(), + rate: faker.number.float({ max: 5 }), + product: { + name: faker.commerce.productName(), + id: faker.number.int().toString(), + }, + comment: { + id: faker.number.int().toString(), + message: faker.commerce.productAdjective(), + }, + customer: { + id: faker.number.int().toString(), + firstName: faker.person.firstName(), + lastName: faker.person.lastName(), + address: [], + mobile: faker.phone.number(), + joinDate: faker.date.past(), + birthDate: faker.date.birthdate(), + email: faker.internet.email(), + ordersCount: faker.number.int({ max: 50 }), + }, + } +} + +export default handlers diff --git a/src/models/Review.ts b/src/models/Review.ts new file mode 100644 index 0000000..6173e40 --- /dev/null +++ b/src/models/Review.ts @@ -0,0 +1,20 @@ +import type { Customer } from './Customer' + +export interface Review { + id: string + customer: Customer + product: ReviewProduct + date: Date + rate: number + comment: Comment +} + +export interface Comment { + id: string + message: string +} + +export interface ReviewProduct { + id: string + name: string +} diff --git a/src/pages/Reviews/index.vue b/src/pages/Reviews/index.vue new file mode 100644 index 0000000..69fdf8e --- /dev/null +++ b/src/pages/Reviews/index.vue @@ -0,0 +1,14 @@ + + + +meta: + title: Reviews + + + + + diff --git a/src/services/review.service.ts b/src/services/review.service.ts new file mode 100644 index 0000000..517d53f --- /dev/null +++ b/src/services/review.service.ts @@ -0,0 +1,14 @@ +import { ApiService } from '~/common/api/api-service' +import type { PagedAndSortedRequest } from '~/models/PagedAndSortedRequest' +import type { PagedListResult } from '~/models/PagedListResult' +import type { Review } from '~/models/Review' + +const apiService = new ApiService('review') +class ReviewService { + constructor() { } + async getReviewList(options: PagedAndSortedRequest): Promise> { + const response = await apiService.getPagedList('', options) + return response + } +} +export default new ReviewService() diff --git a/src/store/review.store.ts b/src/store/review.store.ts new file mode 100644 index 0000000..a41ee32 --- /dev/null +++ b/src/store/review.store.ts @@ -0,0 +1,38 @@ +import { acceptHMRUpdate, defineStore } from 'pinia' +import type { PagedAndSortedRequest } from '~/models/PagedAndSortedRequest' +import type { Review } from '~/models/Review' +import reviewService from '~/services/review.service' + +export interface ReviewState { + +} +export const useReviewStore = defineStore('Review', () => { + const reviews = ref([]) + + const reviewItem = ref() + const isLoading = ref(false) + const isSaving = ref(false) + const { options } = useOptions() + + async function getReviews(options: PagedAndSortedRequest) { + isLoading.value = true + try { + const response = await reviewService.getReviewList(options) + reviews.value = response.items + options.pageSize = Math.trunc(response.totalCount / options.itemsPerPage) + } + finally { + isLoading.value = false + } + } + return { + reviews, + isSaving, + isLoading, + getReviews, + reviewItem, + options, + } +}) +if (import.meta.hot) + import.meta.hot.accept(acceptHMRUpdate(useReviewStore, import.meta.hot))