Compare commits

...

2 Commits

Author SHA1 Message Date
a357994025 feat: Update pop-up logic 2025-10-02 04:45:43 +03:00
7382a85082 feat: Update city logic in map page with scrollbar 2025-10-02 04:38:15 +03:00
7 changed files with 521 additions and 415 deletions

View File

@@ -1,62 +0,0 @@
# Селектор городов
## Описание функциональности
Добавлена функциональность выбора города в админ-панели "Белые ночи":
### Основные возможности:
1. **Селектор городов в шапке приложения**
- Расположен рядом с именем пользователя в верхней части приложения
- Показывает список всех доступных городов
- Имеет иконку MapPin для лучшего UX
2. **Сохранение в localStorage**
- Выбранный город автоматически сохраняется в localStorage
- При перезагрузке страницы выбранный город восстанавливается
3. **Автоматическое использование в формах**
- При создании новой станции выбранный город автоматически подставляется
- При создании нового перевозчика выбранный город автоматически подставляется
- Пользователь может изменить город в форме при необходимости
### Технические детали:
#### Новые компоненты и сторы:
- `SelectedCityStore` - стор для управления выбранным городом
- `CitySelector` - компонент селектора городов
- `useSelectedCity` - хук для удобного доступа к выбранному городу
#### Интеграция:
- Селектор добавлен в `Layout` компонент
- Интегрирован в `StationCreatePage` и `CarrierCreatePage`
- Использует существующий `CityStore` для получения списка городов
#### Файлы, которые были изменены:
- `src/widgets/Layout/index.tsx` - добавлен CitySelector
- `src/pages/Station/StationCreatePage/index.tsx` - автоматическая подстановка города
- `src/pages/Carrier/CarrierCreatePage/index.tsx` - автоматическая подстановка города
- `src/shared/store/index.ts` - добавлен экспорт SelectedCityStore
- `src/widgets/index.ts` - добавлен экспорт CitySelector
- `src/shared/index.tsx` - добавлен экспорт hooks
#### Новые файлы:
- `src/shared/store/SelectedCityStore/index.ts`
- `src/widgets/CitySelector/index.tsx`
- `src/shared/hooks/useSelectedCity.ts`
- `src/shared/hooks/index.ts`
### Использование:
1. Пользователь выбирает город в селекторе в шапке приложения
2. Выбранный город сохраняется в localStorage
3. При создании новой станции или перевозчика выбранный город автоматически подставляется в форму
4. Пользователь может изменить город в форме если нужно
Функциональность полностью интегрирована и готова к использованию.

File diff suppressed because it is too large Load Diff

View File

@@ -67,7 +67,8 @@ export const StationCreatePage = observer(() => {
// ОБНОВЛЕННАЯ ФУНКЦИЯ: Проверка и вызов окна или создания
const handleCreate = async () => {
const isCityMissing = !createStationData.common.city_id;
const isNameMissing = !createStationData[language].name;
// Проверяем названия на всех языках
const isNameMissing = !createStationData.ru.name || !createStationData.en.name || !createStationData.zh.name;
if (isCityMissing || isNameMissing) {
setIsSaveWarningOpen(true);

View File

@@ -67,7 +67,8 @@ export const StationEditPage = observer(() => {
// ОБНОВЛЕННАЯ ФУНКЦИЯ: Проверка и вызов окна или редактирования
const handleEdit = async () => {
const isCityMissing = !editStationData.common.city_id;
const isNameMissing = !editStationData[language].name;
// Проверяем названия на всех языках
const isNameMissing = !editStationData.ru.name || !editStationData.en.name || !editStationData.zh.name;
if (isCityMissing || isNameMissing) {
setIsSaveWarningOpen(true);

View File

@@ -5,9 +5,10 @@ export const SaveWithoutCityAgree = ({ blocker }: { blocker: any }) => {
<div className="fixed top-0 left-0 w-screen h-screen flex justify-center items-center z-10000 bg-black/30">
<div className="bg-white p-4 w-140 rounded-lg flex flex-col gap-4 items-center">
<p className="text-black w-140 text-center">
Вы не указали город и/или не заполнили названия на всех языках.
Вы не указали город и/или не заполнили названия на всех языках
(русский, английский, китайский).
<br />
Сохранить достопримечательность без этой информации?
Сохранить без этой информации?
</p>
<div className="flex gap-4 justify-center">
<Button variant="contained" onClick={() => blocker.proceed()}>

View File

@@ -119,7 +119,8 @@ export const CreateInformationTab = observer(
const handleSave = async () => {
const isCityMissing = !sight.city_id;
const isNameMissing = !sight[language].name;
// Проверяем названия на всех языках
const isNameMissing = !sight.ru.name || !sight.en.name || !sight.zh.name;
if (isCityMissing || isNameMissing) {
setIsSaveWarningOpen(true);
@@ -514,4 +515,4 @@ export const CreateInformationTab = observer(
</>
);
}
);
);

View File

@@ -128,7 +128,8 @@ export const InformationTab = observer(
// ОБНОВЛЕННАЯ ФУНКЦИЯ: Проверка и вызов окна или сохранения
const handleSave = async () => {
const isCityMissing = !sight.common.city_id;
const isNameMissing = !sight[language].name;
// Проверяем названия на всех языках
const isNameMissing = !sight.ru.name || !sight.en.name || !sight.zh.name;
if (isCityMissing || isNameMissing) {
setIsSaveWarningOpen(true);