diff --git a/backend/database/Cupon.py b/backend/database/Cupon.py new file mode 100644 index 00000000..ad3e2b70 --- /dev/null +++ b/backend/database/Cupon.py @@ -0,0 +1,8 @@ +import sqlalchemy as sql +from web import sql_database as db + + +class Cupon(db.Model): + id = sql.Column(sql.Integer, primary_key=True) + name = sql.Column(sql.String(100), nullable=False, unique=True) + color = sql.Column(sql.String(7), nullable=False) \ No newline at end of file diff --git a/backend/database/CuponDrink.py b/backend/database/CuponDrink.py new file mode 100644 index 00000000..f78154e8 --- /dev/null +++ b/backend/database/CuponDrink.py @@ -0,0 +1,18 @@ +import sqlalchemy as sql +from web import sql_database as db +from sqlalchemy.orm import relationship + + +class CuponDrink(db.Model): + id = sql.Column(sql.Integer, primary_key=True) + cupon_id = sql.Column(sql.Integer, sql.ForeignKey( + 'cupon.id'), nullable=False) + cupon = relationship( + 'database.Cupon.Cupon', lazy="joined") + + drink_id = sql.Column(sql.Integer, sql.ForeignKey( + 'drink.id'), nullable=False) + drink = relationship( + 'database.Drink.Drink', lazy="joined") + + price = sql.Column(sql.Float, nullable=False) \ No newline at end of file diff --git a/frontend/package-lock.json b/frontend/package-lock.json index c73ade9e..f3f80a5a 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -1431,6 +1431,11 @@ "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.0.2.tgz", "integrity": "sha512-IkpVW/ehM1hWKln4fCA3NzJU8KwD+kIOvPZA4cqxoJHtE21CCzjyp+Kxbu0i5I4tBNOlXPL9mjwnWlL0VEG4Fg==" }, + "@ctrl/tinycolor": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-4.0.2.tgz", + "integrity": "sha512-fKQinXE9pJ83J1n+C3rDl2xNLJwfoYNvXLRy5cYZA9hBJJw2q+sbb/AOSNKmLxnTWyNTmy4994dueSwP4opi5g==" + }, "@emoji-mart/data": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@emoji-mart/data/-/data-1.1.2.tgz", @@ -10782,6 +10787,14 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, + "mui-color-input": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mui-color-input/-/mui-color-input-2.0.1.tgz", + "integrity": "sha512-NM7wuHccm8biSFP3WR66rVP0+jNovLnC8cyxGYd+T/BUeIZpXPN4DQcU9NpXNE3lSCi/9IaPdSQcsza2vTw6Mg==", + "requires": { + "@ctrl/tinycolor": "^4.0.2" + } + }, "multicast-dns": { "version": "7.2.5", "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", diff --git a/frontend/package.json b/frontend/package.json index ac216e55..f8821047 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -20,6 +20,7 @@ "date-fns": "^2.30.0", "emoji-mart": "^5.5.2", "js-cookie": "^3.0.5", + "mui-color-input": "^2.0.1", "react": "^18.2.0", "react-countup": "^6.5.0", "react-dom": "^18.2.0", diff --git a/frontend/src/Components/Admin/Cupons/AddCupon.tsx b/frontend/src/Components/Admin/Cupons/AddCupon.tsx new file mode 100644 index 00000000..f9212558 --- /dev/null +++ b/frontend/src/Components/Admin/Cupons/AddCupon.tsx @@ -0,0 +1,20 @@ +import { Stack, TextField, Typography } from '@mui/material' +import React, { useState } from 'react' +import style from './cupon.module.scss'; +import { MuiColorInput } from 'mui-color-input'; + +type Props = {} + +const AddCupon = (props: Props) => { + const [color, setcolor] = useState("#ffdd00") + return ( +
+ + + {setcolor(value)}} /> + +
+ ) +} + +export default AddCupon \ No newline at end of file diff --git a/frontend/src/Components/Admin/Cupons/CuponDisplay.tsx b/frontend/src/Components/Admin/Cupons/CuponDisplay.tsx new file mode 100644 index 00000000..8921f5f8 --- /dev/null +++ b/frontend/src/Components/Admin/Cupons/CuponDisplay.tsx @@ -0,0 +1,33 @@ +import { Button, Paper, Stack, Typography } from '@mui/material' +import React from 'react' +import style from './cupon.module.scss'; +import SellIcon from '@mui/icons-material/Sell'; +import Spacer from '../../Common/Spacer'; +import DeleteIcon from '@mui/icons-material/Delete'; +import EditIcon from '@mui/icons-material/Edit'; + +type Props = {} + +const CuponDisplay = (props: Props) => { + return ( + + + + + Rentner + + + + + + + + + ) +} + +export default CuponDisplay \ No newline at end of file diff --git a/frontend/src/Components/Admin/Cupons/Overview.tsx b/frontend/src/Components/Admin/Cupons/Overview.tsx new file mode 100644 index 00000000..38761ebe --- /dev/null +++ b/frontend/src/Components/Admin/Cupons/Overview.tsx @@ -0,0 +1,35 @@ +import React from 'react' +import CuponDisplay from './CuponDisplay' +import { Button, Stack, Typography } from '@mui/material' +import AddIcon from '@mui/icons-material/Add'; +import style from './cupon.module.scss'; +import Spacer from '../../Common/Spacer'; +import { useNavigate } from 'react-router-dom'; + +type Props = {} + +const Overview = (props: Props) => { + const navigate = useNavigate(); + return ( +
+ + + Cupons + + + + + + + + + + + +
+ ) +} + +export default Overview \ No newline at end of file diff --git a/frontend/src/Components/Admin/Cupons/cupon.module.scss b/frontend/src/Components/Admin/Cupons/cupon.module.scss new file mode 100644 index 00000000..9a611e0f --- /dev/null +++ b/frontend/src/Components/Admin/Cupons/cupon.module.scss @@ -0,0 +1,18 @@ +@import "../../Common/variables.module.scss"; + +.cuponsPage{ + padding: $padding; +} + +.addCuponPage{ + padding: $padding; +} + +.cuponDisplayContainer{ + width: fit-content; + padding: $padding; +} + +.cuponDisplayHeadline{ + display: flex; +} \ No newline at end of file diff --git a/frontend/src/Components/Admin/Overview/Overview.tsx b/frontend/src/Components/Admin/Overview/Overview.tsx index 495d9b52..65857d13 100644 --- a/frontend/src/Components/Admin/Overview/Overview.tsx +++ b/frontend/src/Components/Admin/Overview/Overview.tsx @@ -17,9 +17,9 @@ import Infobox from '../../Common/InfoBox/Infobox'; import { Area, AreaChart, Bar, BarChart, CartesianGrid, Legend, Tooltip, XAxis, YAxis } from 'recharts'; import TopDepter from '../Common/TopDepter/TopDepter'; import { RootState } from '../../../Reducer/reducerCombiner'; -import { BENUTZER_ZAHL, BUDGET, EINSTELLUNGEN, GELD_VERTEILUNG, GETRAENKE, LETZE_100_KAEUFE, MITGLIEDER, TRANSAKTIONEN, VERSTECKTE_NUTZER } from '../../Common/Internationalization/i18n'; +import { BENUTZER_ZAHL, BUDGET, CUPONS, EINSTELLUNGEN, GELD_VERTEILUNG, GETRAENKE, LETZE_100_KAEUFE, MITGLIEDER, TRANSAKTIONEN, VERSTECKTE_NUTZER } from '../../Common/Internationalization/i18n'; import { Transaction } from '../../../types/ResponseTypes'; - +import SellIcon from '@mui/icons-material/Sell'; type Props = {} @@ -179,6 +179,16 @@ const Overview = (props: Props) => { {TRANSAKTIONEN} +