From 68ce808558f8da1ae112ea2183b61aaacfcbc65c Mon Sep 17 00:00:00 2001 From: Anton Tranelis Date: Fri, 22 Mar 2024 00:11:44 +0100 Subject: [PATCH] permissions and item index --- src/Components/AppShell/AppShell.tsx | 53 +++++++++++-------- .../ItemPopupComponents/HeaderView.tsx | 15 +++--- src/Components/Map/UtopiaMap.tsx | 6 --- src/Components/Map/hooks/usePermissions.tsx | 33 +++++++++--- src/Components/Profile/OverlayItemProfile.tsx | 36 +++++-------- src/Components/Profile/PlusButton.tsx | 9 ++-- src/Components/Templates/ItemsIndexPage.tsx | 15 +++--- src/types.ts | 14 ++++- 8 files changed, 99 insertions(+), 82 deletions(-) diff --git a/src/Components/AppShell/AppShell.tsx b/src/Components/AppShell/AppShell.tsx index 4dc7ea44..70622618 100644 --- a/src/Components/AppShell/AppShell.tsx +++ b/src/Components/AppShell/AppShell.tsx @@ -7,6 +7,8 @@ import { AssetsProvider } from './hooks/useAssets' import { SetAssetsApi } from './SetAssetsApi' import { AssetsApi } from '../../types' import { QueryClient, QueryClientProvider } from '@tanstack/react-query' +import { PermissionsProvider } from '../Map/hooks/usePermissions' +import { TagsProvider } from '../Map/hooks/useTags' export function AppShell({ appName, nameWidth, children, assetsApi }: { appName: string, nameWidth?: number, children: React.ReactNode, assetsApi: AssetsApi }) { @@ -15,28 +17,33 @@ export function AppShell({ appName, nameWidth, children, assetsApi }: { appName: return ( - - - - - - - -
- {children} -
-
-
-
-
+ + + + + + + + + +
+ {children} +
+
+
+
+
+
+
+ ) } diff --git a/src/Components/Map/Subcomponents/ItemPopupComponents/HeaderView.tsx b/src/Components/Map/Subcomponents/ItemPopupComponents/HeaderView.tsx index d6b5b370..ea9d3f78 100644 --- a/src/Components/Map/Subcomponents/ItemPopupComponents/HeaderView.tsx +++ b/src/Components/Map/Subcomponents/ItemPopupComponents/HeaderView.tsx @@ -42,6 +42,7 @@ export function HeaderView({ item, setItemFormPopup, hideMenu=false }: { const removeItemFromMap = async (event: React.MouseEvent) => { + event.stopPropagation(); setLoading(true); let success = false; try { @@ -58,7 +59,10 @@ export function HeaderView({ item, setItemFormPopup, hideMenu=false }: { map.closePopup(); let params = new URLSearchParams(window.location.search); window.history.pushState({}, "", "/" + `${params? `?${params}` : ""}`); - event.stopPropagation(); + setModalOpen(false); + navigate("/"); + + } const openDeleteModal = async (event: React.MouseEvent) => { @@ -90,10 +94,9 @@ export function HeaderView({ item, setItemFormPopup, hideMenu=false }: { -
+
e.stopPropagation()}> {(item.layer?.api?.deleteItem || item.layer?.api?.updateItem) - && ((user && owner?.id === user.id) || owner == undefined) - && (hasUserPermission(item.layer.api?.collectionName!, "delete") || hasUserPermission(item.layer.api?.collectionName!, "update")) + && (hasUserPermission(item.layer.api?.collectionName!, "delete", item) || hasUserPermission(item.layer.api?.collectionName!, "update", item)) && !hideMenu &&
diff --git a/src/Components/Profile/PlusButton.tsx b/src/Components/Profile/PlusButton.tsx index 13dd4108..ef6990bd 100644 --- a/src/Components/Profile/PlusButton.tsx +++ b/src/Components/Profile/PlusButton.tsx @@ -1,11 +1,8 @@ -import { useHasUserPermission } from "../Map/hooks/usePermissions"; +import { useHasUserPermission, usePermissions } from "../Map/hooks/usePermissions"; +import { useAuth } from "../Auth"; export function PlusButton({ triggerAction, color, collection="items" }: { triggerAction: any, color: string, collection?:string }) { - - const hasUserPermission = useHasUserPermission(); - - - + const hasUserPermission = useHasUserPermission(); return ( <>{hasUserPermission(collection, "create") &&
diff --git a/src/Components/Templates/ItemsIndexPage.tsx b/src/Components/Templates/ItemsIndexPage.tsx index 04fe727b..ae5aae8c 100644 --- a/src/Components/Templates/ItemsIndexPage.tsx +++ b/src/Components/Templates/ItemsIndexPage.tsx @@ -4,7 +4,7 @@ import { Item, ItemsApi } from '../../types'; import { getValue } from '../../Utils/GetValue'; import { TextView } from '../Map'; import { useAssetApi } from '../AppShell/hooks/useAssets'; -import { PlusButton } from '../Profile'; +import { PlusButton } from '../Profile/PlusButton'; import { TextInput, TextAreaInput } from '../Input'; import { useAddTag, useTags } from '../Map/hooks/useTags'; import { useAddItem } from '../Map/hooks/useItems'; @@ -14,6 +14,7 @@ import { hashTagRegex } from '../../Utils/HashTagRegex'; import { randomColor } from '../../Utils/RandomColor'; import { useAuth } from '../Auth'; import { useLayers } from '../Map/hooks/useLayers'; +import { PermissionsProvider } from '../Map/hooks/usePermissions'; type breadcrumb = { @@ -22,7 +23,7 @@ type breadcrumb = { } -export const ItemsIndexPage = ({ api, url, parameterField, breadcrumbs, itemNameField, itemTextField, itemImageField, itemSymbolField }: { api: ItemsApi, url: string, parameterField: string, breadcrumbs: Array, itemNameField: string, itemTextField: string, itemImageField: string, itemSymbolField: string }) => { +export const ItemsIndexPage = ({ api, url, parameterField, breadcrumbs, itemNameField, itemTextField, itemImageField, itemSymbolField, children }: { api: ItemsApi, url: string, parameterField: string, breadcrumbs: Array, itemNameField: string, itemTextField: string, itemImageField: string, itemSymbolField: string, children?: ReactNode }) => { console.log(itemSymbolField); @@ -62,8 +63,6 @@ export const ItemsIndexPage = ({ api, url, parameterField, breadcrumbs, itemName const layers = useLayers(); - - const submitNewItem = async (evt: any, type: string) => { evt.preventDefault(); const formItem: Item = {} as Item; @@ -98,6 +97,7 @@ export const ItemsIndexPage = ({ api, url, parameterField, breadcrumbs, itemName return ( +
{breadcrumbs && @@ -121,10 +121,9 @@ export const ItemsIndexPage = ({ api, url, parameterField, breadcrumbs, itemName { items?.map((i, k) => { return ( - -
navigate('/item/' + i.id)}> +
navigate(url + getValue(i,parameterField))}>
@@ -149,7 +148,6 @@ export const ItemsIndexPage = ({ api, url, parameterField, breadcrumbs, itemName
- ) }) @@ -173,7 +171,8 @@ export const ItemsIndexPage = ({ api, url, parameterField, breadcrumbs, itemName }
- {setAddItemPopupType("project"); scroll();}} color={'#777'} /> + {setAddItemPopupType("project"); scroll();}} color={'#777'} collection='items'/> + {children}
diff --git a/src/types.ts b/src/types.ts index 2a1e05c7..bf764f5e 100644 --- a/src/types.ts +++ b/src/types.ts @@ -122,12 +122,22 @@ export type Profile = { geoposition?: Geometry } +export type PermissionCondition = { + user_created?: { + _eq: string; // Erwartet den speziellen Wert "$CURRENT_USER" oder eine spezifische UUID + }; + // Hier können weitere Bedingungen nach Bedarf hinzugefügt werden +}; + export type Permission = { id?: string; role: string; collection: string; - action: PermissionAction -} + action: PermissionAction; + permissions?: { // Optional, für spezifische Bedingungen wie `user_created` + _and: PermissionCondition[]; + }; +}; export type PermissionAction = "create"|"read"|"update"|"delete";