From 254add244db159d251ccce1b9bb3fc0bef3df36b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20H=C3=BCbner?= Date: Thu, 13 Apr 2017 18:54:28 +0200 Subject: [PATCH] Add asset images --- app/Resources/assets/images/brickset_logo.png | Bin 0 -> 5427 bytes .../assets/images/rebrickable_logo.png | Bin 0 -> 15991 bytes app/Resources/assets/style/main.scss | 45 +++- app/Resources/views/base.html.twig | 60 +++--- app/Resources/views/default/index.html.twig | 12 +- app/Resources/views/html.html.twig | 2 +- app/Resources/views/model/detail.html.twig | 163 ++++++++------ app/Resources/views/model/index.html.twig | 13 +- .../views/rebrickable/color/index.html.twig | 2 +- .../views/rebrickable/part/index.html.twig | 25 +++ .../views/rebrickable/set/parts.html.twig | 14 +- .../views/rebrickable/set/sets.html.twig | 16 ++ app/Resources/views/set/detail.html.twig | 198 +++++++++++------- gulpfile.js | 7 +- .../Controller/Rebrickable/SetController.php | 54 ++--- src/AppBundle/Controller/SetController.php | 117 +++++------ 16 files changed, 437 insertions(+), 291 deletions(-) create mode 100644 app/Resources/assets/images/brickset_logo.png create mode 100644 app/Resources/assets/images/rebrickable_logo.png create mode 100644 app/Resources/views/rebrickable/part/index.html.twig create mode 100644 app/Resources/views/rebrickable/set/sets.html.twig diff --git a/app/Resources/assets/images/brickset_logo.png b/app/Resources/assets/images/brickset_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..f1eee4d95867227d2a715ae8dc20e69cc11791c7 GIT binary patch literal 5427 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 l&HrmS {{ knp_menu_render('mainMenu') }} -
-
-
- - + {% endblock page %} {% endblock %} \ No newline at end of file diff --git a/app/Resources/views/default/index.html.twig b/app/Resources/views/default/index.html.twig index 918e8e0..4222685 100644 --- a/app/Resources/views/default/index.html.twig +++ b/app/Resources/views/default/index.html.twig @@ -1,6 +1,14 @@ {% extends 'base.html.twig' %} -{% block content %} - +{% block page %} +
+
+
+
+ Hello, world! +
+
+
+
{% endblock %} diff --git a/app/Resources/views/html.html.twig b/app/Resources/views/html.html.twig index 4e28c53..0c017fd 100644 --- a/app/Resources/views/html.html.twig +++ b/app/Resources/views/html.html.twig @@ -8,7 +8,7 @@ {% endblock %} - + {% block body %} {% endblock %} diff --git a/app/Resources/views/model/detail.html.twig b/app/Resources/views/model/detail.html.twig index 8d33ad5..67fe580 100644 --- a/app/Resources/views/model/detail.html.twig +++ b/app/Resources/views/model/detail.html.twig @@ -2,82 +2,111 @@ {% import 'macros/elements.html.twig' as elements %} -{% block title %}{{ model.name }}{% endblock %} +{% block title %}#{{ model.number }} - {{ model.name }}{% endblock %} -{% block header %}{{ model.name }}{% endblock %} +{% block header %}#{{ model.number }} - {{ model.name }}{% endblock %} {% block content %} -
- +
+
+
+ +
+
+
+
+ + + + + + + + + + +
category{{ model.category ? model.category.name }}
model{{ model.path }}
author{{ model.author }}
+ +
+
keywords:
+
+ {% for keyword in model.keywords %} + {{ keyword.name }} + {% endfor %} +
+
aliases:
+
+ {% for alias in model.aliases %} + {{ alias.number }}{% if not loop.last %},{% endif %} + {% endfor %} +
+
Download:
+
{{ model.number }}
+
rebrickable parts ({{ rbParts|length }}):
+
+ {#

#} + {#

#} + {#{% for alias in rbParts %}#} + {#{{ alias.number }}#} + {#{% endfor %}#} + {#
#} + {#

#} +
+
+
+
-
-
number:
{{ model.number }}
-
name:
{{ model.name }}
-
category:
{{ model.category ? model.category.name }}
-
model:
{{ model.path }}
-
author:
{{ model.author }}
-
modified:
{{ model.modified ? model.modified|date('Y-m-d') }}
-
keywords:
-
- {% for keyword in model.keywords %} - {{ keyword.name }} - {% endfor %} -
-
aliases:
-
- {% for alias in model.aliases %} - {{ alias.number }} - {% endfor %} -
-
Download:
-
{{ model.number }}
-
rebrickable parts ({{ rbParts|length }}):
-
-

-

- {% for alias in rbParts %} - {{ alias.number }} - {% endfor %} + + +

+ Subparts of this model +

+ +
+ {% for subpart in model.subparts %} +
+ {{ elements.part(subpart.subpart) }}
-

-
-
- -
-

- Subparts of this model -

- -
- {% for subpart in model.subparts %} -
- {{ elements.part(subpart.subpart) }} -
- {% endfor %} -
- -

- Model is subpart of -

- -
- {% for subpart in model.parents %} -
- {{ elements.part(subpart.parent) }} -
- {% endfor %} -
- -

- Sets ({{ sets|length }}) -

- - {% for set in sets %} - {{ set.number }} {% endfor %}
+ +

+ Model is subpart of +

+ +
+ {% for subpart in model.parents %} +
+ {{ elements.part(subpart.parent) }} +
+ {% endfor %} +
+ + +

+ Related +

+ +
+ {% for subpart in related %} +
+ {{ elements.part(subpart) }} +
+ {% endfor %} +
+ +

+ Sets ({{ sets|length }}) +

+ + {% for set in sets %} + {{ set.number }} + {% endfor %} + + + {% endblock %} {% block javascripts %} diff --git a/app/Resources/views/model/index.html.twig b/app/Resources/views/model/index.html.twig index 11219bf..f175824 100644 --- a/app/Resources/views/model/index.html.twig +++ b/app/Resources/views/model/index.html.twig @@ -2,7 +2,13 @@ {% import 'macros/elements.html.twig' as elements %} +{% block title %}{{ 'page.model.index' | trans }}{% endblock %} + +{% block header %}{{ 'page.model.index' | trans }}{% endblock %} + {% block content %} +
+
{{ form_start(form) }} @@ -16,8 +22,9 @@
{{ form_end(form) }} - - +
+
+ {{ knp_pagination_render(models) }}

{{ models.getTotalItemCount }}

{% for model in models %} @@ -26,4 +33,6 @@
{{ knp_pagination_render(models) }} +
+
{% endblock %} diff --git a/app/Resources/views/rebrickable/color/index.html.twig b/app/Resources/views/rebrickable/color/index.html.twig index e06398d..560f9f1 100644 --- a/app/Resources/views/rebrickable/color/index.html.twig +++ b/app/Resources/views/rebrickable/color/index.html.twig @@ -2,7 +2,7 @@ {% block content %} - +
diff --git a/app/Resources/views/rebrickable/part/index.html.twig b/app/Resources/views/rebrickable/part/index.html.twig new file mode 100644 index 0000000..9b5a206 --- /dev/null +++ b/app/Resources/views/rebrickable/part/index.html.twig @@ -0,0 +1,25 @@ +{% extends 'base.html.twig' %} + +{% block content %} + +
+
+ {% for part in parts %} + + {% endfor %} +
+
+ +

{{ parts.getTotalItemCount }}

+ + {{ knp_pagination_render(parts) }} +{% endblock %} diff --git a/app/Resources/views/rebrickable/set/parts.html.twig b/app/Resources/views/rebrickable/set/parts.html.twig index 5e52b8c..90b6c2a 100644 --- a/app/Resources/views/rebrickable/set/parts.html.twig +++ b/app/Resources/views/rebrickable/set/parts.html.twig @@ -1,8 +1,9 @@ +{% if regularParts|length > 0 %}

Regular parts

-
+
{% for inventoryPart in regularParts %} {% if inventoryPart.part is defined %}
@@ -12,18 +13,20 @@
-
{{ inventoryPart.part.number }}
{{ inventoryPart.isSpare ? 'Spare' : 'Regular' }}
+
{{ inventoryPart.part.number }}
{% endif %} {% endfor %}
+{% endif %} +{% if spareParts|length > 0 %}

Spare parts

-
+
{% for inventoryPart in spareParts %} {% if inventoryPart.part is defined %}
@@ -33,10 +36,11 @@
-
{{ inventoryPart.part.number }}
{{ inventoryPart.isSpare ? 'Spare' : 'Regular' }}
+
{{ inventoryPart.part.number }}
{% endif %} {% endfor %} -
\ No newline at end of file + +{% endif %} diff --git a/app/Resources/views/rebrickable/set/sets.html.twig b/app/Resources/views/rebrickable/set/sets.html.twig new file mode 100644 index 0000000..593b934 --- /dev/null +++ b/app/Resources/views/rebrickable/set/sets.html.twig @@ -0,0 +1,16 @@ +

Sets

+
+
+ {% for set in inventorySets %} + + {% endfor %} +
+
\ No newline at end of file diff --git a/app/Resources/views/set/detail.html.twig b/app/Resources/views/set/detail.html.twig index 0c2e5d3..6b93a16 100644 --- a/app/Resources/views/set/detail.html.twig +++ b/app/Resources/views/set/detail.html.twig @@ -5,90 +5,134 @@ {% block header %}{{ rbset ? rbset.number }} {{ rbset ? rbset.name }}{% endblock %} {% block content %} - {% if brset %} - Brickset - {% endif %} - - {% if rbset is not null %} - Rebrickable -
-
number:
{{ rbset.number }}
-
year:
{{ rbset.year }}
-
name:
{{ rbset.name }}
-
theme:
{{ rbset.theme.name }}
- {% if rbset.theme.parent %} -
themeparent:
{{ rbset.theme.parent.name }}
- {% if rbset.theme.parent.parent %} -
themeparent:
{{ rbset.theme.parent.parent.name }}
+
+
+
+ {% if brset %} + + {% elseif rbset %} + {% endif %} - {% endif %} -
count of parts:
{{ rbset.partCount }}
-
- {% endif %} + + +
+
+
+ + + + + + + + + + + + {% if rbset %} + + {% elseif brset %} + + {% endif %} + + + + + {% if brset %} + + + + + {% endif %} + {% if rbset %} + + + + + {% endif %} +
number{{ brset ? brset.legoSetID : rbset ? rbset.number : null}}
name{{ brset ? brset.name : rbset ? rbset.name : null}}
year{{ brset ? brset.year : rbset ? rbset.year : null}}
theme{{ rbset.theme.parent ? rbset.theme.parent.name }} {{ rbset.theme.name }} {{ brset.theme }}
parts{{ brset ? brset.pieces : rbset ? rbset.partCount }}
Brickset
Rebrickable
- {% if brset is not null %} -
-
year:
{{ brset.year }}
-
name:
{{ brset.name }}
-
themegroup:
{{ brset.themeGroup }}
-
theme:
{{ brset.theme }}
-
subtheme:
{{ brset.subtheme }}
-
count of parts:
{{ brset.pieces }}
-
lego id:
{{ brset.legoSetID }}
-
minifigs:
{{ brset.minifigs }}
-
description:
{{ brset.description }}
-
- {% endif %} - - {% if brset %} - - {% elseif rbset %} - - {% endif %} - - {#{{ brset ? dump(brset) }}#} - - +
-
- {% if rbset %} - {{ render(controller('AppBundle:Rebrickable/Set:parts', { 'number': rbset.number })) }} -
-
-

- Sets -

+
+ +
+ {% if rbset %} - {% for set in inventorySets %} - - {% endfor %} -
+
+ + {#{{ render(controller('AppBundle:Rebrickable/Set:parts', { 'number': rbset.number })) }}#} + + {% endif %} +
+ {% if brset %} +
+ {#
#} + + {{ render(controller('AppBundle:Brickset/Set:images', { 'id': brset.setID })) }} +
+
+ {#
#} + + {{ render(controller('AppBundle:Brickset/Set:instructions', { 'id': brset.setID })) }} +
+
+ {#
#} + + {{ render(controller('AppBundle:Brickset/Set:reviews', { 'id': brset.setID })) }} +
+
+ {{ brset.description }}
{% endif %}
- {% if brset %} -
- {{ render(controller('AppBundle:Brickset/Set:images', { 'id': brset.setID })) }} -
-
- {{ render(controller('AppBundle:Brickset/Set:instructions', { 'id': brset.setID })) }} -
-
- {{ render(controller('AppBundle:Brickset/Set:reviews', { 'id': brset.setID })) }} -
- {% endif %} + + +{% endblock %} + +{% block javascripts %} + {{ parent() }} + + {% endblock %} \ No newline at end of file diff --git a/gulpfile.js b/gulpfile.js index ea31b09..bc7a03b 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -48,9 +48,10 @@ gulp.task('files:semantic', function () { }); gulp.task('files:images', function () { - return gulp.src( - 'node_modules/lightbox2/dist/images/**' - ) + return gulp.src([ + 'node_modules/lightbox2/dist/images/**', + 'app/Resources/assets/images/**' + ]) .pipe(gulp.dest('web/resources/images')); }); diff --git a/src/AppBundle/Controller/Rebrickable/SetController.php b/src/AppBundle/Controller/Rebrickable/SetController.php index b86ef22..485b543 100644 --- a/src/AppBundle/Controller/Rebrickable/SetController.php +++ b/src/AppBundle/Controller/Rebrickable/SetController.php @@ -33,44 +33,32 @@ class SetController extends Controller $regularParts = $em->getRepository(Inventory_Part::class)->findAllRegularBySetNumber($set->getNumber()); $spareParts = $em->getRepository(Inventory_Part::class)->findAllSpareBySetNumber($set->getNumber()); - return $this->render('rebrickable/set/parts.html.twig', [ + $template = $this->render('rebrickable/set/parts.html.twig', [ 'regularParts' => $regularParts, 'spareParts' => $spareParts, ]); + + $json = json_encode($template->getContent()); + $response = new Response($json, 200); + $response->headers->set('Content-Type', 'application/json'); + return $response; } + /** + * @Route("/{number}/sets", name="rebrickable_set_sets") + */ + public function setsAction(Set $set) { + $em = $this->getDoctrine()->getManager(); -// /** -// * @Route("/download/{number}", name="set_download") -// */ -// public function downloadZipAction(Request $request, $number) { -// $em = $this->getDoctrine()->getManager(); -// -// $inventoryParts = $em->getRepository(Inventory_Part::class)->findAllBySetNumber($number); -// -// $zip = new \ZipArchive(); -// $zipName = 'set_'.$number.'.zip'; -// $zip->open($zipName, \ZipArchive::CREATE); -// /** @var Inventory_Part $part */ -// foreach ($inventoryParts as $part) { -// $filename = $part->getPart()->getNumber().'_('.$part->getColor()->getName().'_'.$part->getQuantity().'x).stl'; -// -// try { -// if($part->getPart()->getModel()) { -// $zip->addFromString($filename, $this->get('oneup_flysystem.media_filesystem')->read($part->getPart()->getModel()->getPath())); -// } -// } catch (\Exception $e) { -// dump($e); -// } -// } -// $zip->close(); -// -// $response = new Response(file_get_contents($zipName)); -// $response->headers->set('Content-Type', 'application/zip'); -// $response->headers->set('Content-Disposition', 'attachment;filename="' . $zipName . '"'); -// $response->headers->set('Content-length', filesize($zipName)); -// -// return $response; -// } + $inventorySets = $em->getRepository(Inventory_Set::class)->findAllBySetNumber($set->getNumber()); + $template = $this->render('rebrickable/set/sets.html.twig', [ + 'inventorySets' => $inventorySets, + ]); + + $json = json_encode($template->getContent()); + $response = new Response($json, 200); + $response->headers->set('Content-Type', 'application/json'); + return $response; + } } diff --git a/src/AppBundle/Controller/SetController.php b/src/AppBundle/Controller/SetController.php index c9bd5f3..14a1137 100644 --- a/src/AppBundle/Controller/SetController.php +++ b/src/AppBundle/Controller/SetController.php @@ -2,6 +2,7 @@ namespace AppBundle\Controller; +use AppBundle\Api\Exception\ApiException; use AppBundle\Api\Exception\EmptyResponseException; use AppBundle\Entity\LDraw\Model; use AppBundle\Entity\Rebrickable\Color; @@ -58,88 +59,64 @@ class SetController extends Controller */ public function detailAction(Request $request, $number) { - $brset = null; - $rbset = null; - $inventorySets = null; - - $inventorySets = $this->getDoctrine()->getManager()->getRepository(Inventory_Set::class)->findAllBySetNumber($number); + $rebrickableSet = null; + $bricksetSet = null; try { - if(($rbset = $this->getDoctrine()->getManager()->getRepository(Set::class)->find($number)) == null) { + if(($rebrickableSet = $this->getDoctrine()->getManager()->getRepository(Set::class)->find($number)) == null) { $this->addFlash('warning', 'Set not found in Rebrickable database'); }; - $brset = $this->get('api.manager.brickset')->getSetByNumber($number); + $bricksetSet = $this->get('api.manager.brickset')->getSetByNumber($number); + dump($bricksetSet); } catch (EmptyResponseException $e) { $this->addFlash('warning', 'Set not found in Brickset database'); + } catch (ApiException $e) { + $this->addFlash('error', $e->getService()); } catch (\Exception $e) { $this->addFlash('error', $e->getMessage()); } + if(!$rebrickableSet && !$bricksetSet) { + return $this->render('error/error.html.twig'); + } + return $this->render('set/detail.html.twig', [ - 'rbset' => $rbset, - 'inventorySets' => $inventorySets, - 'brset' => $brset, + 'rbset' => $rebrickableSet, + 'brset' => $bricksetSet, ]); } -// -// /** -// * @Route("/{number}/parts", name="set_parts") -// */ -// public function partsAction(Set $set) { -// $em = $this->getDoctrine()->getManager(); -// -// $em->getRepository(Color::class)->findAll(); -// $em->getRepository(Part::class)->findAllBySetNumber($set->getNumber()); -// -// $regularParts = $em->getRepository(Inventory_Part::class)->findAllRegularBySetNumber($set->getNumber()); -// $spareParts = $em->getRepository(Inventory_Part::class)->findAllSpareBySetNumber($set->getNumber()); -// -// $count = 0; -// /** @var Inventory_Part $inventoryPart */ -// foreach ($regularParts as $inventoryPart) { -// $count += $inventoryPart->getQuantity(); -// } -// -// dump($count); -// -// return $this->render('rebrickable/set/parts.html.twig', [ -// 'regularParts' => $regularParts, -// 'spareParts' => $spareParts, -// 'totalParts' => $count -// ]); -// } -// -//// /** -//// * @Route("/download/{number}", name="set_download") -//// */ -//// public function downloadZipAction(Request $request, $number) { -//// $em = $this->getDoctrine()->getManager(); -//// -//// $inventoryParts = $em->getRepository(Inventory_Part::class)->findAllBySetNumber($number); -//// -//// $zip = new \ZipArchive(); -//// $zipName = 'set_'.$number.'.zip'; -//// $zip->open($zipName, \ZipArchive::CREATE); -//// /** @var Inventory_Part $part */ -//// foreach ($inventoryParts as $part) { -//// $filename = $part->getPart()->getNumber().'_('.$part->getColor()->getName().'_'.$part->getQuantity().'x).stl'; -//// -//// try { -//// if($part->getPart()->getModel()) { -//// $zip->addFromString($filename, $this->get('oneup_flysystem.media_filesystem')->read($part->getPart()->getModel()->getPath())); -//// } -//// } catch (\Exception $e) { -//// dump($e); -//// } -//// } -//// $zip->close(); -//// -//// $response = new Response(file_get_contents($zipName)); -//// $response->headers->set('Content-Type', 'application/zip'); -//// $response->headers->set('Content-Disposition', 'attachment;filename="' . $zipName . '"'); -//// $response->headers->set('Content-length', filesize($zipName)); -//// -//// return $response; -//// } + + /** + * @Route("/{number}/download", name="set_download") + */ + public function downloadZipAction(Request $request, $number) { + $em = $this->getDoctrine()->getManager(); + + $inventoryParts = $em->getRepository(Inventory_Part::class)->findAllRegularBySetNumber($number); + + $zip = new \ZipArchive(); + $zipName = 'set_'.$number.'.zip'; + $zip->open($zipName, \ZipArchive::CREATE); + /** @var Inventory_Part $part */ + foreach ($inventoryParts as $part) { + $filename = $part->getPart()->getNumber().'_('.$part->getColor()->getName().'_'.$part->getQuantity().'x).stl'; + + try { + if($part->getPart()->getModel()) { + $zip->addFromString($filename, $this->get('oneup_flysystem.media_filesystem')->read($part->getPart()->getModel()->getPath())); + } + } catch (\Exception $e) { + dump($e); + } + } + $zip->close(); + + $response = new Response(file_get_contents($zipName)); + $response->headers->set('Content-Type', 'application/zip'); + $response->headers->set('Content-Disposition', 'attachment;filename="' . $zipName . '"'); + $response->headers->set('Content-length', filesize($zipName)); + + return $response; + } }