From 0e0b24cbfb1ec9d1f84344e1d69eb813e2b2fb0c Mon Sep 17 00:00:00 2001
From: Henning Leutz <leutz@pcsg.de>
Date: Wed, 24 Jan 2018 11:28:55 +0100
Subject: [PATCH 01/44] Update composer.json

---
 composer.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/composer.json b/composer.json
index 047bd95..81c1030 100644
--- a/composer.json
+++ b/composer.json
@@ -19,6 +19,6 @@
   "require": {
     "php": ">=5.3",
     "quiqqer\/quiqqer": "1.*|dev-master|dev-dev",
-    "quiqqer\/erp": ">=1.*|dev-master|dev-dev"
+    "quiqqer\/erp": "1.*|dev-master|dev-dev"
   }
 }
-- 
GitLab


From 08635d72cc7e76bd7c8ada9a23ffe063f35ec0c6 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Patrick=20M=C3=BCller?= <p.mueller@pcsg.de>
Date: Wed, 11 Dec 2019 09:32:14 +0100
Subject: [PATCH 02/44] refactor: removed version from composer.json

---
 composer.json | 67 +++++++++++++++++++++++++--------------------------
 1 file changed, 33 insertions(+), 34 deletions(-)

diff --git a/composer.json b/composer.json
index ac13d8a..ed3f7dc 100644
--- a/composer.json
+++ b/composer.json
@@ -1,37 +1,36 @@
 {
-  "name": "quiqqer\/template-cologne",
-  "type": "quiqqer-template",
-  "description": "The QUIQQER Cologne E-Commerce Template",
-  "version": "dev-master",
-  "license": "GPLv3",
-  "authors": [
-    {
-      "name": "Henning Leutz",
-      "email": "support@pcsg.de",
-      "homepage": "http:\/\/www.pcsg.de",
-      "role": "Developer"
+    "name": "quiqqer\/template-cologne",
+    "type": "quiqqer-template",
+    "description": "The QUIQQER Cologne E-Commerce Template",
+    "license": "GPLv3",
+    "authors": [
+        {
+            "name": "Henning Leutz",
+            "email": "support@pcsg.de",
+            "homepage": "http:\/\/www.pcsg.de",
+            "role": "Developer"
+        }
+    ],
+    "support": {
+        "email": "support@pcsg.de",
+        "url": "http:\/\/www.pcsg.de"
+    },
+    "require": {
+        "php": ">=5.3",
+        "quiqqer\/quiqqer": "1.*|dev-master",
+        "quiqqer\/erp": "1.*|dev-master",
+        "quiqqer\/products": "1.*|dev-master",
+        "quiqqer\/product-bricks": "1.*|dev-master",
+        "quiqqer\/frontend-users": "1.*|dev-master",
+        "quiqqer\/menu": "1.*|dev-master",
+        "quiqqer\/sitetypes": "1.*|dev-master",
+        "quiqqer\/unsemantic": "1.*",
+        "npm-asset\/fastclick": "1.*",
+        "quiqqer\/tooltips": "1.*|dev-master"
+    },
+    "autoload": {
+        "psr-4": {
+            "QUI\\TemplateCologne\\": "src\/QUI\/TemplateCologne"
+        }
     }
-  ],
-  "support": {
-    "email": "support@pcsg.de",
-    "url": "http:\/\/www.pcsg.de"
-  },
-  "require": {
-    "php": ">=5.3",
-    "quiqqer\/quiqqer": "1.*|dev-master",
-    "quiqqer\/erp": "1.*|dev-master",
-    "quiqqer/products": "1.*|dev-master",
-    "quiqqer/product-bricks": "1.*|dev-master",
-    "quiqqer/frontend-users": "1.*|dev-master",
-    "quiqqer/menu": "1.*|dev-master",
-    "quiqqer/sitetypes": "1.*|dev-master",
-    "quiqqer/unsemantic": "1.*",
-    "npm-asset/fastclick": "1.*",
-    "quiqqer/tooltips": "1.*|dev-master"
-  },
-  "autoload": {
-    "psr-4": {
-      "QUI\\TemplateCologne\\": "src/QUI/TemplateCologne"
-    }
-  }
 }
\ No newline at end of file
-- 
GitLab


From 9c23d55126e9a4b3f922a5962e225d6ae97ea564 Mon Sep 17 00:00:00 2001
From: Moritz Scholz <scholz@pcsg.de>
Date: Thu, 30 Jan 2020 12:11:37 +0100
Subject: [PATCH 03/44] refactor: (auto) check out composer.json from dev-dev

---
 composer.json | 16 ++++++++--------
 1 file changed, 8 insertions(+), 8 deletions(-)

diff --git a/composer.json b/composer.json
index ed3f7dc..b656db2 100644
--- a/composer.json
+++ b/composer.json
@@ -17,16 +17,16 @@
     },
     "require": {
         "php": ">=5.3",
-        "quiqqer\/quiqqer": "1.*|dev-master",
-        "quiqqer\/erp": "1.*|dev-master",
-        "quiqqer\/products": "1.*|dev-master",
-        "quiqqer\/product-bricks": "1.*|dev-master",
-        "quiqqer\/frontend-users": "1.*|dev-master",
-        "quiqqer\/menu": "1.*|dev-master",
-        "quiqqer\/sitetypes": "1.*|dev-master",
+        "quiqqer\/quiqqer": "1.*|dev-master|dev-dev",
+        "quiqqer\/erp": "1.*|dev-master|dev-dev",
+        "quiqqer\/products": "1.*|dev-master|dev-dev",
+        "quiqqer\/product-bricks": "1.*|dev-master|dev-dev",
+        "quiqqer\/frontend-users": "1.*|dev-master|dev-dev",
+        "quiqqer\/menu": "1.*|dev-master|dev-dev",
+        "quiqqer\/sitetypes": "1.*|dev-master|dev-dev",
         "quiqqer\/unsemantic": "1.*",
         "npm-asset\/fastclick": "1.*",
-        "quiqqer\/tooltips": "1.*|dev-master"
+        "quiqqer\/tooltips": "1.*|dev-master|dev-dev"
     },
     "autoload": {
         "psr-4": {
-- 
GitLab


From fdce6d82b6c63e1fefa6a41b3aabac9eab4a7231 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Patrick=20M=C3=BCller?= <p.mueller@pcsg.de>
Date: Fri, 11 Jun 2021 09:37:03 +0200
Subject: [PATCH 04/44] fix: BuyNowBtn -> check required fields before adding
 to basket

(cherry picked from commit bbfeb6a88c22c95295d84d2b5cb9fe9b11f97933)
---
 bin/javascript/controls/BuyNowButton.js | 27 +++++++++++++++++++++++++
 1 file changed, 27 insertions(+)

diff --git a/bin/javascript/controls/BuyNowButton.js b/bin/javascript/controls/BuyNowButton.js
index d462950..74a68fe 100644
--- a/bin/javascript/controls/BuyNowButton.js
+++ b/bin/javascript/controls/BuyNowButton.js
@@ -95,6 +95,33 @@ define('package/quiqqer/template-cologne/bin/javascript/controls/BuyNowButton',
                 ProductElm     = this.getElm().getParent('[data-productid]'),
                 ProductControl = QUI.Controls.getById(ProductElm.get('data-quiid'));
 
+            if (ProductElm) {
+                // check require fields
+                var required = ProductElm.getElements('.product-data-fieldlist [required]');
+
+                if (required) {
+                    for (var i = 0, len = required.length; i < len; i++) {
+                        if (!required[i].checkValidity()) {
+                            //self.enableQuantityButton();
+                            self.$Label.setStyle('visibility', 'visible');
+                            self.addingInProcess = false;
+
+                            Loader.destroy();
+                            this.getElm().set('disabled', false);
+                            this.$Label.setStyle('visibility', 'visible');
+
+                            required[i].focus();
+
+                            // chrome validate message
+                            if ("reportValidity" in required[i]) {
+                                required[i].reportValidity();
+                            }
+                            return;
+                        }
+                    }
+                }
+            }
+
             if ("getFieldControls" in ProductControl) {
                 ProductControl.getFieldControls().each(function (Field) {
                     fields[Field.getFieldId()] = Field.getValue();
-- 
GitLab


From 041a337d5533d7a773890d0f4fd1b7e33b46d71c Mon Sep 17 00:00:00 2001
From: "michael.danielczok" <michael@pcsg.de>
Date: Tue, 20 Dec 2022 11:38:00 +0100
Subject: [PATCH 05/44] refactor: More button of SuggestSearch adapted to
 template design candyman-gmbh/projektplanung#190

---
 bin/css/style.css | 10 +++++++++-
 1 file changed, 9 insertions(+), 1 deletion(-)

diff --git a/bin/css/style.css b/bin/css/style.css
index b372f02..153fb1e 100644
--- a/bin/css/style.css
+++ b/bin/css/style.css
@@ -733,13 +733,21 @@ a.toTop:before {
     margin: 0;
 }
 
-.quiqqer-products-mobileSuggest .quiqqer-products-mobileSuggest-results li {
+.quiqqer-products-mobileSuggest .quiqqer-products-mobileSuggest-results li,
+.quiqqer-products-mobileSuggest-results-list-showAllResults {
     background: none;
     border-color: #ddd;
     color: #606975;
+}
+
+.quiqqer-products-mobileSuggest .quiqqer-products-mobileSuggest-results li {
     padding: 20px 20px 40px 20px;
 }
 
+.quiqqer-products-mobileSuggest .quiqqer-products-mobileSuggest-results-list-showAllResults > a:not(:hover, :active, :focus) {
+    color: inherit;
+}
+
 .quiqqer-products-mobileSuggest .quiqqer-products-mobileSuggest-results li:first-child {
     border-top: none;
 }
-- 
GitLab


From c61a594f1f2d11215a4774d8229ba76f774c5660 Mon Sep 17 00:00:00 2001
From: Michael Danielczok <michael@pcsg.de>
Date: Tue, 2 Jul 2024 09:54:23 +0200
Subject: [PATCH 06/44] fix: consider structured data setting in faq category
 site type

---
 quiqqer/faq/types/category.html | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/quiqqer/faq/types/category.html b/quiqqer/faq/types/category.html
index dffa945..05d1234 100644
--- a/quiqqer/faq/types/category.html
+++ b/quiqqer/faq/types/category.html
@@ -65,6 +65,10 @@
 
             {/if}
         {/foreach}
+
+        {if $faqStructuredData}
+            {$faqStructuredData}
+        {/if}
     </section>
 {/if}
 
-- 
GitLab


From fa771496070f7a6f1999266a3b76104ed7a3f797 Mon Sep 17 00:00:00 2001
From: Michael Danielczok <michael@pcsg.de>
Date: Tue, 2 Jul 2024 14:47:57 +0200
Subject: [PATCH 07/44] fix: replace not allowed element to pass the html
 validator

---
 quiqqer/faq/types/category.html | 22 ++++------------------
 template/topBar.html            |  4 ++--
 2 files changed, 6 insertions(+), 20 deletions(-)

diff --git a/quiqqer/faq/types/category.html b/quiqqer/faq/types/category.html
index 05d1234..ae7c9f1 100644
--- a/quiqqer/faq/types/category.html
+++ b/quiqqer/faq/types/category.html
@@ -6,28 +6,14 @@
 
 {* Template: default*}
 {if $faqTemplate == 'default'}
-    {if $offset}
-        {*
-        This CSS is used to scroll the page down a bit when accessed with a # in the url.
-        By doing this the menu no longer hides the linked content.
-        *}
-        <style type="text/css">
-            :target::before {
-                content: '';
-                display: block;
-                height: {$offset}px;
-                margin-top: -{$offset}px;
-            }
-        </style>
-    {/if}
-
-    <section itemscope itemtype="http://schema.org/ItemList"
+    <section itemscope itemtype="https://schema.org/ItemList"
              class="content-template quiqqer-faq clear-fix cologne-quiqqer-faq"
              data-qui="package/quiqqer/faq/bin/Category"
              data-qui-options-offset="{$offset}"
+             {if $offset}style="--_qui-faq-scrollOffset: var(--qui-faq-scrollOffset, {$offset}px);"{/if}
     >
         {if count($entries)}
-            <ul class="quiqqer-faq-list" id="faqList" name="faqList">
+            <ul class="quiqqer-faq-list" id="faqList">
                 {foreach $entries as $Faq}
                     <li>
                         <a href="{url site=$Site}#faq{$Faq->getId()}">
@@ -40,7 +26,7 @@
         {/if}
 
         {foreach $entries as $Faq}
-            <article id="faq{$Faq->getId()}" class="clear-fix">
+            <article id="faq{$Faq->getId()}" class="quiqqer-faq__entry">
                 <header>
                     <h2><span class="fa fa-file-text"></span> {$Faq->getAttribute('title')}</h2>
                 </header>
diff --git a/template/topBar.html b/template/topBar.html
index 0098f71..3c6d487 100644
--- a/template/topBar.html
+++ b/template/topBar.html
@@ -24,7 +24,7 @@
         {/if}
         {* END language & currency switch *}
 
-        <span class="cologne-header-control-user">
+        <div class="cologne-header-control-user">
             {if $User->getId()}
                 {$Avatar->create()}
             {else}
@@ -34,6 +34,6 @@
             <span class="cologne-header-control-user-loader">
                 <span class="fa fa-pulse fa-circle-o-notch"></span>
             </span>
-        </span>
+        </div>
     </div>
 </div>
\ No newline at end of file
-- 
GitLab


From 2ee12cb4fdd6c792b590c4ff6ff2a22d71392788 Mon Sep 17 00:00:00 2001
From: Michael Danielczok <michael@pcsg.de>
Date: Tue, 9 Jul 2024 11:31:20 +0000
Subject: [PATCH 08/44] feat: show product images in basket setting

Related: brassberg/tickets#244


(cherry picked from commit 28cc16580da5f0e2ca5ca1df695394c7014246fb)

Co-authored-by: Michael Danielczok <michael@pcsg.de>
---
 bin/css/order.css                             |  15 ++
 bin/css/variables.css                         |   5 +
 locale.xml                                    |   9 +
 .../QUI/ERP/Order/Controls/Basket/Basket.html | 242 ++++++++++++++++++
 settings.xml                                  |  17 ++
 src/QUI/TemplateCologne/Utils.php             |  35 +++
 6 files changed, 323 insertions(+)
 create mode 100644 quiqqer/order/src/QUI/ERP/Order/Controls/Basket/Basket.html

diff --git a/bin/css/order.css b/bin/css/order.css
index b4e912f..57c86f0 100644
--- a/bin/css/order.css
+++ b/bin/css/order.css
@@ -69,6 +69,21 @@ th.quiqqer-order-basket-articles-header-price {
     width: 60px;
 }
 
+.quiqqer-order-basket-articles-header-image {
+    width: var(--_qui-order-basket-articles-image-width);
+}
+
+.quiqqer-order-basket-articles-article-image {
+    width: var(--_qui-order-basket-articles-image-width-width);
+    text-align: center;
+}
+
+.quiqqer-order-basket-articles-article-image__img {
+    width: var(--_qui-order-basket-articles-image-width);
+    height: var(--_qui-order-basket-articles-image-height);
+    object-fit: contain;
+}
+
 .quiqqer-order-basket-articles-article-quantity {
     text-align: center;
     width: 100px;
diff --git a/bin/css/variables.css b/bin/css/variables.css
index 9cc5728..a0ba096 100644
--- a/bin/css/variables.css
+++ b/bin/css/variables.css
@@ -16,4 +16,9 @@
     /* background */
     --bg-primary: #ddd;
     --bg-secondary: #f5f5f5;
+
+
+    /* ecoyn / ecommerce */
+    --_qui-order-basket-articles-image-width: var(--qui-order-basket-articles-image-width, 100px);
+    --_qui-order-basket-articles-image-height: var(--qui-order-basket-articles-image-height, 100px);
 }
\ No newline at end of file
diff --git a/locale.xml b/locale.xml
index 8b106bf..45a994e 100644
--- a/locale.xml
+++ b/locale.xml
@@ -500,6 +500,15 @@
                 <en><![CDATA[Compact (only icon)]]></en>
             </locale>
 
+        <locale name="settings.shop.order.basket.showImages">
+            <de><![CDATA[Produktbilder im Warenkorb anzeigen]]></de>
+            <en><![CDATA[Show product images in basket]]></en>
+        </locale>
+        <locale name="settings.shop.order.basket.showImages.desc">
+            <de><![CDATA[Wenn aktiviert, werden in Warenkorb und Bestellung die Produktbilder angezeigt.]]></de>
+            <en><![CDATA[If the option ist enabled, the product images are displayed in the shopping basket and order.]]></en>
+        </locale>
+
         <!-- basket open -->
         <locale name="settings.shop.basketOpen">
             <de><![CDATA[Aktion bei Klick auf Warenkorb]]></de>
diff --git a/quiqqer/order/src/QUI/ERP/Order/Controls/Basket/Basket.html b/quiqqer/order/src/QUI/ERP/Order/Controls/Basket/Basket.html
new file mode 100644
index 0000000..d06d528
--- /dev/null
+++ b/quiqqer/order/src/QUI/ERP/Order/Controls/Basket/Basket.html
@@ -0,0 +1,242 @@
+{template_event name="quiqqer::order::basket::begin" Basket=$Basket}
+
+{if $Products->count()}
+<table class="quiqqer-order-basket-articles">
+    <thead>
+    <tr class="quiqqer-order-basket-articles-header">
+        <th class="quiqqer-order-basket-articles-header-pos"
+            title="{locale group='quiqqer/erp' var='article.list.articles.header.pos'}"
+        >
+            {locale group="quiqqer/erp" var="article.list.articles.header.pos"}
+        </th>
+        {if QUI\TemplateCologne\Utils::getSetting('order.basket.showImages')}
+        <th class="quiqqer-order-basket-articles-header-image"
+            title="{locale group='quiqqer/erp' var='article.list.articles.header.image'}"
+        >
+            {locale group="quiqqer/erp" var="article.list.articles.header.image"}
+        </th>
+        {/if}
+        <th class="quiqqer-order-basket-articles-header-information"
+            title="{locale group='quiqqer/erp' var='article.list.articles.header.description'}"
+        >
+            {locale group="quiqqer/erp" var="article.list.articles.header.description"}
+        </th>
+        <th class="quiqqer-order-basket-articles-header-quantity"
+            title="{locale group='quiqqer/erp' var='article.list.articles.header.quantity'}"
+        >
+            {locale group="quiqqer/erp" var="article.list.articles.header.quantity"}
+        </th>
+        <th class="quiqqer-order-basket-articles-unitPrice"
+            title="{locale group='quiqqer/erp' var='article.list.articles.header.unitprice'}"
+        >
+            {locale group="quiqqer/erp" var="article.list.articles.header.unitprice"}
+        </th>
+        <th class="quiqqer-order-basket-articles-header-price"
+            title="{locale group='quiqqer/erp' var='article.list.articles.header.price'}"
+        >
+            {locale group="quiqqer/erp" var="article.list.articles.header.price"}
+        </th>
+        {if $this->getAttribute('editable')}
+        <th class="quiqqer-order-basket-articles-header-action"></th>
+        {/if}
+    </tr>
+    </thead>
+    <tbody>
+    {assign var=pos value=1}
+    {foreach $products as $product}
+    <tr class="quiqqer-order-basket-articles-article" data-pos="{$pos}">
+        <td class="quiqqer-order-basket-articles-article-pos"
+            data-label="{locale group='quiqqer/erp' var='article.list.articles.header.pos'}"
+        >
+            {$pos}
+        </td>
+        {if QUI\TemplateCologne\Utils::getSetting('order.basket.showImages')}
+        <td class="quiqqer-order-basket-articles-article-image"
+            data-label="{locale group='quiqqer/erp' var='article.list.articles.header.image'}"
+        >
+            {image src=$product.imageSrc width=300 height=300 class="quiqqer-order-basket-articles-article-image__img"}
+        </td>
+        {/if}
+        <td class="quiqqer-order-basket-articles-article-data"
+            data-label="{locale group='quiqqer/erp' var='article.list.articles.header.description'}"
+        >
+            <div class="quiqqer-order-basket-articles-article-title">{$product.title}</div>
+            <div class="quiqqer-order-basket-articles-article-description">
+                {$product.description}
+            </div>
+
+            <ul class="quiqqer-order-basket-articles-article-fields">
+                {foreach $product.attributes as $attribute}
+                <li class="quiqqer-order-basket-articles-article-fields-field">
+                    <span>{$attribute.title}:</span>
+                    <span>{$this->getValueText($attribute.valueText)}</span>
+                </li>
+                {/foreach}
+            </ul>
+
+            {if $showArticleNumber && !empty($product.productNo)}
+            <div class="quiqqer-order-basket-articles-article-productno">
+                {locale group="quiqqer/order" var="basket.articles.articleNo"} {$product.productNo}
+            </div>
+            {/if}
+        </td>
+        <td class="quiqqer-order-basket-articles-article-quantity"
+            data-label="{locale group='quiqqer/erp' var='article.list.articles.header.quantity'}"
+        >
+            {assign var=maxQuantity value=""}
+            {assign var=maxQuantityAttr value=""}
+            {if isset($product.maximumQuantity) && $product.maximumQuantity && $product.maximumQuantity !== true}
+            {assign var=maxQuantityAttr value=" max='{$product.maximumQuantity}'"}
+            {assign var=maxQuantity value=(int)$product.maximumQuantity}
+            {/if}
+
+            {if $Utils->isBasketProductEditable($product) && $this->getAttribute('editable') && $maxQuantity != 1}
+            <label>
+                <input type="number"
+                       name="quantity"
+                       min="0"
+                       value="{$product.quantity}"
+                       {$maxQuantityAttr}
+                />
+            </label>
+            {else}
+            <div class="quiqqer-order-basket-articles-article-quantity-value">
+                {$product.quantity}
+            </div>
+            {/if}
+        </td>
+        <td class="quiqqer-order-basket-articles-article-price"
+            data-label="{locale group='quiqqer/erp' var='article.list.articles.header.unitprice'}"
+        >
+            {if !isset($product.displayPrice) || $product.displayPrice}
+            {$product.price}
+            {/if}
+        </td>
+        <td class="quiqqer-order-basket-articles-article-sum"
+            data-label="{locale group='quiqqer/erp' var='article.list.articles.header.price'}"
+        >
+            {if !isset($product.displayPrice) || $product.displayPrice}
+            <span>{$product.sum}</span>
+            {/if}
+
+            {if !isset($product.hasOfferPrice) || $product.hasOfferPrice}
+            <span class="offer-original-price">
+                {$product.originalPrice}
+            </span>
+            {/if}
+        </td>
+        {if $this->getAttribute('editable')}
+        <td class="quiqqer-order-basket-articles-article-remove">
+            <button type="button">
+                <span class="fa fa-trash"></span>
+            </button>
+        </td>
+        {/if}
+    </tr>
+    {assign var=pos value=$pos+1}
+    {/foreach}
+    </tbody>
+</table>
+
+{template_event name="quiqqer::order::basket::middle" Basket=$Basket}
+
+<table class="quiqqer-order-basket-total">
+    <tr class="quiqqer-order-basket-total-subSum">
+        <td class="quiqqer-order-basket-total-firstCell">
+            <span class="quiqqer-order-basket-total-subSum-text">
+                {locale group="quiqqer/order" var="control.order.overview.subSum"}
+            </span>
+        </td>
+        <td class="quiqqer-order-basket-total-secondCell">
+            <span class="quiqqer-order-basket-total-subSum-value">
+                {$data.subSum}
+            </span>
+        </td>
+    </tr>
+
+    {foreach $data.attributes as $attribute}
+    <tr>
+        <td>
+            {$attribute.title} {if !empty($attribute.valueText)}({$attribute.valueText}){/if}
+        </td>
+        <td>
+            {$attribute.value}
+        </td>
+    </tr>
+    {/foreach}
+
+    {if count($data.attributes)}
+    <tr>
+        <td colspan="2"><br/></td>
+    </tr>
+    {/if}
+
+    {foreach $data.vat as $vat}
+    <tr>
+        <td>
+            {$vat.text}
+        </td>
+        <td>
+            {$vat.value}
+        </td>
+    </tr>
+    {/foreach}
+
+
+    {if isset($data.grandTotalFactors) && count($data.grandTotalFactors)}
+    <tr class="quiqqer-order-basket-total-grandSubSum">
+        <td class="quiqqer-order-basket-total-firstCell">
+            <span class="quiqqer-order-basket-total-grandSubSum-text">
+                {locale group="quiqqer/order" var="control.order.overview.grandSubSum"}
+            </span>
+        </td>
+        <td class="quiqqer-order-basket-total-secondCell">
+            <span class="quiqqer-order-basket-total-grandSubSum-value">
+                {$data.grandSubSum}
+            </span>
+        </td>
+    </tr>
+    {foreach $data.grandTotalFactors as $attribute}
+    <tr>
+        <td>
+            {$attribute.title} {if !empty($attribute.valueText) && $attribute.valueText !==
+            '-'}({$attribute.valueText}){/if}
+        </td>
+        <td>
+            {$attribute.value}
+        </td>
+    </tr>
+    {/foreach}
+    {/if}
+
+
+    {if count($data.attributes)}
+    <tr>
+        <td colspan="2"><br/></td>
+    </tr>
+    {/if}
+    <tr class="quiqqer-order-basket-total-sum">
+        <td>
+            <span class="quiqqer-order-basket-total-sum-text">
+                {locale group="quiqqer/order" var="control.order.overview.sum"}
+            </span>
+        </td>
+        <td>
+            <span class="quiqqer-order-basket-total-sum-value">
+                {$data.sum}
+            </span>
+        </td>
+    </tr>
+</table>
+
+{elseif $this->isGuest() && $this->isLoading()}
+<div class="quiqqer-order-basket-isLoading">
+    <span class="fa fa-spinner fa-spin"></span>
+</div>
+{else}
+<div class="quiqqer-order-basket-isEmpty">
+    {locale group="quiqqer/order" var="message.basket.is.empty"}
+</div>
+{/if}
+
+{template_event name="quiqqer::order::basket::end" Basket=$Basket}
diff --git a/settings.xml b/settings.xml
index 6700b58..3f0a34b 100644
--- a/settings.xml
+++ b/settings.xml
@@ -36,6 +36,10 @@
                         <type><![CDATA[string]]></type>
                         <defaultvalue>full</defaultvalue>
                     </conf>
+                    <conf name="order.basket.showImages">
+                        <type><![CDATA[bool]]></type>
+                        <defaultvalue>1</defaultvalue>
+                    </conf>
                     <conf name="basketOpen">
                         <type><![CDATA[integer]]></type>
                         <defaultvalue>2</defaultvalue>
@@ -437,6 +441,19 @@
                                 </option>
                             </select>
 
+                                <input conf="templateCologne.settings.order.basket.showImages" type="checkbox">
+                                <text>
+                                    <locale group="quiqqer/template-cologne"
+                                            var="settings.shop.order.basket.showImages"
+                                    />
+                                </text>
+                                <description>
+                                    <locale group="quiqqer/template-cologne"
+                                            var="settings.shop.order.basket.showImages.desc"
+                                    />
+                                </description>
+                            </input>
+
                             <!-- basket open (nothing order window, order page)-->
                             <select conf="templateCologne.settings.basketOpen">
                                 <text>
diff --git a/src/QUI/TemplateCologne/Utils.php b/src/QUI/TemplateCologne/Utils.php
index f0fc42b..6c777c8 100644
--- a/src/QUI/TemplateCologne/Utils.php
+++ b/src/QUI/TemplateCologne/Utils.php
@@ -699,4 +699,39 @@ public static function convertBrickCSSClass(array $classes): string
 
         return $text;
     }
+
+    /**
+     * Get template setting for given string.
+     * By passing setting name you can omit template prefix setting name ("templateCologne.settings.")
+     *
+     * Usage:
+     *   QUI\TemplateCologne\Utils::getSettings('homeLink');
+     *   or
+     *   QUI\TemplateCologne\Utils::getSettings('templateCologne.settings.homeLink');
+     *
+     * @param string $settingName
+     * @return bool|array|int|string
+     */
+    public static function getSetting(string $settingName): bool|array|int|string
+    {
+        if (empty($settingName)) {
+            return false;
+        }
+
+        $a = strpos($settingName, 'templateCologne.settings.');
+        if (!str_contains($settingName, 'templateCologne.settings.')) {
+            $settingName = 'templateCologne.settings.' . $settingName;
+        }
+
+        try {
+            $Project = QUI::getRewrite()->getProject();
+
+            return $Project->getConfig($settingName);
+        } catch (\Exception $Exception) {
+            QUI\System\Log::writeException($Exception);
+
+            return '';
+        }
+
+    }
 }
-- 
GitLab


From 7deb76767770cd7136759a5652bb9242732bd282 Mon Sep 17 00:00:00 2001
From: Michael Danielczok <michael@pcsg.de>
Date: Tue, 9 Jul 2024 11:38:58 +0000
Subject: [PATCH 09/44] fix: correct css varibale name

(cherry picked from commit 09046aec62c9ba7c83b5ecce1ba592b6e9859a1c)

Co-authored-by: Michael Danielczok <michael@pcsg.de>
---
 bin/css/order.css | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/bin/css/order.css b/bin/css/order.css
index 57c86f0..679e106 100644
--- a/bin/css/order.css
+++ b/bin/css/order.css
@@ -74,7 +74,7 @@ th.quiqqer-order-basket-articles-header-price {
 }
 
 .quiqqer-order-basket-articles-article-image {
-    width: var(--_qui-order-basket-articles-image-width-width);
+    width: var(--_qui-order-basket-articles-image-width);
     text-align: center;
 }
 
-- 
GitLab


From c32425ced07254f12c03ebc3d35ad3ee37826e25 Mon Sep 17 00:00:00 2001
From: Michael Danielczok <michael@pcsg.de>
Date: Tue, 16 Jul 2024 08:27:50 +0200
Subject: [PATCH 10/44] fix: consider article sum only in checkout process

---
 bin/css/order.css | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/bin/css/order.css b/bin/css/order.css
index 679e106..606d689 100644
--- a/bin/css/order.css
+++ b/bin/css/order.css
@@ -529,7 +529,7 @@ th.articles-article-header-information {
     padding: 10px;
 }
 
-.articles-sum {
+:where(.quiqqer-order-step-checkout-article) .articles-sum {
     background: #f8f8f8;
     border: 1px solid #ddd;
     float: right;
-- 
GitLab


From 8ba6acfac204f426ea8a2af70e4a3bf9aec7e75a Mon Sep 17 00:00:00 2001
From: Michael Danielczok <michael@pcsg.de>
Date: Mon, 29 Jul 2024 09:42:41 +0000
Subject: [PATCH 11/44] fix: pass correct menu id to the MegaMenu

(cherry picked from commit 7337c6216bb2d13526b7e24450262ddcd498d646)

Co-authored-by: Michael Danielczok <michael@pcsg.de>
---
 index.php | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/index.php b/index.php
index a49e56f..722a879 100644
--- a/index.php
+++ b/index.php
@@ -37,7 +37,7 @@
 $independentMenuId = $Project->getConfig('templateCologne.settings.menuId');
 
 if ($enableIndependentMenu && $independentMenuId) {
-    $menuParams['menuId'] = $enableIndependentMenu;
+    $menuParams['menuId'] = $independentMenuId;
     $menuParams['showFirstLevelIcons'] = $Project->getConfig('templateCologne.settings.showFirstLevelIcons');
     $menuParams['showStart'] = false;
 }
-- 
GitLab


From c858e7936c1dcc0eb43ab2af65030d8804926638 Mon Sep 17 00:00:00 2001
From: Jan Wennrich <jan.wennrich@pcsg.de>
Date: Fri, 24 May 2024 16:56:24 +0200
Subject: [PATCH 12/44] chore: add .gitattributes file

---
 .gitattributes | 15 +++++++++++++++
 .gitignore     |  2 ++
 2 files changed, 17 insertions(+)
 create mode 100644 .gitattributes
 create mode 100644 .gitignore

diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 0000000..9ab59b1
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1,15 @@
+
+# Ignore developer files when exporting
+.gitattributes         export-ignore
+.gitignore             export-ignore
+.gitlab-ci.yml         export-ignore
+.phive                 export-ignore
+captainhook.json       export-ignore
+phpcs.xml.dist         export-ignore
+phpstan-baseline.neon  export-ignore
+phpstan.dist.neon      export-ignore
+phpunit.dist.xml       export-ignore
+tests                  export-ignore
+
+# Explicitly set file type and line endings for PHP files, improves git diff output
+*.php     text eol=lf diff=php
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..a8c0d1b
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,2 @@
+
+tools/
-- 
GitLab


From 812e466e07af53f97cf562d5b2fd8caad4e5ca5b Mon Sep 17 00:00:00 2001
From: Jan Wennrich <jan.wennrich@pcsg.de>
Date: Fri, 24 May 2024 16:56:24 +0200
Subject: [PATCH 13/44] chore: setup PHPStan for project tooling

---
 .gitignore                  |  2 ++
 .phive/phars.xml            |  4 ++++
 phpstan-baseline.neon       |  0
 phpstan.dist.neon           |  9 +++++++++
 tests/phpstan-bootstrap.php | 13 +++++++++++++
 5 files changed, 28 insertions(+)
 create mode 100644 .phive/phars.xml
 create mode 100644 phpstan-baseline.neon
 create mode 100644 phpstan.dist.neon
 create mode 100644 tests/phpstan-bootstrap.php

diff --git a/.gitignore b/.gitignore
index a8c0d1b..0920b95 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,2 +1,4 @@
 
 tools/
+
+phpstan.neon
diff --git a/.phive/phars.xml b/.phive/phars.xml
new file mode 100644
index 0000000..f909b52
--- /dev/null
+++ b/.phive/phars.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<phive xmlns="https://phar.io/phive">
+  <phar name="phpstan" version="1.11.1" installed="1.11.1" location="./tools/phpstan" copy="false"/>
+</phive>
diff --git a/phpstan-baseline.neon b/phpstan-baseline.neon
new file mode 100644
index 0000000..e69de29
diff --git a/phpstan.dist.neon b/phpstan.dist.neon
new file mode 100644
index 0000000..e929f5a
--- /dev/null
+++ b/phpstan.dist.neon
@@ -0,0 +1,9 @@
+includes:
+	- phpstan-baseline.neon
+
+parameters:
+    level: 8
+    paths:
+        - src
+        - ajax
+    tipsOfTheDay: false
diff --git a/tests/phpstan-bootstrap.php b/tests/phpstan-bootstrap.php
new file mode 100644
index 0000000..b61ff4b
--- /dev/null
+++ b/tests/phpstan-bootstrap.php
@@ -0,0 +1,13 @@
+<?php
+
+if (!defined('QUIQQER_SYSTEM')) {
+    define('QUIQQER_SYSTEM', true);
+}
+
+if (!defined('QUIQQER_AJAX')) {
+    define('QUIQQER_AJAX', true);
+}
+
+putenv("QUIQQER_OTHER_AUTOLOADERS=KEEP");
+
+require_once __DIR__ . '/../../../../bootstrap.php';
-- 
GitLab


From 184265812c33267bca9a7bd455e285c15d5297bb Mon Sep 17 00:00:00 2001
From: Jan Wennrich <jan.wennrich@pcsg.de>
Date: Fri, 24 May 2024 16:56:25 +0200
Subject: [PATCH 14/44] chore: setup PHPUnit for project tooling

---
 .gitignore                  |  4 ++++
 .phive/phars.xml            |  1 +
 phpunit.dist.xml            |  8 ++++++++
 tests/phpunit-bootstrap.php | 11 +++++++++++
 4 files changed, 24 insertions(+)
 create mode 100644 phpunit.dist.xml
 create mode 100644 tests/phpunit-bootstrap.php

diff --git a/.gitignore b/.gitignore
index 0920b95..b9f7c5c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,3 +2,7 @@
 tools/
 
 phpstan.neon
+
+.phpunit.result.cache
+
+phpunit.xml
diff --git a/.phive/phars.xml b/.phive/phars.xml
index f909b52..6984891 100644
--- a/.phive/phars.xml
+++ b/.phive/phars.xml
@@ -1,4 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <phive xmlns="https://phar.io/phive">
   <phar name="phpstan" version="1.11.1" installed="1.11.1" location="./tools/phpstan" copy="false"/>
+  <phar name="phpunit" version="^10.5.20" installed="10.5.20" location="./tools/phpunit" copy="false"/>
 </phive>
diff --git a/phpunit.dist.xml b/phpunit.dist.xml
new file mode 100644
index 0000000..f6c7bec
--- /dev/null
+++ b/phpunit.dist.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<phpunit bootstrap="tests/phpunit-bootstrap.php">
+    <testsuites>
+        <testsuite name="Tests">
+            <directory>tests/</directory>
+        </testsuite>
+    </testsuites>
+</phpunit>
diff --git a/tests/phpunit-bootstrap.php b/tests/phpunit-bootstrap.php
new file mode 100644
index 0000000..eca92fd
--- /dev/null
+++ b/tests/phpunit-bootstrap.php
@@ -0,0 +1,11 @@
+<?php
+
+if (!defined('QUIQQER_SYSTEM')) {
+    define('QUIQQER_SYSTEM', true);
+}
+
+if (!defined('QUIQQER_AJAX')) {
+    define('QUIQQER_AJAX', true);
+}
+
+require_once __DIR__ . '/../../../../bootstrap.php';
-- 
GitLab


From 0388daece1ace5e0513b8b50b438ae739b468424 Mon Sep 17 00:00:00 2001
From: Jan Wennrich <jan.wennrich@pcsg.de>
Date: Fri, 24 May 2024 16:56:25 +0200
Subject: [PATCH 15/44] chore: setup PHP_CodeSniffer for project tooling

---
 .phive/phars.xml |  2 ++
 phpcs.xml.dist   | 23 +++++++++++++++++++++++
 2 files changed, 25 insertions(+)
 create mode 100644 phpcs.xml.dist

diff --git a/.phive/phars.xml b/.phive/phars.xml
index 6984891..3c7dea3 100644
--- a/.phive/phars.xml
+++ b/.phive/phars.xml
@@ -2,4 +2,6 @@
 <phive xmlns="https://phar.io/phive">
   <phar name="phpstan" version="1.11.1" installed="1.11.1" location="./tools/phpstan" copy="false"/>
   <phar name="phpunit" version="^10.5.20" installed="10.5.20" location="./tools/phpunit" copy="false"/>
+  <phar name="phpcs" version="^3.10.1" installed="3.10.1" location="./tools/phpcs" copy="false"/>
+  <phar name="phpcbf" version="^3.10.1" installed="3.10.1" location="./tools/phpcbf" copy="false"/>
 </phive>
diff --git a/phpcs.xml.dist b/phpcs.xml.dist
new file mode 100644
index 0000000..d48084f
--- /dev/null
+++ b/phpcs.xml.dist
@@ -0,0 +1,23 @@
+<?xml version="1.0"?>
+<ruleset>
+    <!-- Use PSR-12 ruleset -->
+    <rule ref="PSR12"/>
+
+    <!-- Only scan *.php files -->
+    <arg name="extensions" value="php"/>
+
+    <!-- Ignore warnings -->
+    <arg name="warning-severity" value="0"/>
+
+    <!-- Process 64 (or number of CPU cores) files in parallel -->
+    <arg name="parallel" value="64"/>
+
+    <!-- Output relative file paths, by setting the current folder as the basepath -->
+    <arg name="basepath" value="."/>
+
+    <!-- Show colored output -->
+    <arg name="colors"/>
+
+    <!-- Scan everything in the current folder -->
+    <file>.</file>
+</ruleset>
-- 
GitLab


From ad72f52e785c54343504c7677e7676065b90fd73 Mon Sep 17 00:00:00 2001
From: Jan Wennrich <jan.wennrich@pcsg.de>
Date: Fri, 24 May 2024 16:56:26 +0200
Subject: [PATCH 16/44] chore: setup CaptainHook for project tooling

---
 .phive/phars.xml                |  1 +
 captainhook.json                | 16 ++++++++++++++++
 tests/captainhook-bootstrap.php |  3 +++
 3 files changed, 20 insertions(+)
 create mode 100644 captainhook.json
 create mode 100644 tests/captainhook-bootstrap.php

diff --git a/.phive/phars.xml b/.phive/phars.xml
index 3c7dea3..63a030f 100644
--- a/.phive/phars.xml
+++ b/.phive/phars.xml
@@ -4,4 +4,5 @@
   <phar name="phpunit" version="^10.5.20" installed="10.5.20" location="./tools/phpunit" copy="false"/>
   <phar name="phpcs" version="^3.10.1" installed="3.10.1" location="./tools/phpcs" copy="false"/>
   <phar name="phpcbf" version="^3.10.1" installed="3.10.1" location="./tools/phpcbf" copy="false"/>
+  <phar name="captainhook" version="^5.23.0" installed="5.23.0" location="./tools/captainhook" copy="false"/>
 </phive>
diff --git a/captainhook.json b/captainhook.json
new file mode 100644
index 0000000..30f1064
--- /dev/null
+++ b/captainhook.json
@@ -0,0 +1,16 @@
+{
+  "config": {
+    "bootstrap": "tests/captainhook-bootstrap.php"
+  },
+  "pre-commit": {
+    "enabled": true,
+    "actions": [
+      {
+        "action": "\\CaptainHook\\App\\Hook\\PHP\\Action\\Linting"
+      },
+      {
+        "action": "composer test"
+      }
+    ]
+  }
+}
\ No newline at end of file
diff --git a/tests/captainhook-bootstrap.php b/tests/captainhook-bootstrap.php
new file mode 100644
index 0000000..1b61b73
--- /dev/null
+++ b/tests/captainhook-bootstrap.php
@@ -0,0 +1,3 @@
+<?php
+
+// This file is supposed to be empty, see https://github.com/captainhookphp/captainhook/issues/248
-- 
GitLab


From b3d71c21c4a7005c0ac0332aff3b37f48628caa0 Mon Sep 17 00:00:00 2001
From: Jan Wennrich <jan.wennrich@pcsg.de>
Date: Fri, 24 May 2024 16:56:26 +0200
Subject: [PATCH 17/44] chore: add developer scripts to composer.json

---
 composer.json | 114 ++++++++++++++++++++++++++++++++++----------------
 1 file changed, 78 insertions(+), 36 deletions(-)

diff --git a/composer.json b/composer.json
index 0c52007..5689cd4 100644
--- a/composer.json
+++ b/composer.json
@@ -1,38 +1,80 @@
 {
-  "name": "quiqqer/template-cologne",
-  "type": "quiqqer-template",
-  "description": "The QUIQQER Cologne E-Commerce Template",
-  "license": "GPLv3",
-  "authors": [
-    {
-      "name": "Henning Leutz",
-      "email": "support@pcsg.de",
-      "homepage": "https://www.pcsg.de",
-      "role": "Developer"
+    "name": "quiqqer/template-cologne",
+    "type": "quiqqer-template",
+    "description": "The QUIQQER Cologne E-Commerce Template",
+    "license": "GPLv3",
+    "authors": [
+        {
+            "name": "Henning Leutz",
+            "email": "support@pcsg.de",
+            "homepage": "https://www.pcsg.de",
+            "role": "Developer"
+        }
+    ],
+    "support": {
+        "email": "support@pcsg.de",
+        "url": "https://www.pcsg.de"
+    },
+    "require": {
+        "php": "^8.1",
+        "quiqqer/core": "^2",
+        "quiqqer/erp": "^3",
+        "quiqqer/products": "^2",
+        "quiqqer/order": "^2",
+        "quiqqer/product-bricks": "^2",
+        "quiqqer/frontend-users": "^2",
+        "quiqqer/menu": "^3",
+        "quiqqer/sitetypes": "^2",
+        "quiqqer/unsemantic": "^2",
+        "quiqqer-asset/fastclick": "^1",
+        "quiqqer/tooltips": "^2",
+        "quiqqer/currency": "^2"
+    },
+    "autoload": {
+        "psr-4": {
+            "QUI\\TemplateCologne\\": "src/QUI/TemplateCologne"
+        }
+    },
+    "scripts": {
+        "test": [
+            "@dev:lint",
+            "@dev:phpunit"
+        ],
+        "dev:phpunit": "./tools/phpunit",
+        "dev:lint": [
+            "@dev:lint:phpstan",
+            "@dev:lint:style"
+        ],
+        "dev:lint:phpstan": "./tools/phpstan",
+        "dev:lint:style": "./tools/phpcs",
+        "dev:lint:style:fix": "./tools/phpcbf",
+        "dev:init": [
+            "@dev:init:check-requirements",
+            "@dev:init:tools",
+            "@dev:init:git-hooks"
+        ],
+        "dev:init:check-requirements": [
+            "which composer > /dev/null || (echo 'Error: composer has to be globally installed'; exit 1)",
+            "which phive > /dev/null || (echo 'Error: PHIVE has to be globally installed'; exit 1)"
+        ],
+        "dev:init:tools": "phive install --temporary",
+        "dev:init:git-hooks": "./tools/captainhook install --only-enabled --force"
+    },
+    "scripts-aliases": {
+        "test": [
+            "dev:test"
+        ]
+    },
+    "scripts-descriptions": {
+        "test": "Runs linting, static analysis, and unit tests.",
+        "dev:phpunit": "Run PHPUnit test suites",
+        "dev:lint": "Run PHPStan and code style check",
+        "dev:lint:phpstan": "Run PHPStan",
+        "dev:lint:style": "Run code style check (PHP_CodeSniffer)",
+        "dev:lint:style:fix": "Try to fix code style errors automatically",
+        "dev:init": "Initialize the developer tooling (tools and git hooks)",
+        "dev:init:check-requirements": "Check if the necessary requirements are met",
+        "dev:init:tools": "Install all developer tools (requires PHIVE)",
+        "dev:init:git-hooks": "Install all git hooks (may require tools to be installed)"
     }
-  ],
-  "support": {
-    "email": "support@pcsg.de",
-    "url": "https://www.pcsg.de"
-  },
-  "require": {
-    "php": "^8.1",
-    "quiqqer/core": "^2",
-    "quiqqer/erp": "^3",
-    "quiqqer/products": "^2",
-    "quiqqer/order": "^2",
-    "quiqqer/product-bricks": "^2",
-    "quiqqer/frontend-users": "^2",
-    "quiqqer/menu": "^3",
-    "quiqqer/sitetypes": "^2",
-    "quiqqer/unsemantic": "^2",
-    "quiqqer-asset/fastclick": "^1",
-    "quiqqer/tooltips": "^2",
-    "quiqqer/currency": "^2"
-  },
-  "autoload": {
-    "psr-4": {
-      "QUI\\TemplateCologne\\": "src/QUI/TemplateCologne"
-    }
-  }
-}
+}
\ No newline at end of file
-- 
GitLab


From e2535f177ae5f2be7ae16d443111ddc4455bfbe5 Mon Sep 17 00:00:00 2001
From: Jan Wennrich <jan.wennrich@pcsg.de>
Date: Fri, 24 May 2024 16:56:26 +0200
Subject: [PATCH 18/44] ci: use quiqqer-package-bundle component

---
 .gitlab-ci.yml | 18 ++++++++++++++++--
 1 file changed, 16 insertions(+), 2 deletions(-)

diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index b8d20ac..b5a64b4 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -1,3 +1,17 @@
 include:
-  - project: 'quiqqer/stabilization/semantic-release'
-    file: '/ci-templates/.gitlab-ci.yml'
+  - component: dev.quiqqer.com/quiqqer/stabilization/ci-cd-components/quiqqer-package-bundle/quiqqer-package-bundle@main
+
+# Remove the entire phpunit-php8.1 block, to allow PHPUnit to run on PHP 8.1 in your pipeline
+phpunit-php8.1:
+  rules:
+    - when: never
+
+# Remove the entire phpunit-php8.2 block, to allow PHPUnit to run on PHP 8.2 in your pipeline
+phpunit-php8.2:
+  rules:
+    - when: never
+
+# Remove the entire phpunit-php8.3 block, to allow PHPUnit to run on PHP 8.3 in your pipeline
+phpunit-php8.3:
+  rules:
+    - when: never
\ No newline at end of file
-- 
GitLab


From 9e9d9023bf7a6733390c782eb9bc5ce3e87973c1 Mon Sep 17 00:00:00 2001
From: Jan Wennrich <jan.wennrich@pcsg.de>
Date: Fri, 24 May 2024 16:56:26 +0200
Subject: [PATCH 19/44] docs: add CONTRIBUTING.md file

---
 CONTRIBUTING.md | 3 +++
 1 file changed, 3 insertions(+)
 create mode 100644 CONTRIBUTING.md

diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
new file mode 100644
index 0000000..4a69a59
--- /dev/null
+++ b/CONTRIBUTING.md
@@ -0,0 +1,3 @@
+# Contributing
+
+This package follows the [QUIQQER contribution guidelines](https://dev.quiqqer.com/quiqqer/stabilization/documentation/-/wikis/home).
\ No newline at end of file
-- 
GitLab


From 3336d00b44b2462d57be4753a242ae818d322366 Mon Sep 17 00:00:00 2001
From: Jan Wennrich <jan.wennrich@pcsg.de>
Date: Fri, 2 Aug 2024 17:14:18 +0200
Subject: [PATCH 20/44] chore: set PHPStan to level 5 with baseline

---
 .phive/phars.xml      |  2 +-
 phpstan-baseline.neon | 51 +++++++++++++++++++++++++++++++++++++++++++
 phpstan.dist.neon     |  4 +++-
 3 files changed, 55 insertions(+), 2 deletions(-)

diff --git a/.phive/phars.xml b/.phive/phars.xml
index 63a030f..ebb5988 100644
--- a/.phive/phars.xml
+++ b/.phive/phars.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <phive xmlns="https://phar.io/phive">
-  <phar name="phpstan" version="1.11.1" installed="1.11.1" location="./tools/phpstan" copy="false"/>
+  <phar name="phpstan" version="1.11.8" installed="1.11.8" location="./tools/phpstan" copy="false"/>
   <phar name="phpunit" version="^10.5.20" installed="10.5.20" location="./tools/phpunit" copy="false"/>
   <phar name="phpcs" version="^3.10.1" installed="3.10.1" location="./tools/phpcs" copy="false"/>
   <phar name="phpcbf" version="^3.10.1" installed="3.10.1" location="./tools/phpcbf" copy="false"/>
diff --git a/phpstan-baseline.neon b/phpstan-baseline.neon
index e69de29..0fa167e 100644
--- a/phpstan-baseline.neon
+++ b/phpstan-baseline.neon
@@ -0,0 +1,51 @@
+parameters:
+	ignoreErrors:
+		-
+			message: "#^Call to an undefined method QUI\\\\Interfaces\\\\Projects\\\\Site\\:\\:getCachePath\\(\\)\\.$#"
+			count: 1
+			path: src/QUI/TemplateCologne/Controls/Menu/Categories.php
+
+		-
+			message: "#^Access to constant PRODUCT_FIELD_SHIPPING_TIME on an unknown class QUI\\\\ERP\\\\Shipping\\\\Shipping\\.$#"
+			count: 1
+			path: src/QUI/TemplateCologne/Utils.php
+
+		-
+			message: "#^Access to constant PRODUCT_FIELD_STOCK on an unknown class QUI\\\\ERP\\\\StockManagement\\\\StockManager\\.$#"
+			count: 1
+			path: src/QUI/TemplateCologne/Utils.php
+
+		-
+			message: "#^Call to method setProduct\\(\\) on an unknown class QUI\\\\ERP\\\\StockManagement\\\\Products\\\\Fields\\\\StockView\\.$#"
+			count: 1
+			path: src/QUI/TemplateCologne/Utils.php
+
+		-
+			message: "#^Call to static method getShippingTimeFrontendViewByProduct\\(\\) on an unknown class QUI\\\\ERP\\\\StockManagement\\\\StockManager\\.$#"
+			count: 1
+			path: src/QUI/TemplateCologne/Utils.php
+
+		-
+			message: "#^Method QUI\\\\TemplateCologne\\\\Utils\\:\\:getStockFrontendView\\(\\) should return QUI\\\\ERP\\\\Products\\\\Field\\\\View\\|false but returns QUI\\\\ERP\\\\StockManagement\\\\Products\\\\Fields\\\\StockView\\.$#"
+			count: 1
+			path: src/QUI/TemplateCologne/Utils.php
+
+		-
+			message: "#^PHPDoc tag @var for variable \\$StockView contains unknown class QUI\\\\ERP\\\\StockManagement\\\\Products\\\\Fields\\\\StockView\\.$#"
+			count: 1
+			path: src/QUI/TemplateCologne/Utils.php
+
+		-
+			message: "#^PHPDoc tag @var has invalid value \\(\\$Site Site\\)\\: Unexpected token \"\\$Site\", expected type at offset 9$#"
+			count: 1
+			path: src/QUI/TemplateCologne/Utils.php
+
+		-
+			message: "#^Variable \\$Project might not be defined\\.$#"
+			count: 2
+			path: src/QUI/TemplateCologne/settings.css.php
+
+		-
+			message: "#^Variable \\$Site might not be defined\\.$#"
+			count: 1
+			path: src/QUI/TemplateCologne/settings.css.php
diff --git a/phpstan.dist.neon b/phpstan.dist.neon
index e929f5a..dc33bb4 100644
--- a/phpstan.dist.neon
+++ b/phpstan.dist.neon
@@ -2,8 +2,10 @@ includes:
 	- phpstan-baseline.neon
 
 parameters:
-    level: 8
+    level: 5
     paths:
         - src
         - ajax
+    bootstrapFiles:
+        - tests/phpstan-bootstrap.php
     tipsOfTheDay: false
-- 
GitLab


From d0f80c0e408f47d42e2662c1c5506c752815ce66 Mon Sep 17 00:00:00 2001
From: Jan Wennrich <jan.wennrich@pcsg.de>
Date: Fri, 2 Aug 2024 17:14:18 +0200
Subject: [PATCH 21/44] chore: upgrade CaptainHook to version ^5.23.3

---
 .phive/phars.xml                |  2 +-
 captainhook.json                | 25 +++++++++++--------------
 tests/captainhook-bootstrap.php |  3 ---
 3 files changed, 12 insertions(+), 18 deletions(-)
 delete mode 100644 tests/captainhook-bootstrap.php

diff --git a/.phive/phars.xml b/.phive/phars.xml
index ebb5988..5bfa092 100644
--- a/.phive/phars.xml
+++ b/.phive/phars.xml
@@ -4,5 +4,5 @@
   <phar name="phpunit" version="^10.5.20" installed="10.5.20" location="./tools/phpunit" copy="false"/>
   <phar name="phpcs" version="^3.10.1" installed="3.10.1" location="./tools/phpcs" copy="false"/>
   <phar name="phpcbf" version="^3.10.1" installed="3.10.1" location="./tools/phpcbf" copy="false"/>
-  <phar name="captainhook" version="^5.23.0" installed="5.23.0" location="./tools/captainhook" copy="false"/>
+  <phar name="captainhook" version="^5.23.3" installed="5.23.3" location="./tools/captainhook" copy="false"/>
 </phive>
diff --git a/captainhook.json b/captainhook.json
index 30f1064..3702e1a 100644
--- a/captainhook.json
+++ b/captainhook.json
@@ -1,16 +1,13 @@
 {
-  "config": {
-    "bootstrap": "tests/captainhook-bootstrap.php"
-  },
-  "pre-commit": {
-    "enabled": true,
-    "actions": [
-      {
-        "action": "\\CaptainHook\\App\\Hook\\PHP\\Action\\Linting"
-      },
-      {
-        "action": "composer test"
-      }
-    ]
-  }
+    "pre-commit": {
+        "enabled": true,
+        "actions": [
+            {
+                "action": "\\CaptainHook\\App\\Hook\\PHP\\Action\\Linting"
+            },
+            {
+                "action": "composer test"
+            }
+        ]
+    }
 }
\ No newline at end of file
diff --git a/tests/captainhook-bootstrap.php b/tests/captainhook-bootstrap.php
deleted file mode 100644
index 1b61b73..0000000
--- a/tests/captainhook-bootstrap.php
+++ /dev/null
@@ -1,3 +0,0 @@
-<?php
-
-// This file is supposed to be empty, see https://github.com/captainhookphp/captainhook/issues/248
-- 
GitLab


From e2c55c4f3d064b712a8e37f7230d995d0609a0be Mon Sep 17 00:00:00 2001
From: Jan Wennrich <jan.wennrich@pcsg.de>
Date: Tue, 6 Aug 2024 16:27:47 +0200
Subject: [PATCH 22/44] style: fix PSR-12 code style violations

---
 src/QUI/TemplateCologne/Utils.php | 1 -
 1 file changed, 1 deletion(-)

diff --git a/src/QUI/TemplateCologne/Utils.php b/src/QUI/TemplateCologne/Utils.php
index 6c777c8..bfa1bfa 100644
--- a/src/QUI/TemplateCologne/Utils.php
+++ b/src/QUI/TemplateCologne/Utils.php
@@ -732,6 +732,5 @@ public static function getSetting(string $settingName): bool|array|int|string
 
             return '';
         }
-
     }
 }
-- 
GitLab


From bd70197f0bd9a72136b65d31e1d82a5a0327c789 Mon Sep 17 00:00:00 2001
From: Michael Danielczok <michael@pcsg.de>
Date: Sat, 10 Aug 2024 14:17:33 +0200
Subject: [PATCH 23/44] feat: styling for login and register affects not the
 order page

Related: quiqqer/template-cologne#111
---
 bin/css/frontend-users.css | 14 +++++++-------
 bin/css/order.css          | 11 +++++++++++
 bin/css/variables.css      |  2 ++
 3 files changed, 20 insertions(+), 7 deletions(-)

diff --git a/bin/css/frontend-users.css b/bin/css/frontend-users.css
index 629acd0..c8cde74 100644
--- a/bin/css/frontend-users.css
+++ b/bin/css/frontend-users.css
@@ -245,12 +245,12 @@
 /*****************/
 /* Login control */
 /*****************/
-.quiqqer-fu-login-container,
-.quiqqer-fu-registrationSignUp {
+:where(.loginAndRegister) .quiqqer-fu-login-container,
+:where(.loginAndRegister) .quiqqer-fu-registrationSignUp {
     padding: 1.5rem 2rem;
 }
 
-.quiqqer-fu-login-container {
+:where(.loginAndRegister) .quiqqer-fu-login-container {
     background: #f8f8f8;
     border: 1px solid #ddd;
     max-width: 400px;
@@ -258,7 +258,7 @@
     width: 100%;
 }
 
-.quiqqer-frontendUsers-login .quiqqer-fu-login-container {
+:where(.loginAndRegister) .quiqqer-frontendUsers-login .quiqqer-fu-login-container {
     background: none;
     border: none;
     margin: 0 auto;
@@ -266,7 +266,7 @@
 }
 
 @media screen and (max-width: 767px) {
-    .quiqqer-fu-registrationSignUp {
+    :where(.loginAndRegister) .quiqqer-fu-registrationSignUp {
         padding: 0;
     }
 }
@@ -274,7 +274,7 @@
 /******************/
 /* reset password */
 /******************/
-.quiqqer-fu-login-container .quiqqer-fu-login-forget-password-reset [name="cancel"] {
+:where(.loginAndRegister) .quiqqer-fu-login-container .quiqqer-fu-login-forget-password-reset [name="cancel"] {
     background: none;
     border: none;
     color: inherit;
@@ -284,7 +284,7 @@
     position: initial;
 }
 
-.quiqqer-fu-login-container .quiqqer-fu-login-forget-password-reset [type="submit"] {
+:where(.loginAndRegister) .quiqqer-fu-login-container .quiqqer-fu-login-forget-password-reset [type="submit"] {
     margin-top: 1rem;
 }
 
diff --git a/bin/css/order.css b/bin/css/order.css
index 606d689..04032a9 100644
--- a/bin/css/order.css
+++ b/bin/css/order.css
@@ -454,6 +454,17 @@ table.articles-article {
     vertical-align: top;
 }
 
+.articles-article-image {
+    width: var(--_qui-order-basket-articles-image-width);
+    text-align: center;
+}
+
+.articles-article-image__img {
+    width: var(--_qui-order-articles-image-width);
+    height: var(--_qui-order-articles-image-height);
+    object-fit: contain;
+}
+
 td.articles-article-information {
     text-align: left;
 }
diff --git a/bin/css/variables.css b/bin/css/variables.css
index a0ba096..47ad80e 100644
--- a/bin/css/variables.css
+++ b/bin/css/variables.css
@@ -21,4 +21,6 @@
     /* ecoyn / ecommerce */
     --_qui-order-basket-articles-image-width: var(--qui-order-basket-articles-image-width, 100px);
     --_qui-order-basket-articles-image-height: var(--qui-order-basket-articles-image-height, 100px);
+    --_qui-order-articles-image-width: var(--qui-order-articles-image-width, 100px);
+    --_qui-order-articles-image-height: var(--qui-order-articles-image-height, 100px);
 }
\ No newline at end of file
-- 
GitLab


From b71cd4a169cb411339508c21a0b321ba68552988 Mon Sep 17 00:00:00 2001
From: Henning Leutz <leutz@pcsg.de>
Date: Thu, 19 Sep 2024 09:55:07 +0200
Subject: [PATCH 24/44] fix: spinner loading during basket loading

---
 bin/javascript/init.js        | 2 +-
 template/menu/menuSuffix.html | 8 ++++++--
 2 files changed, 7 insertions(+), 3 deletions(-)

diff --git a/bin/javascript/init.js b/bin/javascript/init.js
index 6b17cc4..80d9273 100644
--- a/bin/javascript/init.js
+++ b/bin/javascript/init.js
@@ -364,7 +364,7 @@ window.addEvent('domready', function () {
 
                             new Element('span', {
                                 'class': 'quiqqer-order-basketButton-quantity quiqqer-order-basketButton-batch-custom',
-                                html   : '0'
+                                html   : '<span class="fa fa-spinner fa-spin"></span>'
                             }).inject(BasketNode);
 
                             if (BASKET_STYLE && BASKET_STYLE === 'full') {
diff --git a/template/menu/menuSuffix.html b/template/menu/menuSuffix.html
index 5f7f6b3..248a899 100644
--- a/template/menu/menuSuffix.html
+++ b/template/menu/menuSuffix.html
@@ -10,14 +10,18 @@
         <button disabled class="quiqqer-order-basketButton button--callToAction tpl-btn basket-style-{$basketStyle}"
                 style="float: right;"><span class="quiqqer-order-basketButton-icon-custom"><span
                 class="fa fa-shopping-basket"></span></span><span
-                class="quiqqer-order-basketButton-quantity quiqqer-order-basketButton-batch-custom">0</span></button>
+                class="quiqqer-order-basketButton-quantity quiqqer-order-basketButton-batch-custom">
+            <span class="fa fa-spinner fa-spin"></span>
+        </span></button>
         {else}
         <button disabled class="quiqqer-order-basketButton button--callToAction tpl-btn basket-style-full"
                 style="float: right;">
                 <span class="quiqqer-order-basketButton-icon-custom">
                     <span class="fa fa-shopping-basket"></span>
                 </span>
-            <span class="quiqqer-order-basketButton-quantity quiqqer-order-basketButton-batch-custom">0</span>
+            <span class="quiqqer-order-basketButton-quantity quiqqer-order-basketButton-batch-custom">
+                <span class="fa fa-spinner fa-spin"></span>
+            </span>
             <span class="quiqqer-order-basketButton-sum">
                     {*$InitialBasketPrice->getDisplayPrice()*}
                     {$initialBasketPrice}
-- 
GitLab


From 3881f82d87dfb933ec1e59161ff3cbc7ba9584ec Mon Sep 17 00:00:00 2001
From: Michael Danielczok <michael@pcsg.de>
Date: Thu, 19 Sep 2024 15:55:16 +0200
Subject: [PATCH 25/44] fix: standardized and simplified options for cart
 button click action

---
 bin/css/mini-basket.css           |  1 +
 bin/css/style.css                 |  5 +++--
 bin/css/variables.css             |  1 +
 bin/javascript/init.js            |  2 +-
 composer.json                     |  2 +-
 index.html                        | 20 +++++++++----------
 locale.xml                        | 32 +++++++++++++++++--------------
 settings.xml                      | 32 +++++++++++++++++++------------
 src/QUI/TemplateCologne/Utils.php | 11 ++++-------
 9 files changed, 59 insertions(+), 47 deletions(-)

diff --git a/bin/css/mini-basket.css b/bin/css/mini-basket.css
index 62be613..783dff8 100644
--- a/bin/css/mini-basket.css
+++ b/bin/css/mini-basket.css
@@ -11,6 +11,7 @@
     max-height: calc(100vh - 130px); /* header height + top bar height */
     padding: 0 !important;
     width: 350px;
+    top: calc(var(--_qui-cologne-header-height, 100px) - 1px) !important; /* -1 because of border width */
 }
 
 .quiqqer-order-basket-small-container > .qui-control {
diff --git a/bin/css/style.css b/bin/css/style.css
index a184fee..5eaf9e5 100644
--- a/bin/css/style.css
+++ b/bin/css/style.css
@@ -747,7 +747,7 @@ a.toTop:before {
     border-bottom: 1px solid #ddd;
     box-shadow: 0 0 20px 0 rgba(57, 57, 57, 0);
     display: flex;
-    height: 100px;
+    height: var(--_qui-cologne-header-height, 100px);
     justify-content: space-between;
     left: 0;
     position: relative;
@@ -758,8 +758,9 @@ a.toTop:before {
 }
 
 .cologne-header-fixed {
+    --_qui-cologne-header-height: 60px;
+
     box-shadow: 0 0 20px 0 rgba(57, 57, 57, 0.2);
-    height: 60px;
     position: fixed;
     z-index: 100; /* Because of the search dropdown */
 }
diff --git a/bin/css/variables.css b/bin/css/variables.css
index 47ad80e..434620f 100644
--- a/bin/css/variables.css
+++ b/bin/css/variables.css
@@ -17,6 +17,7 @@
     --bg-primary: #ddd;
     --bg-secondary: #f5f5f5;
 
+    --_qui-cologne-header-height: 100px;
 
     /* ecoyn / ecommerce */
     --_qui-order-basket-articles-image-width: var(--qui-order-basket-articles-image-width, 100px);
diff --git a/bin/javascript/init.js b/bin/javascript/init.js
index 80d9273..aa506c1 100644
--- a/bin/javascript/init.js
+++ b/bin/javascript/init.js
@@ -343,7 +343,7 @@ window.addEvent('domready', function () {
                 'package/quiqqer/order/bin/frontend/controls/basket/Button'
             ], function (Basket) {
                 new Basket({
-                    open  : BASKET_OPEN.toInt(),
+                    action  : BASKET_ACTION,
                     events: {
                         onCreate: function (Basket) {
                             var BasketNode     = Basket.getElm(),
diff --git a/composer.json b/composer.json
index 5689cd4..dd16d0b 100644
--- a/composer.json
+++ b/composer.json
@@ -20,7 +20,7 @@
         "quiqqer/core": "^2",
         "quiqqer/erp": "^3",
         "quiqqer/products": "^2",
-        "quiqqer/order": "^2",
+        "quiqqer/order": "^2.7.7",
         "quiqqer/product-bricks": "^2",
         "quiqqer/frontend-users": "^2",
         "quiqqer/menu": "^3",
diff --git a/index.html b/index.html
index 055e04b..145eb88 100644
--- a/index.html
+++ b/index.html
@@ -10,16 +10,16 @@
     {$Template->getHeader()}
 
     <script>
-        var BASKET_STYLE               = "{$basketStyle}";
-        var BASKET_OPEN                = "{$basketOpen}";
-        var INITAL_BASKET_PRICE        = "{$initialBasketPrice}";
-        var COUNT_LANGUAGES            = "{$countLanguages}";
-        var SHOW_CATEGORY_MENU         = "{$showCategoryMenu}";
-        var REGISTER_URL               = "{$registerSiteUrl}";
-        var SHOW_MENU_AFTER_SCROLL_POS = "{$showNavAfterScroll}"; // The number of pixels from top which the menu will be displayed.
-        var SHOW_MENU_SMOOTH           = "{$showMenuSmooth}"; // if true menu slides from top (animation)
-        var SET_MENU_POS_BACK_ON_INIT  = !!"{$setMenuPosBackOnInit}"; // if true menu slides from top (animation)
-        var SCROLL_OFFSET              = 80;
+        const BASKET_STYLE = "{$basketStyle}";
+        const BASKET_ACTION = "{$basketAction}";
+        const INITAL_BASKET_PRICE = "{$initialBasketPrice}";
+        const COUNT_LANGUAGES = "{$countLanguages}";
+        const SHOW_CATEGORY_MENU = "{$showCategoryMenu}";
+        const REGISTER_URL = "{$registerSiteUrl}";
+        const SHOW_MENU_AFTER_SCROLL_POS = "{$showNavAfterScroll}"; // The number of pixels from top which the menu will be displayed.
+        const SHOW_MENU_SMOOTH = "{$showMenuSmooth}"; // if true menu slides from top (animation)
+        const SET_MENU_POS_BACK_ON_INIT = !!"{$setMenuPosBackOnInit}"; // if true menu slides from top (animation)
+        const SCROLL_OFFSET = 80;
     </script>
 
     {fetch template="template/head/styles.html" Template=$Template}
diff --git a/locale.xml b/locale.xml
index 45a994e..7b129ba 100644
--- a/locale.xml
+++ b/locale.xml
@@ -509,22 +509,26 @@
             <en><![CDATA[If the option ist enabled, the product images are displayed in the shopping basket and order.]]></en>
         </locale>
 
-        <!-- basket open -->
-        <locale name="settings.shop.basketOpen">
-            <de><![CDATA[Aktion bei Klick auf Warenkorb]]></de>
-            <en><![CDATA[What should happen when the user clicks on the shopping cart?]]></en>
-        </locale>
-            <locale name="settings.shop.basketOpen.nothing">
-                <de><![CDATA[Bestellprozes nicht öffnen]]></de>
-                <en><![CDATA[Do not open order process]]></en>
+        <!-- basket action -->
+        <locale name="settings.shop.basketAction">
+            <de><![CDATA[Aktion bei Klick auf Warenkorb-Icon]]></de>
+            <en><![CDATA[Shopping card action on click]]></en>
+        </locale>
+        <locale name="settings.shop.basketAction.desc">
+            <de><![CDATA[Diese Option gilt nur für Desktop Ansicht. Auf mobilen Geräten wird immer zu der Bestellseite geleitet.]]></de>
+            <en><![CDATA[This option only applies to desktop view. On mobile devices it will always be redirected to the order process page.]]></en>
+        </locale>
+            <locale name="settings.shop.basketAction.openSmallBasket">
+                <de><![CDATA[Kleinen Warenkorb öffnen]]></de>
+                <en><![CDATA[Open small basket]]></en>
             </locale>
-            <locale name="settings.shop.basketOpen.window">
-                <de><![CDATA[Bestellprozes in einem Fenster öffnen]]></de>
-                <en><![CDATA[Open order process in a popup]]></en>
+            <locale name="settings.shop.basketAction.openOrderProcessUrl">
+                <de><![CDATA[Bestellseite öffnen]]></de>
+                <en><![CDATA[Open order process page]]></en>
             </locale>
-            <locale name="settings.shop.basketOpen.page">
-                <de><![CDATA[Zu Bestellprozess-Seite leiten]]></de>
-                <en><![CDATA[Go to order page]]></en>
+            <locale name="settings.shop.basketAction.openOrderProcess">
+                <de><![CDATA[Bestellung in einem Popup Fenster öffnen]]></de>
+                <en><![CDATA[Open order process in a popup]]></en>
             </locale>
         <!-- hide empty fields -->
         <locale name="settings.shop.hideEmptyFields">
diff --git a/settings.xml b/settings.xml
index 3f0a34b..36dacb1 100644
--- a/settings.xml
+++ b/settings.xml
@@ -40,9 +40,9 @@
                         <type><![CDATA[bool]]></type>
                         <defaultvalue>1</defaultvalue>
                     </conf>
-                    <conf name="basketOpen">
-                        <type><![CDATA[integer]]></type>
-                        <defaultvalue>2</defaultvalue>
+                    <conf name="basketAction">
+                        <type><![CDATA[string]]></type>
+                        <defaultvalue>openSmallBasket</defaultvalue>
                     </conf>
                     <conf name="hideEmptyFields">
                         <type><![CDATA[bool]]></type>
@@ -454,27 +454,35 @@
                                 </description>
                             </input>
 
-                            <!-- basket open (nothing order window, order page)-->
-                            <select conf="templateCologne.settings.basketOpen">
+
+
+
+                            <!-- basket action (openSmallBasket, openOrderProcessUrl, openOrderProcess (qui popup))-->
+                            <select conf="templateCologne.settings.basketAction">
                                 <text>
                                     <locale group="quiqqer/template-cologne"
-                                            var="settings.shop.basketOpen"
+                                            var="settings.shop.basketAction"
                                     />
                                 </text>
+                                <description>
+                                    <locale group="quiqqer/template-cologne"
+                                            var="settings.shop.basketAction.desc"
+                                    />
+                                </description>
 
-                                <option value="0">
+                                <option value="openSmallBasket">
                                     <locale group="quiqqer/template-cologne"
-                                            var="settings.shop.basketOpen.nothing"
+                                            var="settings.shop.basketAction.openSmallBasket"
                                     />
                                 </option>
-                                <option value="1">
+                                <option value="openOrderProcessUrl">
                                     <locale group="quiqqer/template-cologne"
-                                            var="settings.shop.basketOpen.window"
+                                            var="settings.shop.basketAction.openOrderProcessUrl"
                                     />
                                 </option>
-                                <option value="2">
+                                <option value="openOrderProcess">
                                     <locale group="quiqqer/template-cologne"
-                                            var="settings.shop.basketOpen.page"
+                                                var="settings.shop.basketAction.openOrderProcess"
                                     />
                                 </option>
                             </select>
diff --git a/src/QUI/TemplateCologne/Utils.php b/src/QUI/TemplateCologne/Utils.php
index bfa1bfa..098a86c 100644
--- a/src/QUI/TemplateCologne/Utils.php
+++ b/src/QUI/TemplateCologne/Utils.php
@@ -237,13 +237,10 @@ public static function getConfig(array $params): object|array|bool|string
         }
 
         // basket open
-        $basketOpen = 2;
+        $basketAction = $Project->getConfig('templateCologne.settings.basketAction');
 
-        switch ($Project->getConfig('templateCologne.settings.basketOpen')) {
-            case '0':
-            case '1':
-            case '2':
-                $basketOpen = $Project->getConfig('templateCologne.settings.basketOpen');
+        if (!in_array($basketAction, ['openSmallBasket', 'openOrderProcessUrl', 'openOrderProcess'])) {
+            $basketAction = 'openSmallBasket';
         }
 
         $settingsCSS = include 'settings.css.php';
@@ -355,7 +352,7 @@ public static function getConfig(array $params): object|array|bool|string
         $config['siteType'] = $siteType;
         $config['pageCustomClass'] = $pageCustomClass;
         $config['basketStyle'] = $basketStyle;
-        $config['basketOpen'] = $basketOpen;
+        $config['basketAction'] = $basketAction;
         $config['showCategoryMenu'] = $showCategoryMenu;
         $config['homeLink'] = $homeLink;
         $config['homeLinkText'] = $homeLinkText;
-- 
GitLab


From 9a559f7f52b6583e52e0047cc8c7f930c9d6e644 Mon Sep 17 00:00:00 2001
From: Michael Danielczok <michael@pcsg.de>
Date: Wed, 16 Oct 2024 15:17:06 +0200
Subject: [PATCH 26/44] fix: improve register button desing in order process

---
 bin/css/order.css | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/bin/css/order.css b/bin/css/order.css
index 04032a9..2460636 100644
--- a/bin/css/order.css
+++ b/bin/css/order.css
@@ -8,6 +8,15 @@
     padding: 0;
 }
 
+/* bad button design in this template... */
+.quiqqer-order-ordering-nobody-tabs-main__item .quiqqer-fu-login-forget-password-reset [name="cancel"],
+.quiqqer-order-ordering-nobody-tabs-main__item .quiqqer-fu-login-forget-password-reset [name="cancel"]:is(:hover, :focus, :active) {
+    width: 100%;
+    background-color: transparent;
+    color: inherit;
+    border: none;
+}
+
 /****************/
 /* step: basket */
 /****************/
-- 
GitLab


From 11b31bfbdbf6deb7dc2a744abb54bf230e97e7ca Mon Sep 17 00:00:00 2001
From: Michael Danielczok <michael@pcsg.de>
Date: Thu, 17 Oct 2024 09:43:23 +0200
Subject: [PATCH 27/44] fix: register smarty functions (required smarty4 >=
 2.0.7)

---
 composer.json                                      |  3 ++-
 index.php                                          | 14 ++++++++++----
 layout/leftSidebar.html                            |  4 ++--
 layout/noSidebar.html                              |  4 ++--
 layout/noSidebarThin.html                          |  4 ++--
 layout/rightSidebar.html                           |  4 ++--
 layout/startPage.html                              |  4 ++--
 .../src/QUI/ERP/Order/Controls/Basket/Basket.html  |  4 ++--
 .../Controls/Category/ProductListDetails.html      |  2 +-
 .../Controls/Category/ProductListGallery.html      |  2 +-
 .../Controls/Category/ProductListList.html         |  2 +-
 .../ERP/Products/Controls/Products/Product.html    |  4 ++--
 .../Products/Controls/Products/ProductVariant.html |  4 ++--
 template/page.html                                 |  4 ++--
 14 files changed, 33 insertions(+), 26 deletions(-)

diff --git a/composer.json b/composer.json
index dd16d0b..a0cf711 100644
--- a/composer.json
+++ b/composer.json
@@ -28,7 +28,8 @@
         "quiqqer/unsemantic": "^2",
         "quiqqer-asset/fastclick": "^1",
         "quiqqer/tooltips": "^2",
-        "quiqqer/currency": "^2"
+        "quiqqer/currency": "^2",
+        "quiqqer/smarty4": "^2.0.7"
     },
     "autoload": {
         "psr-4": {
diff --git a/index.php b/index.php
index 722a879..d9bdb99 100644
--- a/index.php
+++ b/index.php
@@ -1,9 +1,15 @@
 <?php
 
 /**
- * Emotion
+ * Register smarty functions
  */
+if (method_exists($Engine, 'getSmarty')) {
+    $Engine->getSmarty()->registerClass('TemplateCologneUtils', 'QUI\TemplateCologne\Utils');
+}
 
+/**
+ * Emotion
+ */
 QUI\Utils\Site::setRecursiveAttribute($Site, 'image_emotion');
 QUI\Utils\Site::setRecursiveAttribute($Site, 'layout');
 
@@ -13,7 +19,7 @@
 $templateSettings = QUI\TemplateCologne\Utils::getConfig([
     'Project' => $Project,
     'Template' => $Template,
-    'Site'    => $Site
+    'Site' => $Site
 ]);
 
 /**
@@ -93,7 +99,7 @@
 /* user avatar */
 $Avatar = new QUI\FrontendUsers\Controls\UserIcon([
     'showLogout' => false, // template cologne use own logout popup (see bin/javascript/init.js)
-    'User'       => QUI::getUserBySession()
+    'User' => QUI::getUserBySession()
 ]);
 
 /* product page - for layouts */
@@ -134,7 +140,7 @@
 $registerSite = $Project->getSites([
     'where' => [
         'type' => [
-            'type'  => 'IN',
+            'type' => 'IN',
             'value' => $registerSiteTypes
         ]
     ],
diff --git a/layout/leftSidebar.html b/layout/leftSidebar.html
index 01330cb..975f9f5 100644
--- a/layout/leftSidebar.html
+++ b/layout/leftSidebar.html
@@ -9,7 +9,7 @@
 
         {if !empty( $prefixContentBricks )}
             {foreach from=$prefixContentBricks item=Brick}
-                {assign var=classes value=\QUI\TemplateCologne\Utils::convertBrickCSSClass($Brick->getAttribute('classes'))}
+                {assign var=classes value=$TemplateCologneUtils::convertBrickCSSClass($Brick->getAttribute('classes'))}
 
                 <section
                         class="template-brick-container template-brick-contentPrefix brick-id-{$Brick->getAttribute('id')} {$classes}">
@@ -63,7 +63,7 @@
 
         {if !empty( $suffixContentBricks )}
             {foreach from=$suffixContentBricks item=Brick}
-                {assign var=classes value=\QUI\TemplateCologne\Utils::convertBrickCSSClass($Brick->getAttribute('classes'))}
+                {assign var=classes value=$TemplateCologneUtils::convertBrickCSSClass($Brick->getAttribute('classes'))}
 
                 <section class="template-brick-container template-brick-contentSuffix brick-id-{$Brick->getAttribute('id')} {$classes}">
                     <div class="template-grid-row">
diff --git a/layout/noSidebar.html b/layout/noSidebar.html
index 05b7c79..1706313 100644
--- a/layout/noSidebar.html
+++ b/layout/noSidebar.html
@@ -6,7 +6,7 @@
 <div class="main-no-sidebar">
     {if !empty( $prefixContentBricks )}
     {foreach from=$prefixContentBricks item=Brick}
-        {assign var=classes value=\QUI\TemplateCologne\Utils::convertBrickCSSClass($Brick->getAttribute('classes'))}
+        {assign var=classes value=$TemplateCologneUtils::convertBrickCSSClass($Brick->getAttribute('classes'))}
 
         <section class="template-brick-container template-brick-contentPrefix brick-id-{$Brick->getAttribute('id')} {$classes}">
             <div class="template-grid-row">
@@ -58,7 +58,7 @@
 
     {if !empty( $suffixContentBricks )}
     {foreach from=$suffixContentBricks item=Brick}
-        {assign var=classes value=\QUI\TemplateCologne\Utils::convertBrickCSSClass($Brick->getAttribute('classes'))}
+        {assign var=classes value=$TemplateCologneUtils::convertBrickCSSClass($Brick->getAttribute('classes'))}
 
         <section class="template-brick-container template-brick-contentSuffix brick-id-{$Brick->getAttribute('id')} {$classes}">
             <div class="template-grid-row">
diff --git a/layout/noSidebarThin.html b/layout/noSidebarThin.html
index 7eb7187..77a853a 100644
--- a/layout/noSidebarThin.html
+++ b/layout/noSidebarThin.html
@@ -7,7 +7,7 @@
 <div class="main-no-sidebar-thin">
     {if !empty( $prefixContentBricks )}
     {foreach from=$prefixContentBricks item=Brick}
-        {assign var=classes value=\QUI\TemplateCologne\Utils::convertBrickCSSClass($Brick->getAttribute('classes'))}
+        {assign var=classes value=$TemplateCologneUtils::convertBrickCSSClass($Brick->getAttribute('classes'))}
 
         <section class="template-brick-container template-brick-contentPrefix brick-id-{$Brick->getAttribute('id')} {$classes}">
             <div class="template-grid-row">
@@ -58,7 +58,7 @@
 
     {if !empty( $suffixContentBricks )}
     {foreach from=$suffixContentBricks item=Brick}
-        {assign var=classes value=\QUI\TemplateCologne\Utils::convertBrickCSSClass($Brick->getAttribute('classes'))}
+        {assign var=classes value=$TemplateCologneUtils::convertBrickCSSClass($Brick->getAttribute('classes'))}
 
         <section class="template-brick-container template-brick-contentSuffix brick-id-{$Brick->getAttribute('id')} {$classes}">
             <div class="template-grid-row">
diff --git a/layout/rightSidebar.html b/layout/rightSidebar.html
index db226d4..fb7e626 100644
--- a/layout/rightSidebar.html
+++ b/layout/rightSidebar.html
@@ -10,7 +10,7 @@
 
         {if !empty( $prefixContentBricks )}
         {foreach from=$prefixContentBricks item=Brick}
-            {assign var=classes value=\QUI\TemplateCologne\Utils::convertBrickCSSClass($Brick->getAttribute('classes'))}
+            {assign var=classes value=$TemplateCologneUtils::convertBrickCSSClass($Brick->getAttribute('classes'))}
 
             <section class="template-brick-container template-brick-contentPrefix brick-id-{$Brick->getAttribute('id')} {$classes}">
                 <div class="template-grid-row">
@@ -62,7 +62,7 @@
 
         {if !empty( $suffixContentBricks )}
         {foreach from=$suffixContentBricks item=Brick}
-            {assign var=classes value=\QUI\TemplateCologne\Utils::convertBrickCSSClass($Brick->getAttribute('classes'))}
+            {assign var=classes value=$TemplateCologneUtils::convertBrickCSSClass($Brick->getAttribute('classes'))}
 
             <section class="template-brick-container template-brick-contentSuffix brick-id-{$Brick->getAttribute('id')} {$classes}">
                 <div class="template-grid-row">
diff --git a/layout/startPage.html b/layout/startPage.html
index 672b17c..201aad4 100644
--- a/layout/startPage.html
+++ b/layout/startPage.html
@@ -6,7 +6,7 @@
 <div class="main-start-page">
     {if !empty( $prefixContentBricks )}
     {foreach from=$prefixContentBricks item=Brick}
-        {assign var=classes value=\QUI\TemplateCologne\Utils::convertBrickCSSClass($Brick->getAttribute('classes'))}
+        {assign var=classes value=$TemplateCologneUtils::convertBrickCSSClass($Brick->getAttribute('classes'))}
 
         <section class="template-brick-container template-brick-contentPrefix brick-id-{$Brick->getAttribute('id')} {$classes}">
             <div class="template-grid-row">
@@ -59,7 +59,7 @@
 
     {if !empty( $suffixContentBricks )}
     {foreach from=$suffixContentBricks item=Brick}
-        {assign var=classes value=\QUI\TemplateCologne\Utils::convertBrickCSSClass($Brick->getAttribute('classes'))}
+        {assign var=classes value=$TemplateCologneUtils::convertBrickCSSClass($Brick->getAttribute('classes'))}
 
         <section class="template-brick-container template-brick-contentSuffix brick-id-{$Brick->getAttribute('id')} {$classes}">
             <div class="template-grid-row">
diff --git a/quiqqer/order/src/QUI/ERP/Order/Controls/Basket/Basket.html b/quiqqer/order/src/QUI/ERP/Order/Controls/Basket/Basket.html
index d06d528..b1eaa22 100644
--- a/quiqqer/order/src/QUI/ERP/Order/Controls/Basket/Basket.html
+++ b/quiqqer/order/src/QUI/ERP/Order/Controls/Basket/Basket.html
@@ -9,7 +9,7 @@
         >
             {locale group="quiqqer/erp" var="article.list.articles.header.pos"}
         </th>
-        {if QUI\TemplateCologne\Utils::getSetting('order.basket.showImages')}
+        {if $TemplateCologneUtils::getSetting('order.basket.showImages')}
         <th class="quiqqer-order-basket-articles-header-image"
             title="{locale group='quiqqer/erp' var='article.list.articles.header.image'}"
         >
@@ -50,7 +50,7 @@
         >
             {$pos}
         </td>
-        {if QUI\TemplateCologne\Utils::getSetting('order.basket.showImages')}
+        {if $TemplateCologneUtils::getSetting('order.basket.showImages')}
         <td class="quiqqer-order-basket-articles-article-image"
             data-label="{locale group='quiqqer/erp' var='article.list.articles.header.image'}"
         >
diff --git a/quiqqer/products/src/QUI/ERP/Products/Controls/Category/ProductListDetails.html b/quiqqer/products/src/QUI/ERP/Products/Controls/Category/ProductListDetails.html
index 5d45125..ab96fd7 100644
--- a/quiqqer/products/src/QUI/ERP/Products/Controls/Category/ProductListDetails.html
+++ b/quiqqer/products/src/QUI/ERP/Products/Controls/Category/ProductListDetails.html
@@ -42,7 +42,7 @@
         {/if}
 
         {if $Project->getConfig('templateCologne.settings.categoryShowStock')}
-            {assign var=ShippingTimeFrontendView value=\QUI\TemplateCologne\Utils::getShippingTimeFrontendView($Product->getId())}
+            {assign var=ShippingTimeFrontendView value=$TemplateCologneUtils::getShippingTimeFrontendView($Product->getId())}
             {if $ShippingTimeFrontendView}
             <div class="cologne-productList-product-details-content-shippingTime">
                 {$ShippingTimeFrontendView->create()}
diff --git a/quiqqer/products/src/QUI/ERP/Products/Controls/Category/ProductListGallery.html b/quiqqer/products/src/QUI/ERP/Products/Controls/Category/ProductListGallery.html
index 38f84d0..be155ca 100644
--- a/quiqqer/products/src/QUI/ERP/Products/Controls/Category/ProductListGallery.html
+++ b/quiqqer/products/src/QUI/ERP/Products/Controls/Category/ProductListGallery.html
@@ -36,7 +36,7 @@
     </div>
 
     {if $Project->getConfig('templateCologne.settings.categoryShowStock')}
-        {assign var=ShippingTimeFrontendView value=\QUI\TemplateCologne\Utils::getShippingTimeFrontendView($Product->getId())}
+        {assign var=ShippingTimeFrontendView value=$TemplateCologneUtils::getShippingTimeFrontendView($Product->getId())}
         {if $ShippingTimeFrontendView}
         <div class="cologne-products-productGallery-products-product-price-shippingTime">
             {$ShippingTimeFrontendView->create()}
diff --git a/quiqqer/products/src/QUI/ERP/Products/Controls/Category/ProductListList.html b/quiqqer/products/src/QUI/ERP/Products/Controls/Category/ProductListList.html
index 050380e..ff6a679 100644
--- a/quiqqer/products/src/QUI/ERP/Products/Controls/Category/ProductListList.html
+++ b/quiqqer/products/src/QUI/ERP/Products/Controls/Category/ProductListList.html
@@ -16,7 +16,7 @@
         </div>
 
         {if $Project->getConfig('templateCologne.settings.categoryShowStock')}
-            {assign var=ShippingTimeFrontendView value=\QUI\TemplateCologne\Utils::getShippingTimeFrontendView($Product->getId())}
+            {assign var=ShippingTimeFrontendView value=$TemplateCologneUtils::getShippingTimeFrontendView($Product->getId())}
             {if $ShippingTimeFrontendView}
             <div class="quiqqer-productList-product-list-text-shippingTime">
                 {$ShippingTimeFrontendView->create()}
diff --git a/quiqqer/products/src/QUI/ERP/Products/Controls/Products/Product.html b/quiqqer/products/src/QUI/ERP/Products/Controls/Products/Product.html
index 8842cc5..634bc02 100644
--- a/quiqqer/products/src/QUI/ERP/Products/Controls/Products/Product.html
+++ b/quiqqer/products/src/QUI/ERP/Products/Controls/Products/Product.html
@@ -69,12 +69,12 @@
             {/foreach}
 
             {assign var=ShippingTimeFrontendView
-            value=\QUI\TemplateCologne\Utils::getShippingTimeFrontendView($Product->getId())}
+            value=$TemplateCologneUtils::getShippingTimeFrontendView($Product->getId())}
             {if $ShippingTimeFrontendView}
             {$ShippingTimeFrontendView->create()}
             {/if}
 
-            {assign var=StockFrontendView value=\QUI\TemplateCologne\Utils::getStockFrontendView($Product->getId())}
+            {assign var=StockFrontendView value=$TemplateCologneUtils::getStockFrontendView($Product->getId())}
             {if $StockFrontendView}
             {$StockFrontendView->create()}
             {/if}
diff --git a/quiqqer/products/src/QUI/ERP/Products/Controls/Products/ProductVariant.html b/quiqqer/products/src/QUI/ERP/Products/Controls/Products/ProductVariant.html
index 22ca193..79433b2 100644
--- a/quiqqer/products/src/QUI/ERP/Products/Controls/Products/ProductVariant.html
+++ b/quiqqer/products/src/QUI/ERP/Products/Controls/Products/ProductVariant.html
@@ -52,12 +52,12 @@
             {/foreach}
 
             {assign var=ShippingTimeFrontendView
-            value=\QUI\TemplateCologne\Utils::getShippingTimeFrontendView($Product->getId())}
+            value=$TemplateCologneUtils::getShippingTimeFrontendView($Product->getId())}
             {if $ShippingTimeFrontendView}
                 {$ShippingTimeFrontendView->create()}
             {/if}
 
-            {assign var=StockFrontendView value=\QUI\TemplateCologne\Utils::getStockFrontendView($Product->getId())}
+            {assign var=StockFrontendView value=$TemplateCologneUtils::getStockFrontendView($Product->getId())}
             {if $StockFrontendView}
                 {$StockFrontendView->create()}
             {/if}
diff --git a/template/page.html b/template/page.html
index ba86b13..9cdb023 100644
--- a/template/page.html
+++ b/template/page.html
@@ -25,7 +25,7 @@
         {assign var=brickNoPadding value="brick-no-spacing"}
     {/if}
 
-    {assign var=classes value=\QUI\TemplateCologne\Utils::convertBrickCSSClass($Brick->getAttribute('classes'))}
+    {assign var=classes value=$TemplateCologneUtils::convertBrickCSSClass($Brick->getAttribute('classes'))}
 
     <section class="template-brick-container template-brick-headerSuffix brick-id-{$Brick->getAttribute('id')} {$classes}">
         <div class="template-grid-container template-grid-row {$brickFullWidth} {$brickNoPadding}">
@@ -54,7 +54,7 @@
         {assign var=brickNoPadding value="brick-no-spacing"}
     {/if}
 
-    {assign var=classes value=\QUI\TemplateCologne\Utils::convertBrickCSSClass($Brick->getAttribute('classes'))}
+    {assign var=classes value=$TemplateCologneUtils::convertBrickCSSClass($Brick->getAttribute('classes'))}
 
     <section class="template-brick-container template-brick-footerPrefix brick-id-{$Brick->getAttribute('id')} {$classes}">
         <div class="template-grid-container template-grid-row {$brickFullWidth} {$brickNoPadding}">
-- 
GitLab


From 815fc0147cbc2831cea8d25ce1d2e78673727626 Mon Sep 17 00:00:00 2001
From: Michael Danielczok <michael@pcsg.de>
Date: Thu, 17 Oct 2024 15:47:33 +0200
Subject: [PATCH 28/44] fix: improve design of login control

---
 bin/css/frontend-users.css | 16 +++++++++++-----
 bin/css/style.css          | 13 ++++++++++---
 2 files changed, 21 insertions(+), 8 deletions(-)

diff --git a/bin/css/frontend-users.css b/bin/css/frontend-users.css
index c8cde74..56bc8b6 100644
--- a/bin/css/frontend-users.css
+++ b/bin/css/frontend-users.css
@@ -258,6 +258,12 @@
     width: 100%;
 }
 
+.loginAndRegister .quiqqer-fu-login-container-width {
+    width: 100%;
+    max-width: 400px;
+    margin-inline: auto;
+}
+
 :where(.loginAndRegister) .quiqqer-frontendUsers-login .quiqqer-fu-login-container {
     background: none;
     border: none;
@@ -274,17 +280,18 @@
 /******************/
 /* reset password */
 /******************/
-:where(.loginAndRegister) .quiqqer-fu-login-container .quiqqer-fu-login-forget-password-reset [name="cancel"] {
+.quiqqer-fu-login-container .quiqqer-fu-login-forget-password-reset [name="cancel"] {
     background: none;
     border: none;
     color: inherit;
-    float: right;
     margin-top: 1rem;
     padding: 0;
     position: initial;
+    width: 100%;
+    text-align: right;
 }
 
-:where(.loginAndRegister) .quiqqer-fu-login-container .quiqqer-fu-login-forget-password-reset [type="submit"] {
+.quiqqer-fu-login-container .quiqqer-fu-login-forget-password-reset [type="submit"] {
     margin-top: 1rem;
 }
 
@@ -317,8 +324,7 @@
 }
 
 .loginAndRegister .quiqqer-fu-login-forget-password-reset {
-    padding: 1.5rem 2rem;
-    background: #f8f8f8;
+    padding-inline: 2rem;
 }
 
 .quiqqer-fu-registrationSignUp-terms-text [name="decline"] {
diff --git a/bin/css/style.css b/bin/css/style.css
index 5eaf9e5..408b667 100644
--- a/bin/css/style.css
+++ b/bin/css/style.css
@@ -1523,6 +1523,12 @@ a.toTop:before {
 
 .cologne-login-dialog .qui-window-popup-content {
     padding: 20px 40px;
+    display: grid;
+    grid-template-areas:
+        'logo'
+        'body'
+        'reset';
+    grid-template-rows: auto 1fr;
 }
 
 .quiqqer-frontendUsers-loginWindow .quiqqer-frontendUsers-login {
@@ -1615,11 +1621,12 @@ a.toTop:before {
 
 /* sing up / registration in link */
 .login-popup-create-account-wrapper {
-    bottom: 10px;
-    left: 0;
-    position: absolute;
     text-align: center;
     width: 100%;
+    grid-area: reset;
+    margin-top: 1rem;
+    z-index: 1;
+    position: relative;
 }
 
 /*************************/
-- 
GitLab


From 4beb1aa7e89999a0b0e65cf6b1e5383b6cba84f0 Mon Sep 17 00:00:00 2001
From: Michael Danielczok <michael@pcsg.de>
Date: Thu, 17 Oct 2024 16:01:36 +0200
Subject: [PATCH 29/44] chore: header blocks must be separated by a single
 blank line

---
 index.php | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/index.php b/index.php
index d9bdb99..4ecffac 100644
--- a/index.php
+++ b/index.php
@@ -1,5 +1,12 @@
 <?php
 
+/**
+ * @var QUI\Projects\Project $Project
+ * @var QUI\Projects\Site $Site
+ * @var QUI\Interfaces\Template\EngineInterface $Engine
+ * @var QUI\Template $Template
+ **/
+
 /**
  * Register smarty functions
  */
-- 
GitLab


From fc6841409eff22db5aa3ebb64bfe9000c68fe219 Mon Sep 17 00:00:00 2001
From: Michael Danielczok <michael@pcsg.de>
Date: Thu, 17 Oct 2024 16:18:01 +0200
Subject: [PATCH 30/44] docs: header blocks must be separated by a single blank
 line

---
 index.php | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/index.php b/index.php
index 4ecffac..5b2daac 100644
--- a/index.php
+++ b/index.php
@@ -1,6 +1,8 @@
 <?php
 
 /**
+ * cologne template file
+ *
  * @var QUI\Projects\Project $Project
  * @var QUI\Projects\Site $Site
  * @var QUI\Interfaces\Template\EngineInterface $Engine
-- 
GitLab


From 7921f5df625d4d5620bce410a4e4caeb879d3bf7 Mon Sep 17 00:00:00 2001
From: Michael Danielczok <michael@pcsg.de>
Date: Thu, 17 Oct 2024 16:19:58 +0200
Subject: [PATCH 31/44] docs: header blocks must be separated by a single blank
 line

---
 index.php | 1 +
 1 file changed, 1 insertion(+)

diff --git a/index.php b/index.php
index 5b2daac..9e6fe09 100644
--- a/index.php
+++ b/index.php
@@ -12,6 +12,7 @@
 /**
  * Register smarty functions
  */
+
 if (method_exists($Engine, 'getSmarty')) {
     $Engine->getSmarty()->registerClass('TemplateCologneUtils', 'QUI\TemplateCologne\Utils');
 }
-- 
GitLab


From 1a567cbf37bb2cec3ae579a2401f6271b3c5ebe4 Mon Sep 17 00:00:00 2001
From: Michael Danielczok <michael@pcsg.de>
Date: Thu, 24 Oct 2024 11:09:59 +0200
Subject: [PATCH 32/44] fix: register smarty functions

---
 .phive/phars.xml                                   |  2 +-
 events.xml                                         |  1 +
 index.php                                          |  8 --------
 layout/leftSidebar.html                            |  4 ++--
 layout/noSidebar.html                              |  4 ++--
 layout/noSidebarThin.html                          |  4 ++--
 layout/rightSidebar.html                           |  4 ++--
 layout/startPage.html                              |  4 ++--
 .../src/QUI/ERP/Order/Controls/Basket/Basket.html  |  4 ++--
 .../Controls/Category/ProductListDetails.html      |  2 +-
 .../Controls/Category/ProductListGallery.html      |  2 +-
 .../Controls/Category/ProductListList.html         |  2 +-
 .../ERP/Products/Controls/Products/Product.html    |  4 ++--
 .../Products/Controls/Products/ProductVariant.html |  4 ++--
 src/QUI/TemplateCologne/EventHandler.php           | 14 ++++++++++++++
 template/page.html                                 |  4 ++--
 16 files changed, 37 insertions(+), 30 deletions(-)

diff --git a/.phive/phars.xml b/.phive/phars.xml
index 5bfa092..7877fd4 100644
--- a/.phive/phars.xml
+++ b/.phive/phars.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <phive xmlns="https://phar.io/phive">
-  <phar name="phpstan" version="1.11.8" installed="1.11.8" location="./tools/phpstan" copy="false"/>
+  <phar name="phpstan" version="^1.11.5" installed="1.11.5" location="./tools/phpstan" copy="false"/>
   <phar name="phpunit" version="^10.5.20" installed="10.5.20" location="./tools/phpunit" copy="false"/>
   <phar name="phpcs" version="^3.10.1" installed="3.10.1" location="./tools/phpcs" copy="false"/>
   <phar name="phpcbf" version="^3.10.1" installed="3.10.1" location="./tools/phpcbf" copy="false"/>
diff --git a/events.xml b/events.xml
index 10127fc..8551c67 100644
--- a/events.xml
+++ b/events.xml
@@ -1,5 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <events>
+    <event on="onSmartyInit" fire="\QUI\TemplateCologne\EventHandler::onSmartyInit"/>
     <event on="onProjectConfigSave" fire="\QUI\TemplateCologne\EventHandler::onProjectConfigSave"/>
     <event on="onSiteSave" fire="\QUI\TemplateCologne\EventHandler::onSiteSave"/>
     <event on="onQuiqqer::products::product::buttons::end"
diff --git a/index.php b/index.php
index 9e6fe09..0e576c5 100644
--- a/index.php
+++ b/index.php
@@ -9,14 +9,6 @@
  * @var QUI\Template $Template
  **/
 
-/**
- * Register smarty functions
- */
-
-if (method_exists($Engine, 'getSmarty')) {
-    $Engine->getSmarty()->registerClass('TemplateCologneUtils', 'QUI\TemplateCologne\Utils');
-}
-
 /**
  * Emotion
  */
diff --git a/layout/leftSidebar.html b/layout/leftSidebar.html
index 975f9f5..550431a 100644
--- a/layout/leftSidebar.html
+++ b/layout/leftSidebar.html
@@ -9,7 +9,7 @@
 
         {if !empty( $prefixContentBricks )}
             {foreach from=$prefixContentBricks item=Brick}
-                {assign var=classes value=$TemplateCologneUtils::convertBrickCSSClass($Brick->getAttribute('classes'))}
+                {assign var=classes value=QUI\TemplateCologne\Utils::convertBrickCSSClass($Brick->getAttribute('classes'))}
 
                 <section
                         class="template-brick-container template-brick-contentPrefix brick-id-{$Brick->getAttribute('id')} {$classes}">
@@ -63,7 +63,7 @@
 
         {if !empty( $suffixContentBricks )}
             {foreach from=$suffixContentBricks item=Brick}
-                {assign var=classes value=$TemplateCologneUtils::convertBrickCSSClass($Brick->getAttribute('classes'))}
+                {assign var=classes value=QUI\TemplateCologne\Utils::convertBrickCSSClass($Brick->getAttribute('classes'))}
 
                 <section class="template-brick-container template-brick-contentSuffix brick-id-{$Brick->getAttribute('id')} {$classes}">
                     <div class="template-grid-row">
diff --git a/layout/noSidebar.html b/layout/noSidebar.html
index 1706313..5c5e7af 100644
--- a/layout/noSidebar.html
+++ b/layout/noSidebar.html
@@ -6,7 +6,7 @@
 <div class="main-no-sidebar">
     {if !empty( $prefixContentBricks )}
     {foreach from=$prefixContentBricks item=Brick}
-        {assign var=classes value=$TemplateCologneUtils::convertBrickCSSClass($Brick->getAttribute('classes'))}
+        {assign var=classes value=QUI\TemplateCologne\Utils::convertBrickCSSClass($Brick->getAttribute('classes'))}
 
         <section class="template-brick-container template-brick-contentPrefix brick-id-{$Brick->getAttribute('id')} {$classes}">
             <div class="template-grid-row">
@@ -58,7 +58,7 @@
 
     {if !empty( $suffixContentBricks )}
     {foreach from=$suffixContentBricks item=Brick}
-        {assign var=classes value=$TemplateCologneUtils::convertBrickCSSClass($Brick->getAttribute('classes'))}
+        {assign var=classes value=QUI\TemplateCologne\Utils::convertBrickCSSClass($Brick->getAttribute('classes'))}
 
         <section class="template-brick-container template-brick-contentSuffix brick-id-{$Brick->getAttribute('id')} {$classes}">
             <div class="template-grid-row">
diff --git a/layout/noSidebarThin.html b/layout/noSidebarThin.html
index 77a853a..c790018 100644
--- a/layout/noSidebarThin.html
+++ b/layout/noSidebarThin.html
@@ -7,7 +7,7 @@
 <div class="main-no-sidebar-thin">
     {if !empty( $prefixContentBricks )}
     {foreach from=$prefixContentBricks item=Brick}
-        {assign var=classes value=$TemplateCologneUtils::convertBrickCSSClass($Brick->getAttribute('classes'))}
+        {assign var=classes value=QUI\TemplateCologne\Utils::convertBrickCSSClass($Brick->getAttribute('classes'))}
 
         <section class="template-brick-container template-brick-contentPrefix brick-id-{$Brick->getAttribute('id')} {$classes}">
             <div class="template-grid-row">
@@ -58,7 +58,7 @@
 
     {if !empty( $suffixContentBricks )}
     {foreach from=$suffixContentBricks item=Brick}
-        {assign var=classes value=$TemplateCologneUtils::convertBrickCSSClass($Brick->getAttribute('classes'))}
+        {assign var=classes value=QUI\TemplateCologne\Utils::convertBrickCSSClass($Brick->getAttribute('classes'))}
 
         <section class="template-brick-container template-brick-contentSuffix brick-id-{$Brick->getAttribute('id')} {$classes}">
             <div class="template-grid-row">
diff --git a/layout/rightSidebar.html b/layout/rightSidebar.html
index fb7e626..30e9a59 100644
--- a/layout/rightSidebar.html
+++ b/layout/rightSidebar.html
@@ -10,7 +10,7 @@
 
         {if !empty( $prefixContentBricks )}
         {foreach from=$prefixContentBricks item=Brick}
-            {assign var=classes value=$TemplateCologneUtils::convertBrickCSSClass($Brick->getAttribute('classes'))}
+            {assign var=classes value=QUI\TemplateCologne\Utils::convertBrickCSSClass($Brick->getAttribute('classes'))}
 
             <section class="template-brick-container template-brick-contentPrefix brick-id-{$Brick->getAttribute('id')} {$classes}">
                 <div class="template-grid-row">
@@ -62,7 +62,7 @@
 
         {if !empty( $suffixContentBricks )}
         {foreach from=$suffixContentBricks item=Brick}
-            {assign var=classes value=$TemplateCologneUtils::convertBrickCSSClass($Brick->getAttribute('classes'))}
+            {assign var=classes value=QUI\TemplateCologne\Utils::convertBrickCSSClass($Brick->getAttribute('classes'))}
 
             <section class="template-brick-container template-brick-contentSuffix brick-id-{$Brick->getAttribute('id')} {$classes}">
                 <div class="template-grid-row">
diff --git a/layout/startPage.html b/layout/startPage.html
index 201aad4..76256d8 100644
--- a/layout/startPage.html
+++ b/layout/startPage.html
@@ -6,7 +6,7 @@
 <div class="main-start-page">
     {if !empty( $prefixContentBricks )}
     {foreach from=$prefixContentBricks item=Brick}
-        {assign var=classes value=$TemplateCologneUtils::convertBrickCSSClass($Brick->getAttribute('classes'))}
+        {assign var=classes value=QUI\TemplateCologne\Utils::convertBrickCSSClass($Brick->getAttribute('classes'))}
 
         <section class="template-brick-container template-brick-contentPrefix brick-id-{$Brick->getAttribute('id')} {$classes}">
             <div class="template-grid-row">
@@ -59,7 +59,7 @@
 
     {if !empty( $suffixContentBricks )}
     {foreach from=$suffixContentBricks item=Brick}
-        {assign var=classes value=$TemplateCologneUtils::convertBrickCSSClass($Brick->getAttribute('classes'))}
+        {assign var=classes value=QUI\TemplateCologne\Utils::convertBrickCSSClass($Brick->getAttribute('classes'))}
 
         <section class="template-brick-container template-brick-contentSuffix brick-id-{$Brick->getAttribute('id')} {$classes}">
             <div class="template-grid-row">
diff --git a/quiqqer/order/src/QUI/ERP/Order/Controls/Basket/Basket.html b/quiqqer/order/src/QUI/ERP/Order/Controls/Basket/Basket.html
index b1eaa22..d06d528 100644
--- a/quiqqer/order/src/QUI/ERP/Order/Controls/Basket/Basket.html
+++ b/quiqqer/order/src/QUI/ERP/Order/Controls/Basket/Basket.html
@@ -9,7 +9,7 @@
         >
             {locale group="quiqqer/erp" var="article.list.articles.header.pos"}
         </th>
-        {if $TemplateCologneUtils::getSetting('order.basket.showImages')}
+        {if QUI\TemplateCologne\Utils::getSetting('order.basket.showImages')}
         <th class="quiqqer-order-basket-articles-header-image"
             title="{locale group='quiqqer/erp' var='article.list.articles.header.image'}"
         >
@@ -50,7 +50,7 @@
         >
             {$pos}
         </td>
-        {if $TemplateCologneUtils::getSetting('order.basket.showImages')}
+        {if QUI\TemplateCologne\Utils::getSetting('order.basket.showImages')}
         <td class="quiqqer-order-basket-articles-article-image"
             data-label="{locale group='quiqqer/erp' var='article.list.articles.header.image'}"
         >
diff --git a/quiqqer/products/src/QUI/ERP/Products/Controls/Category/ProductListDetails.html b/quiqqer/products/src/QUI/ERP/Products/Controls/Category/ProductListDetails.html
index ab96fd7..770df2c 100644
--- a/quiqqer/products/src/QUI/ERP/Products/Controls/Category/ProductListDetails.html
+++ b/quiqqer/products/src/QUI/ERP/Products/Controls/Category/ProductListDetails.html
@@ -42,7 +42,7 @@
         {/if}
 
         {if $Project->getConfig('templateCologne.settings.categoryShowStock')}
-            {assign var=ShippingTimeFrontendView value=$TemplateCologneUtils::getShippingTimeFrontendView($Product->getId())}
+            {assign var=ShippingTimeFrontendView value=QUI\TemplateCologne\Utils::getShippingTimeFrontendView($Product->getId())}
             {if $ShippingTimeFrontendView}
             <div class="cologne-productList-product-details-content-shippingTime">
                 {$ShippingTimeFrontendView->create()}
diff --git a/quiqqer/products/src/QUI/ERP/Products/Controls/Category/ProductListGallery.html b/quiqqer/products/src/QUI/ERP/Products/Controls/Category/ProductListGallery.html
index be155ca..c1d5c72 100644
--- a/quiqqer/products/src/QUI/ERP/Products/Controls/Category/ProductListGallery.html
+++ b/quiqqer/products/src/QUI/ERP/Products/Controls/Category/ProductListGallery.html
@@ -36,7 +36,7 @@
     </div>
 
     {if $Project->getConfig('templateCologne.settings.categoryShowStock')}
-        {assign var=ShippingTimeFrontendView value=$TemplateCologneUtils::getShippingTimeFrontendView($Product->getId())}
+        {assign var=ShippingTimeFrontendView value=QUI\TemplateCologne\Utils::getShippingTimeFrontendView($Product->getId())}
         {if $ShippingTimeFrontendView}
         <div class="cologne-products-productGallery-products-product-price-shippingTime">
             {$ShippingTimeFrontendView->create()}
diff --git a/quiqqer/products/src/QUI/ERP/Products/Controls/Category/ProductListList.html b/quiqqer/products/src/QUI/ERP/Products/Controls/Category/ProductListList.html
index ff6a679..6713312 100644
--- a/quiqqer/products/src/QUI/ERP/Products/Controls/Category/ProductListList.html
+++ b/quiqqer/products/src/QUI/ERP/Products/Controls/Category/ProductListList.html
@@ -16,7 +16,7 @@
         </div>
 
         {if $Project->getConfig('templateCologne.settings.categoryShowStock')}
-            {assign var=ShippingTimeFrontendView value=$TemplateCologneUtils::getShippingTimeFrontendView($Product->getId())}
+            {assign var=ShippingTimeFrontendView value=QUI\TemplateCologne\Utils::getShippingTimeFrontendView($Product->getId())}
             {if $ShippingTimeFrontendView}
             <div class="quiqqer-productList-product-list-text-shippingTime">
                 {$ShippingTimeFrontendView->create()}
diff --git a/quiqqer/products/src/QUI/ERP/Products/Controls/Products/Product.html b/quiqqer/products/src/QUI/ERP/Products/Controls/Products/Product.html
index 634bc02..1adeb7c 100644
--- a/quiqqer/products/src/QUI/ERP/Products/Controls/Products/Product.html
+++ b/quiqqer/products/src/QUI/ERP/Products/Controls/Products/Product.html
@@ -69,12 +69,12 @@
             {/foreach}
 
             {assign var=ShippingTimeFrontendView
-            value=$TemplateCologneUtils::getShippingTimeFrontendView($Product->getId())}
+            value=QUI\TemplateCologne\Utils::getShippingTimeFrontendView($Product->getId())}
             {if $ShippingTimeFrontendView}
             {$ShippingTimeFrontendView->create()}
             {/if}
 
-            {assign var=StockFrontendView value=$TemplateCologneUtils::getStockFrontendView($Product->getId())}
+            {assign var=StockFrontendView value=QUI\TemplateCologne\Utils::getStockFrontendView($Product->getId())}
             {if $StockFrontendView}
             {$StockFrontendView->create()}
             {/if}
diff --git a/quiqqer/products/src/QUI/ERP/Products/Controls/Products/ProductVariant.html b/quiqqer/products/src/QUI/ERP/Products/Controls/Products/ProductVariant.html
index 79433b2..f8cb2e9 100644
--- a/quiqqer/products/src/QUI/ERP/Products/Controls/Products/ProductVariant.html
+++ b/quiqqer/products/src/QUI/ERP/Products/Controls/Products/ProductVariant.html
@@ -52,12 +52,12 @@
             {/foreach}
 
             {assign var=ShippingTimeFrontendView
-            value=$TemplateCologneUtils::getShippingTimeFrontendView($Product->getId())}
+            value=QUI\TemplateCologne\Utils::getShippingTimeFrontendView($Product->getId())}
             {if $ShippingTimeFrontendView}
                 {$ShippingTimeFrontendView->create()}
             {/if}
 
-            {assign var=StockFrontendView value=$TemplateCologneUtils::getStockFrontendView($Product->getId())}
+            {assign var=StockFrontendView value=QUI\TemplateCologne\Utils::getStockFrontendView($Product->getId())}
             {if $StockFrontendView}
                 {$StockFrontendView->create()}
             {/if}
diff --git a/src/QUI/TemplateCologne/EventHandler.php b/src/QUI/TemplateCologne/EventHandler.php
index f34b098..f7544fb 100644
--- a/src/QUI/TemplateCologne/EventHandler.php
+++ b/src/QUI/TemplateCologne/EventHandler.php
@@ -7,6 +7,7 @@
 namespace QUI\TemplateCologne;
 
 use QUI;
+use Smarty;
 use QUI\ERP\Products\Product\ViewFrontend;
 use QUI\Smarty\Collector;
 
@@ -71,4 +72,17 @@ public static function onQuiqqerProductsProductButtonsEnd(
             </div>'
         );
     }
+
+    /**
+     * Event: on smarty init
+     *
+     * @param Smarty $Smarty
+     * @return void
+     */
+    public static function onSmartyInit(Smarty $Smarty): void
+    {
+        $Smarty->registerClass('QUI\TemplateCologne\Utils', '\QUI\TemplateCologne\Utils');
+        $Smarty->registerClass('QUI\Bricks\Manager', '\QUI\Bricks\Manager');
+        $Smarty->registerClass('QUI\ERP\Products\Utils\Products', '\QUI\ERP\Products\Utils\Products');
+    }
 }
diff --git a/template/page.html b/template/page.html
index 9cdb023..6af211a 100644
--- a/template/page.html
+++ b/template/page.html
@@ -25,7 +25,7 @@
         {assign var=brickNoPadding value="brick-no-spacing"}
     {/if}
 
-    {assign var=classes value=$TemplateCologneUtils::convertBrickCSSClass($Brick->getAttribute('classes'))}
+    {assign var=classes value=QUI\TemplateCologne\Utils::convertBrickCSSClass($Brick->getAttribute('classes'))}
 
     <section class="template-brick-container template-brick-headerSuffix brick-id-{$Brick->getAttribute('id')} {$classes}">
         <div class="template-grid-container template-grid-row {$brickFullWidth} {$brickNoPadding}">
@@ -54,7 +54,7 @@
         {assign var=brickNoPadding value="brick-no-spacing"}
     {/if}
 
-    {assign var=classes value=$TemplateCologneUtils::convertBrickCSSClass($Brick->getAttribute('classes'))}
+    {assign var=classes value=QUI\TemplateCologne\Utils::convertBrickCSSClass($Brick->getAttribute('classes'))}
 
     <section class="template-brick-container template-brick-footerPrefix brick-id-{$Brick->getAttribute('id')} {$classes}">
         <div class="template-grid-container template-grid-row {$brickFullWidth} {$brickNoPadding}">
-- 
GitLab


From 50613b2560a78c9255dceadb93546f4a5e651947 Mon Sep 17 00:00:00 2001
From: Michael Danielczok <michael@pcsg.de>
Date: Thu, 24 Oct 2024 13:59:09 +0200
Subject: [PATCH 33/44] docs: header blocks must be separated by a single blank
 line

---
 index.php | 1 +
 1 file changed, 1 insertion(+)

diff --git a/index.php b/index.php
index 0e576c5..85536cd 100644
--- a/index.php
+++ b/index.php
@@ -12,6 +12,7 @@
 /**
  * Emotion
  */
+
 QUI\Utils\Site::setRecursiveAttribute($Site, 'image_emotion');
 QUI\Utils\Site::setRecursiveAttribute($Site, 'layout');
 
-- 
GitLab


From a39bf8ee940d2385c7e969270d9bf9868220b4ac Mon Sep 17 00:00:00 2001
From: Michael Danielczok <michael@pcsg.de>
Date: Thu, 24 Oct 2024 16:24:43 +0200
Subject: [PATCH 34/44] fix: style inputs disabled state

---
 bin/css/form.css | 23 ++++++++++++++++++++++-
 1 file changed, 22 insertions(+), 1 deletion(-)

diff --git a/bin/css/form.css b/bin/css/form.css
index 13d4bf8..e922246 100644
--- a/bin/css/form.css
+++ b/bin/css/form.css
@@ -21,7 +21,6 @@ select {
     background-image: url("../images/arrow-select.svg");
     background-position: calc(100% - 10px) center;
     background-repeat: no-repeat;
-    background-size: 20px auto;
     background-size: 8px;
     height: 40px;
     padding-bottom: 0;
@@ -58,6 +57,28 @@ textarea:focus {
     border-color: #a9a8a5;
 }
 
+/* disabled */
+:is(
+    input:where(:not([type])),
+    [type='text'],
+    [type='email'],
+    [type='url'],
+    [type='password'],
+    [type='number'],
+    [type='date'],
+    [type='datetime-local'],
+    [type='month'],
+    [type='search'],
+    [type='tel'],
+    [type='time'],
+    [type='week'],
+    [multiple],
+    textarea,
+    select
+):where([disabled]) {
+    opacity: 0.6;
+}
+
 /* iOs input search fix */
 input[type="search"] {
     -webkit-appearance: none;
-- 
GitLab


From 72beeb33b9f9fc7d80d75fe914f9e8f8579093e2 Mon Sep 17 00:00:00 2001
From: Michael Danielczok <michael@pcsg.de>
Date: Mon, 4 Nov 2024 12:54:15 +0100
Subject: [PATCH 35/44] fix: adjust paths to standard mail templates in
 quiqqer/core

Related: quiqqer/template-cologne#116
---
 quiqqer/{quiqqer/lib => core/src}/templates/mail/body.html   | 0
 quiqqer/{quiqqer/lib => core/src}/templates/mail/footer.html | 0
 quiqqer/{quiqqer/lib => core/src}/templates/mail/header.html | 0
 quiqqer/{quiqqer/lib => core/src}/templates/mail/meta.html   | 0
 4 files changed, 0 insertions(+), 0 deletions(-)
 rename quiqqer/{quiqqer/lib => core/src}/templates/mail/body.html (100%)
 rename quiqqer/{quiqqer/lib => core/src}/templates/mail/footer.html (100%)
 rename quiqqer/{quiqqer/lib => core/src}/templates/mail/header.html (100%)
 rename quiqqer/{quiqqer/lib => core/src}/templates/mail/meta.html (100%)

diff --git a/quiqqer/quiqqer/lib/templates/mail/body.html b/quiqqer/core/src/templates/mail/body.html
similarity index 100%
rename from quiqqer/quiqqer/lib/templates/mail/body.html
rename to quiqqer/core/src/templates/mail/body.html
diff --git a/quiqqer/quiqqer/lib/templates/mail/footer.html b/quiqqer/core/src/templates/mail/footer.html
similarity index 100%
rename from quiqqer/quiqqer/lib/templates/mail/footer.html
rename to quiqqer/core/src/templates/mail/footer.html
diff --git a/quiqqer/quiqqer/lib/templates/mail/header.html b/quiqqer/core/src/templates/mail/header.html
similarity index 100%
rename from quiqqer/quiqqer/lib/templates/mail/header.html
rename to quiqqer/core/src/templates/mail/header.html
diff --git a/quiqqer/quiqqer/lib/templates/mail/meta.html b/quiqqer/core/src/templates/mail/meta.html
similarity index 100%
rename from quiqqer/quiqqer/lib/templates/mail/meta.html
rename to quiqqer/core/src/templates/mail/meta.html
-- 
GitLab


From 8773c99f1fcc60ace1dcd7b1e3803317eef9ebc3 Mon Sep 17 00:00:00 2001
From: Henning <leutz@pcsg.de>
Date: Mon, 10 Feb 2025 18:23:30 +0100
Subject: [PATCH 36/44] fix(phpstan): resolve method and class checks

Several changes have been made, primarily around checking the existence of methods and classes and
removing unnecessary comments.

- Method checks have been introduced to ensure the `getCachePath()` method exists before calling it.
- Removed invalid phpDocs, e.g., @var $Site Site and @var $Project Project
- Fixed typing to align return types and updated a factory method to check class existence.
- Added variable definition comments in the settings.css.php file for clarity.

Related: quiqqer/template-cologne#114
---
 phpstan-baseline.neon                         | 51 +------------------
 .../Controls/Menu/Categories.php              |  8 ++-
 src/QUI/TemplateCologne/Utils.php             | 15 +++---
 src/QUI/TemplateCologne/settings.css.php      |  9 +++-
 4 files changed, 21 insertions(+), 62 deletions(-)

diff --git a/phpstan-baseline.neon b/phpstan-baseline.neon
index 0fa167e..1339890 100644
--- a/phpstan-baseline.neon
+++ b/phpstan-baseline.neon
@@ -1,51 +1,2 @@
 parameters:
-	ignoreErrors:
-		-
-			message: "#^Call to an undefined method QUI\\\\Interfaces\\\\Projects\\\\Site\\:\\:getCachePath\\(\\)\\.$#"
-			count: 1
-			path: src/QUI/TemplateCologne/Controls/Menu/Categories.php
-
-		-
-			message: "#^Access to constant PRODUCT_FIELD_SHIPPING_TIME on an unknown class QUI\\\\ERP\\\\Shipping\\\\Shipping\\.$#"
-			count: 1
-			path: src/QUI/TemplateCologne/Utils.php
-
-		-
-			message: "#^Access to constant PRODUCT_FIELD_STOCK on an unknown class QUI\\\\ERP\\\\StockManagement\\\\StockManager\\.$#"
-			count: 1
-			path: src/QUI/TemplateCologne/Utils.php
-
-		-
-			message: "#^Call to method setProduct\\(\\) on an unknown class QUI\\\\ERP\\\\StockManagement\\\\Products\\\\Fields\\\\StockView\\.$#"
-			count: 1
-			path: src/QUI/TemplateCologne/Utils.php
-
-		-
-			message: "#^Call to static method getShippingTimeFrontendViewByProduct\\(\\) on an unknown class QUI\\\\ERP\\\\StockManagement\\\\StockManager\\.$#"
-			count: 1
-			path: src/QUI/TemplateCologne/Utils.php
-
-		-
-			message: "#^Method QUI\\\\TemplateCologne\\\\Utils\\:\\:getStockFrontendView\\(\\) should return QUI\\\\ERP\\\\Products\\\\Field\\\\View\\|false but returns QUI\\\\ERP\\\\StockManagement\\\\Products\\\\Fields\\\\StockView\\.$#"
-			count: 1
-			path: src/QUI/TemplateCologne/Utils.php
-
-		-
-			message: "#^PHPDoc tag @var for variable \\$StockView contains unknown class QUI\\\\ERP\\\\StockManagement\\\\Products\\\\Fields\\\\StockView\\.$#"
-			count: 1
-			path: src/QUI/TemplateCologne/Utils.php
-
-		-
-			message: "#^PHPDoc tag @var has invalid value \\(\\$Site Site\\)\\: Unexpected token \"\\$Site\", expected type at offset 9$#"
-			count: 1
-			path: src/QUI/TemplateCologne/Utils.php
-
-		-
-			message: "#^Variable \\$Project might not be defined\\.$#"
-			count: 2
-			path: src/QUI/TemplateCologne/settings.css.php
-
-		-
-			message: "#^Variable \\$Site might not be defined\\.$#"
-			count: 1
-			path: src/QUI/TemplateCologne/settings.css.php
+	ignoreErrors:
\ No newline at end of file
diff --git a/src/QUI/TemplateCologne/Controls/Menu/Categories.php b/src/QUI/TemplateCologne/Controls/Menu/Categories.php
index eadc91c..ab3af91 100644
--- a/src/QUI/TemplateCologne/Controls/Menu/Categories.php
+++ b/src/QUI/TemplateCologne/Controls/Menu/Categories.php
@@ -72,10 +72,14 @@ public function getBody(): string
         }
 
         $cache = EventHandler::menuCacheName() . '/megaMenu/';
+        $cachePah = '';
+
+        if (method_exists($this->getSite(), 'getCachePath')) {
+            $cachePah = $this->getSite()->getCachePath();
+        }
 
         $cache .= md5(
-            $this->getSite()->getCachePath() .
-            serialize($this->getAttributes())
+            $cachePah . serialize($this->getAttributes())
         );
 
         try {
diff --git a/src/QUI/TemplateCologne/Utils.php b/src/QUI/TemplateCologne/Utils.php
index 098a86c..9f88806 100644
--- a/src/QUI/TemplateCologne/Utils.php
+++ b/src/QUI/TemplateCologne/Utils.php
@@ -11,7 +11,6 @@
 use QUI\ERP\Shipping\Shipping;
 use QUI\ERP\StockManagement\StockManager;
 use QUI\Projects\Project;
-use QUI\Projects\Site;
 use QUI\TemplateCologne\Controls\Payments;
 
 use function class_exists;
@@ -75,13 +74,8 @@ public static function getAvatar(mixed $User): QUI\Projects\Media\Image|bool
      */
     public static function getConfig(array $params): object|array|bool|string
     {
-        /** @var $Site Site */
         $Site = $params['Site'];
-
-        /* @var $Project Project */
         $Project = $params['Project'];
-
-        /* @var $Project QUI\Template */
         $Template = $params['Template'];
 
         $cacheName = md5($Site->getId() . $Project->getName() . $Project->getLang());
@@ -599,7 +593,7 @@ private static function getPredefinedFooter(Project $Project): array
      *
      * @return false|QUI\ERP\Products\Field\View
      */
-    public static function getShippingTimeFrontendView(int $productId)
+    public static function getShippingTimeFrontendView(int $productId): bool | QUI\ERP\Products\Field\View
     {
         try {
             $Product = QUI\ERP\Products\Handler\Products::getProduct($productId);
@@ -609,7 +603,7 @@ public static function getShippingTimeFrontendView(int $productId)
             return false;
         }
 
-        if (QUI::getPackageManager()->isInstalled('quiqqer/stock-management')) {
+        if (class_exists('QUI\ERP\StockManagement\StockManager')) {
             return StockManager::getShippingTimeFrontendViewByProduct($Product);
         }
 
@@ -656,6 +650,10 @@ public static function getStockFrontendView(int $productId)
             return false;
         }
 
+        if (!class_exists('QUI\ERP\StockManagement\StockManager')) {
+            return false;
+        }
+
         try {
             $Product = QUI\ERP\Products\Handler\Products::getProduct($productId);
             $StockField = $Product->getField(StockManager::PRODUCT_FIELD_STOCK);
@@ -665,7 +663,6 @@ public static function getStockFrontendView(int $productId)
             return false;
         }
 
-        /** @var QUI\ERP\StockManagement\Products\Fields\StockView $StockView */
         $StockView = $StockField->getFrontendView();
 
         if (method_exists($StockView, 'setProduct')) {
diff --git a/src/QUI/TemplateCologne/settings.css.php b/src/QUI/TemplateCologne/settings.css.php
index 9953e25..965553d 100644
--- a/src/QUI/TemplateCologne/settings.css.php
+++ b/src/QUI/TemplateCologne/settings.css.php
@@ -1,4 +1,12 @@
 <?php
+/**
+ * cologne template file
+ *
+ * @var QUI\Projects\Project $Project
+ * @var QUI\Projects\Site $Site
+ * @var QUI\Interfaces\Template\EngineInterface $Engine
+ * @var QUI\Template $Template
+ **/
 
 $largeSpacing = $Site->getAttribute('templateCologne.largeSpacing');
 $headerImagePosition = $Project->getConfig('templateCologne.settings.headerImagePosition');
@@ -7,7 +15,6 @@
 ob_start();
 
 ?>
-
 <?php if ($largeSpacing) { ?>
 /* more spacing */
 .page-content-header,
-- 
GitLab


From 704e489270f007aa7b985315103383816b80fe18 Mon Sep 17 00:00:00 2001
From: Henning <leutz@pcsg.de>
Date: Mon, 10 Feb 2025 18:29:39 +0100
Subject: [PATCH 37/44] fix(phpstan): add checks for undefined constant in
 utils.php

A fix has been applied in the src/QUI/TemplateCologne/Utils.php file. A condition has been added to
check whether the PRODUCT_FIELD_SHIPPING_TIME constant is defined. If not, the function will return
false to prevent any potential errors.
---
 src/QUI/TemplateCologne/Utils.php | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/src/QUI/TemplateCologne/Utils.php b/src/QUI/TemplateCologne/Utils.php
index 9f88806..cc49997 100644
--- a/src/QUI/TemplateCologne/Utils.php
+++ b/src/QUI/TemplateCologne/Utils.php
@@ -611,6 +611,10 @@ public static function getShippingTimeFrontendView(int $productId): bool | QUI\E
             return false;
         }
 
+        if (!defined('PRODUCT_FIELD_SHIPPING_TIME')) {
+            return false;
+        }
+
         try {
             $ShippingField = $Product->getField(Shipping::PRODUCT_FIELD_SHIPPING_TIME);
         } catch (\Exception $Exception) {
-- 
GitLab


From 942e123cfabf7eb1c5c7eb81e19fb49f25ac96ee Mon Sep 17 00:00:00 2001
From: Henning <leutz@pcsg.de>
Date: Mon, 10 Feb 2025 18:40:29 +0100
Subject: [PATCH 38/44] refactor(phpstan): update type declaration format and
 add reflection for Shipping class

- Modified format for return types in declaration of functions `getAvatar`, `getConfig`, and
`getSetting` for increased readability.
- Added `ReflectionClass` usage to check for constant in `QUI\ERP\Shipping\Shipping` in
`getShippingTimeFrontendView` function, enhancing maintainability and robustness of the code.
- Adjusted the fail-safe condition inside `getShippingTimeFrontendView` to check for the existence
of the class 'Shipping' before checking for defined constant, reducing chance of errors.
- Imported `ReflectionClass` at the top of the file.
---
 src/QUI/TemplateCologne/Utils.php | 16 ++++++++++++----
 1 file changed, 12 insertions(+), 4 deletions(-)

diff --git a/src/QUI/TemplateCologne/Utils.php b/src/QUI/TemplateCologne/Utils.php
index cc49997..f29c743 100644
--- a/src/QUI/TemplateCologne/Utils.php
+++ b/src/QUI/TemplateCologne/Utils.php
@@ -13,6 +13,8 @@
 use QUI\Projects\Project;
 use QUI\TemplateCologne\Controls\Payments;
 
+use ReflectionClass;
+
 use function class_exists;
 use function count;
 use function method_exists;
@@ -31,7 +33,7 @@ class Utils
      * @throws QUI\Exception
      *
      */
-    public static function getAvatar(mixed $User): QUI\Projects\Media\Image|bool
+    public static function getAvatar(mixed $User): QUI\Projects\Media\Image | bool
     {
         if (!$User instanceof QUI\Interfaces\Users\User) {
             throw new QUI\Exception([
@@ -72,7 +74,7 @@ public static function getAvatar(mixed $User): QUI\Projects\Media\Image|bool
      * @return array|bool|object|string
      * @throws QUI\Exception
      */
-    public static function getConfig(array $params): object|array|bool|string
+    public static function getConfig(array $params): object | array | bool | string
     {
         $Site = $params['Site'];
         $Project = $params['Project'];
@@ -611,10 +613,16 @@ public static function getShippingTimeFrontendView(int $productId): bool | QUI\E
             return false;
         }
 
-        if (!defined('PRODUCT_FIELD_SHIPPING_TIME')) {
+        if (!class_exists('QUI\ERP\Shipping\Shipping')) {
             return false;
         }
 
+        $reflection = new ReflectionClass(Shipping::class);
+
+        if (!$reflection->hasConstant('PRODUCT_FIELD_SHIPPING_TIME')) {
+            return false;
+        }
+        
         try {
             $ShippingField = $Product->getField(Shipping::PRODUCT_FIELD_SHIPPING_TIME);
         } catch (\Exception $Exception) {
@@ -710,7 +718,7 @@ public static function convertBrickCSSClass(array $classes): string
      * @param string $settingName
      * @return bool|array|int|string
      */
-    public static function getSetting(string $settingName): bool|array|int|string
+    public static function getSetting(string $settingName): bool | array | int | string
     {
         if (empty($settingName)) {
             return false;
-- 
GitLab


From 40cf4b1f899436aff3588ce18efd05caa1be29e7 Mon Sep 17 00:00:00 2001
From: Henning <leutz@pcsg.de>
Date: Mon, 10 Feb 2025 18:41:57 +0100
Subject: [PATCH 39/44] fix(phpstan): remove unnecessary newline in utils.php

This commit removes an unnecessary newline in the 'src/QUI/TemplateCologne/Utils.php' file to
maintain code cleanliness and readability. It also includes a minor change to spacing for
formatting consistency.
---
 src/QUI/TemplateCologne/Utils.php | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/src/QUI/TemplateCologne/Utils.php b/src/QUI/TemplateCologne/Utils.php
index f29c743..14d62f5 100644
--- a/src/QUI/TemplateCologne/Utils.php
+++ b/src/QUI/TemplateCologne/Utils.php
@@ -12,7 +12,6 @@
 use QUI\ERP\StockManagement\StockManager;
 use QUI\Projects\Project;
 use QUI\TemplateCologne\Controls\Payments;
-
 use ReflectionClass;
 
 use function class_exists;
@@ -622,7 +621,7 @@ public static function getShippingTimeFrontendView(int $productId): bool | QUI\E
         if (!$reflection->hasConstant('PRODUCT_FIELD_SHIPPING_TIME')) {
             return false;
         }
-        
+
         try {
             $ShippingField = $Product->getField(Shipping::PRODUCT_FIELD_SHIPPING_TIME);
         } catch (\Exception $Exception) {
-- 
GitLab


From 5b31aa120b99c0079758108b03824e3741bd6529 Mon Sep 17 00:00:00 2001
From: Michael Danielczok <michael@pcsg.de>
Date: Tue, 11 Feb 2025 15:54:32 +0100
Subject: [PATCH 40/44] fix: update template to be compatible with the
 quiqqer/frontend-users version 2.4.0

Related: quiqqer/template-cologne#117
---
 bin/css/buttons.css                           |   9 +-
 bin/css/frontend-users.css                    | 176 +++---------------
 bin/css/style.css                             |   1 +
 bin/css/variables.css                         |   3 +
 .../QUI/FrontendUsers/Controls/Profile.html   | 145 ++++++++-------
 5 files changed, 106 insertions(+), 228 deletions(-)

diff --git a/bin/css/buttons.css b/bin/css/buttons.css
index a3bf5c8..714138a 100644
--- a/bin/css/buttons.css
+++ b/bin/css/buttons.css
@@ -28,16 +28,11 @@ a.qui-button,
     float: none; /* qui-button reset */
 }
 
-button > .fa,
-.btn > .fa {
+button > .fa:not(:only-child),
+.btn > .fa:not(:only-child) {
     margin-right: .75rem;
 }
 
-button.loading > .fa,
-.btn.loading > .fa {
-    margin-right: 0;
-}
-
 /*****************************/
 /* button primary & standard */
 /*****************************/
diff --git a/bin/css/frontend-users.css b/bin/css/frontend-users.css
index 56bc8b6..927cbb3 100644
--- a/bin/css/frontend-users.css
+++ b/bin/css/frontend-users.css
@@ -11,7 +11,7 @@
 /* simple user info */
 /********************/
 .quiqqer-fupc-userinfo {
-    border: 1px solid #ddd;
+    border: var(--_qui-cologne-theme-border-width) solid var(--_qui-cologne-theme-border-color);
     border-radius: 5px;
     margin-bottom: 1em;
     background: #fff;
@@ -21,67 +21,33 @@
     background: url("../images/brushed_alu.png");
 }
 
-.quiqqer-frontendUsers-profile-container {
-    display: flex;
-    margin-bottom: 2rem;
-    margin-top: 2rem;
-}
-
-.quiqqer-frontendUsers-controls-profile .quiqqer-frontendUsers-controls-profile-categories {
-    padding-right: 20px;
-}
-
-.quiqqer-frontendUsers-controls-profile .quiqqer-frontendUsers-controls-profile-categoryContent {
-    padding-left: 20px;
-}
-
-@media (max-width: 768px) {
-    .quiqqer-frontendUsers-controls-profile .quiqqer-frontendUsers-controls-profile-categories {
-        padding: 0;
-        width: 100%;
-    }
-
-    .quiqqer-frontendUsers-controls-profile .quiqqer-frontendUsers-controls-profile-categoryContent {
-        padding-left: 0;
-    }
+/***********/
+/* Profile */
+/***********/
+.quiqqer-frontendUsers-controls-profile {
+    --qui-frontend-users-profile__radius: 0;
+    --qui-frontend-users-profile__sidebar-width: 360px;
+    --qui-frontend-users-profile__content-maxWidth: 700px;
+    --qui-frontend-users-profile__sidebar-nav-item-outline--hover: none;
+    --qui-frontend-users-profile__sidebar-nav-item-bg-color--hover: transparent;
 }
 
 /*****************/
 /* category menu */
 /*****************/
 .quiqqer-fupc-category {
-    margin-bottom: 2em;
-}
-
-.quiqqer-fupc-category:last-child {
-    margin-bottom: 0;
+    /*margin-bottom: 2em;*/
 }
 
 .quiqqer-fupc-category-header {
     line-height: 30px;
 }
 
-.quiqqer-fupc-category .quiqqer-fupc-category-header {
-    border-bottom: 1px solid #ddd;
-    cursor: pointer;
-    font-size: 1.5em;
-    line-height: 30px;
-}
-
-.quiqqer-fu-profile-categories-category-items {
-    clear: both;
-    float: left;
-    width: 100%;
-}
-
 .quiqqer-fupc-category-items-item {
-    border: 1px solid #ddd;
-    border-bottom: none;
+    border-top: var(--_qui-cologne-theme-border-width) solid var(--_qui-cologne-theme-border-color);
+    border-left: var(--_qui-cologne-theme-border-width) solid var(--_qui-cologne-theme-border-color);
+    border-right: var(--_qui-cologne-theme-border-width) solid var(--_qui-cologne-theme-border-color);
     clear: both;
-    color: #333;
-    display: flex;
-    float: left;
-    line-height: 40px;
     overflow: hidden;
     padding: 5px 0;
     position: relative;
@@ -89,26 +55,13 @@
     width: 100%;
 }
 
-.quiqqer-fupc-category.quiqqer-fupc-category--open .quiqqer-fupc-category-header {
-    border-bottom: none !important;
-}
-
-.quiqqer-fupc-category--open .quiqqer-fupc-category-items-item {
-    background: #fff;
-}
-
-.quiqqer-fupc-category .quiqqer-fu-profile-categories-category-items .quiqqer-fupc-category-items-item--active,
-.quiqqer-fupc-category .quiqqer-fu-profile-categories-category-items .quiqqer-fupc-category-items-item:hover {
-    background: #fff;
-}
-
-.quiqqer-fupc-category--open .quiqqer-fupc-category-items-item:last-child {
-    border-bottom: 1px solid #ddd;
+.quiqqer-fupc-category-items-item:last-child {
+    border-bottom: var(--_qui-cologne-theme-border-width) solid var(--_qui-cologne-theme-border-color);
     border-bottom-left-radius: 5px;
     border-bottom-right-radius: 5px;
 }
 
-.quiqqer-fupc-category--open .quiqqer-fupc-category-items-item:first-child {
+.quiqqer-fupc-category-items-item:first-child {
     border-top-left-radius: 5px;
     border-top-right-radius: 5px;
 }
@@ -122,42 +75,19 @@
     width: 0;
 }
 
-.quiqqer-fu-profile-categories-category-items .quiqqer-fupc-category-items-item--active,
-.quiqqer-fu-profile-categories-category-items .quiqqer-fupc-category-items-item:hover {
-    background: none;
-}
-
-.quiqqer-fu-profile-categories-category-items .quiqqer-fupc-category-items-item--active:before,
-.quiqqer-fu-profile-categories-category-items .quiqqer-fupc-category-items-item:hover:before {
+.quiqqer-fupc-category-items-item[data-active]:before,
+.quiqqer-fupc-category-items-item:is(:hover, :focus):before {
     width: 4px;
 }
 
 .quiqqer-fupc-category-items-item .fa {
     line-height: 40px;
+    width: 40px;
 }
 
 /***********/
 /* address */
 /***********/
-.quiqqer-frontend-users-address header,
-.quiqqer-frontendUsers-userdata-section header {
-    padding: 20px 0;
-}
-
-.quiqqer-frontend-users-address header h2,
-.quiqqer-frontendUsers-userdata-section header h2 {
-    padding-bottom: 0;
-}
-
-.quiqqer-frontend-users-address-edit .qui-select,
-.quiqqer-frontend-users-address-edit .qui-select .drop-icon {
-    height: 40px;
-}
-
-.quiqqer-frontend-users-address-edit .qui-select .text {
-    line-height: 40px;
-}
-
 .quiqqer-frontendUsers-userdata-invoiceaddress {
     border-bottom: 1px solid rgba(0, 0, 0, 0.1);
     float: left;
@@ -172,72 +102,10 @@
     margin-right: 10px;
 }
 
-.quiqqer-frontend-users-address-list-entry {
-    border: 1px solid #ddd;
-    background: #fff;
-}
-
-.quiqqer-frontendUsers-controls-profile-categoryContent .quiqqer-frontend-users-address-list-entry-buttons button {
-    width: inherit;
-    margin-bottom: 0;
-}
-
-.cologne-main .quiqqer-frontendUsers-userdata-address h2,
-.cologne-main .quiqqer-frontendUsers-userdata-invoiceaddress h2,
-.cologne-main .quiqqer-frontendUsers-userdata-invoiceaddress header,
-.cologne-main .quiqqer-frontendUsers-controls-profile-changepassword h2,
-.cologne-main .quiqqer-frontendUsers-controls-profile-deleteaccount h2 {
-    margin-top: 0;
-    padding-top: 0;
-}
-
-@media (max-width: 768px) {
-    .quiqqer-frontendUsers-controls-profile-categories-mobile {
-        margin-bottom: 2em;
-    }
-
-    .quiqqer-frontend-users-address-list .quiqqer-frontend-users-address-list-entry {
-        width: 100%;
-    }
-
-    .quiqqer-frontend-users-address-list .quiqqer-frontend-users-address-list-entry:nth-child(even) {
-        margin-left: 0;
-    }
-
-    .quiqqer-frontend-users-address-list .quiqqer-frontend-users-address-list-entry:nth-child(odd) {
-        margin-right: 0;
-    }
-}
-
-/* email */
-.quiqqer-frontendUsers-userdata-address-additional .quiqqer-frontendUsers-userdata-email input {
-    float: left;
-    width: calc(100% - 70px);
-    margin-right: 10px;
-}
-
-.quiqqer-frontendUsers-userdata-email .quiqqer-frontendUsers-userdata-email-edit {
-    line-height: 40px;
-    border-width: 1px;
-    border-radius: 0.25rem;
-}
-
-@media screen and (max-width: 767px) {
-    .cologne-main .quiqqer-frontendUsers-controls-profile-control label {
-        margin-bottom: 10px;
-    }
-}
-
-/**********/
-/* Avatar */
-/**********/
-.quiqqer-frontendUsers-userAvatar-gravatar {
-    margin: 1.5rem 0;
-}
-
 /******************/
 /* profile orders */
 /******************/
+/* hide top pagination */
 .quiqqer-order-profile-orders .quiqqer-order-profile-orders-pagination:first-child {
     display: none;
 }
@@ -252,7 +120,7 @@
 
 :where(.loginAndRegister) .quiqqer-fu-login-container {
     background: #f8f8f8;
-    border: 1px solid #ddd;
+    border: var(--_qui-cologne-theme-border-width) solid var(--_qui-cologne-theme-border-color);
     max-width: 400px;
     position: relative;
     width: 100%;
diff --git a/bin/css/style.css b/bin/css/style.css
index 408b667..4bcf1f4 100644
--- a/bin/css/style.css
+++ b/bin/css/style.css
@@ -928,6 +928,7 @@ a.toTop:before {
 
 .cologne-main {
     margin-top: 1rem;
+    margin-bottom: 1rem;
     width: 100%;
 }
 
diff --git a/bin/css/variables.css b/bin/css/variables.css
index 434620f..4dc456a 100644
--- a/bin/css/variables.css
+++ b/bin/css/variables.css
@@ -19,6 +19,9 @@
 
     --_qui-cologne-header-height: 100px;
 
+    --_qui-cologne-theme-border-color: var(--qui-cologne-theme-border-color, #ddd);
+    --_qui-cologne-theme-border-width: var(--qui-cologne-theme-border-width, 1px);
+
     /* ecoyn / ecommerce */
     --_qui-order-basket-articles-image-width: var(--qui-order-basket-articles-image-width, 100px);
     --_qui-order-basket-articles-image-height: var(--qui-order-basket-articles-image-height, 100px);
diff --git a/quiqqer/frontend-users/src/QUI/FrontendUsers/Controls/Profile.html b/quiqqer/frontend-users/src/QUI/FrontendUsers/Controls/Profile.html
index 171be08..97ec342 100644
--- a/quiqqer/frontend-users/src/QUI/FrontendUsers/Controls/Profile.html
+++ b/quiqqer/frontend-users/src/QUI/FrontendUsers/Controls/Profile.html
@@ -1,76 +1,87 @@
 {if !$Category}
-<p>
-    {locale group="quiqqer/frontend-users" var="profile.no_categories_available"}
-</p>
+    <div class="quiqqer-frontendUsers-controls-profile__noCategoriesInfo">
+        <p>
+            {locale group="quiqqer/frontend-users" var="profile.no_categories_available"}
+        </p>
+    </div>
 {else}
+    <div class="quiqqer-frontendUsers-controls-profile__sidebar">
+        {if $this->getAttribute('menu')}
+            <div class="quiqqer-frontendUsers-controls-profile-categories">
 
-{if $this->getAttribute('menu')}
-<div class="quiqqer-frontendUsers-controls-profile-categories">
-
-    <div class="quiqqer-fupc-userinfo">
-        {control control="QUI\TemplateCologne\Controls\SimpleUserInfo" assign=SimpleUserInfo}
-        {$SimpleUserInfo->create()}
-    </div>
+                <div class="quiqqer-fupc-userinfo">
+                    {control control="QUI\TemplateCologne\Controls\SimpleUserInfo" assign=SimpleUserInfo}
+                    {$SimpleUserInfo->create()}
+                </div>
 
-    {foreach $categories as $category}
-    <div class="quiqqer-fupc-category quiqqer-fupc-category--open"
-         data-category="{$category.name}"
-    >
-        <div class="quiqqer-fupc-category-header">
-            {$category.title}
-        </div>
-        <div class="quiqqer-fu-profile-categories-category-items">
-            {foreach $category.items as $setting}
+                {foreach $categories as $category}
+                <div class="quiqqer-fupc-category"
+                     data-category="{$category.name}"
+                     data-name="nav-category"
+                     data-open="1"
+                >
+                    <div class="quiqqer-fupc-category-header" data-name="header">
+                        <span class="quiqqer-fupc-category-header__text">{$category.title}</span>
+                        <span class="fa-solid fa-angle-right quiqqer-fupc-category-header__icon" data-name="opener"></span>
+                    </div>
+                    <div class="quiqqer-fu-profile-categories-category-items">
+                        {foreach $category.items as $setting}
+                            {assign var=active value=false}
+                            {if $currentCategory == $category.name && $currentSetting == $setting.name}
+                                {assign var=active value=true}
+                            {/if}
+                            <a href="{$Site->getUrlRewritten()}/{$category.name}/{$setting.name}"
+                                class="quiqqer-fupc-category-items-item"
+                                {if $active}data-active{/if}
+                                data-name="nav-category-item"
+                                data-setting="{$setting.name}"
+                            >
+                                {if $setting.icon}
+                                <span class="fa-fw quiqqer-fupc-category-items-item-icon {$setting.icon}"></span>
+                                {/if}
+                                <span>{$setting.title}</span>
+                            </a>
+                        {/foreach}
+                    </div>
+                </div>
+                {/foreach}
+            </div>
+        {/if}
 
-            {assign var=active value=""}
-            {if $currentCategory == $category.name && $currentSetting == $setting.name}
-            {assign var=active value=" quiqqer-fupc-category-items-item--active"}
-            {/if}
-            <a href="{$Site->getUrlRewritten()}/{$category.name}/{$setting.name}"
-               class="quiqqer-fupc-category-items-item{$active}"
-               data-setting="{$setting.name}"
-            >
-                {if $setting.icon}
-                <span class="quiqqer-fupc-category-items-item-icon {$setting.icon}"></span>
-                {/if}
-                <span>{$setting.title}</span>
-            </a>
-            {/foreach}
-        </div>
+        {* mobile categories *}
+        <form action="" method="post" class="quiqqer-frontendUsers-controls-profile-categories-mobile">
+            <label class="quiqqer-frontendUsers-controls-profile-categories-mobile-label">
+                <select name="profile-categories-mobile">
+                    {foreach $categories as $category}
+                        <optgroup label="{$category.title}">
+                            {foreach $category.items as $setting}
+                                {assign var=active value=""}
+                                {if $currentCategory == $category.name && $currentSetting == $setting.name}
+                                    {assign var=active value="selected"}
+                                {/if}
+                                <option value="{$category.name}:{$setting.name}" {$active}>
+                                    {$setting.title}
+                                </option>
+                            {/foreach}
+                        </optgroup>
+                    {/foreach}
+                </select>
+            </label>
+        </form>
     </div>
-    {/foreach}
-</div>
-{/if}
-
-<form action="" method="post">
-    <label class="quiqqer-frontendUsers-controls-profile-categories-mobile">
-        <select name="profile-categories">
-            {foreach $categories as $category}
-            <optgroup label="{$category.title}">
-                {foreach $category.items as $setting}
-                {assign var=active value=""}
-                {if $currentCategory== $category.name}
-                {assign var=active value=" selected"}
-                {/if}
-                <option value="{$category.name}:{$setting.name}"{$active}>
-                    {$setting.title}
-                </option>
-                {/foreach}
-            </optgroup>
-            {/foreach}
-        </select>
-    </label>
-</form>
 
-<form class="quiqqer-frontendUsers-controls-profile-categoryContent"
-      method="post"
-      action=""
-      data-category="{$currentCategory}"
-      data-setting="{$currentSetting}"
->
-    <div class="quiqqer-frontendUsers-controls-profile-categoryContentAnimation">
-        {$Category->create()}
-        <input type="hidden" name="profile-save" value="1">
+    <div class="quiqqer-frontendUsers-controls-profile__content">
+        <form class="quiqqer-frontendUsers-controls-profile-categoryContent"
+              data-name="form"
+              method="post"
+              action=""
+              data-category="{$currentCategory}"
+              data-setting="{$currentSetting}"
+        >
+            <div class="quiqqer-frontendUsers-controls-profile-categoryContentAnimation" data-name="content-animated">
+                {$Category->create()}
+                <input type="hidden" name="profile-save" value="1">
+            </div>
+        </form>
     </div>
-</form>
 {/if}
\ No newline at end of file
-- 
GitLab


From dbff1739aa613165fe38b4fc4ac62ca4b2c9ca7b Mon Sep 17 00:00:00 2001
From: Michael Danielczok <michael@pcsg.de>
Date: Wed, 12 Feb 2025 13:48:44 +0100
Subject: [PATCH 41/44] fix: update CSS to match changes in package
 quiqqer/coupons 2.1.1

Related: quiqqer/coupons#17
---
 bin/css/order.css | 91 +++++++----------------------------------------
 1 file changed, 13 insertions(+), 78 deletions(-)

diff --git a/bin/css/order.css b/bin/css/order.css
index 2460636..69c34c0 100644
--- a/bin/css/order.css
+++ b/bin/css/order.css
@@ -146,18 +146,28 @@ td.quiqqer-order-basket-articles-article-remove button:hover {
 
 .quiqqer-shoppingCart-basket-end,
 .quiqqer-order-basket-end {
+    --gap: 1.5rem;
+    
     background: #f8f8f8;
     border: 1px solid #ddd;
-    clear: both;
     margin-top: 20px;
-    min-height: 90px;
     padding: 20px;
     position: relative;
     width: 100%;
+    display: flex;
+    flex-direction: column;
+    gap: var(--gap);
+}
+
+.quiqqer-order-basket-end > *:not(:first-child, :only-child) {
+    border-top: var(--_qui-cologne-theme-border-width) solid var(--_qui-cologne-theme-border-color);
+    padding-top: var(--gap);
 }
 
 @media screen and (max-width: 767px) {
-    .quiqqer-shoppingCart-basket-end, .quiqqer-order-basket-end {
+    .quiqqer-shoppingCart-basket-end,
+    .quiqqer-order-basket-end {
+        --gap: 1rem;
         padding: 10px;
     }
 }
@@ -217,45 +227,7 @@ td.quiqqer-order-basket-articles-article-remove button:hover {
     border-bottom: 3px double #999999;
 }
 
-/* coupons */
-.quiqqer-coupons-couponcodeinput-title {
-    display: none;
-}
-
-input.quiqqer-coupons-couponcodeinput-input:hover,
-input.quiqqer-coupons-couponcodeinput-input:focus,
-input.quiqqer-coupons-couponcodeinput-input:active {
-    background: #fff;
-    border-color: #28a745;
-}
-
-.btn.quiqqer-coupons-couponcodeinput-btn {
-    background: #fff;
-    border-color: #28a745;
-    color: #28a745;
-}
-
-.btn.quiqqer-coupons-couponcodeinput-btn:hover,
-.btn.quiqqer-coupons-couponcodeinput-btn:active {
-    background: #28a745;
-    color: #fff;
-}
-
 @media screen and (max-width: 767px) {
-    .quiqqer-coupons-couponcodeinput {
-        flex-wrap: wrap;
-    }
-
-    .quiqqer-coupons-couponcodeinput label {
-        margin: 0 0 1rem 0;
-        width: 100%;
-    }
-
-    .quiqqer-coupons-couponcodeinput input,
-    .btn.quiqqer-coupons-couponcodeinput-btn {
-        width: 100%;
-    }
-
     .quiqqer-order-basket-articles-article td:before {
         font-weight: bold;
     }
@@ -372,43 +344,6 @@ input.quiqqer-coupons-couponcodeinput-input:active {
     .quiqqer-order-ordering-buttons a {
         width: 100%;
     }
-
-    .quiqqer-order-basket-end {
-        height: inherit;
-        padding: 1rem;
-        text-align: center;
-    }
-
-    .quiqqer-order-basket-end > * {
-        display: inline-block;
-        float: none !important;
-        margin: 0 !important;
-        width: 100%;
-    }
-
-    .quiqqer-order-basket-end > * + * {
-        margin-top: 20px !important;
-    }
-
-    .quiqqer-payment-paypal-express {
-        padding: 1rem 0;
-    }
-
-    .quiqqer-order-basket-end .quiqqer-coupons-couponcodeinput {
-        flex-direction: column;
-        padding: 0;
-        text-align: left;
-    }
-
-    .quiqqer-order-basket-end .quiqqer-coupons-couponcodeinput input {
-        margin-bottom: 1rem;
-        width: 100%;
-    }
-
-    .quiqqer-coupons-couponcodeinput label span {
-        display: block;
-        padding: 5px 10px;
-    }
 }
 
 /******************/
-- 
GitLab


From 5e01917367687b81c86366a176c48eaa491c50d9 Mon Sep 17 00:00:00 2001
From: Michael Danielczok <michael@pcsg.de>
Date: Mon, 24 Feb 2025 14:31:05 +0100
Subject: [PATCH 42/44] fix: adjust template to the latest quiqqer/order
 changes

Related: quiqqer/template-cologne#119
---
 bin/css/user-orders.css                       | 198 ------------------
 bin/css/variables.css                         |   1 +
 composer.json                                 |   2 +-
 .../Controls/UserOrders.Order.html            |  87 --------
 template/head/styles.html                     |   1 -
 5 files changed, 2 insertions(+), 287 deletions(-)
 delete mode 100644 bin/css/user-orders.css
 delete mode 100644 quiqqer/order/src/QUI/ERP/Order/FrontendUsers/Controls/UserOrders.Order.html

diff --git a/bin/css/user-orders.css b/bin/css/user-orders.css
deleted file mode 100644
index 2ab49d7..0000000
--- a/bin/css/user-orders.css
+++ /dev/null
@@ -1,198 +0,0 @@
-section.quiqqer-order-profile-orders-order {
-    margin-bottom: 2em;
-}
-
-.quiqqer-order-profile-orders-order-header-orderId {
-    float: left;
-    position: relative;
-    width: 25%;
-}
-
-.quiqqer-order-profile-orders-order-header-date,
-.quiqqer-order-profile-orders-order-header-total,
-.quiqqer-order-profile-orders-order-header-addressInvoice,
-.quiqqer-order-profile-orders-order-header-addressDelivery,
-.quiqqer-order-profile-orders-order-header-orderId {
-    padding: 0 10px;
-}
-
-.quiqqer-order-profile-orders-order-header-date {
-    padding-left: 0;
-}
-
-.quiqqer-order-profile-orders-order-header-orderId {
-    padding-right: 0;
-}
-
-.quiqqer-order-profile-orders-order-header-date > span:first-child,
-.quiqqer-order-profile-orders-order-header-total > span:first-child,
-.quiqqer-order-profile-orders-order-header-addressInvoice > span:first-child,
-.quiqqer-order-profile-orders-order-header-addressDelivery > span:first-child,
-.quiqqer-order-profile-orders-order-header-orderId > span:first-child {
-    display: block;
-}
-
-/**
- 1. avoid !important and increase the specificity (not good)
- 2. set address position at the bottom line 100% height + 10px padding of "header"
- */
-.quiqqer-order-profile-orders-order-header-addressInvoice address:is(address) { /* 1 */
-    top: calc(100% + 10px); /* 2 */
-}
-
-.quiqqer-order-profile-orders-order-header-addressInvoice span {
-    align-items: center;
-    display: flex;
-    max-width: 100%;
-}
-
-.quiqqer-order-profile-orders-order-header-addressInvoice > span > span {
-    display: block;
-    max-width: 100%;
-    overflow: hidden;
-    text-overflow: ellipsis;
-    white-space: nowrap;
-}
-
-.quiqqer-order-profile-orders-order-header-addressInvoice .fa {
-    margin-left: 5px;
-}
-
-.quiqqer-order-profile-orders-order-articles {
-    background: #fff;
-}
-
-.quiqqer-order-profile-orders-order-articles-article {
-    border-bottom: 1px dashed #ddd;
-    padding: 2em 0;
-}
-
-.quiqqer-order-profile-orders-order-articles-article:last-child {
-    border-bottom: none;
-}
-
-.quiqqer-order-profile-orders-order-articles-article {
-    align-items: start;
-    border-bottom: 1px dashed #ddd;
-    display: grid;
-    grid-column-gap: 20px;
-    grid-template-columns: 25% auto;
-    grid-template-rows: auto;
-    justify-items: start;
-    padding: 2em 0;
-}
-
-.quiqqer-order-profile-orders-order-articles-image {
-    align-items: flex-start;
-    align-self: start;
-    border-right: 1px dashed #ddd;
-    display: flex;
-    grid-row: 1 / 5;
-    justify-content: center;
-    padding: 20px;
-    width: 100%;
-}
-
-.quiqqer-order-profile-orders-order-articles-information {
-    padding-top: 0 !important;
-}
-
-.quiqqer-order-profile-orders-order-articles-title {
-    color: inherit;
-    font-size: 1.75em;
-}
-
-.quiqqer-order-profile-orders-order-articles-description {
-    margin: 5px 0;
-    color: #9ba3ad;
-}
-
-.quiqqer-order-profile-orders-order-articles-price {
-    font-size: 1.2em;
-    font-weight: 500;
-    padding-bottom: 10px;
-}
-
-.quiqqer-order-profile-orders-order-articles-rebuy {
-    align-self: end;
-}
-
-/**********/
-/* footer */
-/**********/
-.quiqqer-order-profile-orders-order footer {
-    display: flex;
-    justify-content: space-between;
-}
-
-.quiqqer-order-profile-orders-order footer .quiqqer-order-profile-orders-order-footer-paymentType {
-    margin-top: 0;
-}
-
-.quiqqer-order-profile-orders-order-footer-rightWrapper {
-    display: flex;
-    align-items: center;
-}
-
-@media (max-width: 768px) {
-    /***********************/
-    /* article list header */
-    /***********************/
-    .quiqqer-order-profile-orders-order-header-date, .quiqqer-order-profile-orders-order-header-total, .quiqqer-order-profile-orders-order-header-addressInvoice, .quiqqer-order-profile-orders-order-header-addressDelivery, .quiqqer-order-profile-orders-order-header-orderId {
-        padding: 0;
-        margin-bottom: 10px;
-    }
-
-    .quiqqer-order-profile-orders-order-header-orderId {
-        margin: 0 !important;
-    }
-
-    .quiqqer-order-profile-orders-order-header-date > span:first-child, .quiqqer-order-profile-orders-order-header-total > span:first-child, .quiqqer-order-profile-orders-order-header-addressInvoice > span:first-child, .quiqqer-order-profile-orders-order-header-addressDelivery > span:first-child, .quiqqer-order-profile-orders-order-header-orderId > span:first-child {
-        padding-right: 5px;
-    }
-
-    /****************/
-    /* article list */
-    /****************/
-    .quiqqer-order-profile-orders-order-articles-article {
-        display: block;
-        padding: 3em 0;
-    }
-
-    .quiqqer-order-profile-orders-order-articles-image {
-        border-bottom: 1px dashed #ddd;
-        border-right: none;
-        float: none !important;
-        margin: 0 0 20px 0;
-    }
-
-    .quiqqer-order-profile-orders-order-articles-price {
-        padding-top: 10px;
-    }
-
-    .quiqqer-order-profile-orders-order-articles-rebuy{
-        display: block;
-        margin: 0 auto;
-        max-width: 340px;
-        width: 100%;
-    }
-
-    /**********/
-    /* footer */
-    /**********/
-    .quiqqer-order-profile-orders-order footer {
-        display: block;
-    }
-
-    .quiqqer-order-profile-orders-order footer .quiqqer-order-profile-orders-order-footer-rightWrapper .btn {
-        padding-left: 3px;
-        padding-right: 3px;
-    }
-}
-
-/****************/
-/* Invoice list */
-/****************/
-.quiqqer-invoice-profile-invoices-table-invoice {
-    background: #fff;
-}
\ No newline at end of file
diff --git a/bin/css/variables.css b/bin/css/variables.css
index 4dc456a..77e5b4f 100644
--- a/bin/css/variables.css
+++ b/bin/css/variables.css
@@ -18,6 +18,7 @@
     --bg-secondary: #f5f5f5;
 
     --_qui-cologne-header-height: 100px;
+    --_qui-template-scrollMarginTop: var(--qui-template-scrollMarginTop, var(--_qui-cologne-header-height));
 
     --_qui-cologne-theme-border-color: var(--qui-cologne-theme-border-color, #ddd);
     --_qui-cologne-theme-border-width: var(--qui-cologne-theme-border-width, 1px);
diff --git a/composer.json b/composer.json
index a0cf711..18b2786 100644
--- a/composer.json
+++ b/composer.json
@@ -20,7 +20,7 @@
         "quiqqer/core": "^2",
         "quiqqer/erp": "^3",
         "quiqqer/products": "^2",
-        "quiqqer/order": "^2.7.7",
+        "quiqqer/order": "^2.7.23",
         "quiqqer/product-bricks": "^2",
         "quiqqer/frontend-users": "^2",
         "quiqqer/menu": "^3",
diff --git a/quiqqer/order/src/QUI/ERP/Order/FrontendUsers/Controls/UserOrders.Order.html b/quiqqer/order/src/QUI/ERP/Order/FrontendUsers/Controls/UserOrders.Order.html
deleted file mode 100644
index 49f018d..0000000
--- a/quiqqer/order/src/QUI/ERP/Order/FrontendUsers/Controls/UserOrders.Order.html
+++ /dev/null
@@ -1,87 +0,0 @@
-<section class="quiqqer-order-profile-orders-order">
-    <header>
-        <div class="quiqqer-order-profile-orders-order-header-date">
-            <span class="text-muted text-small">{locale group="quiqqer/order" var="control.profile.orders.order.date"}</span>
-            <span>{$Order->getCreateDate()}</span>
-        </div>
-
-        <div class="quiqqer-order-profile-orders-order-header-total">
-            <span class="text-muted text-small">{locale group="quiqqer/order" var="control.profile.orders.order.total"}</span>
-            <span>{$order.calculations.display_sum}</span>
-        </div>
-
-        <div class="quiqqer-order-profile-orders-order-header-addressInvoice">
-            <span class="text-muted text-small">{locale group="quiqqer/order" var="control.profile.orders.order.invoiceAddress"}</span>
-            {if $Invoice}
-            {assign var=Customer value=$Invoice->getCustomer()}
-            {else}
-            {assign var=Customer value=$Order->getCustomer()}
-            {/if}
-
-            {assign var=Address value=$Customer->getAddress()}
-            {$Address->render(['tel' => false, 'mail' => false])}
-            <span>
-                <span>{$Address->getName()}</span>
-                <span class="fa fa-angle-down"></span>
-            </span>
-        </div>
-
-        <div class="quiqqer-order-profile-orders-order-header-orderId">
-            <span class="text-muted text-small">{locale group="quiqqer/order" var="control.profile.orders.order.orderNo"}</span>
-            <a href="{$Utils->getOrderUrl($Project, $Order)}"
-               target="_blank"
-               data-hash="{$Order->getHash()}"
-               title="{locale group='quiqqer/order' var='control.order.details.title'}"
-            >
-                {$Order->getId()}
-            </a>
-        </div>
-    </header>
-
-    <div class="quiqqer-order-profile-orders-order-articles">
-        {foreach $articles as $Article}
-        {$this->renderArticle($Article)}
-        {/foreach}
-    </div>
-
-    <footer>
-        <div class="quiqqer-order-profile-orders-order-footer-leftWrapper">
-            {if $Payment}
-            <div class="quiqqer-order-profile-orders-order-footer-paymentType">
-                <span class="text-muted text-small">{locale group="quiqqer/order" var="control.profile.orders.order.paymentMethod"}:</span>
-                <span>{$Payment->getTitle()}</span>
-            </div>
-            {/if}
-
-            {if isset($orderStatus)}
-            <div class="quiqqer-order-profile-orders-order-footer-orderStatus">
-                <span class="text-muted text-small">{locale group="quiqqer/order" var="control.profile.orders.order.orderStatus"}:</span>
-                <span>{$orderStatus}</span>
-            </div>
-            {/if}
-
-            {if !empty($shippingStatus)}
-            <div class="quiqqer-order-profile-orders-order-footer-shipping">
-                <span class="text-muted text-small">{locale group="quiqqer/shipping" var="control.profile.orders.shipping"}:</span>
-                <span>{$shippingStatus}</span>
-            </div>
-            {/if}
-        </div>
-
-        <div class="quiqqer-order-profile-orders-order-footer-rightWrapper">
-            {if $Order->isPosted() && $Order->getInvoiceType() === 'QUI\ERP\Accounting\Invoice\Invoice'}
-            <a href="{$Order->getAttribute('downloadLink')}" target="_blank"
-               class="btn btn-link-dark">
-                <span class="fa fa-file-pdf-o"></span>
-                <span>{locale group="quiqqer/order" var="control.profile.orders.order.invoice"}</span>
-            </a>
-            {else if !$Order->isSuccessful()}
-            <a href="{$orderUrl}" target="_blank"
-               class="btn btn-link-dark">
-                <span class="fa fa-shopping-basket"></span>
-                <span>{locale group="quiqqer/order" var="control.profile.orders.order.continuePayment"}</span>
-            </a>
-            {/if}
-        </div>
-    </footer>
-</section>
diff --git a/template/head/styles.html b/template/head/styles.html
index 2a19527..9a03798 100644
--- a/template/head/styles.html
+++ b/template/head/styles.html
@@ -13,7 +13,6 @@
 <link rel="stylesheet" href="{$Template->getTemplateUrl('bin/css/products.css')}"/>
 <link rel="stylesheet" href="{$Template->getTemplateUrl('bin/css/frontend-users.css')}"/>
 <link rel="stylesheet" href="{$Template->getTemplateUrl('bin/css/order.css')}"/>
-<link rel="stylesheet" href="{$Template->getTemplateUrl('bin/css/user-orders.css')}"/>
 <link rel="stylesheet" href="{$Template->getTemplateUrl('bin/css/controls.css')}"/>
 <link rel="stylesheet" href="{$Template->getTemplateUrl('bin/css/mini-basket.css')}"/>
 <link rel="stylesheet" href="{$Template->getTemplateUrl('bin/css/product-bricks.css')}"/>
-- 
GitLab


From 98689c7930d92c684955ed00b1c44ef5c7b5b22a Mon Sep 17 00:00:00 2001
From: Michael Danielczok <michael@pcsg.de>
Date: Wed, 26 Feb 2025 10:38:58 +0100
Subject: [PATCH 43/44] fix: updated basket html file for compatibility with
 quiqqer/order v2.7.24

Related: quiqqer/template-cologne#115
---
 composer.json                                    |  2 +-
 .../QUI/ERP/Order/Controls/Basket/Basket.html    | 16 ++++++++++++++--
 2 files changed, 15 insertions(+), 3 deletions(-)

diff --git a/composer.json b/composer.json
index 18b2786..a553c16 100644
--- a/composer.json
+++ b/composer.json
@@ -20,7 +20,7 @@
         "quiqqer/core": "^2",
         "quiqqer/erp": "^3",
         "quiqqer/products": "^2",
-        "quiqqer/order": "^2.7.23",
+        "quiqqer/order": "^2.7.24",
         "quiqqer/product-bricks": "^2",
         "quiqqer/frontend-users": "^2",
         "quiqqer/menu": "^3",
diff --git a/quiqqer/order/src/QUI/ERP/Order/Controls/Basket/Basket.html b/quiqqer/order/src/QUI/ERP/Order/Controls/Basket/Basket.html
index d06d528..8414d1f 100644
--- a/quiqqer/order/src/QUI/ERP/Order/Controls/Basket/Basket.html
+++ b/quiqqer/order/src/QUI/ERP/Order/Controls/Basket/Basket.html
@@ -231,11 +231,23 @@
 
 {elseif $this->isGuest() && $this->isLoading()}
 <div class="quiqqer-order-basket-isLoading">
-    <span class="fa fa-spinner fa-spin"></span>
+    <div class="quiqqer-order-basket-isLoading__inner">
+        <span class="fa fa-circle-notch fa-spin"></span>
+    </div>
 </div>
 {else}
 <div class="quiqqer-order-basket-isEmpty">
-    {locale group="quiqqer/order" var="message.basket.is.empty"}
+    <div class="quiqqer-order-basket-isEmpty__iconContainer">
+        <div class="decorative-element">
+            <div class="decorative-element__line decorative-element__line--1 animation"></div>
+            <div class="decorative-element__line decorative-element__line--2 animation"></div>
+            <div class="decorative-element__line decorative-element__line--3 animation"></div>
+        </div>
+        <i class="fa-solid fa-cart-shopping quiqqer-order-basket-isEmpty__icon animation"></i>
+    </div>
+    <div class="quiqqer-order-basket-isEmpty__text animation">
+        {locale group="quiqqer/order" var="message.basket.is.empty"}
+    </div>
 </div>
 {/if}
 
-- 
GitLab


From 6e847a43621703e305a5490432938ef9f438a0e7 Mon Sep 17 00:00:00 2001
From: Michael Danielczok <michael@pcsg.de>
Date: Thu, 27 Feb 2025 12:35:39 +0100
Subject: [PATCH 44/44] fix: avoid floating invoice elements in user profile

---
 bin/css/frontend-users.css | 1 -
 1 file changed, 1 deletion(-)

diff --git a/bin/css/frontend-users.css b/bin/css/frontend-users.css
index 927cbb3..4c5250f 100644
--- a/bin/css/frontend-users.css
+++ b/bin/css/frontend-users.css
@@ -90,7 +90,6 @@
 /***********/
 .quiqqer-frontendUsers-userdata-invoiceaddress {
     border-bottom: 1px solid rgba(0, 0, 0, 0.1);
-    float: left;
     margin-bottom: 20px;
     padding-bottom: 20px;
     width: 100%;
-- 
GitLab