Saves folder preferences when navigating from list to folder view. This is a UX improvement so users don't need to click by-folder every time they go back to the list view.
772 lines
30 KiB
TypeScript
772 lines
30 KiB
TypeScript
import type { Page } from '@playwright/test'
|
|
|
|
import { expect, test } from '@playwright/test'
|
|
import * as path from 'path'
|
|
import { fileURLToPath } from 'url'
|
|
|
|
import { ensureCompilationIsDone, initPageConsoleErrorCatch, saveDocAndAssert } from '../helpers.js'
|
|
import { AdminUrlUtil } from '../helpers/adminUrlUtil.js'
|
|
import {
|
|
getSelectInputOptions,
|
|
getSelectInputValue,
|
|
openSelectMenu,
|
|
} from '../helpers/e2e/selectInput.js'
|
|
import { applyBrowseByFolderTypeFilter } from '../helpers/folders/applyBrowseByFolderTypeFilter.js'
|
|
import { clickFolderCard } from '../helpers/folders/clickFolderCard.js'
|
|
import { createFolder } from '../helpers/folders/createFolder.js'
|
|
import { createFolderDoc } from '../helpers/folders/createFolderDoc.js'
|
|
import { createFolderFromDoc } from '../helpers/folders/createFolderFromDoc.js'
|
|
import { expectNoResultsAndCreateFolderButton } from '../helpers/folders/expectNoResultsAndCreateFolderButton.js'
|
|
import { selectFolderAndConfirmMove } from '../helpers/folders/selectFolderAndConfirmMove.js'
|
|
import { selectFolderAndConfirmMoveFromList } from '../helpers/folders/selectFolderAndConfirmMoveFromList.js'
|
|
import { initPayloadE2ENoConfig } from '../helpers/initPayloadE2ENoConfig.js'
|
|
import { reInitializeDB } from '../helpers/reInitializeDB.js'
|
|
import { TEST_TIMEOUT_LONG } from '../playwright.config.js'
|
|
import { omittedFromBrowseBySlug, postSlug } from './shared.js'
|
|
|
|
const filename = fileURLToPath(import.meta.url)
|
|
const dirname = path.dirname(filename)
|
|
|
|
test.describe('Folders', () => {
|
|
let page: Page
|
|
let postURL: AdminUrlUtil
|
|
let OmittedFromBrowseBy: AdminUrlUtil
|
|
let serverURL: string
|
|
|
|
test.beforeAll(async ({ browser }, testInfo) => {
|
|
testInfo.setTimeout(TEST_TIMEOUT_LONG)
|
|
|
|
const { serverURL: serverFromInit } = await initPayloadE2ENoConfig({ dirname })
|
|
serverURL = serverFromInit
|
|
postURL = new AdminUrlUtil(serverURL, postSlug)
|
|
OmittedFromBrowseBy = new AdminUrlUtil(serverURL, omittedFromBrowseBySlug)
|
|
|
|
const context = await browser.newContext()
|
|
page = await context.newPage()
|
|
initPageConsoleErrorCatch(page)
|
|
await ensureCompilationIsDone({ page, serverURL })
|
|
})
|
|
|
|
test.beforeEach(async () => {
|
|
await reInitializeDB({
|
|
serverURL,
|
|
snapshotKey: 'foldersTest',
|
|
})
|
|
})
|
|
|
|
test.describe('No folders', () => {
|
|
test('should show no results and create button in folder view', async () => {
|
|
await page.goto(`${serverURL}/admin/browse-by-folder`)
|
|
await expectNoResultsAndCreateFolderButton({ page })
|
|
})
|
|
|
|
test('should show no results and create button in document view', async () => {
|
|
await page.goto(postURL.create)
|
|
const folderButton = page.getByRole('button', { name: 'No Folder' })
|
|
await expect(folderButton).toBeVisible()
|
|
await folderButton.click()
|
|
await expectNoResultsAndCreateFolderButton({ page })
|
|
})
|
|
})
|
|
|
|
test.describe('Creating folders', () => {
|
|
test('should create new folder from folder view', async () => {
|
|
await page.goto(`${serverURL}/admin/browse-by-folder`)
|
|
await createFolder({ folderName: 'New Folder From Root', page })
|
|
})
|
|
|
|
test('should create new folder from collection view', async () => {
|
|
await page.goto(postURL.byFolder)
|
|
await createFolder({ folderName: 'New Folder From Collection', fromDropdown: false, page })
|
|
})
|
|
|
|
test('should create new folder from document view', async () => {
|
|
await page.goto(postURL.create)
|
|
await createPostWithNoFolder()
|
|
const folderPill = page.locator('.doc-controls .move-doc-to-folder', { hasText: 'No Folder' })
|
|
await folderPill.click()
|
|
await createFolderFromDoc({ folderName: 'New Folder From Doc', page })
|
|
})
|
|
})
|
|
|
|
test.describe('Folder view actions', () => {
|
|
test('should show Browse by Folder button', async () => {
|
|
await page.goto(`${serverURL}/admin`)
|
|
const folderButton = page.locator('text=Browse by folder')
|
|
await expect(folderButton).toBeVisible()
|
|
})
|
|
|
|
test('should rename folder', async () => {
|
|
await page.goto(`${serverURL}/admin/browse-by-folder`)
|
|
await createFolder({ folderName: 'Test Folder', page })
|
|
await clickFolderCard({ folderName: 'Test Folder', page })
|
|
const editFolderDocButton = page.locator('.list-selection__actions button', {
|
|
hasText: 'Edit',
|
|
})
|
|
await editFolderDocButton.click()
|
|
await createFolderDoc({
|
|
page,
|
|
folderName: 'Renamed Folder',
|
|
folderType: ['Posts'],
|
|
})
|
|
await expect(page.locator('.payload-toast-container')).toContainText('successfully')
|
|
const renamedFolderCard = page
|
|
.locator('.folder-file-card__name', {
|
|
hasText: 'Renamed Folder',
|
|
})
|
|
.first()
|
|
await expect(renamedFolderCard).toBeVisible()
|
|
})
|
|
|
|
test('should delete folder', async () => {
|
|
await page.goto(`${serverURL}/admin/browse-by-folder`)
|
|
await createFolder({ folderName: 'Delete This Folder', page })
|
|
await clickFolderCard({ folderName: 'Delete This Folder', page })
|
|
const deleteButton = page.locator('.list-selection__actions button', {
|
|
hasText: 'Delete',
|
|
})
|
|
await deleteButton.click()
|
|
const confirmButton = page.getByRole('button', { name: 'Confirm' })
|
|
await confirmButton.click()
|
|
await expect(page.locator('.payload-toast-container')).toContainText('successfully')
|
|
const deletedFolderCard = page.locator('.folder-file-card__name', {
|
|
hasText: 'Delete This Folder',
|
|
})
|
|
await expect(deletedFolderCard).toBeHidden()
|
|
})
|
|
|
|
test('should delete folder but not delete documents', async () => {
|
|
await page.goto(`${serverURL}/admin/browse-by-folder`)
|
|
await createFolder({ folderName: 'Folder With Documents', page })
|
|
await createPostWithExistingFolder('Document 1', 'Folder With Documents')
|
|
await createPostWithExistingFolder('Document 2', 'Folder With Documents')
|
|
|
|
await page.goto(`${serverURL}/admin/browse-by-folder`)
|
|
await clickFolderCard({ folderName: 'Folder With Documents', page })
|
|
const deleteButton = page.locator('.list-selection__actions button', {
|
|
hasText: 'Delete',
|
|
})
|
|
await deleteButton.click()
|
|
const confirmButton = page.getByRole('button', { name: 'Confirm' })
|
|
await confirmButton.click()
|
|
await expect(page.locator('.payload-toast-container')).toContainText('successfully')
|
|
const deletedFolderCard = page.locator('.folder-file-card__name', {
|
|
hasText: 'Folder With Documents',
|
|
})
|
|
await expect(deletedFolderCard).toBeHidden()
|
|
|
|
await page.goto(postURL.list)
|
|
const firstDoc = page.locator('tbody .row-1')
|
|
const secondDoc = page.locator('tbody .row-2')
|
|
await expect(firstDoc).toContainText('Document 2')
|
|
await expect(secondDoc).toContainText('Document 1')
|
|
})
|
|
|
|
test('should move folder', async () => {
|
|
await page.goto(`${serverURL}/admin/browse-by-folder`)
|
|
await createFolder({ folderName: 'Move Into This Folder', page })
|
|
await createFolder({ folderName: 'Move Me', page })
|
|
await clickFolderCard({ folderName: 'Move Me', page })
|
|
const moveButton = page.locator('.list-selection__actions button', {
|
|
hasText: 'Move',
|
|
})
|
|
await moveButton.click()
|
|
await clickFolderCard({
|
|
folderName: 'Move Into This Folder',
|
|
page,
|
|
doubleClick: true,
|
|
rootLocator: page.locator('dialog#move-to-folder--list'),
|
|
})
|
|
const selectButton = page.locator(
|
|
'dialog#move-to-folder--list button[aria-label="Apply Changes"]',
|
|
)
|
|
await selectButton.click()
|
|
const confirmMoveButton = page
|
|
.locator('dialog#move-folder-drawer-confirm-move')
|
|
.getByRole('button', { name: 'Move' })
|
|
await confirmMoveButton.click()
|
|
await expect(page.locator('.payload-toast-container')).toContainText('successfully')
|
|
const movedFolderCard = page.locator('.folder-list--folders .folder-file-card__name', {
|
|
hasText: 'Move Me',
|
|
})
|
|
await expect(movedFolderCard).toBeHidden()
|
|
})
|
|
|
|
// this test currently fails in postgres
|
|
test('should create new document from folder', async () => {
|
|
await page.goto(`${serverURL}/admin/browse-by-folder`)
|
|
await createFolder({
|
|
folderName: 'Create New Here',
|
|
page,
|
|
folderType: ['Posts', 'Drafts'],
|
|
})
|
|
await clickFolderCard({ folderName: 'Create New Here', page, doubleClick: true })
|
|
const createDocButton = page.locator('.create-new-doc-in-folder__popup-button', {
|
|
hasText: 'Create document',
|
|
})
|
|
await expect(createDocButton).toBeVisible()
|
|
await createDocButton.click()
|
|
const postButton = page
|
|
.locator('.popup--active')
|
|
.locator('.popup-button-list__button', { hasText: 'Post' })
|
|
await expect(postButton).toBeVisible()
|
|
await postButton.click()
|
|
|
|
const drawer = page.locator('dialog#create-document--no-results-new-doc-in-folder-drawer')
|
|
const titleInput = drawer.locator('input[name="title"]')
|
|
await titleInput.fill('Document Created From Folder')
|
|
await drawer.getByRole('button', { name: 'Save', exact: true }).click()
|
|
|
|
await expect(page.locator('.payload-toast-container')).toContainText('successfully')
|
|
const folderCard = page.locator('.folder-file-card', {
|
|
has: page.locator('text=Document Created From Folder'),
|
|
})
|
|
await expect(folderCard).toBeVisible()
|
|
})
|
|
|
|
test('should create nested folder from folder view', async () => {
|
|
await page.goto(`${serverURL}/admin/browse-by-folder`)
|
|
await createFolder({ folderName: 'Parent Folder', page })
|
|
await clickFolderCard({ folderName: 'Parent Folder', page, doubleClick: true })
|
|
const pageTitle = page.locator('h1.list-header__title')
|
|
await expect(pageTitle).toHaveText('Parent Folder')
|
|
|
|
const createFolderButton = page.locator(
|
|
'.create-new-doc-in-folder__button:has-text("Create folder")',
|
|
)
|
|
await expect(createFolderButton).toBeVisible()
|
|
await createFolderButton.click()
|
|
|
|
await createFolderDoc({
|
|
page,
|
|
folderName: 'Nested Folder',
|
|
folderType: ['Posts'],
|
|
})
|
|
|
|
await expect(page.locator('.payload-toast-container')).toContainText('successfully')
|
|
await expect(page.locator('dialog#create-folder--no-results-new-folder-drawer')).toBeHidden()
|
|
})
|
|
|
|
test('should toggle between grid and list view', async () => {
|
|
await page.goto(`${serverURL}/admin/browse-by-folder`)
|
|
await createFolder({ folderName: 'Test Folder', page })
|
|
const listViewButton = page.locator('.folder-view-toggle-button').nth(1)
|
|
await listViewButton.click()
|
|
const listView = page.locator('.simple-table')
|
|
await expect(listView).toBeVisible()
|
|
|
|
const gridViewButton = page.locator('.folder-view-toggle-button').nth(0)
|
|
await gridViewButton.click()
|
|
const gridView = page.locator('.item-card-grid')
|
|
await expect(gridView).toBeVisible()
|
|
})
|
|
|
|
test('should sort folders', async () => {
|
|
await page.goto(`${serverURL}/admin/browse-by-folder`)
|
|
await createFolder({ folderName: 'A Folder', page })
|
|
await createFolder({ folderName: 'B Folder', page })
|
|
await createFolder({ folderName: 'C Folder', page })
|
|
|
|
const firstFolderCard = page.locator('.folder-file-card__name').first()
|
|
await expect(firstFolderCard).toHaveText('A Folder')
|
|
|
|
const sortButton = page.locator('.sort-by-pill', { hasText: 'Name' })
|
|
await sortButton.click()
|
|
const decendingSortButton = page.locator('.sort-by-pill__order-option', {
|
|
hasText: 'Descending',
|
|
})
|
|
await decendingSortButton.click()
|
|
|
|
const sortedFirstFolderCard = page.locator('.folder-file-card__name').first()
|
|
await expect(sortedFirstFolderCard).toHaveText('C Folder')
|
|
})
|
|
|
|
test('should allow filtering within folders', async () => {
|
|
await page.goto(`${serverURL}/admin/browse-by-folder`)
|
|
await createFolder({ folderName: 'Filtering Folder', page })
|
|
await clickFolderCard({ folderName: 'Filtering Folder', page, doubleClick: true })
|
|
|
|
const createNewDropdown = page.locator('.create-new-doc-in-folder__popup-button', {
|
|
hasText: 'Create New',
|
|
})
|
|
await createNewDropdown.click()
|
|
const createFolderButton = page.locator('.popup-button-list__button').first()
|
|
await createFolderButton.click()
|
|
await createFolderDoc({
|
|
page,
|
|
folderName: 'Nested Folder',
|
|
folderType: ['Posts'],
|
|
})
|
|
await expect(page.locator('.folder-file-card__name')).toHaveText('Nested Folder')
|
|
|
|
await createNewDropdown.click()
|
|
const createPostButton = page.locator('.popup-button-list__button', { hasText: 'Post' })
|
|
await createPostButton.click()
|
|
|
|
const postTitleInput = page.locator('input[id="field-title"]')
|
|
await postTitleInput.fill('Test Post')
|
|
const saveButton = page.locator('#action-save')
|
|
await saveButton.click()
|
|
await expect(page.locator('.payload-toast-container')).toContainText('successfully')
|
|
|
|
// should filter out folders and only show posts
|
|
await applyBrowseByFolderTypeFilter({
|
|
page,
|
|
type: { label: 'Folders', value: 'payload-folders' },
|
|
on: false,
|
|
})
|
|
const folderGroup = page.locator('.item-card-grid__title', { hasText: 'Folders' })
|
|
const postGroup = page.locator('.item-card-grid__title', { hasText: 'Documents' })
|
|
await expect(folderGroup).toBeHidden()
|
|
await expect(postGroup).toBeVisible()
|
|
|
|
// should filter out posts and only show folders
|
|
await applyBrowseByFolderTypeFilter({
|
|
page,
|
|
type: { label: 'Folders', value: 'payload-folders' },
|
|
on: true,
|
|
})
|
|
await applyBrowseByFolderTypeFilter({
|
|
page,
|
|
type: { label: 'Posts', value: 'posts' },
|
|
on: false,
|
|
})
|
|
|
|
await expect(folderGroup).toBeVisible()
|
|
await expect(postGroup).toBeHidden()
|
|
})
|
|
|
|
test('should allow searching within folders', async () => {
|
|
await page.goto(`${serverURL}/admin/browse-by-folder`)
|
|
await createFolder({ folderName: 'Test', page })
|
|
await createFolder({ folderName: 'Search Me', page })
|
|
|
|
const testFolderCard = page.locator('.folder-file-card__name', {
|
|
hasText: 'Test',
|
|
})
|
|
const searchFolderCard = page.locator('.folder-file-card__name', {
|
|
hasText: 'Search Me',
|
|
})
|
|
|
|
await expect(testFolderCard).toBeVisible()
|
|
await expect(searchFolderCard).toBeVisible()
|
|
|
|
const searchInput = page.locator('input[placeholder="Search by Name in Folders"]')
|
|
await searchInput.fill('Search Me')
|
|
await expect(testFolderCard).toBeHidden()
|
|
await expect(searchFolderCard).toBeVisible()
|
|
})
|
|
})
|
|
|
|
test.describe('Collection view actions', () => {
|
|
test.beforeEach(async () => {
|
|
await page.goto(`${serverURL}/admin/browse-by-folder`)
|
|
await createFolder({ folderName: 'Move Into This Folder', page })
|
|
await createPostWithNoFolder()
|
|
await page.goto(postURL.list)
|
|
})
|
|
|
|
test('should show By Folder button', async () => {
|
|
const folderButton = page.locator('.default-list-view-tabs__button', { hasText: 'By Folder' })
|
|
await expect(folderButton).toBeVisible()
|
|
})
|
|
test('should navigate to By Folder view', async () => {
|
|
const folderButton = page.locator('.default-list-view-tabs__button', { hasText: 'By Folder' })
|
|
await folderButton.click()
|
|
await expect(page).toHaveURL(`${serverURL}/admin/collections/posts/payload-folders`)
|
|
const foldersTitle = page.locator('.collection-folder-list', { hasText: 'Folders' })
|
|
await expect(foldersTitle).toBeVisible()
|
|
})
|
|
test('should show folder pill in doc row', async () => {
|
|
await page.goto(postURL.list)
|
|
const firstListItem = page.locator('tbody .row-1')
|
|
const folderPill = firstListItem.locator('.move-doc-to-folder')
|
|
await expect(folderPill).toHaveText('No Folder')
|
|
})
|
|
|
|
test('should update folder from doc folder pill', async () => {
|
|
await selectFolderAndConfirmMoveFromList({ folderName: 'Move Into This Folder', page })
|
|
await expect(page.locator('.payload-toast-container')).toContainText(
|
|
'Test Post has been moved',
|
|
)
|
|
})
|
|
|
|
test('should resolve folder pills and not get stuck as Loading...', async () => {
|
|
await selectFolderAndConfirmMoveFromList({ folderName: 'Move Into This Folder', page })
|
|
const folderPill = page.locator('tbody .row-1 .move-doc-to-folder')
|
|
await expect(folderPill).not.toHaveText('Loading...')
|
|
})
|
|
test('should show updated folder pill after folder change', async () => {
|
|
const folderPill = page.locator('tbody .row-1 .move-doc-to-folder')
|
|
await selectFolderAndConfirmMoveFromList({ folderName: 'Move Into This Folder', page })
|
|
await expect(folderPill).toHaveText('Move Into This Folder')
|
|
})
|
|
|
|
test('should show updated folder pill after removing doc folder', async () => {
|
|
const folderPill = page.locator('tbody .row-1 .move-doc-to-folder')
|
|
await selectFolderAndConfirmMoveFromList({ folderName: 'Move Into This Folder', page })
|
|
await expect(folderPill).toHaveText('Move Into This Folder')
|
|
await folderPill.click()
|
|
const drawerLocator = page.locator('dialog .move-folder-drawer')
|
|
await drawerLocator
|
|
.locator('.droppable-button.folderBreadcrumbs__crumb-item', {
|
|
hasText: 'Folder',
|
|
})
|
|
.click()
|
|
await expect(
|
|
drawerLocator.locator('.folder-file-card__name', { hasText: 'Move Into This Folder' }),
|
|
).toBeVisible()
|
|
await selectFolderAndConfirmMove({ page })
|
|
await expect(folderPill).toHaveText('No Folder')
|
|
})
|
|
|
|
test('should create folder from By Folder view', async () => {
|
|
await page.goto(postURL.byFolder)
|
|
const createButton = page.locator('.create-new-doc-in-folder__button', {
|
|
hasText: 'Create folder',
|
|
})
|
|
await createButton.click()
|
|
await createFolderDoc({
|
|
page,
|
|
folderName: 'New Folder From Collection',
|
|
folderType: ['Posts'],
|
|
})
|
|
await expect(page.locator('.payload-toast-container')).toContainText('successfully')
|
|
})
|
|
})
|
|
|
|
test.describe('Document view actions', () => {
|
|
test.beforeEach(async () => {
|
|
await page.goto(`${serverURL}/admin/browse-by-folder`)
|
|
await createFolder({ folderName: 'Test Folder', page })
|
|
await createPostWithNoFolder()
|
|
})
|
|
|
|
test('should show folder pill in doc controls', async () => {
|
|
const folderPill = page.locator('.doc-controls .move-doc-to-folder', { hasText: 'No Folder' })
|
|
await expect(folderPill).toBeVisible()
|
|
})
|
|
|
|
test('should update folder from folder pill in doc controls', async () => {
|
|
const folderPill = page.locator('.doc-controls .move-doc-to-folder', { hasText: 'No Folder' })
|
|
await folderPill.click()
|
|
await clickFolderCard({ folderName: 'Test Folder', doubleClick: true, page })
|
|
const selectButton = page
|
|
.locator('button[aria-label="Apply Changes"]')
|
|
.filter({ hasText: 'Select' })
|
|
await selectButton.click()
|
|
await expect(page.locator('.payload-toast-container')).toContainText(
|
|
'Test Post has been moved',
|
|
)
|
|
})
|
|
|
|
test('should show updated folder pill after folder change', async () => {
|
|
const folderPill = page.locator('.doc-controls .move-doc-to-folder', { hasText: 'No Folder' })
|
|
await folderPill.click()
|
|
await clickFolderCard({ folderName: 'Test Folder', doubleClick: true, page })
|
|
const selectButton = page
|
|
.locator('button[aria-label="Apply Changes"]')
|
|
.filter({ hasText: 'Select' })
|
|
await selectButton.click()
|
|
const updatedFolderPill = page.locator('.doc-controls .move-doc-to-folder', {
|
|
hasText: 'Test Folder',
|
|
})
|
|
await expect(updatedFolderPill).toBeVisible()
|
|
})
|
|
})
|
|
|
|
test.describe('Collection with browse by folders disabled', () => {
|
|
test('should not show omitted collection documents in browse by folder view', async () => {
|
|
await page.goto(OmittedFromBrowseBy.byFolder)
|
|
const folderName = 'Folder without omitted Docs'
|
|
await page.goto(OmittedFromBrowseBy.byFolder)
|
|
await createFolder({
|
|
folderName,
|
|
page,
|
|
fromDropdown: false,
|
|
folderType: ['Omitted From Browse By', 'Posts'],
|
|
})
|
|
|
|
// create document
|
|
await page.goto(OmittedFromBrowseBy.create)
|
|
const titleInput = page.locator('input[name="title"]')
|
|
await titleInput.fill('Omitted Doc')
|
|
await saveDocAndAssert(page)
|
|
|
|
// assign to folder
|
|
const folderPill = page.locator('.doc-controls .move-doc-to-folder', { hasText: 'No Folder' })
|
|
await folderPill.click()
|
|
await clickFolderCard({ folderName, page })
|
|
const selectButton = page
|
|
.locator('button[aria-label="Apply Changes"]')
|
|
.filter({ hasText: 'Select' })
|
|
await selectButton.click()
|
|
await saveDocAndAssert(page)
|
|
|
|
// go to browse by folder view
|
|
await page.goto(`${serverURL}/admin/browse-by-folder`)
|
|
await clickFolderCard({ folderName, page, doubleClick: true })
|
|
|
|
// folder should be empty
|
|
await expectNoResultsAndCreateFolderButton({ page })
|
|
})
|
|
|
|
test('should not show collection type in browse by folder view', async () => {
|
|
const folderName = 'omitted collection pill test folder'
|
|
await page.goto(`${serverURL}/admin/browse-by-folder`)
|
|
await createFolder({ folderName, page })
|
|
await clickFolderCard({ folderName, page, doubleClick: true })
|
|
|
|
await page.locator('button:has(.collection-type__count)').click()
|
|
|
|
await expect(
|
|
page.locator('.checkbox-input .field-label', {
|
|
hasText: 'Omitted From Browse By',
|
|
}),
|
|
).toBeHidden()
|
|
})
|
|
})
|
|
|
|
test.describe('Multiple select options', () => {
|
|
test.beforeEach(async () => {
|
|
await page.goto(`${serverURL}/admin/browse-by-folder`)
|
|
await createFolder({ folderName: 'Test Folder 1', page })
|
|
await createFolder({ folderName: 'Test Folder 2', page })
|
|
await createFolder({ folderName: 'Test Folder 3', page })
|
|
})
|
|
|
|
test('should show how many folders are selected', async () => {
|
|
const firstFolderCard = page.locator('.folder-file-card', {
|
|
hasText: 'Test Folder 1',
|
|
})
|
|
const thirdFolderCard = page.locator('.folder-file-card', {
|
|
hasText: 'Test Folder 3',
|
|
})
|
|
|
|
await page.keyboard.up('Shift')
|
|
await firstFolderCard.click()
|
|
await page.keyboard.down('Shift')
|
|
await thirdFolderCard.click()
|
|
|
|
const selectedCount = page.locator('.list-selection')
|
|
await expect(selectedCount).toContainText('3 selected')
|
|
})
|
|
|
|
test('should allow multiple folder delete', async () => {
|
|
const firstFolderCard = page.locator('.folder-file-card', {
|
|
hasText: 'Test Folder 1',
|
|
})
|
|
const thirdFolderCard = page.locator('.folder-file-card', {
|
|
hasText: 'Test Folder 3',
|
|
})
|
|
|
|
await page.keyboard.up('Shift')
|
|
await firstFolderCard.click()
|
|
await page.keyboard.down('Shift')
|
|
await thirdFolderCard.click()
|
|
|
|
const deleteButton = page.locator('.list-selection__actions button', {
|
|
hasText: 'Delete',
|
|
})
|
|
await deleteButton.click()
|
|
const confirmButton = page.getByRole('button', { name: 'Confirm' })
|
|
await confirmButton.click()
|
|
await expect(page.locator('.payload-toast-container')).toContainText('successfully')
|
|
await expect(firstFolderCard).toBeHidden()
|
|
})
|
|
test('should move multiple folders', async () => {
|
|
await createFolder({ folderName: 'Move into here', page })
|
|
const firstFolderCard = page.locator('.folder-file-card', {
|
|
hasText: 'Test Folder 1',
|
|
})
|
|
const thirdFolderCard = page.locator('.folder-file-card', {
|
|
hasText: 'Test Folder 3',
|
|
})
|
|
|
|
await page.keyboard.up('Shift')
|
|
await firstFolderCard.click()
|
|
await page.keyboard.down('Shift')
|
|
await thirdFolderCard.click()
|
|
|
|
const moveButton = page.locator('.list-selection__actions button', {
|
|
hasText: 'Move',
|
|
})
|
|
await moveButton.click()
|
|
const destinationFolder = page.locator('dialog#move-to-folder--list .folder-file-card', {
|
|
hasText: 'Move into here',
|
|
})
|
|
await destinationFolder.click()
|
|
await selectFolderAndConfirmMove({ page })
|
|
await expect(page.locator('.payload-toast-container')).toContainText('moved')
|
|
await expect(firstFolderCard).toBeHidden()
|
|
})
|
|
})
|
|
|
|
test.describe('should inherit folderType select values from parent folder', () => {
|
|
test('should scope folderType select options for: scoped > child folder', async () => {
|
|
await page.goto(`${serverURL}/admin/browse-by-folder`)
|
|
await createFolder({ folderName: 'Posts and Media', page, folderType: ['Posts', 'Media'] })
|
|
await clickFolderCard({ folderName: 'Posts and Media', page, doubleClick: true })
|
|
|
|
const createNewDropdown = page.locator('.create-new-doc-in-folder__popup-button', {
|
|
hasText: 'Create New',
|
|
})
|
|
await createNewDropdown.click()
|
|
const createFolderButton = page.locator(
|
|
'.list-header__title-actions .popup-button-list__button',
|
|
{ hasText: 'Folder' },
|
|
)
|
|
await createFolderButton.click()
|
|
|
|
const drawer = page.locator('dialog .collection-edit--payload-folders')
|
|
const titleInput = drawer.locator('#field-name')
|
|
await titleInput.fill('Should only allow Posts and Media')
|
|
const selectLocator = drawer.locator('#field-folderType')
|
|
await expect(selectLocator).toBeVisible()
|
|
|
|
// should prefill with Posts and Media
|
|
await expect
|
|
.poll(async () => {
|
|
const options = await getSelectInputValue<true>({ selectLocator, multiSelect: true })
|
|
return options.sort()
|
|
})
|
|
.toEqual(['Posts', 'Media'].sort())
|
|
|
|
// should have no more select options available
|
|
await openSelectMenu({ selectLocator })
|
|
await expect(
|
|
selectLocator.locator('.rs__menu-notice', { hasText: 'No options' }),
|
|
).toBeVisible()
|
|
})
|
|
|
|
test('should scope folderType select options for: unscoped > scoped > child folder', async () => {
|
|
await page.goto(`${serverURL}/admin/browse-by-folder`)
|
|
|
|
// create an unscoped parent folder
|
|
await createFolder({ folderName: 'All collections', page, folderType: [] })
|
|
await clickFolderCard({ folderName: 'All collections', page, doubleClick: true })
|
|
|
|
// create a scoped child folder
|
|
await createFolder({
|
|
folderName: 'Posts and Media',
|
|
page,
|
|
folderType: ['Posts', 'Media'],
|
|
fromDropdown: true,
|
|
})
|
|
await clickFolderCard({ folderName: 'Posts and Media', page, doubleClick: true })
|
|
|
|
await expect(
|
|
page.locator('.step-nav', {
|
|
hasText: 'Posts and Media',
|
|
}),
|
|
).toBeVisible()
|
|
|
|
const titleActionsLocator = page.locator('.list-header__title-actions')
|
|
await expect(titleActionsLocator).toBeVisible()
|
|
const folderDropdown = page.locator(
|
|
'.list-header__title-actions .create-new-doc-in-folder__action-popup',
|
|
{
|
|
hasText: 'Create',
|
|
},
|
|
)
|
|
await expect(folderDropdown).toBeVisible()
|
|
await folderDropdown.click()
|
|
const createFolderButton = page.locator(
|
|
'.list-header__title-actions .popup-button-list__button',
|
|
{
|
|
hasText: 'Folder',
|
|
},
|
|
)
|
|
await createFolderButton.click()
|
|
|
|
const drawer = page.locator('dialog .collection-edit--payload-folders')
|
|
const titleInput = drawer.locator('#field-name')
|
|
await titleInput.fill('Should only allow posts and media')
|
|
const selectLocator = drawer.locator('#field-folderType')
|
|
await expect(selectLocator).toBeVisible()
|
|
|
|
// should not prefill with any options
|
|
await expect
|
|
.poll(async () => {
|
|
const options = await getSelectInputValue<true>({ selectLocator, multiSelect: true })
|
|
return options.sort()
|
|
})
|
|
.toEqual(['Posts', 'Media'].sort())
|
|
|
|
// should have no more select options available
|
|
await openSelectMenu({ selectLocator })
|
|
await expect(
|
|
selectLocator.locator('.rs__menu-notice', { hasText: 'No options' }),
|
|
).toBeVisible()
|
|
})
|
|
|
|
test('should not scope child folder of an unscoped parent folder', async () => {
|
|
await page.goto(`${serverURL}/admin/browse-by-folder`)
|
|
await createFolder({ folderName: 'All collections', page, folderType: [] })
|
|
await clickFolderCard({ folderName: 'All collections', page, doubleClick: true })
|
|
|
|
const createNewDropdown = page.locator('.create-new-doc-in-folder__popup-button', {
|
|
hasText: 'Create New',
|
|
})
|
|
await createNewDropdown.click()
|
|
const createFolderButton = page.locator(
|
|
'.list-header__title-actions .popup-button-list__button',
|
|
{ hasText: 'Folder' },
|
|
)
|
|
await createFolderButton.click()
|
|
|
|
const drawer = page.locator('dialog .collection-edit--payload-folders')
|
|
const titleInput = drawer.locator('#field-name')
|
|
await titleInput.fill('Should allow all collections')
|
|
const selectLocator = drawer.locator('#field-folderType')
|
|
await expect(selectLocator).toBeVisible()
|
|
|
|
// should not prefill with any options
|
|
await expect
|
|
.poll(async () => {
|
|
const options = await getSelectInputValue<true>({ selectLocator, multiSelect: true })
|
|
return options
|
|
})
|
|
.toEqual([])
|
|
|
|
// should have many options
|
|
await expect
|
|
.poll(async () => {
|
|
const options = await getSelectInputOptions({ selectLocator })
|
|
return options.length
|
|
})
|
|
.toBeGreaterThan(4)
|
|
})
|
|
})
|
|
|
|
// Helper functions
|
|
|
|
async function createPostWithNoFolder() {
|
|
await page.goto(postURL.create)
|
|
const titleInput = page.locator('input[name="title"]')
|
|
await titleInput.fill('Test Post')
|
|
await saveDocAndAssert(page)
|
|
}
|
|
|
|
async function createPostWithExistingFolder(postTitle: string, folderName: string) {
|
|
await page.goto(postURL.create)
|
|
const titleInput = page.locator('input[name="title"]')
|
|
await titleInput.fill(postTitle)
|
|
await saveDocAndAssert(page)
|
|
const folderPill = page.locator('.doc-controls .move-doc-to-folder', { hasText: 'No Folder' })
|
|
await folderPill.click()
|
|
await clickFolderCard({ folderName, page })
|
|
const selectButton = page
|
|
.locator('button[aria-label="Apply Changes"]')
|
|
.filter({ hasText: 'Select' })
|
|
await selectButton.click()
|
|
}
|
|
})
|
|
|
|
// tests to write
|
|
// ------ NICE TO HAVE -------
|
|
// - check copy is correct in the confirm modal and toast notifications when moving docs / folders
|
|
// - when moving from no folder to folder
|
|
// - when moving folder to no folder
|
|
// - when moving from folder to folder
|