generated from Flycro/laravel-nuxt
feat: Vote Functionality
parent
1d7f41e812
commit
e393ba5943
|
|
@ -3,6 +3,7 @@
|
||||||
namespace App\Http\Controllers;
|
namespace App\Http\Controllers;
|
||||||
|
|
||||||
use App\Models\BookRecommendation;
|
use App\Models\BookRecommendation;
|
||||||
|
use App\Models\User;
|
||||||
use App\Models\Vote;
|
use App\Models\Vote;
|
||||||
use Illuminate\Http\Request;
|
use Illuminate\Http\Request;
|
||||||
|
|
||||||
|
|
@ -29,4 +30,22 @@ class VoteController extends Controller
|
||||||
|
|
||||||
return response()->json(['message' => 'No remaining votes.'], 403);
|
return response()->json(['message' => 'No remaining votes.'], 403);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function addTotalVotesAll(Request $request)
|
||||||
|
{
|
||||||
|
$request->validate([
|
||||||
|
'total_votes' => 'required|integer|min:1',
|
||||||
|
]);
|
||||||
|
|
||||||
|
if (!(auth()->user()->hasRole('admin')) ) {
|
||||||
|
return response()->json(['message' => 'Keine Berechtigung.'], 403);
|
||||||
|
}
|
||||||
|
|
||||||
|
$users = User::all();
|
||||||
|
foreach ($users as $user) {
|
||||||
|
$user->increment('total_votes', $request->total_votes);
|
||||||
|
}
|
||||||
|
|
||||||
|
return response()->json(['message' => 'Total votes added to all book recommendations.']);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,48 @@
|
||||||
|
<script setup lang="ts">
|
||||||
|
const isOpen = ref(false)
|
||||||
|
|
||||||
|
const state = reactive({
|
||||||
|
total_votes: 2,
|
||||||
|
})
|
||||||
|
|
||||||
|
const { refresh: onClick, status } = useFetch<any>(`admin/add-total-votes-all`, {
|
||||||
|
method: 'POST',
|
||||||
|
body: state,
|
||||||
|
immediate: false,
|
||||||
|
watch: false,
|
||||||
|
async onResponse({ response }) {
|
||||||
|
if (response.ok) {
|
||||||
|
useToast().add({
|
||||||
|
icon: 'i-heroicons-check-circle-20-solid',
|
||||||
|
title: 'Es wurden allen Nutzern 2 Votes hinzugefügt.',
|
||||||
|
color: 'emerald',
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
isOpen.value = false
|
||||||
|
},
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<UButton icon="i-heroicons-star" solid label="Nutzern Votes hinzufügen" @click="isOpen = true" />
|
||||||
|
<UDashboardModal
|
||||||
|
v-model="isOpen"
|
||||||
|
title="Votes hinzufügen"
|
||||||
|
description="Bist du dir sicher das du jedem Benutzer 2 Votes geben möchtest?"
|
||||||
|
icon="i-heroicons-star"
|
||||||
|
:ui="{
|
||||||
|
icon: { base: 'text-primary dark:text-primary-400' } as any,
|
||||||
|
footer: { base: 'ml-16' } as any,
|
||||||
|
}"
|
||||||
|
>
|
||||||
|
<template #footer>
|
||||||
|
<UButton color="primary" label="Bestätigen" :loading="status === 'pending'" @click="onClick" />
|
||||||
|
<UButton color="white" label="Abbrechen" @click="isOpen = false" />
|
||||||
|
</template>
|
||||||
|
</UDashboardModal>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
|
||||||
|
</style>
|
||||||
|
|
@ -1,10 +1,12 @@
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
|
import type { BookRecommendationStatusEnum } from '~/stores/book-recommendations'
|
||||||
import { useBookRecommendationStore } from '~/stores/book-recommendations'
|
import { useBookRecommendationStore } from '~/stores/book-recommendations'
|
||||||
|
|
||||||
const props = defineProps<{
|
const props = defineProps<{
|
||||||
row: {
|
row: {
|
||||||
id: number
|
id: number
|
||||||
book_name: string
|
book_name: string
|
||||||
|
status: BookRecommendationStatusEnum
|
||||||
}
|
}
|
||||||
}>()
|
}>()
|
||||||
|
|
||||||
|
|
@ -16,6 +18,10 @@ const state = reactive({
|
||||||
book_recommendation_id: props.row.id,
|
book_recommendation_id: props.row.id,
|
||||||
})
|
})
|
||||||
|
|
||||||
|
watch(() => props.row, (newRow) => {
|
||||||
|
state.book_recommendation_id = newRow.id
|
||||||
|
})
|
||||||
|
|
||||||
const bookRecommendationStore = useBookRecommendationStore()
|
const bookRecommendationStore = useBookRecommendationStore()
|
||||||
|
|
||||||
const { refresh: onVote, status } = useFetch<any>(`vote`, {
|
const { refresh: onVote, status } = useFetch<any>(`vote`, {
|
||||||
|
|
@ -39,14 +45,14 @@ const { refresh: onVote, status } = useFetch<any>(`vote`, {
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<UButton icon="i-heroicons-star" size="sm" color="green" variant="solid" square :disabled="authStore.user.total_votes === 0" @click="isOpen = true" />
|
<UButton v-if="props.row.status === 'PENDING'" class="transition-150 transform-gpu hover:scale-110" icon="i-heroicons-star" size="sm" color="green" variant="solid" square :disabled="authStore.user.total_votes === 0" @click="isOpen = true" />
|
||||||
<UDashboardModal
|
<UDashboardModal
|
||||||
v-model="isOpen"
|
v-model="isOpen"
|
||||||
title="Buch Empfehlung löschen"
|
title="Für Buch abstimmen"
|
||||||
:description="`Bist du dir sicher das du für die Buchempfehlung ${row.book_name} abstimmen möchtest?`"
|
:description="`Bist du dir sicher das du für die Buchempfehlung "${row.book_name}" abstimmen möchtest?`"
|
||||||
icon="i-heroicons-star"
|
icon="i-heroicons-star"
|
||||||
:ui="{
|
:ui="{
|
||||||
icon: { base: 'text-green-500 dark:text-green-400' } as any,
|
icon: { base: 'text-primary-500 dark:text-primary-400' } as any,
|
||||||
footer: { base: 'ml-16' } as any,
|
footer: { base: 'ml-16' } as any,
|
||||||
}"
|
}"
|
||||||
>
|
>
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue