presentation version

This commit is contained in:
2020-06-10 01:25:47 +02:00
parent 5b9410cf1c
commit 1855f50d0d
35 changed files with 1282 additions and 187 deletions
+9
View File
@@ -0,0 +1,9 @@
import JSONAPIAdapter from '@ember-data/adapter/json-api';
export default class ApplicationAdapter extends JSONAPIAdapter {
namespace = 'api';
buildURL(...args) {
return `${super.buildURL(...args)}.json`;
}
}
+3
View File
@@ -0,0 +1,3 @@
<button type="button">
<img ...attributes>
</button>
+18
View File
@@ -0,0 +1,18 @@
import Component from '@glimmer/component';
import { tracked } from '@glimmer/tracking';
import { action } from '@ember/object';
export default class BildComponent extends Component {
@tracked isLarge = false;
@tracked selected = false;
@action toggleSize() {
this.isLarge = !this.isLarge;
}
@action select()
{
this.selected = !this.selected
}
}
+2 -4
View File
@@ -1,6 +1,4 @@
<h1 class="kategorie">{{@titel}}</h1>
<div class="kategorie">
<h1 class="kategorie">{{@titel}}</h1>
{{yield}}
</div>
</div>
+11 -10
View File
@@ -1,11 +1,12 @@
<article class="kategorie">
<image src={{@produkt.bild}} alt="Ein Bild von {{@produkt.titel}}"/>
<div class="details">
<button type="button" class="produkt {{if this.isSelected "selected"}}" {{on "click" (fn this.toggleSelection @produkt.titel)}}>
<img src={{@produkt.bild}} alt="Ein Bild von {{@produkt.titel}}"/>
<div class="detail">
<h3>{{@produkt.titel}}</h3>
<div class="detail owner">
<span>Menge:</span> {{@produkt.menge}}{{@produkt.einheit}}
</div>
</div>
</article>
<ul class="details">
<li class="detail"><h4>Menge:</h4> {{@produkt.menge}}{{@produkt.einheit}}</li>
<!--<li class="detail"><h4>this.ex:</h4> {{this.ex}}</li>
<li class="detail"><h4>this.prodn:</h4> {{this.prodn}}</li>
<li class="detail"><h4>produkt count:</h4> {{this.count}}</li>-->
</ul>
</div>
</button>
+77
View File
@@ -0,0 +1,77 @@
import Component from '@glimmer/component';
import { action } from '@ember/object';
import { tracked } from '@glimmer/tracking';
import { inject as service } from '@ember/service';
export default class ProduktController extends Component {
@tracked isLarge = false;
@tracked isSelected = false;
@tracked ex = false;
@tracked isSet = false;
@tracked prodn = "test";
@tracked count = 0;
@service store;
@action toggleSize()
{
this.isLarge = !this.isLarge;
}
@action toggleSelection(produktname)
{
this.isSelected = !this.isSelected;
this.setStatus(produktname);
}
@action getStatus(produktname)
{
this.prodn = produktname;
this.store.findAll('produkt')
.then(function(suchergebnis)
{
suchergebnis.forEach(element => {
if(element.titel==produktname)
{
this.exists = true;
this.isSelected = element.getStatus().isSelected;
this.ex = true;
}
});
if(!this.exists)
{
this.isSelected = false;
}
});
}
setStatus(produktname)
{
//schreibt den aktuellen Zustand in den store
let suchergebnis = this.get('store').query('produkt', {
filter: {
titel: produktname
}});
this.prodn = suchergebnis.titel;
count = suchergebnisse.titel;
this.prodn = element.titel;
suchergebnisse.forEach(element => {
this.prodn = element.titel;
count++;
if(element.titel === produktname)
{
this.prodn = produktname;
element.isSelected = this.isSelected;
this.isSet = !this.isSet;
}
});
}
}
+36
View File
@@ -0,0 +1,36 @@
{{#if this.isSelected}}
<button type="button" class="rezept selected" {{on "click" this.toggleSelection}}>
<span><img src={{@rezept.bild}} alt="Ein Bild von {{@rezept.titel}}"/></span>
<span>
<div class="detail">
<h3>{{@rezept.titel}}</h3>
<ul class="details">
<li class="detail"><h4>Zutaten:</h4>{{#each @rezept.produkte as |produkt|}}
{{produkt.attributes.titel}},
{{/each}}Gewürze</li>
<li class="detail"><h4>Personen:</h4>{{@rezept.personen}}</li>
<li class="detail"><h4>Dauer:</h4>{{@rezept.dauer}}</li>
</ul>
</div>
</span>
</button>
{{else}}
<button type="button" class="rezept" {{on "click" this.toggleSelection}}>
<span><img src={{@rezept.bild}} alt="Ein Bild von {{@rezept.titel}}"/></span>
<span>
<div class="detail">
<h3>{{@rezept.titel}}</h3>
<ul class="details">
<li class="detail"><h4>Zutaten:</h4>{{#each @rezept.produkte as |produkt|}}
{{produkt.attributes.titel}},
{{/each}}Gewürze</li>
<li class="detail"><h4>Personen:</h4>{{@rezept.personen}} </li>
<li class="detail"><h4>Dauer:</h4>{{@rezept.dauer}}</li>
</ul>
</div>
</span>
</button>
{{/if}}
+18
View File
@@ -0,0 +1,18 @@
import Component from '@glimmer/component';
import { action } from '@ember/object';
import { tracked } from '@glimmer/tracking';
export default class RezeptController extends Component {
@tracked isLarge = false;
@tracked isSelected = false;
@action toggleSize()
{
this.isLarge = !this.isLarge;
}
@action toggleSelection()
{
this.isSelected = !this.isSelected;
}
}
+4
View File
@@ -0,0 +1,4 @@
import DS from 'ember-data';
export default DS.Store.extend({
});
+16
View File
@@ -0,0 +1,16 @@
import Model, { attr } from '@ember-data/model';
export default class ProduktModel extends Model {
@attr titel;
@attr isSelected;
@attr kategorie;
@attr menge;
@attr einheit;
@attr bild;
get status()
{
return `${this.titel} ${this.IsSelected}`
}
}
+19
View File
@@ -0,0 +1,19 @@
import Model, { attr, hasMany } from '@ember-data/model';
export default class RezeptModel extends Model {
@attr titel;
@attr isSelected;
@attr ('string') beschreibung;
@attr kategorie;
@hasMany('produkt') produkte;
@attr gewuerze;
@attr personen;
@attr dauer;
@attr bild;
get status()
{
return `${this.titel} ${this.IsSelected}`
}
}
+10 -2
View File
@@ -1,4 +1,5 @@
import Route from '@ember/routing/route';
import { inject as service } from '@ember/service';
const PRODUKT_KATEGORIEN = [
'Pasta',
@@ -7,8 +8,15 @@ const PRODUKT_KATEGORIEN = [
'Fleisch'
];
export default class IndexRoute extends Route {
export default class ProduktRoute extends Route {
@service store;
async model() {
return this.store.findAll('produkt');
}
}
/*async model() {
let response = await fetch('/api/produkte.json');
let { data } = await response.json();
@@ -27,4 +35,4 @@ export default class IndexRoute extends Route {
return { kategorie, ...attributes };
});
}
}
}*/
+46
View File
@@ -0,0 +1,46 @@
import Route from '@ember/routing/route';
import Component from '@glimmer/component';
import { tracked } from '@glimmer/tracking';
import { action } from '@ember/object';
import { inject as service } from '@ember/service';
const REZEPT_KATEGORIEN = [
'Pasta',
'Schwein',
'Soße',
'Fleisch',
'Geflügel',
'Rind',
'Nachspeise',
'Backen'
];
export default class RezeptRoute extends Route{
@service store;
async model() {
return this.store.findAll('rezept');
}
}
/*async model() {
let response = await fetch('/api/rezepte.json');
let { data } = await response.json();
return data.map(model => {
let { attributes } = model;
let kategorie;
if (REZEPT_KATEGORIEN.includes(attributes.kategorie)) {
kategorie = attributes.kategorie;
}
else
{
kategorie = 'Sonstiges';
}
return { kategorie, ...attributes };
});
}
}*/
+11
View File
@@ -0,0 +1,11 @@
import Route from '@ember/routing/route';
import { inject as service } from '@ember/service';
export default class ProduktRoute extends Route {
@service store;
async model() {
return this.store.findAll('produkt');
}
}
+4
View File
@@ -0,0 +1,4 @@
import JSONAPISerializer from '@ember-data/serializer/json-api';
export default class ApplicationSerializer extends JSONAPISerializer {
}
+412 -118
View File
@@ -174,6 +174,12 @@ p {
margin-top: -10px;
}
.resultsProdukt {
display: flex;
flex-wrap: wrap;
flex-direction: row;
}
.results li {
list-style: none;
padding: 10px 15px;
@@ -196,10 +202,7 @@ p {
.jumbo {
padding: 50px;
background: #f6f6f6;
}
.jumbo:hover {
background-color: #f3f3f3;
}
.jumbo h2 {
@@ -220,76 +223,81 @@ p {
}
/**
* Individual kategorie Listing
* Individual rezept Listing
*/
.rezept label span {
font-size: 140%;
margin: 50px auto 20px;
display: block;
text-align: center;
font-style: italic;
}
.kategorie {
.rezept input {
padding: 11px;
font-size: 18px;
width: 500px;
margin: 20px auto 50px;
background-color: rgba(255, 255, 255, 0.75);
border: solid 1px lightgray;
display: block;
}
.rezept {
margin-top: 15px;
background-color: #f6f6f6;
background-color: white;
padding: 20px 25px;
display: flex;
justify-content: space-between;
align-items: center;
flex-wrap: wrap;
text-align: center;
width: 100%;
border: #677ae4;
border-width: 15px;
}
.kategorie:hover {
.rezept.selected{
border: #016aba;
border-width: 7px;
border-style: solid;
border-radius: 5px;
font-size: 100%;
}
.rezept:hover {
border: #016aba;
border-width: 2px;
border-style: solid;
border-radius: 5px;
font-size: 100%;
}
.rezept.selected:hover {
background-color: #f3f3f3;
border-width: 5px;
}
.kategorie img {
.rezept img {
border-radius: 5px;
}
.kategorie .image {
.rezept .image {
flex-grow: 0;
flex-basis: 150px;
margin: 20px 25px;
text-align: center;
}
.kategorie button.image {
position: relative;
cursor: pointer;
border: none;
background: transparent;
z-index: 1;
}
.kategorie button.image:focus {
outline: none;
}
.kategorie button.image:after {
content: "";
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
z-index: -1;
margin: -20px;
padding: 20px;
border-radius: 5px;
background: #016aba;
opacity: 0;
transition: opacity 0.25s ease-in-out;
}
.kategorie button.image:focus:after, .kategorie button.image:hover:after {
opacity: 0.1;
}
.kategorie .image img {
.rezept .image img {
max-width: 100%;
}
.kategorie .image.large {
.rezept .image.large {
margin: 30px 25px 50px 25px;
flex-basis: 100%;
}
.kategorie .image small {
.rezept .image small {
display: block;
margin-top: 5px;
margin-bottom: -15px;
@@ -300,12 +308,369 @@ p {
position: relative;
}
.kategorie .image.large small {
.rezept .image.large small {
margin-top: 10px;
margin-bottom: 0px;
font-size: 110%;
}
.rezept .details {
flex-basis: 50%;
flex-grow: 2;
display: flex;
height: 150px;
margin: 20px 25px;
justify-content: space-between;
flex-wrap: wrap;
align-content: space-around;
text-align: center;
}
.rezept h3 {
flex-basis: 100%;
}
.rezept h3 a {
display: inline;
}
.rezept .detail {
flex-basis: 50%;
font-weight: 300;
font-style: italic;
white-space: pre-wrap ;
text-align: center;
}
.rezept .detail h3 h4{
text-align: center;
}
.rezept .detail span {
font-weight: 400;
font-style: normal;
}
.rezept .bild span {
width: 50;
}
.rezept .map {
flex-grow: 0;
flex-basis: 150px;
font-size: 0;
margin: 0px 25px;
}
.rezept .map img {
width: 150px;
height: 150px;
}
.rezept.detailed {
background: none;
align-items: flex-start;
}
.rezept.detailed .image {
flex-basis: 320px;
}
.rezept.detailed .image.large {
margin: 30px 25px 50px 25px;
flex-basis: 100%;
}
.rezept.detailed .details {
height: auto;
}
.rezept.detailed h3 {
font-size: 200%;
margin-bottom: 10px;
}
.rezept.detailed .detail {
margin: 5px 0px;
flex-basis: 100%;
flex-shrink: 2;
}
.rezept.detailed .description {
white-space: normal;
flex-basis: 100%;
flex-shrink: 1;
}
.rezept.detailed .map {
flex-basis: 100%;
margin: 50px 25px 25px 25px;
}
.rezept.detailed .map img {
width: 100%;
height: auto;
}
@media only screen and (max-width: 919px) {
.rezept.detailed .image, .rezept.detailed .image.large {
margin: 30px 25px 25px 25px;
flex-basis: 100%;
cursor: default;
}
.rezept.detailed .image:hover {
flex-basis: 100%;
cursor: default;
}
.rezept.detailed .image small {
display: none;
}
.rezept.detailed button.image:hover:after {
opacity: 0;
}
.rezept.detailed button.image:focus:after {
opacity: 0.1;
}
.rezept.detailed .map {
margin-top: 25px;
}
}
/**
* Individual produkt Listing
*/
.produkt label span {
font-size: 140%;
margin: 50px auto 20px;
display: block;
text-align: center;
font-style: italic;
}
.produkt input {
padding: 11px;
font-size: 18px;
width: 500px;
margin: 20px auto 50px;
background-color: rgba(255, 255, 255, 0.75);
border: solid 1px lightgray;
display: block;
}
.produkt {
margin: 15px;
background-color: white;
padding: 20px 25px;
display: flex;
justify-content: space-between;
align-items: center;
text-align: center;
flex-wrap: wrap;
width:20%;
border: none;
}
.produkt.selected{
border: #016aba;
border-width: 7px;
border-style: solid;
border-radius: 5px;
font-size: 100%;
}
.produkt:hover {
border: #016aba;
border-width: 2px;
border-style: solid;
border-radius: 5px;
font-size: 100%;
}
.produkt.selected:hover {
background-color: #f3f3f3;
border-width:5px;
}
.produkt img {
border-radius: 5px;
width: 100%;
}
.produkt .image {
flex-grow: 0;
flex-basis: 150px;
margin: 20px 25px;
text-align: center;
}
.produkt .image img {
max-width: 100%;
}
.produkt .image.large {
margin: 30px 25px 50px 25px;
flex-basis: 100%;
}
.produkt .image small {
display: block;
margin-top: 5px;
margin-bottom: -15px;
text-align: center;
color: #016aba;
/* This is needed to fix a safari clipping issue */
position: relative;
}
.produkt .image.large small {
margin-top: 10px;
margin-bottom: 0px;
font-size: 110%;
}
.produkt .details {
flex-basis: 50%;
flex-grow: 2;
display: flex;
height: 150px;
margin: 20px 25px;
justify-content: space-between;
flex-wrap: wrap;
align-content: space-around;
text-align: center;
align-items: center;
}
.produkt h3 {
flex-basis: 100%;
}
.produkt h3 a {
display: inline;
}
.produkt .detail {
flex-basis: 50%;
font-weight: 300;
font-style: italic;
white-space: pre-wrap;
text-align: center;
flex: auto;
list-style-type: none;
}
.produkt .detail span {
font-weight: 400;
font-style: normal;
}
.produkt .map {
flex-grow: 0;
flex-basis: 150px;
font-size: 0;
margin: 0px 25px;
}
.produkt .map img {
width: 150px;
height: 150px;
}
.produkt.detailed {
background: none;
align-items: flex-start;
}
.produkt.detailed .image {
flex-basis: 320px;
}
.produkt.detailed .image.large {
margin: 30px 25px 50px 25px;
flex-basis: 100%;
}
.produkt.detailed .details {
height: auto;
}
.produkt.detailed h3 {
font-size: 200%;
margin-bottom: 10px;
}
.produkt.detailed .detail {
margin: 5px 0px;
flex-basis: 100%;
flex-shrink: 2;
}
.produkt.detailed .description {
white-space: normal;
flex-basis: 100%;
flex-shrink: 1;
}
.produkt.detailed .map {
flex-basis: 100%;
margin: 50px 25px 25px 25px;
}
.produkt.detailed .map img {
width: 100%;
height: auto;
}
@media only screen and (max-width: 919px) {
.produkt.detailed .image, .produkt.detailed .image.large {
margin: 30px 25px 25px 25px;
flex-basis: 100%;
cursor: default;
}
.produkt.detailed .image:hover {
flex-basis: 100%;
cursor: default;
}
.produkt.detailed .image small {
display: none;
}
.produkt.detailed button.image:hover:after {
opacity: 0;
}
.produkt.detailed button.image:focus:after {
opacity: 0.1;
}
.produkt.detailed .map {
margin-top: 25px;
}
}
/**
* Individual kategorie Listing
*/
.kategorie {
margin-top: 15px;
background-color: #f6f6f6;
padding: 20px 25px;
display: flex;
justify-content: space-between;
/**align-items: center;*/
flex-wrap: wrap;
align-items: flex-start;
}
.kategorie .details {
flex-basis: 50%;
flex-grow: 2;
@@ -337,32 +702,11 @@ p {
font-style: normal;
}
.kategorie .map {
flex-grow: 0;
flex-basis: 150px;
font-size: 0;
margin: 0px 25px;
}
.kategorie .map img {
width: 150px;
height: 150px;
}
.kategorie.detailed {
background: none;
align-items: flex-start;
}
.kategorie.detailed .image {
flex-basis: 320px;
}
.kategorie.detailed .image.large {
margin: 30px 25px 50px 25px;
flex-basis: 100%;
}
.kategorie.detailed .details {
height: auto;
}
@@ -384,45 +728,6 @@ p {
flex-shrink: 1;
}
.kategorie.detailed .map {
flex-basis: 100%;
margin: 50px 25px 25px 25px;
}
.kategorie.detailed .map img {
width: 100%;
height: auto;
}
@media only screen and (max-width: 919px) {
.kategorie.detailed .image, .kategorie.detailed .image.large {
margin: 30px 25px 25px 25px;
flex-basis: 100%;
cursor: default;
}
.kategorie.detailed .image:hover {
flex-basis: 100%;
cursor: default;
}
.kategorie.detailed .image small {
display: none;
}
.kategorie.detailed button.image:hover:after {
opacity: 0;
}
.kategorie.detailed button.image:focus:after {
opacity: 0.1;
}
.kategorie.detailed .map {
margin-top: 25px;
}
}
/**
* Utilities
*/
@@ -447,17 +752,6 @@ p {
position: relative;
}
.tomster {
background: url(../assets/images/teaching-tomster.png);
background-size: contain;
background-repeat: no-repeat;
height: 200px;
width: 200px;
position: relative;
top: -25px;
}
.screen-reader{
position: absolute;
overflow: hidden;
+38 -4
View File
@@ -6,14 +6,48 @@
<Kategorie @titel={{"Gemüse"}}>
<div class="rentals">
<ul class="results">
<ul class="resultsProdukt">
{{#each @model as |produkt|}}
{{#if (compare produkt.titel '===' 'Gemüse')}}
<li><Produkt @produkt={{produkt}} /></li>
{{#if (compare produkt.kategorie '===' 'Gemüse')}}
<Produkt @produkt={{produkt}} />
{{/if}}
<li><Produkt @produkt={{produkt}} /></li>
{{/each}}
</ul>
</div>
</Kategorie>
<Kategorie @titel={{"Milchprodukte"}}>
<div class="rentals">
<ul class="resultsProdukt">
{{#each @model as |produkt|}}
{{#if (compare produkt.kategorie '===' 'Milchprodukte')}}
<Produkt @produkt={{produkt}} />
{{/if}}
{{/each}}
</ul>
</div>
</Kategorie>
<Kategorie @titel={{"Fleisch"}}>
<div class="rentals">
<ul class="resultsProdukt">
{{#each @model as |produkt|}}
{{#if (compare produkt.kategorie '===' 'Fleisch')}}
<span><Produkt @produkt={{produkt}} /></span>
{{/if}}
{{/each}}
</ul>
</div>
</Kategorie>
<Kategorie @titel={{"Pasta"}}>
<div class="rentals">
<ul class="resultsProdukt">
{{#each @model as |produkt|}}
{{#if (compare produkt.kategorie '===' 'Pasta')}}
<Produkt @produkt={{produkt}} />
{{/if}}
{{/each}}
</ul>
</div>
</Kategorie>
+77 -29
View File
@@ -4,38 +4,86 @@
<LinkTo @route="rezepte" class="button">Rezepte bearbeiten</LinkTo>
</Jumbo>
<div class="kategorie">
<h2>Pasta</h2>
{{yield}}
</div>
<Kategorie @titel={{"Pasta"}}>
<div class="rentals">
<ul class="results">
{{#each @model as |rezept|}}
{{#if (compare rezept.kategorie '===' 'Pasta')}}
<li><Rezept class="detail" @rezept={{rezept}} /></li>
{{/if}}
{{/each}}
</ul>
</div>
</Kategorie>
<div class="kategorie">
<h2>Gemüse</h2>
{{yield}}
</div>
<Kategorie @titel={{"Gemüse"}}>
<div class="rentals">
<ul class="results">
{{#each @model as |rezept|}}
{{#if (compare rezept.kategorie '===' 'Gemüse')}}
<li><Rezept @rezept={{rezept}} /></li>
{{/if}}
{{/each}}
</ul>
</div>
</Kategorie>
<div class="kategorie">
<h2>Geflügel</h2>
{{yield}}
</div>
<Kategorie @titel={{"Geflügel"}}>
<div class="rentals">
<ul class="results">
{{#each @model as |rezept|}}
{{#if (compare rezept.kategorie '===' 'Geflügel')}}
<li><Rezept @rezept={{rezept}} /></li>
{{/if}}
{{/each}}
</ul>
</div>
</Kategorie>
<div class="kategorie">
<h2>Rind</h2>
{{yield}}
</div>
<Kategorie @titel={{"Rind"}}>
<div class="rentals">
<ul class="results">
{{#each @model as |rezept|}}
{{#if (compare rezept.kategorie '===' 'Rind')}}
<li><Rezept @rezept={{rezept}} /></li>
{{/if}}
{{/each}}
</ul>
</div>
</Kategorie>
<div class="kategorie">
<h2>Schwein</h2>
{{yield}}
</div>
<Kategorie @titel={{"Schwein"}}>
<div class="rentals">
<ul class="results">
{{#each @model as |rezept|}}
{{#if (compare rezept.kategorie '===' 'Schwein')}}
<li><Rezept @rezept={{rezept}} /></li>
{{/if}}
{{/each}}
</ul>
</div>
</Kategorie>
<div class="kategorie">
<h2>Nachspeise</h2>
{{yield}}
</div>
<Kategorie @titel={{"Nachspeise"}}>
<div class="rentals">
<ul class="results">
{{#each @model as |rezept|}}
{{#if (compare rezept.kategorie '===' 'Nachspeise')}}
<li><Rezept @rezept={{rezept}} /></li>
{{/if}}
{{/each}}
</ul>
</div>
</Kategorie>
<div class="kategorie">
<h2>Backen</h2>
{{yield}}
</div>
<Kategorie @titel={{"Backen"}}>
<div class="rentals">
<ul class="results">
{{#each @model as |rezept|}}
{{#if (compare rezept.kategorie '===' 'Backen')}}
<li><Rezept @rezept={{rezept}} /></li>
{{/if}}
{{/each}}
</ul>
</div>
</Kategorie>
+11 -4
View File
@@ -4,7 +4,14 @@
<LinkTo @route="zettel" class="button">Zettel aktualisieren</LinkTo>
</Jumbo>
<div class="zettel">
{{yield}}
</div>
<Kategorie @titel={{"mein Zettel"}}>
<div class="rentals">
<ul class="results">
{{#each @model as |produkt|}}
{{#if produkt.isSelected}}
<li><Rezept @zettel={{produkt}} /></li>
{{/if}}
{{/each}}
</ul>
</div>
</Kategorie>