From 615e8c54a60d076a65bc04e60d26c5cbb21c264f Mon Sep 17 00:00:00 2001 From: Nikita Kiselev Date: Sat, 6 Dec 2025 18:14:07 +0300 Subject: [PATCH] feat: add aspect ratio selector for products_carousel --- .../Forms/AspectRatioSelect.vue | 31 ++++++++++++++++ .../Forms/ProductsCarouselForm.vue | 35 ++++++++++++++++++- .../Forms/ProductsFeedForm.vue | 26 ++------------ .../MainPageConfigurator/availableBlocks.js | 1 + .../framework/ImageTool/ImageUtils.php | 18 ++++++++++ .../src/Handlers/ProductsHandler.php | 6 ++-- .../src/Services/BlocksService.php | 21 ++--------- .../src/Services/ProductsService.php | 12 +++---- 8 files changed, 96 insertions(+), 54 deletions(-) create mode 100644 frontend/admin/src/components/MainPageConfigurator/Forms/AspectRatioSelect.vue create mode 100644 module/oc_telegram_shop/upload/oc_telegram_shop/framework/ImageTool/ImageUtils.php diff --git a/frontend/admin/src/components/MainPageConfigurator/Forms/AspectRatioSelect.vue b/frontend/admin/src/components/MainPageConfigurator/Forms/AspectRatioSelect.vue new file mode 100644 index 0000000..a894316 --- /dev/null +++ b/frontend/admin/src/components/MainPageConfigurator/Forms/AspectRatioSelect.vue @@ -0,0 +1,31 @@ + + + + diff --git a/frontend/admin/src/components/MainPageConfigurator/Forms/ProductsCarouselForm.vue b/frontend/admin/src/components/MainPageConfigurator/Forms/ProductsCarouselForm.vue index 0b4a886..4a8c1bd 100644 --- a/frontend/admin/src/components/MainPageConfigurator/Forms/ProductsCarouselForm.vue +++ b/frontend/admin/src/components/MainPageConfigurator/Forms/ProductsCarouselForm.vue @@ -36,6 +36,19 @@ Текст для кнопки, которая открывает просмотр товаров у категории + + +
+

Изображения

+ + + + +
@@ -136,12 +149,31 @@ import BaseForm from "@/components/MainPageConfigurator/Forms/BaseForm.vue"; import FormItem from "@/components/MainPageConfigurator/Forms/FormItem.vue"; import CategorySelect from "@/components/Form/CategorySelect.vue"; import {Fieldset, InputNumber, InputText, Panel, ToggleSwitch} from "primevue"; +import AspectRatioSelect from "@/components/MainPageConfigurator/Forms/AspectRatioSelect.vue"; const draft = ref(null); const model = defineModel(); const emit = defineEmits(['cancel']); -const isChanged = computed(() => md5(JSON.stringify(model.value)) !== md5(JSON.stringify(draft.value))); +const imageAspectRatio = computed({ + get() { + return draft.value.data.image_aspect_ratio || '1:1'; + }, + set(value) { + draft.value.data.image_aspect_ratio = value; + } +}); + +const isChanged = computed(() => { + const normalize = (obj) => { + const clone = JSON.parse(JSON.stringify(obj)); + if (clone.data && !clone.data.image_aspect_ratio) { + clone.data.image_aspect_ratio = '1:1'; + } + return JSON.stringify(clone); + }; + return md5(normalize(model.value)) !== md5(normalize(draft.value)); +}); // Инициализация carousel, если его нет (только для записи) function ensureCarousel() { @@ -242,6 +274,7 @@ function onApply() { onMounted(async () => { draft.value = JSON.parse(JSON.stringify(model.value)); + // Не создаем carousel здесь, чтобы не изменять draft при инициализации // carousel будет создан только при реальных изменениях пользователем }); diff --git a/frontend/admin/src/components/MainPageConfigurator/Forms/ProductsFeedForm.vue b/frontend/admin/src/components/MainPageConfigurator/Forms/ProductsFeedForm.vue index 3fbe455..da3b3de 100644 --- a/frontend/admin/src/components/MainPageConfigurator/Forms/ProductsFeedForm.vue +++ b/frontend/admin/src/components/MainPageConfigurator/Forms/ProductsFeedForm.vue @@ -29,21 +29,7 @@