generated from VLADIMIR/template_frontend
up
This commit is contained in:
@@ -31,6 +31,7 @@ import type {
|
||||
ScreenState,
|
||||
Team,
|
||||
TeamAnswers,
|
||||
Ticket,
|
||||
} from '@/api/generated/crabs/evening_detective_server'
|
||||
import { getURL } from '@/api/generated/crabs/evening_detective_server/client'
|
||||
import HeaderMenu from '@/components/HeaderMenu.vue'
|
||||
@@ -59,6 +60,10 @@ const deletedGameName = ref('')
|
||||
const showQR = ref(false)
|
||||
const urlQR = ref('')
|
||||
const titleQR = ref('')
|
||||
const showIssueTicketsModal = ref(false)
|
||||
const ticketCount = ref(1)
|
||||
const issuedTickets = ref<Ticket[]>([])
|
||||
const isIssuingTickets = ref(false)
|
||||
|
||||
const game = ref<Game>({
|
||||
id: undefined,
|
||||
@@ -461,6 +466,33 @@ async function openQR(url: string, text: string) {
|
||||
showQR.value = true
|
||||
}
|
||||
|
||||
function openIssueTickets() {
|
||||
ticketCount.value = 1
|
||||
issuedTickets.value = []
|
||||
showIssueTicketsModal.value = true
|
||||
}
|
||||
|
||||
async function issueTickets() {
|
||||
if (isIssuingTickets.value || !game.value.id) return
|
||||
isIssuingTickets.value = true
|
||||
try {
|
||||
const res = await client.IssueGameTickets({
|
||||
gameId: game.value.id,
|
||||
count: ticketCount.value,
|
||||
})
|
||||
if (res.error != '') {
|
||||
message.error(res.error!)
|
||||
return
|
||||
}
|
||||
issuedTickets.value = res.tickets || []
|
||||
message.success(`Выпущено билетов: ${issuedTickets.value.length}`)
|
||||
} catch (err) {
|
||||
message.error(err instanceof Error ? err.message : 'Не удалось выпустить билеты')
|
||||
} finally {
|
||||
isIssuingTickets.value = false
|
||||
}
|
||||
}
|
||||
|
||||
useSimplePolling(() => {
|
||||
getGame(Number(gameId))
|
||||
getGameScreens()
|
||||
@@ -666,6 +698,7 @@ useSimplePolling(() => {
|
||||
|
||||
<n-flex justify="end">
|
||||
<n-button quaternary @click="openQR(url, 'Админка')"> QR </n-button>
|
||||
<n-button quaternary @click="openIssueTickets()"> Выпустить билеты </n-button>
|
||||
<n-button quaternary @click="openAnswersModal()"> Ответы команд </n-button>
|
||||
<n-button v-if="game.status == 'finish'" quaternary @click="toResults()">
|
||||
<Icon class="settings-icon">
|
||||
@@ -1160,6 +1193,39 @@ useSimplePolling(() => {
|
||||
</n-modal>
|
||||
|
||||
<!-- Окно qr -->
|
||||
<n-modal v-model:show="showIssueTicketsModal">
|
||||
<n-card
|
||||
style="width: min(94vw, 700px)"
|
||||
title="Выпуск билетов"
|
||||
:bordered="false"
|
||||
size="huge"
|
||||
role="dialog"
|
||||
aria-modal="true"
|
||||
>
|
||||
<template #header-extra>
|
||||
<n-button @click="showIssueTicketsModal = false"> x </n-button>
|
||||
</template>
|
||||
<n-space vertical>
|
||||
<n-input-number v-model:value="ticketCount" :min="1" :max="100" />
|
||||
<n-button
|
||||
type="primary"
|
||||
:loading="isIssuingTickets"
|
||||
:disabled="isIssuingTickets"
|
||||
@click="issueTickets()"
|
||||
>
|
||||
Выпустить
|
||||
</n-button>
|
||||
<div v-for="ticket in issuedTickets" :key="ticket.id" class="issued-ticket">
|
||||
<div>Билет №{{ ticket.id }}</div>
|
||||
<a :href="ticket.url" target="_blank" rel="noreferrer">Открыть страницу билета</a>
|
||||
<n-button size="small" @click="openQR(ticket.url!, `Билет №${ticket.id}`)">
|
||||
Показать QR
|
||||
</n-button>
|
||||
</div>
|
||||
</n-space>
|
||||
</n-card>
|
||||
</n-modal>
|
||||
|
||||
<n-modal v-model:show="showQR">
|
||||
<n-card
|
||||
style="width: 600px"
|
||||
@@ -1555,4 +1621,13 @@ useSimplePolling(() => {
|
||||
.map-hidden-items {
|
||||
margin-top: 10px;
|
||||
}
|
||||
|
||||
.issued-ticket {
|
||||
align-items: center;
|
||||
border-top: 1px solid #777;
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
gap: 10px;
|
||||
padding-top: 10px;
|
||||
}
|
||||
</style>
|
||||
|
||||
Reference in New Issue
Block a user