Revize 160b7073
Přidáno uživatelem Fantič před více než 1 rok
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
re #10844: PlanViewPage: GetItemInventories, GetPlanItems