8 Commits

Author SHA1 Message Date
Krzysztof Płaczek
2e4c79c87a Merge branch 'master' into feature/order-columns
# Conflicts:
#	Dockerfile
#	templates/productList.html.twig
2025-03-17 12:52:07 +01:00
6246ad8692 Merge pull request 'Table is responsive on mobile' (#24) from feature/table-responsive-on-mobile into master
Reviewed-on: #24
2025-02-19 15:29:52 +01:00
Krzysztof Płaczek
d18abc6159 Table is responsive on mobile 2025-02-19 15:29:31 +01:00
5832ac583f Merge pull request 'Add a slash to static files.' (#23) from fix/missing-script-files-when-in-category into master
Reviewed-on: #23
2025-02-16 10:49:09 +01:00
Krzysztof Płaczek
8f87a6bbf0 Add a slash to static files. 2025-02-16 10:48:55 +01:00
Krzysztof Płaczek
c947e470af Increase php memory limit 2025-02-04 20:41:58 +01:00
Krzysztof Płaczek
8eeba225ed Merge branch 'master' of 192.168.0.129:krzysiej/ryobi-crawler into feature/order-columns 2025-01-28 09:15:49 +01:00
Krzysztof Płaczek
9b6bcd22be Start working on sorting products by different columns. 2025-01-27 12:10:15 +01:00
6 changed files with 82 additions and 59 deletions

View File

@@ -2,7 +2,9 @@
namespace Krzysiej\RyobiCrawler\Controller; namespace Krzysiej\RyobiCrawler\Controller;
use Illuminate\Database\Eloquent\Builder;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Twig\Environment; use Twig\Environment;
use Illuminate\Database\Capsule\Manager as Capsule; use Illuminate\Database\Capsule\Manager as Capsule;
@@ -17,4 +19,19 @@ class BaseController extends AbstractController
$capsule->setAsGlobal(); $capsule->setAsGlobal();
$capsule->bootEloquent(); $capsule->bootEloquent();
} }
protected function handleOrderProducts(Builder $builder, Request $request): Builder
{
$builder->orderByDesc('starred')->orderByDesc('created_by');
if ($request->query->get('order')) {
$orderField = $request->query->get('order');
$direction = 'desc';
if (str_starts_with($orderField, '-')) {
$direction = 'asc';
}
$builder->orderBy($request->query->get('order'), $direction);
}
return $builder;
}
} }

View File

@@ -3,18 +3,17 @@
namespace Krzysiej\RyobiCrawler\Controller; namespace Krzysiej\RyobiCrawler\Controller;
use Krzysiej\RyobiCrawler\Models\Product; use Krzysiej\RyobiCrawler\Models\Product;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route; use Symfony\Component\Routing\Attribute\Route;
final class IndexController extends BaseController final class IndexController extends BaseController
{ {
#[Route('/', name: 'app_home')] #[Route('/', name: 'app_home')]
public function __invoke(): Response public function __invoke(Request $request): Response
{ {
$products = Product::with(['currentStock', 'price']) $products = Product::with(['currentStock', 'price', 'currentPrice']);
->orderByDesc('starred') $products = $this->handleOrderProducts($products, $request)->get();
->orderByDesc('created_by')
->get();
return $this->render('productList.html.twig', ['products' => $products]); return $this->render('productList.html.twig', ['products' => $products]);
} }
} }

View File

@@ -16,6 +16,7 @@ final class NewController extends BaseController
{ {
$products = Product::where('created_at', '>', now()->modify('-30 days')->format('Y-m-d')) $products = Product::where('created_at', '>', now()->modify('-30 days')->format('Y-m-d'))
->orderByDesc('starred') ->orderByDesc('starred')
->orderByDesc('name')
->orderByDesc('created_by') ->orderByDesc('created_by')
->with(['currentPrice']) ->with(['currentPrice'])
->get(); ->get();

View File

@@ -1,6 +1,7 @@
{% extends "template.html.twig" %} {% extends "template.html.twig" %}
{% block content %} {% block content %}
<div class="table-responsive">
<table class='table table-hover'> <table class='table table-hover'>
<tr> <tr>
<td class="align-middle font-weight-bold h3"><a class="text-warning text-decoration-none" <td class="align-middle font-weight-bold h3"><a class="text-warning text-decoration-none"
@@ -11,10 +12,11 @@
<span class="badge text-bg-light">{{ product.subTitle }}</span> <span class="badge text-bg-light">{{ product.subTitle }}</span>
</td> </td>
<td> <td>
<nav aria-label="breadcrumb" style="--bs-breadcrumb-divider: '>';" > <nav aria-label="breadcrumb" style="--bs-breadcrumb-divider: '>';">
<ol class="breadcrumb"> <ol class="breadcrumb">
{% for category in product.categories %} {% for category in product.categories %}
<li class="breadcrumb-item" aria-current="page"><a class="breadcrumb-item text-decoration-none" href="{{ path('app_category', {'category': category}) }}">{{ category }}</a></li> <li class="breadcrumb-item" aria-current="page"><a class="breadcrumb-item text-decoration-none"
href="{{ path('app_category', {'category': category}) }}">{{ category }}</a></li>
{% endfor %} {% endfor %}
</ol> </ol>
</nav> </nav>
@@ -52,6 +54,7 @@
</td> </td>
</tr> </tr>
</table> </table>
</div>
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script> <script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
<script> <script>

View File

@@ -1,15 +1,17 @@
{% extends "template.html.twig" %} {% extends "template.html.twig" %}
{% block content %} {% block content %}
<div class="table-responsive">
{{ app.request.get('order') }}
<table class='table table-hover'> <table class='table table-hover'>
<thead> <thead>
<tr> <tr>
<th></th> <th></th>
<th></th> <th></th>
<th>Name</th> <th><a href="{{ path( app.request.get('_route') , {'order': app.request.get('order') is same as('-name')?'name':'-name'|default('-name')}) }}">Name</a></th>
<th>Categories</th> <th>Categories</th>
<th></th> <th></th>
<th>Price</th> <th><a href="{{ path( app.request.get('_route') , {'order': app.request.get('order') is same as('-price')?'price':'-price'|default('-price')}) }}">Price</a></th>
<th></th> <th></th>
</tr> </tr>
</thead> </thead>
@@ -55,4 +57,5 @@
</tr> </tr>
{% endfor %} {% endfor %}
</table> </table>
</div>
{% endblock %} {% endblock %}

View File

@@ -5,8 +5,8 @@
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge"> <meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Ryobi crawler</title> <title>Ryobi crawler</title>
<link href="templates/css/bootstrap.min.css" rel="stylesheet" /> <link href="/templates/css/bootstrap.min.css" rel="stylesheet" />
<script src="templates/js/script.js" defer></script> <script src="/templates/js/script.js" defer></script>
</head> </head>
<body> <body>
<nav class="navbar navbar-expand-lg sticky-top bg-body-tertiary border-bottom border-secondary border-1"> <nav class="navbar navbar-expand-lg sticky-top bg-body-tertiary border-bottom border-secondary border-1">