mirror of https://github.com/nocodb/nocodb
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
157 lines
5.1 KiB
157 lines
5.1 KiB
import { expect } from '@playwright/test'; |
|
import BasePage from '../../../Base'; |
|
import { ToolbarPage } from './index'; |
|
import { getTextExcludeIconText } from '../../../../tests/utils/general'; |
|
|
|
export class ToolbarGroupByPage extends BasePage { |
|
readonly toolbar: ToolbarPage; |
|
|
|
constructor(toolbar: ToolbarPage) { |
|
super(toolbar.rootPage); |
|
this.toolbar = toolbar; |
|
} |
|
|
|
get() { |
|
return this.rootPage.locator(`[data-testid="nc-group-by-menu"]`); |
|
} |
|
|
|
async verify({ index, column, direction }: { index: number; column: string; direction: string }) { |
|
const fieldLocator = this.get().locator('.nc-sort-field-select').nth(index); |
|
const fieldText = await getTextExcludeIconText(fieldLocator); |
|
expect(fieldText).toBe(column); |
|
|
|
await expect(this.get().locator('.nc-sort-dir-select >> span.ant-select-selection-item').nth(index)).toHaveText( |
|
direction |
|
); |
|
} |
|
|
|
async reset() { |
|
// open group-by menu |
|
await this.toolbar.clickGroupBy(); |
|
|
|
const groupByCount = await this.rootPage.locator('.nc-group-by-item-remove-btn').count(); |
|
for (let i = groupByCount - 1; i > -1; i--) { |
|
await this.rootPage.locator('.nc-group-by-item-remove-btn').nth(i).click(); |
|
} |
|
|
|
// close group-by menu |
|
await this.toolbar.clickGroupBy(); |
|
await this.toolbar.parent.waitLoading(); |
|
} |
|
|
|
async update({ index, title, ascending }: { index: number; title: string; ascending: boolean }) { |
|
await this.toolbar.clickGroupBy(); |
|
|
|
// Update the Column and Direction of the Group By at the given index |
|
await this.rootPage.locator('.nc-sort-field-select').nth(index).click(); |
|
await this.rootPage |
|
.locator('div.ant-select-dropdown.nc-dropdown-toolbar-field-list') |
|
.locator(`div[label="${title}"]`) |
|
.last() |
|
.click(); |
|
|
|
//kludge: wait for rendering to stabilize |
|
await this.rootPage.waitForTimeout(1000); |
|
|
|
await this.rootPage.locator('.nc-sort-dir-select').nth(index).waitFor({ state: 'visible' }); |
|
await this.rootPage.locator('.nc-sort-dir-select').nth(index).click({ force: true }); |
|
await this.rootPage |
|
.locator('.nc-dropdown-sort-dir') |
|
.last() |
|
.locator('.ant-select-item') |
|
.nth(ascending ? 0 : 1) |
|
.click(); |
|
|
|
await this.toolbar.parent.dashboard.waitForLoaderToDisappear(); |
|
// close group-by menu |
|
await this.toolbar.clickGroupBy(); |
|
await this.toolbar.parent.waitLoading(); |
|
} |
|
|
|
async add({ title, ascending, locallySaved }: { title: string; ascending: boolean; locallySaved: boolean }) { |
|
// open group-by menu |
|
await this.toolbar.clickGroupBy(); |
|
|
|
// Check if create group-by modal is open or group-by list is open |
|
let isGroupByListOpen = false; |
|
for (let i = 0; i < 3; i++) { |
|
const groupByList = this.rootPage.locator('.nc-group-by-list'); |
|
if (await groupByList.isVisible()) { |
|
isGroupByListOpen = true; |
|
break; |
|
} |
|
|
|
const searchInput = this.rootPage.locator('.nc-group-by-create-modal'); |
|
if (await searchInput.isVisible()) { |
|
isGroupByListOpen = false; |
|
break; |
|
} |
|
|
|
await this.rootPage.waitForTimeout(150); |
|
} |
|
|
|
if (isGroupByListOpen) { |
|
await this.get().locator('button:has-text("New Subgroup")').click(); |
|
} |
|
|
|
const regexTitle = new RegExp(`^${title}`); |
|
|
|
await this.rootPage |
|
.locator('.nc-group-by-create-modal') |
|
.locator('.nc-group-by-column-search-item', { hasText: regexTitle }) |
|
.scrollIntoViewIfNeeded(); |
|
|
|
// select column |
|
const selectColumn = async () => |
|
await this.rootPage |
|
.locator('.nc-group-by-create-modal') |
|
.locator('.nc-group-by-column-search-item', { hasText: regexTitle }) |
|
.click({ force: true }); |
|
|
|
await this.waitForResponse({ |
|
uiAction: selectColumn, |
|
httpMethodsToMatch: ['GET'], |
|
requestUrlPathToMatch: locallySaved ? `/api/v1/db/public/` : `/api/v1/db/data/noco/`, |
|
}); |
|
|
|
await this.rootPage.locator('.nc-sort-dir-select').last().click(); |
|
const selectSortDirection = () => |
|
this.rootPage |
|
.locator('.nc-dropdown-sort-dir') |
|
.last() |
|
.locator('.ant-select-item') |
|
.nth(ascending ? 0 : 1) |
|
.click(); |
|
|
|
const selectedSortDirection = await this.rootPage.locator('.nc-sort-dir-select').last().textContent(); |
|
|
|
if ((ascending && selectedSortDirection != 'A → Z') || (!ascending && selectedSortDirection != 'Z → A')) { |
|
await this.waitForResponse({ |
|
uiAction: selectSortDirection, |
|
httpMethodsToMatch: ['GET'], |
|
requestUrlPathToMatch: locallySaved ? `/api/v1/db/public/` : `/api/v1/db/data/noco/`, |
|
}); |
|
} |
|
|
|
await this.toolbar.parent.dashboard.waitForLoaderToDisappear(); |
|
|
|
// close group-by menu |
|
await this.toolbar.clickGroupBy(); |
|
await this.toolbar.parent.waitLoading(); |
|
} |
|
|
|
async remove({ index }: { index: number }) { |
|
// open group-by menu |
|
await this.toolbar.clickGroupBy(); |
|
|
|
await this.waitForResponse({ |
|
uiAction: () => this.rootPage.locator('.nc-group-by-item-remove-btn').nth(index).click(), |
|
requestUrlPathToMatch: '/api/v1/db/data/noco', |
|
httpMethodsToMatch: ['GET'], |
|
}); |
|
|
|
// close group-by menu |
|
await this.toolbar.clickGroupBy(); |
|
await this.toolbar.parent.waitLoading(); |
|
} |
|
}
|
|
|