ver. 0.305: Fix permutation attribute sorting + free delivery progress bar
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -31,6 +31,13 @@ config.php
|
||||
admin/.htaccess
|
||||
libraries/version.ini
|
||||
|
||||
# Lokalne style
|
||||
layout/style-css/style.css
|
||||
layout/style-css/style.css.map
|
||||
layout/style-scss/style.scss
|
||||
layout/style-scss/_mixins.scss
|
||||
layout/style-scss/_mixins.css
|
||||
|
||||
# Temp / cache / backups
|
||||
temp/
|
||||
backups/
|
||||
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1351,39 +1351,6 @@ li.sort-collapsed.sort-hover div {
|
||||
}
|
||||
}
|
||||
|
||||
input[type="checkbox"] {
|
||||
position: relative;
|
||||
width: 40px;
|
||||
height: 20px;
|
||||
-webkit-appearance: none;
|
||||
background: $cGrayLight;
|
||||
outline: none;
|
||||
border-radius: 10px;
|
||||
box-shadow: inset 0 0 5px rgba(0, 0, 0, .2);
|
||||
}
|
||||
|
||||
input:checked[type="checkbox"] {
|
||||
background: $cMenuText;
|
||||
}
|
||||
|
||||
input[type="checkbox"]:before {
|
||||
content: '';
|
||||
position: absolute;
|
||||
width: 20px;
|
||||
height: 20px;
|
||||
border-radius: 10px;
|
||||
top: 0;
|
||||
left: 0;
|
||||
background: #fff;
|
||||
transform: scale(1.1);
|
||||
box-shadow: 0 2px 5px rgba(0, 0, 0, .2);
|
||||
transition: .5s;
|
||||
}
|
||||
|
||||
input:checked[type="checkbox"]:before {
|
||||
left: 20px;
|
||||
}
|
||||
|
||||
#images-uploader,
|
||||
#files-uploader {
|
||||
clear: both;
|
||||
|
||||
@@ -81,9 +81,6 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<link rel="stylesheet" type="text/css" href="/libraries/grid/plugins/icheck/skins/minimal/minimal.css">
|
||||
<link rel="stylesheet" type="text/css" href="/libraries/grid/plugins/icheck/skins/minimal/blue.css">
|
||||
<script type="text/javascript" src="/libraries/grid/plugins/icheck/icheck.min.js"></script>
|
||||
<script type="text/javascript">
|
||||
$( function()
|
||||
{
|
||||
|
||||
@@ -18,7 +18,8 @@
|
||||
<link rel="stylesheet" type="text/css" href="/libraries/easy-tabs/css/easy-responsive-tabs.css">
|
||||
<link rel="stylesheet" type="text/css" href="/libraries/bootstrap-4.5.2-dist/css/bootstrap.css">
|
||||
<link rel="stylesheet" type="text/css" href="/libraries/font-awesome-4.7.0/css/font-awesome.css">
|
||||
<link rel="stylesheet" type="text/css" href="/libraries/grid/plugins/icheck/skins/square/blue.css">
|
||||
<link rel="stylesheet" type="text/css" href="/libraries/grid/plugins/icheck/skins/minimal/minimal.css">
|
||||
<link rel="stylesheet" type="text/css" href="/libraries/grid/plugins/icheck/skins/minimal/blue.css">
|
||||
<script type="text/javascript" src="/libraries/framework/vendor/jquery/jquery-1.11.1.min.js"></script>
|
||||
<script type="text/javascript" src="/libraries/framework/vendor/jquery/jquery_ui/jquery-ui.min.js"></script>
|
||||
<script type="text/javascript" src="/libraries/framework/js/utility/utility.js"></script>
|
||||
|
||||
@@ -94,8 +94,13 @@ class BasketCalculator
|
||||
if ( isset( $val['parent_id'] ) and (int)$val['parent_id'] and isset( $val['product-id'] ) )
|
||||
$permutation = $productRepo->getProductPermutationHash( (int)$val['product-id'] );
|
||||
|
||||
if ( !$permutation and isset( $val['attributes'] ) and is_array( $val['attributes'] ) and count( $val['attributes'] ) )
|
||||
$permutation = implode( '|', $val['attributes'] );
|
||||
if ( !$permutation and isset( $val['attributes'] ) and is_array( $val['attributes'] ) and count( $val['attributes'] ) ) {
|
||||
$attrs = $val['attributes'];
|
||||
usort( $attrs, function ( $a, $b ) {
|
||||
return (int) explode( '-', $a )[0] - (int) explode( '-', $b )[0];
|
||||
} );
|
||||
$permutation = implode( '|', $attrs );
|
||||
}
|
||||
|
||||
$quantity_options = $productRepo->getProductPermutationQuantityOptions(
|
||||
$val['parent_id'] ? $val['parent_id'] : $val['product-id'],
|
||||
|
||||
@@ -60,4 +60,9 @@ class Tpl
|
||||
{
|
||||
return $this->vars[$name];
|
||||
}
|
||||
|
||||
public function __isset($name)
|
||||
{
|
||||
return isset($this->vars[$name]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -132,6 +132,11 @@ class ShopBasketController
|
||||
$attributes[] = $val;
|
||||
}
|
||||
|
||||
// Sort by attribute ID to match permutation_hash order (generated with ksort)
|
||||
usort( $attributes, function ( $a, $b ) {
|
||||
return (int) explode( '-', $a )[0] - (int) explode( '-', $b )[0];
|
||||
} );
|
||||
|
||||
foreach( $values as $key => $val )
|
||||
{
|
||||
if ( strpos( $key, 'custom_field' ) !== false )
|
||||
@@ -372,7 +377,9 @@ class ShopBasketController
|
||||
'transport_id' => \Shared\Helpers\Helpers::get_session( 'basket-transport-method-id' ),
|
||||
'transport_methods' => \Shared\Tpl\Tpl::view( 'shop-basket/basket-transport-methods', [
|
||||
'transports_methods' => ( new \Domain\Transport\TransportRepository( $GLOBALS['mdb'] ) )->transportMethodsFront( $basket, $coupon ),
|
||||
'transport_id' => $basket_transport_method_id
|
||||
'transport_id' => $basket_transport_method_id,
|
||||
'free_delivery' => (float)($settings['free_delivery'] ?? 0),
|
||||
'basket_summary' => (float)\Domain\Basket\BasketCalculator::summaryPrice( $basket, $coupon )
|
||||
] ),
|
||||
'payment_method_id' => $payment_method_id,
|
||||
'basket_details' => \Shared\Tpl\Tpl::view( 'shop-basket/basket-details', [
|
||||
@@ -387,6 +394,8 @@ class ShopBasketController
|
||||
|
||||
private function jsonBasketResponse( $basket, $coupon, $lang_id, $basket_transport_method_id )
|
||||
{
|
||||
global $settings;
|
||||
|
||||
echo json_encode( [
|
||||
'basket' => \Shared\Tpl\Tpl::view( 'shop-basket/basket-details', [
|
||||
'basket' => $basket,
|
||||
@@ -398,7 +407,9 @@ class ShopBasketController
|
||||
'products_count' => count( $basket ),
|
||||
'transport_methods' => \Shared\Tpl\Tpl::view( 'shop-basket/basket-transport-methods', [
|
||||
'transports_methods' => ( new \Domain\Transport\TransportRepository( $GLOBALS['mdb'] ) )->transportMethodsFront( $basket, $coupon ),
|
||||
'transport_id' => $basket_transport_method_id
|
||||
'transport_id' => $basket_transport_method_id,
|
||||
'free_delivery' => (float)($settings['free_delivery'] ?? 0),
|
||||
'basket_summary' => (float)\Domain\Basket\BasketCalculator::summaryPrice( $basket, $coupon )
|
||||
] )
|
||||
] );
|
||||
exit;
|
||||
|
||||
@@ -80,16 +80,17 @@ class ShopProductController
|
||||
{
|
||||
global $lang_id;
|
||||
|
||||
$combination = '';
|
||||
$selected_values = \Shared\Helpers\Helpers::get( 'selected_values' );
|
||||
|
||||
foreach ( $selected_values as $value )
|
||||
{
|
||||
$combination .= $value;
|
||||
if ( $value != end( $selected_values ) )
|
||||
$combination .= '|';
|
||||
// Sort by attribute ID to match permutation_hash order (generated with ksort)
|
||||
if ( is_array( $selected_values ) ) {
|
||||
usort( $selected_values, function ( $a, $b ) {
|
||||
return (int) explode( '-', $a )[0] - (int) explode( '-', $b )[0];
|
||||
} );
|
||||
}
|
||||
|
||||
$combination = is_array( $selected_values ) ? implode( '|', $selected_values ) : '';
|
||||
|
||||
$product_id = \Shared\Helpers\Helpers::get( 'product_id' );
|
||||
$productRepo = new \Domain\Product\ProductRepository( $GLOBALS['mdb'] );
|
||||
$product = $productRepo->findCached( $product_id, $lang_id );
|
||||
@@ -102,6 +103,10 @@ class ShopProductController
|
||||
private static function getPermutation( $attributes )
|
||||
{
|
||||
if ( !is_array( $attributes ) || !count( $attributes ) ) return null;
|
||||
// Sort by attribute ID to match permutation_hash order (generated with ksort)
|
||||
usort( $attributes, function ( $a, $b ) {
|
||||
return (int) explode( '-', $a )[0] - (int) explode( '-', $b )[0];
|
||||
} );
|
||||
return implode( '|', $attributes );
|
||||
}
|
||||
|
||||
|
||||
@@ -4,6 +4,16 @@ Logi zmian z migracji na Domain-Driven Architecture. Najnowsze na gorze.
|
||||
|
||||
---
|
||||
|
||||
## ver. 0.305 (2026-02-22) - Sortowanie permutacji + pasek darmowej dostawy
|
||||
|
||||
- **FIX**: Naprawa kolejnosci atrybutow permutacji — sortowanie po ID atrybutu (`usort` wg pierwszego segmentu przed `-`) we wszystkich miejscach: koszyk, kombinacje AJAX, `getPermutation()`, `BasketCalculator`. Zapewnia zgodnosc z `permutation_hash` generowanym przez `ksort`.
|
||||
- **NEW**: Pasek postepu darmowej dostawy w koszyku — progress bar z ikona, tekstem i animacja. Pokazuje ile brakuje do progu `free_delivery` z ustawien sklepu.
|
||||
- **FIX**: icheck CSS/JS przeniesione z szablonu `product-combination` do globalnego layoutu admina (`main-layout.php`)
|
||||
- **FIX**: `Tpl::__isset()` — obsluga `isset()` na zmiennych szablonu
|
||||
- **.updateignore** — lokalne style frontendowe dodane do listy ignorowania
|
||||
|
||||
---
|
||||
|
||||
## ver. 0.304 (2026-02-22) - Konfigurowalne limity kwotowe metod platnosci
|
||||
|
||||
- **NEW**: Kolumny `min_order_amount` i `max_order_amount` w `pp_shop_payment_methods` — konfigurowalne limity kwotowe per metoda platnosci
|
||||
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -2349,6 +2349,60 @@ ul.pager {
|
||||
white-space: nowrap;
|
||||
}
|
||||
}
|
||||
|
||||
.free-delivery-bar {
|
||||
background: #3a3a3a;
|
||||
border-radius: 8px;
|
||||
padding: 15px 20px;
|
||||
margin-top: 15px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 15px;
|
||||
color: #fff;
|
||||
|
||||
&.success {
|
||||
background: #28a745;
|
||||
}
|
||||
|
||||
&__icon {
|
||||
font-size: 28px;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
|
||||
&__content {
|
||||
flex: 1;
|
||||
}
|
||||
|
||||
&__text {
|
||||
font-size: 14px;
|
||||
font-weight: 600;
|
||||
margin-bottom: 8px;
|
||||
}
|
||||
|
||||
&__progress {
|
||||
height: 8px;
|
||||
background: #555;
|
||||
border-radius: 4px;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
&__progress-fill {
|
||||
height: 100%;
|
||||
background: linear-gradient(90deg, #28a745, #5cb85c);
|
||||
border-radius: 4px;
|
||||
transition: width 0.3s ease;
|
||||
}
|
||||
|
||||
&__remaining {
|
||||
font-size: 12px;
|
||||
margin-top: 5px;
|
||||
color: #ccc;
|
||||
|
||||
strong {
|
||||
color: #ff9800;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -52,6 +52,32 @@ if ( is_array( $this -> transports_methods ) )
|
||||
</div>
|
||||
<? endif;?>
|
||||
<? endforeach; endif;?>
|
||||
<?php if ( $this->free_delivery > 0 ): ?>
|
||||
<?php
|
||||
$percentage = min(100, ($this->basket_summary / $this->free_delivery) * 100);
|
||||
$remaining = $this->free_delivery - $this->basket_summary;
|
||||
?>
|
||||
<div class="free-delivery-bar <?= $percentage >= 100 ? 'success' : '' ?>">
|
||||
<div class="free-delivery-bar__icon">🚚</div>
|
||||
<div class="free-delivery-bar__content">
|
||||
<?php if ($percentage >= 100): ?>
|
||||
<div class="free-delivery-bar__text">Gratulacje! Masz darmową dostawę!</div>
|
||||
<?php else: ?>
|
||||
<div class="free-delivery-bar__text">
|
||||
Zrób zakupy za <?= \Shared\Helpers\Helpers::decimal( $this->free_delivery, 2 );?> zł i otrzymaj darmową dostawę
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
<div class="free-delivery-bar__progress">
|
||||
<div class="free-delivery-bar__progress-fill" style="width: <?= $percentage ?>%"></div>
|
||||
</div>
|
||||
<?php if ($percentage < 100): ?>
|
||||
<div class="free-delivery-bar__remaining">
|
||||
Brakuje <strong><?= \Shared\Helpers\Helpers::decimal( $remaining, 2 );?> zł</strong> do darmowej dostawy.
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
<script class="footer" type="text/javascript">
|
||||
$( function() {
|
||||
|
||||
|
||||
@@ -1,4 +1,7 @@
|
||||
<b>ver. 0.304 - 22.02.2026</b><br />
|
||||
<b>ver. 0.305 - 22.02.2026</b><br />
|
||||
FIX - naprawa kolejnosci atrybutow permutacji (sortowanie po ID atrybutu), NEW - pasek postepu darmowej dostawy w koszyku, FIX - icheck CSS przeniesiony do globalnego layoutu admina
|
||||
<hr>
|
||||
<b>ver. 0.304 - 22.02.2026</b><br />
|
||||
NEW - konfigurowalne limity kwotowe metod platnosci (min/max kwota zamowienia), zastapienie hardcoded warunku PayPo
|
||||
<hr>
|
||||
<b>ver. 0.303 - 22.02.2026</b><br />
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<?
|
||||
$current_ver = 304;
|
||||
$current_ver = 305;
|
||||
|
||||
for ($i = 1; $i <= $current_ver; $i++)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user