mirror of
https://github.com/ToxicCrack/PrintABrick.git
synced 2025-05-29 10:10:25 -07:00
Improve templates
This commit is contained in:
parent
00d455210d
commit
71bb607772
@ -31,7 +31,6 @@ $(document).ready(function(){
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
$('.message .close')
|
||||
.on('click', function() {
|
||||
$(this)
|
||||
@ -41,15 +40,12 @@ $(document).ready(function(){
|
||||
})
|
||||
;
|
||||
|
||||
$('.item-info .download')
|
||||
.popup({
|
||||
popup : $('.download.popup'),
|
||||
on: 'click',
|
||||
inline: true
|
||||
})
|
||||
;
|
||||
|
||||
$('.ui.modal')
|
||||
.modal('attach events', '.ui.open-modal.button', 'show')
|
||||
;
|
||||
|
||||
// create sidebar and attach to menu open
|
||||
$('.ui.sidebar')
|
||||
.sidebar('attach events', '.toc.item')
|
||||
;
|
||||
});
|
@ -145,6 +145,5 @@ $colors: (
|
||||
|
||||
.text.color-#{$number} {
|
||||
color: $color;
|
||||
//background: color-contrast($color,#000,#FFF);
|
||||
}
|
||||
}
|
5
app/Resources/assets/style/filter.scss
Normal file
5
app/Resources/assets/style/filter.scss
Normal file
@ -0,0 +1,5 @@
|
||||
.filter {
|
||||
.number-range {
|
||||
margin: 1em 0.6em 3em;
|
||||
}
|
||||
}
|
@ -2,23 +2,32 @@
|
||||
display: none;
|
||||
}
|
||||
|
||||
.masthead.segment {
|
||||
min-height: 400px;
|
||||
padding: 0.5em 0;
|
||||
}
|
||||
.masthead .logo.item img {
|
||||
margin-right: 1em;
|
||||
}
|
||||
.masthead .ui.menu .ui.button {
|
||||
margin-left: 0.5em;
|
||||
}
|
||||
.masthead h1.ui.header {
|
||||
margin-top: 1.5em;
|
||||
margin-bottom: 0;
|
||||
font-size: 4em;
|
||||
font-weight: normal;
|
||||
}
|
||||
.masthead h2 {
|
||||
font-size: 1.7em;
|
||||
font-weight: normal;
|
||||
.masthead {
|
||||
.text.container {
|
||||
margin-bottom: 8em;
|
||||
margin-top: 8em;
|
||||
}
|
||||
.segment {
|
||||
padding: 0.5em 0;
|
||||
}
|
||||
.logo.item img {
|
||||
margin-right: 1em;
|
||||
}
|
||||
.ui.menu .ui.button {
|
||||
margin-left: 0.5em;
|
||||
}
|
||||
|
||||
h1.ui.header {
|
||||
font-size: 4em;
|
||||
|
||||
img {
|
||||
height: 1.2em !important;
|
||||
width: 1.2em !important;
|
||||
margin-top: 0 !important;
|
||||
}
|
||||
}
|
||||
.tagline {
|
||||
font-size: 1.3em;
|
||||
font-weight: normal;
|
||||
}
|
||||
}
|
||||
|
@ -1,25 +1,19 @@
|
||||
.default-theme {
|
||||
display: flex;
|
||||
min-height: 100vh;
|
||||
flex-direction: column;
|
||||
.pusher {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
.ui.main {
|
||||
.pusher > .full.height {
|
||||
flex: 1;
|
||||
padding-top: 50px;
|
||||
}
|
||||
|
||||
.ui.head {
|
||||
padding-top: 4em;
|
||||
position: relative;
|
||||
|
||||
.header {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
.breadcrumb {
|
||||
right: 0;
|
||||
top: 0;
|
||||
position: absolute;
|
||||
padding: 20px 0;
|
||||
h1.header {
|
||||
margin-top: 0;
|
||||
}
|
||||
}
|
||||
|
||||
@ -37,45 +31,15 @@
|
||||
border-radius: 0;
|
||||
}
|
||||
|
||||
.item-info {
|
||||
min-height: 300px;
|
||||
background: #EEEEEE;
|
||||
padding: 20px;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.ui.fixed + .ui.header {
|
||||
margin-top: 3em;
|
||||
padding-bottom: 4em;
|
||||
}
|
||||
|
||||
.link {
|
||||
padding-left: 30px;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.link:before {
|
||||
width: 23px;
|
||||
height: 23px;
|
||||
position: absolute;
|
||||
left: 0;
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
.link.brickset:before {
|
||||
content: '';
|
||||
background: url("/resources/images/brickset_logo.png");
|
||||
background-size: cover;
|
||||
}
|
||||
|
||||
.link.rebrickable:before {
|
||||
content: '';
|
||||
background: url("/resources/images/rebrickable_logo.png");
|
||||
background-size: cover;
|
||||
}
|
||||
|
||||
.number-range {
|
||||
margin: 1em 0.6em 3em;
|
||||
.sort {
|
||||
margin-bottom: 0;
|
||||
padding-top: 0;
|
||||
padding-bottom: 0;
|
||||
}
|
||||
|
||||
.pull-left {
|
||||
@ -90,7 +54,7 @@
|
||||
background-color: lightgrey;
|
||||
}
|
||||
|
||||
.found-count {
|
||||
.ui.text.menu {
|
||||
margin: 0 !important;
|
||||
}
|
||||
|
||||
@ -118,7 +82,7 @@
|
||||
}
|
||||
|
||||
.unpadded {
|
||||
padding: 0;
|
||||
padding: 0 !important;
|
||||
}
|
||||
|
||||
.spacing.top {
|
||||
@ -137,6 +101,15 @@
|
||||
margin-top: 100px !important;
|
||||
margin-bottom: 100px !important;
|
||||
}
|
||||
|
||||
.alternate.stripe {
|
||||
background-color: #F2F3F5 !important;
|
||||
}
|
||||
|
||||
|
||||
.ui.segment.vertical.noborder {
|
||||
border-bottom: 0;
|
||||
}
|
||||
}
|
||||
|
||||
@each $i in 5 10 15 20 25 30 40 50 60 {
|
||||
@ -150,6 +123,6 @@
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
.ui.segment.vertical.noborder {
|
||||
border-bottom: 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
@ -1,13 +0,0 @@
|
||||
// Calculeate brightness of a given color.
|
||||
@function brightness($color) {
|
||||
@return ((red($color) * .299) + (green($color) * .587) + (blue($color) * .114)) / 255 * 100%;
|
||||
}
|
||||
|
||||
// Compares contrast of a given color to the light/dark arguments and returns whichever is most "contrasty"
|
||||
@function color-contrast($color, $dark, $light) {
|
||||
$color-brightness: brightness($color);
|
||||
$light-text-brightness: brightness($light);
|
||||
$dark-text-brightness: brightness($dark);
|
||||
|
||||
@return if(abs($color-brightness - $light-text-brightness) > abs($color-brightness - $dark-text-brightness), $light, $dark);
|
||||
}
|
28
app/Resources/assets/style/navbar.scss
Normal file
28
app/Resources/assets/style/navbar.scss
Normal file
@ -0,0 +1,28 @@
|
||||
.main.menu {
|
||||
.item.toc {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
.item.header {
|
||||
font-size: 1.3em;
|
||||
padding: 0.4em !important;
|
||||
.logo {
|
||||
margin-right: 0.5em;
|
||||
width: 1.7em;
|
||||
}
|
||||
}
|
||||
|
||||
.secondary.pointing.menu .toc.item {
|
||||
display: none;
|
||||
}
|
||||
|
||||
@media only screen and (max-width: 600px) {
|
||||
.left.menu, .right.menu {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
.item.toc {
|
||||
display: flex !important;
|
||||
}
|
||||
}
|
||||
}
|
@ -1,9 +1,12 @@
|
||||
@import "variables";
|
||||
@import "mixins";
|
||||
|
||||
@import "navbar";
|
||||
@import "table";
|
||||
@import "main";
|
||||
@import "homepage";
|
||||
@import "modelviewer";
|
||||
@import "filter";
|
||||
|
||||
@import "part";
|
||||
@import "set";
|
||||
|
40
app/Resources/assets/style/table.scss
Normal file
40
app/Resources/assets/style/table.scss
Normal file
@ -0,0 +1,40 @@
|
||||
.item-info {
|
||||
height: 100%;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: space-between;
|
||||
|
||||
|
||||
.link {
|
||||
padding-left: 30px;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.link:before {
|
||||
width: 23px;
|
||||
height: 23px;
|
||||
position: absolute;
|
||||
left: 0;
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
.link.brickset:before {
|
||||
content: '';
|
||||
background: url("/resources/images/brickset_logo.png");
|
||||
background-size: cover;
|
||||
}
|
||||
|
||||
.link.rebrickable:before {
|
||||
content: '';
|
||||
background: url("/resources/images/rebrickable_logo.png");
|
||||
background-size: cover;
|
||||
}
|
||||
|
||||
@media only screen and (max-width: 767px) {
|
||||
.ui.table:not(.unstackable) tr {
|
||||
padding-top: 0 !important;
|
||||
padding-bottom: 0 !important;
|
||||
box-shadow: none !important;
|
||||
}
|
||||
}
|
||||
}
|
@ -64,10 +64,14 @@ model:
|
||||
keywords: Keywords
|
||||
aliases: Aliases
|
||||
download: Download model
|
||||
empty: No model
|
||||
form:
|
||||
search: Search
|
||||
category: Category
|
||||
category.all: All Categories
|
||||
subparts: Submodels
|
||||
related: Related models
|
||||
parents: Parent models
|
||||
|
||||
page:
|
||||
model.index: Browse models
|
||||
@ -81,7 +85,6 @@ filter:
|
||||
category: Category
|
||||
|
||||
homepage:
|
||||
title.text: Web catalogue of LEGO<sup>®</sup> parts for 3D printing
|
||||
models:
|
||||
title: models
|
||||
text: Browse 3D models of LEGO<sup>®</sup> parts from LDraw™ Library
|
||||
@ -121,10 +124,12 @@ page.error:
|
||||
text:
|
||||
|
||||
part:
|
||||
id: ID
|
||||
id: Number
|
||||
name: Name
|
||||
category: Category
|
||||
model: Model
|
||||
alternates: Alternate parts
|
||||
molds: Molds of part
|
||||
prints: Prints
|
||||
|
||||
meta.description: Web catalogue of LEGO<sup>®</sup> parts for 3D printing
|
@ -4,61 +4,89 @@
|
||||
{% import 'macros/blocks.html.twig' as blocks %}
|
||||
|
||||
{% block body %}
|
||||
<div class="ui fixed inverted menu">
|
||||
<div class="ui container">
|
||||
{{ knp_menu_render('mainMenu') }}
|
||||
|
||||
<div class="right menu">
|
||||
<div class="ui search item category right aligned">
|
||||
<div class="ui icon input transparent inverted">
|
||||
<input class="prompt" type="text" placeholder="Search..." >
|
||||
<i class="search icon"></i>
|
||||
</div>
|
||||
<div class="results transition"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="ui vertical inverted sidebar menu right">
|
||||
{{ knp_menu_render('mainMenu') }}
|
||||
</div>
|
||||
{% block page %}
|
||||
<div class="ui main">
|
||||
<div class="ui container">
|
||||
<div class="ui head vertical segment">
|
||||
<h1 class="ui header">{% block header %}{% endblock %}</h1>
|
||||
|
||||
<div class="ui small breadcrumb">
|
||||
{% for breadcrumb_item in knp_menu_get_breadcrumbs_array(knp_menu_get_current_item('mainMenu')) %}
|
||||
{% if not loop.last %}
|
||||
<a class="section" href="{{ breadcrumb_item.uri }}">{{ breadcrumb_item.label }}</a>
|
||||
<i class="right chevron icon divider"></i>
|
||||
{% else %}
|
||||
<a class="active section">{{ breadcrumb_item.label }}</a>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
<div class="pusher">
|
||||
<div class="ui fixed inverted menu main">
|
||||
<div class="ui container">
|
||||
<a class="item header" href="{{ path('homepage') }}">
|
||||
<img class="ui logo" src="{{ asset('resources/images/logo.svg') }}">
|
||||
{{ name }}
|
||||
</a>
|
||||
|
||||
<div class="left menu">
|
||||
{{ knp_menu_render('mainMenu') }}
|
||||
</div>
|
||||
|
||||
<div class="right menu">
|
||||
<div class="ui search item category right aligned">
|
||||
<div class="ui icon input transparent inverted">
|
||||
<input class="prompt" type="text" placeholder="Search..." >
|
||||
<i class="search icon"></i>
|
||||
</div>
|
||||
<div class="results transition"></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="ui basic segment content">
|
||||
{% for label, flashes in app.session.flashbag.all %}
|
||||
{% for flash in flashes %}
|
||||
{{ elements.flash(label,flash) }}
|
||||
{% endfor %}
|
||||
{% endfor %}
|
||||
|
||||
{% block content %}
|
||||
|
||||
{% endblock %}
|
||||
</div>
|
||||
<a class="toc right floated item">
|
||||
<i class="sidebar icon"></i>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock page %}
|
||||
<div class="ui black inverted vertical footer segment stripe">
|
||||
{% block footer %}
|
||||
<div class="ui aligned container">
|
||||
<div class="ui horizontal inverted small divided link list">
|
||||
<p>LEGO<sup>®</sup>, the LEGO logo, the Minifigure, and the Brick and Knob configurations are trademarks of the LEGO Group of Companies which does not sponsor, authorize, or endorse this site.</p>
|
||||
Copyright © 2017 PrintABrick
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
<div class="full height">
|
||||
{% block page %}
|
||||
<header class="ui head vertical segment">
|
||||
<div class="ui container">
|
||||
<div class="ui breadcrumb">
|
||||
{% for breadcrumb_item in knp_menu_get_breadcrumbs_array(knp_menu_get_current_item('mainMenu')) %}
|
||||
{% set icon -%}
|
||||
{% if breadcrumb_item.item.extras.icon is defined %}
|
||||
<i class="icon {{ breadcrumb_item.item.extras.icon }}"></i>
|
||||
{% endif %}
|
||||
{%- endset %}
|
||||
|
||||
|
||||
{% set value = breadcrumb_item.item.extras.value is defined ? breadcrumb_item.item.extras.value : 0 %}
|
||||
|
||||
|
||||
{% if not loop.last and breadcrumb_item.uri %}
|
||||
<a class="section" href="{{ breadcrumb_item.uri }}">{{ icon }}{{ breadcrumb_item.label | trans({},'menu')}}</a>
|
||||
<div class="divider"> / </div>
|
||||
{% else %}
|
||||
<div class="active section">{{ icon }}{{ breadcrumb_item.label | trans({'%value%':value},'menu')}}</div>
|
||||
{% if not loop.last %}
|
||||
<div class="divider"> / </div>
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
</div>
|
||||
|
||||
{#<div class="ui grid stackable">#}
|
||||
{#<div class="right floated right aligned four wide column">#}
|
||||
|
||||
{#</div>#}
|
||||
{#<div class="left floated left aligned twelve wide column">#}
|
||||
<h1 class="ui header">{% block header %}{% endblock %}</h1>
|
||||
{#</div>#}
|
||||
{#</div>#}
|
||||
|
||||
{% for label, flashes in app.session.flashbag.all %}
|
||||
{% for flash in flashes %}
|
||||
{{ elements.flash(label,flash) }}
|
||||
{% endfor %}
|
||||
{% endfor %}
|
||||
</div>
|
||||
</header>
|
||||
|
||||
{% block content %}
|
||||
|
||||
{% endblock %}
|
||||
{% endblock page %}
|
||||
</div>
|
||||
{% include 'footer.html.twig' %}
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
|
@ -6,54 +6,62 @@
|
||||
|
||||
{% block content %}
|
||||
|
||||
<h4 class="ui horizontal divider header">Solid</h4>
|
||||
<div class="ui vertical segment alternate stripe">
|
||||
<div class="ui container">
|
||||
<h2 class="header">Solid</h2>
|
||||
|
||||
<table class="ui celled small padded table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th></th>
|
||||
<th>ID</th>
|
||||
<th>Name</th>
|
||||
<th>RGB</th>
|
||||
<th>Material</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for color in colors if not color.transparent%}
|
||||
<tr>
|
||||
<td style="background-color: #{{ color.rgb }}"></td>
|
||||
<td>{{ color.id }}</td>
|
||||
<td>{{ color.name }}</td>
|
||||
<td>#{{ color.rgb }}</td>
|
||||
<td>{{ color.transparent ? 'Transparent' : 'Solid' }}</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
<table class="ui celled small padded table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th></th>
|
||||
<th>ID</th>
|
||||
<th>Name</th>
|
||||
<th>RGB</th>
|
||||
<th>Material</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for color in colors if not color.transparent%}
|
||||
<tr>
|
||||
<td style="background-color: #{{ color.rgb }}"></td>
|
||||
<td>{{ color.id }}</td>
|
||||
<td>{{ color.name }}</td>
|
||||
<td>#{{ color.rgb }}</td>
|
||||
<td>{{ color.transparent ? 'Transparent' : 'Solid' }}</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<h4 class="ui horizontal divider header">Transparent</h4>
|
||||
<div class="ui vertical segment">
|
||||
<div class="ui container">
|
||||
<h2 class="header">Transparent</h2>
|
||||
|
||||
<table class="ui celled small padded table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th></th>
|
||||
<th>ID</th>
|
||||
<th>Name</th>
|
||||
<th>RGB</th>
|
||||
<th>Material</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for color in colors if color.transparent%}
|
||||
<tr>
|
||||
<td style="background-color: #{{ color.rgb }}"></td>
|
||||
<td>{{ color.id }}</td>
|
||||
<td>{{ color.name }}</td>
|
||||
<td>#{{ color.rgb }}</td>
|
||||
<td>{{ color.transparent ? 'Transparent' : 'Solid' }}</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
<table class="ui celled small padded table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th></th>
|
||||
<th>ID</th>
|
||||
<th>Name</th>
|
||||
<th>RGB</th>
|
||||
<th>Material</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for color in colors if color.transparent%}
|
||||
<tr>
|
||||
<td style="background-color: #{{ color.rgb }}"></td>
|
||||
<td>{{ color.id }}</td>
|
||||
<td>{{ color.name }}</td>
|
||||
<td>#{{ color.rgb }}</td>
|
||||
<td>{{ color.transparent ? 'Transparent' : 'Solid' }}</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
@ -1,12 +1,30 @@
|
||||
{% extends 'base.html.twig' %}
|
||||
|
||||
{% block body %}
|
||||
<div class="ui vertical inverted sidebar menu right">
|
||||
<div class="ui search item category center aligned">
|
||||
<div class="ui icon input transparent inverted">
|
||||
<input class="prompt" type="text" placeholder="Search..." >
|
||||
<i class="search icon"></i>
|
||||
</div>
|
||||
<div class="results transition"></div>
|
||||
</div>
|
||||
|
||||
{{ knp_menu_render('mainMenu') }}
|
||||
</div>
|
||||
|
||||
|
||||
<div class="pusher">
|
||||
<div class="ui inverted vertical masthead center aligned segment">
|
||||
|
||||
<div class="ui container">
|
||||
<div class="ui large secondary inverted pointing menu">
|
||||
{{ knp_menu_render('mainMenu') }}
|
||||
|
||||
<div class="ui large secondary inverted menu main">
|
||||
<a class="item header">
|
||||
<img class="ui logo" src="{{ asset('resources/images/logo.svg') }}">
|
||||
{{ name }}
|
||||
</a>
|
||||
<div class="left menu">
|
||||
{{ knp_menu_render('mainMenu') }}
|
||||
</div>
|
||||
<div class="right menu">
|
||||
<div class="ui search item category right aligned">
|
||||
<div class="ui icon input transparent inverted">
|
||||
@ -16,56 +34,50 @@
|
||||
<div class="results transition"></div>
|
||||
</div>
|
||||
</div>
|
||||
<a class="toc right floated item">
|
||||
<i class="sidebar icon"></i>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="ui text container">
|
||||
<h1 class="ui inverted header">
|
||||
PrintABrick
|
||||
<span class="content">
|
||||
{{ name }}
|
||||
</span>
|
||||
</h1>
|
||||
<h2>{{ 'homepage.title.text' | trans | raw }}</h2>
|
||||
<span class="tagline">{{ 'meta.description' | trans | raw }}</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="ui main vertical stripe quote segment">
|
||||
<div class="ui equal width stackable internally celled grid">
|
||||
<div class="center aligned row">
|
||||
<div class="column">
|
||||
<div class="ui horizontal statistic">
|
||||
<div class="value">
|
||||
{{ models }}
|
||||
</div>
|
||||
<div class="label">
|
||||
{{ 'homepage.models.title' | trans }}
|
||||
</div>
|
||||
<div class="full height">
|
||||
<div class="ui main vertical stripe quote segment">
|
||||
<div class="ui equal width stackable internally celled grid">
|
||||
<div class="center aligned row">
|
||||
<div class="column">
|
||||
<h2 class="ui icon header">
|
||||
<i class="cube icon"></i>
|
||||
{{ models }} {{ 'homepage.models.title' | trans }}
|
||||
</h2>
|
||||
<p>{{ 'homepage.models.text' | trans | raw }}</p>
|
||||
<a class="ui button big primary" href="{{ path('model_index') }}">{{ 'homepage.models.browse' | trans }}</a>
|
||||
</div>
|
||||
<p>{{ 'homepage.models.text' | trans | raw }}</p>
|
||||
<a class="ui button big primary" href="{{ path('model_index') }}">{{ 'homepage.models.browse' | trans }}</a>
|
||||
</div>
|
||||
<div class="column">
|
||||
<div class="ui horizontal statistic">
|
||||
<div class="value">
|
||||
{{ sets }}
|
||||
</div>
|
||||
<div class="label">
|
||||
{{ 'homepage.sets.title' | trans }}
|
||||
</div>
|
||||
<div class="column">
|
||||
<h2 class="ui icon header">
|
||||
<i class="cubes icon"></i>
|
||||
{{ sets }} {{ 'homepage.sets.title' | trans }}
|
||||
</h2>
|
||||
<p>{{ 'homepage.sets.text' | trans | raw }}</p>
|
||||
<a class="ui button big primary" href="{{ path('set_index') }}">{{ 'homepage.sets.browse' | trans }}</a>
|
||||
</div>
|
||||
<p>{{ 'homepage.sets.text' | trans | raw }}</p>
|
||||
<a class="ui button big primary" href="{{ path('set_index') }}">{{ 'homepage.sets.browse' | trans }}</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="ui vertical stripe segment alternate">
|
||||
|
||||
<div class="ui black inverted vertical footer segment stripe">
|
||||
<div class="ui aligned container">
|
||||
<div class="ui horizontal inverted small divided link list">
|
||||
<p>LEGO<sup>®</sup>, the LEGO logo, the Minifigure, and the Brick and Knob configurations are trademarks of the LEGO Group of Companies which does not sponsor, authorize, or endorse this site.</p>
|
||||
Copyright © 2017 PrintABrick
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{% include '::footer.html.twig' %}
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
|
9
app/Resources/views/footer.html.twig
Normal file
9
app/Resources/views/footer.html.twig
Normal file
@ -0,0 +1,9 @@
|
||||
<footer class="ui black inverted vertical footer segment stripe">
|
||||
<div class="ui aligned container">
|
||||
<div class="ui horizontal inverted small divided link list">
|
||||
<p>LEGO<sup>®</sup>, the LEGO logo, the Minifigure, and the Brick and Knob configurations are trademarks of the LEGO Group of Companies which does not sponsor, authorize, or endorse this site.</p>
|
||||
|
||||
<p>Copyright © 2017 {% if '2017' != 'now'|date('Y') %}- {{ 'now'|date('Y') }}{% endif %} {{ name }}</p>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
@ -3,7 +3,8 @@
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0">
|
||||
<title>{% block title %}PrintABrick{% endblock %}</title>
|
||||
<meta name="description" content="{{ 'meta.description' | trans | striptags('sup') }}">
|
||||
<title>{% block title %}{{ name }} - {{ 'meta.description' | trans | striptags('sup') }}{% endblock %}</title>
|
||||
{% block stylesheets %}
|
||||
<link rel="stylesheet" href="{{ fileTimestamp(asset('resources/css/main.css')) }}">
|
||||
{% endblock %}
|
||||
@ -15,7 +16,7 @@
|
||||
<link rel="mask-icon" href="{{ asset('safari-pinned-tab.svg') }}" color="#5bbad5">
|
||||
<meta name="theme-color" content="#ffffff">
|
||||
</head>
|
||||
<body class="default-theme body">
|
||||
<body class="default-theme body pushable">
|
||||
{% block body %}
|
||||
|
||||
{% endblock %}
|
||||
|
@ -6,7 +6,7 @@
|
||||
{% set placeholder = asset("resources/images/transparent_min.png") %}
|
||||
{% endif %}
|
||||
|
||||
<img src="{{ placeholder }}" data-src="{{ asset(color~'/'~number~'.png') | imagine_filter(filter)}}">
|
||||
<img src="{{ placeholder }}" data-src="{{ asset(color~'/'~number~'.png') | imagine_filter(filter) }}">
|
||||
</div>
|
||||
{% endmacro %}
|
||||
|
||||
@ -18,7 +18,7 @@
|
||||
{% set placeholder = asset("resources/images/transparent_min.png") %}
|
||||
{% endif %}
|
||||
|
||||
<img src="{{ placeholder }}" data-src="{{ asset(number~'.jpg')|imagine_filter(filter) }}">
|
||||
<img src="{{ placeholder }}" data-src="{{ asset(number~'.jpg')|imagine_filter(filter) }}">
|
||||
</div>
|
||||
{% endmacro %}
|
||||
|
||||
@ -41,7 +41,7 @@
|
||||
{% endmacro %}
|
||||
|
||||
{% macro part(part, quantity = null, color = -1) %}
|
||||
<a class="column part" href="{{ url('reb_part_detail', {'id': part.id})}}">
|
||||
<a class="column part" href="{{ url('part_detail', {'id': part.id})}}">
|
||||
<div class="ui card">
|
||||
{% import _self as blocks %}
|
||||
{{ blocks.partImage(part.id,'part_min', color) }}
|
||||
|
@ -23,7 +23,7 @@
|
||||
{% if item.hasChildren and options.depth is not same as(0) and item.displayChildren %}
|
||||
{% import _self as knp_menu %}
|
||||
{#<div {{ knp_menu.attributes(listAttributes) }}>#}
|
||||
{{ block('children') }}
|
||||
{{ block('children') }}
|
||||
{#</div>#}
|
||||
{% endif %}
|
||||
{% endblock %}
|
||||
|
@ -7,99 +7,110 @@
|
||||
{% block header %}{{ model.name }}{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="ui stackable grid">
|
||||
<div class="column ten wide">
|
||||
<div id="model-viewer" class="model-container">
|
||||
{{ blocks.partImage(model.id,'part_large') }}
|
||||
</div>
|
||||
</div>
|
||||
<div class="column six wide">
|
||||
<div class="item-info ui">
|
||||
<table class="ui very basic table">
|
||||
<tr>
|
||||
<td>{{ 'model.id' | trans }}</td>
|
||||
<td><h2>{{ model.id }}</h2></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>{{ 'model.name' | trans }}</td>
|
||||
<td>{{ model.name }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>{{ 'model.category' | trans }}</td>
|
||||
<td><a href="{{ path('model_index',{'m[category]':model.category.id}) }}">{{ model.category ? model.category.name }}</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>{{ 'model.author' | trans }}</td><td>{{ model.author.name }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>{{ 'model.set.count' | trans }}</td><td>{{ sets|length }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>{{ 'model.license' | trans }}</td>
|
||||
<td>
|
||||
{{ blocks.ccal2_license(model.name,model.author.name) }}
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>{{ 'model.keywords' | trans }}</td>
|
||||
<td>
|
||||
<div class="ui grey labels">
|
||||
{% for keyword in model.keywords %}
|
||||
<span class="ui label">{{ keyword.name }}</span>
|
||||
{% endfor %}
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
{% if model.aliases|length %}
|
||||
<tr>
|
||||
<td>{{ 'model.aliases' | trans }}</td>
|
||||
<td>
|
||||
{% for alias in model.aliases | slice(0,20)%}
|
||||
<span>{{ alias.id }}</span>{% if not loop.last %},{% endif %}
|
||||
{% endfor %}
|
||||
{% if model.aliases|length > 20 %}…{% endif %}
|
||||
</td>
|
||||
</tr>
|
||||
{% endif %}
|
||||
</table>
|
||||
<a class="ui download fluid primary button" href="{{ path('model_zip', {id: model.id}) }}">{{ 'model.download'|trans }}</a>
|
||||
<div class="ui vertical segment alternate stripe">
|
||||
<div class="ui container stackable grid">
|
||||
<div class="row">
|
||||
<div class="column ten wide">
|
||||
<div id="model-viewer" class="model-container">
|
||||
{{ blocks.partImage(model.id,'part_large') }}
|
||||
</div>
|
||||
</div>
|
||||
<div class="column six wide">
|
||||
<div class="item-info ui">
|
||||
<table class="ui very basic table">
|
||||
<tr>
|
||||
<td>{{ 'model.id' | trans }}</td>
|
||||
<td><h3>{{ model.id }}</h3></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>{{ 'model.name' | trans }}</td>
|
||||
<td>{{ model.name }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>{{ 'model.category' | trans }}</td>
|
||||
<td><a href="{{ path('model_index',{'m[category]':model.category.id}) }}">{{ model.category ? model.category.name }}</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>{{ 'model.author' | trans }}</td><td>{{ model.author.name }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>{{ 'model.set.count' | trans }}</td><td>{{ sets|length }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>{{ 'model.license' | trans }}</td>
|
||||
<td>
|
||||
{{ blocks.ccal2_license(model.name,model.author.name) }}
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>{{ 'model.keywords' | trans }}</td>
|
||||
<td>
|
||||
<div class="ui grey labels">
|
||||
{% for keyword in model.keywords %}
|
||||
<span class="ui label">{{ keyword.name }}</span>
|
||||
{% endfor %}
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
{% if model.aliases|length %}
|
||||
<tr>
|
||||
<td>{{ 'model.aliases' | trans }}</td>
|
||||
<td>
|
||||
{% for alias in model.aliases | slice(0,15)%}
|
||||
<span>{{ alias.id }}</span>{% if not loop.last %},{% endif %}
|
||||
{% endfor %}
|
||||
{% if model.aliases|length > 15 %}…{% endif %}
|
||||
</td>
|
||||
</tr>
|
||||
{% endif %}
|
||||
</table>
|
||||
<a class="ui download fluid primary button" href="{{ path('model_zip', {id: model.id}) }}"><i class="download icon"></i> {{ 'model.download'|trans }}</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="ui segment vertical">
|
||||
{% if subparts|length %}
|
||||
<div class="ui segment vertical noborder">
|
||||
<h4 class="ui horizontal divider header">Submodels ({{ model.subparts|length }})</h4>
|
||||
<div class="ui grid doubling ten column row parts">
|
||||
{% for subpart in subparts %}
|
||||
{{ blocks.model(subpart['model'], subpart['quantity']) }}
|
||||
{% endfor %}
|
||||
<div class="ui vertical segment">
|
||||
<div class="container ui">
|
||||
<div class="ui tabular pointing secondary menu stackable">
|
||||
{% if subparts|length %}
|
||||
<a class="item active" data-tab="subparts">{{ 'model.subparts' | trans }} ({{ subparts|length }})</a>
|
||||
{% endif %}
|
||||
{% if related|length %}
|
||||
<a class="item {% if not subparts|length %}active{% endif %}" data-tab="related">{{ 'model.related' | trans }} ({{ related|length }})</a>
|
||||
{% endif %}
|
||||
{% if model.parents|length %}
|
||||
<a class="item {% if not subparts|length and not related|length %}active{% endif %}" data-tab="parents">{{ 'model.parents' | trans }} ({{ model.parents|length }})</a>
|
||||
{% endif %}
|
||||
</div>
|
||||
{% if subparts|length %}
|
||||
<div class="ui tab active" data-tab="subparts">
|
||||
<div class="ui grid doubling ten column row parts">
|
||||
{% for subpart in subparts %}
|
||||
{{ blocks.model(subpart['model'], subpart['quantity']) }}
|
||||
{% endfor %}
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
{% if related|length %}
|
||||
<div class="ui tab {% if not subparts|length %}active{% endif %}" data-tab="related">
|
||||
<div class="ui grid doubling ten column row parts">
|
||||
{% for model in related %}
|
||||
{{ blocks.model(model) }}
|
||||
{% endfor %}
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
{% if model.parents|length %}
|
||||
<div class="ui tab {% if not subparts|length and not related|length %}active{% endif %}" data-tab="parents">
|
||||
<div class="ui grid doubling ten column row parts">
|
||||
{% for subpart in model.parents %}
|
||||
{{ blocks.model(subpart.parent) }}
|
||||
{% endfor %}
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
{% if related|length %}
|
||||
<div class="ui segment vertical noborder">
|
||||
<h4 class="ui horizontal divider header">Related models ({{ related|length }})</h4>
|
||||
<div class="ui grid doubling ten column row parts">
|
||||
{% for model in related %}
|
||||
{{ blocks.model(model) }}
|
||||
{% endfor %}
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
{% if model.parents|length %}
|
||||
<div class="ui segment vertical noborder">
|
||||
<h4 class="ui horizontal divider header">Parent models ({{ model.parents|length }})</h4>
|
||||
<div class="ui grid doubling ten column row parts">
|
||||
{% for subpart in model.parents %}
|
||||
{{ blocks.model(subpart.parent) }}
|
||||
{% endfor %}
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
@ -107,7 +118,7 @@
|
||||
{{ parent() }}
|
||||
<script type="text/javascript">
|
||||
window.onload = function() {
|
||||
$('#model-viewer').ModelViewer('{{ url('media_file', {'path': model.path }) }}');
|
||||
$('#model-viewer').ModelViewer('{{ path('media_file', {'path': model.path }) }}');
|
||||
};
|
||||
</script>
|
||||
{% endblock %}
|
@ -7,44 +7,60 @@
|
||||
{% block header %}{{ 'page.model.index' | trans }}{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="ui container divided stackable grid">
|
||||
<div class="row">
|
||||
<div class="column four wide">
|
||||
<h3>{{ 'model.filter.title' | trans }}</h3>
|
||||
{{ form_start(form) }}
|
||||
{{ form_row(form.query) }}
|
||||
{{ form_row(form.category) }}
|
||||
<div class="field">
|
||||
<input class="ui fluid submit button" type="submit" value="Filter"/>
|
||||
</div>
|
||||
{{ form_end(form) }}
|
||||
</div>
|
||||
<div class="column twelve wide">
|
||||
<div class="ui header vertical noborder">
|
||||
<div class="ui text menu right floated">
|
||||
<div class="header item">Sort By</div>
|
||||
{{ knp_pagination_sortable(models, 'Number', 'm.id') }}
|
||||
{{ knp_pagination_sortable(models, 'Name', 'm.name') }}
|
||||
<div class="ui segment vertical">
|
||||
<div class="ui container stackable grid divided">
|
||||
<div class="column four wide alternate stripe">
|
||||
<div class="segment basic ui filter">
|
||||
<h3 class="header dividing ui">{{ 'model.filter.title' | trans }}</h3>
|
||||
{{ form_start(form) }}
|
||||
<div class="field">
|
||||
{{ form_label(form.query) }}
|
||||
<div class="ui icon input">
|
||||
{{ form_widget(form.query) }}
|
||||
<i class="search icon"></i>
|
||||
</div>
|
||||
</div>
|
||||
{{ form_row(form.category) }}
|
||||
<div class="field">
|
||||
<input class="ui fluid submit green button" type="submit" value="Search"/>
|
||||
</div>
|
||||
{{ form_end(form) }}
|
||||
</div>
|
||||
</div>
|
||||
<div class="column twelve wide">
|
||||
<div class="segment basic ui">
|
||||
<div class="ui header segment vertical sort">
|
||||
<div class="ui grid stackable">
|
||||
<div class="left floated left aligned eleven wide column">
|
||||
<div class="ui text menu">
|
||||
<div class="header item">Sort By</div>
|
||||
{{ knp_pagination_sortable(models, 'Number', 'm.id') }}
|
||||
{{ knp_pagination_sortable(models, 'Name', 'm.name') }}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="found-count ui text menu">
|
||||
<div class="header item">Showing</div>
|
||||
<span class="item">{{ models.getTotalItemCount }}</span>
|
||||
<div class="right floated right aligned five wide column">
|
||||
<div class="ui text menu right floated">
|
||||
<div class="header item">Showing</div>
|
||||
<span class="item">{{ models.getTotalItemCount }}</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="ui segment vertical">
|
||||
<div class="ui six column doubling grid parts">
|
||||
{% for model in models %}
|
||||
{{ blocks.model(model) }}
|
||||
{% else %}
|
||||
{{ blocks.empty('empty.search.title' | trans )}}
|
||||
{% endfor %}
|
||||
</div>
|
||||
</div>
|
||||
<div class="ui column vertical segment">
|
||||
{{ knp_pagination_render(models) }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="ui segment vertical noborder">
|
||||
<div class="ui six column doubling grid parts">
|
||||
{% for model in models %}
|
||||
{{ blocks.model(model) }}
|
||||
{% else %}
|
||||
{{ blocks.empty('empty.search.title' | trans )}}
|
||||
{% endfor %}
|
||||
</div>
|
||||
</div>
|
||||
<div class="ui column vertical segment noborder">
|
||||
{{ knp_pagination_render(models) }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
@ -7,27 +7,31 @@
|
||||
{% block header %}{{ 'page.search' | trans({'%query%':query}) }}{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="ui vertical segment noborder">
|
||||
<h2 class="ui dividing header">Sets <small>({{ sets | length }})</small></h2>
|
||||
<div class="ui eight column doubling grid sets">
|
||||
{% for set in sets | slice(0,8) %}
|
||||
{{ blocks.set(set) }}
|
||||
{% endfor %}
|
||||
</div>
|
||||
<div class="spacing top">
|
||||
<a class="show all" href="{{ path('set_index',{'s[query]':query}) }}">{{ 'view.all.sets' | trans }}</a>
|
||||
<div class="ui vertical segment alternate stripe">
|
||||
<div class="ui container">
|
||||
<h2 class="ui header">Sets <small>({{ sets | length }})</small></h2>
|
||||
<div class="ui eight column doubling grid sets">
|
||||
{% for set in sets | slice(0,8) %}
|
||||
{{ blocks.set(set) }}
|
||||
{% endfor %}
|
||||
</div>
|
||||
<div class="spacing top">
|
||||
<a class="show all" href="{{ path('set_index',{'s[query]':query}) }}">{{ 'view.all.sets' | trans }}</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="ui vertical segment noborder">
|
||||
<h2 class="ui dividing header">Models <small>({{ models | length }})</small></h2>
|
||||
<div class="ui eight column doubling grid parts">
|
||||
{% for model in models | slice(0,8) %}
|
||||
{{ blocks.model(model) }}
|
||||
{% endfor %}
|
||||
</div>
|
||||
<div class="spacing top">
|
||||
<a class="show all" href="{{ path('model_index',{'m[query]':query}) }}">{{ 'view.all.models' | trans }}</a>
|
||||
<div class="ui vertical segment">
|
||||
<div class="ui container">
|
||||
<h2 class="ui header">Models <small>({{ models | length }})</small></h2>
|
||||
<div class="ui eight column doubling grid parts">
|
||||
{% for model in models | slice(0,8) %}
|
||||
{{ blocks.model(model) }}
|
||||
{% endfor %}
|
||||
</div>
|
||||
<div class="spacing top">
|
||||
<a class="show all" href="{{ path('model_index',{'m[query]':query}) }}">{{ 'view.all.models' | trans }}</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
@ -7,76 +7,84 @@
|
||||
{% block header %}{{ set.name | escape('html') }}{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="ui stackable grid">
|
||||
<div class="column nine wide">
|
||||
<a class="ui bordered fluid image" href="{{ asset(set.id~'.jpg')|imagine_filter('set_large') }}" data-lightbox="setImages">
|
||||
{{ blocks.setImage(set.id,'set_large') }}
|
||||
</a>
|
||||
</div>
|
||||
<div class="column seven wide">
|
||||
<div class="item-info ui">
|
||||
<table class="ui very basic table">
|
||||
<tr>
|
||||
<td>{{ 'set.id' | trans }}</td><td><h2>{{ set.id }}</h2></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>{{ 'set.name' | trans }}</td><td>{{ set.name }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>{{ 'set.year' | trans }}</td><td><a href="{{ path('set_index',{'s[year][from]':set.year, 's[year][to]':set.year}) }}">{{ set.year }}</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>{{ 'set.theme' | trans }}</td>
|
||||
<td><a href="{{ path('set_index',{'s[theme]' : set.theme.id }) }}">{{ set.theme ? set.theme.fullName }}</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>{{ 'set.parts' | trans }}</td><td>
|
||||
{{ set.partCount~' (Rebrickable)' }}{{ brset and brset.pieces ? ' / '~brset.pieces~' (Brickset)' }}
|
||||
</td>
|
||||
</tr>
|
||||
{% if brset %}
|
||||
{% if brset.minifigs %}
|
||||
|
||||
<div class="ui vertical segment alternate stripe">
|
||||
<div class="ui container stackable grid">
|
||||
<div class="row">
|
||||
<div class="column nine wide">
|
||||
<a class="ui bordered image" href="{{ asset(set.id~'.jpg')|imagine_filter('set_large') }}" data-lightbox="setImages">
|
||||
{{ blocks.setImage(set.id,'set_large') }}
|
||||
</a>
|
||||
</div>
|
||||
<div class="column seven wide">
|
||||
<div class="item-info ui">
|
||||
<table class="ui very basic table">
|
||||
<tr>
|
||||
<td>{{ 'set.minifigs' | trans }}</td>
|
||||
<td>{{ brset.minifigs }}</td>
|
||||
<td>{{ 'set.id' | trans }}</td><td><h2>{{ set.id }}</h2></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>{{ 'set.name' | trans }}</td><td>{{ set.name }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>{{ 'set.year' | trans }}</td><td><a href="{{ path('set_index',{'s[year][from]':set.year, 's[year][to]':set.year}) }}">{{ set.year }}</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>{{ 'set.theme' | trans }}</td>
|
||||
<td><a href="{{ path('set_index',{'s[theme]' : set.theme.id }) }}">{{ set.theme ? set.theme.fullName }}</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>{{ 'set.parts' | trans }}</td><td>
|
||||
{{ set.partCount~' (Rebrickable)' }}{{ brset and brset.pieces ? ' / '~brset.pieces~' (Brickset)' }}
|
||||
</td>
|
||||
</tr>
|
||||
{% endif %}
|
||||
<tr>
|
||||
<td>{{ 'set.rating' | trans }}</td>
|
||||
<td>
|
||||
{{ brset.rating | number_format(1, '.', ',') }} / 5
|
||||
</td>
|
||||
</tr>
|
||||
{% endif %}
|
||||
<tr>
|
||||
<td></td>
|
||||
<td>
|
||||
<a class="rebrickable link" href="http://rebrickable.com/sets/{{ set ? set.id }}">Rebrickable</a>
|
||||
{% if brset %}
|
||||
<a class="brickset link" href="{{ brset.bricksetURL }}">Brickset</a>
|
||||
{% if brset.minifigs %}
|
||||
<tr>
|
||||
<td>{{ 'set.minifigs' | trans }}</td>
|
||||
<td>{{ brset.minifigs }}</td>
|
||||
</tr>
|
||||
{% endif %}
|
||||
<tr>
|
||||
<td>{{ 'set.rating' | trans }}</td>
|
||||
<td>
|
||||
{{ brset.rating | number_format(1, '.', ',') }} / 5
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td></td>
|
||||
<td>
|
||||
<a class="brickset link" href="{{ brset.bricksetURL }}">Brickset</a>
|
||||
</td>
|
||||
</tr>
|
||||
{% endif %}
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<tr>
|
||||
<td></td>
|
||||
<td>
|
||||
<a class="rebrickable link" href="http://rebrickable.com/sets/{{ set ? set.id }}">Rebrickable</a>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="ui segment vertical">
|
||||
<div class="ui tabular pointing secondary menu">
|
||||
<a class="item active" data-tab="inventory"><i class="cubes icon"></i> Inventory ({{ set ? set.partCount : 0}})</a>
|
||||
{% if brset %}
|
||||
<a class="item" data-tab="description"><i class="info icon"></i> Description</a>
|
||||
<a class="item" data-tab="images"> <i class="image icon"></i> Images ({{ brset.additionalImageCount }})</a>
|
||||
<a class="item" data-tab="instructions"> <i class="file pdf outline icon"></i> Instructions ({{ brset.instructionsCount }})</a>
|
||||
<a class="item" data-tab="reviews"><i class="write icon"></i> Reviews ({{ brset.reviewCount }})</a>
|
||||
{% endif %}
|
||||
<div class="ui vertical segment">
|
||||
<div class="ui tabular pointing secondary menu stackable">
|
||||
<div class="container ui">
|
||||
<a class="item active" data-tab="inventory"><i class="cubes icon"></i> Inventory ({{ set ? set.partCount : 0}})</a>
|
||||
{% if brset %}
|
||||
<a class="item" data-tab="description"><i class="info icon"></i> Description</a>
|
||||
<a class="item" data-tab="images"> <i class="image icon"></i> Images ({{ brset.additionalImageCount }})</a>
|
||||
<a class="item" data-tab="instructions"> <i class="file pdf outline icon"></i> Instructions ({{ brset.instructionsCount }})</a>
|
||||
<a class="item" data-tab="reviews"><i class="write icon"></i> Reviews ({{ brset.reviewCount }})</a>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
<div class="ui vertical segment unpadded">
|
||||
|
||||
<div class="container ui">
|
||||
<div class="ui tab active" data-tab="inventory">
|
||||
<div class="ui vertical segment unpadded">
|
||||
{{ render(path('set_inventory', {id: set.id})) }}
|
||||
</div>
|
||||
{{ render(path('set_inventory', {id: set.id})) }}
|
||||
</div>
|
||||
{% if brset %}
|
||||
<div class="ui tab ajax-load" data-tab="description" data-src="{{ path('brickset_description', { 'id': brset.setID }) }}">
|
||||
@ -94,4 +102,6 @@
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
{% endblock %}
|
@ -7,42 +7,57 @@
|
||||
{% block header %}{{ 'page.set.index' | trans }}{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="ui container divided stackable grid">
|
||||
<div class="row">
|
||||
<div class="column four wide">
|
||||
<h3>{{ 'set.filter.title' | trans }}</h3>
|
||||
{{ form_start(form) }}
|
||||
<div class="ui segment vertical">
|
||||
<div class="ui container grid stackable divided">
|
||||
<div class="column four wide alternate stripe">
|
||||
<div class="segment basic ui filter">
|
||||
<h3 class="header dividing ui">{{ 'set.filter.title' | trans }}</h3>
|
||||
{{ form_start(form) }}
|
||||
|
||||
{{ form_row(form.query) }}
|
||||
{{ form_row(form.theme) }}
|
||||
{{ form_row(form.year) }}
|
||||
{{ form_row(form.partCount) }}
|
||||
|
||||
{{ form_rest(form) }}
|
||||
<div class="field">
|
||||
{{ form_label(form.query) }}
|
||||
<div class="ui icon input">
|
||||
{{ form_widget(form.query) }}
|
||||
<i class="search icon"></i>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="field">
|
||||
<input class="ui fluid submit button" type="submit" value="Filter"/>
|
||||
{{ form_row(form.theme) }}
|
||||
{{ form_row(form.partCount) }}
|
||||
{{ form_row(form.year) }}
|
||||
|
||||
{{ form_rest(form) }}
|
||||
|
||||
<div class="field">
|
||||
<input class="ui fluid submit green button" type="submit" value="{{ 'form.search'|trans({},'messages') }}"/>
|
||||
</div>
|
||||
{{ form_end(form) }}
|
||||
</div>
|
||||
{{ form_end(form) }}
|
||||
</div>
|
||||
<div class="column twelve wide">
|
||||
<div class="ui header vertical noborder">
|
||||
<div class="ui text menu right floated">
|
||||
<div class="header item">Sort By</div>
|
||||
<div class="ui header segment basic sort">
|
||||
<div class="ui grid stackable">
|
||||
<div class="left floated left aligned twelve wide column">
|
||||
<div class="ui text menu">
|
||||
<div class="header item">Sort By</div>
|
||||
|
||||
{{ knp_pagination_sortable(sets, 'Number', ['s.id']) }}
|
||||
{{ knp_pagination_sortable(sets, 'Year', ['s.year']) }}
|
||||
{{ knp_pagination_sortable(sets, 'Name', ['s.name']) }}
|
||||
{{ knp_pagination_sortable(sets, 'Parts', ['s.partCount']) }}
|
||||
</div>
|
||||
{{ knp_pagination_sortable(sets, 'Number', ['s.id']) }}
|
||||
{{ knp_pagination_sortable(sets, 'Year', ['s.year']) }}
|
||||
{{ knp_pagination_sortable(sets, 'Name', ['s.name']) }}
|
||||
{{ knp_pagination_sortable(sets, 'Parts', ['s.partCount']) }}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="found-count ui text menu">
|
||||
<div class="header item">Showing</div>
|
||||
<span class="item">{{ sets.getTotalItemCount }}</span>
|
||||
<div class="right floated right aligned four wide column">
|
||||
<div class="ui text right floated menu">
|
||||
<div class="header item">Showing</div>
|
||||
<span class="item">{{ sets.getTotalItemCount }}</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="ui segment vertical noborder">
|
||||
<div class="ui segment basic">
|
||||
<div class="ui four column doubling grid sets">
|
||||
{% for set in sets %}
|
||||
{{ blocks.set(set) }}
|
||||
@ -51,7 +66,7 @@
|
||||
{% endfor %}
|
||||
</div>
|
||||
</div>
|
||||
<div class="ui segment vertical noborder">
|
||||
<div class="ui segment basic">
|
||||
{{ knp_pagination_render(sets) }}
|
||||
</div>
|
||||
</div>
|
||||
|
@ -9,7 +9,7 @@
|
||||
{% endfor %}
|
||||
|
||||
<div class="ui segment clearing noborder vertical">
|
||||
<a class="ui primary right floated button" href="{{ path('set_zip', {id: set.id, sorted: true }) }}" download>{{ 'set.download.multicolor.button' | trans}}</a>
|
||||
<a class="ui primary right floated button" href="{{ path('set_zip', {id: set.id, sorted: true }) }}" download><i class="download icon"></i> {{ 'set.download.multicolor.button' | trans}}</a>
|
||||
</div>
|
||||
|
||||
{% if colors|length > 0 %}
|
||||
|
@ -8,7 +8,6 @@
|
||||
{% endfor %}
|
||||
{% endfor %}
|
||||
|
||||
<div class="ui segment vertical">
|
||||
{% if inventorySets %}
|
||||
<h3 class="ui horizontal divider header">Sets</h3>
|
||||
<div class="ui eight column doubling grid sets">
|
||||
@ -29,21 +28,18 @@
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
<div class="ui tabular icon pointing secondary menu submenu">
|
||||
<a class="ui item active button" data-tab="inventory/models"><i class="grid layout icon"></i> Uni-Color</a>
|
||||
<a class="ui item button" data-tab="inventory/colors"><i class="list layout icon"></i> Multi-Color</a>
|
||||
<div class="ui top attached tabular menu submenu">
|
||||
<a class="ui item {% if not app.session.get('multicolor') %}active{% endif %}" data-tab="inventory/models"><i class="grid layout icon"></i> Uni-Color</a>
|
||||
<a class="ui item {% if app.session.get('multicolor') %}active{% endif %}" data-tab="inventory/colors"><i class="list layout icon"></i> Multi-Color</a>
|
||||
</div>
|
||||
|
||||
<div class="ui tab active" data-tab="inventory/models">
|
||||
<div class="ui bottom attached tab {% if not app.session.get('multicolor') %}active{% endif %}" data-tab="inventory/models">
|
||||
{{ render(path('set_models', {id: set.id})) }}
|
||||
</div>
|
||||
<div class="ui tab" data-tab="inventory/colors">
|
||||
<div class="ui bottom attached tab {% if app.session.get('multicolor') %}active{% endif %}" data-tab="inventory/colors">
|
||||
{{ render(path('set_colors', {id: set.id})) }}
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
</div>
|
||||
<div class="ui segment vertical">
|
||||
<p class="ui text right">{{ 'set.rebrickable.credit' | trans | raw }}</p>
|
||||
</div>
|
||||
{% endblock %}
|
@ -8,12 +8,12 @@
|
||||
{% endfor %}
|
||||
{% endfor %}
|
||||
|
||||
<div class="ui segment clearing noborder vertical">
|
||||
<a class="ui primary right floated button" href="{{ path('set_zip', {id: set.id, sorted: false }) }}" download>{{ 'set.download.unicolor.button' | trans}}</a>
|
||||
<div class="ui segment clearing basic vertical">
|
||||
<a class="ui primary right floated button" href="{{ path('set_zip', {id: set.id, sorted: false }) }}" download><i class="download icon"></i> {{ 'set.download.unicolor.button' | trans}}</a>
|
||||
</div>
|
||||
|
||||
{% if models|length > 0 %}
|
||||
<div class="ui segment vertical noborder">
|
||||
<div class="ui segment vertical basic">
|
||||
<h3 class="ui horizontal divider header">Models</h3>
|
||||
<div class="ui grid doubling ten column row parts">
|
||||
{% for model in models %}
|
||||
@ -23,7 +23,7 @@
|
||||
</div>
|
||||
{% endif %}
|
||||
{% if missing|length > 0 %}
|
||||
<div class="ui segment vertical noborder">
|
||||
<div class="ui segment vertical basic">
|
||||
<h3 class="ui horizontal divider header">Missing</h3>
|
||||
<div class="ui grid doubling ten column row parts">
|
||||
{% for part in missing %}
|
||||
|
@ -9,6 +9,7 @@ imports:
|
||||
# http://symfony.com/doc/current/best_practices/configuration.html#application-related-configuration
|
||||
parameters:
|
||||
locale: en
|
||||
name: "PrintABrick"
|
||||
# rebrickable csv files root URL (http://rebrickable.com/media/downloads/ or local dir containing csv files)
|
||||
app.rebrickable_downloads_url: 'http://rebrickable.com/media/downloads/'
|
||||
app.ld_library_download_url: 'http://www.ldraw.org/library/updates/completeCA.zip'
|
||||
@ -41,6 +42,8 @@ framework:
|
||||
|
||||
# Twig Configuration
|
||||
twig:
|
||||
globals:
|
||||
name: "%name%"
|
||||
debug: "%kernel.debug%"
|
||||
strict_variables: "%kernel.debug%"
|
||||
form_themes: ['form/semantic-ui.html.twig', 'form/search.html.twig']
|
||||
|
Loading…
x
Reference in New Issue
Block a user