diff --git a/next-tavla/app/(admin)/components/CreateBoard/index.tsx b/next-tavla/app/(admin)/components/CreateBoard/index.tsx index 53577c0b3..291b25985 100644 --- a/next-tavla/app/(admin)/components/CreateBoard/index.tsx +++ b/next-tavla/app/(admin)/components/CreateBoard/index.tsx @@ -171,7 +171,7 @@ function NameAndOrganizationSelector({
diff --git a/next-tavla/app/(admin)/edit/[id]/components/MetaSettings/actions.ts b/next-tavla/app/(admin)/edit/[id]/components/MetaSettings/actions.ts index 83b3c4743..ae7883479 100644 --- a/next-tavla/app/(admin)/edit/[id]/components/MetaSettings/actions.ts +++ b/next-tavla/app/(admin)/edit/[id]/components/MetaSettings/actions.ts @@ -2,14 +2,17 @@ import { getFormFeedbackForError } from 'app/(admin)/utils' import { hasBoardEditorAccess, + hasBoardOwnerAccess, initializeAdminApp, + userCanEditOrganization, } from 'app/(admin)/utils/firebase' -import { firestore } from 'firebase-admin' +import admin, { firestore } from 'firebase-admin' import { revalidatePath } from 'next/cache' import { redirect } from 'next/navigation' import { TFontSize, TLocation } from 'types/meta' -import { TBoard, TBoardID } from 'types/settings' +import { TBoard, TBoardID, TOrganizationID } from 'types/settings' import { getBoard, getWalkingDistanceTile } from '../../actions' +import { getUserFromSessionCookie } from 'app/(admin)/utils/server' initializeAdminApp() @@ -64,3 +67,44 @@ async function getTilesWithDistance(board: TBoard, location?: TLocation) { }), ) } + +export async function moveBoard( + bid: TBoardID, + oid?: TOrganizationID, + fromOrganization?: TOrganizationID, +) { + const user = await getUserFromSessionCookie() + if (!user) return redirect('/') + + const access = await hasBoardOwnerAccess(bid) + if (!access) return redirect('/') + + if (fromOrganization && !(await userCanEditOrganization(fromOrganization))) + return redirect('/') + + if (oid && !(await userCanEditOrganization(oid))) return redirect('/') + + if (fromOrganization) + firestore() + .collection('organizations') + .doc(fromOrganization) + .update({ boards: admin.firestore.FieldValue.arrayRemove(bid) }) + else + firestore() + .collection('users') + .doc(user.uid) + .update({ owner: admin.firestore.FieldValue.arrayRemove(bid) }) + + if (oid) + firestore() + .collection('organizations') + .doc(oid) + .update({ boards: admin.firestore.FieldValue.arrayUnion(bid) }) + else + firestore() + .collection('users') + .doc(user.uid) + .update({ owner: admin.firestore.FieldValue.arrayUnion(bid) }) + + revalidatePath(`/edit/${bid}`) +} diff --git a/next-tavla/app/(admin)/edit/[id]/components/MetaSettings/index.tsx b/next-tavla/app/(admin)/edit/[id]/components/MetaSettings/index.tsx index 7803eca45..e223cef01 100644 --- a/next-tavla/app/(admin)/edit/[id]/components/MetaSettings/index.tsx +++ b/next-tavla/app/(admin)/edit/[id]/components/MetaSettings/index.tsx @@ -1,18 +1,39 @@ 'use client' -import { TextField } from '@entur/form' +import { Checkbox, TextField } from '@entur/form' import { Heading3 } from '@entur/typography' import { TFontSize, TMeta } from 'types/meta' -import { saveFont, saveTitle } from './actions' -import { TBoardID } from 'types/settings' +import { moveBoard, saveFont, saveTitle } from './actions' +import { TBoardID, TOrganization } from 'types/settings' import { FontChoiceChip } from './FontChoiceChip' import { SubmitButton } from 'components/Form/SubmitButton' import { Address } from './Adress' import { DEFAULT_BOARD_NAME } from 'app/(admin)/utils/constants' import { useToast } from '@entur/alert' import { isEmptyOrSpaces } from 'app/(admin)/edit/utils' +import { Dropdown } from '@entur/dropdown' +import { useOrganizations } from 'app/(admin)/hooks/useOrganizations' +import { useState } from 'react' +import { + TFormFeedback, + getFormFeedbackForError, + getFormFeedbackForField, +} from 'app/(admin)/utils' -function MetaSettings({ bid, meta }: { bid: TBoardID; meta?: TMeta }) { +function MetaSettings({ + bid, + meta, + + organization, +}: { + bid: TBoardID + meta: TMeta + organization?: TOrganization +}) { const { addToast } = useToast() + const { organizations, selectedOrganization, setSelectedOrganization } = + useOrganizations(organization) + const [personal, setPersonal] = useState(organization ? false : true) + const [state, setFormError] = useState() return ( <>
+
{ + if (!selectedOrganization && !personal) { + return setFormError( + getFormFeedbackForError( + 'create/organization-missing', + ), + ) + } + await moveBoard( + bid, + personal ? undefined : selectedOrganization?.value.id, + organization?.id, + ) + setFormError(undefined) + addToast('Organisasjon lagret!') + }} + className="box flex flex-col" + > + Organisasjon + + setPersonal(!personal)} + name="personal" + > + Privat tavle + +
+ + Lagre organisasjon + +
+ ) } diff --git a/next-tavla/app/(admin)/edit/[id]/page.tsx b/next-tavla/app/(admin)/edit/[id]/page.tsx index 29e83cf61..234923447 100644 --- a/next-tavla/app/(admin)/edit/[id]/page.tsx +++ b/next-tavla/app/(admin)/edit/[id]/page.tsx @@ -51,8 +51,12 @@ export default async function EditPage({ params }: TProps) { -
- +
+