colored orders + ping sound
This commit is contained in:
@ -83,7 +83,7 @@ class OrderViewSet(viewsets.ModelViewSet):
|
|||||||
serializer_class = OrderSerializer
|
serializer_class = OrderSerializer
|
||||||
filter_backends = [DjangoFilterBackend, filters.OrderingFilter]
|
filter_backends = [DjangoFilterBackend, filters.OrderingFilter]
|
||||||
filterset_fields = ['waiter']
|
filterset_fields = ['waiter']
|
||||||
ordering = ['-updated_on']
|
ordering = ['-created_on']
|
||||||
|
|
||||||
def get_queryset(self):
|
def get_queryset(self):
|
||||||
five_minutes_ago = timezone.now() + datetime.timedelta(minutes=-5)
|
five_minutes_ago = timezone.now() + datetime.timedelta(minutes=-5)
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
import { fetcher } from '@/app/api/tools';
|
import { fetcher } from '@/app/api/tools';
|
||||||
import useSWR from 'swr';
|
import useSWR from 'swr';
|
||||||
import Link from 'next/link';
|
import Link from 'next/link';
|
||||||
|
import { useEffect, useRef, useState } from 'react';
|
||||||
|
|
||||||
type Order = {
|
type Order = {
|
||||||
id: number;
|
id: number;
|
||||||
@ -11,15 +12,44 @@ type Order = {
|
|||||||
waiter: number;
|
waiter: number;
|
||||||
waiter_name: string;
|
waiter_name: string;
|
||||||
data: [{ item: string; additional_info: string; finished: boolean }];
|
data: [{ item: string; additional_info: string; finished: boolean }];
|
||||||
status: string;
|
status: number;
|
||||||
status_name: string;
|
status_name: string;
|
||||||
};
|
};
|
||||||
|
|
||||||
export default function Home() {
|
export default function Home() {
|
||||||
|
const audioRef = useRef({} as HTMLAudioElement);
|
||||||
|
const [playedIDs, setPlayedIDs] = useState<number[]>([]);
|
||||||
|
|
||||||
const { data, mutate, error, isLoading } = useSWR(`/api/orders`, fetcher, {
|
const { data, mutate, error, isLoading } = useSWR(`/api/orders`, fetcher, {
|
||||||
refreshInterval: 1000,
|
refreshInterval: 1000,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const play = () => {
|
||||||
|
if (audioRef.current) {
|
||||||
|
audioRef.current.play();
|
||||||
|
} else {
|
||||||
|
// Throw error
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if (!data) return;
|
||||||
|
|
||||||
|
const justPlayed = (data as Order[])
|
||||||
|
.filter(
|
||||||
|
(o) =>
|
||||||
|
new Date(o.updated_on).getTime() - new Date(o.created_on).getTime() <
|
||||||
|
10000 && o.status == 1
|
||||||
|
)
|
||||||
|
.map((o) => o.id)
|
||||||
|
.filter((id) => !playedIDs.includes(id));
|
||||||
|
|
||||||
|
if (justPlayed.length > 0) {
|
||||||
|
play();
|
||||||
|
setPlayedIDs(playedIDs.concat(justPlayed));
|
||||||
|
}
|
||||||
|
}, [data]);
|
||||||
|
|
||||||
const update_finished = (o: number, i: number, v: boolean) => {
|
const update_finished = (o: number, i: number, v: boolean) => {
|
||||||
let d = data;
|
let d = data;
|
||||||
d[o].data[i].finished = v;
|
d[o].data[i].finished = v;
|
||||||
@ -51,10 +81,21 @@ export default function Home() {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
|
<audio ref={audioRef} src="/ping.wav"></audio>
|
||||||
<p className="text-4xl">Zamówienia:</p>
|
<p className="text-4xl">Zamówienia:</p>
|
||||||
<ul className="max-w-screen-md w-full">
|
<ul className="max-w-screen-md w-full">
|
||||||
{data?.map((order: Order, oi: number) => (
|
{data?.map((order: Order, oi: number) => (
|
||||||
<li key={order.id} className="m-2 p-2 border-2 bg-gray-100">
|
<li
|
||||||
|
key={order.id}
|
||||||
|
className={`m-2 p-2 rounded-md border-2 ${
|
||||||
|
{
|
||||||
|
1: 'bg-red-200 border-red-400',
|
||||||
|
2: 'bg-purple-200 border-purple-400',
|
||||||
|
3: 'bg-green-200 border-green-400',
|
||||||
|
4: 'bg-gray-100 border-gray-400',
|
||||||
|
}[order.status]
|
||||||
|
}`}
|
||||||
|
>
|
||||||
<h1 className="text-xl">
|
<h1 className="text-xl">
|
||||||
<span className="font-mono">
|
<span className="font-mono">
|
||||||
{'['}
|
{'['}
|
||||||
@ -70,7 +111,7 @@ export default function Home() {
|
|||||||
onChange={(e) =>
|
onChange={(e) =>
|
||||||
update_status(oi, e.target.value as unknown as number)
|
update_status(oi, e.target.value as unknown as number)
|
||||||
}
|
}
|
||||||
className='form'
|
className="form border-2 border-gray-500"
|
||||||
>
|
>
|
||||||
<option value="1">Zamówienie złożone</option>
|
<option value="1">Zamówienie złożone</option>
|
||||||
<option value="2">Zamówienie w trakcie przygotowywania</option>
|
<option value="2">Zamówienie w trakcie przygotowywania</option>
|
||||||
@ -83,7 +124,7 @@ export default function Home() {
|
|||||||
{order.data.map((dish, i) => (
|
{order.data.map((dish, i) => (
|
||||||
<li
|
<li
|
||||||
key={dish.item}
|
key={dish.item}
|
||||||
className="p-2 m-2 flex gap-4 bg-gray-200 border-2 border-gray-400"
|
className={`p-2 m-2 flex gap-4 border-2 bg-white border-gray-400`}
|
||||||
>
|
>
|
||||||
<input
|
<input
|
||||||
type="checkbox"
|
type="checkbox"
|
||||||
|
@ -40,7 +40,17 @@ export default function Home() {
|
|||||||
status: string;
|
status: string;
|
||||||
status_name: string;
|
status_name: string;
|
||||||
}) => (
|
}) => (
|
||||||
<li key={order.id} className="m-2 p-2 border-2 bg-gray-100">
|
<li
|
||||||
|
key={order.id}
|
||||||
|
className={`m-2 p-2 rounded-md border-2 ${
|
||||||
|
{
|
||||||
|
1: 'bg-red-200 border-red-400',
|
||||||
|
2: 'bg-purple-200 border-purple-400',
|
||||||
|
3: 'bg-green-200 border-green-400',
|
||||||
|
4: 'bg-gray-100 border-gray-400',
|
||||||
|
}[order.status]
|
||||||
|
}`}
|
||||||
|
>
|
||||||
<h1 className="text-xl">
|
<h1 className="text-xl">
|
||||||
<span className="font-mono">
|
<span className="font-mono">
|
||||||
{'['}
|
{'['}
|
||||||
@ -56,7 +66,7 @@ export default function Home() {
|
|||||||
{order.data.map((dish) => (
|
{order.data.map((dish) => (
|
||||||
<li
|
<li
|
||||||
key={dish.item}
|
key={dish.item}
|
||||||
className="p-2 m-2 flex gap-4 bg-gray-200 border-2 border-gray-400"
|
className="p-2 m-2 flex gap-4 bg-white border-2 border-gray-400"
|
||||||
>
|
>
|
||||||
<input type="checkbox" checked={dish.finished} readOnly />
|
<input type="checkbox" checked={dish.finished} readOnly />
|
||||||
<div>
|
<div>
|
||||||
|
BIN
frontend/public/ping.wav
Normal file
BIN
frontend/public/ping.wav
Normal file
Binary file not shown.
@ -1,7 +1,7 @@
|
|||||||
import type { Config } from "tailwindcss";
|
import type { Config } from "tailwindcss";
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
darkMode: "class",
|
darkMode: "selector",
|
||||||
content: [
|
content: [
|
||||||
"./pages/**/*.{js,ts,jsx,tsx,mdx}",
|
"./pages/**/*.{js,ts,jsx,tsx,mdx}",
|
||||||
"./components/**/*.{js,ts,jsx,tsx,mdx}",
|
"./components/**/*.{js,ts,jsx,tsx,mdx}",
|
||||||
|
Reference in New Issue
Block a user