Admin login

This commit is contained in:
Christoph Stahl 2022-11-25 10:23:31 +01:00
parent b6ba58e370
commit 3ff710e52b
8 changed files with 54 additions and 43 deletions

View file

@ -2,6 +2,7 @@
import { computed, ref, onMounted, onDeactivated } from 'vue' import { computed, ref, onMounted, onDeactivated } from 'vue'
import { io } from "socket.io-client" import { io } from "socket.io-client"
import { useRoute, useRouter } from 'vue-router' import { useRoute, useRouter } from 'vue-router'
import $ from 'jquery'
import MobileLayout from './components/MobileLayout.vue' import MobileLayout from './components/MobileLayout.vue'
import DesktopLayout from './components/DesktopLayout.vue' import DesktopLayout from './components/DesktopLayout.vue'
@ -17,21 +18,20 @@ const state = ref({
'joined': false, 'joined': false,
'server': window.location.protocol + "//" + window.location.host + "/", 'server': window.location.protocol + "//" + window.location.host + "/",
'socket': undefined, 'socket': undefined,
'is_small': window.innerWidth < 768 'is_small': window.innerWidth < 768,
'admin': false,
'secret': undefined
}) })
onMounted(() => { window.addEventListener("resize", (e) => { state.value.is_small = (e.target.innerWidth < 768) }) } ) onMounted(() => {
window.addEventListener("resize", (e) => { state.value.is_small = (e.target.innerWidth < 768) });
$(document).foundation();
})
function setRoomCode(room) { state.value.room = room } function setRoomCode(room) { state.value.room = room }
function setSecret(secret) { state.value.secret = secret }
function setName(name) { state.value.name = name } function setName(name) { state.value.name = name }
function updateName(evt) { function updateName(evt) { evt.target.textContent = state.value.name;}
if(evt.target.textContent !== "") {
console.log("Changed name to \"" + evt.target.textContent + "\"");
state.value.name = evt.target.textContent
} else {
evt.target.textContent = state.value.name;
}
}
function setServer(server) { state.value.server = server } function setServer(server) { state.value.server = server }
function setSearchTerm(searchTerm) { state.value.search.searchTerm = searchTerm } function setSearchTerm(searchTerm) { state.value.search.searchTerm = searchTerm }
@ -39,18 +39,18 @@ function search() {
state.socket.emit("search", {"query": state.value.search.searchTerm }) state.socket.emit("search", {"query": state.value.search.searchTerm })
} }
function append(entry) { function append(entry) {_append(entry, state.value.name) }
function _append(entry, name) {
if(name == "" || name == undefined) {
$("#getusername").foundation("open")
} else {
state.socket.emit("append", {"id": entry.id, "performer": state.value.name, "source": entry.source }) state.socket.emit("append", {"id": entry.id, "performer": state.value.name, "source": entry.source })
}
} }
function connect() { function connect() {
if(state.value.name !== undefined && state.value.name !== "") {
state.socket = io(state.value.server) state.socket = io(state.value.server)
console.log(state.socket)
registerSocketEvents(state.socket) registerSocketEvents(state.socket)
} else {
console.log("name cannot be " + state.value.name)
}
} }
function registerSocketEvents(socket) { function registerSocketEvents(socket) {
@ -64,6 +64,10 @@ function registerSocketEvents(socket) {
state.value.queue=val.queue state.value.queue=val.queue
state.value.recent=val.recent state.value.recent=val.recent
}) })
socket.on("register-admin", (response) => {
state.value.admin = response.success
})
} }
function joinRoom() { function joinRoom() {
@ -71,6 +75,9 @@ function joinRoom() {
if(response === true) { if(response === true) {
state.value.joined = true state.value.joined = true
router.push({name: "room", params: {room: state.value.room}}) router.push({name: "room", params: {room: state.value.room}})
if (state.value.secret) {
state.socket.emit("register-admin", {"secret": state.value.secret})
}
} else { } else {
console.log("no such room") console.log("no such room")
} }
@ -86,10 +93,13 @@ function joinRoom() {
<div class="row" id="main-content"> <div class="row" id="main-content">
<MobileLayout v-show="state.is_small" :state="state" @update:searchTerm="setSearchTerm" @search="search" @append="append" /> <MobileLayout v-show="state.is_small" :state="state" @update:searchTerm="setSearchTerm" @search="search" @append="append" />
<DesktopLayout v-show="!state.is_small" :state="state" @update:searchTerm="setSearchTerm" @search="search" @append="append" /> <DesktopLayout v-show="!state.is_small" :state="state" @update:searchTerm="setSearchTerm" @search="search" @append="append" />
<WelcomeReveal v-if="!state.joined" :room="state.room" :server="state.server" @connect="connect" @update:room="setRoomCode" @update:name="setName" @update:server="setServer" /> <WelcomeReveal v-if="!state.joined" :room="state.room" :server="state.server" @connect="connect" @update:room="setRoomCode" @update:name="setName" @update:server="setServer" @update:secret="setSecret" />
<div class="reveal" id="getusername" data-reveal data-close-on-click="false" >
Test123
</div>
</div> </div>
<footer> <footer>
Name: <span class="userName" @focusout="updateName" contenteditable>{{ state.name }}</span> Name: <span class="userName" @focusout="(evt) => setName(evt.target.textContent)" contenteditable>{{ state.name }}</span>
</footer> </footer>
</div> </div>
</template> </template>
@ -113,6 +123,10 @@ footer > .userName {
border: none; border: none;
border-bottom: 1px dashed #00F000; border-bottom: 1px dashed #00F000;
background-color: #008000; background-color: #008000;
min-width: 5em;
display: inline-block;
height: 70%;
text-align: center;
} }
</style> </style>

View file

@ -11,7 +11,7 @@ const emit = defineEmits(['update:searchTerm', 'search', 'append'])
<template> <template>
<div class="splitter"> <div class="splitter">
<SearchDesktop :search="state.search" @update:searchTerm="(val) => $emit('update:searchTerm', val)" @search="$emit('search')" @append="(entry) => $emit('append', entry)" /> <SearchDesktop :search="state.search" @update:searchTerm="(val) => $emit('update:searchTerm', val)" @search="$emit('search')" @append="(entry) => $emit('append', entry)" />
<QueueDesktop :queue="state.queue" /> <QueueDesktop :queue="state.queue" :admin="state.admin" />
<RecentDesktop :recent="state.recent" /> <RecentDesktop :recent="state.recent" :admin="state.admin" />
</div> </div>
</template> </template>

View file

@ -19,8 +19,8 @@ const emit = defineEmits(['update:searchTerm', 'search', 'append' ])
</div> </div>
<div class="tabs-container" data-tabs-content="main-tab"> <div class="tabs-container" data-tabs-content="main-tab">
<SearchTab :search="state.search" @update:searchTerm="(val) => $emit('update:searchTerm', val)" @search="$emit('search')" @append="(entry) => $emit('append', entry)"/> <SearchTab :search="state.search" @update:searchTerm="(val) => $emit('update:searchTerm', val)" @search="$emit('search')" @append="(entry) => $emit('append', entry)"/>
<QueueTab :queue="state.queue" /> <QueueTab :queue="state.queue" :admin="state.admin" />
<RecentTab :recent="state.recent" /> <RecentTab :recent="state.recent" :admin="state.admin" />
</div> </div>
</div> </div>
</div> </div>

View file

@ -1,12 +1,12 @@
<script setup> <script setup>
import QueueInner from './QueueInner.vue' import QueueInner from './QueueInner.vue'
const props = defineProps(['queue']); const props = defineProps(['queue', 'admin']);
</script> </script>
<template> <template>
<div class="comp-column" id="middle"> <div class="comp-column" id="middle">
<div class="header">Queue</div> <div class="header">Queue</div>
<QueueInner :queue="queue" /> <QueueInner :queue="queue" :admin="admin" />
</div> </div>
</template> </template>

View file

@ -1,11 +1,7 @@
<script setup> <script setup>
import Entry from './Entry.vue' import Entry from './Entry.vue'
</script>
<script> const props = defineProps(['queue', 'admin']);
export default {
props: ['admin', 'queue']
}
</script> </script>
<template> <template>
@ -13,7 +9,7 @@ export default {
<div id="queue-list-wrapper" class="results"> <div id="queue-list-wrapper" class="results">
<ul id="queue" class="vertical menu"> <ul id="queue" class="vertical menu">
<Entry v-for="(entry, index) in queue" :entry="entry" :current="index == 0" :admin="admin" /> <Entry v-for="(entry, index) in queue" :entry="entry" :current="index == 0" :admin="admin" />
<li v-if="admin"> <li v-show="admin">
<div class="row"> <div class="row">
<div class="columns small-12"> <div class="columns small-12">
<a class="button" download="queue.json" rv-href="queue.data">Save</a> <a class="button" download="queue.json" rv-href="queue.data">Save</a>

View file

@ -1,15 +1,11 @@
<script setup> <script setup>
import QueueInner from './QueueInner.vue' import QueueInner from './QueueInner.vue'
</script>
<script> const props = defineProps(['queue', 'admin']);
export default {
props: ['queue']
}
</script> </script>
<template> <template>
<div class="tabs-panel" id="queue-list"> <div class="tabs-panel" id="queue-list">
<QueueInner :queue="queue" /> <QueueInner :queue="queue" :admin="admin" />
</div> </div>
</template> </template>

View file

@ -1,7 +1,7 @@
<script setup> <script setup>
import RecentInner from './RecentInner.vue' import RecentInner from './RecentInner.vue'
const props = defineProps(['recent']) const props = defineProps(['recent', 'admin'])
</script> </script>
<template> <template>
<div class="comp-column" id="right-side"> <div class="comp-column" id="right-side">

View file

@ -2,7 +2,7 @@
import { onMounted, onBeforeUnmount } from 'vue' import { onMounted, onBeforeUnmount } from 'vue'
import $ from 'jquery' import $ from 'jquery'
const emits = defineEmits(['connect', 'update:room', 'update:name', 'update:server']) const emits = defineEmits(['connect', 'update:room', 'update:name', 'update:server', 'update:secret'])
const props = defineProps(['room', 'server']) const props = defineProps(['room', 'server'])
onMounted(() => { onMounted(() => {
@ -23,11 +23,16 @@ onBeforeUnmount(() => {
<div class="grid-container"> <div class="grid-container">
<div class="grid-x grid-padding-x"> <div class="grid-x grid-padding-x">
<div class="medium-12 cell"> <div class="medium-6 cell">
<label>Syng server <label>Syng server
<input type="text" :value="server" @input="$emit('update:server', $event.target.value)"> <input type="text" :value="server" @input="$emit('update:server', $event.target.value)">
</label> </label>
</div> </div>
<div class="medium-6 cell">
<label>Admin password
<input type="password" @input="$emit('update:secret', $event.target.value)" placeholder="Leave free, if not admin">
</label>
</div>
<div class="medium-6 cell"> <div class="medium-6 cell">
<label>Room code <label>Room code
<input type="text" :value="room" @input="$emit('update:room', $event.target.value)" placeholder="ABCD"> <input type="text" :value="room" @input="$emit('update:room', $event.target.value)" placeholder="ABCD">
@ -35,7 +40,7 @@ onBeforeUnmount(() => {
</div> </div>
<div class="medium-6 cell"> <div class="medium-6 cell">
<label>Name <label>Name
<input type="text" @input="$emit('update:name', $event.target.value)" placeholder="Leave empty to be asked on append"> <input type="text" @input="$emit('update:name', $event.target.value)" placeholder="Arno Nym">
</label> </label>
</div> </div>
</div> </div>