Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Polishing search PopUp #203

Merged
merged 4 commits into from
May 29, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions frontend/src/components/DataView/DataPanel.css
Original file line number Diff line number Diff line change
Expand Up @@ -20,3 +20,10 @@
.MuiGrid-item {
padding: 1rem !important;
}

.search-box-label {
display: flex;
justify-content: center;
align-items: center;
gap: 0.3rem;
}
242 changes: 179 additions & 63 deletions frontend/src/components/DataView/DataPanel.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,21 +2,18 @@
This component displays a mui DataGrid with a Filterbar.
Depending on the value of the "button" column, a map icon with the hover "open as map" is shown

• mui DataGrid https://mui.com/x/api/data-grid/data-grid/
Installation: https://mui.com/x/react-data-grid/getting-started/
Quick filter outside of the grid https://mui.com/x/react-data-grid/filtering-recipes/#quick-filter-outside-of-the-grid
Quick filter outside of the grid https://mui.com/x/react-data-grid/filtering-recipes/#quick-filter-outside-of-the-grid

! If you use this component you have to pass a unique ID to it. This is needed so the filterbar is assigned to the correct Data Grid
*/

import { DataGrid, GridColDef, GridRenderCellParams } from "@mui/x-data-grid";
import Grid from "@mui/material/Grid";
import Box from "@mui/material/Box";
import IconButton from "@mui/material/IconButton";
import FilterBar from "./FilterBar";
import { MapTrifold } from "@phosphor-icons/react";
import { Funnel, MapTrifold } from "@phosphor-icons/react";
import "./DataPanel.css";
import { Tooltip } from "@mui/material";
import { Tooltip, TextField } from "@mui/material";
import { GridToolbar, GridToolbarProps } from "@mui/x-data-grid";
import { useState, Fragment } from "react";

// Returns a button if the "button" value is set to 1
const renderDetailsButton = (params: GridRenderCellParams) => {
Expand Down Expand Up @@ -45,7 +42,13 @@ const columns: GridColDef[] = [
renderCell: renderDetailsButton,
},
{ field: "key", headerName: "key", width: 150 },
{ field: "value", headerName: "value", type: "number", width: 150, getApplyQuickFilterFn: undefined },
{
field: "value",
headerName: "value",
type: "number",
width: 150,
getApplyQuickFilterFn: undefined,
},
];

// Data
Expand Down Expand Up @@ -76,64 +79,177 @@ const rows = [
{ id: 24, key: "distance to X", value: "400" },
];

// Pass a unique filterPanelId so the FilterBar component is located next to the correct Data Grid
function MyCustomToolbar(props: GridToolbarProps) {
return <GridToolbar {...props} />;
}

// All DataGrid options explained https://mui.com/x/api/data-grid/data-grid/
function DataPanel({
filterPanelId,
listTitle,
}: {
filterPanelId: number;
listTitle: string;
}) {
const filterPanelIdString = `filter-panel-${filterPanelId}`;
export default function DataPanel({ listTitle }: { listTitle: string }) {
const [filterValue, setFilterValue] = useState("");

const handleFilterChange = (event: React.ChangeEvent<HTMLInputElement>) => {
setFilterValue(event.target.value);
};

return (
<div className="data-panel-container">
<div className="data-panel-title">{listTitle}</div>
<Grid container spacing={2} className="data-panel-grid">
<Grid item>
<Box id={filterPanelIdString} />
<Fragment>
<Grid item>
<Box id="filter-panel">
<TextField
label={
<div className="search-box-label">
<Funnel size={20} /> Search
</div>
}
variant="outlined"
size="small"
value={filterValue}
onChange={handleFilterChange}
fullWidth
/>
</Box>
</Grid>
<div className="data-panel-container">
<div className="data-panel-title">{listTitle}</div>
<Grid container spacing={2} className="data-panel-grid">
<Grid item style={{ width: "100%" }}>
<DataGrid
disableColumnMenu
columnHeaderHeight={0}
rows={rows}
columns={columns}
slots={{
toolbar: MyCustomToolbar,
}}
slotProps={{
toolbar: {
printOptions: { disableToolbarButton: true },
csvOptions: { disableToolbarButton: true },
},
}}
disableDensitySelector
disableColumnFilter
disableColumnSelector
disableColumnSorting
initialState={{
pagination: {
paginationModel: { page: 0, pageSize: 5 },
},
filter: {
filterModel: {
items: [],
quickFilterValues: [filterValue],
quickFilterExcludeHiddenColumns: true,
},
},
}}
filterModel={{
items: [
{ field: "key", operator: "contains", value: filterValue },
],
}}
pageSizeOptions={[5, 10]}
density="compact"
disableRowSelectionOnClick
autoHeight
/>
</Grid>
</Grid>
<Grid item style={{ width: "100%" }}>
<DataGrid
disableColumnMenu
columnHeaderHeight={0}
rows={rows}
columns={columns}
slots={{
toolbar: (slotProps) => (
<FilterBar {...slotProps} filterPanelId={filterPanelId} />
), // Pass props here
}}
slotProps={{
toolbar: {
printOptions: { disableToolbarButton: true },
csvOptions: { disableToolbarButton: true },
},
}}
disableDensitySelector
disableColumnFilter
disableColumnSelector
disableColumnSorting
initialState={{
pagination: {
paginationModel: { page: 0, pageSize: 5 },
},
filter: {
filterModel: {
items: [],
quickFilterExcludeHiddenColumns: true,
</div>
<div className="data-panel-container">
<div className="data-panel-title">General Data</div>
<Grid container spacing={2} className="data-panel-grid">
<Grid item style={{ width: "100%" }}>
<DataGrid
disableColumnMenu
columnHeaderHeight={0}
rows={rows}
columns={columns}
slots={{
toolbar: MyCustomToolbar,
}}
slotProps={{
toolbar: {
printOptions: { disableToolbarButton: true },
csvOptions: { disableToolbarButton: true },
},
},
}}
pageSizeOptions={[5, 10]}
//autoPageSize
density="compact"
disableRowSelectionOnClick
/>
}}
disableDensitySelector
disableColumnFilter
disableColumnSelector
disableColumnSorting
initialState={{
pagination: {
paginationModel: { page: 0, pageSize: 5 },
},
filter: {
filterModel: {
items: [],
quickFilterValues: [filterValue],
quickFilterExcludeHiddenColumns: true,
},
},
}}
filterModel={{
items: [
{ field: "key", operator: "contains", value: filterValue },
],
}}
pageSizeOptions={[5, 10]}
density="compact"
disableRowSelectionOnClick
autoHeight
/>
</Grid>
</Grid>
</Grid>
</div>
</div>
<div className="data-panel-container">
<div className="data-panel-title">Extra Capabilities</div>
<Grid container spacing={2} className="data-panel-grid">
<Grid item style={{ width: "100%" }}>
<DataGrid
disableColumnMenu
columnHeaderHeight={0}
rows={rows}
columns={columns}
slots={{
toolbar: MyCustomToolbar,
}}
slotProps={{
toolbar: {
printOptions: { disableToolbarButton: true },
csvOptions: { disableToolbarButton: true },
},
}}
disableDensitySelector
disableColumnFilter
disableColumnSelector
disableColumnSorting
initialState={{
pagination: {
paginationModel: { page: 0, pageSize: 5 },
},
filter: {
filterModel: {
items: [],
quickFilterValues: [filterValue],
quickFilterExcludeHiddenColumns: true,
},
},
}}
filterModel={{
items: [
{ field: "key", operator: "contains", value: filterValue },
],
}}
pageSizeOptions={[5, 10]}
density="compact"
disableRowSelectionOnClick
autoHeight
/>
</Grid>
</Grid>
</div>
</Fragment>
);
}

export default DataPanel;
6 changes: 1 addition & 5 deletions frontend/src/components/DataView/DataView.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import DataPanel from "./DataPanel";
import "./DataView.css";

import Button from "@mui/material/Button";
import TabPanel from "@mui/lab/TabPanel/TabPanel";
import TabContext from "@mui/lab/TabContext/TabContext";
Expand Down Expand Up @@ -63,13 +62,10 @@ function DataView() {
></Tab>
</TabList>
</div>

<TabPanel value="1" className="tab dataview-tab">
<div className="datapanels-container">
<div className="data-panels-container">
<DataPanel listTitle={getCurrentTabTitle()} filterPanelId={1} />
<DataPanel listTitle="General Data" filterPanelId={2} />
<DataPanel listTitle="Extra Capabilities" filterPanelId={3} />
<DataPanel listTitle={getCurrentTabTitle()} />
</div>
<Button variant="outlined">Load data</Button>
</div>
Expand Down
23 changes: 0 additions & 23 deletions frontend/src/components/DataView/FilterBar.tsx

This file was deleted.

28 changes: 24 additions & 4 deletions frontend/src/components/PopUp/SearchPopUp.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,24 @@ const SearchPopUp: React.FC<SearchPopUpProps> = ({
const [suggestions, setSuggestions] = useState<Array<GeoSearchResult>>([]);
const { currentMapCache } = useContext(MapContext);

const provider = new OpenStreetMapProvider({
params: {
'accept-language': 'de',
countrycodes: 'de',
addressdetails: 1,
},
});

const reset = () => {
setSearchText("");
setLongitude("");
setLatitude("");
setSearchMode("single");
setSuggestions([]);
setLatitudeError(false);
setLongitudeError(false);
};

const flyToLocation = () => {
const { mapInstance } = currentMapCache;
if (mapInstance) {
Expand All @@ -59,7 +77,6 @@ const SearchPopUp: React.FC<SearchPopUpProps> = ({
setSuggestions([]);
return;
}
const provider = new OpenStreetMapProvider();
const results = await provider.search({ query: input });
const transformedResults: GeoSearchResult[] = results.map((result) => ({
x: result.x,
Expand All @@ -70,8 +87,8 @@ const SearchPopUp: React.FC<SearchPopUpProps> = ({
};

const handleModeSwitch = () => {
reset();
if (searchMode === "single") {
setSuggestions([]);
setSearchMode("coordinates");
} else {
setSearchMode("single");
Expand All @@ -91,7 +108,7 @@ const SearchPopUp: React.FC<SearchPopUpProps> = ({
return item.displayName;
}

const [latitudeTerm, longitudeTerm] = searchText.split(" ");
const [latitudeTerm, longitudeTerm] = [latitude, longitude];
const regex = new RegExp(
`^-?${latitudeTerm}[\\S\\d°'\\\\".]*\\s-?${longitudeTerm}[\\S\\d°'\\\\".]*$`
);
Expand Down Expand Up @@ -187,7 +204,10 @@ const SearchPopUp: React.FC<SearchPopUpProps> = ({
return (
<PopUp
title="Locations"
onClose={onToggleIfOpenedDialog}
onClose={() => {
onToggleIfOpenedDialog();
reset();
}}
ifOpenedDialog={ifOpenedDialog}
>
{searchMode === "single" ? (
Expand Down
Loading