1
0
mirror of https://github.com/ToxicCrack/PrintABrick.git synced 2025-05-28 01:30:11 -07:00

Improve templates

This commit is contained in:
Unknown 2017-06-02 03:25:57 +02:00
parent 00d455210d
commit 71bb607772
26 changed files with 637 additions and 479 deletions

View File

@ -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')
;
});

View File

@ -145,6 +145,5 @@ $colors: (
.text.color-#{$number} {
color: $color;
//background: color-contrast($color,#000,#FFF);
}
}

View File

@ -0,0 +1,5 @@
.filter {
.number-range {
margin: 1em 0.6em 3em;
}
}

View File

@ -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;
}
}

View File

@ -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 {
@ -84,13 +48,13 @@
.pull-right {
float: right;
}
.ui.image.load {
background: url("/resources/images/spinner.svg") no-repeat center;
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;
}

View File

@ -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);
}

View 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;
}
}
}

View File

@ -1,9 +1,12 @@
@import "variables";
@import "mixins";
@import "navbar";
@import "table";
@import "main";
@import "homepage";
@import "modelviewer";
@import "filter";
@import "part";
@import "set";

View 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;
}
}
}

View File

@ -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

View File

@ -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 %}

View File

@ -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 %}

View File

@ -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 %}

View 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 &copy; 2017 {% if '2017' != 'now'|date('Y') %}- {{ 'now'|date('Y') }}{% endif %} {{ name }}</p>
</div>
</div>
</footer>

View File

@ -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 %}

View File

@ -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) }}

View File

@ -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 %}

View File

@ -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 %}&hellip;{% 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 %}&hellip;{% 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 %}

View File

@ -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 %}

View File

@ -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 %}

View File

@ -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 %}

View File

@ -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>

View File

@ -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 %}

View File

@ -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 %}

View File

@ -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 %}

View File

@ -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']