generated from Flycro/laravel-nuxt
Compare commits
8 Commits
5534f00a7d
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| cae791ae27 | |||
| ee3d211af1 | |||
| 779bc7d91f | |||
| 53628a319e | |||
| ec92f4bd5d | |||
| 4c57faef52 | |||
| f9c83d6459 | |||
| 91592b06d7 |
@@ -23,6 +23,7 @@ steps:
|
|||||||
- docker compose exec php php artisan migrate --force
|
- docker compose exec php php artisan migrate --force
|
||||||
- docker compose exec php php artisan optimize
|
- docker compose exec php php artisan optimize
|
||||||
- docker compose exec php php artisan storage:link
|
- docker compose exec php php artisan storage:link
|
||||||
|
- git config --global --add safe.directory /var/www/html/bookstack.octolabs.net
|
||||||
- npx nuxi cleanup
|
- npx nuxi cleanup
|
||||||
- pnpm run build
|
- pnpm run build
|
||||||
- find /var/www/html/bookstack.octolabs.net -type f -exec chmod 664 {} \\;
|
- find /var/www/html/bookstack.octolabs.net -type f -exec chmod 664 {} \\;
|
||||||
|
|||||||
@@ -1,18 +1,27 @@
|
|||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
|
import party from 'party-js'
|
||||||
|
|
||||||
const config = useRuntimeConfig()
|
const config = useRuntimeConfig()
|
||||||
|
|
||||||
|
function confirmDeadline(event) {
|
||||||
|
party.confetti(event)
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<div>
|
<div>
|
||||||
<UDivider />
|
<UDivider />
|
||||||
<UFooter c>
|
<UFooter>
|
||||||
<template #left>
|
<template #left>
|
||||||
|
<div class="flex items-center gap-4">
|
||||||
|
<!-- <OctolabsLogo class="fill-primary rotate-45" width="36" /> -->
|
||||||
<div class="text-xs">
|
<div class="text-xs">
|
||||||
Copyright © {{ new Date().getFullYear() }}
|
Copyright © {{ new Date().getFullYear() }}
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<template #center>
|
<template #center>
|
||||||
Made with ❤️ by <a class="text-primary hover:text-primary-600 ml-1" href="https://flycro.me" target="_blank">Flycro</a>
|
Made with <span class="cursor-pointer transition duration-500 hover:scale-125 hover:animate-pulse" @click="confirmDeadline">❤️</span> by <a class="text-primary hover:text-primary-600 ml-1" href="https://flycro.me" target="_blank">Flycro</a>
|
||||||
</template>
|
</template>
|
||||||
<template #right>
|
<template #right>
|
||||||
<div class="font-mono text-xs">
|
<div class="font-mono text-xs">
|
||||||
|
|||||||
31
nuxt/components/OctolabsLogo.vue
Normal file
31
nuxt/components/OctolabsLogo.vue
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
<script setup lang="ts">
|
||||||
|
import { twMerge } from 'tailwind-merge'
|
||||||
|
|
||||||
|
const props = defineProps<{
|
||||||
|
width?: string
|
||||||
|
height?: string
|
||||||
|
class?: string
|
||||||
|
}>()
|
||||||
|
|
||||||
|
const cssClasses = computed(() => {
|
||||||
|
return twMerge([
|
||||||
|
'fill-current',
|
||||||
|
props.class,
|
||||||
|
])
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" :class="cssClasses" :width="props.width" :height="props.height" viewBox="0 0 101.27 145.9">
|
||||||
|
<g id="Ebene_2" data-name="Ebene 2">
|
||||||
|
<g id="Ebene_8" data-name="Ebene 8">
|
||||||
|
<path d="M50.63 0C22.67 0 0 21.46 0 47.93 0 61.85 6.69 76.49 19.35 85a69.67 69.67 0 0 0 21.59 10c6.49 1.62 13.4 1.7 19.38 1.7 28 0 40.95-22.34 40.95-48.81S78.6 0 50.63 0Zm15.18 65.91c-5.46 5.24-13.51 7.59-20.51 5.71a20.29 20.29 0 0 1-14.43-14.47c-1.49-5.43-.48-12.33 2.88-16.9 2.45-3.34 4.76-6 8.51-8a20.24 20.24 0 0 1 15-2 24.4 24.4 0 0 1 6.67 3.14 22.12 22.12 0 0 1 2.48 2.15 23.32 23.32 0 0 1 6.26 14.76c.07 8.44-5.17 13.98-6.86 15.61Z" class="cls-1" />
|
||||||
|
<path d="M57.8 49.89c.67-2.92-.89-5.08-3.49-6.15-3.13-1.3-7 .07-9.14 2.5A8.35 8.35 0 0 0 45 57.1c4.53 5.9 14 3.39 15.73-3.68 1.79-7.42-6.38-14.55-13.25-10.23-3.17 2-5.39 7.23-4.11 10.8s5.45 4.43 9.14 3.94c4.58-.62 7.51-5.9 5.11-10M19.62 74.51c-4.41 4-7.87 9.7-6.41 15.89 1.59 6.71 7.23 11.22 5.08 18.75-1.83 6.42-8.36 10-10.34 16.38-1.54 5-.45 9.84 3.78 13 3.1 2.31 6.1-2.9 3-5.18-5.27-3.92 2.69-11.66 5-14.57A21.51 21.51 0 0 0 24.72 107a21 21 0 0 0-2.8-12C20.58 92.51 19 90.3 19 87.43c0-3.62 2.32-6.35 4.87-8.68 2.86-2.61-1.39-6.84-4.24-4.24ZM55.6 88c-9.62 2.3-11.4 12.24-7 20 3 5.23 7.65 11.16 5.78 17.61-1.37 4.72-5.26 7.5-5.63 12.71-.27 3.85 5.73 3.83 6 0s3.7-6.47 5-9.88a18.49 18.49 0 0 0 0-11.76c-1.83-6.1-14.25-20.06-2.57-22.86 3.75-.89 2.16-6.68-1.6-5.78ZM78.89 84.18c10 4.89.34 21.37 1.44 29.69.56 4.26 2.72 7.27 5.31 10.55 4.11 5.2 5.53 10.92 2 17-1.93 3.35 3.26 6.38 5.18 3a20 20 0 0 0 1.93-16.37c-2.06-6.19-8.63-9.79-8.63-16.72 0-10.37 9-25.92-4.23-32.35-3.46-1.69-6.51 3.48-3 5.18Z" class="cls-1" />
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
|
||||||
|
</style>
|
||||||
@@ -71,6 +71,18 @@ function resolveStatus(status: string) {
|
|||||||
return bookRecommendationStore.statusOptions.find(option => option.value === status)
|
return bookRecommendationStore.statusOptions.find(option => option.value === status)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const rows = computed(() => {
|
||||||
|
// return all bookRecommendationStore.recommendations but add actions
|
||||||
|
return bookRecommendationStore.recommendations.map((recommendation) => {
|
||||||
|
return {
|
||||||
|
...recommendation,
|
||||||
|
actions: {
|
||||||
|
class: '!max-w-96',
|
||||||
|
},
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
$echo.private(`BookRecommendation`)
|
$echo.private(`BookRecommendation`)
|
||||||
.listen('.BookRecommendationUpdated', (e) => {
|
.listen('.BookRecommendationUpdated', (e) => {
|
||||||
@@ -86,7 +98,6 @@ onMounted(() => {
|
|||||||
|
|
||||||
$echo.private(`Vote`)
|
$echo.private(`Vote`)
|
||||||
.listen('.VoteCreated', (e) => {
|
.listen('.VoteCreated', (e) => {
|
||||||
console.log(e)
|
|
||||||
bookRecommendationStore.createVoteWS(e.vote)
|
bookRecommendationStore.createVoteWS(e.vote)
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
@@ -95,18 +106,13 @@ onMounted(() => {
|
|||||||
<template>
|
<template>
|
||||||
<div>
|
<div>
|
||||||
<NewBookRecommendation />
|
<NewBookRecommendation />
|
||||||
<UTable :sort="sort" :loading="bookRecommendationStore.fetchRecommendationsStatus === 'pending'" :columns="columns" :rows="bookRecommendationStore.recommendations">
|
<UTable :ui="{ td: { base: 'max-w-[0] truncate' } }" :sort="sort" :loading="bookRecommendationStore.fetchRecommendationsStatus === 'pending'" :columns="columns" :rows="rows">
|
||||||
<template #created_at-data="{ row }">
|
<template #created_at-data="{ row }">
|
||||||
<div>{{ dayjs(row.created_at).format('DD.MM.YYYY') }}</div>
|
<div>{{ dayjs(row.created_at).format('DD.MM.YYYY') }}</div>
|
||||||
</template>
|
</template>
|
||||||
<template #published_at-data="{ row }">
|
<template #published_at-data="{ row }">
|
||||||
<div>{{ dayjs(row.published_at).format('DD.MM.YYYY') }}</div>
|
<div>{{ dayjs(row.published_at).format('DD.MM.YYYY') }}</div>
|
||||||
</template>
|
</template>
|
||||||
<template #description-data="{ row }">
|
|
||||||
<div v-if="row.description">
|
|
||||||
{{ `${row.description.substring(0, 50)}...` }}
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
<template #votes-data="{ row }">
|
<template #votes-data="{ row }">
|
||||||
{{ row.votes.length }}
|
{{ row.votes.length }}
|
||||||
</template>
|
</template>
|
||||||
@@ -116,7 +122,7 @@ onMounted(() => {
|
|||||||
</UBadge>
|
</UBadge>
|
||||||
</template>
|
</template>
|
||||||
<template #actions-data="{ row }">
|
<template #actions-data="{ row }">
|
||||||
<div class="flex space-x-2">
|
<div class="flex max-w-full space-x-2">
|
||||||
<CastVote :row="row" />
|
<CastVote :row="row" />
|
||||||
<EditBookRecommendation :row="row" />
|
<EditBookRecommendation :row="row" />
|
||||||
<DeleteBookRecommendation :row="row" />
|
<DeleteBookRecommendation :row="row" />
|
||||||
|
|||||||
@@ -17,12 +17,12 @@ const dayjs = useDayjs()
|
|||||||
<div class="hidden w-1/5 md:block">
|
<div class="hidden w-1/5 md:block">
|
||||||
<img :src="$storage(props.book.cover_image)" :alt="props.book.book_name" class="rounded-lg">
|
<img :src="$storage(props.book.cover_image)" :alt="props.book.book_name" class="rounded-lg">
|
||||||
</div>
|
</div>
|
||||||
<div class="w-4/5 space-y-4">
|
<div class="w-full space-y-4 md:w-4/5">
|
||||||
<div class="space-y-2">
|
<div class="space-y-2">
|
||||||
<h1 class="font-sans text-3xl font-bold">
|
<h1 class="font-sans text-3xl font-bold">
|
||||||
{{ props.book.book_name }}
|
{{ props.book.book_name }}
|
||||||
</h1>
|
</h1>
|
||||||
<div class="flex justify-between">
|
<div class="flex flex-col flex-wrap gap-y-2 md:flex-row md:justify-between">
|
||||||
<div>
|
<div>
|
||||||
<UBadge>
|
<UBadge>
|
||||||
{{ props.book.author }}
|
{{ props.book.author }}
|
||||||
|
|||||||
@@ -13,8 +13,8 @@ async function runJobs(job: string) {
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<div class="flex gap-4">
|
<div class="flex flex-col gap-4 md:flex-row">
|
||||||
<UCard class="w-1/2">
|
<UCard class="w-full md:w-1/2">
|
||||||
<template #header>
|
<template #header>
|
||||||
<h1 class="font-sans text-3xl font-bold">
|
<h1 class="font-sans text-3xl font-bold">
|
||||||
Server Jobs
|
Server Jobs
|
||||||
@@ -24,7 +24,7 @@ async function runJobs(job: string) {
|
|||||||
</UButton>
|
</UButton>
|
||||||
</template>
|
</template>
|
||||||
</UCard>
|
</UCard>
|
||||||
<UCard class="w-1/2">
|
<UCard class="w-full md:w-1/2">
|
||||||
<template #header>
|
<template #header>
|
||||||
<h1 class="font-sans text-3xl font-bold">
|
<h1 class="font-sans text-3xl font-bold">
|
||||||
Server Logs
|
Server Logs
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ definePageMeta({ middleware: ['role-admin'] })
|
|||||||
|
|
||||||
<template>
|
<template>
|
||||||
<div>
|
<div>
|
||||||
<UCard class="w-1/2">
|
<UCard class="w-full md:w-1/2">
|
||||||
<template #header>
|
<template #header>
|
||||||
<h1 class="font-sans text-3xl font-bold">
|
<h1 class="font-sans text-3xl font-bold">
|
||||||
Benutzer Aktionen
|
Benutzer Aktionen
|
||||||
|
|||||||
@@ -65,9 +65,9 @@ async function handleMessage(event: { data: any }): Promise<void> {
|
|||||||
<div class="mx-auto flex min-h-screen w-full items-center justify-center">
|
<div class="mx-auto flex min-h-screen w-full items-center justify-center">
|
||||||
<UCard class="w-96">
|
<UCard class="w-96">
|
||||||
<template #header>
|
<template #header>
|
||||||
<h1 class="text-center text-2xl font-bold">
|
<div class="text-center text-4xl font-bold">
|
||||||
Login
|
<Logo />
|
||||||
</h1>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<UForm ref="form" :state="state" class="space-y-4" @submit="onSubmit">
|
<UForm ref="form" :state="state" class="space-y-4" @submit="onSubmit">
|
||||||
|
|||||||
Reference in New Issue
Block a user