Refactor code structure for improved readability and maintainability

This commit is contained in:
2025-05-31 00:31:24 +02:00
parent 326a834e98
commit c26eb99b18
10 changed files with 11015 additions and 441 deletions

View File

@@ -1,6 +1,5 @@
#pdproductattributeslist {
width:100%;
width: 100%;
margin-top: 15px;
margin-right: 9px;
margin-left: 9px;
@@ -8,71 +7,94 @@
#pdproductattributeslist table {}
#pdproductattributeslist input.quantity {
#pdproductattributeslist input.quantity {}
}
#pdproductattributeslist .old_price {
font-size: 12px;
text-decoration: line-through;
display: inline-block;
font-size: 12px;
text-decoration: line-through;
display: inline-block;
}
#pdproductattributeslist .price {
font-weight: bold;
font-weight: bold;
}
#pdproductattributeslist .bootstrap-touchspin .input-group-btn-vertical i {
left: 4px;
}
#pdproductattributeslist table td.option_infos .product-title {
text-transform: capitalize;
margin: .5rem 0;
text-align: unset;
text-transform: capitalize;
margin: .5rem 0;
text-align: unset;
}
/** RESPOINSIVE TABLE **/
#pdproductattributeslist td, #pdproductattributeslist th {
vertical-align: middle;
text-align: center;
padding-top: .75rem;
padding-bottom: .75rem;
#pdproductattributeslist td,
#pdproductattributeslist th {
vertical-align: middle;
text-align: center;
padding-top: .75rem;
padding-bottom: .75rem;
}
#pdproductattributeslist th {
font-size: 13px;
font-size: 13px;
}
#pdproductattributeslist td img {max-width: 100%;}
#pdproductattributeslist .option_image a.hidden {display:none;}
#pdproductattributeslist .option_image a.hidden {
display: none;
}
#pdproductattributeslist th.product_image {width:10%;}
#pdproductattributeslist th.product_image {
width: 10%;
}
#pdproductattributeslist th.product_infos {}
#pdproductattributeslist th.product_price {width:12%;}
#pdproductattributeslist th.product_variant {width:10%;}
#pdproductattributeslist th.product_qty {width:10%;}
#pdproductattributeslist th.product_btn {width:12%;}
#pdproductattributeslist th.product_price {
width: 12%;
}
#pdproductattributeslist th.product_variant {
width: 10%;
}
#pdproductattributeslist th.product_qty {
width: 10%;
}
#pdproductattributeslist th.product_btn {
width: 12%;
}
#pdproductattributeslist .footer_actions { background:#ddd; }
#pdproductattributeslist .footer_actions {
background: #ddd;
}
#pdproductattributeslist b, #pdproductattributeslist strong {
#pdproductattributeslist b,
#pdproductattributeslist strong {
margin-bottom: 0.3rem;
display: inline-block;
}
#category .product-quantity > .col {
#category .product-quantity>.col {
margin-bottom: .0rem;
}
#pdproductattributeslist .option_gty .product-quantity {max-width:200px; }
#pdproductattributeslist .option_gty .product-quantity {
max-width: 200px;
}
#pdproductattributeslist .product-quantity .qty {width:100%}
#pdproductattributeslist .product-quantity .qty {
width: 100%
}
#pdproductattributeslist .add-to-cart-pdproductattributeslist {
width: 100%;
@@ -97,57 +119,58 @@ Max width before this PARTICULAR table gets nasty
This query will take effect for any screen smaller than 760px
and also iPads specifically.
*/
@media
only screen and (max-width: 760px),
(min-device-width: 768px) and (max-device-width: 1024px) {
@media only screen and (max-width: 760px),
(min-device-width: 768px) and (max-device-width: 1024px) {
#pdproductattributeslist table {
width: 100%;
}
#pdproductattributeslist table {
width: 100%;
}
/* Force table to not be like tables anymore */
#pdproductattributeslist table,
#pdproductattributeslist thead,
#pdproductattributeslist tbody,
#pdproductattributeslist th,
#pdproductattributeslist td,
#pdproductattributeslist tr {
display: block;
}
/* Force table to not be like tables anymore */
#pdproductattributeslist table,
#pdproductattributeslist thead,
#pdproductattributeslist tbody,
#pdproductattributeslist th,
#pdproductattributeslist td,
#pdproductattributeslist tr {
display: block;
}
/* Hide table headers (but not display: none;, for accessibility) */
#pdproductattributeslist thead tr {
position: absolute;
top: -9999px;
left: -9999px;
}
/* Hide table headers (but not display: none;, for accessibility) */
#pdproductattributeslist thead tr {
position: absolute;
top: -9999px;
left: -9999px;
}
#pdproductattributeslist tr { border: 1px solid #ccc; }
#pdproductattributeslist tr {
border: 1px solid #ccc;
}
#pdproductattributeslist td {
/* Behave like a "row" */
border: none;
border-bottom: 1px solid #eee;
position: relative;
padding-left: 50%;
}
#pdproductattributeslist td {
/* Behave like a "row" */
border: none;
border-bottom: 1px solid #eee;
position: relative;
padding-left: 50%;
}
#pdproductattributeslist td:before {
/* Now like a table header */
position: absolute;
/* Top/left values mimic padding */
top: 6px;
left: 6px;
width: 45%;
padding-right: 10px;
white-space: nowrap;
/* Label the data */
content: attr(data-column);
#pdproductattributeslist td:before {
/* Now like a table header */
position: absolute;
/* Top/left values mimic padding */
top: 6px;
left: 6px;
width: 45%;
padding-right: 10px;
white-space: nowrap;
/* Label the data */
content: attr(data-column);
color: #000;
font-weight: bold;
text-align: center;
}
color: #000;
font-weight: bold;
text-align: center;
}
}
#pdproductattributeslist .grid .product-description {
@@ -171,14 +194,16 @@ only screen and (max-width: 760px),
bottom: 6.375rem;
}
#pdproductattributeslist .grid .add-to-cart-or-refresh {text-align: center;}
#pdproductattributeslist .grid .add-to-cart-or-refresh {
text-align: center;
}
#pdproductattributeslist .grid input.qtyfield {
padding: 0 6px;
margin: 0 5px 0 5px;
vertical-align: bottom;
display: inline;
float: unset;
padding: 0 6px;
margin: 0 5px 0 5px;
vertical-align: bottom;
display: inline;
float: unset;
}
#pdproductattributeslist .grid .product-quantity input.qtyfield {
@@ -189,7 +214,7 @@ only screen and (max-width: 760px),
border-radius: 5px;
}
#pdproductattributeslist .grid .product-quantity .qty {
#pdproductattributeslist .grid .product-quantity .qty {
margin-right: 10px;
}
@@ -200,48 +225,66 @@ only screen and (max-width: 760px),
margin-bottom: 15px;
overflow-y: hidden;
overflow-x: scroll;
border: 1px solid #d6d4d4; }
#pdproductattributeslist .table-responsive > .table {
margin-bottom: 0;
background-color: #fff; }
#pdproductattributeslist .table-responsive > .table > thead > tr > th,
#pdproductattributeslist .table-responsive > .table > thead > tr > td,
#pdproductattributeslist .table-responsive > .table > tbody > tr > th,
#pdproductattributeslist .table-responsive > .table > tbody > tr > td,
#pdproductattributeslist .table-responsive > .table > tfoot > tr > th,
#pdproductattributeslist .table-responsive > .table > tfoot > tr > td {
white-space: nowrap; }
#pdproductattributeslist .table-responsive > .table-bordered {
border: 0; }
#pdproductattributeslist .table-responsive > .table-bordered > thead > tr > th:first-child,
#pdproductattributeslist .table-responsive > .table-bordered > thead > tr > td:first-child,
#pdproductattributeslist .table-responsive > .table-bordered > tbody > tr > th:first-child,
#pdproductattributeslist .table-responsive > .table-bordered > tbody > tr > td:first-child,
#pdproductattributeslist .table-responsive > .table-bordered > tfoot > tr > th:first-child,
#pdproductattributeslist .table-responsive > .table-bordered > tfoot > tr > td:first-child {
border-left: 0; }
#pdproductattributeslist .table-responsive > .table-bordered > thead > tr > th:last-child,
#pdproductattributeslist .table-responsive > .table-bordered > thead > tr > td:last-child,
#pdproductattributeslist .table-responsive > .table-bordered > tbody > tr > th:last-child,
#pdproductattributeslist .table-responsive > .table-bordered > tbody > tr > td:last-child,
#pdproductattributeslist .table-responsive > .table-bordered > tfoot > tr > th:last-child,
#pdproductattributeslist .table-responsive > .table-bordered > tfoot > tr > td:last-child {
border-right: 0; }
#pdproductattributeslist .table-responsive > .table-bordered > thead > tr:last-child > th,
#pdproductattributeslist .table-responsive > .table-bordered > thead > tr:last-child > td,
#pdproductattributeslist .table-responsive > .table-bordered > tbody > tr:last-child > th,
#pdproductattributeslist .table-responsive > .table-bordered > tbody > tr:last-child > td,
#pdproductattributeslist .table-responsive > .table-bordered > tfoot > tr:last-child > th,
#pdproductattributeslist .table-responsive > .table-bordered > tfoot > tr:last-child > td {
border-bottom: 0; }
border: 1px solid #d6d4d4;
}
#pdproductattributeslist tr.footer_actions td {height:50px;}
#pdproductattributeslist .table-responsive>.table {
margin-bottom: 0;
background-color: #fff;
}
#pdproductattributeslist .table-responsive>.table>thead>tr>th,
#pdproductattributeslist .table-responsive>.table>thead>tr>td,
#pdproductattributeslist .table-responsive>.table>tbody>tr>th,
#pdproductattributeslist .table-responsive>.table>tbody>tr>td,
#pdproductattributeslist .table-responsive>.table>tfoot>tr>th,
#pdproductattributeslist .table-responsive>.table>tfoot>tr>td {
white-space: nowrap;
}
#pdproductattributeslist .table-responsive>.table-bordered {
border: 0;
}
#pdproductattributeslist .table-responsive>.table-bordered>thead>tr>th:first-child,
#pdproductattributeslist .table-responsive>.table-bordered>thead>tr>td:first-child,
#pdproductattributeslist .table-responsive>.table-bordered>tbody>tr>th:first-child,
#pdproductattributeslist .table-responsive>.table-bordered>tbody>tr>td:first-child,
#pdproductattributeslist .table-responsive>.table-bordered>tfoot>tr>th:first-child,
#pdproductattributeslist .table-responsive>.table-bordered>tfoot>tr>td:first-child {
border-left: 0;
}
#pdproductattributeslist .table-responsive>.table-bordered>thead>tr>th:last-child,
#pdproductattributeslist .table-responsive>.table-bordered>thead>tr>td:last-child,
#pdproductattributeslist .table-responsive>.table-bordered>tbody>tr>th:last-child,
#pdproductattributeslist .table-responsive>.table-bordered>tbody>tr>td:last-child,
#pdproductattributeslist .table-responsive>.table-bordered>tfoot>tr>th:last-child,
#pdproductattributeslist .table-responsive>.table-bordered>tfoot>tr>td:last-child {
border-right: 0;
}
#pdproductattributeslist .table-responsive>.table-bordered>thead>tr:last-child>th,
#pdproductattributeslist .table-responsive>.table-bordered>thead>tr:last-child>td,
#pdproductattributeslist .table-responsive>.table-bordered>tbody>tr:last-child>th,
#pdproductattributeslist .table-responsive>.table-bordered>tbody>tr:last-child>td,
#pdproductattributeslist .table-responsive>.table-bordered>tfoot>tr:last-child>th,
#pdproductattributeslist .table-responsive>.table-bordered>tfoot>tr:last-child>td {
border-bottom: 0;
}
#pdproductattributeslist tr.footer_actions td {
height: 50px;
}
}
#pdproductattributeslist_grid .product-quantity,
#pdproductattributeslist_grid button.add-to-cart {width:100%;margin-top:10px;}
#pdproductattributeslist_grid button.add-to-cart {
width: 100%;
margin-top: 10px;
}
#pdproductattributeslist_grid .product-quantity .bootstrap-touchspin input.form-control,
#pdproductattributeslist_grid .product-quantity .bootstrap-touchspin input.input-group {
@@ -249,5 +292,6 @@ only screen and (max-width: 760px),
height: 2.75rem;
}
#pdproductattributeslist_grid .product-quantity .bootstrap-touchspin {margin:0 auto;}
#pdproductattributeslist_grid .product-quantity .bootstrap-touchspin {
margin: 0 auto;
}

View File

@@ -1,107 +1,104 @@
{if $product_combinations}
<div id="pdproductattributeslist" class="products">
<div id="pdproductattributeslist" class="products">
{if $block_heading}
<h3 class="idTabHrefShort page-product-heading">{l s='Select product combination' mod='pdproductattributeslist'}</h3>
{/if}
<table id="pdproductattributeslist_table" class="table table-striped table-bordered table-labeled tablesorter" width="100%">
<thead>
<tr>
<th class="product_image sorter-false filter-false">{l s='Image' mod='pdproductattributeslist'}</th>
<th class="product_variant">{l s='Variant' mod='pdproductattributeslist'}</th>
<th class="product_infos sorter-false filter-false">{l s='Product informations' mod='pdproductattributeslist'}</th>
{if $show_prices}
<th class="product_price">{l s='Price (tax incl.)' mod='pdproductattributeslist'}</th>
<th class="product_price">{l s='Price (tax excl.)' mod='pdproductattributeslist'}</th>
{/if}
<th class="product_qty">{l s='Quantity in stock' mod='pdproductattributeslist'}</th>
{if !$is_catalog}
<th class="product_btn sorter-false filter-false">{l s='Select quantity' mod='pdproductattributeslist'}</th>
{/if}
</tr>
</thead>
<tbody>
{foreach from=$product_combinations item=$combination}
<tr class="product_combination_{if ($combination@index % 2)}alternate_{/if}item">
<td data-column="{l s='Image' mod='pdproductattributeslist'}" class="option_image">
{if $block_heading}
<h3 class="idTabHrefShort page-product-heading">{l s='Select product combination' mod='pdproductattributeslist'}</h3>
{/if}
<table id="pdproductattributeslist_table" class="table table-striped table-bordered table-labeled tablesorter" width="100%">
<thead>
<tr>
<th class="product_image sorter-false filter-false">{l s='Image' mod='pdproductattributeslist'}</th>
<th class="product_variant">{l s='Variant' mod='pdproductattributeslist'}</th>
<th class="product_infos sorter-false filter-false">{l s='Product informations' mod='pdproductattributeslist'}</th>
{if $show_prices}
<th class="product_price">{l s='Price (tax incl.)' mod='pdproductattributeslist'}</th>
<th class="product_price">{l s='Price (tax excl.)' mod='pdproductattributeslist'}</th>
{/if}
<th class="product_qty">{l s='Quantity in stock' mod='pdproductattributeslist'}</th>
{if !$is_catalog}
<th class="product_btn sorter-false filter-false">{l s='Select quantity' mod='pdproductattributeslist'}</th>
{/if}
</tr>
</thead>
<tbody>
{foreach from=$product_combinations item=$combination}
<tr class="product_combination_{if ($combination@index % 2)}alternate_{/if}item">
<td data-column="{l s='Image' mod='pdproductattributeslist'}" class="option_image">
{foreach from=$combination.images item=$img}
<a href="{$img.large_default}" rel="group_{$combination.id_product_attribute}" class="{if ($img@index > 0)}hidden {/if}fancybox">
<img width="{$cartSize.width}" height="{$cartSize.height}" class="img img-fluid img-responsive" src="{$img.home_default}" alt="{$combination.attribute_name}" title="{$combination.attribute_name}" />
</a>
{/foreach}
{foreach from=$combination.images item=$img}
<a href="{$img.large_default}" rel="group_{$combination.id_product_attribute}" class="{if ($img@index > 0)}hidden {/if}fancybox">
<img class="img img-fluid img-responsive" src="{$img.home_default}" alt="{$combination.attribute_name}" title="{$combination.attribute_name}" />
</a>
{/foreach}
</td>
</td>
<td data-column="{l s='Product variant' mod='pdproductattributeslist'}" class="option_variant">
{$combination.attribute_name_html nofilter}
</td>
<td data-column="{l s='Product variant' mod='pdproductattributeslist'}" class="option_variant">
{$combination.attribute_name_html nofilter}
</td>
<td data-column="{l s='Informations' mod='pdproductattributeslist'}" class="option_infos text-xs-left">
<td data-column="{l s='Informations' mod='pdproductattributeslist'}" class="option_infos text-xs-left">
{if isset($combination.reference) AND $combination.reference}
{l s='Reference' mod='pdproductattributeslist'}: <b>{$combination.reference}</b>
{/if}
{if !empty($combination.ean13)}
<br />{l s='Ean' mod='pdproductattributeslist'}: <b>{$combination.ean13}</b>
{/if}
{if isset($combination.reference) AND $combination.reference}
{l s='Reference' mod='pdproductattributeslist'}: <b>{$combination.reference}</b>
{/if}
{if !empty($combination.ean13)}
<br />{l s='Ean' mod='pdproductattributeslist'}: <b>{$combination.ean13}</b>
{/if}
</td>
</td>
{if $show_prices}
<td data-column="{l s='Price tax incl.' mod='pdproductattributeslist'}" class="option_price">
<span class="price product-price">
{Tools::displayPrice($combination.price)}
</span>
{if $combination.price != $combination.price_old}
<br />
<span class="old_price">
{Tools::displayPrice($combination.price_old)}
</span>
{/if}
</td>
{if $show_prices}
<td data-column="{l s='Price tax incl.' mod='pdproductattributeslist'}" class="option_price">
<span class="price product-price">
{Tools::displayPrice($combination.price)}
</span>
{if $combination.price != $combination.price_old}
<br />
<span class="old_price">
{Tools::displayPrice($combination.price_old)}
</span>
{/if}
</td>
<td data-column="{l s='Price tax excl.' mod='pdproductattributeslist'}" class="option_price">
<span class="price product-price">
{Tools::displayPrice($combination.price_tax_excl)}
</span>
<br />
{if $combination.price_tax_excl != $combination.price_old_tax_excl}
<span class="old_price">
{Tools::displayPrice($combination.price_old_tax_excl)}
</span>
{/if}
</td>
{/if}
<td data-column="{l s='Price tax excl.' mod='pdproductattributeslist'}" class="option_price">
<span class="price product-price">
{Tools::displayPrice($combination.price_tax_excl)}
</span>
<br />
{if $combination.price_tax_excl != $combination.price_old_tax_excl}
<span class="old_price">
{Tools::displayPrice($combination.price_old_tax_excl)}
</span>
{/if}
</td>
{/if}
<td data-column="{l s='Quantity on stock' mod='pdproductattributeslist'}" class="option_price">
<b>{$combination.quantity}</b> {l s='pcs' mod='pdproductattributeslist'}
</td>
<td data-column="{l s='Quantity on stock' mod='pdproductattributeslist'}" class="option_price">
<b>{if $combination.quantity <= 10 }{$combination.quantity}{else}>10{/if}</b> {l s='pcs' mod='pdproductattributeslist'}
</td>
{if !$is_catalog}
<td data-id-product="{$combination.id_product|intval}" data-id-product-attribute="{$combination.id_product_attribute|intval}" data-column="{l s='Select quantity' mod='pdproductattributeslist'}" class="option_gty">
<div class="row extra-small-gutters product-quantity">
<input type="number" name="qty" inputmode="numeric" pattern="[0-9]*" class="quantity input-group form-control" min="0" value="0"/>
</div>
</td>
{/if}
</tr>
{/foreach}
{if !$is_catalog}
<td data-id-product="{$combination.id_product|intval}" data-id-product-attribute="{$combination.id_product_attribute|intval}" data-column="{l s='Select quantity' mod='pdproductattributeslist'}" class="option_gty">
<div class="row extra-small-gutters product-quantity">
<input type="number" name="qty" inputmode="numeric" pattern="[0-9]*" class="quantity input-group form-control" min="0" value="0" />
</div>
</td>
{/if}
</tr>
{/foreach}
</tbody>
</table>
<div class="footer_actions">
</tbody>
</table>
<div class="footer_actions">
<button
class="btn btn-lg btn-primary add-to-cart-pdproductattributeslist pull-right"
type="button">
{l s='Add selected to cart' mod='pdproductattributeslist'}
</button>
<button class="btn btn-lg btn-primary add-to-cart-pdproductattributeslist pull-right" type="button">
{l s='Add selected to cart' mod='pdproductattributeslist'}
</button>
</div>
</div>
{/if}
</div>
</div>
{/if}

View File

@@ -26,11 +26,9 @@
{foreach from=$product_combinations item=$combination}
<tr class="product_combination_{if ($combination@index % 2)}alternate_{/if}item">
<td data-column="{l s='Image' mod='pdproductattributeslist'}" class="option_image">
{foreach from=$combination.images item=$img}
<a href="{$img.large_default}" rel="group_{$combination.id_product_attribute}" class="{if ($img@index > 0)}hidden {/if}fancybox">
<img width="{$cartSize.width}" height="{$cartSize.height}" class="img img-fluid img-responsive" src="{$img.home_default}" alt="{$combination.attribute_name}" title="{$combination.attribute_name}" />
<img class="img img-fluid img-responsive" src="{$img.home_default}" alt="{$combination.attribute_name}" title="{$combination.attribute_name}" />
</a>
{/foreach}
@@ -79,7 +77,7 @@
{/if}
<td data-column="{l s='Quantity on stock' mod='pdproductattributeslist'}" class="option_price">
<b>{$combination.quantity}</b> {l s='pcs' mod='pdproductattributeslist'}
<b>{if $combination.quantity <= 10 }{$combination.quantity}{else}>10{/if}</b> {l s='pcs' mod='pdproductattributeslist'}
</td>
{if !$is_catalog}