use yii_app\records\MatrixType;
use yii_app\records\Products1c;
use yii_app\records\WriteOffsErp;
+use yii\web\View;
/** @var yii\web\View $this */
+
+$this->registerCssFile('@web/css/lightbox.min.css');
+$this->registerJsFile('@web/js/lightbox.min.js', ['position' => View::POS_END]);
$this->title = 'Содержание матрицы';
?>
<div class="bouquet-index p-4">
<div class="grid-view px-5">
<?= GridView::widget([
'dataProvider' => $dataProvider,
- 'layout' => "{items}\n{pager}",
+ 'layout' => "{items}\n{pager}",
'tableOptions' => ['class' => 'table'],
- 'columns' => [
+ 'columns' => [
[
- 'attribute' => 'name',
- 'format' => 'raw',
- 'value' => function ($model) {
+ 'attribute' => 'name',
+ 'format' => 'raw',
+ 'value' => function ($model) {
$compositionHtml = "<div class='row'>";
-
if (is_array($model->bouquetCompositionProducts)) {
foreach ($model->bouquetCompositionProducts as $item) {
- $product = Products1c::findOne($item->product_guid);
+ $product = Products1c::findOne($item->product_guid);
$productName = $product ? $product->name : 'Неизвестный продукт';
-
$compositionHtml .= "
- <div class='row border-bottom mb-1'>
- <div class='col-md-9 fw-bold'>{$productName}</div>
- <div class='col-md-3 fw-bold text-right'>{$item->count}</div>
- </div>";
+ <div class='row border-bottom mb-1'>
+ <div class='col-md-9 fw-bold'>{$productName}</div>
+ <div class='col-md-3 fw-bold text-right'>{$item->count}</div>
+ </div>";
}
}
+ $compositionHtml .= "</div>";
- $images = Files::find()
- ->where(['entity_id' => $model->id, 'entity' => \yii_app\records\BouquetComposition::PHOTO_BOUQUET])
- ->limit(3)
+ $images = Files::find()
+ ->where([
+ 'entity_id' => $model->id,
+ 'entity' => BouquetComposition::PHOTO_BOUQUET
+ ])
->all();
- $imageUrls = array_map(fn($file) => Url::to($file->url), $images);
- $imageUrls += array_fill(0, 3 - count($imageUrls), null);
- $compositionHtml .= "</div>";
+ $allImageUrls = array_map(fn($file) => Url::to($file->url), $images);
+ $previewImageUrls = array_slice($allImageUrls, 0, 3);
+ $previewImageUrls += array_fill(0, 3 - count($previewImageUrls), null);
+
+ $galleryId = 'gallery-' . $model->id;
+
+ $hiddenLinks = "";
+ if (count($allImageUrls) > 3) {
+ foreach (array_slice($allImageUrls, 3) as $url) {
+ $hiddenLinks .= Html::a('', $url, [
+ 'data-lightbox' => $galleryId,
+ 'style' => 'display:none;'
+ ]);
+ }
+ }
- return "
- <div class='matrix-data mx-3'>
- <div class='col-md-1'></div>
- <div class='col-md-4'>
- <h4>{$model->name}</h4>
- <div class='bg-white border rounded shadow-sm'
- style='height: 160px; padding: 10px; overflow-y: auto; overflow-x: hidden; max-width: 100%; word-wrap: break-word;'>
- {$compositionHtml}
- </div>
- <div class='self-cost pt-3' style='display: flex; gap: 10px;'>
- Себестоимость: " . $model->getSelfCost() . "<br>
- Наценка: " . $model->getMarkUp() . "<br>
- Цена: " . $model->getCost() . "<br>
- </div>
+ $html = "
+ <div class='matrix-data mx-3'>
+ <div class='col-md-1'></div>
+ <div class='col-md-4'>
+ <h4>{$model->name}</h4>
+ <div class='bg-white border rounded shadow-sm'
+ style='height: 160px; padding: 10px; overflow-y: auto; overflow-x: hidden; max-width: 100%; word-wrap: break-word;'>
+ {$compositionHtml}
+ </div>
+ <div class='self-cost pt-3' style='display: flex; gap: 10px;'>
+ Себестоимость: " . $model->getSelfCost() . "<br>
+ Наценка: " . $model->getMarkUp() . "<br>
+ Цена: " . $model->getCost() . "<br>
+ </div>
+ </div>
+
+ <div class='row'>
+ <div class='col-md-5'>
+ <div class='card' style='aspect-ratio: 1/1; display: flex; overflow: hidden;'>";
+ if (isset($previewImageUrls[0])) {
+ $html .= Html::a(
+ Html::img($previewImageUrls[0], [
+ 'style' => 'width: 100%; height: 100%; object-fit: cover;',
+ ]),
+ $previewImageUrls[0],
+ ['data-lightbox' => $galleryId]
+ );
+ }
+ $html .= "
</div>
-
- <div class='row'>
- <div class='col-md-5'>
- <div class='card' style='aspect-ratio: 1/1; display: flex; overflow: hidden;'> " .
- Html::img(Url::to($imageUrls[0]), [
- 'style' => 'width: 100%; height: 100%; object-fit: cover;'
- ]) . "
- </div>
- </div>
-
- <div class='col-md-2 d-flex flex-column gap-2'>
- <div class='card bg-transparent border-0' style='aspect-ratio: 1/1; width: 100%; flex: 1;'>
+ </div>
+
+ <div class='col-md-2 d-flex flex-column gap-2'>
+ <div class='card bg-transparent border-0' style='aspect-ratio: 1/1; width: 100%; flex: 1;'>
" . Html::tag('video', '', [
- 'class' => 'video-preview',
- 'src' => Url::to($model->presentation->url ?? null),
- 'style' => 'width: 100%; height: 100%; object-fit: cover;',
- 'autoplay' => true,
- 'muted' => true,
- 'loop' => true,
- 'playsinline' => true
+ 'class' => 'video-preview',
+ 'src' => Url::to($model->presentation->url ?? null),
+ 'style' => 'width: 100%; height: 100%; object-fit: cover;',
+ 'autoplay' => true,
+ 'muted' => true,
+ 'loop' => true,
+ 'playsinline' => true,
]) . "
- <div class='text-center bg-transparent fw-bold p-0 m-0'>Презентация</div>
- </div>
- <div class='card' style='aspect-ratio: 1/1; width: 100%; flex: 1;'> " .
- Html::img(Url::to($imageUrls[1]), [
- 'style' => 'width: 100%; height: 100%; object-fit: cover;'
- ]) . "
- </div>
- </div>
-
- <div class='col-md-2 d-flex flex-column gap-2'>
- <div class='card bg-transparent border-0' style='aspect-ratio: 1/1; width: 100%; flex: 1;'> " .
- Html::tag('video', '', [
- 'class' => 'video-preview',
- 'src' => Url::to($model->buildProcess->url ?? null),
- 'style' => 'width: 100%; height: 100%; object-fit: cover;',
- 'autoplay' => true,
- 'muted' => true,
- 'loop' => true,
- 'playsinline' => true
+ <div class='text-center bg-transparent fw-bold p-0 m-0'>Презентация</div>
+ </div>
+ <div class='card' style='aspect-ratio: 1/1; width: 100%; flex: 1;'>";
+ if (isset($previewImageUrls[1])) {
+ $html .= Html::a(
+ Html::img($previewImageUrls[1], [
+ 'style' => 'width: 100%; height: 100%; object-fit: cover;',
+ ]),
+ $previewImageUrls[1],
+ ['data-lightbox' => $galleryId]
+ );
+ }
+ $html .= "
+ </div>
+ </div>
+
+ <div class='col-md-2 d-flex flex-column gap-2'>
+ <div class='card bg-transparent border-0' style='aspect-ratio: 1/1; width: 100%; flex: 1;'>
+ " . Html::tag('video', '', [
+ 'class' => 'video-preview',
+ 'src' => Url::to($model->buildProcess->url ?? null),
+ 'style' => 'width: 100%; height: 100%; object-fit: cover;',
+ 'autoplay' => true,
+ 'muted' => true,
+ 'loop' => true,
+ 'playsinline' => true,
]) . "
- <div class='text-center bg-transparent fw-bold'>Процесс сборки</div>
- </div>
- <div class='card' style='aspect-ratio: 1/1; width: 100%; flex: 1;'> " .
- Html::img(is_array($imageUrls) && isset($imageUrls[2]) ? Url::to($imageUrls[2]) : null,
- ['style' => 'width: 100%; height: 100%; object-fit: cover;']) . "
- </div>
- </div>
- <div class='col-md-3 pt-1 text-center'>
- <div class='row'>
- " . (!empty($model->status) ? "
- <label class='h5 fw-bold mb-1'>Статус букета</label>
- <span class='badge " .
- match ($model->status) {
- WriteOffsErp::STATUS_CREATED => 'bg-info',
- WriteOffsErp::STATUS_CONFIRM,
- WriteOffsErp::STATUS_CREATED_1С => 'bg-success',
- WriteOffsErp::STATUS_SEND => 'bg-warning',
- WriteOffsErp::STATUS_DISABLE,
- WriteOffsErp::STATUS_ERROR_1С => 'bg-danger',
- default => 'bg-secondary',
- } .
- " fs-6 text-white px-7 w-100 mb-4 d-block'>
- " . Html::encode(\yii_app\records\WriteOffsErp::STATUSES[$model->status] ?? '') . "
- </span>
- " : "") . "
- </div>
- " . (!empty($model->error_text) ? "
- <div class='row'>
- <label class='h5 fw-bold mb-1'>Ошибка</label>
- <span class='badge bg-danger fs-6 text-white w-100 mb-4 d-block' style='word-wrap: break-word; white-space: normal;'>
- " . Html::encode($model->error_text) . "
- </span>
- </div>
- " : "") . "
- </div>
- <div class='row mt-auto text-center'>
- <div class='col-md-7'></div>
- <div class='col-md-2'>
- " .
- Html::a('Редактировать', Url::to(['/bouquet/view', 'id' => $model['id']]), [
+ <div class='text-center bg-transparent fw-bold'>Процесс сборки</div>
+ </div>
+ <div class='card' style='aspect-ratio: 1/1; width: 100%; flex: 1;'>";
+ if (isset($previewImageUrls[2])) {
+ $html .= Html::a(
+ Html::img($previewImageUrls[2], [
+ 'style' => 'width: 100%; height: 100%; object-fit: cover;'
+ ]),
+ $previewImageUrls[2],
+ ['data-lightbox' => $galleryId]
+ );
+ }
+ $html .= "
+ </div>
+ </div>
+ <div class='col-md-3 pt-1 text-center'>
+ <div class='row'>
+ " . (!empty($model->status) ? "
+ <label class='h5 fw-bold mb-1'>Статус букета</label>
+ <span class='badge " .
+ match ($model->status) {
+ WriteOffsErp::STATUS_CREATED => 'bg-info',
+ WriteOffsErp::STATUS_CONFIRM,
+ WriteOffsErp::STATUS_CREATED_1С => 'bg-success',
+ WriteOffsErp::STATUS_SEND => 'bg-warning',
+ WriteOffsErp::STATUS_DISABLE,
+ WriteOffsErp::STATUS_ERROR_1С => 'bg-danger',
+ default => 'bg-secondary',
+ } .
+ " fs-6 text-white px-7 w-100 mb-4 d-block'>
+ " . Html::encode(\yii_app\records\WriteOffsErp::STATUSES[$model->status] ?? '') . "
+ </span>
+ " : "") . "
+ </div>
+ " . (!empty($model->error_text) ? "
+ <div class='row'>
+ <label class='h5 fw-bold mb-1'>Ошибка</label>
+ <span class='badge bg-danger fs-6 text-white w-100 mb-4 d-block' style='word-wrap: break-word; white-space: normal;'>
+ " . Html::encode($model->error_text) . "
+ </span>
+ </div>
+ " : "") . "
+ </div>
+ <div class='row mt-auto text-center'>
+ <div class='col-md-7'></div>
+ <div class='col-md-2'>
+ " . Html::a('Редактировать', Url::to(['/bouquet/view', 'id' => $model['id']]), [
'class' => 'btn btn-warning btn-edit'
-// .
-// ((Yii::$app->request->get('year') < date('Y') || // Если год в прошлом → disabled
-// (Yii::$app->request->get('year') == date('Y') && Yii::$app->request->get('month') < date('m')) ||
-// (Yii::$app->request->get('year') == date('Y') && Yii::$app->request->get('month') == date('m') && BouquetComposition::disabledButtons()) ||
-// (Yii::$app->request->get('year') == date('Y') && Yii::$app->request->get('month') == date('m') + 1 &&BouquetComposition::disabledButtons())
-// ) ? ' disabled' : ''),
- ])
- . "
- </div>
- </div>
+ ]) . "
</div>
- </div>";
+ </div>
+ </div>
+ " . $hiddenLinks . "
+ </div>";
+ return $html;
},
'contentOptions' => ['class' => 'align-top'],
- 'headerOptions' => ['style' => 'display:none'],
+ 'headerOptions' => ['style' => 'display:none'],
],
],
]) ?>
--- /dev/null
+/*!
+ * Lightbox v2.11.3
+ * by Lokesh Dhakar
+ *
+ * More info:
+ * http://lokeshdhakar.com/projects/lightbox2/
+ *
+ * Copyright Lokesh Dhakar
+ * Released under the MIT license
+ * https://github.com/lokesh/lightbox2/blob/master/LICENSE
+ *
+ * @preserve
+ */
+!function(a,b){"function"==typeof define&&define.amd?define(["jquery"],b):"object"==typeof exports?module.exports=b(require("jquery")):a.lightbox=b(a.jQuery)}(this,function(a){function b(b){this.album=[],this.currentImageIndex=void 0,this.init(),this.options=a.extend({},this.constructor.defaults),this.option(b)}return b.defaults={albumLabel:"Image %1 of %2",alwaysShowNavOnTouchDevices:!1,fadeDuration:600,fitImagesInViewport:!0,imageFadeDuration:600,positionFromTop:50,resizeDuration:700,showImageNumberLabel:!0,wrapAround:!1,disableScrolling:!1,sanitizeTitle:!1},b.prototype.option=function(b){a.extend(this.options,b)},b.prototype.imageCountLabel=function(a,b){return this.options.albumLabel.replace(/%1/g,a).replace(/%2/g,b)},b.prototype.init=function(){var b=this;a(document).ready(function(){b.enable(),b.build()})},b.prototype.enable=function(){var b=this;a("body").on("click","a[rel^=lightbox], area[rel^=lightbox], a[data-lightbox], area[data-lightbox]",function(c){return b.start(a(c.currentTarget)),!1})},b.prototype.build=function(){if(!(a("#lightbox").length>0)){var b=this;a('<div id="lightboxOverlay" tabindex="-1" class="lightboxOverlay"></div><div id="lightbox" tabindex="-1" class="lightbox"><div class="lb-outerContainer"><div class="lb-container"><img class="lb-image" src="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==" alt=""/><div class="lb-nav"><a class="lb-prev" aria-label="Previous image" href="" ></a><a class="lb-next" aria-label="Next image" href="" ></a></div><div class="lb-loader"><a class="lb-cancel"></a></div></div></div><div class="lb-dataContainer"><div class="lb-data"><div class="lb-details"><span class="lb-caption"></span><span class="lb-number"></span></div><div class="lb-closeContainer"><a class="lb-close"></a></div></div></div></div>').appendTo(a("body")),this.$lightbox=a("#lightbox"),this.$overlay=a("#lightboxOverlay"),this.$outerContainer=this.$lightbox.find(".lb-outerContainer"),this.$container=this.$lightbox.find(".lb-container"),this.$image=this.$lightbox.find(".lb-image"),this.$nav=this.$lightbox.find(".lb-nav"),this.containerPadding={top:parseInt(this.$container.css("padding-top"),10),right:parseInt(this.$container.css("padding-right"),10),bottom:parseInt(this.$container.css("padding-bottom"),10),left:parseInt(this.$container.css("padding-left"),10)},this.imageBorderWidth={top:parseInt(this.$image.css("border-top-width"),10),right:parseInt(this.$image.css("border-right-width"),10),bottom:parseInt(this.$image.css("border-bottom-width"),10),left:parseInt(this.$image.css("border-left-width"),10)},this.$overlay.hide().on("click",function(){return b.end(),!1}),this.$lightbox.hide().on("click",function(c){"lightbox"===a(c.target).attr("id")&&b.end()}),this.$outerContainer.on("click",function(c){return"lightbox"===a(c.target).attr("id")&&b.end(),!1}),this.$lightbox.find(".lb-prev").on("click",function(){return 0===b.currentImageIndex?b.changeImage(b.album.length-1):b.changeImage(b.currentImageIndex-1),!1}),this.$lightbox.find(".lb-next").on("click",function(){return b.currentImageIndex===b.album.length-1?b.changeImage(0):b.changeImage(b.currentImageIndex+1),!1}),this.$nav.on("mousedown",function(a){3===a.which&&(b.$nav.css("pointer-events","none"),b.$lightbox.one("contextmenu",function(){setTimeout(function(){this.$nav.css("pointer-events","auto")}.bind(b),0)}))}),this.$lightbox.find(".lb-loader, .lb-close").on("click",function(){return b.end(),!1})}},b.prototype.start=function(b){function c(a){d.album.push({alt:a.attr("data-alt"),link:a.attr("href"),title:a.attr("data-title")||a.attr("title")})}var d=this,e=a(window);e.on("resize",a.proxy(this.sizeOverlay,this)),this.sizeOverlay(),this.album=[];var f,g=0,h=b.attr("data-lightbox");if(h){f=a(b.prop("tagName")+'[data-lightbox="'+h+'"]');for(var i=0;i<f.length;i=++i)c(a(f[i])),f[i]===b[0]&&(g=i)}else if("lightbox"===b.attr("rel"))c(b);else{f=a(b.prop("tagName")+'[rel="'+b.attr("rel")+'"]');for(var j=0;j<f.length;j=++j)c(a(f[j])),f[j]===b[0]&&(g=j)}var k=e.scrollTop()+this.options.positionFromTop,l=e.scrollLeft();this.$lightbox.css({top:k+"px",left:l+"px"}).fadeIn(this.options.fadeDuration),this.options.disableScrolling&&a("body").addClass("lb-disable-scrolling"),this.changeImage(g)},b.prototype.changeImage=function(b){var c=this,d=this.album[b].link,e=d.split(".").slice(-1)[0],f=this.$lightbox.find(".lb-image");this.disableKeyboardNav(),this.$overlay.fadeIn(this.options.fadeDuration),a(".lb-loader").fadeIn("slow"),this.$lightbox.find(".lb-image, .lb-nav, .lb-prev, .lb-next, .lb-dataContainer, .lb-numbers, .lb-caption").hide(),this.$outerContainer.addClass("animating");var g=new Image;g.onload=function(){var h,i,j,k,l,m;f.attr({alt:c.album[b].alt,src:d}),a(g),f.width(g.width),f.height(g.height),m=a(window).width(),l=a(window).height(),k=m-c.containerPadding.left-c.containerPadding.right-c.imageBorderWidth.left-c.imageBorderWidth.right-20,j=l-c.containerPadding.top-c.containerPadding.bottom-c.imageBorderWidth.top-c.imageBorderWidth.bottom-c.options.positionFromTop-70,"svg"===e&&(f.width(k),f.height(j)),c.options.fitImagesInViewport?(c.options.maxWidth&&c.options.maxWidth<k&&(k=c.options.maxWidth),c.options.maxHeight&&c.options.maxHeight<j&&(j=c.options.maxHeight)):(k=c.options.maxWidth||g.width||k,j=c.options.maxHeight||g.height||j),(g.width>k||g.height>j)&&(g.width/k>g.height/j?(i=k,h=parseInt(g.height/(g.width/i),10),f.width(i),f.height(h)):(h=j,i=parseInt(g.width/(g.height/h),10),f.width(i),f.height(h))),c.sizeContainer(f.width(),f.height())},g.src=this.album[b].link,this.currentImageIndex=b},b.prototype.sizeOverlay=function(){var b=this;setTimeout(function(){b.$overlay.width(a(document).width()).height(a(document).height())},0)},b.prototype.sizeContainer=function(a,b){function c(){d.$lightbox.find(".lb-dataContainer").width(g),d.$lightbox.find(".lb-prevLink").height(h),d.$lightbox.find(".lb-nextLink").height(h),d.$overlay.focus(),d.showImage()}var d=this,e=this.$outerContainer.outerWidth(),f=this.$outerContainer.outerHeight(),g=a+this.containerPadding.left+this.containerPadding.right+this.imageBorderWidth.left+this.imageBorderWidth.right,h=b+this.containerPadding.top+this.containerPadding.bottom+this.imageBorderWidth.top+this.imageBorderWidth.bottom;e!==g||f!==h?this.$outerContainer.animate({width:g,height:h},this.options.resizeDuration,"swing",function(){c()}):c()},b.prototype.showImage=function(){this.$lightbox.find(".lb-loader").stop(!0).hide(),this.$lightbox.find(".lb-image").fadeIn(this.options.imageFadeDuration),this.updateNav(),this.updateDetails(),this.preloadNeighboringImages(),this.enableKeyboardNav()},b.prototype.updateNav=function(){var a=!1;try{document.createEvent("TouchEvent"),a=!!this.options.alwaysShowNavOnTouchDevices}catch(a){}this.$lightbox.find(".lb-nav").show(),this.album.length>1&&(this.options.wrapAround?(a&&this.$lightbox.find(".lb-prev, .lb-next").css("opacity","1"),this.$lightbox.find(".lb-prev, .lb-next").show()):(this.currentImageIndex>0&&(this.$lightbox.find(".lb-prev").show(),a&&this.$lightbox.find(".lb-prev").css("opacity","1")),this.currentImageIndex<this.album.length-1&&(this.$lightbox.find(".lb-next").show(),a&&this.$lightbox.find(".lb-next").css("opacity","1"))))},b.prototype.updateDetails=function(){var a=this;if(void 0!==this.album[this.currentImageIndex].title&&""!==this.album[this.currentImageIndex].title){var b=this.$lightbox.find(".lb-caption");this.options.sanitizeTitle?b.text(this.album[this.currentImageIndex].title):b.html(this.album[this.currentImageIndex].title),b.fadeIn("fast")}if(this.album.length>1&&this.options.showImageNumberLabel){var c=this.imageCountLabel(this.currentImageIndex+1,this.album.length);this.$lightbox.find(".lb-number").text(c).fadeIn("fast")}else this.$lightbox.find(".lb-number").hide();this.$outerContainer.removeClass("animating"),this.$lightbox.find(".lb-dataContainer").fadeIn(this.options.resizeDuration,function(){return a.sizeOverlay()})},b.prototype.preloadNeighboringImages=function(){if(this.album.length>this.currentImageIndex+1){(new Image).src=this.album[this.currentImageIndex+1].link}if(this.currentImageIndex>0){(new Image).src=this.album[this.currentImageIndex-1].link}},b.prototype.enableKeyboardNav=function(){this.$lightbox.on("keyup.keyboard",a.proxy(this.keyboardAction,this)),this.$overlay.on("keyup.keyboard",a.proxy(this.keyboardAction,this))},b.prototype.disableKeyboardNav=function(){this.$lightbox.off(".keyboard"),this.$overlay.off(".keyboard")},b.prototype.keyboardAction=function(a){var b=a.keyCode;27===b?(a.stopPropagation(),this.end()):37===b?0!==this.currentImageIndex?this.changeImage(this.currentImageIndex-1):this.options.wrapAround&&this.album.length>1&&this.changeImage(this.album.length-1):39===b&&(this.currentImageIndex!==this.album.length-1?this.changeImage(this.currentImageIndex+1):this.options.wrapAround&&this.album.length>1&&this.changeImage(0))},b.prototype.end=function(){this.disableKeyboardNav(),a(window).off("resize",this.sizeOverlay),this.$lightbox.fadeOut(this.options.fadeDuration),this.$overlay.fadeOut(this.options.fadeDuration),this.options.disableScrolling&&a("body").removeClass("lb-disable-scrolling")},new b});
+//# sourceMappingURL=lightbox.min.map
\ No newline at end of file