TEST UPD
- add my points
This commit is contained in:
@@ -4,7 +4,6 @@
|
||||
</div>
|
||||
|
||||
<div v-else class="min-h-screen bg-gray-50">
|
||||
<!-- Хедер как в профиле -->
|
||||
<header class="sticky top-0 z-10 flex items-center justify-between border-b bg-surface-white px-5 py-3">
|
||||
<Breadcrumbs :items="breadcrumbs" />
|
||||
</header>
|
||||
@@ -13,39 +12,33 @@
|
||||
<h2 class="text-3xl font-bold text-gray-900 mb-8">Мои баллы</h2>
|
||||
|
||||
<!-- Загрузка -->
|
||||
<div v-if="logs.loading" class="text-center py-16">
|
||||
<p class="text-gray-600">Загружаем ваши баллы...</p>
|
||||
</div>
|
||||
|
||||
<!-- Ошибка -->
|
||||
<div v-else-if="logs.error" class="bg-red-50 border border-red-200 rounded-xl p-6">
|
||||
<p class="text-red-700">Ошибка загрузки баллов</p>
|
||||
<div v-if="energyPoints.loading" class="text-center py-16 text-gray-600">
|
||||
Загружаем баллы...
|
||||
</div>
|
||||
|
||||
<!-- Нет баллов -->
|
||||
<div v-else-if="pointLogs.length === 0" class="bg-white rounded-xl shadow p-12 text-center">
|
||||
<p class="text-xl text-gray-600">У вас пока нет баллов за активность</p>
|
||||
<p class="text-sm text-gray-500 mt-2">Участвуйте в мероприятиях — баллы скоро появятся!</p>
|
||||
<div v-else-if="!energyPoints.data?.length" class="bg-white rounded-xl shadow p-12 text-center">
|
||||
<p class="text-xl text-gray-600">У вас пока нет баллов</p>
|
||||
<p class="text-sm text-gray-500 mt-2">Участвуйте в активностях — баллы появятся!</p>
|
||||
</div>
|
||||
|
||||
<!-- Есть баллы -->
|
||||
<div v-else>
|
||||
<!-- Список начислений -->
|
||||
<div class="bg-white rounded-xl shadow overflow-hidden mb-8">
|
||||
<ul class="divide-y divide-gray-200">
|
||||
<li v-for="log in pointLogs" :key="log.name" class="p-6 hover:bg-gray-50 transition">
|
||||
<li v-for="item in energyPoints.data.slice(0, 20)" :key="item.name" class="p-6 hover:bg-gray-50">
|
||||
<div class="flex items-center justify-between">
|
||||
<div class="flex items-center gap-5">
|
||||
<div class="text-2xl font-bold"
|
||||
:class="log.points > 0 ? 'text-green-600' : 'text-red-600'">
|
||||
{{ log.points > 0 ? '+' : '' }}{{ log.points }}
|
||||
:class="item.points > 0 ? 'text-green-600' : 'text-red-600'">
|
||||
{{ item.points > 0 ? '+' : '' }}{{ item.points }}
|
||||
</div>
|
||||
<div>
|
||||
<p class="font-medium text-gray-900">
|
||||
{{ log.rule || 'Начисление баллов' }}
|
||||
{{ item.rule || 'Начисление баллов' }}
|
||||
</p>
|
||||
<p class="text-sm text-gray-500">
|
||||
{{ $format.date(log.creation, 'dd MMMM yyyy в HH:mm') }}
|
||||
{{ $format.date(item.creation, 'dd MMMM yyyy в HH:mm') }}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
@@ -54,17 +47,16 @@
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<!-- Итоговая карточка -->
|
||||
<!-- Итоги -->
|
||||
<div class="grid grid-cols-1 md:grid-cols-2 gap-6">
|
||||
<div class="bg-gradient-to-br from-indigo-500 to-purple-600 rounded-xl p-7 text-white shadow-xl">
|
||||
<p class="text-lg opacity-90">Всего заработано баллов</p>
|
||||
<p class="text-lg opacity-90">Всего баллов</p>
|
||||
<p class="text-5xl font-bold mt-3">{{ totalPoints }}</p>
|
||||
</div>
|
||||
|
||||
<div class="bg-gradient-to-br from-emerald-500 to-teal-600 rounded-xl p-7 text-white shadow-xl">
|
||||
<p class="text-lg opacity-90">Дополнительно к ЕГЭ при поступлении в МПГУ</p>
|
||||
<p class="text-5xl font-bold mt-3">+{{ extraAdmissionPoints }}</p>
|
||||
<p class="text-sm opacity-80 mt-3">максимум 10 баллов ({{ totalPoints }} ÷ 100)</p>
|
||||
<p class="text-lg opacity-90">Дополнительно при поступлении в МПГУ</p>
|
||||
<p class="text-5xl font-bold mt-3">+{{ additionalPoints }}</p>
|
||||
<p class="text-sm opacity-80 mt-3">максимум 10 баллов</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -74,47 +66,46 @@
|
||||
|
||||
<script setup>
|
||||
import { inject, computed, onMounted } from 'vue'
|
||||
import { createResource, Breadcrumbs, session } from 'frappe-ui'
|
||||
import { createResource, Breadcrumbs } from 'frappe-ui'
|
||||
import NoPermission from '@/components/NoPermission.vue'
|
||||
|
||||
const $user = inject('$user')
|
||||
|
||||
const logs = createResource({
|
||||
// Главное — фильтруем по email, как в LMS!
|
||||
const energyPoints = createResource({
|
||||
url: 'frappe.client.get_list',
|
||||
makeParams: () => ({
|
||||
params: {
|
||||
doctype: 'Energy Point Log',
|
||||
fields: ['name', 'points', 'rule', 'creation'],
|
||||
filters: [['user', '=', session.user]], // точно как в Jinja!
|
||||
filters: {
|
||||
user: $user.data.email // ← вот так, как в LMS — по email!
|
||||
},
|
||||
order_by: 'creation desc',
|
||||
limit_page_length: 0
|
||||
}),
|
||||
auto: true
|
||||
limit_page_length: 1000
|
||||
},
|
||||
auto: true,
|
||||
onSuccess(data) {
|
||||
console.log('Баллы загружены:', data.length, 'записей')
|
||||
}
|
||||
})
|
||||
|
||||
const pointLogs = computed(() => logs.data || [])
|
||||
|
||||
// Подсчёт итогов
|
||||
const totalPoints = computed(() => {
|
||||
return pointLogs.value.reduce((sum, log) => sum + (log.points || 0), 0)
|
||||
return energyPoints.data?.reduce((sum, item) => sum + (item.points || 0), 0) || 0
|
||||
})
|
||||
|
||||
const extraAdmissionPoints = computed(() => {
|
||||
const additionalPoints = computed(() => {
|
||||
const bonus = Math.floor(totalPoints.value / 100)
|
||||
return bonus < 10 ? bonus : 10
|
||||
})
|
||||
|
||||
// Хлебные крошки
|
||||
const breadcrumbs = computed(() => [
|
||||
{
|
||||
label: __('My Points'),
|
||||
route: { name: 'MyPoints' },
|
||||
},
|
||||
{ label: 'Главная', route: '/app' },
|
||||
{ label: 'Мои баллы' }
|
||||
])
|
||||
|
||||
// Перезагружаем при открытии (на всякий случай)
|
||||
onMounted(() => {
|
||||
if ($user.data) {
|
||||
logs.fetch()
|
||||
energyPoints.fetch()
|
||||
}
|
||||
})
|
||||
</script>
|
||||
|
||||
Reference in New Issue
Block a user