Compare commits
	
		
			2 Commits
		
	
	
		
			db64beb3ee
			...
			a357994025
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| a357994025 | |||
| 7382a85082 | 
| @@ -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
											
										
									
								
							| @@ -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); | ||||
|   | ||||
| @@ -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); | ||||
|   | ||||
| @@ -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()}> | ||||
|   | ||||
| @@ -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( | ||||
|       </> | ||||
|     ); | ||||
|   } | ||||
| ); | ||||
| ); | ||||
|   | ||||
| @@ -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); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user