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

feat(edit): duplicate existing board #1546

Closed
wants to merge 3 commits into from
Closed
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
20 changes: 18 additions & 2 deletions next-tavla/app/(admin)/boards/components/Column/Delete.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,15 @@ import { getFormFeedbackForField } from 'app/(admin)/utils'
import sheep from 'assets/illustrations/Sheep.png'
import Image from 'next/image'
import { SubmitButton } from 'components/Form/SubmitButton'
import { OverflowMenuItem } from '@entur/menu'

function Delete({ board, type }: { board: TBoard; type?: 'icon' | 'button' }) {
function Delete({
board,
type,
}: {
board: TBoard
type?: 'icon' | 'button' | 'action'
}) {
const [state, action] = useFormState(deleteBoardAction, undefined)
const { isOpen, open, close } = useModalWithValue('delete', board.id ?? '')

Expand Down Expand Up @@ -68,7 +75,7 @@ function DeleteButton({
type,
onClick,
}: {
type?: 'button' | 'icon'
type?: 'button' | 'icon' | 'action'
onClick: () => void
}) {
if (type === 'button') {
emilielr marked this conversation as resolved.
Show resolved Hide resolved
Expand All @@ -83,6 +90,15 @@ function DeleteButton({
</Button>
)
}
if (type === 'action')
return (
<OverflowMenuItem onSelect={onClick}>
<div className="flex flex-row">
<DeleteIcon inline />
Slett Tavle
</div>
</OverflowMenuItem>
)
return (
<IconButton aria-label="Slett tavle" onClick={onClick}>
<DeleteIcon />
Expand Down
5 changes: 4 additions & 1 deletion next-tavla/app/(admin)/components/CreateBoard/actions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,10 @@ export async function create(board: TBoard, oid?: TOrganizationID) {
...board,
meta: {
...board.meta,
fontSize: organization?.defaults?.font ?? 'medium',
fontSize:
board.meta?.fontSize ??
organization?.defaults?.font ??
'medium',
created: Date.now(),
dateModified: Date.now(),
},
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
'use client'
import { OverflowMenu } from '@entur/menu'
import { TBoard, TOrganizationID } from 'types/settings'
import { DuplicateBoard } from '../DuplicateBoard'
import { Delete } from 'app/(admin)/boards/components/Column/Delete'

function ActionsMenu({ board, oid }: { board: TBoard; oid?: TOrganizationID }) {
return (
<>
<OverflowActionsMenu board={board} oid={oid} />
<ButtonsMenu board={board} oid={oid} />
</>
)
}

function OverflowActionsMenu({
board,
oid,
}: {
board: TBoard
oid?: TOrganizationID
}) {
return (
<div className="hidden md:flex">
<OverflowMenu position="left">
<DuplicateBoard board={board} oid={oid} />
<Delete board={board} type="action" />
</OverflowMenu>
</div>
)
}

function ButtonsMenu({ board, oid }: { board: TBoard; oid?: TOrganizationID }) {
return (
<div className="flex flex-col md:flex-row md:items-center gap-4 md:hidden">
<DuplicateBoard board={board} oid={oid} type="button" />
<Delete board={board} type="button" />
</div>
)
}

export { ActionsMenu }
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
'use client'
import { useToast } from '@entur/alert'
import { Button } from '@entur/button'
import { AddIcon } from '@entur/icons'
import { OverflowMenuItem } from '@entur/menu'
import { create } from 'app/(admin)/components/CreateBoard/actions'
import { TBoard, TOrganizationID } from 'types/settings'

function DuplicateBoard({
board,
oid,
type,
}: {
board: TBoard
oid?: TOrganizationID
type?: 'button' | 'action'
}) {
const { addToast } = useToast()
const handleSelect = async () => {
delete board.id
await create(
{
...board,
meta: {
...board.meta,
title: board.meta.title + ' - duplikat',
oyvindgrutle marked this conversation as resolved.
Show resolved Hide resolved
},
},
oid,
)
addToast('Tavle duplisert!')
}
if (type === 'button')
return (
<Button
variant="secondary"
aria-label="Dupliser tavle"
onClick={handleSelect}
>
Dupliser Tavle
<AddIcon />
</Button>
)
return (
<OverflowMenuItem onSelect={handleSelect}>
<div className="flex flex-row">
<AddIcon inline />
Dupliser tavle
</div>
</OverflowMenuItem>
)
}

export { DuplicateBoard }
6 changes: 3 additions & 3 deletions next-tavla/app/(admin)/edit/[id]/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,13 @@ import { revalidatePath } from 'next/cache'
import { Metadata } from 'next'
import { getOrganizationForBoard } from './components/TileCard/actions'
import { getUser, hasBoardEditorAccess } from 'app/(admin)/utils/firebase'
import { Delete } from 'app/(admin)/boards/components/Column/Delete'
import { Open } from './components/Buttons/Open'
import { Copy } from './components/Buttons/Copy'
import { Footer } from './components/Footer'
import { RefreshButton } from './components/RefreshButton'
import { DEFAULT_BOARD_NAME } from 'app/(admin)/utils/constants'
import { Preview } from './components/Preview'
import { ActionsMenu } from './components/ActionsMenu'

type TProps = {
params: { id: TBoardID }
Expand Down Expand Up @@ -44,11 +44,11 @@ export default async function EditPage({ params }: TProps) {
<div className="flex flex-col gap-14">
<div className="flex flex-col md:flex-row justify-between">
<Heading1 margin="top">Rediger {board.meta?.title}</Heading1>
<div className="flex flex-col md:flex-row gap-4">
<div className="flex flex-col md:flex-row md:items-center gap-4">
<Open bid={board.id} type="button" />
<Copy bid={board.id} type="button" />
<Delete board={board} type="button" />
<RefreshButton board={board} />
<ActionsMenu board={board} oid={organization?.id} />
</div>
</div>
<div className="grid grid-cols-[repeat(auto-fill,minmax(400px,1fr))] gap-8">
Expand Down