'filterFields' => ['size', 'color', 'species', 'category', 'type-num']
]) ?>
<br>
+
<div class="row">
- <div class="col-md-6">
- <div class="pt-2">
+ <div class="col-md-6 position-relative">
+ <!-- Обертка для перекрытия текста -->
+ <div class="pt-2 position-relative content-wrapper">
+ <!-- Прелоадер -->
+ <div class="loader-overlay d-none">
+ <div class="spinner-border text-primary" role="status"></div>
+ </div>
<p class="mb-1"><strong>Себестоимость:</strong> <span class="selfcost-value"><?= $selfCost ?? 0 ?></span> ₽</p>
- <p class="mb-1"><strong>Наценка:</strong> <span class="markup-value"><?= $markUp?? 0 ?></span></p>
+ <p class="mb-1"><strong>Наценка:</strong> <span class="markup-value"><?= $markUp ?? 0 ?></span></p>
<p class="mb-0"><strong>Цена:</strong> <span class="cost-value"><?= $cost ?? 0 ?></span> ₽</p>
</div>
</div>
-<div class="col-md-2"></div>
+
+ <div class="col-md-2"></div>
+
<?php if (!$isCreate) {?>
<div class="col-md-2 d-flex justify-content-end align-items-end px-3 w-100">
<?= Html::button('Рассчитать', ['class' => 'btn btn-warning calculate-btn w-100']) ?>
<?= Html::button('Рассчитать', ['class' => 'btn btn-warning calculate-btn w-100']) ?>
</div>
<?php } ?>
-
</div>
+<style>
+ .content-wrapper {
+ position: relative;
+ min-height: 80px;
+ }
+
+ .loader-overlay {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background: rgba(255, 255, 255, 0.8);
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ z-index: 10;
+ }
+
+ .d-none {
+ display: none;
+ }
+</style>
-document.addEventListener('DOMContentLoaded', function() {
+document.addEventListener('DOMContentLoaded', function () {
document.querySelectorAll('.video-preview').forEach(video => {
- video.addEventListener('click', function() {
+ video.addEventListener('click', function () {
this.controls = true;
this.muted = false;
this.play();
$.ajax({
url: '/bouquet/get-sales-data',
type: 'POST',
- data: { year: year, month: month, id: id },
+ data: {year: year, month: month, id: id},
dataType: 'json',
- success: function(response) {
+ success: function (response) {
if (response) {
['offline', 'online', 'marketplace'].forEach(type => {
- $.each(response[type], function(_, value) {
+ $.each(response[type], function (_, value) {
let inputSelector = `input[name='BouquetForecast[type_sales_value][${type}][${value.id}]']`;
$(inputSelector).val(value.value);
});
});
}
},
- error: function(xhr, status, error) {
+ error: function (xhr, status, error) {
console.error("Ошибка загрузки данных:", status, error);
}
});
}
});
- $('.cost-value').text(null);
- $('.selfcost-value').text(null);
- $('.markup-value').text(null);
+ // Показываем прелоадер
+ $(".loader-overlay").removeClass("d-none");
+ $(".content-wrapper").addClass("position-relative");
$.ajax({
url: '/bouquet/get-calculates',
contentType: 'application/json',
data: JSON.stringify(data),
dataType: 'json',
- success: function(response) {
+ success: function (response) {
if (response) {
if (response.cost !== undefined) {
$('.cost-value').text(response.cost);
}
}
},
- error: function(xhr, status, error) {
+ error: function (xhr, status, error) {
console.error("Ошибка загрузки данных:", status, error);
+ },
+ complete: function () {
+ $(".loader-overlay").addClass("d-none");
}
});
});