Skip to content

Commit 4152394

Browse files
authored
feat(folder): folder dropdown with all options (#1851)
* feat(folder): set folder to default in drodown when create board * feat(folder): remove private baord check and add no folder as dropdown option * refactor(): rename variable
1 parent 368e8f7 commit 4152394

File tree

9 files changed

+38
-108
lines changed

9 files changed

+38
-108
lines changed

tavla/app/(admin)/boards/[id]/page.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ async function FolderPage(props: TProps) {
5151
{folder.name}
5252
</Heading1>
5353
<div className="flex flex-row gap-4">
54-
<CreateBoard />
54+
<CreateBoard folder={folder} />
5555
<Button
5656
variant="secondary"
5757
as={Link}

tavla/app/(admin)/components/CreateBoard/NameAndOrganizationSelector.tsx

+8-28
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,21 @@
11
'use client'
2-
import { Dropdown } from '@entur/dropdown'
3-
import { Checkbox } from '@entur/form'
42
import { Paragraph, Label, Heading2 } from '@entur/typography'
5-
import { useOrganizations } from 'app/(admin)/hooks/useOrganizations'
63
import { getFormFeedbackForField } from 'app/(admin)/utils'
74
import { HiddenInput } from 'components/Form/HiddenInput'
85
import { SubmitButton } from 'components/Form/SubmitButton'
9-
import { useActionState, useState } from 'react'
6+
import { useActionState } from 'react'
107
import { createBoard } from './actions'
118
import { FormError } from '../FormError'
129
import ClientOnlyTextField from 'app/components/NoSSR/TextField'
10+
import { TOrganization } from 'types/settings'
11+
import { Dropdown } from '@entur/dropdown'
12+
import { useOrganizations } from 'app/(admin)/hooks/useOrganizations'
1313

14-
function NameAndOrganizationSelector() {
14+
function NameAndOrganizationSelector({ folder }: { folder?: TOrganization }) {
1515
const [state, action] = useActionState(createBoard, undefined)
1616

1717
const { organizations, selectedOrganization, setSelectedOrganization } =
18-
useOrganizations()
19-
20-
const [isPersonal, setIsPersonal] = useState<boolean>(false)
21-
22-
const disableOrg = isPersonal || organizations().length == 0
18+
useOrganizations(folder)
2319

2420
return (
2521
<form action={action} className="md:px-10">
@@ -44,28 +40,12 @@ function NameAndOrganizationSelector() {
4440
<Dropdown
4541
items={organizations}
4642
label="Dine mapper"
47-
selectedItem={isPersonal ? null : selectedOrganization}
43+
selectedItem={selectedOrganization}
4844
onChange={setSelectedOrganization}
49-
clearable
5045
aria-required="true"
5146
className="mb-4"
52-
disabled={disableOrg}
53-
{...getFormFeedbackForField('organization', state)}
54-
/>
55-
<Checkbox
56-
checked={disableOrg}
57-
onChange={() => {
58-
setSelectedOrganization(null)
59-
setIsPersonal(!isPersonal)
60-
}}
61-
name="personal"
62-
>
63-
Privat tavle
64-
</Checkbox>
65-
<HiddenInput
66-
id="organization"
67-
value={selectedOrganization?.value.id}
6847
/>
48+
<HiddenInput id="oid" value={selectedOrganization?.value.id} />
6949
</div>
7050
<div className="mt-4">
7151
<FormError {...getFormFeedbackForField('general', state)} />

tavla/app/(admin)/components/CreateBoard/actions.ts

+2-5
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,7 @@ export async function createBoard(
1818
const name = data.get('name') as string
1919
if (!name) return getFormFeedbackForError('board/name-missing')
2020

21-
const oid = data.get('organization') as TOrganizationID
22-
const personal = data.get('personal')
23-
if (!oid && !personal)
24-
return getFormFeedbackForError('create/organization-missing')
21+
const oid = data.get('oid') as TOrganizationID
2522

2623
const board = {
2724
tiles: [],
@@ -58,7 +55,7 @@ export async function createBoard(
5855

5956
firestore()
6057
.collection(oid ? 'organizations' : 'users')
61-
.doc(oid ? String(oid) : String(user.uid))
58+
.doc(oid ? oid : user.uid)
6259
.update({
6360
[oid ? 'boards' : 'owner']:
6461
admin.firestore.FieldValue.arrayUnion(createdBoard.id),

tavla/app/(admin)/components/CreateBoard/index.tsx

+3-2
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,9 @@ import { NameAndOrganizationSelector } from './NameAndOrganizationSelector'
55
import { Button } from '@entur/button'
66
import { BoardIcon } from '@entur/icons'
77
import Link from 'next/link'
8+
import { TOrganization } from 'types/settings'
89

9-
function CreateBoard() {
10+
function CreateBoard({ folder }: { folder?: TOrganization }) {
1011
const [open, close] = useSearchParamsModal('board')
1112

1213
return (
@@ -21,7 +22,7 @@ function CreateBoard() {
2122
onDismiss={() => close()}
2223
closeLabel="Avbryt opprettelse av tavle"
2324
>
24-
<NameAndOrganizationSelector />
25+
<NameAndOrganizationSelector folder={folder} />
2526
</Modal>
2627
</>
2728
)

tavla/app/(admin)/edit/[id]/components/Settings/actions.ts

+5-15
Original file line numberDiff line numberDiff line change
@@ -42,12 +42,8 @@ export async function saveSettings(data: FormData) {
4242
const theme = data.get('theme') as TTheme
4343
const font = data.get('font') as TFontSize
4444

45-
let newOrganization = data.get('newOrganization') as string | undefined
46-
const oldOrganization = data.get('oldOrganization') as string
47-
const personal = (data.get('personal') as string) === 'on'
48-
if (newOrganization === 'undefined') {
49-
newOrganization = undefined
50-
}
45+
const newOrganization = data.get('newOid') as TOrganizationID | undefined
46+
const oldOrganization = data.get('oldOid') as TOrganizationID | undefined
5147

5248
let location: TLocation | undefined | string = data.get(
5349
'newLocation',
@@ -74,17 +70,12 @@ export async function saveSettings(data: FormData) {
7470
if (isEmptyOrSpaces(title))
7571
errors['name'] = getFormFeedbackForError('board/tiles-name-missing')
7672

77-
if (!personal && !newOrganization)
78-
errors['organization'] = getFormFeedbackForError(
79-
'create/organization-missing',
80-
)
81-
8273
if (Object.keys(errors).length !== 0) {
8374
return errors
8475
}
8576

8677
await saveTitle(bid, title)
87-
await moveBoard(bid, personal, newOrganization, oldOrganization)
78+
await moveBoard(bid, newOrganization, oldOrganization)
8879
await saveLocation(board, location)
8980
await saveFont(bid, font)
9081
await setTheme(bid, theme)
@@ -260,8 +251,7 @@ async function getTilesWithDistance(board: TBoard, location?: TLocation) {
260251

261252
async function moveBoard(
262253
bid: TBoardID,
263-
personal: boolean,
264-
toOrganization: TOrganizationID | undefined,
254+
toOrganization?: TOrganizationID,
265255
fromOrganization?: TOrganizationID,
266256
) {
267257
const user = await getUserFromSessionCookie()
@@ -291,7 +281,7 @@ async function moveBoard(
291281
.doc(user.uid)
292282
.update({ owner: firestore.FieldValue.arrayRemove(bid) })
293283

294-
if (toOrganization && !personal)
284+
if (toOrganization)
295285
await firestore()
296286
.collection('organizations')
297287
.doc(toOrganization)

tavla/app/(admin)/edit/[id]/components/Settings/components/Organization.tsx

+4-31
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,11 @@
11
'use client'
22
import { Dropdown } from '@entur/dropdown'
3-
import { Checkbox } from '@entur/form'
43
import { Heading4 } from '@entur/typography'
5-
import { FormError } from 'app/(admin)/components/FormError'
64
import { useOrganizations } from 'app/(admin)/hooks/useOrganizations'
7-
import { TFormFeedback } from 'app/(admin)/utils'
85
import { HiddenInput } from 'components/Form/HiddenInput'
9-
import { useState } from 'react'
106
import { TOrganization } from 'types/settings'
117

12-
function Organization({
13-
organization,
14-
feedback,
15-
}: {
16-
organization?: TOrganization
17-
feedback?: TFormFeedback
18-
}) {
19-
const [personal, setPersonal] = useState(organization ? false : true)
8+
function Organization({ organization }: { organization?: TOrganization }) {
209
const { organizations, selectedOrganization, setSelectedOrganization } =
2110
useOrganizations(organization)
2211

@@ -28,27 +17,11 @@ function Organization({
2817
label="Dine mapper"
2918
selectedItem={selectedOrganization}
3019
onChange={setSelectedOrganization}
31-
clearable
32-
className="mb-4"
3320
aria-required="true"
34-
disabled={personal}
35-
/>
36-
37-
<Checkbox
38-
defaultChecked={personal}
39-
onChange={() => setPersonal(!personal)}
40-
name="personal"
41-
>
42-
Privat tavle
43-
</Checkbox>
44-
<HiddenInput id="oldOrganization" value={organization?.id ?? ''} />
45-
<HiddenInput
46-
id="newOrganization"
47-
value={selectedOrganization?.value.id}
21+
className="mb-4"
4822
/>
49-
<div className="mt-4">
50-
<FormError {...feedback} />
51-
</div>
23+
<HiddenInput id="oldOid" value={organization?.id} />
24+
<HiddenInput id="newOid" value={selectedOrganization?.value.id} />
5225
</div>
5326
)
5427
}

tavla/app/(admin)/edit/[id]/components/Settings/index.tsx

+1-7
Original file line numberDiff line numberDiff line change
@@ -66,13 +66,7 @@ function Settings({
6666
formErrors.name,
6767
)}
6868
/>
69-
<Organization
70-
organization={organization}
71-
feedback={getFormFeedbackForField(
72-
'organization',
73-
formErrors.organization,
74-
)}
75-
/>
69+
<Organization organization={organization} />
7670
</div>
7771
</div>
7872
<div className="box">

tavla/app/(admin)/hooks/useOrganizations.ts

+14-7
Original file line numberDiff line numberDiff line change
@@ -3,24 +3,31 @@ import { useCallback, useEffect, useState } from 'react'
33
import { getOrganizationsForUser } from '../actions'
44
import { TOrganization } from 'types/settings'
55
import { organizationToDropdownItem } from '../edit/utils'
6+
import { FolderIcon } from '@entur/icons'
7+
8+
const NO_FOLDER = {
9+
value: {},
10+
label: 'Ingen mappe',
11+
}
612

713
function useOrganizations(organization?: TOrganization) {
814
const [organizationList, setOrganizationList] = useState<
915
NormalizedDropdownItemType<TOrganization>[]
1016
>([])
17+
1118
const [selectedOrganization, setSelectedOrganization] =
1219
useState<NormalizedDropdownItemType<TOrganization> | null>(
13-
organization ? organizationToDropdownItem(organization) : null,
20+
organization ? organizationToDropdownItem(organization) : NO_FOLDER,
1421
)
1522

1623
useEffect(() => {
1724
getOrganizationsForUser().then((res) => {
18-
setOrganizationList(
19-
res?.map((o) => ({
20-
value: o ?? undefined,
21-
label: o.name ?? '',
22-
})),
23-
)
25+
const organizations = res?.map((organization) => ({
26+
value: organization ?? undefined,
27+
label: organization.name ?? '',
28+
icons: [FolderIcon],
29+
}))
30+
setOrganizationList([...organizations, NO_FOLDER])
2431
})
2532
}, [])
2633

tavla/app/(admin)/utils/index.ts

-12
Original file line numberDiff line numberDiff line change
@@ -155,18 +155,6 @@ export function getFormFeedbackForError(
155155
feedback: 'Du har ikke gitt tavla et navn',
156156
variant: 'negative',
157157
}
158-
case 'create/organization-missing':
159-
return {
160-
form_type: 'organization',
161-
feedback: 'Du har ikke valgt mappe',
162-
variant: 'negative',
163-
}
164-
case 'board/tiles-missing':
165-
return {
166-
form_type: 'general',
167-
feedback: 'Du har ikke lagt til noen stoppesteder',
168-
variant: 'negative',
169-
}
170158
case 'board/tiles-name-missing':
171159
return {
172160
form_type: 'name',

0 commit comments

Comments
 (0)