Projekt

Obecné

Profil

« Předchozí | Další » 

Revize 160b7073

Přidáno uživatelem Fantič před více než 1 rok

re #10844: PlanViewPage: GetItemInventories, GetPlanItems

Zobrazit rozdíly:

src/api/planservice.ts
13 13
    )
14 14
}
15 15

  
16
export const getPlanItemsRequest = async (page: number, pageSize: number, room: number, place?: number) => {
17
    let url = `search_v2?activeTab=0&tabbed=false&cursor=0&page=${page}&items=${pageSize}&room=${room}`
18 16

  
19
    if(place){
20
        url += `&place=${place}`
17

  
18

  
19
/*
20

  
21

  
22
// inventories
23
@activeTab: index of selected inventory: result: Inventories (starting from 0)
24

  
25
// pagination
26
@page: page number (starting from 1) -> current page is returned as result
27
@items: page size
28
@cursor: (page - 1) * pageSize ? 
29

  
30

  
31
// location
32
@room: id of room in which we are looking for items
33
@place: id of place inside a room in which we are looking for items
34
*/
35
export const getPlanItemsRequest = async (params: {activeTab: number, page: number, room: number, items: number, place?: number, inventory?: string}) => {
36

  
37

  
38
    let url = `search_v2?activeTab=${params.activeTab}&page=${params.page}&tabbed=true&room=${params.room}&cursor=${(params.page - 1)*params.items}&items=${params.items}`
39

  
40
    if(params.place){
41
        url += `&place=${params.place}`
21 42
    }
22 43

  
44
    if(params.inventory){
45
        url += `&inventory=${params.inventory}`
46
    }
47

  
48
    console.log(url)
49

  
23 50
    return await axiosInstance.get(
24 51
        url
25 52
    )
src/components/plan/PlanView.tsx
1
import { VStack, Box, Text, HStack, ScrollView, Flex, Button, CloseIcon, IconButton, TextArea, useToast, Image } from "native-base";
2
import { Note } from "../../types/note";
3
import React, { useCallback, useState } from "react";
4

  
5

  
6

  
7

  
8
const PlanView = (props: { imageUrl: string }) => {
9
    return (
10
        <Image size={250} alt="image" source={{ uri: props.imageUrl }} />
11
    );
12
}
13

  
14
export default PlanView
src/pages/PlanViewPage.tsx
6 6
import { log } from "../logging/logger"
7 7
import { DrawerScreenProps } from "@react-navigation/drawer"
8 8
import { RootDrawerParamList } from "./Navigation"
9
import { Box, CloseIcon, Select, useToast, Button, Flex } from "native-base"
9
import { Box, CloseIcon, Select, useToast, Button, Flex, Text } from "native-base"
10 10
import { ErrorToast } from "../components/toast/ErrorToast"
11 11
import { Floor, Place, Room } from "../types/plan"
12
import { getFloorList } from "../stores/actions/planThunks"
12
import { getFloorList, getPlanInventories, getPlanItems } from "../stores/actions/planThunks"
13 13
import { login } from "../stores/actions/userThunks"
14
import { getPlanItemsRequest } from "../api/planservice"
15
import ItemPreview from "../components/listView/ItemPreview"
16
import { parseArtists, parseImage } from "../components/listView/ListViewInventoryGroup"
17
import PlanView from "../components/plan/PlanView"
18
import { BASE_API_URL } from "../api/constants"
14 19

  
15 20
const PlanViewPage = ({ route, navigation }: DrawerScreenProps<RootDrawerParamList, 'Plan'>) => {
16 21

  
17 22
  const layout = useWindowDimensions();
18 23

  
19
    // Route: set selected room / place from 
20
    useEffect(() => {
21
        console.log("dispatching get floor list")
22
        // dispatch(login({username: "Viktorie", password: "Golem123."}))
23
        dispatch(getFloorList())
24
    }, [])
25

  
24
  // Route: set selected room / place from 
25
  useEffect(() => {
26
    console.log("dispatching get floor list")
27
    // dispatch(login({username: "Viktorie", password: "Golem123."}))
28
    dispatch(getFloorList())
29
  }, [])
26 30

  
27
  let page = 1
28
  let pageSize = 20
29
  let room = 0
31
  const pageSize = 20
32
  const currentPage = 0
33
  const totalPages = 100
30 34

  
31 35
  const DEFAULT_FLOOR = "first_floor"
32 36

  
......
36 40

  
37 41
  const dispatch = useDispatch<AppDispatch>();
38 42

  
39
  const { floorListLoading, floorList, itemListLoading, itemList, lastError } = useSelector((state: RootState) => state.planViewState)
43
  const { floorListLoading, floorList, itemListLoading, itemList, itemInventories, itemInventoriesLoading, totalItemsCount, lastError } = useSelector((state: RootState) => state.planViewState)
40 44

  
41 45
  const toast = useToast();
42 46

  
......
45 49
      if (route.params && route.params.roomId) {
46 50

  
47 51
        selectRoom(route.params.roomId)
48
  
52

  
49 53
        if (route.params.placeId) {
50 54
          selectPlace(route.params.placeId)
51 55
        }
52
  
53
        // todo dispatch get items
54
        // getPlanItems(page, pageSize, room)
56

  
57
        if (!itemListLoading) {
58
          searchSubmit(currentPage, route.params.roomId, route.params.placeId)
59
        }
60

  
55 61
      }
56
      else{
62
      else {
57 63
        selectFloor(DEFAULT_FLOOR)
58 64
      }
59 65
    }
60 66
  }, [floorList, route.params.roomId, route.params.placeId])
61 67

  
68
  useEffect(() => {
69
    if (floorList && selectedRoom) {
70
      if (!itemInventoriesLoading) {
71
        dispatch(getPlanInventories({ room: selectedRoom.id, place: selectedPlace?.id }))
72
      }
73
    }
74
  }, [selectedPlace, selectedRoom])
75

  
76

  
62 77
  useEffect(() => {
63 78
    if (lastError) {
64 79
      toast.closeAll()
......
74 89
  }, [lastError])
75 90

  
76 91

  
77
  const searchSubmit = () => {
92
  const searchSubmit = (pageNumber: number, roomId: number, placeId?: number) => {
78 93
    log.debug("PlanView", "searchSubmit")
79 94

  
95
    console.log("searching " + roomId + ", " + placeId)
96

  
97
    dispatch(getPlanItems({ page: pageNumber, items: pageSize, room: roomId, place: placeId, activeTab: 0 }))
80 98
  }
81 99

  
82 100
  const selectFloor = (floorId: string) => {
......
232 250
                Reset
233 251
              </Button>
234 252
              <Button
235
                onPress={() => searchSubmit()}
253
                onPress={() => {
254
                  if (selectedRoom && !selectedPlace) {
255
                    searchSubmit(currentPage, selectedRoom.id)
256
                  }
257
                  else if (selectedRoom && selectedPlace) {
258
                    searchSubmit(currentPage, selectedRoom.id, selectedPlace.id)
259
                  }
260

  
261
                }}
236 262
                colorScheme="primary"
237 263
                background={"primary.100"}
238 264
                variant="solid"
......
248 274

  
249 275

  
250 276
      {/* Plan */}
277
      {/* temporary prototype */}
251 278

  
279
      {selectedFloor && !floorListLoading &&
280
        <PlanView imageUrl={BASE_API_URL + "/downloads/" + selectedFloor.id} />
281
      }
252 282

  
253 283
      {/* Item List */}
284
      <>
285
        {itemInventoriesLoading ?
286
          <LoadingBox text="Loading available inventories..." />
287
          :
288
          <>
289
            <Text>TODO view inventories in SearchItemPreview way</Text>
290
            {itemInventories.map((inventory) => {
291
              <Text>{inventory.label}</Text>
292
            })}
293
          </>
294

  
295
        }
296
        {/* 
297
        {itemList.map((item, index) => {
298
          return (
299
            <Box>
300
              <ItemPreview
301
                // @ts-ignore
302
                caption={item.object[0].caption}
303
                title={item.text}
304
                name={parseArtists(item)}
305
                image={parseImage(item)}
306
                itemId={item.xml_id}
307
                inventoryLabel={item.inventory.label}
308
                navigation={navigation}
309
              />
310
            </Box> */}
311
      </>
312

  
254 313

  
255
      {/* <ItemPreview
256
          // @ts-ignore
257
          caption={item.object[0].caption}
258
          title={item.text}
259
          name={parseArtists(item)}
260
          image={parseImage(item)}
261
          itemId={item.xml_id}
262
          inventoryLabel={props.inventoryLabel}
263
          navigation={props.navigation}
264
      /> */}
265 314
    </Box >
266 315

  
267 316

  
src/stores/actions/planThunks.ts
1 1
import { createAsyncThunk } from "@reduxjs/toolkit"
2 2
import { SortOptions } from "../../types/general";
3 3
import { Note } from "../../types/note";
4
import { getPlanAllRequest } from "../../api/planservice";
5
import { Floor, Room } from "../../types/plan";
4
import { getPlanAllRequest, getPlanItemsRequest } from "../../api/planservice";
5
import { Floor, InventoryTab, Room } from "../../types/plan";
6
import { ItemPreviewType } from "../../types/listViewTypes";
7
import { StringLiteralType } from "typescript";
6 8

  
7 9
export const getFloorList = createAsyncThunk(
8 10
    "plan/getFloorList",
......
33 35
                    let floorList = []
34 36

  
35 37
                    for (let key in floorsDict) {
36
                        let floor : Floor = floorsDict[key]
38
                        let floor: Floor = floorsDict[key]
37 39
                        floorList.push(floor)
38 40
                    }
39 41

  
......
45 47
                return Promise.reject(err.response.data)
46 48
            }
47 49

  
50
        } catch (err: any) {
51
            console.log(err);
52
            return Promise.reject(err.response.data)
53
        }
54
    }
55
)
56

  
57

  
58
export const getPlanInventories = createAsyncThunk(
59
    "plan/getPlanInventories",
60
    async (params: { room: number, place?: number }) => {
61
        try {
62
            try {
63
                const response = await getPlanItemsRequest({ activeTab: 0, page: 1, room: params.room, items: 1, place: params.place })
64
                if (response.status === 200) {
65

  
66
                    let inventories: InventoryTab[] = []
67

  
68
                    for(let i = 0; i < response.data.pagination.inventories; i++){
69
                        let inventory = response.data.pagination.inventories[i]
70
                        
71
                        inventories.push({
72
                            tab: i,
73
                            label: inventory.label,
74
                            key: inventory.name
75
                        })
76
                    }
77

  
78
                    let allInventoriesRecords = response.data.pagination.records
79

  
80
                    console.log(inventories)
81
                    console.log(allInventoriesRecords)
82

  
83
                    return {
84
                        inventories: inventories,
85
                        allInventoriesRecords : allInventoriesRecords
86
                    }
87
                } else {
88
                    return Promise.reject(response.data ? response.data : "Get plan items request failed")
89
                }
90
            } catch (err: any) {
91
                return Promise.reject(err.response.data)
92
            }
93

  
94
        } catch (err: any) {
95
            console.log(err);
96
            return Promise.reject(err.response.data)
97
        }
98
    })
99

  
100
export const getPlanItems = createAsyncThunk(
101
    "plan/getPlanItems",
102
    async (params: { activeTab: number, page: number, room: number, items: number, place?: number, inventory?: string }) => {
103
        try {
104
            try {
105
                const response = await getPlanItemsRequest({ activeTab: params.activeTab, page: params.page, room: params.room, items: params.items, place: params.place, inventory: params.inventory })
106
                if (response.status === 200) {
107

  
108
                    let items: ItemPreviewType[] = response.data.data
109
                    let totalItemsCountByInventory: number = response.data.pagination.records
110

  
111
                    return {
112
                        items: items,
113
                        totalItemsCount: totalItemsCountByInventory,
114
                    }
115
                } else {
116
                    return Promise.reject(response.data ? response.data : "Get plan items request failed")
117
                }
118
            } catch (err: any) {
119
                return Promise.reject(err.response.data)
120
            }
121

  
48 122
        } catch (err: any) {
49 123
            console.log(err);
50 124
            return Promise.reject(err.response.data)
src/stores/reducers/planSlice.ts
1 1
import { PayloadAction, createSlice } from "@reduxjs/toolkit"
2 2
import { PlanViewState } from "../../types/plan";
3
import { getFloorList } from "../actions/planThunks";
3
import { getFloorList, getPlanInventories, getPlanItems } from "../actions/planThunks";
4 4

  
5 5
const initialState: PlanViewState = {
6 6
    lastError: "",
7 7

  
8 8

  
9

  
10 9
    // TODO backend -> retrieve list of floors, not static -> not implemented at the time of coding
11 10
    floorList: [
12 11
        { label: "Ground floor", id: "ground_floor", roomList: [] },
......
15 14
    ],
16 15
    floorListLoading: false,
17 16

  
18
    itemList: [],
17
    itemInventories: [],
19 18

  
19
    itemList: [],
20 20
}
21 21

  
22 22
export const planSlice = createSlice({
......
25 25
    reducers: {},
26 26
    extraReducers: (builder) => {
27 27

  
28
        // getFloorList
28 29
        builder.addCase(getFloorList.fulfilled, (state, action) => {
29 30

  
30 31
            state.floorList = action.payload
......
37 38
            state.floorListLoading = false;
38 39
            state.lastError = action.error.message
39 40
        })
41

  
42
        // getPlanItems
43
        builder.addCase(getPlanItems.fulfilled, (state, action) => {
44
            state.itemList = action.payload.items
45
            state.itemListLoading = false;
46
        })
47
        builder.addCase(getPlanItems.pending, (state, action) => {
48
            state.itemListLoading = true;
49
        })
50
        builder.addCase(getPlanItems.rejected, (state, action) => {
51
            state.itemListLoading = false;
52
            state.lastError = action.error.message
53
        })
54

  
55
        
56
        // getPlanInventories
57
        builder.addCase(getPlanInventories.fulfilled, (state, action) => {
58
            state.itemInventories = action.payload.inventories
59
            state.totalItemsCount = action.payload.allInventoriesRecords
60
            state.itemInventoriesLoading = false;
61
        })
62
        builder.addCase(getPlanInventories.pending, (state, action) => {
63
            state.itemInventoriesLoading = true;
64
        })
65
        builder.addCase(getPlanInventories.rejected, (state, action) => {
66
            state.itemInventoriesLoading = false;
67
            state.lastError = action.error.message
68
        })
40 69
    }
41 70
})
42 71

  
src/types/plan.ts
1
import { ItemPreviewType } from "./listViewTypes"
1 2

  
2 3

  
3 4
export type Floor = {
......
8 9
}
9 10

  
10 11
export type Room = {
11
    id : number
12
    id: number
12 13

  
13 14
    kx: number
14 15
    ky: number
......
20 21
    in_plan: true
21 22
    svg_path: string
22 23
    room_list: boolean
23
    
24

  
24 25
    places: Place[]
25 26

  
26 27
    number_x: number
......
33 34
}
34 35

  
35 36

  
37
export type InventoryTab = { tab: number, key: string, label: string }
38

  
39

  
36 40
export type PlanViewState = {
37
    planLoading?: boolean
38
    plan?: any
39 41

  
42
    // floorList
40 43
    floorListLoading?: boolean
41 44
    floorList: Floor[]
42 45

  
43
    
44
    itemListLoading?: boolean
45
    itemList: { label: string, id: string }[]
46

  
47
    // items
48
    itemInventories: InventoryTab[],
49
    itemInventoriesLoading?: boolean,
50

  
51
    itemListLoading?: boolean,
52
    itemList: ItemPreviewType[]
53
    totalItemsCount?: number
54

  
55
    // plan
56
    // @TODO
46 57

  
47 58
    lastError?: string
48 59
}

Také k dispozici: Unified diff