diff --git a/package.json b/package.json index 1acce49..2b048cb 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,7 @@ "@eslint/eslintrc": "^3.3.0", "@eslint/js": "^9.22.0", "@mdi/font": "^7.4.47", - "@profcomff/api-uilib": "^2025.4.15", + "@profcomff/api-uilib": "^2025.10.15", "@types/node": "^22.13.10", "@typescript-eslint/eslint-plugin": "^8.26.1", "@typescript-eslint/parser": "^8.26.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c793f49..8e1370c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -31,8 +31,8 @@ importers: specifier: ^7.4.47 version: 7.4.47 '@profcomff/api-uilib': - specifier: ^2025.4.15 - version: 2025.4.15 + specifier: ^2025.10.15 + version: 2025.10.15 '@types/node': specifier: ^22.13.10 version: 22.13.10 @@ -649,8 +649,8 @@ packages: resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - '@profcomff/api-uilib@2025.4.15': - resolution: {integrity: sha512-uCRxCblplBY56NORHcqiP5GVgF7GCiXUYwYBiHXymq9cLvnwzT+Dk0yCyQ5gDWkNtlQ+BnXnpyr82FPdTI1xkg==} + '@profcomff/api-uilib@2025.10.15': + resolution: {integrity: sha512-M4/PlFfMR85bBNXyY3ejTaHlvcLc0Y5Oq4PQUoQm+oYW/zEOLJrAb2UjGOw9ZUUEcQTRpW1rs/2LCqeMpGGZVg==} '@redocly/ajv@8.11.2': resolution: {integrity: sha512-io1JpnwtIcvojV7QKDUSIuMN/ikdOUd1ReEnUnMKGfDVridQZ31J0MmIuqwuRjWDZfmvr+Q0MqCcfHM2gTivOg==} @@ -781,8 +781,8 @@ packages: '@types/estree@1.0.6': resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} - '@types/estree@1.0.7': - resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} @@ -2872,7 +2872,7 @@ snapshots: '@pkgr/core@0.1.1': {} - '@profcomff/api-uilib@2025.4.15': + '@profcomff/api-uilib@2025.10.15': dependencies: openapi-fetch: 0.10.6 @@ -2974,13 +2974,13 @@ snapshots: '@types/eslint@9.6.1': dependencies: - '@types/estree': 1.0.7 + '@types/estree': 1.0.8 '@types/json-schema': 7.0.15 optional: true '@types/estree@1.0.6': {} - '@types/estree@1.0.7': + '@types/estree@1.0.8': optional: true '@types/json-schema@7.0.15': {} diff --git a/src/components/TheLecturerSearchCard.vue b/src/components/TheLecturerSearchCard.vue index 72c1da4..2de70df 100644 --- a/src/components/TheLecturerSearchCard.vue +++ b/src/components/TheLecturerSearchCard.vue @@ -39,7 +39,7 @@
отзывы: {{ lecturer.comments?.length ?? '—' }}
- оценка: {{ lecturer.mark_general > 0 ? '+' : '' }}{{ lecturer.mark_general?.toFixed(2) ?? '—' }} + оценка: {{ lecturer.mark_weighted > 0 ? '+' : '' }}{{ lecturer.mark_weighted.toFixed(2) ?? '—' }}
diff --git a/src/components/TheSearchBar.vue b/src/components/TheSearchBar.vue index eabf83c..bb7506f 100644 --- a/src/components/TheSearchBar.vue +++ b/src/components/TheSearchBar.vue @@ -39,6 +39,21 @@ @click:clear="subject = ''" @click.stop /> + + + = {}; @@ -138,6 +156,7 @@ async function shareSearch() { if (order.value && order.value !== 'по релевантности') params.order = order.value; if (subject.value) params.subject = subject.value; if (propsParent.page > 1) params.page = propsParent.page; + if (mark.value) params.mark = mark.value; // Значение ascending обратное иконке (если иконка ascending, то значение false) const isAscending = iconAscDesc.value === 'mdi-sort-alphabetical-ascending'; diff --git a/src/pages/MainPage.vue b/src/pages/MainPage.vue index f3860a4..d0e6429 100644 --- a/src/pages/MainPage.vue +++ b/src/pages/MainPage.vue @@ -29,6 +29,7 @@ const subject = ref(searchStore.subject); const order = ref(searchStore.order || 'по релевантности'); const ascending = ref(searchStore.ascending); const page = ref(searchStore.page); +const mark = ref(searchStore.mark || ''); // Вычисляем порядковые номера для компактного режима const lecturerRatings = computed(() => { @@ -44,6 +45,7 @@ async function updateLecturersList() { subject: subject.value, orderBy: OrderFromText[order.value as keyof typeof OrderFromText] as Order, ascending: ascending.value, + mark: mark.value || undefined, }); } @@ -56,10 +58,11 @@ async function onSearchParamChange() { await updateLecturersList(); } +watch(mark, onSearchParamChange); watch(page, updateLecturersList); function toLecturerPage(id: number) { - searchStore.setParams(name.value, subject.value, order.value, ascending.value, page.value); + searchStore.setParams(name.value, subject.value, order.value, ascending.value, page.value, mark.value); router.push({ path: 'lecturer', query: { lecturer_id: id } }); } @@ -74,6 +77,7 @@ function toggleViewMode() { v-model:search-query="name" v-model:subject="subject" v-model:order="order" + v-model:mark="mark" :is-admin="userAdmin" :ascending="ascending" :page="page" diff --git a/src/store/lecturerStore.ts b/src/store/lecturerStore.ts index bbc3d4c..c5ac449 100644 --- a/src/store/lecturerStore.ts +++ b/src/store/lecturerStore.ts @@ -12,6 +12,7 @@ interface FetchLecturersParams { subject?: string; orderBy?: Order; ascending?: boolean; + mark?: string; } export const useLecturerStore = defineStore('lecturer', () => { @@ -23,16 +24,23 @@ export const useLecturerStore = defineStore('lecturer', () => { // Actions async function fetchLecturers(params: FetchLecturersParams) { const offset = (params.page - 1) * params.itemsPerPage; + + // Создаем объект параметров запроса + const queryParams: Record = { + limit: params.itemsPerPage, + offset, + info: ['comments'], + order_by: `${params.ascending ? '+' : '-'}${params.orderBy ?? 'mark_general'}`, + }; + + // Добавляем опциональные параметры + if (params.name) queryParams.name = params.name; + if (params.subject) queryParams.subject = params.subject; + if (params.mark) queryParams.mark = params.mark; + const res = await apiClient.GET('/rating/lecturer', { params: { - query: { - limit: params.itemsPerPage, - name: params.name, - offset, - info: ['comments'], - subject: params.subject, - order_by: `${params.ascending ? '+' : '-'}${params.orderBy ?? 'mark_general'}`, - }, + query: queryParams, }, }); diff --git a/src/store/searchStore.ts b/src/store/searchStore.ts index a10fd0d..865acad 100644 --- a/src/store/searchStore.ts +++ b/src/store/searchStore.ts @@ -8,17 +8,33 @@ export const useSearchStore = defineStore('search', () => { const order = ref('по общей оценке'); const ascending = ref(false); const page = ref(1); + const mark = ref(''); const getParams = () => { - return name.value, subject.value, order.value, ascending.value, page.value; + return { + name: name.value, + subject: subject.value, + order: order.value, + ascending: ascending.value, + page: page.value, + mark: mark.value, + }; }; - const setParams = (oldName: string, oldSubject: Subject, oldOrder: string, oldAsc: boolean, oldPage: number) => { + const setParams = ( + oldName: string, + oldSubject: Subject, + oldOrder: string, + oldAsc: boolean, + oldPage: number, + oldMark?: string, + ) => { name.value = oldName; subject.value = oldSubject; order.value = oldOrder; ascending.value = oldAsc; page.value = oldPage; + mark.value = oldMark || ''; }; return { @@ -27,6 +43,7 @@ export const useSearchStore = defineStore('search', () => { order, ascending, page, + mark, getParams, setParams,