From: Stephen Cameron Date: Wed, 12 Jan 2022 18:47:25 +0000 (+0100) Subject: WIP #4893 @21 X-Git-Url: http://git.cubedesigners.com/?a=commitdiff_plain;h=ae03514dd16601d626c588a80992684e340baea3;p=pmi.git WIP #4893 @21 --- diff --git a/app/Http/Controllers/AjaxController.php b/app/Http/Controllers/AjaxController.php index a527fdb..9418291 100644 --- a/app/Http/Controllers/AjaxController.php +++ b/app/Http/Controllers/AjaxController.php @@ -7,6 +7,7 @@ use App\Models\Page; use App\Models\Product; use App\Models\QuoteRequest; use App\Models\Settings; +use App\Models\News; use Carbon\Carbon; use Cubist\Backpack\app\Http\Controllers\CubistFrontController; use Cubist\Backpack\app\Magic\PageData; @@ -243,4 +244,28 @@ class AjaxController extends CubistFrontController return Product::getFilteredProducts($product_type, $filter_values); } + + public function news(Request $request) { + // The current page number is passed in the HTTP request + // and detected automatically by Laravel's paginate() function + // Ref: https://laravel.com/docs/5.8/pagination#paginating-query-builder-results + //$page = $request->page ?? 1; + $per_page = $request->per_page ?? 8; + $exclude = $request->exclude ?? false; + + $posts = News::getPosts($per_page, $exclude); + + $news = [ + 'total' => $posts->total(), + 'current_page' => $posts->currentPage(), + 'last_page' => $posts->lastPage(), + 'html' => '', + ]; + + foreach ($posts as $post) { + $news['html'] .= view('components.news-item', ['item' => $post]); + } + + return $news; + } } diff --git a/app/Http/Controllers/NewsController.php b/app/Http/Controllers/NewsController.php index e0a11ad..7ac65d0 100644 --- a/app/Http/Controllers/NewsController.php +++ b/app/Http/Controllers/NewsController.php @@ -18,8 +18,6 @@ class NewsController extends CubistFrontController } $this->data['title'] = $newsItem->title; - $this->data['image'] = $newsItem->getFirstMediaUrl($newsItem->image, 'details'); - $this->data['alt'] = $newsItem->getFirstMediaAlt($newsItem->image, $newsItem->title); $this->data['news'] = $newsItem; $this->data['page'] = $newsItem->getPageData(); diff --git a/app/Models/News.php b/app/Models/News.php index c895430..534eebf 100644 --- a/app/Models/News.php +++ b/app/Models/News.php @@ -2,35 +2,59 @@ namespace App\Models; +use Carbon\Carbon; use Spatie\Image\Manipulations; -use Spatie\MediaLibrary\Conversion\Conversion; use Spatie\MediaLibrary\Models\Media; +use Cubist\Backpack\Facades\App; +use Cubist\Backpack\app\Magic\Menu\Menu; use Cubist\Backpack\app\Magic\Models\News as BaseNews; class News extends BaseNews { public function registerMediaConversions(Media $media = null) { - parent::registerMediaConversions($media); - $this->addMediaConversion('details') - ->width(600); + $this->addMediaConversion('featured') + ->width(768); $this->addMediaConversion('index_thumb') - ->crop(Manipulations::CROP_CENTER, 600, 400); + ->crop(Manipulations::CROP_CENTER, 348, 196); } - public function getThumbnailImage($class = '') { + public static function getPosts($per_page = 8, $exclude = null) { + + $locale = App::getLocale(); - // Fallback replacement when there's no image - $fallback = '
'; + $news = News::with('media') + ->whereVariant() + ->where('type', 'news') + ->where("status->$locale", 1) + ->whereDate('date', '<=', Carbon::now()) + ->orderBy('date', 'desc'); + + if ($exclude) { + $news->where('id', '!=', intval($exclude)); + } + + return $news->paginate($per_page); + } + + public function getThumbnailImage($class = '') + { + return $this->getImage('index_thumb', $class); + } + + public function getImage($size = 'index_thumb', $class = '') { + + // Fallback replacement when there's no image (based on thumbnail ratio of 196/348 + $fallback = '
'; if (!$this->image) { return $fallback; } - $src = $this->getFirstMediaUrl($this->image, 'index_thumb'); + $src = $this->getFirstMediaUrl($this->image, $size); $alt = e($this->getFirstMediaAlt($this->image, $this->title)); if (empty($src)) { @@ -40,6 +64,11 @@ class News extends BaseNews return ''. $alt .''; } + public function getURL($id) { + $nav = Menu::getNavigation(); + return $nav->getHrefByID("news/{$id}"); + } + // Display compact date range in localised human readable format // Ref: https://codereview.stackexchange.com/a/78303 // Alternative: https://github.com/flack/ranger diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index 0c9d881..f7f34cf 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -55,6 +55,8 @@ class AppServiceProvider extends ServiceProvider BladeX::component('components.phone-link'); // ... BladeX::component('components.text-block'); // ... BladeX::component('components.cart-add')->tag('cart-add'); // ... + BladeX::component('components.news-grid'); // ... + BladeX::component('components.news-item'); // ... } catch (\Exception $e) { } diff --git a/app/Templates/Home.php b/app/Templates/Home.php index 3f2b3a5..f9f61c4 100644 --- a/app/Templates/Home.php +++ b/app/Templates/Home.php @@ -74,24 +74,7 @@ class Home extends Base protected function _getNews() { - - $newsItems = []; - - $news = News::with('media') - ->whereVariant() - ->where('type', 'news') - ->orderBy('date', 'desc') - ->get(); - - foreach ($news as $newsItem) { - if (!$newsItem->getPageData()->get('status')) { - continue; - } - $newsItems[$newsItem->id] = $newsItem; - } - - return array_slice($newsItems, 0, 4, true); - + return News::getPosts(4); } diff --git a/app/Templates/News.php b/app/Templates/News.php index 2ecdc08..8120919 100644 --- a/app/Templates/News.php +++ b/app/Templates/News.php @@ -14,6 +14,12 @@ class News extends Base return 'Actualités'; } + public function init() + { + parent::init(); + $this->removeField('intro'); // Intro section not used on this page + } + public function setMenuChildren($menu) { Debugbar::startMeasure('nav_news', 'Make news nav items'); @@ -48,31 +54,17 @@ class News extends Base // Set extra data for News blade view public function setData(&$data) { - $data['news'] = $this->_getNews(); - $data['events'] = $this->_getEvents(); + $news = $this->_getNews(); + $data['featured_news'] = $news->shift(); // Isolate first news item as feature + $data['news'] = $news; // The rest of the items will display in the grid + $data['more_news'] = $news->lastPage() > 1; // Is there any more news after this initial lot? + + //$data['events'] = $this->_getEvents(); } protected function _getNews() { - - $newsItems = []; - - $news = NewsModel::with('media') - ->whereVariant() - ->where('type', 'news') - ->whereDate('date', '<=', Carbon::now()) - ->orderBy('date', 'desc') - ->get(); - - foreach ($news as $newsItem) { - if (!$newsItem->getPageData()->get('status')) { - continue; - } - $newsItems[$newsItem->id] = $newsItem; - } - - return $newsItems; - + return NewsModel::getPosts(9); // Featured item + initial 8 items for grid } protected function _getEvents() diff --git a/config/app.php b/config/app.php index 65dd406..894e01d 100644 --- a/config/app.php +++ b/config/app.php @@ -72,6 +72,9 @@ return [ ], ], + /* Grid overlay helper for layout */ + 'grid_overlay' => isset($_GET['grid-overlay']) || env('GRID_OVERLAY', false), + /* |-------------------------------------------------------------------------- | Application URL diff --git a/public/images/icon-newsletter.svg b/public/images/icon-newsletter.svg new file mode 100644 index 0000000..aaf8400 --- /dev/null +++ b/public/images/icon-newsletter.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/resources/js/components/FetchItems.vue b/resources/js/components/FetchItems.vue new file mode 100644 index 0000000..ebc48d5 --- /dev/null +++ b/resources/js/components/FetchItems.vue @@ -0,0 +1,75 @@ + + + + diff --git a/resources/styles/common/headings.styl b/resources/styles/common/headings.styl index abf4bd5..69c5bbc 100644 --- a/resources/styles/common/headings.styl +++ b/resources/styles/common/headings.styl @@ -5,7 +5,7 @@ h1, h2, h3, h4 @apply text-navy font-display font-semibold .h1, .h2, .markdown h1, .markdown h2 - @apply leading-tight relative + @apply leading-none relative &:not(.simple):after @apply bg-primary @@ -16,8 +16,7 @@ h1, h2, h3, h4 @apply text-6xl &:after - constrain(margin-top, 1vw) - constrain(margin-bottom, 2.5vw) + vertical-spacing(1.875vw, margin) constrain(width, 10vw) height: 8px diff --git a/resources/styles/common/links.styl b/resources/styles/common/links.styl index cb8509e..f9a5f22 100644 --- a/resources/styles/common/links.styl +++ b/resources/styles/common/links.styl @@ -32,7 +32,7 @@ main a:not([class]), a.animated-underline, a.partial-underline // Partial underline hover effect a.partial-underline - overflow: hidden + //overflow: hidden &:before constrain(width, 2.5vw) diff --git a/resources/styles/common/spacing.styl b/resources/styles/common/spacing.styl index 516131f..4ef8a8d 100644 --- a/resources/styles/common/spacing.styl +++ b/resources/styles/common/spacing.styl @@ -2,7 +2,9 @@ // This will generate classes like pt-1v, pt-2v, pr-1v etc. $vw-spacing = { + '0\.75': 1.875vw, '1': 2.5vw, + '1\.25': 3.125vw, '2': 5vw, '3': 7.5vw, '4': 10vw, diff --git a/resources/views/components/grid.blade.php b/resources/views/components/grid.blade.php index 59dee35..4545405 100644 --- a/resources/views/components/grid.blade.php +++ b/resources/views/components/grid.blade.php @@ -14,10 +14,11 @@ @php // Default classes $class = $class ?? ''; + $id_attribute = empty($id) ? '' : 'id="'. $id .'"'; $cols = !empty($cols) ? 'grid-cols-'.$cols : 'grid-cols-auto'; $gap = isset($gap) ? 'grid-gap-'.$gap : 'grid-gap-lg'; // Can be overridden by passing an empty string @endphp -
+
{{ $slot }}
diff --git a/resources/views/components/news-grid.blade.php b/resources/views/components/news-grid.blade.php new file mode 100644 index 0000000..8c5021d --- /dev/null +++ b/resources/views/components/news-grid.blade.php @@ -0,0 +1,12 @@ +@php + $items = $items ?? []; + $id = $id ?? ''; + $extraClass = $extraClass ?? ''; + $class = 'md:grid-cols-2 xs:grid-cols-1 xs:grid-gap-20v ' . $extraClass; +@endphp + + + @foreach ($items as $newsItem) + + @endforeach + diff --git a/resources/views/components/news-item.blade.php b/resources/views/components/news-item.blade.php new file mode 100644 index 0000000..adf66f3 --- /dev/null +++ b/resources/views/components/news-item.blade.php @@ -0,0 +1,22 @@ + diff --git a/resources/views/layouts/app.blade.php b/resources/views/layouts/app.blade.php index 4d5d255..65056b0 100644 --- a/resources/views/layouts/app.blade.php +++ b/resources/views/layouts/app.blade.php @@ -50,5 +50,6 @@
@include('cubist::privacy.cookies-consent') @include('cubist::body.end') +@includeWhen(config('app.grid_overlay'), 'partials.grid-overlay') diff --git a/resources/views/pages/home.blade.php b/resources/views/pages/home.blade.php index 3669790..14aa1d6 100644 --- a/resources/views/pages/home.blade.php +++ b/resources/views/pages/home.blade.php @@ -27,7 +27,7 @@
- +

{!! nl2br($slide['text']) !!}

@@ -66,32 +66,17 @@ - - + {{-- ToDo: refactor these blocks + handle different image sizes and title lengths --}} -

{{__('Capteurs')}}

- - {{-- ToDo: refactor these blocks + handle different image sizes and title lengths --}} - - - @foreach ($page->get('products_capteurs') as $highlight) - @include('partials.home-products') - @endforeach - - -
- - - -

{{__('Systèmes de mesure')}}

+ + @foreach ($page->get('products_capteurs') as $highlight) + @include('partials.home-products') + @endforeach + @foreach ($page->get('products_systems') as $highlight) + @include('partials.home-products') + @endforeach + - - @foreach ($page->get('products_systems') as $highlight) - @include('partials.home-products') - @endforeach - -
-
@@ -125,25 +110,8 @@ {{-- News --}} - - - - @foreach ($news as $newsItem) - @php - $newsURL = $nav->getHrefByID("news/{$newsItem->id}"); - @endphp - - - @endforeach - + + @endif diff --git a/resources/views/pages/news-detail.blade.php b/resources/views/pages/news-detail.blade.php index 2bf71bd..d479e58 100644 --- a/resources/views/pages/news-detail.blade.php +++ b/resources/views/pages/news-detail.blade.php @@ -7,10 +7,7 @@
- @if ($image) - {{-- Todo: use larger image + srcset here --}} - {{ $alt }} - @endif + {!! $news->getThumbnailImage('news-post-image') !!}
diff --git a/resources/views/pages/news.blade.php b/resources/views/pages/news.blade.php index 44b4908..5dfd8f9 100644 --- a/resources/views/pages/news.blade.php +++ b/resources/views/pages/news.blade.php @@ -1,70 +1,48 @@ @extends('layouts.app') @section('content') - @intro(['padding' => 'pb-2v']) - {{-- Todo: use grid for main (generic?) sidebar layout and utilise minmax for content? --}} -
- -
- @foreach ($news as $newsItem) - @php - $newsURL = $nav->getHrefByID("news/{$newsItem->id}"); - @endphp - - - @endforeach +

+ + + + {{-- News Grid --}} + + + @if ($more_news) +
+ $featured_news->id])' {{-- Don't include featured item in query --}} + target="#newsGrid" {{-- Target CSS selector to append loaded items to --}} + class="bg-grey-200 hover:bg-grey-250 text-grey-dark font-display font-medium px-8 py-3 rounded-full"> +
- -
-
-

{{ __('Évènements') }}

- @foreach($events as $event) - @php - $eventURL = $nav->getHrefByID("news/{$event->id}"); // Todo: possibly events will have different IDs - @endphp - -
- - {{  $event->getFirstMediaAlt($event->image, $event->title) }} - -

{{ $event->title }}

-

- {{ $event->formatDateRange($event->event_start, $event->event_end) }}, - {{ $event->event_place }} -

-

{{ __('En savoir plus') }}

-
- @endforeach -
- -
- @include('partials.newsletter-form') -
-
- -
+ @endif diff --git a/resources/views/partials/contact-shortcut.blade.php b/resources/views/partials/contact-shortcut.blade.php index 7477f72..f6c3bd1 100644 --- a/resources/views/partials/contact-shortcut.blade.php +++ b/resources/views/partials/contact-shortcut.blade.php @@ -3,7 +3,7 @@ {{ __('Téléphone') }} {{ $global->phone }} - +
diff --git a/resources/views/partials/grid-overlay.blade.php b/resources/views/partials/grid-overlay.blade.php new file mode 100644 index 0000000..02fe0e8 --- /dev/null +++ b/resources/views/partials/grid-overlay.blade.php @@ -0,0 +1,85 @@ +{{-- Layout Grid Overlay --}} + + +
diff --git a/resources/views/partials/home-products.blade.php b/resources/views/partials/home-products.blade.php index 572c738..2d4f90e 100644 --- a/resources/views/partials/home-products.blade.php +++ b/resources/views/partials/home-products.blade.php @@ -6,7 +6,7 @@ @endphp @if($page) - @endif diff --git a/tailwind.config.js b/tailwind.config.js index 9997f14..92ef108 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -8,7 +8,7 @@ module.exports = { // Sizes should be listed largest to smallest so they are generated in this order, allowing smaller // breakpoints to take precedence over larger ones (eg. xs:p-1 should override sm:p-2) //'xl': {'max': '1450px'}, // => @media (max-width: 1450px) { ... } - //'lg': {'max': '1280px'}, // => @media (max-width: 1280px) { ... } + 'lg': {'max': '1280px'}, // => @media (max-width: 1280px) { ... } 'md': {'max': '1023px'}, // => @media (max-width: 1023px) { ... } 'sm': {'max': '767px'}, // => @media (max-width: 767px) { ... } 'xs': {'max': '499px'}, // => @media (max-width: 499px) { ... }