From f2a2d24d5112692ff24df2ab4044d3e5fbb3b600 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=86=D0=BD=D0=BD=D0=B0=20=D0=A8=D0=BF=D0=BE=D0=BD=D1=8C?= =?UTF-8?q?=D0=BA=D0=B0?= Date: Thu, 4 Jun 2026 17:40:20 +0300 Subject: [PATCH 1/6] feat: admin art gallery implementation --- config/webpack.dev.js | 7 ++ config/webpack.rules.js | 17 ++- package.json | 4 +- .../DeleteImageModal.component.tsx | 26 +++++ .../DeleteImageModal.styles.scss | 26 +++++ .../EditImageModal.component.tsx | 58 ++++++++++ .../EditImageModal/EditImageModal.styles.scss | 43 +++++++ .../TemplatesModal.component.tsx | 51 +++++++++ .../EditImageModal/TemplatesModal.styles.scss | 63 ++++++++++ .../common/constants/templates.constants.ts | 20 ++++ src/app/layout/ModalWrapper.component.tsx | 6 + src/app/stores/image-template-store.ts | 24 ++++ src/app/stores/modal-store.ts | 11 +- src/app/stores/root-store.ts | 4 + .../AdminPage/AdminPage.component.tsx | 1 + src/features/AdminPage/AdminPage.styles.scss | 1 + .../ArtGallery/ArtGallery.styles.scss | 6 + .../AdminPage/ArtGallery/ArtGallery.tsx | 33 ++++++ .../AdminArtControls/AdminArtControls.tsx | 10 ++ .../GalleryPreview.component.tsx | 22 ++++ .../GalleryPreview/GalleryPreview.styles.scss | 44 +++++++ .../ImageGallery/AddButtonCard.styles.scss | 43 +++++++ .../components/ImageGallery/AddButtonCard.tsx | 37 ++++++ .../DeleteConfirmationOverlay.styles.scss | 26 +++++ .../DeleteConfirmationOverlay.tsx | 18 +++ .../ImageGallery/GalleryList.styles.scss | 10 ++ .../components/ImageGallery/GalleryList.tsx | 57 +++++++++ .../ImageGallery/ImageCard.styles.scss | 68 +++++++++++ .../components/ImageGallery/ImageCard.tsx | 29 +++++ .../ImageGallery/SortableImageCard.tsx | 39 +++++++ .../ImageModal/ImageModal.styles.scss | 0 .../components/ImageModal/ImageModal.tsx | 0 .../TemplateGrid/TemplateGrid.styles.scss | 27 +++++ .../components/TemplateGrid/TemplateGrid.tsx | 27 +++++ .../TemplateManager.styles.scss | 0 .../TemplateManager/TemplateManager.tsx | 22 ++++ .../TemplateSelector/TemplateSelector.tsx | 31 +++++ .../Templates/TemplatesHeader.styles.scss | 43 +++++++ .../components/Templates/TemplatesHeader.tsx | 18 +++ .../Templates/shared-grid.styles.scss | 108 ++++++++++++++++++ .../ArtGallery/hooks/useArtGallery.ts | 53 +++++++++ .../ArtGallery/hooks/useFileUpload.ts | 44 +++++++ .../ArtGallery/types/gallery.types.ts | 50 ++++++++ .../ArtGallerySlideItem.component.tsx | 16 ++- .../ArtGallerySlideItem.styles.scss | 5 + src/index.d.ts | 2 + 46 files changed, 1242 insertions(+), 8 deletions(-) create mode 100644 src/app/common/components/modals/EditImageModal/DeleteImageModal.component.tsx create mode 100644 src/app/common/components/modals/EditImageModal/DeleteImageModal.styles.scss create mode 100644 src/app/common/components/modals/EditImageModal/EditImageModal.component.tsx create mode 100644 src/app/common/components/modals/EditImageModal/EditImageModal.styles.scss create mode 100644 src/app/common/components/modals/EditImageModal/TemplatesModal.component.tsx create mode 100644 src/app/common/components/modals/EditImageModal/TemplatesModal.styles.scss create mode 100644 src/app/common/constants/templates.constants.ts create mode 100644 src/app/stores/image-template-store.ts create mode 100644 src/features/AdminPage/ArtGallery/ArtGallery.styles.scss create mode 100644 src/features/AdminPage/ArtGallery/ArtGallery.tsx create mode 100644 src/features/AdminPage/ArtGallery/components/AdminArtControls/AdminArtControls.tsx create mode 100644 src/features/AdminPage/ArtGallery/components/GalleryPreview/GalleryPreview.component.tsx create mode 100644 src/features/AdminPage/ArtGallery/components/GalleryPreview/GalleryPreview.styles.scss create mode 100644 src/features/AdminPage/ArtGallery/components/ImageGallery/AddButtonCard.styles.scss create mode 100644 src/features/AdminPage/ArtGallery/components/ImageGallery/AddButtonCard.tsx create mode 100644 src/features/AdminPage/ArtGallery/components/ImageGallery/DeleteConfirmationOverlay.styles.scss create mode 100644 src/features/AdminPage/ArtGallery/components/ImageGallery/DeleteConfirmationOverlay.tsx create mode 100644 src/features/AdminPage/ArtGallery/components/ImageGallery/GalleryList.styles.scss create mode 100644 src/features/AdminPage/ArtGallery/components/ImageGallery/GalleryList.tsx create mode 100644 src/features/AdminPage/ArtGallery/components/ImageGallery/ImageCard.styles.scss create mode 100644 src/features/AdminPage/ArtGallery/components/ImageGallery/ImageCard.tsx create mode 100644 src/features/AdminPage/ArtGallery/components/ImageGallery/SortableImageCard.tsx create mode 100644 src/features/AdminPage/ArtGallery/components/ImageModal/ImageModal.styles.scss create mode 100644 src/features/AdminPage/ArtGallery/components/ImageModal/ImageModal.tsx create mode 100644 src/features/AdminPage/ArtGallery/components/TemplateGrid/TemplateGrid.styles.scss create mode 100644 src/features/AdminPage/ArtGallery/components/TemplateGrid/TemplateGrid.tsx create mode 100644 src/features/AdminPage/ArtGallery/components/TemplateManager/TemplateManager.styles.scss create mode 100644 src/features/AdminPage/ArtGallery/components/TemplateManager/TemplateManager.tsx create mode 100644 src/features/AdminPage/ArtGallery/components/TemplateSelector/TemplateSelector.tsx create mode 100644 src/features/AdminPage/ArtGallery/components/Templates/TemplatesHeader.styles.scss create mode 100644 src/features/AdminPage/ArtGallery/components/Templates/TemplatesHeader.tsx create mode 100644 src/features/AdminPage/ArtGallery/components/Templates/shared-grid.styles.scss create mode 100644 src/features/AdminPage/ArtGallery/hooks/useArtGallery.ts create mode 100644 src/features/AdminPage/ArtGallery/hooks/useFileUpload.ts create mode 100644 src/features/AdminPage/ArtGallery/types/gallery.types.ts diff --git a/config/webpack.dev.js b/config/webpack.dev.js index 857c6e3..7cc7e88 100644 --- a/config/webpack.dev.js +++ b/config/webpack.dev.js @@ -9,6 +9,13 @@ module.exports = { open: true, port: "3000", historyApiFallback: true, + client: { + // Показывать оверлеем только ошибки, без потока предупреждений. + overlay: { + errors: true, + warnings: false, + }, + }, }, module: { rules: require('./webpack.rules'), diff --git a/config/webpack.rules.js b/config/webpack.rules.js index ff6425d..99ce71c 100644 --- a/config/webpack.rules.js +++ b/config/webpack.rules.js @@ -34,7 +34,22 @@ module.exports = [ use: [ { loader: 'style-loader' }, { loader: 'css-loader' }, - { loader: 'sass-loader' }, + { + loader: 'sass-loader', + options: { + // Заглушаем deprecation-предупреждения Dart Sass, которые + // флудят dev-сервер (по одному на каждый .scss-файл). + sassOptions: { + quietDeps: true, // тихо для зависимостей (node_modules, swiper) + silenceDeprecations: [ + 'legacy-js-api', + 'import', + 'global-builtin', + 'color-functions', + ], + }, + }, + }, ], } ].filter(Boolean); \ No newline at end of file diff --git a/package.json b/package.json index b1c6fce..6896e9c 100644 --- a/package.json +++ b/package.json @@ -6,9 +6,9 @@ "private": true, "dependencies": { "@ant-design/icons": "^4.8.0", - "@dnd-kit/core": "^6.0.8", + "@dnd-kit/core": "^6.3.1", "@dnd-kit/sortable": "^7.0.2", - "@dnd-kit/utilities": "^3.2.1", + "@dnd-kit/utilities": "^3.2.2", "@fortawesome/fontawesome-free": "^6.4.0", "@react-google-maps/api": "^2.18.1", "@react-hook/resize-observer": "^1.2.6", diff --git a/src/app/common/components/modals/EditImageModal/DeleteImageModal.component.tsx b/src/app/common/components/modals/EditImageModal/DeleteImageModal.component.tsx new file mode 100644 index 0000000..7a6ee46 --- /dev/null +++ b/src/app/common/components/modals/EditImageModal/DeleteImageModal.component.tsx @@ -0,0 +1,26 @@ +import { observer } from 'mobx-react-lite'; +import { useModalContext } from '@stores/root-store'; +import { Modal } from 'antd'; + +const DeleteImageModal = observer(() => { + const { modalStore: { setModal, modalsState: { deleteImage } } } = useModalContext(); + + const onConfirm = () => { + console.log("Удаляем картинку ID:", deleteImage.image?.id); + setModal('deleteImage'); + }; + + return ( + setModal('deleteImage')} + className="deleteModal" + > +

Ви впевнені, що хочете видалити це зображення?

+
+ ); +}); + +export default DeleteImageModal; \ No newline at end of file diff --git a/src/app/common/components/modals/EditImageModal/DeleteImageModal.styles.scss b/src/app/common/components/modals/EditImageModal/DeleteImageModal.styles.scss new file mode 100644 index 0000000..aa17622 --- /dev/null +++ b/src/app/common/components/modals/EditImageModal/DeleteImageModal.styles.scss @@ -0,0 +1,26 @@ +@use "@sass/variables/_variables.colors.scss" as c; +@use "@sass/mixins/_utils.mixins.scss" as mut; + +.deleteModal { + + .ant-btn-default { + + color: #000000; + + &:hover { + border-color: c.$accented-red-color; + color: c.$accented-red-color; + } + } + + .ant-btn-primary { + background-color: c.$accented-red-color; + border-color: c.$accented-red-color; + color: c.$pure-white-color; + + &:hover { + background-color: c.$dark-red-color; + border-color: c.$dark-red-color; + } + } +} \ No newline at end of file diff --git a/src/app/common/components/modals/EditImageModal/EditImageModal.component.tsx b/src/app/common/components/modals/EditImageModal/EditImageModal.component.tsx new file mode 100644 index 0000000..2648091 --- /dev/null +++ b/src/app/common/components/modals/EditImageModal/EditImageModal.component.tsx @@ -0,0 +1,58 @@ +import './EditImageModal.styles.scss'; +import CancelBtn from '@images/utils/Cancel_btn.svg'; // Убедитесь, что путь верный +import { observer } from 'mobx-react-lite'; +import { useModalContext } from '@stores/root-store'; +import { Button, Form, Input, Modal } from 'antd'; +import FormItem from 'antd/es/form/FormItem'; +import TextArea from 'antd/es/input/TextArea'; +import { useEffect } from 'react'; + +const EditImageModal = observer(() => { + const { modalStore: { setModal, modalsState: { editImage } } } = useModalContext(); + const [form] = Form.useForm(); + + useEffect(() => { + if (editImage.isOpen && editImage.image) { + form.setFieldsValue({ + title: editImage.image.title, + description: editImage.image.description, + }); + } + }, [editImage.isOpen, editImage.image, form]); + + const onSuccessfulSubmit = (values: { title: string; description: string }) => { + console.log("Сохраняем данные:", values); + + setModal('editImage'); + }; + + return ( + setModal('editImage')} + footer={[null]} + closeIcon={} + > +

Додаткові дані

+ {editImage.image && ( + art + )} +
+ + + + +