Inventory search works

This commit is contained in:
Bill 2021-04-28 15:30:04 -04:00
parent ea27520361
commit b62dab0a6f
4 changed files with 42 additions and 24 deletions

View File

@ -1,5 +1,5 @@
import { FurnitureListComposer, RoomObjectVariable, Vector3d } from 'nitro-renderer'; import { FurnitureListComposer, RoomObjectVariable, Vector3d } from 'nitro-renderer';
import { FC, useEffect } from 'react'; import { FC, useEffect, useState } from 'react';
import { GetRoomEngine } from '../../../../api'; import { GetRoomEngine } from '../../../../api';
import { SendMessageHook } from '../../../../hooks/messages/message-event'; import { SendMessageHook } from '../../../../hooks/messages/message-event';
import { LocalizeText } from '../../../../utils/LocalizeText'; import { LocalizeText } from '../../../../utils/LocalizeText';
@ -8,6 +8,7 @@ import { useInventoryContext } from '../../context/InventoryContext';
import { InventoryFurnitureActions } from '../../reducers/InventoryFurnitureReducer'; import { InventoryFurnitureActions } from '../../reducers/InventoryFurnitureReducer';
import { FurniCategory } from '../../utils/FurniCategory'; import { FurniCategory } from '../../utils/FurniCategory';
import { attemptItemPlacement } from '../../utils/FurnitureUtilities'; import { attemptItemPlacement } from '../../utils/FurnitureUtilities';
import { GroupItem } from '../../utils/GroupItem';
import { InventoryFurnitureViewProps } from './InventoryFurnitureView.types'; import { InventoryFurnitureViewProps } from './InventoryFurnitureView.types';
import { InventoryFurnitureResultsView } from './results/InventoryFurnitureResultsView'; import { InventoryFurnitureResultsView } from './results/InventoryFurnitureResultsView';
import { InventoryFurnitureSearchView } from './search/InventoryFurnitureSearchView'; import { InventoryFurnitureSearchView } from './search/InventoryFurnitureSearchView';
@ -19,6 +20,8 @@ export const InventoryFurnitureView: FC<InventoryFurnitureViewProps> = props =>
const { furnitureState = null, dispatchFurnitureState = null } = useInventoryContext(); const { furnitureState = null, dispatchFurnitureState = null } = useInventoryContext();
const { needsFurniUpdate = false, groupItem = null, groupItems = [] } = furnitureState; const { needsFurniUpdate = false, groupItem = null, groupItems = [] } = furnitureState;
const [ filteredGroupItems, setFilteredGroupItems ] = useState<GroupItem[]>(groupItems);
useEffect(() => useEffect(() =>
{ {
if(needsFurniUpdate) if(needsFurniUpdate)
@ -34,6 +37,8 @@ export const InventoryFurnitureView: FC<InventoryFurnitureViewProps> = props =>
} }
else else
{ {
setFilteredGroupItems(groupItems);
dispatchFurnitureState({ dispatchFurnitureState({
type: InventoryFurnitureActions.SET_GROUP_ITEM, type: InventoryFurnitureActions.SET_GROUP_ITEM,
payload: { payload: {
@ -97,8 +102,8 @@ export const InventoryFurnitureView: FC<InventoryFurnitureViewProps> = props =>
return ( return (
<div className="row h-100"> <div className="row h-100">
<div className="col col-7"> <div className="col col-7">
<InventoryFurnitureSearchView /> <InventoryFurnitureSearchView groupItems={ groupItems } setGroupItems={ setFilteredGroupItems } />
<InventoryFurnitureResultsView groupItems={ groupItems } /> <InventoryFurnitureResultsView groupItems={ filteredGroupItems } />
</div> </div>
<div className="d-flex flex-column col col-5 justify-space-between"> <div className="d-flex flex-column col col-5 justify-space-between">
<RoomPreviewerView roomPreviewer={ roomPreviewer } height={ 140 } /> <RoomPreviewerView roomPreviewer={ roomPreviewer } height={ 140 } />

View File

@ -8,11 +8,10 @@ export const InventoryFurnitureResultsView: FC<InventoryFurnitureResultsViewProp
return ( return (
<div className="row row-cols-5 align-content-start g-0 item-container"> <div className="row row-cols-5 align-content-start g-0 item-container">
{ groupItems && groupItems.length && groupItems.map((item, index) => { (groupItems && groupItems.length && groupItems.map((item, index) =>
{ {
return <InventoryFurnitureItemView key={ index } groupItem={ item } /> return <InventoryFurnitureItemView key={ index } groupItem={ item } />
}) })) || null }
}
</div> </div>
); );
} }

View File

@ -1,33 +1,43 @@
import { ChangeEvent, FC, FormEvent, useEffect, useState } from 'react'; import { FC, useEffect, useState } from 'react';
import { InventoryFurnitureSearchViewProps } from './InventoryFurnitureSearchView.types'; import { InventoryFurnitureSearchViewProps } from './InventoryFurnitureSearchView.types';
export const InventoryFurnitureSearchView: FC<InventoryFurnitureSearchViewProps> = props => export const InventoryFurnitureSearchView: FC<InventoryFurnitureSearchViewProps> = props =>
{ {
const { groupItems = [], setGroupItems = null } = props;
const [ searchValue, setSearchValue ] = useState(''); const [ searchValue, setSearchValue ] = useState('');
function onChange(event: ChangeEvent<HTMLInputElement>): void
{
setSearchValue(event.target.value);
}
function handleSubmit(event: FormEvent<HTMLFormElement>): void
{
event.preventDefault();
}
useEffect(() => useEffect(() =>
{ {
let filteredGroupItems = [ ...groupItems ];
}, [ searchValue ]);
if(searchValue && searchValue.length)
{
const comparison = searchValue.toLocaleLowerCase();
filteredGroupItems = filteredGroupItems.filter(item =>
{
if(comparison && comparison.length)
{
if(item.name.toLocaleLowerCase().includes(comparison)) return item;
}
return null;
});
}
setGroupItems(filteredGroupItems);
}, [ groupItems, setGroupItems, searchValue ]);
return ( return (
<form className="d-flex mb-1" onSubmit={ handleSubmit }> <div className="d-flex me-1 mb-1">
<div className="d-flex flex-grow-1 me-1"> <div className="d-flex flex-grow-1 me-1">
<input type="text" className="form-control form-control-sm" placeholder="search" /> <input type="text" className="form-control form-control-sm" placeholder="search" value={ searchValue } onChange={ event => setSearchValue(event.target.value) } />
</div> </div>
<div className="d-flex"> <div className="d-flex">
<button type="submit" className="btn btn-primary btn-sm"><i className="fas fa-search"></i></button> <button type="button" className="btn btn-primary btn-sm">
<i className="fas fa-search"></i>
</button>
</div> </div>
</form> </div>
); );
} }

View File

@ -1,4 +1,8 @@
import { Dispatch, SetStateAction } from 'react';
import { GroupItem } from '../../../utils/GroupItem';
export interface InventoryFurnitureSearchViewProps export interface InventoryFurnitureSearchViewProps
{ {
groupItems: GroupItem[];
setGroupItems: Dispatch<SetStateAction<GroupItem[]>>;
} }