From 10c86197f1f63e222dfc9e937911e35ab500a208 Mon Sep 17 00:00:00 2001 From: Jonathan Tschanter Date: Sat, 22 Jan 2022 21:24:24 +0100 Subject: Adds edit cards and templates to include --- public/css/style.css | 14 ++++- public/favicon.ico | Bin 0 -> 4286 bytes public/js/nav_highlight.js | 9 +++ public/js/splides.js | 6 ++ src/Controller/Card.php | 61 ++++++++++++++++--- src/DB.php | 2 +- src/Model/Card.php | 33 ++++++---- src/Model/Vote.php | 8 +++ src/Model/VoteCard.php | 5 ++ src/Router.php | 6 +- templates/artwork/artwork_template.twig | 54 +++++++++++++++++ templates/artwork/artwork_view.twig | 10 ++++ templates/base.twig | 30 +++++++--- templates/card/card.twig | 13 ++-- templates/card/card_add.twig | 43 ++++--------- templates/card/card_display.twig | 48 --------------- templates/card/card_edit.twig | 30 +++------- templates/card/card_list.twig | 43 ++++--------- templates/card/card_meta_template.twig | 21 +++++++ templates/card/card_template.twig | 103 ++++++++++++++++++++++++++++++++ templates/card/card_view.twig | 11 ++++ templates/dashboard.twig | 58 +++++++++--------- templates/root.twig | 11 ++-- 23 files changed, 411 insertions(+), 208 deletions(-) create mode 100644 public/favicon.ico create mode 100644 public/js/nav_highlight.js create mode 100644 public/js/splides.js create mode 100644 templates/artwork/artwork_template.twig create mode 100644 templates/artwork/artwork_view.twig delete mode 100644 templates/card/card_display.twig create mode 100644 templates/card/card_meta_template.twig create mode 100644 templates/card/card_template.twig create mode 100644 templates/card/card_view.twig diff --git a/public/css/style.css b/public/css/style.css index bdb53f8..c07c25a 100644 --- a/public/css/style.css +++ b/public/css/style.css @@ -15,6 +15,12 @@ header { padding: 0 0.5rem 0rem 0.5rem; } + +.active { + color: var(--accent) !important; + border-color: var(--accent) !important; +} + main { padding-top: 1rem; } @@ -43,6 +49,10 @@ input:disabled { cursor: default; } +button:disabled { + cursor: default; +} + .content { background: var(--accent-bg); border: 1px solid var(--border); @@ -53,8 +63,8 @@ input:disabled { padding: 15px; } -.content-header { - margin-top: 50px; +section { + margin-top: 50px !important; } .row:after { diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000..a54ce55 Binary files /dev/null and b/public/favicon.ico differ diff --git a/public/js/nav_highlight.js b/public/js/nav_highlight.js new file mode 100644 index 0000000..b8ebb09 --- /dev/null +++ b/public/js/nav_highlight.js @@ -0,0 +1,9 @@ +document.addEventListener( 'DOMContentLoaded', function() { + var url = window.location.href; + var navs = document.getElementsByTagName("nav")[0].getElementsByTagName("a"); + for (var i = 0; i < navs.length; i++) { + if (url.startsWith(navs[i].href)) { + navs[i].classList.add('active'); + } + } +}); diff --git a/public/js/splides.js b/public/js/splides.js new file mode 100644 index 0000000..0a4faae --- /dev/null +++ b/public/js/splides.js @@ -0,0 +1,6 @@ +document.addEventListener( 'DOMContentLoaded', function() { + var splides = document.getElementsByClassName("splide"); + for (var i = 0; i < splides.length; i++) { + new Splide(splides[i]).mount(); + } +}); \ No newline at end of file diff --git a/src/Controller/Card.php b/src/Controller/Card.php index e7fa793..3d8d8e0 100644 --- a/src/Controller/Card.php +++ b/src/Controller/Card.php @@ -28,14 +28,13 @@ class Card public static function getAll(): array { - // TODO: is that correct? yes - how to call this getAll? return DB::$entityManager->getRepository(CardModel::class)->findAll(); } public static function listCards(): string { // get all cards - $cards = DB::$entityManager->getRepository(CardModel::class)->findAll(); + $cards = self::getAll(); return Template::render('card/card_list.twig', [ 'cards' => $cards @@ -47,25 +46,40 @@ class Card // TODO: how to access all available meta? return Template::render('card/card_add.twig', [ 'fields' => [ - 'name' => 'meta[name]', - 'converted mana cost' => 'meta[cmc]', - 'is uno reverse' => 'meta[is_uno_reverse]', + 'name' => 'name', + 'converted mana cost' => 'cmc', + 'is uno reverse' => 'is_uno_reverse', ], ]); } - public static function displayCard(Request $request): string + public static function viewCard(Request $request): string { $route = $request->attributes->get('route'); $cardId = $route['id']; $card = DB::$entityManager->getRepository(CardModel::class)->find($cardId); - return Template::render('card/card_display.twig', [ + return Template::render('card/card_view.twig', [ 'card' => $card ]); } + public static function viewArtwork(Request $request): string + { + $route = $request->attributes->get('route'); + $cardId = $route['id']; + $artworkId = $route['artworkId']; + + $card = DB::$entityManager->getRepository(CardModel::class)->find($cardId); + $artwork = DB::$entityManager->getRepository(Artwork::class)->find($artworkId); + + return Template::render('artwork/artwork_view.twig', [ + 'card' => $card, + 'artwork' => $artwork + ]); + } + public static function editCard(Request $request) { $route = $request->attributes->get('route'); @@ -127,10 +141,41 @@ class Card { $route = $request->attributes->get('route'); $cardId = $route['id']; + $card = DB::$entityManager->getRepository(CardModel::class)->find($cardId); - // TODO: like add but edit + foreach ($request->get('meta') as $key => $value) { + $meta = $card->getMeta($key); + if ($meta == null) { + $meta = new CardMeta($key, $value); + $card->addMeta($meta); + } else { + $meta->value = strval($value); + } + + DB::save($meta); + } + + DB::save($card); $response = new RedirectResponse('/card/' . $cardId); return $response; } + + public static function vote(Request $request) + { + var_dump('VOTE'); + $route = $request->attributes->get('route'); + $cardId = $route['id']; + $card = DB::$entityManager->getRepository(CardModel::class)->find($cardId); + + $vote = new VoteCard(); + $vote->value = intval($request->get('value')); + $card->addVote($vote); + DB::save($vote); + DB::save($card); + + // TODO: redirect to last visited + $response = new RedirectResponse('/card'); + return $response; + } } diff --git a/src/DB.php b/src/DB.php index c04d189..1effbf0 100644 --- a/src/DB.php +++ b/src/DB.php @@ -42,7 +42,7 @@ class DB if (! empty($criteria) && ! is_null($exists)) { foreach (get_object_vars($entity) as $key => $value) { - $exists->$key = $value; + $exists->$key = $value; } } else { $exists = $entity; diff --git a/src/Model/Card.php b/src/Model/Card.php index 59d2639..934fc2d 100644 --- a/src/Model/Card.php +++ b/src/Model/Card.php @@ -99,28 +99,35 @@ class Card * * @return string */ - public function getMeta(string $key): ?string + public function getMetaValue(string $key): ?string + { + return $this->getMeta($key)->value ?? null; + } + + /** + * @param string $key + * + * @return CardMeta + */ + public function getMeta(string $key): ?CardMeta { // if meta is already hydrated if ($this->meta->isInitialized()) { $meta = $this->meta->unwrap() #->findFirst(fn (CardMeta $item) => $item->key === $key); ->filter(fn ($item) => $item->key === $key)->first(); - return $meta->value ?? null; + return $meta ?? null; } // get directly from db otherwise $result = DB::$entityManager - ->createQuery( - 'SELECT cm.value - FROM Elements\Model\CardMeta cm - WHERE cm.key = :key AND cm.card = :card' - ) - ->setParameter('key', $key) - ->setParameter('card', $this) - ->getOneOrNullResult(); + ->getRepository(CardMeta::class) + ->findOneBy([ + 'key' => $key, + 'card' => $this + ]); - return $result['value'] ?? null; + return $result ?? null; } /** @@ -128,7 +135,7 @@ class Card */ public function getAllMeta() { - // TODO: do we need this? + // TODO: change! // if meta is already hydrated if ($this->meta->isInitialized()) { return $this->meta; @@ -152,7 +159,7 @@ class Card */ public function getAllArtworks() { - // TODO: do we need this? + // TODO: change! // if artworks are already hydrated if ($this->artworks->isInitialized()) { return $this->artworks; diff --git a/src/Model/Vote.php b/src/Model/Vote.php index c5415aa..273a7d8 100644 --- a/src/Model/Vote.php +++ b/src/Model/Vote.php @@ -26,5 +26,13 @@ class Vote * @Column(type="integer") */ public int $value; + + /** + * Vote constructor. + */ + public function __contruct(int $value) + { + $this->value = $value; + } } diff --git a/src/Model/VoteCard.php b/src/Model/VoteCard.php index e9b3e60..292789f 100644 --- a/src/Model/VoteCard.php +++ b/src/Model/VoteCard.php @@ -22,5 +22,10 @@ class VoteCard extends Vote * @ManyToOne(targetEntity="Card", inversedBy="votes", cascade={"persist"}) */ public Card $card; + + public function __contruct(int $value) + { + $this->card = $card; + } } diff --git a/src/Router.php b/src/Router.php index aad6122..46e3f4f 100644 --- a/src/Router.php +++ b/src/Router.php @@ -31,12 +31,14 @@ class Router $this->addRoute('GET', '/dashboard', [Home::class, 'dashboard']); // card - $this->addRoute('GET', '/card/list', [Card::class, 'listCards']); + $this->addRoute('GET', '/card', [Card::class, 'listCards']); $this->addRoute('GET', '/card/add', [Card::class, 'addCard']); - $this->addRoute('GET', '/card/{id}', [Card::class, 'displayCard']); + $this->addRoute('GET', '/card/{id}', [Card::class, 'viewCard']); $this->addRoute('GET', '/card/{id}/edit', [Card::class, 'editCard']); + $this->addRoute('GET', '/card/{id}/artwork/{artworkId}', [Card::class, 'viewArtwork']); $this->addRoute('POST', '/card/add', [Card::class, 'add']); $this->addRoute('POST', '/card/{id}/edit', [Card::class, 'edit']); + $this->addRoute('POST', '/card/{id}/vote', [Card::class, 'vote']); $context = new RequestContext(); $context->fromRequest($request); diff --git a/templates/artwork/artwork_template.twig b/templates/artwork/artwork_template.twig new file mode 100644 index 0000000..fe55f6a --- /dev/null +++ b/templates/artwork/artwork_template.twig @@ -0,0 +1,54 @@ +{% if artworkSettings.isPreview == true %} +
+ {% if artworkSettings.artworkHeader != "" %} +

{{ artworkSettings.artworkHeader }}

+ {% endif %} + +
+
+ {% if artworkSettings.isVotable == true %} + + + {{ artwork.getVotesTotal() }} + + {% endif %} +
+
+
+ +
+
+ +
+
+
+
+{% else %} +
+

Artwork

+
+ +
+ + + +
+ +
+
+
+ {% if artworkSettings.isVotable == true %} + + + {{ artwork.getVotesTotal() }} + + {% endif %} +
+
+
+ +
+
+
+
+{% endif %} diff --git a/templates/artwork/artwork_view.twig b/templates/artwork/artwork_view.twig new file mode 100644 index 0000000..3eb1c65 --- /dev/null +++ b/templates/artwork/artwork_view.twig @@ -0,0 +1,10 @@ +{% extends 'card/card.twig' %} + +{% block pagecontent %} + {% set artworkSettings = { + "artworkHeader": "", + "isPreview": false, + "isVotable": true + } %} + {{ include('artwork/artwork_template.twig') }} +{% endblock %} \ No newline at end of file diff --git a/templates/base.twig b/templates/base.twig index 758b6f8..825c09c 100644 --- a/templates/base.twig +++ b/templates/base.twig @@ -4,21 +4,37 @@ {{ parent() }} + + + + + +{% endblock %} - - +{% block js %} + {{ parent() }} + + + + + + {% endblock %} {% block body %}

Elements

{% block subtitle %}{% endblock %}

@@ -27,6 +43,6 @@ {% block main %}{% endblock %} {% endblock %} diff --git a/templates/card/card.twig b/templates/card/card.twig index fcf6bd0..211f6e3 100644 --- a/templates/card/card.twig +++ b/templates/card/card.twig @@ -4,13 +4,14 @@ Cards {% endblock %} {% block main %} -
- +
+ + -
-
-

{% block pagetitle %}{% endblock %}

-
+
{% block pagecontent %}{% endblock %} diff --git a/templates/card/card_add.twig b/templates/card/card_add.twig index db91fc4..0a90aea 100644 --- a/templates/card/card_add.twig +++ b/templates/card/card_add.twig @@ -1,47 +1,24 @@ {% extends 'card/card.twig' %} {% block pagetitle %} - Edit Card + Add Card {% endblock %} {% block pagecontent %}
-
- {% for meta in card.meta %} + + {% for key, field in fields %}

-
- +
+

{% endfor %} - + +

Artworks

+ + +
{% endblock %} -{% block pagetitle %} - Add Card -{% endblock %} -{% block pagecontent %} -
- {% for key, field in fields %} -

-
- -

- {% endfor %} - - - -

Artworks

- - - -
-{% endblock %} diff --git a/templates/card/card_display.twig b/templates/card/card_display.twig deleted file mode 100644 index 7b2ed3e..0000000 --- a/templates/card/card_display.twig +++ /dev/null @@ -1,48 +0,0 @@ -{% extends 'card/card.twig' %} - -{% block pagetitle %} - Show Card -{% endblock %} -{% block pagecontent %} -
- -
- -
-
-
- - {{ card.getVotesTotal() }} - -
-
- {% for meta in card.meta %} -

-
- -

- {% endfor %} -
-
-
- -
-

Artworks

-
- - {% for artwork in card.artworks %} -
-
-
- - {{ artwork.getVotesTotal() }} - -
-
- - -
-
-
- {% endfor %} -{% endblock %} diff --git a/templates/card/card_edit.twig b/templates/card/card_edit.twig index b066437..4d13efa 100644 --- a/templates/card/card_edit.twig +++ b/templates/card/card_edit.twig @@ -1,36 +1,24 @@ {% extends 'card/card.twig' %} -{% block pagetitle %} - Edit Card -{% endblock %} {% block pagecontent %} +
+

Edit Card

+
+ +
+ +
+
{% for meta in card.meta %}


- +

{% endfor %}
- -
-

Edit Artworks

-
- -
- -
- - {% for artwork in card.artworks %} -
- - - -
- {% endfor %} - {% endblock %} \ No newline at end of file diff --git a/templates/card/card_list.twig b/templates/card/card_list.twig index b6d8bbe..a233df9 100644 --- a/templates/card/card_list.twig +++ b/templates/card/card_list.twig @@ -1,38 +1,17 @@ {% extends 'card/card.twig' %} -{% block pagetitle %} -List -{% endblock %} {% block pagecontent %} +
+

Cards

+
+ {% for card in cards %} -
-
-
- - {{ card.getVotesTotal() }} - -
-
- - - - {% for meta in card.getAllMeta() %} - - {% endfor %} - - - - - {% for meta in card.getAllMeta() %} - - {% endfor %} - - -
{{ meta.key }}
{{ meta.value }}
- - -
-
-
+ {% set cardSettings = { + "cardHeader": "", + "isPreview": true, + "isVotable": true, + "showArtworks": true + } %} + {{ include('card/card_template.twig') }} {% endfor %} {% endblock %} diff --git a/templates/card/card_meta_template.twig b/templates/card/card_meta_template.twig new file mode 100644 index 0000000..d57cdd8 --- /dev/null +++ b/templates/card/card_meta_template.twig @@ -0,0 +1,21 @@ +
+
+
+ + +
+ {{ card.getVotesTotal() }} +
+ + +
+
+
+ {% for meta in card.meta %} +

+
+ +

+ {% endfor %} +
+
\ No newline at end of file diff --git a/templates/card/card_template.twig b/templates/card/card_template.twig new file mode 100644 index 0000000..411ec2f --- /dev/null +++ b/templates/card/card_template.twig @@ -0,0 +1,103 @@ +{% if cardSettings.isPreview == true %} +
+ {% if cardSettings.cardHeader != "" %} +

{{ cardSettings.cardHeader }}

+ {% endif %} + +
+
+ {% if cardSettings.isVotable == true %} +
+ + +
+ {{ card.getVotesTotal() }} +
+ + +
+ {% endif %} +
+
+ {% for meta in card.meta %} +

+
+ +

+ {% endfor %} + + {% if cardSettings.showArtworks == true %} + {% if card.artworks|length > 0 %} +
+
+
    + {% for artwork in card.artworks %} +
  • + +
  • + {% endfor %} +
+
+
+ {% endif %} + {% endif %} + + +
+
+
+{% else %} +
+

Card

+
+ +
+ +
+ +
+
+
+ {% if cardSettings.isVotable == true %} +
+ + +
+ {{ card.getVotesTotal() }} +
+ + +
+ {% endif %} +
+
+ {% for meta in card.meta %} +

+
+ +

+ {% endfor %} +
+
+
+ + {% if cardSettings.showArtworks == true %} +
+

Artworks

+
+ +
+ + +
+ + {% for artwork in card.artworks %} + {% set artworkSettings = { + "artworkHeader": "", + "isPreview": true, + "isVotable": true + } %} + {{ include('artwork/artwork_template.twig') }} + {% endfor %} + {% endif %} +{% endif %} diff --git a/templates/card/card_view.twig b/templates/card/card_view.twig new file mode 100644 index 0000000..3b84b26 --- /dev/null +++ b/templates/card/card_view.twig @@ -0,0 +1,11 @@ +{% extends 'card/card.twig' %} + +{% block pagecontent %} + {% set cardSettings = { + "cardHeader": "", + "isPreview": false, + "isVotable": true, + "showArtworks": true + } %} + {{ include('card/card_template.twig') }} +{% endblock %} diff --git a/templates/dashboard.twig b/templates/dashboard.twig index 97534bf..0e10193 100644 --- a/templates/dashboard.twig +++ b/templates/dashboard.twig @@ -4,39 +4,41 @@ Dashboard {% endblock %} {% block main %} -
+

Hello World

-
-
+ + +

Cards

-
-
-

Card of the day

-
-
- - {{ cardOfTheDay.getVotesTotal() }} - -
-
- {% for meta in cardOfTheDay.meta %} -

-
- -

- {% endfor %} -
- - -
-
+ + + {% set card = cardOfTheDay %} + {% set cardSettings = { + "cardHeader": "Card Of The Day", + "isPreview": true, + "isVotable": true, + "showArtworks": true + } %} + {{ include('card/card_template.twig') }} + + + + + + {% endblock %} diff --git a/templates/root.twig b/templates/root.twig index 9c3534e..8be64dd 100644 --- a/templates/root.twig +++ b/templates/root.twig @@ -1,14 +1,11 @@ - + + Elements - {% block css %}{% endblock %} -{% block body %}{% endblock %} - -{% block js %}{% endblock %} + {% block body %}{% endblock %} + {% block js %}{% endblock %} \ No newline at end of file -- cgit v1.2.3