diff --git a/app/Resources/assets/js/ajax.js b/app/Resources/assets/js/ajax.js new file mode 100644 index 0000000..32c95f8 --- /dev/null +++ b/app/Resources/assets/js/ajax.js @@ -0,0 +1,13 @@ +$(document).ready(function () { + $('.ajax-load').each(function () { + $self = $(this); + + $.ajax({ + dataType: "json", + url: $self.data('src'), + context: $self + }).done(function(data) { + $(this).html(data); + }); + }) +}); \ No newline at end of file diff --git a/app/Resources/assets/js/style.js b/app/Resources/assets/js/style.js index b3d57cb..6a86128 100644 --- a/app/Resources/assets/js/style.js +++ b/app/Resources/assets/js/style.js @@ -1,4 +1,4 @@ -$(document).ready(function () { +$(document).bind('ready ajaxComplete', function(){ $('.ui.dropdown') .dropdown() ; diff --git a/app/Resources/views/ajax.html.twig b/app/Resources/views/ajax.html.twig new file mode 100644 index 0000000..42aa693 --- /dev/null +++ b/app/Resources/views/ajax.html.twig @@ -0,0 +1,10 @@ +{% import 'macros/blocks.html.twig' as blocks %} +{% import 'macros/elements.html.twig' as elements %} + +{% for label, flashes in app.session.flashbag.all %} + {% for flash in flashes %} + {{ elements.flash(label,flash) }} + {% endfor %} +{% endfor %} + +{% block content %}{% endblock %} \ No newline at end of file diff --git a/app/Resources/views/brickset/browse.html.twig b/app/Resources/views/brickset/browse.html.twig deleted file mode 100644 index 70cd9a4..0000000 --- a/app/Resources/views/brickset/browse.html.twig +++ /dev/null @@ -1,58 +0,0 @@ -{% extends 'base.html.twig' %} - -{% block content %} - - {{ form_start(form) }} -
- {{ form_row(form.theme) }} - {{ form_row(form.subtheme) }} - {{ form_row(form.years) }} -
- - -
-
- {{ form_end(form) }} - -

{{ sets|length }}

- -
-
- {% for set in sets %} - - {% endfor %} -
-
-{% endblock %} - -{% block javascripts %} - {{ parent() }} - -{% endblock %} \ No newline at end of file diff --git a/app/Resources/views/brickset/description.html.twig b/app/Resources/views/brickset/description.html.twig new file mode 100644 index 0000000..3903491 --- /dev/null +++ b/app/Resources/views/brickset/description.html.twig @@ -0,0 +1,9 @@ +{% extends 'ajax.html.twig' %} + +{% block content %} + {% if description|length %} + {{ description|raw }} + {% else %} + {{ blocks.empty('empty.description'|trans) }} + {% endif %} +{% endblock %} \ No newline at end of file diff --git a/app/Resources/views/brickset/images.html.twig b/app/Resources/views/brickset/images.html.twig index 7434637..0e1f501 100644 --- a/app/Resources/views/brickset/images.html.twig +++ b/app/Resources/views/brickset/images.html.twig @@ -1,9 +1,17 @@ -
- {% for image in images %} -
- - - +{% extends 'ajax.html.twig' %} + +{% block content %} + {% if images|length %} +
+ {% for image in images %} +
+ + + +
+ {% endfor %}
- {% endfor %} -
\ No newline at end of file + {% else %} + {{ blocks.empty('empty.images') }} + {% endif %} +{% endblock %} \ No newline at end of file diff --git a/app/Resources/views/brickset/instructions.html.twig b/app/Resources/views/brickset/instructions.html.twig index be0d271..20fd05c 100644 --- a/app/Resources/views/brickset/instructions.html.twig +++ b/app/Resources/views/brickset/instructions.html.twig @@ -1,28 +1,30 @@ -{% if instructions|length != 0 %} -

- {{ 'set.instructions.text' | trans }} -

+{% extends 'ajax.html.twig' %} - - - - - - - - - - {% for instruction in instructions %} +{% block content %} + {% if instructions|length != 0 %} +

+ {{ 'set.instructions.text' | trans }} +

+ +
{{ 'set.instructions.description' | trans }}{{ 'set.instructions.filesize' | trans }}{{ 'set.instructions.filename' | trans }}
+ - - - + + + - {% endfor %} - -
{{ instruction.description }}{{ remoteSize(instruction.uRL) | bytesToSize }}{{ remoteFilename(instruction.uRL) }}{{ 'set.instructions.description' | trans }}{{ 'set.instructions.filesize' | trans }}{{ 'set.instructions.filename' | trans }}
-{% else %} -

- -

-{% endif %} \ No newline at end of file + + + {% for instruction in instructions %} + + {{ instruction.description }} + {{ remoteSize(instruction.uRL) | bytesToSize }} + {{ remoteFilename(instruction.uRL) }} + + {% endfor %} + + + {% else %} + {{ blocks.empty('empty.instructions') }} + {% endif %} +{% endblock %} \ No newline at end of file diff --git a/app/Resources/views/brickset/reviews.html.twig b/app/Resources/views/brickset/reviews.html.twig index d50a23f..efdc0c8 100644 --- a/app/Resources/views/brickset/reviews.html.twig +++ b/app/Resources/views/brickset/reviews.html.twig @@ -1,27 +1,37 @@ -
- {% for review in reviews|slice(0, 3) %} -
- - {##} - -
-
-

{{ review.title }}

-
- {{ review.author }} {{ review.hTML }} - - {% endfor %} -
\ No newline at end of file + {% else %} + {{ blocks.empty('empty.reviews') }} + {% endif %} +{% endblock %} \ No newline at end of file diff --git a/app/Resources/views/macros/blocks.html.twig b/app/Resources/views/macros/blocks.html.twig new file mode 100644 index 0000000..7f50f4b --- /dev/null +++ b/app/Resources/views/macros/blocks.html.twig @@ -0,0 +1,43 @@ +{% macro modelImageMin(model, color) %} +
+ +
+{% endmacro %} + +{% macro modelImageLarge(model, color) %} +
+ +
+{% endmacro %} + +{% macro model(model, quantity) %} + +{% endmacro %} + +{% macro part(part, quantity, color = -1) %} + +{% endmacro %} + +{% macro empty(message) %} +

{{ message }}

+{% endmacro %} + +{% macro ccal2_license(title,author) %} + "{{ title }}" by {{ author }}, used under CC BY 2.0 / Converted to stl from original +{% endmacro %} diff --git a/app/Resources/views/macros/elements.html.twig b/app/Resources/views/macros/elements.html.twig index 24094dd..b9d710d 100644 --- a/app/Resources/views/macros/elements.html.twig +++ b/app/Resources/views/macros/elements.html.twig @@ -1,16 +1,3 @@ -{% macro part(model) %} - -{% endmacro %} - {% macro flash(type,message) %} {% if type == 'error' %} {% set icon = 'ban' %} @@ -26,7 +13,6 @@ {% set title = 'flash.info.title' %} {% endif %} -
diff --git a/app/Resources/views/rebrickable/set/sets.html.twig b/app/Resources/views/rebrickable/set/sets.html.twig deleted file mode 100644 index 593b934..0000000 --- a/app/Resources/views/rebrickable/set/sets.html.twig +++ /dev/null @@ -1,16 +0,0 @@ -

Sets

-
-
- {% for set in inventorySets %} - - {% endfor %} -
-
\ No newline at end of file diff --git a/app/Resources/views/set/colors.html.twig b/app/Resources/views/set/colors.html.twig new file mode 100644 index 0000000..9c4aefd --- /dev/null +++ b/app/Resources/views/set/colors.html.twig @@ -0,0 +1,20 @@ +{% extends 'ajax.html.twig' %} + +{% block content %} + {% if colors|length > 0 %} + {% for color in colors %} +
+ {{ color['color'].name }} ({{ color['quantity'] }}) +
+
+ +
+ {% for model in color['models'] %} + {{ blocks.model(model['model'],model['quantity']) }} + {% endfor %} +
+
+ {% endfor %} + {% endif %} + +{% endblock %} \ 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 d00d335..12ba339 100644 --- a/app/Resources/views/set/detail.html.twig +++ b/app/Resources/views/set/detail.html.twig @@ -1,8 +1,8 @@ {% extends 'base.html.twig' %} -{% block title %}{{ rbset ? rbset.number }} {{ rbset ? rbset.name }}{% endblock %} +{% block title %}{{ set ? set.number }} {{ set ? set.name }}{% endblock %} -{% block header %}{{ rbset ? rbset.number }} {{ rbset ? rbset.name | escape('html') }}{% endblock %} +{% block header %}{{ set ? set.number }} {{ set ? set.name | escape('html') }}{% endblock %} {% block content %} @@ -11,66 +11,66 @@
{% if brset %} - {% elseif rbset %} - + {% else %} + {% endif %}
-
+
- + - + - + - - {% if rbset %} - + + {% if set %} + {% elseif brset %} {% endif %} - {% if brset %} - - + + + + + + {% endif %} - {% if rbset %} - + - {% endif %}
number{{ brset ? brset.legoSetID : rbset ? rbset.number : null}}{{ 'set.number' | trans }}{{ brset ? brset.legoSetID : set ? set.number : null}}
name{{ brset ? brset.name : rbset ? rbset.name : null}}{{ 'set.name' | trans }}{{ brset ? brset.name : set ? set.name : null}}
year{{ brset ? brset.year : rbset ? rbset.year : null}}{{ 'set.year' | trans }}{{ brset ? brset.year : set ? set.year : null}}
theme{{ rbset.theme.parent ? rbset.theme.parent.name }} {{ rbset.theme.name }} {{ 'set.theme' | trans }}{{ set.theme.parent ? set.theme.parent.name }} {{ set.theme.name }} {{ brset.theme }}
parts - {{ rbset ? rbset.partCount }} {{ brset ? '('~brset.pieces~')' }} + {{ 'set.parts' | trans }} + {{ set ? set.partCount }} {{ brset ? '('~brset.pieces~')' }}
Brickset{{ 'set.minifigs' | trans }}{{ brset.minifigs }}
{{ 'set.rating' | trans }} + {{ brset.rating }}/5 +
Rebrickable + Rebrickable + {% if brset %} + Brickset + {% endif %} +
- {#{% if brset is not null %}#} - {#
#} - {#
themegroup:
{{ brset.themeGroup }}
#} - {#
theme:
{{ brset.theme }}
#} - {#
subtheme:
{{ brset.subtheme }}
#} - {#
count of parts:
{{ brset.pieces }}
#} - {#
minifigs:
{{ brset.minifigs }}
#} - {#
#} - {#{% endif %}#}
- {% if rbset %} +
+
+
- {#
#} - - {{ render(controller('AppBundle:Rebrickable/Set:parts', { 'number': rbset.number })) }} - - {% endif %} + {#{{ render(path('set_colors', {number: set.number})) }}#}
{% 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|raw }} +
+
{% endif %}
-{% endblock %} - -{% block javascripts %} - {{ parent() }} - - {% endblock %} \ No newline at end of file diff --git a/app/Resources/views/set/index.html.twig b/app/Resources/views/set/index.html.twig index 17a2193..5653de3 100644 --- a/app/Resources/views/set/index.html.twig +++ b/app/Resources/views/set/index.html.twig @@ -32,22 +32,21 @@
-
-
- {% for set in sets %} - - {% endfor %} +
+
+
+ {% for set in sets %} + + {% endfor %} +
- -

{{ sets.getTotalItemCount }}

- {{ knp_pagination_render(sets) }}
@@ -57,4 +56,6 @@ {% block javascripts %} {{ parent() }} + + {% endblock %} \ No newline at end of file diff --git a/app/Resources/views/set/inventory.html.twig b/app/Resources/views/set/inventory.html.twig new file mode 100644 index 0000000..597f347 --- /dev/null +++ b/app/Resources/views/set/inventory.html.twig @@ -0,0 +1,37 @@ +{% extends 'ajax.html.twig' %} + +{% block content %} + {% if regularParts|length > 0 %} +

+ Regular parts +

+ +
+ {% for inventoryPart in regularParts %} + {{ blocks.part(inventoryPart.part,inventoryPart.quantity, inventoryPart.color) }} + {% endfor %} +
+ {% endif %} + + {% if missing|length > 0 %} +

+ Missing models +

+
+ {% for inventoryPart in missing %} + {{ blocks.part(inventoryPart.part,inventoryPart.quantity, inventoryPart.color) }} + {% endfor %} +
+ {% endif %} + + {% if spareParts|length > 0 %} +

+ Spare parts +

+
+ {% for inventoryPart in spareParts %} + {{ blocks.part(inventoryPart.part,inventoryPart.quantity, inventoryPart.color) }} + {% endfor %} +
+ {% endif %} +{% endblock %} \ No newline at end of file diff --git a/app/Resources/views/set/models.html.twig b/app/Resources/views/set/models.html.twig new file mode 100644 index 0000000..07a3c8c --- /dev/null +++ b/app/Resources/views/set/models.html.twig @@ -0,0 +1,56 @@ +{% extends 'ajax.html.twig' %} + +{% block content %} + {% if models|length > 0 %} +

+ Regular parts +

+
+
+ {% for model in models %} + {{ blocks.model(model['model'],model['quantity']) }} + {% endfor %} +
+
+ {% endif %} + + {% if missing|length > 0 %} +

+ Missing regular models +

+
+
+ {% for inventoryPart in missing %} + {{ blocks.part(inventoryPart.part,inventoryPart.quantity) }} + {% endfor %} +
+
+ {% endif %} + + {% if spareModels|length > 0 %} +

+ Spare parts +

+ +
+
+ {% for model in spareModels %} + {{ blocks.model(model['model'],model['quantity']) }} + {% endfor %} +
+
+ {% endif %} + + {% if missingSpare|length > 0 %} +

+ Missing spare models +

+
+
+ {% for inventoryPart in missingSpare %} + {{ blocks.part(inventoryPart.part,inventoryPart.quantity) }} + {% endfor %} +
+
+ {% endif %} +{% endblock %} \ No newline at end of file diff --git a/app/Resources/views/set/sets.html.twig b/app/Resources/views/set/sets.html.twig new file mode 100644 index 0000000..d5962d3 --- /dev/null +++ b/app/Resources/views/set/sets.html.twig @@ -0,0 +1,20 @@ +{% extends 'ajax.html.twig' %} + +{% block content %} +

Sets

+
+
+ {% for set in inventorySets %} + + {% endfor %} +
+
+{% endblock %} \ No newline at end of file diff --git a/src/AppBundle/Controller/Brickset/SetController.php b/src/AppBundle/Controller/Brickset/SetController.php index 25336ee..8adfbf2 100644 --- a/src/AppBundle/Controller/Brickset/SetController.php +++ b/src/AppBundle/Controller/Brickset/SetController.php @@ -4,49 +4,16 @@ namespace AppBundle\Controller\Brickset; use AppBundle\Api\Exception\EmptyResponseException; use AppBundle\Entity\Rebrickable\Set; -use AppBundle\Entity\Rebrickable\Theme; -use AppBundle\Form\FilterSetType; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; use Symfony\Bundle\FrameworkBundle\Controller\Controller; use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\HttpFoundation\Response; /** * @Route("/brickset/sets") */ class SetController extends Controller { - /** - * @Route("/", name="brickset_browse") - */ - public function browseAction(Request $request) - { - $form = $this->createForm(FilterSetType::class); - - $form->handleRequest($request); - - $sets = []; - if ($form->isSubmitted() && $form->isValid()) { - $data = $form->getData(); - - try { - $sets = $this->get('api.client.brickset')->getSets([ - 'theme' => $data['theme'] ? $data['theme']->getTheme() : '', - 'subtheme' => $data['subtheme'] ? $data['subtheme']->getSubtheme() : '', - 'year' => $data['years'] ? $data['years']->getYear() : '', - ]); - } catch (EmptyResponseException $e) { - $this->addFlash('warning', 'No set found on '.$e->getService()); - } catch (\Exception $e) { - $this->addFlash('error', $e->getMessage()); - } - } - - return $this->render('brickset/browse.html.twig', [ - 'form' => $form->createView(), - 'sets' => $sets, - ]); - } - /** * @Route("/{id}/instructions", name="brickset_instructions") */ @@ -61,9 +28,19 @@ class SetController extends Controller $this->addFlash('error', $e->getMessage()); } - return $this->render('brickset/instructions.html.twig', [ + $template = $this->render('brickset/instructions.html.twig', [ 'instructions' => $instructions, ]); + + if ($request->isXmlHttpRequest()) { + $json = json_encode($template->getContent()); + $response = new Response($json, 200); + $response->headers->set('Content-Type', 'application/json'); + + return $response; + } + + return $template; } /** @@ -80,9 +57,19 @@ class SetController extends Controller $this->addFlash('error', $e->getMessage()); } - return $this->render('brickset/reviews.html.twig', [ + $template = $this->render('brickset/reviews.html.twig', [ 'reviews' => $reviews, ]); + + if ($request->isXmlHttpRequest()) { + $json = json_encode($template->getContent()); + $response = new Response($json, 200); + $response->headers->set('Content-Type', 'application/json'); + + return $response; + } + + return $template; } /** @@ -99,8 +86,47 @@ class SetController extends Controller $this->addFlash('error', $e->getMessage()); } - return $this->render('brickset/images.html.twig', [ + $template = $this->render('brickset/images.html.twig', [ 'images' => $images, ]); + + if ($request->isXmlHttpRequest()) { + $json = json_encode($template->getContent()); + $response = new Response($json, 200); + $response->headers->set('Content-Type', 'application/json'); + + return $response; + } + + return $template; + } + + /** + * @Route("/{id}/description", name="brickset_description") + */ + public function descriptionAction(Request $request, $id) + { + $desription = null; + try { + $desription = $this->get('api.manager.brickset')->getSetById($id)->getDescription(); + } catch (EmptyResponseException $e) { + // $this->addFlash('warning', 'No description found on Brickset.com'); + } catch (\Exception $e) { + $this->addFlash('error', $e->getMessage()); + } + + $template = $this->render('brickset/description.html.twig', [ + 'description' => $desription, + ]); + + if ($request->isXmlHttpRequest()) { + $json = json_encode($template->getContent()); + $response = new Response($json, 200); + $response->headers->set('Content-Type', 'application/json'); + + return $response; + } + + return $template; } } diff --git a/src/AppBundle/Controller/Rebrickable/SetController.php b/src/AppBundle/Controller/Rebrickable/SetController.php deleted file mode 100644 index 63eb591..0000000 --- a/src/AppBundle/Controller/Rebrickable/SetController.php +++ /dev/null @@ -1,92 +0,0 @@ -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()); - $models = $em->getRepository(Model::class)->findAllBySetNumber($set->getNumber()); - - $template = $this->render('rebrickable/set/inventory.html.twig', [ - 'regularParts' => $regularParts, - 'spareParts' => $spareParts, - 'models' => $models, - ]); - -// $json = json_encode($template->getContent()); -// $response = new Response($json, 200); -// $response->headers->set('Content-Type', 'application/json'); -// -// return $response; - - return $template; - } - - /** - * @Route("/{number}/models", name="rebrickable_set_models") - */ - public function modelsAction(Set $set) - { - $models = null; - - try { - $this->get('repository.ldraw.model')->findAllBySetNumber($set->getNumber()); - $models = $this->get('service.set')->getModels($set); - $spareModels = $this->get('service.set')->getSpareModels($set); - -// $models = $this->get('repository.ldraw.model')->findAllRegularBySetNumber($set->getNumber()); - } catch (\Exception $e) { - $this->addFlash('error', $e->getMessage()); - } - - return $this->render('rebrickable/set/models.html.twig', [ - 'set' => $set, - 'models' => $models, - 'spareModels' => $spareModels - ]); - } - - /** - * @Route("/{number}/sets", name="rebrickable_set_sets") - */ - public function setsAction(Set $set) - { - $em = $this->getDoctrine()->getManager(); - - $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 abf93a1..68f564b 100644 --- a/src/AppBundle/Controller/SetController.php +++ b/src/AppBundle/Controller/SetController.php @@ -4,7 +4,7 @@ namespace AppBundle\Controller; use AppBundle\Api\Exception\ApiException; use AppBundle\Api\Exception\EmptyResponseException; -use AppBundle\Entity\Rebrickable\Inventory_Part; +use AppBundle\Entity\Rebrickable\Inventory_Set; use AppBundle\Entity\Rebrickable\Set; use AppBundle\Form\Filter\Set\SetFilterType; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; @@ -26,7 +26,7 @@ class SetController extends Controller $filterBuilder = $this->get('repository.rebrickable.set') ->createQueryBuilder('s') - ->orderBy('s.year','DESC'); + ->orderBy('s.year', 'DESC'); if ($request->query->has($form->getName())) { // manually bind values from the request @@ -52,19 +52,13 @@ class SetController extends Controller /** * @Route("/{number}", name="set_detail") */ - public function detailAction(Request $request, $number) + public function detailAction(Request $request, Set $set) { - $rebrickableSet = null; $bricksetSet = null; $colors = null; try { - if (($rebrickableSet = $this->get('repository.rebrickable.set')->find($number)) == null) { - $this->addFlash('warning', 'Set not found in Rebrickable database'); - } - - $bricksetSet = $this->get('api.manager.brickset')->getSetByNumber($number); - + $bricksetSet = $this->get('api.manager.brickset')->getSetByNumber($set->getNumber()); } catch (EmptyResponseException $e) { $this->addFlash('warning', 'Set not found in Brickset database'); } catch (ApiException $e) { @@ -73,13 +67,138 @@ class SetController extends Controller $this->addFlash('error', $e->getMessage()); } - if (!$rebrickableSet && !$bricksetSet) { - return $this->render('error/error.html.twig'); - } - return $this->render('set/detail.html.twig', [ - 'rbset' => $rebrickableSet, + 'set' => $set, 'brset' => $bricksetSet, ]); } + + /** + * @Route("/{number}/parts", name="set_parts") + */ + public function partsAction(Request $request, Set $set) + { + $inventoryPartRepository = $this->get('repository.rebrickable.inventorypart'); + + $regularParts = $inventoryPartRepository->findAllBySetNumber($set->getNumber(), false, true); + $spareParts = $inventoryPartRepository->findAllBySetNumber($set->getNumber(), true); + + $missing = $inventoryPartRepository->findAllBySetNumber($set->getNumber(), false, false); + + $template = $this->render('set/inventory.html.twig', [ + 'regularParts' => $regularParts, + 'missing' => $missing, + 'spareParts' => $spareParts, + ]); + + if ($request->isXmlHttpRequest()) { + $json = json_encode($template->getContent()); + $response = new Response($json, 200); + $response->headers->set('Content-Type', 'application/json'); + + return $response; + } + + return $template; + } + + /** + * @Route("/{number}/models", name="set_models") + */ + public function modelsAction(Request $request, Set $set) + { + $models = null; + $spareModels = null; + $missing = null; + $missingSpare = null; + + try { + $models = $this->get('service.set')->getModels($set, false); + $spareModels = $this->get('service.set')->getModels($set, true); + $missing = $this->get('repository.rebrickable.inventorypart')->findAllBySetNumber($set->getNumber(), false, false); + $missingSpare = $this->get('repository.rebrickable.inventorypart')->findAllBySetNumber($set->getNumber(), true, false); + } catch (\Exception $e) { + $this->addFlash('error', $e->getMessage()); + } + + $template = $this->render('set/models.html.twig', [ + 'set' => $set, + 'missing' => $missing, + 'models' => $models, + 'spareModels' => $spareModels, + 'missingSpare' => $missingSpare, + ]); + + if ($request->isXmlHttpRequest()) { + $json = json_encode($template->getContent()); + $response = new Response($json, 200); + $response->headers->set('Content-Type', 'application/json'); + + return $response; + } + + return $template; + } + + /** + * @Route("/{number}/colors", name="set_colors") + */ + public function colorsAction(Request $request, Set $set) + { + $colors = null; + + try { + $colors = $this->get('service.set')->getModelsGroupedByColor($set, false); + } catch (\Exception $e) { + $this->addFlash('error', $e->getMessage()); + } + + $template = $this->render('set/colors.html.twig', [ + 'set' => $set, + 'colors' => $colors, + ]); + + if ($request->isXmlHttpRequest()) { + $json = json_encode($template->getContent()); + $response = new Response($json, 200); + $response->headers->set('Content-Type', 'application/json'); + + return $response; + } + + return $template; + } + + /** + * @Route("/{number}/sets", name="set_sets") + */ + public function setsAction(Request $request, Set $set) + { + $em = $this->getDoctrine()->getManager(); + + $inventorySets = $em->getRepository(Inventory_Set::class)->findAllBySetNumber($set->getNumber()); + + $template = $this->render('set/sets.html.twig', [ + 'inventorySets' => $inventorySets, + ]); + + if ($request->isXmlHttpRequest()) { + $json = json_encode($template->getContent()); + $response = new Response($json, 200); + $response->headers->set('Content-Type', 'application/json'); + + return $response; + } + + return $template; + } + + /** + * @Route("/{number}/zip", name="set_zip") + */ + public function zipAction(Request $request, Set $set) + { + $sorted = $request->query->get('sorted') == 1 ? true : false; + $this->get('service.zip')->createFromSet($set, $sorted); + } }