diff --git a/src/Components/AppShell/AppShell.tsx b/src/Components/AppShell/AppShell.tsx index cf65e729..d1e383c3 100644 --- a/src/Components/AppShell/AppShell.tsx +++ b/src/Components/AppShell/AppShell.tsx @@ -13,7 +13,8 @@ import { FilterProvider } from '../Map/hooks/useFilter' import { ItemsProvider } from '../Map/hooks/useItems' import { LayersProvider } from '../Map/hooks/useLayers' import { LeafletRefsProvider } from '../Map/hooks/useLeafletRefs' -import { SelectPositionProvider } from '../Map/hooks/useSetItemPosition' +import { SelectPositionProvider } from '../Map/hooks/useSelectPosition' +import { ClusterRefProvider } from '../Map/hooks/useClusterRef' export function AppShell({ appName, nameWidth, children, assetsApi }: { appName: string, nameWidth?: number, children: React.ReactNode, assetsApi: AssetsApi }) { @@ -32,23 +33,25 @@ export function AppShell({ appName, nameWidth, children, assetsApi }: { appName: - - - - -
- {children} -
-
+ + + + + +
+ {children} +
+
+
diff --git a/src/Components/Map/Layer.tsx b/src/Components/Map/Layer.tsx index 57fee0bb..fa46abab 100644 --- a/src/Components/Map/Layer.tsx +++ b/src/Components/Map/Layer.tsx @@ -6,7 +6,7 @@ import { ItemViewPopup } from './Subcomponents/ItemViewPopup' import { useAllItemsLoaded, useItems, useSetItemsApi, useSetItemsData } from './hooks/useItems' import { useEffect, useState } from 'react' import { ItemFormPopup } from './Subcomponents/ItemFormPopup' -import { useFilterTags, useIsLayerVisible } from './hooks/useFilter' +import { useFilterTags, useIsLayerVisible, useResetFilterTags } from './hooks/useFilter' import { useAddTag, useAllTagsLoaded, useGetItemTags, useTags } from './hooks/useTags' import { useAddMarker, useAddPopup, useLeafletRefs } from './hooks/useLeafletRefs' import { Popup } from 'leaflet' @@ -15,6 +15,7 @@ import { getValue } from '../../Utils/GetValue' import { hashTagRegex } from '../../Utils/HashTagRegex' import { randomColor } from '../../Utils/RandomColor' import { encodeTag } from '../../Utils/FormatTags' +import { useSetMarkerClicked } from './hooks/useSelectPosition' export const Layer = ({ data, @@ -27,6 +28,7 @@ export const Layer = ({ markerShape = 'circle', markerDefaultColor = '#777', api, + itemType, itemNameField = 'name', itemTextField = 'text', itemAvatarField, @@ -53,12 +55,15 @@ export const Layer = ({ const addMarker = useAddMarker(); const addPopup = useAddPopup(); const leafletRefs = useLeafletRefs(); + const resetFilterTags = useResetFilterTags(); - let location = useLocation(); + const location = useLocation(); const allTagsLoaded = useAllTagsLoaded(); const allItemsLoaded = useAllItemsLoaded(); + const setMarkerClicked = useSetMarkerClicked(); + const tags = useTags(); const addTag = useAddTag(); const [newTagsToAdd, setNewTagsToAdd] = useState([]); @@ -71,16 +76,16 @@ export const Layer = ({ useEffect(() => { - data && setItemsData({ data, children, name, menuIcon, menuText, menuColor, markerIcon, markerShape, markerDefaultColor, api, itemNameField, itemTextField, itemAvatarField, itemColorField, itemOwnerField, itemTagsField, itemOffersField, itemNeedsField, onlyOnePerOwner, customEditLink, setItemFormPopup, itemFormPopup, clusterRef }); - api && setItemsApi({ data, children, name, menuIcon, menuText, menuColor, markerIcon, markerShape, markerDefaultColor, api, itemNameField, itemTextField, itemAvatarField, itemColorField, itemOwnerField, itemTagsField, itemOffersField, itemNeedsField, onlyOnePerOwner, customEditLink, setItemFormPopup, itemFormPopup, clusterRef }); + data && setItemsData({ data, children, name, menuIcon, menuText, menuColor, markerIcon, markerShape, markerDefaultColor, api, itemType, itemNameField, itemTextField, itemAvatarField, itemColorField, itemOwnerField, itemTagsField, itemOffersField, itemNeedsField, onlyOnePerOwner, customEditLink, setItemFormPopup, itemFormPopup, clusterRef }); + api && setItemsApi({ data, children, name, menuIcon, menuText, menuColor, markerIcon, markerShape, markerDefaultColor, api, itemType, itemNameField, itemTextField, itemAvatarField, itemColorField, itemOwnerField, itemTagsField, itemOffersField, itemNeedsField, onlyOnePerOwner, customEditLink, setItemFormPopup, itemFormPopup, clusterRef }); }, [data, api]) useMapEvents({ popupopen: (e) => { const item = Object.entries(leafletRefs).find(r => r[1].popup == e.popup)?.[1].item; if (item?.layer?.name == name && window.location.pathname.split("/")[2] != item.id) { - let params = new URLSearchParams(window.location.search); - window.history.pushState({}, "", `/${name}/${item.id}`+ `${params.toString() !== "" ? `?${params}` : ""}`) + let params = new URLSearchParams(window.location.search); + window.history.pushState({}, "", `/${name}/${item.id}` + `${params.toString() !== "" ? `?${params}` : ""}`) let title = ""; if (item.name) title = item.name; else if (item.layer?.itemNameField) title = getValue(item, item.layer.itemNameField); @@ -98,8 +103,9 @@ export const Layer = ({ if (window.location.pathname.split("/")[2]) { const id = window.location.pathname.split("/")[2] const marker = leafletRefs[id]?.marker; - if (marker && marker != null) { - marker !== null && clusterRef?.current?.zoomToShowLayer(marker, () => { + resetFilterTags(); + if (marker && filterTags.length == 0) { + marker !== null && clusterRef?.zoomToShowLayer(marker, () => { marker.openPopup(); }); const item = leafletRefs[id]?.item; @@ -113,7 +119,6 @@ export const Layer = ({ } } } - } useEffect(() => { @@ -157,7 +162,7 @@ export const Layer = ({ } - if (allTagsLoaded && allItemsLoaded) { + if (allTagsLoaded && allItemsLoaded) { item[itemTextField].match(hashTagRegex)?.map(tag => { if ((!tags.find((t) => t.name.toLocaleLowerCase() === tag.slice(1).toLocaleLowerCase())) && !newTagsToAdd.find((t) => t.name.toLocaleLowerCase() === tag.slice(1).toLocaleLowerCase())) { const newTag = { id: crypto.randomUUID(), name: tag.slice(1), color: randomColor() }; @@ -188,7 +193,13 @@ export const Layer = ({ { if (!(item.id in leafletRefs && leafletRefs[item.id].marker == r)) r && addMarker(item, r); - }} icon={MarkerIconFactory(markerShape, color1, color2, markerIcon)} key={item.id} position={[latitude, longitude]}> + }} + eventHandlers={{ + click: () => { + setMarkerClicked(item) + }, + }} + icon={MarkerIconFactory(markerShape, color1, color2, markerIcon)} key={item.id} position={[latitude, longitude]}> { (children && React.Children.toArray(children).some(child => React.isValidElement(child) && child.props.__TYPE === "ItemView") ? React.Children.toArray(children).map((child) => diff --git a/src/Components/Map/Subcomponents/Controls/SearchControl.tsx b/src/Components/Map/Subcomponents/Controls/SearchControl.tsx index 919414cd..67b23d5f 100644 --- a/src/Components/Map/Subcomponents/Controls/SearchControl.tsx +++ b/src/Components/Map/Subcomponents/Controls/SearchControl.tsx @@ -1,5 +1,5 @@ import * as React from 'react' -import { useAddFilterTag, useFilterTags, useResetFilterTags, useSetSearchPhrase } from '../../hooks/useFilter' +import { useAddFilterTag, useFilterTags, useResetFilterTags } from '../../hooks/useFilter' import useWindowDimensions from '../../hooks/useWindowDimension'; import axios from 'axios'; import { useRef, useState } from 'react'; @@ -15,10 +15,11 @@ import * as L from 'leaflet'; import MarkerIconFactory from '../../../../Utils/MarkerIconFactory'; import { decodeTag } from '../../../../Utils/FormatTags'; import { useNavigate } from 'react-router-dom'; +import { useClusterRef } from '../../hooks/useClusterRef'; -export const SearchControl = ({ clusterRef }) => { +export const SearchControl = () => { const windowDimensions = useWindowDimensions(); const [popupOpen, setPopupOpen] = useState(false); @@ -36,6 +37,7 @@ export const SearchControl = ({ clusterRef }) => { const addFilterTag = useAddFilterTag(); const resetFilterTags = useResetFilterTags(); const filterTags = useFilterTags(); + const clusterRef = useClusterRef(); useMapEvents({ popupopen: () => { @@ -115,17 +117,9 @@ export const SearchControl = ({ clusterRef }) => {
{ const marker = Object.entries(leafletRefs).find(r => r[1].item == item)?.[1].marker; if(marker){ - if (filterTags.length > 0) { - marker !== null && window.history.pushState({}, "", `/${item.layer.name}/${item.id}`) - resetFilterTags(); - hide(); - } - else { - marker !== null && clusterRef?.current?.zoomToShowLayer(marker, () => { - marker?.openPopup(); - hide(); - }); - } + navigate(`/${item.layer.name}/${item.id}`) + + } else { navigate("item/"+item.id) diff --git a/src/Components/Map/Subcomponents/ItemFormPopup.tsx b/src/Components/Map/Subcomponents/ItemFormPopup.tsx index 16416f95..c20aeaa4 100644 --- a/src/Components/Map/Subcomponents/ItemFormPopup.tsx +++ b/src/Components/Map/Subcomponents/ItemFormPopup.tsx @@ -96,7 +96,7 @@ export function ItemFormPopup(props: ItemFormPopupProps) { const item = items.find(item => item.layer == props.layer && item.user_created?.id == user?.id); item && removeItem(item); } - addItem({...formItem, id: uuid, layer: props.layer, user_created: user}); + addItem({...formItem, id: uuid, layer: props.layer, user_created: user, type: props.layer.itemType }); toast.success("New item created"); resetFilterTags(); } diff --git a/src/Components/Map/Subcomponents/ItemPopupComponents/HeaderView.tsx b/src/Components/Map/Subcomponents/ItemPopupComponents/HeaderView.tsx index 2180e56f..4f81c846 100644 --- a/src/Components/Map/Subcomponents/ItemPopupComponents/HeaderView.tsx +++ b/src/Components/Map/Subcomponents/ItemPopupComponents/HeaderView.tsx @@ -5,16 +5,17 @@ import { getValue } from "../../../../Utils/GetValue"; import { useAssetApi } from '../../../AppShell/hooks/useAssets' import DialogModal from "../../../Templates/DialogModal"; import { useNavigate } from "react-router-dom"; -import { useSetSelectPosition } from "../../hooks/useSetItemPosition"; +import { useMap } from "react-leaflet"; -export function HeaderView({ item, api, editCallback, deleteCallback, itemNameField, itemAvatarField, loading, hideMenu = false, big = false, updatePosition = false }: { +export function HeaderView({ item, api, editCallback, deleteCallback, setPositionCallback, itemNameField, itemAvatarField, loading, hideMenu = false, big = false }: { item: Item, api?: ItemsApi, editCallback?: any, deleteCallback?: any, + setPositionCallback?: any, itemNameField?: string, itemAvatarField?: string, loading?: boolean, @@ -29,7 +30,6 @@ export function HeaderView({ item, api, editCallback, deleteCallback, itemNameFi const hasUserPermission = useHasUserPermission(); const navigate = useNavigate(); const assetsApi = useAssetApi(); - const setSelectPosition = useSetSelectPosition(); const avatar = itemAvatarField && getValue(item, itemAvatarField) ? assetsApi.url + getValue(item, itemAvatarField) + `${big ? "?width=160&heigth=160": "?width=80&heigth=80"}` : item.layer?.itemAvatarField && item && getValue(item, item.layer?.itemAvatarField) && assetsApi.url + getValue(item, item.layer?.itemAvatarField) + `${big ? "?width=160&heigth=160": "?width=80&heigth=80"}`; const title = itemNameField ? getValue(item, itemNameField) : item.layer?.itemNameField && item && getValue(item, item.layer?.itemNameField); @@ -63,21 +63,21 @@ export function HeaderView({ item, api, editCallback, deleteCallback, itemNameFi