From 92bfd84d2a8660178da675f0a77d300486101d54 Mon Sep 17 00:00:00 2001
From: Dominik Hebeler <dominik@suma-ev.de>
Date: Fri, 19 Jul 2024 11:50:47 +0200
Subject: [PATCH] change markup for advertisements "sponsored"

---
 .../app/Http/Controllers/TilesController.php  |  2 +-
 metager/app/Models/Tile.php                   |  4 ++-
 metager/lang/de/tiles.php                     |  5 +++
 metager/lang/en/tiles.php                     |  5 +++
 metager/resources/js/startpage/tiles.js       | 17 +++++++--
 .../less/metager/pages/startpage/tiles.less   | 36 ++++++++++++-------
 metager/resources/views/parts/tile.blade.php  | 11 ++++--
 7 files changed, 60 insertions(+), 20 deletions(-)
 create mode 100644 metager/lang/de/tiles.php
 create mode 100644 metager/lang/en/tiles.php

diff --git a/metager/app/Http/Controllers/TilesController.php b/metager/app/Http/Controllers/TilesController.php
index 16473dd8c..042efe00a 100644
--- a/metager/app/Http/Controllers/TilesController.php
+++ b/metager/app/Http/Controllers/TilesController.php
@@ -117,7 +117,7 @@ class TilesController extends Controller
             try {
                 $result = json_decode($result);
                 foreach ($result->data as $result_tile) {
-                    $tiles[] = new Tile(title: $result_tile->title, image: $result_tile->image, image_alt: $result_tile->title . " Image", url: $result_tile->url, classes: "advertisement");
+                    $tiles[] = new Tile(title: $result_tile->title, image: $result_tile->image, image_alt: $result_tile->title . " Image", url: $result_tile->url, advertisement: true);
                 }
             } catch (Exception $e) {
                 Log::error($e);
diff --git a/metager/app/Models/Tile.php b/metager/app/Models/Tile.php
index b64ff38b5..54eb28758 100644
--- a/metager/app/Models/Tile.php
+++ b/metager/app/Models/Tile.php
@@ -17,6 +17,7 @@ class Tile implements \JsonSerializable
     public string $url;
     public string $classes = "";
     public string $image_classes = "";
+    public bool $advertisement = false;
     /**
      * 
      * @param string $title Title to show for the Tile
@@ -26,7 +27,7 @@ class Tile implements \JsonSerializable
      * @param string $classes Additional css classes to append for the tile
      * @param string $image_classes Additional css classes to append to the image of the tile
      */
-    public function __construct(string $title, string $image, string $image_alt, string $url, string $classes = "", string $image_classes = "")
+    public function __construct(string $title, string $image, string $image_alt, string $url, string $classes = "", string $image_classes = "", bool $advertisement = false)
     {
         $this->title = $title;
         try {
@@ -41,6 +42,7 @@ class Tile implements \JsonSerializable
         $this->url = $url;
         $this->classes = $classes;
         $this->image_classes = $image_classes;
+        $this->advertisement = $advertisement;
     }
 
     public function jsonSerialize()
diff --git a/metager/lang/de/tiles.php b/metager/lang/de/tiles.php
new file mode 100644
index 000000000..e3f477425
--- /dev/null
+++ b/metager/lang/de/tiles.php
@@ -0,0 +1,5 @@
+<?php
+
+return [
+    "sponsored" => "Gesponsert"
+];
\ No newline at end of file
diff --git a/metager/lang/en/tiles.php b/metager/lang/en/tiles.php
new file mode 100644
index 000000000..1d11df8e5
--- /dev/null
+++ b/metager/lang/en/tiles.php
@@ -0,0 +1,5 @@
+<?php
+
+return [
+    "sponsored" => "Sponsored"
+];
\ No newline at end of file
diff --git a/metager/resources/js/startpage/tiles.js b/metager/resources/js/startpage/tiles.js
index cb6e9fd17..f1fe94634 100644
--- a/metager/resources/js/startpage/tiles.js
+++ b/metager/resources/js/startpage/tiles.js
@@ -3,6 +3,7 @@
     let tile_count = tile_container.querySelectorAll("a").length;
 
     let advertisements = [];
+    let fetch_timeout = null;
     fetchAdvertisements().then(() => udpateInterface());
 
     async function fetchAdvertisements() {
@@ -12,9 +13,15 @@
         if (advertisements.length >= desired_tile_count - regular_tile_count) return;
         let update_url = document.querySelector("meta[name=tiles-update-url]").content;
         update_url += "&count=" + (desired_tile_count - tile_count);
-
-        return fetch(update_url).then(response => response.json()).then(response => {
-            advertisements = response;
+        return new Promise((resolve, reject) => {
+            if (fetch_timeout != null) return resolve();
+            fetch_timeout = setTimeout(() => {
+                fetch(update_url).then(response => response.json()).then(response => {
+                    advertisements = response;
+                    fetch_timeout = null;
+                    resolve();
+                }).catch(e => reject(e));
+            }, 500);
         });
     }
     function udpateInterface() {
@@ -47,6 +54,7 @@
         let client_width = document.querySelector("html").clientWidth;
 
         let desired_tile_count = 8;
+
         if (client_width > 9 * tile_width + 8 * tile_gap) {
             // Largest Screen Size => Up to 8 Tiles in one row
             desired_tile_count = max_tiles;
@@ -61,10 +69,13 @@
             desired_tile_count = 2;
         }
 
+        console.log(client_width, tile_width, tile_gap, desired_tile_count);
+        console.log("Six Tiles", tile_width * 6 + 5 * tile_gap);
         if (native_tile_count + min_advertisements > desired_tile_count) {
             desired_tile_count *= 2;
         }
 
+
         return desired_tile_count;
     }
     window.addEventListener("resize", e => {
diff --git a/metager/resources/less/metager/pages/startpage/tiles.less b/metager/resources/less/metager/pages/startpage/tiles.less
index 099680cd0..96a8fb8bf 100644
--- a/metager/resources/less/metager/pages/startpage/tiles.less
+++ b/metager/resources/less/metager/pages/startpage/tiles.less
@@ -7,16 +7,17 @@ div#tiles-container {
     div#tiles {
         flex-grow: 0;
         width: 100%;
-        @tile_width: 13ch;
-
-        @nine_row_width: calc(calc(9 * @tile_width) + calc(8 * 1rem));
-        @eight_row_width: calc(calc(8 * @tile_width) + calc(7 * 1rem));
-        @seven_row_width: calc(calc(7 * @tile_width) + calc(6 * 1rem));
-        @six_row_width: calc(calc(6 * @tile_width) + calc(5 * 1rem));
-        @five_row_width: calc(calc(5 * @tile_width) + calc(4 * 1rem));
-        @four_row_width: calc(calc(4 * @tile_width) + calc(3 * 1rem));
-        @three_row_width: calc(calc(3 * @tile_width) + calc(2 * 1rem));
-        @two_row_width: calc(calc(2 * @tile_width) + calc(1 * 1rem));
+        @tile_width: 115px;
+        @tile_gap: 16px;
+
+        @nine_row_width: calc(calc(9 * @tile_width) + calc(8 * @tile_gap));
+        @eight_row_width: calc(calc(8 * @tile_width) + calc(7 * @tile_gap));
+        @seven_row_width: calc(calc(7 * @tile_width) + calc(6 * @tile_gap));
+        @six_row_width: calc(calc(6 * @tile_width) + calc(5 * @tile_gap));
+        @five_row_width: calc(calc(5 * @tile_width) + calc(4 * @tile_gap));
+        @four_row_width: calc(calc(4 * @tile_width) + calc(3 * @tile_gap));
+        @three_row_width: calc(calc(3 * @tile_width) + calc(2 * @tile_gap));
+        @two_row_width: calc(calc(2 * @tile_width) + calc(1 * @tile_gap));
 
         @media(max-width: @nine_row_width) {
             width: @seven_row_width;
@@ -39,7 +40,7 @@ div#tiles-container {
         justify-content: center;
 
         padding-top: 8dvh;
-        gap: 1rem;
+        gap: @tile_gap;
         margin-inline: auto;
         height: max-content;
 
@@ -77,13 +78,18 @@ div#tiles-container {
 
             >div.title {
                 font-size: .8rem;
-                color: fade(@text-color, 40%);
+                color: fade(@text-color, 60%);
                 transition: color 0.5s;
                 width: @tile_width;
                 text-overflow: ellipsis;
                 overflow: hidden;
                 white-space: nowrap;
                 text-align: center;
+                line-height: 1;
+
+                >div.sub-title {
+                    height: 1em;
+                }
             }
 
             &:hover {
@@ -92,7 +98,11 @@ div#tiles-container {
                 }
 
                 >div.title {
-                    color: @text-color;
+                    >div.main-title {
+                        color: @text-color;
+                    }
+
+
                 }
             }
         }
diff --git a/metager/resources/views/parts/tile.blade.php b/metager/resources/views/parts/tile.blade.php
index 9d8bd6d47..ebe3a635c 100644
--- a/metager/resources/views/parts/tile.blade.php
+++ b/metager/resources/views/parts/tile.blade.php
@@ -1,6 +1,13 @@
-<a href="{{$tile->url}}" class="{{ $tile->classes }}">
+<a href="{{$tile->url}}" class="{{ $tile->advertisement ? "advertisement " : "" }}{{ $tile->classes }}" {{ $tile->advertisement ? 'rel=nofollow target=_blank' : ''}}>
     <div class="image">
         <img src="{{$tile->image}}" alt="{{$tile->image_alt}}" class="{{$tile->image_classes}}">
     </div>
-    <div class="title">{{$tile->title}}</div>
+    <div class="title">
+        <div class="main-title">{{$tile->title}}</div>
+        <div class="sub-title">
+            @if($tile->advertisement)
+                @lang('tiles.sponsored')
+            @endif
+        </div>
+    </div>
 </a>
\ No newline at end of file
-- 
GitLab