@@ -17,6 +23,7 @@ const id = useId();
const model = defineModel();
const emit = defineEmits(['update:modelValue']);
const inputRef = ref(null);
+const isLoaded = ref(false);
const thumb = computed(() => {
if (!model.value) return '/image/cache/no_image-100x100.png';
@@ -39,3 +46,18 @@ onMounted(() => {
observer.observe(input, {attributes: true, attributeFilter: ['value']});
});
+
+
diff --git a/frontend/admin/src/components/SettingsItem.vue b/frontend/admin/src/components/SettingsItem.vue
new file mode 100644
index 0000000..e02ad59
--- /dev/null
+++ b/frontend/admin/src/components/SettingsItem.vue
@@ -0,0 +1,26 @@
+
+
+
+
+
diff --git a/frontend/admin/src/components/Banners/CategorySelect.vue b/frontend/admin/src/components/Slider/CategorySelect.vue
similarity index 97%
rename from frontend/admin/src/components/Banners/CategorySelect.vue
rename to frontend/admin/src/components/Slider/CategorySelect.vue
index bc13db2..05f3fd2 100644
--- a/frontend/admin/src/components/Banners/CategorySelect.vue
+++ b/frontend/admin/src/components/Slider/CategorySelect.vue
@@ -3,7 +3,7 @@
diff --git a/frontend/admin/src/components/Banners/ProductSelect.vue b/frontend/admin/src/components/Slider/ProductSelect.vue
similarity index 97%
rename from frontend/admin/src/components/Banners/ProductSelect.vue
rename to frontend/admin/src/components/Slider/ProductSelect.vue
index 698837c..e9be91a 100644
--- a/frontend/admin/src/components/Banners/ProductSelect.vue
+++ b/frontend/admin/src/components/Slider/ProductSelect.vue
@@ -2,7 +2,7 @@
+
+
+
Здесь настраивается слайдер, который выводится на главной странице.
+
Рекомендуемые размеры изображений: 370×200px , 740×400px ,
+ 1110×600px либо другие, в тех же пропорциях (1.85:1)
+ Изображение будет автоматически обрезана под нужный формат.
+ Заголовок можно оставить пустым, но рекомендуется заполнить для корректной работы целей
+ Яндекс.Метрики.
+
+
+
+
+
+
+
+
+
+ Показывать слайдер на главной странице.
+ Для отображения слайдера нужно добавить минимум 1 слайд.
+
+
+
+
+
+
+ Слайд
+ Переворот
+ Карточки
+ Куб
+ Перекрывающиеся слайды
+
+
+
+
+
+
+
+
+
+
+ Показывать точки под слайдером для индикации текущего слайда.
+
+
+
+
+
+
+
+
+
+ Показывать полосу прокрутки под слайдером для навигации между слайдами.
+
+
+
+
+
+
+
+
+
+ Расстояние между слайдами в пикселях. По умолчанию - 30.
+
+
+
+
+
+
+
+
+
+ Позволяет свободно прокручивать слайды без привязки к конкретным позициям.
+
+
+
+
+
+
+
+
+
+ Включите этот режим, чтобы после последнего слайда слайдер продолжал прокрутку с первого, создавая бесконечный цикл.
+
+
+
+
+
+
+
+
+
+ Слайдер будет автоматически листать изображения каждые 3 секунды
+
+
+
+
+
+
+
+
+
+
diff --git a/frontend/admin/src/components/Switcher.vue b/frontend/admin/src/components/Switcher.vue
new file mode 100644
index 0000000..694e0be
--- /dev/null
+++ b/frontend/admin/src/components/Switcher.vue
@@ -0,0 +1,28 @@
+
+
+
+ Вкл
+
+
+ Выкл
+
+
+
+
+
+
+
diff --git a/frontend/admin/src/main.js b/frontend/admin/src/main.js
index 5dcad83..c83f111 100644
--- a/frontend/admin/src/main.js
+++ b/frontend/admin/src/main.js
@@ -1,14 +1,20 @@
import './assets/main.css'
-
import { createApp } from 'vue'
import { createPinia } from 'pinia'
-
import App from './App.vue'
import router from './router'
-const app = createApp(App)
+function onReady(fn) {
+ if (document.readyState === 'loading') {
+ document.addEventListener('DOMContentLoaded', fn);
+ } else {
+ fn();
+ }
+}
-app.use(createPinia())
-app.use(router)
-
-app.mount('#app')
+onReady(() => {
+ const app = createApp(App);
+ app.use(createPinia());
+ app.use(router);
+ app.mount('#app');
+});
diff --git a/frontend/admin/src/views/HomeView.vue b/frontend/admin/src/views/HomeView.vue
index 87ba401..9000062 100644
--- a/frontend/admin/src/views/HomeView.vue
+++ b/frontend/admin/src/views/HomeView.vue
@@ -1,7 +1,7 @@
-
+
diff --git a/frontend/admin/vite.config.js b/frontend/admin/vite.config.js
index 5974823..a0d255b 100644
--- a/frontend/admin/vite.config.js
+++ b/frontend/admin/vite.config.js
@@ -1,14 +1,16 @@
-import { fileURLToPath, URL } from 'node:url'
+import {fileURLToPath, URL} from 'node:url';
-import { defineConfig } from 'vite'
-import vue from '@vitejs/plugin-vue'
-import vueDevTools from 'vite-plugin-vue-devtools'
+import {defineConfig} from 'vite';
+import vue from '@vitejs/plugin-vue';
+import vueDevTools from 'vite-plugin-vue-devtools';
+import tailwindcss from "@tailwindcss/vite";
// https://vite.dev/config/
export default defineConfig({
plugins: [
vue(),
vueDevTools(),
+ tailwindcss(),
],
resolve: {
alias: {
@@ -19,11 +21,11 @@ export default defineConfig({
build: {
manifest: true,
sourcemap: true,
- outDir: '../modules/oc_telegram_shop/upload/admin/view/javascript',
+ outDir: '../../module/oc_telegram_shop/upload/admin/view/javascript/telecart',
emptyOutDir: true, // also necessary
rollupOptions: {
input: {
- bulk_products: '/src/main.js',
+ telecart: '/src/main.js',
},
output: {
entryFileNames: `[name].js`,
@@ -43,4 +45,4 @@ export default defineConfig({
protocol: 'ws',
},
},
-})
+});
diff --git a/frontend/spa/src/components/Banner.vue b/frontend/spa/src/components/Banner.vue
deleted file mode 100644
index acb6d30..0000000
--- a/frontend/spa/src/components/Banner.vue
+++ /dev/null
@@ -1,100 +0,0 @@
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/frontend/spa/src/components/MainpageSlider.vue b/frontend/spa/src/components/MainpageSlider.vue
new file mode 100644
index 0000000..efbcbef
--- /dev/null
+++ b/frontend/spa/src/components/MainpageSlider.vue
@@ -0,0 +1,180 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/frontend/spa/src/main.js b/frontend/spa/src/main.js
index 9db716c..2836df8 100644
--- a/frontend/spa/src/main.js
+++ b/frontend/spa/src/main.js
@@ -16,6 +16,7 @@ import 'swiper/element/bundle';
import 'swiper/css/bundle';
import AppLoading from "@/AppLoading.vue";
import {useProductFiltersStore} from "@/stores/ProductFiltersStore.js";
+import {useSlidersStore} from "@/stores/SlidersStore.js";
register();
const pinia = createPinia();
@@ -26,6 +27,7 @@ app
.use(VueTelegramPlugin);
const settings = useSettingsStore();
+useSlidersStore().fetchMainpageSlider();
const appLoading = createApp(AppLoading);
appLoading.mount('#app');
diff --git a/frontend/spa/src/stores/SlidersStore.js b/frontend/spa/src/stores/SlidersStore.js
new file mode 100644
index 0000000..965cd1a
--- /dev/null
+++ b/frontend/spa/src/stores/SlidersStore.js
@@ -0,0 +1,26 @@
+import {defineStore} from "pinia";
+import {fetchBanner} from "@/utils/ftch.js";
+
+export const useSlidersStore = defineStore('sliders', {
+ state: () => ({
+ mainpage_slider: {
+ is_enabled: false,
+ space_between: 30,
+ autoplay: false,
+ effect: 'cube', // null, flip, cards, cube
+ pagination: false,
+ scrollbar: false,
+ free_mode: false,
+ loop: false,
+ slides: [],
+ },
+ }),
+
+ actions: {
+ async fetchMainpageSlider() {
+ console.debug('[Sliders Store] Fetch mainpage slider from server.');
+ const response = await fetchBanner();
+ this.mainpage_slider = Object.assign({}, this.mainpage_slider, response.data);
+ }
+ },
+});
\ No newline at end of file
diff --git a/frontend/spa/src/style.css b/frontend/spa/src/style.css
index d07b4c4..6f1154e 100644
--- a/frontend/spa/src/style.css
+++ b/frontend/spa/src/style.css
@@ -6,6 +6,7 @@
html, body, #app {
width: 100%;
height: 100%;
+ overflow-x: hidden;
}
html {
diff --git a/frontend/spa/src/views/Home.vue b/frontend/spa/src/views/Home.vue
index 0c7b22a..e7e51e5 100644
--- a/frontend/spa/src/views/Home.vue
+++ b/frontend/spa/src/views/Home.vue
@@ -2,7 +2,9 @@
-
+
+
+
@@ -31,12 +33,12 @@
App Loading...
diff --git a/module/oc_telegram_shop/upload/catalog/controller/extension/tgshop/handle.php b/module/oc_telegram_shop/upload/catalog/controller/extension/tgshop/handle.php
index 00cdd73..7c43dc7 100755
--- a/module/oc_telegram_shop/upload/catalog/controller/extension/tgshop/handle.php
+++ b/module/oc_telegram_shop/upload/catalog/controller/extension/tgshop/handle.php
@@ -94,7 +94,7 @@ class ControllerExtensionTgshopHandle extends Controller
$this->config->get('module_tgshop_feature_vouchers'),
FILTER_VALIDATE_BOOLEAN
),
- 'mainpage_banners' => $this->safeJsonDecode($this->config->get('module_tgshop_mainpage_banners'), []),
+ 'mainpage_slider' => $this->safeJsonDecode($this->config->get('module_tgshop_mainpage_slider'), []),
'texts' => [
'no_more_products' => $this->config->get('module_tgshop_text_no_more_products'),
'empty_cart' => $this->config->get('module_tgshop_text_empty_cart'),
diff --git a/module/oc_telegram_shop/upload/oc_telegram_shop/framework/ImageTool/ImageTool.php b/module/oc_telegram_shop/upload/oc_telegram_shop/framework/ImageTool/ImageTool.php
index f674b08..b01771c 100755
--- a/module/oc_telegram_shop/upload/oc_telegram_shop/framework/ImageTool/ImageTool.php
+++ b/module/oc_telegram_shop/upload/oc_telegram_shop/framework/ImageTool/ImageTool.php
@@ -111,7 +111,7 @@ class ImageTool implements ImageToolInterface
$image = $this->manager->make($fullOldPath)
->fit($width, $height, function ($constraint) {
- $constraint->upsize();
+ // $constraint->upsize();
}, $position);
$image->encode($format, 75)->save($fullNewPath, 75, $format);
diff --git a/module/oc_telegram_shop/upload/oc_telegram_shop/src/Handlers/BannerHandler.php b/module/oc_telegram_shop/upload/oc_telegram_shop/src/Handlers/BannerHandler.php
index 875243c..de8a98b 100755
--- a/module/oc_telegram_shop/upload/oc_telegram_shop/src/Handlers/BannerHandler.php
+++ b/module/oc_telegram_shop/upload/oc_telegram_shop/src/Handlers/BannerHandler.php
@@ -24,13 +24,12 @@ class BannerHandler
public function show(): JsonResponse
{
- $data = [];
- $slides = $this->settings->get('mainpage_banners', []);
+ $slider = $this->settings->get('mainpage_slider', []);
- if ($slides) {
- foreach ($slides as $index => $slide) {
+ if ($slider && ! empty($slider['slides']) && is_array($slider['slides'])) {
+ foreach ($slider['slides'] as $index => $slide) {
if (is_file(DIR_IMAGE . $slide['image'])) {
- $data[] = [
+ $slider['slides'][$index] = [
'id' => $index,
'title' => $slide['title'],
'link' => $slide['link'],
@@ -41,7 +40,7 @@ class BannerHandler
}
return new JsonResponse([
- 'data' => $data,
+ 'data' => $slider,
]);
}
}
diff --git a/module/oc_telegram_shop/upload/oc_telegram_shop/src/Handlers/SettingsHandler.php b/module/oc_telegram_shop/upload/oc_telegram_shop/src/Handlers/SettingsHandler.php
index 9a91fc1..b588247 100755
--- a/module/oc_telegram_shop/upload/oc_telegram_shop/src/Handlers/SettingsHandler.php
+++ b/module/oc_telegram_shop/upload/oc_telegram_shop/src/Handlers/SettingsHandler.php
@@ -58,6 +58,7 @@ class SettingsHandler
'feature_vouchers' => $this->settings->get('feature_vouchers') ?? false,
'currency_code' => $this->settings->get('oc_default_currency', 'RUB'),
'texts' => $this->settings->get('texts'),
+ 'mainpage_slider' => $this->settings->get('mainpage_slider'),
]);
}
diff --git a/module/oc_telegram_shop/upload/oc_telegram_shop/tests/Integration/Services/CartServiceTest.php b/module/oc_telegram_shop/upload/oc_telegram_shop/tests/Integration/Services/CartServiceTest.php
old mode 100644
new mode 100755
diff --git a/module/oc_telegram_shop/upload/oc_telegram_shop/tests/Integration/Services/OrderCreateServiceTest.php b/module/oc_telegram_shop/upload/oc_telegram_shop/tests/Integration/Services/OrderCreateServiceTest.php
old mode 100644
new mode 100755
diff --git a/module/oc_telegram_shop/upload/oc_telegram_shop/tests/Integration/Services/ProductsServiceTest.php b/module/oc_telegram_shop/upload/oc_telegram_shop/tests/Integration/Services/ProductsServiceTest.php
old mode 100644
new mode 100755
diff --git a/module/oc_telegram_shop/upload/oc_telegram_shop/tests/README.md b/module/oc_telegram_shop/upload/oc_telegram_shop/tests/README.md
old mode 100644
new mode 100755
diff --git a/rebuildgaa b/rebuildgaa
new file mode 100644
index 0000000..e69de29
diff --git a/scripts/ci/build.sh b/scripts/ci/build.sh
index b5c2c1d..095b2a6 100755
--- a/scripts/ci/build.sh
+++ b/scripts/ci/build.sh
@@ -29,7 +29,7 @@ if [ -z "$SRC_PATH" ]; then
exit 1
fi
-echo "Build Telecart Frontend..."
+echo "Build Telecart SPA Frontend..."
cd "${SRC_PATH}/frontend/spa"
bun install
bun run build
@@ -43,9 +43,18 @@ bun install
bun run build
echo "Move manifest file"
-cp "${SRC_PATH}/module/oc_telegram_shop/upload/admin/view/javascript/.vite/manifest.json" "${SRC_PATH}/module/oc_telegram_shop/upload/admin/view/javascript/manifest.json"
+cp "${SRC_PATH}/module/oc_telegram_shop/upload/admin/view/javascript/telecart/.vite/manifest.json" \
+ "${SRC_PATH}/module/oc_telegram_shop/upload/admin/view/javascript/telecart/manifest.json"
-cd - > /dev/null
+
+cd "$SRC_PATH"
+
+echo "Cleanup frontend"
+rm -v module/oc_telegram_shop/upload/image/catalog/tgshopspa/vite.svg
+rm -v module/oc_telegram_shop/upload/image/catalog/tgshopspa/assets/*.map
+rm -v module/oc_telegram_shop/upload/admin/view/integration.js
+rm -v module/oc_telegram_shop/upload/admin/view/javascript/telecart/telecart.js.map
+rm -v module/oc_telegram_shop/upload/admin/view/javascript/telecart/favicon.ico
echo "Install Composer dependencies."
cd "${SRC_PATH}/module/oc_telegram_shop/upload/oc_telegram_shop"
@@ -55,7 +64,8 @@ composer install \
--optimize-autoloader \
--no-interaction \
--no-cache
-cd - > /dev/null
+
+cd "$SRC_PATH"
echo "Copy .env for production"
cp "${SRC_PATH}/module/oc_telegram_shop/upload/oc_telegram_shop/.env.production" \
diff --git a/scripts/install_ocstore.sh b/scripts/install_ocstore.sh
index a85564c..3ede974 100755
--- a/scripts/install_ocstore.sh
+++ b/scripts/install_ocstore.sh
@@ -27,7 +27,7 @@ docker compose exec web bash -c '\
--username admin \
--password admin \
--email youremail@example.com \
- --http_server http://localhost:8000/; exit $?'
+ --http_server https://api.tg.nikitakiselev.ru/; exit $?'
docker compose exec web bash -c "cd /web; composer update"
echo "Moving storage folder outside the system."