mega-commit: migrations, controllers, models, etc.

This commit is contained in:
Didier Slof 2022-12-08 09:30:07 +01:00
parent 9732135e90
commit 2c6745e812
Signed by: didier
GPG key ID: 01E71F18AA4398E5
70 changed files with 2124 additions and 400 deletions

View file

@ -0,0 +1,54 @@
.form {
background: var(--second-bg);
padding: 1rem;
border-radius: 10px;
}
.form .item {
margin-top: 1rem;
margin-right: 1rem;
margin-bottom: 0.2rem;
}
.form .item input {
margin-top: 0.2rem;
width: 100%;
height: 2rem;
background: var(--third-bg);
color: var(--default-text);
border: none;
outline: none;
padding: 0.1rem 0.1rem 0.1rem 1rem;
border-radius: 5px;
}
.form .item input:hover {
color: var(--default-text-invert);
filter: brightness(1.2);
}
.form .item input:focus {
background: var(--second-bg);
filter: brightness(1.2);
}
.form .item input:focus:hover {
color: var(--default-text);
}
.form button {
color: var(--default-text);
background: var(--third-bg);
margin-top: 1rem;
width: 100%;
height: 2rem;
border-radius: 5px;
border: none;
outline: none;
}
.form button:focus,
.form button:hover {
color: var(--default-text-invert);
filter: brightness(1.2);
}

32
public/css/extra.css Normal file
View file

@ -0,0 +1,32 @@
.jumbotron {
position: relative;
margin: 0;
width: 100%;
height: 30vh;
}
.jumbotron img.jumbotron-image {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
object-fit: cover;
filter: blur(1px) brightness(0.5);
}
.jumbotron .container {
position: relative;
z-index: 1;
display: grid;
place-items: center;
height: 100%;
}
.jumbotron .container h1 {
font-size: 3rem;
font-weight: bold;
margin-bottom: 0;
color: var(--primary-color-text);
}

173
public/css/generic.css Normal file
View file

@ -0,0 +1,173 @@
:root {
--default-text: #000;
--default-text-invert: #fff;
--dim-text: #666;
--primary-color: #f55;
--primary-color-text: #fff;
--secondary-color: #ed0;
--secondary-color-text: #000;
--default-bg: #fff;
--second-bg: #ddd;
--third-bg: #bbb;
--darkest-bg: #222;
--inactive-item-bg: #eee;
--active-item-bg: #ccc;
--highlight-bg: #f55;
--highlight-text: #fff;
}
* {
transition: all .5s;
}
@media (prefers-color-scheme: dark) {
:root {
--default-text: #fff;
--default-text-invert: #000;
--dim-text: #999;
--default-bg: #222;
--second-bg: #777;
--third-bg: #aaa;
--darkest-bg: #111;
--inactive-item-bg: #333;
--active-item-bg: #666;
}
}
html {
color: var(--default-text);
background: var(--default-bg);
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
}
body {
margin: 0;
padding: 0;
}
a {
color: var(--default-text);
text-decoration: none;
}
a:hover {
color: var(--secondary-color);
}
.spread-h {
display: flex;
flex-direction: row;
justify-content: space-between;
}
ul {
list-style: none;
padding: 0;
}
ul li {
margin: 0.5rem 0;
border-bottom: 1px solid var(--second-bg);
}
ul.numbered {
counter-reset: li;
list-style: decimal;
}
ul.numbered li {
counter-increment: li;
}
.card {
background: var(--default-bg);
border: 1px solid var(--second-bg);
border-radius: 0.5rem;
padding: 1rem;
margin: 1rem 0;
}
.clicky-card {
cursor: pointer;
}
.clicky-card:hover .card {
background: var(--darkest-bg);
}
button.button,
a.button {
display: grid;
place-items: center;
align-content: center;
font-weight: bold;
min-height: 2rem;
min-width: 4rem;
background: var(--primary-color);
color: var(--primary-color-text);
padding: 0.5rem 1rem;
border-radius: 0.5rem;
text-decoration: none;
outline: none;
border: none;
cursor: pointer;
}
button.button:hover,
a.button:hover {
background: var(--secondary-color);
color: var(--secondary-color-text);
}
table {
border-collapse: collapse;
width: 100%;
}
table td {
border: 1px solid var(--second-bg);
padding: 0.5rem;
}
table th {
border: 1px solid var(--second-bg);
padding: 0.5rem;
background: var(--second-bg);
}
table tr:nth-child(even) {
background: var(--default-bg);
filter: brightness(0.7);
}
table tr:nth-child(odd) {
background: var(--default-bg);
}
table tr:hover {
background: var(--default-bg);
filter: brightness(1.2);
}
tr {
border: 1px solid var(--second-bg);
}
.hide {
display: none;
}
.op0 {
opacity: 0;
}

77
public/css/main.css Normal file
View file

@ -0,0 +1,77 @@
header {
background: var(--second-bg);
display: grid;
grid-template-columns: 1.5fr 0.5fr;
height: 7vh;
align-items: center;
}
header span {
font-size: 1.5rem;
font-weight: bold;
margin: 0.5rem 1rem;
}
header div {
text-align: right;
display: inline;
}
header div a {
padding: 1.5rem;
}
header div a:hover {
font-size: 1.2rem;
}
main {
margin: 0 auto;
padding: 1rem;
max-width: 800px;
}
/* #movies needs to be a grid with movie poster and show details on hover */
#movies {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
grid-gap: 1rem;
}
#movies a {
position: relative;
overflow: hidden;
border-radius: 0.5rem;
}
#movies a img {
width: 100%;
height: 100%;
object-fit: cover;
transition: transform 0.5s;
}
#movies a:hover img {
transform: scale(1.1);
}
#movies a .details {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: linear-gradient(0deg, rgba(0,0,0,1) 0%, rgba(0,0,0,0) 100%);
display: flex;
flex-direction: column;
justify-content: flex-end;
align-items: center;
opacity: 0;
transition: opacity 0.5s;
}
#movies a:hover .details {
opacity: 1;
}

170
public/css/manage.css Normal file
View file

@ -0,0 +1,170 @@
header {
position: fixed;
top: 0;
left: 0;
background: var(--second-bg);
display: grid;
grid-template-columns: 1.5fr 0.5fr;
height: 7vh;
align-items: center;
width: 100%;
z-index: 1;
}
header span {
font-size: 1.5rem;
font-weight: bold;
margin: 0.5rem 1rem;
}
header div {
text-align: right;
display: inline;
}
header div a {
padding: 1.5rem;
}
/* side bar needs to be under header*/
#sidebar {
background: var(--darkest-bg);
height: 93vh;
width: 20vw;
position: fixed;
top: 7vh;
left: 0;
z-index: 1;
overflow-x: hidden;
padding-top: 0.25rem;
}
#sidebar a {
background: var(--inactive-item-bg);
padding: 0.5rem 1rem;
text-decoration: none;
color: var(--default-text);
display: block;
margin-top: 0.5rem;
}
#sidebar a:hover {
filter: brightness(1.5);
}
#sidebar a.active {
background: var(--highlight-bg);
color: var(--highlight-text);
}
#sidebar a.child {
padding-left: 2rem;
margin-top: 0;
/* nice visual*/
border-left: 1rem solid var(--second-bg);
}
main {
background: var(--default-bg);
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
margin: 9vh 1vw 4vh 21vw;
padding: 0;
}
.card {
display: grid;
background: var(--second-bg);
width: 10vw;
place-items: center;
}
.card .big-stat {
font-size: 3rem;
font-weight: bold;
}
#movies {
display: flex;
flex-direction: column;
}
#movies a {
display: flex;
flex-direction: row;
margin: 0.5rem 0;
padding: 0.5rem;
background: var(--second-bg);
border-radius: 0.5rem;
}
#movies a img {
width: 10vw;
height: 16vw;
object-fit: cover;
transition: transform 0.5s;
}
#movies a:hover {
filter: brightness(1.5);
}
#movies a .details {
display: flex;
flex-direction: column;
margin-left: 1rem;
}
/* form */
.form {
display: flex;
flex-direction: column;
margin: 0.5rem 0;
padding: 0.5rem;
background: var(--second-bg);
border-radius: 0.5rem;
}
.form .form-group {
display: flex;
flex-direction: column;
margin: 0.5rem 0;
}
.form .form-group label {
margin: 0.5rem 0;
}
form .form-group button,
form .form-group select,
form .form-group textarea,
form .form-group input {
padding: 0.5rem;
border-radius: 0.5rem;
background: var(--default-bg);
color: var(--default-text);
outline: none;
border: none;
}
form .form-group button:hover,
form .form-group select:hover,
form .form-group textarea:hover,
form .form-group input:hover,
form .form-group button:focus,
form .form-group select:focus,
form .form-group textarea:focus,
form .form-group input:focus {
filter: brightness(1.5);
}
form .form-group button {
background: var(--highlight-bg);
color: var(--highlight-text);
cursor: pointer;
}
form .form-group button:hover {
filter: brightness(1.5);
}

31
public/css/movies.css Normal file
View file

@ -0,0 +1,31 @@
#movies {
display: flex;
flex-wrap: wrap;
justify-content: space-between;
flex-direction: row;
gap: 1rem;
}
/* Show .details on top of image */
#movies a {
position: relative;
}
#movies a .details {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
display: grid;
place-content: center;
align-content: center;
background: var(--second-bg);
opacity: 0;
color: var(--default-text);
transition: all .5s;
}
#movies a:hover .details {
opacity: 0.7;
}

View file

@ -0,0 +1,39 @@
:root {
--spacing: 1rem;
}
.seat-chooser {
padding: var(--spacing);
width: 100%;
height: 100%;
position: relative;
background: var(--second-bg);
border: 1px solid #ccc;
border-radius: 5px;
overflow: hidden;
display: grid;
grid-template-columns: repeat(var(--cols), 1fr);
grid-template-rows: repeat(var(--rows), 1fr);
gap: var(--spacing);
}
.seat-chooser .seat {
position: relative;
background: #5f5;
border: 1px solid #ccc;
border-radius: 5px;
overflow: hidden;
cursor: pointer;
width: 32px;
height: 32px;
transition: all 0.3s ease;
}
.seat-chooser .seat.seat-reserved {
background: #f66;
}
.seat-chooser .seat:hover {
background: var(--highlight-bg);
}

View file

@ -1,105 +0,0 @@
:root {
--default-text: #000;
--primary-color: #bb00ff;
--secondary-color: #5eff00;
--default-bg: #fff;
--second-bg: #ddd;
--third-bg: #bbb;
}
* {
transition: all .5s;
}
@media (prefers-color-scheme: dark) {
:root {
--default-text: #fff;
--default-bg: #222;
--second-bg: #777;
--third-bg: #aaa;
}
}
html {
color: var(--default-text);
background: var(--default-bg);
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
}
body {
margin: 0;
padding: 0;
}
a {
color: var(--default-text);
text-decoration: none;
}
a:hover {
color: var(--primary-color);
}
header {
background: var(--second-bg);
display: grid;
grid-template-columns: 1.5fr 0.5fr;
height: 7vh;
align-items: center;
}
header span {
font-size: 1.5rem;
font-weight: bold;
margin: 0.5rem 1rem;
}
header div {
text-align: right;
display: inline;
}
header div a {padding: 1.5rem;}
header div a:hover {
background: var(--third-bg);
padding: 1.5rem 1.5rem 2.5rem 1.5rem;
}
main {
margin: 0 auto;
padding: 1rem;
max-width: 800px;
}
#movies {
display: flex;
flex-wrap: wrap;
justify-content: space-between;
flex-direction: row;
gap: 1rem;
}
/* Show .details on top of image */
#movies a {
position: relative;
}
#movies a .details {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
display: grid;
place-content: center;
align-content: center;
background: var(--second-bg);
opacity: 0;
color: var(--default-text);
transition: all .5s;
}
#movies a:hover .details {
opacity: 0.7;
}

27
public/js/jumbotron.js Normal file
View file

@ -0,0 +1,27 @@
let jumbotron = document.querySelector('.jumbotron');
let topImageHolder = document.querySelector('.jumbotron-image[data-order="1"]');
let bottomImageHolder = document.querySelector('.jumbotron-image[data-order="2"]');
let images = jumbotron.getAttribute('data-images').split(',');
let delay = jumbotron.getAttribute('data-delay');
let imageIndex = 0;
// init
bottomImageHolder.src = images[imageIndex];
imageIndex++;
function loop() {
bottomImageHolder.classList.add('op0');
bottomImageHolder.src = images[imageIndex];
imageIndex++;
topImageHolder.classList.add('op0');
topImageHolder.src = images[imageIndex];
imageIndex++;
bottomImageHolder.classList.remove('op0');
if (imageIndex >= images.length) {
imageIndex = 0;
}
}
setInterval(loop, delay);