feat: optionally exclude collection documents from appearing in browse-by-folder (#12654)
Adds configurations for browse-by-folder document results. This PR **does NOT** allow for filtering out folders on a per collection basis. That will be addressed in a future PR 👍 ### Disable browse-by-folder all together ```ts type RootFoldersConfiguration = { /** * If true, the browse by folder view will be enabled * * @default true */ browseByFolder?: boolean // ...rest of type } ``` ### Remove document types from appearing in the browse by folder view ```ts type CollectionFoldersConfiguration = | boolean | { /** * If true, the collection documents will be included in the browse by folder view * * @default true */ browseByFolder?: boolean } ``` ### Misc Fixes https://github.com/payloadcms/payload/issues/12631 where adding folders.collectionOverrides was being set on the client config - it should be omitted. Fixes an issue where `baseListFilters` were not being respected.
This commit is contained in:
27
test/helpers/folders/clickFolderCard.ts
Normal file
27
test/helpers/folders/clickFolderCard.ts
Normal file
@@ -0,0 +1,27 @@
|
||||
import type { Page } from '@playwright/test'
|
||||
|
||||
type Args = {
|
||||
doubleClick?: boolean
|
||||
folderName: string
|
||||
page: Page
|
||||
}
|
||||
export async function clickFolderCard({
|
||||
page,
|
||||
folderName,
|
||||
doubleClick = false,
|
||||
}: Args): Promise<void> {
|
||||
const folderCard = page
|
||||
.locator('.folder-file-card')
|
||||
.filter({
|
||||
has: page.locator('.folder-file-card__name', { hasText: folderName }),
|
||||
})
|
||||
.first()
|
||||
|
||||
const dragHandleButton = folderCard.locator('div[role="button"].folder-file-card__drag-handle')
|
||||
|
||||
if (doubleClick) {
|
||||
await dragHandleButton.dblclick()
|
||||
} else {
|
||||
await dragHandleButton.click()
|
||||
}
|
||||
}
|
||||
42
test/helpers/folders/createFolder.ts
Normal file
42
test/helpers/folders/createFolder.ts
Normal file
@@ -0,0 +1,42 @@
|
||||
import { expect, type Page } from '@playwright/test'
|
||||
|
||||
type Args = {
|
||||
folderName: string
|
||||
fromDropdown?: boolean
|
||||
page: Page
|
||||
}
|
||||
export async function createFolder({
|
||||
folderName,
|
||||
fromDropdown = false,
|
||||
page,
|
||||
}: Args): Promise<void> {
|
||||
if (fromDropdown) {
|
||||
const folderDropdown = page.locator('.create-new-doc-in-folder__popup-button', {
|
||||
hasText: 'Create',
|
||||
})
|
||||
await folderDropdown.click()
|
||||
const createFolderButton = page.locator('.popup-button-list__button', {
|
||||
hasText: 'Folder',
|
||||
})
|
||||
await createFolderButton.click()
|
||||
} else {
|
||||
const createFolderButton = page.locator(
|
||||
'.create-new-doc-in-folder__button:has-text("Create New")',
|
||||
)
|
||||
await createFolderButton.click()
|
||||
}
|
||||
|
||||
const folderNameInput = page.locator(
|
||||
'dialog#create-document--header-pill-new-folder-drawer div.drawer-content-container input#field-name',
|
||||
)
|
||||
|
||||
await folderNameInput.fill(folderName)
|
||||
|
||||
const createButton = page.getByRole('button', { name: 'Apply Changes' })
|
||||
await createButton.click()
|
||||
|
||||
await expect(page.locator('.payload-toast-container')).toContainText('successfully')
|
||||
|
||||
const folderCard = page.locator('.folder-file-card__name', { hasText: folderName }).first()
|
||||
await expect(folderCard).toBeVisible()
|
||||
}
|
||||
27
test/helpers/folders/createFolderFromDoc.ts
Normal file
27
test/helpers/folders/createFolderFromDoc.ts
Normal file
@@ -0,0 +1,27 @@
|
||||
import { expect, type Page } from '@playwright/test'
|
||||
|
||||
type Args = {
|
||||
folderName: string
|
||||
page: Page
|
||||
}
|
||||
|
||||
export async function createFolderFromDoc({ folderName, page }: Args): Promise<void> {
|
||||
const addFolderButton = page.locator('.create-new-doc-in-folder__button', {
|
||||
hasText: 'Create folder',
|
||||
})
|
||||
await addFolderButton.click()
|
||||
|
||||
const folderNameInput = page.locator('div.drawer-content-container input#field-name')
|
||||
|
||||
await folderNameInput.fill(folderName)
|
||||
|
||||
const createButton = page
|
||||
.locator('button[aria-label="Apply Changes"]')
|
||||
.filter({ hasText: 'Create' })
|
||||
await createButton.click()
|
||||
|
||||
await expect(page.locator('.payload-toast-container')).toContainText('successfully')
|
||||
|
||||
const folderCard = page.locator('.folder-file-card__name', { hasText: folderName }).first()
|
||||
await expect(folderCard).toBeVisible()
|
||||
}
|
||||
12
test/helpers/folders/expectNoResultsAndCreateFolderButton.ts
Normal file
12
test/helpers/folders/expectNoResultsAndCreateFolderButton.ts
Normal file
@@ -0,0 +1,12 @@
|
||||
import { expect, type Page } from '@playwright/test'
|
||||
|
||||
type Args = {
|
||||
page: Page
|
||||
}
|
||||
|
||||
export async function expectNoResultsAndCreateFolderButton({ page }: Args): Promise<void> {
|
||||
const noResultsDiv = page.locator('div.no-results')
|
||||
await expect(noResultsDiv).toBeVisible()
|
||||
const createFolderButton = page.locator('text=Create Folder')
|
||||
await expect(createFolderButton).toBeVisible()
|
||||
}
|
||||
22
test/helpers/folders/selectFolderAndConfirmMove.ts
Normal file
22
test/helpers/folders/selectFolderAndConfirmMove.ts
Normal file
@@ -0,0 +1,22 @@
|
||||
import type { Page } from '@playwright/test'
|
||||
|
||||
import { clickFolderCard } from './clickFolderCard.js'
|
||||
|
||||
type Args = {
|
||||
folderName?: string
|
||||
page: Page
|
||||
}
|
||||
export async function selectFolderAndConfirmMove({ folderName, page }: Args): Promise<void> {
|
||||
if (folderName) {
|
||||
await clickFolderCard({ folderName, doubleClick: true, page })
|
||||
}
|
||||
|
||||
const selectButton = page
|
||||
.locator('button[aria-label="Apply Changes"]')
|
||||
.filter({ hasText: 'Select' })
|
||||
await selectButton.click()
|
||||
const confirmMoveButton = page
|
||||
.locator('dialog#move-folder-drawer-confirm-move')
|
||||
.getByRole('button', { name: 'Move' })
|
||||
await confirmMoveButton.click()
|
||||
}
|
||||
31
test/helpers/folders/selectFolderAndConfirmMoveFromList.ts
Normal file
31
test/helpers/folders/selectFolderAndConfirmMoveFromList.ts
Normal file
@@ -0,0 +1,31 @@
|
||||
import type { Page } from '@playwright/test'
|
||||
|
||||
import { clickFolderCard } from './clickFolderCard.js'
|
||||
|
||||
type Args = {
|
||||
folderName?: string
|
||||
page: Page
|
||||
rowIndex?: number
|
||||
}
|
||||
export async function selectFolderAndConfirmMoveFromList({
|
||||
page,
|
||||
folderName,
|
||||
rowIndex = 1,
|
||||
}: Args): Promise<void> {
|
||||
const firstListItem = page.locator(`tbody .row-${rowIndex}`)
|
||||
const folderPill = firstListItem.locator('.move-doc-to-folder')
|
||||
await folderPill.click()
|
||||
|
||||
if (folderName) {
|
||||
await clickFolderCard({ folderName, doubleClick: true, page })
|
||||
}
|
||||
|
||||
const selectButton = page
|
||||
.locator('button[aria-label="Apply Changes"]')
|
||||
.filter({ hasText: 'Select' })
|
||||
await selectButton.click()
|
||||
const confirmMoveButton = page
|
||||
.locator('dialog#move-folder-drawer-confirm-move')
|
||||
.getByRole('button', { name: 'Move' })
|
||||
await confirmMoveButton.click()
|
||||
}
|
||||
Reference in New Issue
Block a user