1
0
mirror of https://github.com/ToxicCrack/PrintABrick.git synced 2025-05-20 06:00:08 -07:00

Improve set index and detail view

This commit is contained in:
David Hübner 2017-04-24 11:27:05 +02:00
parent aaaffd17ee
commit 0b0f840408
11 changed files with 218 additions and 104 deletions

View File

@ -1,5 +1,3 @@
{% import 'macros/utils.html.twig' as utils %}
{% if instructions|length != 0 %} {% if instructions|length != 0 %}
<p> <p>
{{ 'set.instructions.text' | trans }} {{ 'set.instructions.text' | trans }}

View File

@ -1,5 +1,5 @@
<div class="ui comments"> <div class="ui comments">
{% for review in reviews %} {% for review in reviews|slice(0, 3) %}
<div class="comment"> <div class="comment">
<a class="avatar"> <a class="avatar">
{#<img src="/images/avatar/small/matt.jpg">#} {#<img src="/images/avatar/small/matt.jpg">#}
@ -18,7 +18,8 @@
</div> </div>
<div> <div>
Overall rating <div class="ui star rating" data-rating="{{ review.overallRating }}" data-max-rating="5"></div> Overall rating <div class="ui star rating" data-rating="{{ review.overallRating }}" data-max-rating="5"></div>
{#Value for money <div class="ui star rating" data-rating="{{ review.valueForMoney }}" data-max-rating="5"></div>#} Value for money <div class="ui star rating" data-rating="{{ review.valueForMoney }}" data-max-rating="5"></div>
Playability <div class="ui star rating" data-rating="{{ review.playability }}" data-max-rating="5"></div>
</div> </div>
</div> </div>
</div> </div>

View File

@ -1,3 +1,7 @@
{% import 'macros/elements.html.twig' as elements %}
This set consists of {{ models|length }} unique part models
{% if regularParts|length > 0 %} {% if regularParts|length > 0 %}
<h4 class="ui horizontal divider header"> <h4 class="ui horizontal divider header">
Regular parts Regular parts
@ -11,8 +15,9 @@
<a class="ui right {{ inventoryPart.part.model == null ? 'black' : 'red'}} circular label">{{ inventoryPart.quantity }}</a> <a class="ui right {{ inventoryPart.part.model == null ? 'black' : 'red'}} circular label">{{ inventoryPart.quantity }}</a>
<a href="{{ path('reb_part_detail', {number: inventoryPart.part.number}) }}"> <a href="{{ path('reb_part_detail', {number: inventoryPart.part.number}) }}">
<div class="image load"> <div class="image load">
<img src="{{ inventoryPart.part.number|partImage(inventoryPart.color.id)| imagine_filter('rebrickable_part_min') }}" data-src="{{ inventoryPart.part.number|partImage(inventoryPart.color.id)| imagine_filter('rebrickable_part_min') }}" class="transition visible"> <img src="{{ asset('resources/images/unknown_image.png') }}" data-src="{{ inventoryPart.part.number|partImage(inventoryPart.color.id)| imagine_filter('rebrickable_part_min') }}" class="transition visible">
</div> </div>
<div style="border-bottom: #{{ inventoryPart.color.rgb }} 5px solid" class="ui bottom attached label">{{ inventoryPart.part.number }}</div> <div style="border-bottom: #{{ inventoryPart.color.rgb }} 5px solid" class="ui bottom attached label">{{ inventoryPart.part.number }}</div>
</a> </a>
</div> </div>
@ -34,7 +39,7 @@
<a class="ui right {{ inventoryPart.part.model == null ? 'black' : 'red'}} circular label">{{ inventoryPart.quantity }}</a> <a class="ui right {{ inventoryPart.part.model == null ? 'black' : 'red'}} circular label">{{ inventoryPart.quantity }}</a>
<a href="{{ path('reb_part_detail', {number: inventoryPart.part.number}) }}"> <a href="{{ path('reb_part_detail', {number: inventoryPart.part.number}) }}">
<div class="image load"> <div class="image load">
<img src="{{ inventoryPart.part.number|partImage(inventoryPart.color.id)| imagine_filter('rebrickable_part_min') }}" data-src="{{ inventoryPart.part.number|partImage(inventoryPart.color.id)| imagine_filter('rebrickable_part_min') }}" class="transition visible"> <img src="{{ asset('resources/images/unknown_image.png') }}" data-src="{{ inventoryPart.part.number|partImage(inventoryPart.color.id)| imagine_filter('rebrickable_part_min') }}" class="transition visible">
</div> </div>
<div style="border-bottom: #{{ inventoryPart.color.rgb }} 5px solid" class="ui bottom attached label">{{ inventoryPart.part.number }}</div> <div style="border-bottom: #{{ inventoryPart.color.rgb }} 5px solid" class="ui bottom attached label">{{ inventoryPart.part.number }}</div>
</a> </a>

View File

@ -0,0 +1,48 @@
{% extends 'base.html.twig' %}
{% block content %}
{% set count = 0 %}
<div class="ui ten column grid">
{% for model in models %}
<div class="column">
<div class="ui bordered fluid image">
<a href="{{ url('model_detail', {'number': model['model'].number})}}">
<div class="image load">
<img src="{{ asset('resources/images/unknown_image.png') }}" data-src="{{ asset('/images/-1/'~model['model'].number~'.png') | imagine_filter('model_min') }}" class="transition visible">
</div>
<div class="ui bottom attached label {% if model['model'].parts|length == 0 %}black{% endif %}">{{ model['model'].number }}</div>
</a>
</div>
{% for color in model['colors'] %}
{% set count = count + color['quantity'] %}
<div style="border-bottom: 4px solid #{{ color['color'].rgb }}">{{ color['quantity'] }} {{ color['color'].name }}</div>
{% endfor %}
</div>
{% endfor %}
</div>
<div class="ui ten column grid">
{% for model in spareModels %}
<div class="column">
<div class="ui bordered fluid image">
<a href="{{ url('model_detail', {'number': model['model'].number})}}">
<div class="image load">
<img src="{{ asset('resources/images/unknown_image.png') }}" data-src="{{ asset('/images/-1/'~model['model'].number~'.png') | imagine_filter('model_min') }}" class="transition visible">
</div>
<div class="ui bottom attached label {% if model['model'].parts|length == 0 %}black{% endif %}">{{ model['model'].number }}</div>
</a>
</div>
{% for color in model['colors'] %}
{% set count = count + color['quantity'] %}
<div style="border-bottom: 4px solid #{{ color['color'].rgb }}">{{ color['quantity'] }} {{ color['color'].name }}</div>
{% endfor %}
</div>
{% endfor %}
</div>
<p>{{ set.partCount }}</p>
<p>{{ count }} models</p>
{% endblock %}

View File

@ -2,7 +2,7 @@
{% block title %}{{ rbset ? rbset.number }} {{ rbset ? rbset.name }}{% endblock %} {% block title %}{{ rbset ? rbset.number }} {{ rbset ? rbset.name }}{% endblock %}
{% block header %}{{ rbset ? rbset.number }} {{ rbset ? rbset.name }}{% endblock %} {% block header %}{{ rbset ? rbset.number }} {{ rbset ? rbset.name | escape('html') }}{% endblock %}
{% block content %} {% block content %}
@ -10,15 +10,15 @@
<div class="column nine wide"> <div class="column nine wide">
<div class="image bordered ui big"> <div class="image bordered ui big">
{% if brset %} {% if brset %}
<img class="big" src="{{ brset.imageURL }}"> <img class="big" src="{{ ('/sets/images/'~brset.legoSetID~'.jpg')|imagine_filter('brickset_large') }}">
{% elseif rbset %} {% elseif rbset %}
<img class="big" src="{{ rbset.number|setImage|imagine_filter('rebrickable') }}"> <img class="big" src="{{ rbset.number|setImage|imagine_filter('rebrickable_large') }}">
{% endif %} {% endif %}
</div> </div>
</div> </div>
<div class="column seven wide"> <div class="column seven wide">
<div class="item-info black ui"> <div class="item-info black ui">
<table class="ui table"> <table class="ui very basic table">
<tr> <tr>
<td>number</td><td>{{ brset ? brset.legoSetID : rbset ? rbset.number : null}}</td> <td>number</td><td>{{ brset ? brset.legoSetID : rbset ? rbset.number : null}}</td>
</tr> </tr>
@ -37,7 +37,9 @@
{% endif %} {% endif %}
</tr> </tr>
<tr> <tr>
<td>parts</td><td>{{ brset ? brset.pieces : rbset ? rbset.partCount }}</td> <td>parts</td><td>
{{ rbset ? rbset.partCount }} {{ brset ? '('~brset.pieces~')' }}
</td>
</tr> </tr>
{% if brset %} {% if brset %}
<tr> <tr>
@ -53,21 +55,21 @@
{% endif %} {% endif %}
</table> </table>
{% if brset is not null %} {#{% if brset is not null %}#}
<dl> {#<dl>#}
<dt>themegroup:</dt><dd>{{ brset.themeGroup }}</dd> {#<dt>themegroup:</dt><dd>{{ brset.themeGroup }}</dd>#}
<dt>theme:</dt><dd>{{ brset.theme }}</dd> {#<dt>theme:</dt><dd>{{ brset.theme }}</dd>#}
<dt>subtheme:</dt><dd>{{ brset.subtheme }}</dd> {#<dt>subtheme:</dt><dd>{{ brset.subtheme }}</dd>#}
<dt>count of parts:</dt><dd>{{ brset.pieces }}</dd> {#<dt>count of parts:</dt><dd>{{ brset.pieces }}</dd>#}
<dt>minifigs:</dt><dd>{{ brset.minifigs }}</dd> {#<dt>minifigs:</dt><dd>{{ brset.minifigs }}</dd>#}
</dl> {#</dl>#}
{% endif %} {#{% endif %}#}
</div> </div>
</div> </div>
</div> </div>
<div class="segment vertical item-info"> <div class="ui segment vertical item-info">
<div class="ui tabular menu"> <div class="ui tabular pointing secondary menu">
<a class="item active" data-tab="parts"><i class="cubes icon"></i> Parts ({{ rbset ? rbset.partCount : 0}})</a> <a class="item active" data-tab="parts"><i class="cubes icon"></i> Parts ({{ rbset ? rbset.partCount : 0}})</a>
{% if brset %} {% if brset %}
<a class="item" data-tab="description"><i class="info icon"></i> Description</a> <a class="item" data-tab="description"><i class="info icon"></i> Description</a>
@ -76,12 +78,13 @@
<a class="item" data-tab="reviews"><i class="write icon"></i> Reviews ({{ brset.reviewCount }})</a> <a class="item" data-tab="reviews"><i class="write icon"></i> Reviews ({{ brset.reviewCount }})</a>
{% endif %} {% endif %}
</div> </div>
<div class="ui vertical segment">
<div class="ui tab active" data-tab="parts"> <div class="ui tab active" data-tab="parts">
{% if rbset %} {% if rbset %}
<div class="ajax-load" id="parts" data-src="{{ path('rebrickable_set_parts', { 'number': rbset.number }) }}"></div> {#<div class="ajax-load" id="parts" data-src="{{ path('rebrickable_set_parts', { 'number': rbset.number }) }}"></div>#}
{#{{ render(controller('AppBundle:Rebrickable/Set:parts', { 'number': rbset.number })) }}#} {{ render(controller('AppBundle:Rebrickable/Set:parts', { 'number': rbset.number })) }}
{% endif %} {% endif %}
</div> </div>
@ -102,12 +105,11 @@
{{ render(controller('AppBundle:Brickset/Set:reviews', { 'id': brset.setID })) }} {{ render(controller('AppBundle:Brickset/Set:reviews', { 'id': brset.setID })) }}
</div> </div>
<div class="ui tab" data-tab="description"> <div class="ui tab" data-tab="description">
{{ brset.description }} {{ brset.description|raw }}
</div> </div>
{% endif %} {% endif %}
</div> </div>
</div>
{% endblock %} {% endblock %}
{% block javascripts %} {% block javascripts %}
@ -117,20 +119,20 @@
$(document).ready(function () { $(document).ready(function () {
$('.ajax-load').each(function () { // $('.ajax-load').each(function () {
$self = $(this); // $self = $(this);
//
console.log($self); //
$.ajax({ // $.ajax({
type: "POST", // type: "POST",
dataType: 'json', // dataType: 'json',
url: $self.data('src'), // url: $self.data('src'),
async: true, //you won't need that if nothing in your following code is dependend of the result // async: true, //you won't need that if nothing in your following code is dependend of the result
success: function(response){ // success: function(response){
$self.html(response); //Change the html of the div with the id = "your_div" // $self.html(response); //Change the html of the div with the id = "your_div"
} // }
}) // })
}) // })
}) })

View File

@ -1,7 +1,14 @@
{% extends 'base.html.twig' %} {% extends 'base.html.twig' %}
{% block title %}{{ 'page.set.index' | trans }}{% endblock %}
{% block header %}{{ 'page.set.index' | trans }}{% endblock %}
{% block content %} {% block content %}
<div class="ui container divided stackable grid">
<div class="row">
<div class="column four wide">
<form method="get" action="" class="ui form"> <form method="get" action="" class="ui form">
{{ form_start(form) }} {{ form_start(form) }}
@ -10,18 +17,26 @@
{{ form_label(form.theme.id) }} {{ form_label(form.theme.id) }}
{{ form_widget(form.theme.id) }} {{ form_widget(form.theme.id) }}
</div> </div>
<div class="field">
{{ form_row(form.partCount) }}
</div>
<div class="field">
{{ form_row(form.year) }}
</div>
<div class="field"> <div class="field">
<input class="ui submit button" type="submit" value="filter"/> <input class="ui submit button" type="submit" value="filter"/>
</div> </div>
{{ form_rest(form) }} {{ form_rest(form) }}
{{ form_end(form) }} {{ form_end(form) }}
</form> </form>
</div>
<div class="ui seven column grid"> <div class="column twelve wide">
<div class="ui six column doubling grid">
<div class="row"> <div class="row">
{% for set in sets %} {% for set in sets %}
<div class="column"> <div class="column">
<a href="{{ url('set_detail', {'number': set.number, 'name' : set.name|escape('url') }) }}"> <a href="{{ url('set_detail', {'number': set.number}) }}">
<img class="ui bordered image medium" src="{{ set.number|setImage|imagine_filter('rebrickable_set_min') }}"> <img class="ui bordered image medium" src="{{ set.number|setImage|imagine_filter('rebrickable_set_min') }}">
<p>{{ set.number }} - {{ set.name }}</p> <p>{{ set.number }} - {{ set.name }}</p>
</a> </a>
@ -30,7 +45,16 @@
</div> </div>
</div> </div>
<p>{{ sets.getTotalItemCount }}</p> <p>{{ sets.getTotalItemCount }}</p>
{{ knp_pagination_render(sets) }} {{ knp_pagination_render(sets) }}
</div>
</div>
</div>
{% endblock %}
{% block javascripts %}
{{ parent() }}
{% endblock %} {% endblock %}

View File

@ -9,6 +9,7 @@ parameters:
locale: en locale: en
# rebrickable csv files root URL (http://rebrickable.com/media/downloads/ or local dir containing csv files) # rebrickable csv files root URL (http://rebrickable.com/media/downloads/ or local dir containing csv files)
rebrickable_downloads_url: 'http://rebrickable.com/media/downloads/' rebrickable_downloads_url: 'http://rebrickable.com/media/downloads/'
media_root: "%kernel.root_dir%/../var/media/"
framework: framework:
#esi: ~ #esi: ~
@ -104,6 +105,10 @@ liip_imagine:
rebrickable: rebrickable:
stream: stream:
wrapper: 'http://rebrickable.com/media/' wrapper: 'http://rebrickable.com/media/'
brickset:
stream:
wrapper: 'https://images.brickset.com/'
resolvers: resolvers:
default: default:
@ -140,12 +145,31 @@ liip_imagine:
default_image: '/resources/images/unknown_image.png' default_image: '/resources/images/unknown_image.png'
cache: ~ cache: ~
filters: filters:
thumbnail: { size: [250, 250], mode: inset } thumbnail: { size: [250, 200], mode: inset }
background: { size: [250, 200], position: center, color: '#FFFFFF' }
rebrickable_large:
data_loader: rebrickable
cache: ~
quality: 92
filters:
thumbnail: { size: [840, 580], mode: inset }
background: { size: [900, 600], position: center, color: '#FFFFFF' }
brickset:
data_loader: brickset
brickset_large:
data_loader: brickset
cache: ~
quality: 92
filters:
thumbnail: { size: [840, 580], mode: inset }
background: { size: [900, 600], position: center, color: '#FFFFFF' }
oneup_flysystem: oneup_flysystem:
adapters: adapters:
media: media:
local: local:
directory: "%kernel.root_dir%/../var/media/" directory: "%media_root%"
filesystems: filesystems:
media: media:
adapter: media adapter: media

View File

@ -1,11 +1,4 @@
services: services:
app.twig_extension:
class: AppBundle\Twig\AppExtension
public: false
arguments: ['@api.manager.rebrickable', '@app.transformer.format']
tags:
- { name: twig.extension }
app.brickset.cache_provider: app.brickset.cache_provider:
class: Doctrine\Common\Cache\PhpFileCache class: Doctrine\Common\Cache\PhpFileCache
arguments: ["%kernel.cache_dir%/brickset", ".cache.php"] arguments: ["%kernel.cache_dir%/brickset", ".cache.php"]

View File

@ -6,3 +6,10 @@ services:
class: AppBundle\Util\RelationMapper class: AppBundle\Util\RelationMapper
arguments: arguments:
- ['%kernel.root_dir%/Resources/relations'] - ['%kernel.root_dir%/Resources/relations']
app.twig_extension:
class: AppBundle\Twig\AppExtension
public: false
arguments: ['@api.manager.rebrickable', '@app.transformer.format']
tags:
- { name: twig.extension }

View File

@ -25,7 +25,8 @@ class SetController extends Controller
$form = $this->get('form.factory')->create(SetFilterType::class); $form = $this->get('form.factory')->create(SetFilterType::class);
$filterBuilder = $this->get('repository.rebrickable.set') $filterBuilder = $this->get('repository.rebrickable.set')
->createQueryBuilder('s'); ->createQueryBuilder('s')
->orderBy('s.year','DESC');
if ($request->query->has($form->getName())) { if ($request->query->has($form->getName())) {
// manually bind values from the request // manually bind values from the request
@ -55,13 +56,15 @@ class SetController extends Controller
{ {
$rebrickableSet = null; $rebrickableSet = null;
$bricksetSet = null; $bricksetSet = null;
$colors = null;
try { try {
if (($rebrickableSet = $this->getDoctrine()->getManager()->getRepository(Set::class)->find($number)) == null) { if (($rebrickableSet = $this->get('repository.rebrickable.set')->find($number)) == null) {
$this->addFlash('warning', 'Set not found in Rebrickable database'); $this->addFlash('warning', 'Set not found in Rebrickable database');
} }
$bricksetSet = $this->get('api.manager.brickset')->getSetByNumber($number); $bricksetSet = $this->get('api.manager.brickset')->getSetByNumber($number);
dump($bricksetSet);
} catch (EmptyResponseException $e) { } catch (EmptyResponseException $e) {
$this->addFlash('warning', 'Set not found in Brickset database'); $this->addFlash('warning', 'Set not found in Brickset database');
} catch (ApiException $e) { } catch (ApiException $e) {

View File

@ -19,6 +19,14 @@ class SetFilterType extends AbstractType
'label' => 'filter.part.search', 'label' => 'filter.part.search',
]); ]);
$builder->add('partCount', Filters\NumberRangeFilterType::class, [
'label' => 'filter.part.partCount',
]);
$builder->add('year', Filters\NumberRangeFilterType::class, [
'label' => 'filter.part.year',
]);
$builder->add('theme', ThemeFilterType::class, [ $builder->add('theme', ThemeFilterType::class, [
'add_shared' => function (FilterBuilderExecuterInterface $builderExecuter) { 'add_shared' => function (FilterBuilderExecuterInterface $builderExecuter) {
$builderExecuter->addOnce($builderExecuter->getAlias().'.theme', 'c', function (QueryBuilder $filterBuilder, $alias, $joinAlias, $expr) { $builderExecuter->addOnce($builderExecuter->getAlias().'.theme', 'c', function (QueryBuilder $filterBuilder, $alias, $joinAlias, $expr) {
@ -26,6 +34,7 @@ class SetFilterType extends AbstractType
}); });
}, },
]); ]);
} }
public function getBlockPrefix() public function getBlockPrefix()