From 04f6cb6103a527296730f35e3040f2337ae62b19 Mon Sep 17 00:00:00 2001 From: fakz9 Date: Fri, 24 Nov 2023 04:18:33 +0300 Subject: [PATCH] cities filter --- src/api/generalApi.ts | 5 ++ src/api/ordersApi.ts | 7 ++- src/components/CitySelect/CitySelect.tsx | 42 +++++++++++++ .../Modals/SortingModal/SortingModal.tsx | 62 ++++++++++--------- src/components/OrderCard/OrderCard.tsx | 3 +- src/features/citySelect/citySelectSlice.ts | 36 +++++++++++ .../ordersFilter/ordersFilterSlice.ts | 16 +++-- .../shippingWarehouseSelectSlice.ts | 7 +-- src/redux/store.ts | 4 +- .../BarcodeScreen/useBarcodeOrders.tsx | 5 +- src/screens/CommonPage/CommonPage.tsx | 1 + src/screens/OrderScreen/OrderScreen.tsx | 1 + src/types/city.ts | 9 +++ src/types/order.ts | 1 + src/types/shippingWarehouse.ts | 5 ++ 15 files changed, 159 insertions(+), 45 deletions(-) create mode 100644 src/components/CitySelect/CitySelect.tsx create mode 100644 src/features/citySelect/citySelectSlice.ts create mode 100644 src/types/city.ts diff --git a/src/api/generalApi.ts b/src/api/generalApi.ts index 9cabadb..ff10cfd 100644 --- a/src/api/generalApi.ts +++ b/src/api/generalApi.ts @@ -1,5 +1,6 @@ import apiClient from "./apiClient"; import {ShippingWarehouse} from "../types/shippingWarehouse"; +import {City} from "../types/city"; const router = '/general'; @@ -8,5 +9,9 @@ const generalApi = { let response = await apiClient.get(`${router}/getShippingWarehouses`); return response.data; }, + getCities: async (): Promise => { + let response = await apiClient.get(`${router}/getCities`); + return response.data; + } } export default generalApi; \ No newline at end of file diff --git a/src/api/ordersApi.ts b/src/api/ordersApi.ts index 0fa2846..2953062 100644 --- a/src/api/ordersApi.ts +++ b/src/api/ordersApi.ts @@ -3,6 +3,7 @@ import {Order} from "../types/order"; import * as inspector from "inspector"; import {OrderStatus} from "../features/ordersFilter/ordersFilterSlice"; import {ShippingWarehouse} from "../types/shippingWarehouse"; +import {City} from "../types/city"; const router = '/orders'; @@ -25,12 +26,14 @@ const ordersApi = { desc: boolean, status: OrderStatus, shipmentDate: string, - shippingWarehouse: ShippingWarehouse + shippingWarehouse: ShippingWarehouse, + city: City }): Promise => { let response = await apiClient.get(`${router}/getByProductId`, { params: { ...params, - shippingWarehouse: params.shippingWarehouse.id + shippingWarehouse: params.shippingWarehouse.id, + city: params.city.id } }); return response.data; diff --git a/src/components/CitySelect/CitySelect.tsx b/src/components/CitySelect/CitySelect.tsx new file mode 100644 index 0000000..9f08b2a --- /dev/null +++ b/src/components/CitySelect/CitySelect.tsx @@ -0,0 +1,42 @@ +import {FC, useEffect} from "react"; +import {useDispatch, useSelector} from "react-redux"; +import {RootState} from "../../redux/store"; +import {Picker} from "@react-native-picker/picker"; +import generalApi from "../../api/generalApi"; + +import {responsiveWidth} from "react-native-responsive-dimensions"; +import {View} from "react-native"; +import {initializeCitySelect, selectCity} from "../../features/citySelect/citySelectSlice"; + +const CitySelect: FC = () => { + const state = useSelector((state: RootState) => state.citySelect); + const dispatch = useDispatch(); + useEffect(() => { + if (state.initialized) return; + generalApi.getCities().then(cities => + dispatch(initializeCitySelect(cities))) + }, []); + return ( + + dispatch(selectCity({cityId: value}))} + > + {state.cities.map(city => ( + + ))} + + + + ) +} + +export default CitySelect; \ No newline at end of file diff --git a/src/components/Modals/SortingModal/SortingModal.tsx b/src/components/Modals/SortingModal/SortingModal.tsx index 2eaf895..0fa329d 100644 --- a/src/components/Modals/SortingModal/SortingModal.tsx +++ b/src/components/Modals/SortingModal/SortingModal.tsx @@ -13,11 +13,12 @@ import DateTimePicker from '@react-native-community/datetimepicker'; import {RootState} from "../../../redux/store"; import { closeOrdersFilterModal, - orderStatuses, + orderStatuses, setCity, setDesc, setOrderBy, setShipmentDate, setShippingWarehouse, setStatus } from "../../../features/ordersFilter/ordersFilterSlice"; import ShippingWarehouseSelect from "../../ShippingWarehouseSelect/ShippingWarehouseSelect"; +import CitySelect from "../../CitySelect/CitySelect"; export type SortingModalHandles = { present: () => void; @@ -49,6 +50,7 @@ const createRadioButton = (element: SortingModalElement) => { const SortingModal = () => { const state = useSelector((state: RootState) => state.ordersFilter); const shipmentWarehouseSelectorState = useSelector((state: RootState) => state.shippingWarehouseSelect); + const citySelectorState = useSelector((state: RootState) => state.citySelect); const elements = [ {id: 'createdOnAsc', value: 'createdOnAsc', label: 'Дата создания по возрастанию'}, @@ -77,6 +79,9 @@ const SortingModal = () => { useEffect(() => { dispatch(setShippingWarehouse(shipmentWarehouseSelectorState.selectedShippingWarehouse)); }, [shipmentWarehouseSelectorState.selectedShippingWarehouse]); + useEffect(() => { + dispatch(setCity(citySelectorState.selectedCity)); + }, [citySelectorState.selectedCity]); return ( { - - dispatch(setStatus(value))}> - {orderStatuses.map((status) => { - return ( - - ) - })} - - + {/**/} + {/* dispatch(setStatus(value))}>*/} + {/* {orderStatuses.map((status) => {*/} + {/* return (*/} + {/* */} + {/* )*/} + {/* })}*/} + {/* */} + {/**/} + - setShowShipmentPicker(oldValue => !oldValue)} - label={"Выбрать дату отгрузки"}/> - {showShipmentPicker && - { - if (!event.nativeEvent.timestamp) return; - setShowShipmentPicker(false); - if (event.type === 'set') { - const selectedDate = new Date(event.nativeEvent.timestamp); - dispatch(setShipmentDate(selectedDate.toISOString())); - } - }}/>} + {/* setShowShipmentPicker(oldValue => !oldValue)}*/} + {/* label={"Выбрать дату отгрузки"}/>*/} + {/*{showShipmentPicker &&*/} + {/* {*/} + {/* if (!event.nativeEvent.timestamp) return;*/} + {/* setShowShipmentPicker(false);*/} + {/* if (event.type === 'set') {*/} + {/* const selectedDate = new Date(event.nativeEvent.timestamp);*/} + {/* dispatch(setShipmentDate(selectedDate.toISOString()));*/} + {/* }*/} + {/* }}/>}*/} diff --git a/src/components/OrderCard/OrderCard.tsx b/src/components/OrderCard/OrderCard.tsx index 911a4bd..1b4be70 100644 --- a/src/components/OrderCard/OrderCard.tsx +++ b/src/components/OrderCard/OrderCard.tsx @@ -43,10 +43,11 @@ const OrderCard: FC = ({onPress, onSelect, order}) => { Создан: {order.createdOn} Отгрузка: {order.shipmentDate} Склад отгрузки: {order.shippingWarehouse} + Город: {order.city} - = OrderStatus.CANCELLED && {color: "red"}}> + = OrderStatus.CANCELLED && {color: "red"}}> {OrderStatusDictionary[order.status as OrderStatus]} diff --git a/src/features/citySelect/citySelectSlice.ts b/src/features/citySelect/citySelectSlice.ts new file mode 100644 index 0000000..4e92eba --- /dev/null +++ b/src/features/citySelect/citySelectSlice.ts @@ -0,0 +1,36 @@ +import {City, noCity} from "../../types/city"; +import {createSlice, PayloadAction} from "@reduxjs/toolkit"; + +export interface CitySelectState { + cities: City[]; + selectedCity: City; + initialized: boolean; +} + +const initialState: CitySelectState = { + cities: [], + selectedCity: noCity, + initialized: false +} + + +export const citySelect = createSlice({ + name: 'citySelect', + initialState, + reducers: { + initializeCitySelect: (state, action: PayloadAction) => { + state.cities = action.payload; + state.initialized = true; + if (state.cities.length > 0) state.selectedCity = state.cities[0]; + }, + selectCity: (state, action: PayloadAction<{ cityId: number }>) => { + let selectedCity = state.cities.find(city => city.id == action.payload.cityId); + if (!selectedCity) return; + state.selectedCity = selectedCity; + } + + } +}) + +export const {initializeCitySelect, selectCity} = citySelect.actions; +export default citySelect.reducer; \ No newline at end of file diff --git a/src/features/ordersFilter/ordersFilterSlice.ts b/src/features/ordersFilter/ordersFilterSlice.ts index 9070d0a..7ac5ba3 100644 --- a/src/features/ordersFilter/ordersFilterSlice.ts +++ b/src/features/ordersFilter/ordersFilterSlice.ts @@ -1,6 +1,7 @@ import {createSlice, PayloadAction} from "@reduxjs/toolkit"; -import {ShippingWarehouse} from "../../types/shippingWarehouse"; +import {noShippingWarehouse, ShippingWarehouse} from "../../types/shippingWarehouse"; import ShippingWarehouseSelect from "../../components/ShippingWarehouseSelect/ShippingWarehouseSelect"; +import {City, noCity} from "../../types/city"; export enum OrderStatus { ALL = -1, @@ -44,7 +45,8 @@ export interface OrdersFilterState { status: OrderStatus; shipmentDate: string; page: number; - shippingWarehouse: ShippingWarehouse + shippingWarehouse: ShippingWarehouse; + city: City; } const initialState: OrdersFilterState = { @@ -54,10 +56,8 @@ const initialState: OrdersFilterState = { shipmentDate: (new Date()).toISOString(), status: OrderStatus.AWAITING_PACKAGING, page: 0, - shippingWarehouse: { - id: -1, - name: 'Все склады отгрузки' - } + shippingWarehouse: noShippingWarehouse, + city: noCity } export const ordersFilterSlice = createSlice({ @@ -85,6 +85,9 @@ export const ordersFilterSlice = createSlice({ setShippingWarehouse: (state, action: PayloadAction) => { state.shippingWarehouse = action.payload; }, + setCity: (state, action: PayloadAction) => { + state.city = action.payload; + }, setPage: (state, action: PayloadAction) => { console.log(action) state.page = action.payload; @@ -107,6 +110,7 @@ export const { setDesc, setStatus, setShipmentDate, + setCity, setPage, setShippingWarehouse } = ordersFilterSlice.actions; diff --git a/src/features/shippingWarehouseSelect/shippingWarehouseSelectSlice.ts b/src/features/shippingWarehouseSelect/shippingWarehouseSelectSlice.ts index bda0b6e..0b1f704 100644 --- a/src/features/shippingWarehouseSelect/shippingWarehouseSelectSlice.ts +++ b/src/features/shippingWarehouseSelect/shippingWarehouseSelectSlice.ts @@ -1,5 +1,5 @@ import {createSlice, PayloadAction} from "@reduxjs/toolkit"; -import {ShippingWarehouse} from "../../types/shippingWarehouse"; +import {noShippingWarehouse, ShippingWarehouse} from "../../types/shippingWarehouse"; export interface ShippingWarehouseSelectState { shippingWarehouses: ShippingWarehouse[] @@ -9,10 +9,7 @@ export interface ShippingWarehouseSelectState { const initialState: ShippingWarehouseSelectState = { shippingWarehouses: [], - selectedShippingWarehouse: { - id: -1, - name: "Все склады отгрузки" - }, + selectedShippingWarehouse: noShippingWarehouse, initialized: false } diff --git a/src/redux/store.ts b/src/redux/store.ts index c6fcce3..5e47c56 100644 --- a/src/redux/store.ts +++ b/src/redux/store.ts @@ -10,6 +10,7 @@ import printingReducer from 'features/printing/printingSlice'; import reprintModalReducer from 'features/reprintModal/reprintModalSlice'; import ordersFilterReducer from 'features/ordersFilter/ordersFilterSlice'; import shippingWarehouseSelectReducer from 'features/shippingWarehouseSelect/shippingWarehouseSelectSlice'; +import citySelectReducer from 'features/citySelect/citySelectSlice'; import {useDispatch} from "react-redux"; export const store = configureStore({ @@ -23,7 +24,8 @@ export const store = configureStore({ reprintModal: reprintModalReducer, imageZoomModal: imageZoomModalReducer, ordersFilter: ordersFilterReducer, - shippingWarehouseSelect: shippingWarehouseSelectReducer + shippingWarehouseSelect: shippingWarehouseSelectReducer, + citySelect: citySelectReducer }, }); diff --git a/src/screens/BarcodeScreen/useBarcodeOrders.tsx b/src/screens/BarcodeScreen/useBarcodeOrders.tsx index 0b71580..0f35919 100644 --- a/src/screens/BarcodeScreen/useBarcodeOrders.tsx +++ b/src/screens/BarcodeScreen/useBarcodeOrders.tsx @@ -19,10 +19,11 @@ const useBarcodeOrders = (props: Props) => { desc, shipmentDate, status, - shippingWarehouse + shippingWarehouse, + city } = useSelector((state: RootState) => state.ordersFilter); const fetchOrders = async (): Promise => { - return ordersApi.getOrdersByProduct({productId, orderBy, shipmentDate, status, shippingWarehouse, desc}); + return ordersApi.getOrdersByProduct({productId, orderBy, shipmentDate, status, shippingWarehouse,city, desc}); } useEffect(() => { if (isVisible || productId < 0) return; diff --git a/src/screens/CommonPage/CommonPage.tsx b/src/screens/CommonPage/CommonPage.tsx index de66b45..087b478 100644 --- a/src/screens/CommonPage/CommonPage.tsx +++ b/src/screens/CommonPage/CommonPage.tsx @@ -64,6 +64,7 @@ function CommonPage() { const checkUpdates = async () => { const currentVersion = Constants.manifest2?.extra?.expoClient?.version || Constants.manifest?.version; + applicationApi.getVersion('assemblr').then(({latest_version}) => { if (currentVersion == latest_version) return; diff --git a/src/screens/OrderScreen/OrderScreen.tsx b/src/screens/OrderScreen/OrderScreen.tsx index 0e5f933..7e05238 100644 --- a/src/screens/OrderScreen/OrderScreen.tsx +++ b/src/screens/OrderScreen/OrderScreen.tsx @@ -244,6 +244,7 @@ const OrderScreen: FC = ({order}) => { Отгрузка: {order.shipmentDate} Статус: {OrderStatusDictionary[order.status as OrderStatus]} Склад отгрузки: {order.shippingWarehouse} + Город: {order.city} {} Товар Арт. DENCO: {selectedProduct?.dencoArticle} diff --git a/src/types/city.ts b/src/types/city.ts new file mode 100644 index 0000000..9661771 --- /dev/null +++ b/src/types/city.ts @@ -0,0 +1,9 @@ +export type City = { + id: number; + name: string; +} + +export const noCity = { + id: -1, + name: "Все города" +} \ No newline at end of file diff --git a/src/types/order.ts b/src/types/order.ts index dac521a..73ba942 100644 --- a/src/types/order.ts +++ b/src/types/order.ts @@ -27,5 +27,6 @@ export type Order = { shipmentDate: string; createdOn: string; shippingWarehouse: string; + city: string; }; diff --git a/src/types/shippingWarehouse.ts b/src/types/shippingWarehouse.ts index c20723c..8800c1a 100644 --- a/src/types/shippingWarehouse.ts +++ b/src/types/shippingWarehouse.ts @@ -1,4 +1,9 @@ export type ShippingWarehouse = { id: number; name: string; +} + +export const noShippingWarehouse = { + id: -1, + name: "Все склады отгрузки" } \ No newline at end of file