Some checks failed
App Prod-Parity E2E Dispatch / dispatch (push) Failing after 10s
CD Storybook UI / build (push) Failing after 3m25s
CD Storybook UI / dispatch (push) Has been skipped
CD deploy main / website-changed-files (push) Successful in 18m8s
CI Agent Skills / changed-files-check (push) Successful in 18m9s
CI Create App E2E minimal / changed-files-check (push) Successful in 24s
CI Create App / changed-files-check (push) Successful in 26s
CI Docs / changed-files-check (push) Successful in 26s
CI Emails / changed-files-check (push) Successful in 28s
CI Example App Hello World / changed-files-check (push) Successful in 23s
CI Front / changed-files-check (push) Has been skipped
CI Example App Postcard / changed-files-check (push) Successful in 27s
CI UI / changed-files-check (push) Has been skipped
CI Utils Test / changed-files-check (push) Successful in 45s
CI Twenty Apps / discover (push) Successful in 1m3s
CD deploy main / deploy-main (push) Failing after 3s
CI Agent Skills / agent-skills-validate (push) Has been skipped
CI Create App / create-app-test (lint) (push) Has been skipped
CI Emails / emails-test (push) Has been skipped
CI Front / front-task (lingui:compile) (push) Has been skipped
CI Front / front-task (lint) (push) Has been skipped
CI Example App Postcard / example-app-postcard (push) Has been skipped
CI UI / ui-task (lint) (push) Has been skipped
CI UI / ui-task (pack-size) (push) Has been skipped
CI UI / ui-task (size) (push) Has been skipped
CI UI / ui-task (test) (push) Has been skipped
CI UI / ui-task (typecheck) (push) Has been skipped
CI Utils Test / utils-test (push) Has been skipped
CI Twenty Apps / ${{ matrix.app.name }} (push) Has been skipped
CI Emails / ci-emails-status-check (push) Successful in 2s
CI Example App Hello World / ci-example-app-hello-world-status-check (push) Successful in 2s
CI Example App Postcard / ci-example-app-postcard-status-check (push) Successful in 3s
CI UI / ui-sb-test (push) Has been skipped
CI Utils Test / ci-utils-test-status-check (push) Successful in 2s
CI Twenty Apps / ci-twenty-apps-status-check (push) Successful in 2s
CI UI / ci-ui-status-check (push) Successful in 2s
CI Desktop / desktop (push) Failing after 1m8s
Push docs to Crowdin / Push documentation to Crowdin (push) Failing after 55s
Push translations to Crowdin / Extract and upload translations (push) Failing after 5s
Push website translations to Crowdin / Extract and upload website translations (push) Failing after 5s
CI Create App / create-app-test (test) (push) Has been skipped
CI Create App / create-app-test (typecheck) (push) Has been skipped
CI Docs / docs-lint (push) Has been skipped
CI Example App Hello World / example-app-hello-world (push) Has been skipped
CI Front / front-task (lingui:extract) (push) Has been skipped
CI Front / front-task (test) (push) Has been skipped
CI Front / front-task (typecheck) (push) Has been skipped
CI UI / ui-sb-build (push) Failing after 1m32s
CI Twenty Apps / ${{ matrix.app.name }} (${{ matrix.server-source }}) (push) Has been skipped
CI Agent Skills / agent-skills-publish (push) Has been skipped
CI Create App / ci-create-app-status-check (push) Successful in 2s
CI Agent Skills / agent-skills-remote-source (push) Has been skipped
CI Create App E2E minimal / create-app-e2e-minimal (push) Has been cancelled
CI E2E Main / e2e-test (push) Has been cancelled
CI Front / front-sb-build (push) Has been cancelled
CI Front / front-build (push) Has been cancelled
CI Create App E2E minimal / ci-create-app-e2e-minimal-status-check (push) Has been cancelled
CI E2E Main / ci-e2e-main-status-check (push) Has been cancelled
CI E2E Main / notify-main-ci-failure (push) Has been cancelled
CI E2E Main / qa-scout-comment (push) Has been cancelled
CI Front / front-sb-test (push) Has been cancelled
CI Front / front-sb-screenshots (push) Has been cancelled
CI Front / ci-front-status-check (push) Has been cancelled
DPA Sub-Processor Sync / sync-subprocessors (push) Failing after 3s
AI Catalog Sync / sync-catalog (push) Failing after 2s
188 lines
5.6 KiB
TypeScript
188 lines
5.6 KiB
TypeScript
import { Locator, Page } from '@playwright/test';
|
|
|
|
export class MainPage {
|
|
// TODO: add missing elements (advanced filters, import/export popups)
|
|
private readonly tableViews: Locator;
|
|
private readonly addViewButton: Locator;
|
|
private readonly viewIconSelect: Locator;
|
|
private readonly viewNameInput: Locator;
|
|
private readonly viewTypeSelect: Locator;
|
|
private readonly createViewButton: Locator;
|
|
private readonly deleteViewButton: Locator;
|
|
private readonly filterButton: Locator;
|
|
private readonly searchFieldInput: Locator;
|
|
private readonly advancedFilterButton: Locator;
|
|
private readonly addFilterButton: Locator;
|
|
private readonly resetFilterButton: Locator;
|
|
private readonly saveFilterAsViewButton: Locator;
|
|
private readonly sortButton: Locator;
|
|
private readonly sortOrderButton: Locator;
|
|
private readonly optionsButton: Locator;
|
|
private readonly fieldsButton: Locator;
|
|
private readonly goBackButton: Locator;
|
|
private readonly hiddenFieldsButton: Locator;
|
|
private readonly editFieldsButton: Locator;
|
|
private readonly importButton: Locator;
|
|
private readonly deletedRecordsButton: Locator;
|
|
private readonly createNewRecordButton: Locator;
|
|
private readonly addToFavoritesButton: Locator;
|
|
private readonly deleteFromFavoritesButton: Locator;
|
|
private readonly exportBottomBarButton: Locator;
|
|
private readonly deleteRecordsButton: Locator;
|
|
|
|
constructor(public readonly page: Page) {
|
|
this.tableViews = page.getByText('·');
|
|
this.addViewButton = page
|
|
.getByTestId('tooltip')
|
|
.filter({ hasText: /^Add view$/ });
|
|
this.viewIconSelect = page.getByLabel('Click to select icon (');
|
|
this.viewNameInput; // can be selected using only actual value
|
|
this.viewTypeSelect = page.locator(
|
|
"//span[contains(., 'View type')]/../div",
|
|
);
|
|
this.createViewButton = page.getByRole('button', { name: 'Create' });
|
|
this.deleteViewButton = page.getByRole('button', { name: 'Delete' });
|
|
this.filterButton = page.getByText('Filter');
|
|
this.searchFieldInput = page.getByPlaceholder('Search fields');
|
|
this.advancedFilterButton = page
|
|
.getByTestId('tooltip')
|
|
.filter({ hasText: /^Advanced filter$/ });
|
|
this.addFilterButton = page.getByRole('button', { name: 'Add Filter' });
|
|
this.resetFilterButton = page.getByTestId('cancel-button');
|
|
this.saveFilterAsViewButton = page.getByRole('button', {
|
|
name: 'Save as new view',
|
|
});
|
|
this.sortButton = page.getByText('Sort');
|
|
this.sortOrderButton = page.locator('//li');
|
|
this.optionsButton = page.getByText('Options');
|
|
this.fieldsButton = page.getByText('Fields');
|
|
this.goBackButton = page.getByTestId('dropdown-menu-header-end-icon');
|
|
this.hiddenFieldsButton = page
|
|
.getByTestId('tooltip')
|
|
.filter({ hasText: /^Hidden Fields$/ });
|
|
this.editFieldsButton = page
|
|
.getByTestId('tooltip')
|
|
.filter({ hasText: /^Edit Fields$/ });
|
|
this.importButton = page
|
|
.getByTestId('tooltip')
|
|
.filter({ hasText: /^Import$/ });
|
|
this.deletedRecordsButton = page
|
|
.getByTestId('tooltip')
|
|
.filter({ hasText: /^Deleted */ });
|
|
this.createNewRecordButton = page.getByTestId('add-button');
|
|
this.addToFavoritesButton = page.getByText('Add to favorites');
|
|
this.deleteFromFavoritesButton = page.getByText('Delete from favorites');
|
|
this.deleteRecordsButton = page.getByText('Delete');
|
|
}
|
|
|
|
async clickTableViews() {
|
|
await this.tableViews.click();
|
|
}
|
|
|
|
async clickAddViewButton() {
|
|
await this.addViewButton.click();
|
|
}
|
|
|
|
async typeViewName(name: string) {
|
|
await this.viewNameInput.clear();
|
|
await this.viewNameInput.fill(name);
|
|
}
|
|
|
|
// name can be either be 'Table' or 'Kanban'
|
|
async selectViewType(name: string) {
|
|
await this.viewTypeSelect.click();
|
|
await this.page.getByTestId('tooltip').filter({ hasText: name }).click();
|
|
}
|
|
|
|
async createView() {
|
|
await this.createViewButton.click();
|
|
}
|
|
|
|
async deleteView() {
|
|
await this.deleteViewButton.click();
|
|
}
|
|
|
|
async clickFilterButton() {
|
|
await this.filterButton.click();
|
|
}
|
|
|
|
async searchFields(name: string) {
|
|
await this.searchFieldInput.clear();
|
|
await this.searchFieldInput.fill(name);
|
|
}
|
|
|
|
async clickAdvancedFilterButton() {
|
|
await this.advancedFilterButton.click();
|
|
}
|
|
|
|
async addFilter() {
|
|
await this.addFilterButton.click();
|
|
}
|
|
|
|
async resetFilter() {
|
|
await this.resetFilterButton.click();
|
|
}
|
|
|
|
async saveFilterAsView() {
|
|
await this.saveFilterAsViewButton.click();
|
|
}
|
|
|
|
async clickSortButton() {
|
|
await this.sortButton.click();
|
|
}
|
|
|
|
//can be Ascending or Descending
|
|
async setSortOrder(name: string) {
|
|
await this.sortOrderButton.click();
|
|
await this.page.getByTestId('tooltip').filter({ hasText: name }).click();
|
|
}
|
|
|
|
async clickOptionsButton() {
|
|
await this.optionsButton.click();
|
|
}
|
|
|
|
async clickFieldsButton() {
|
|
await this.fieldsButton.click();
|
|
}
|
|
|
|
async clickBackButton() {
|
|
await this.goBackButton.click();
|
|
}
|
|
|
|
async clickHiddenFieldsButton() {
|
|
await this.hiddenFieldsButton.click();
|
|
}
|
|
|
|
async clickEditFieldsButton() {
|
|
await this.editFieldsButton.click();
|
|
}
|
|
|
|
async clickImportButton() {
|
|
await this.importButton.click();
|
|
}
|
|
|
|
async clickDeletedRecordsButton() {
|
|
await this.deletedRecordsButton.click();
|
|
}
|
|
|
|
async clickCreateNewRecordButton() {
|
|
await this.createNewRecordButton.click();
|
|
}
|
|
|
|
async clickAddToFavoritesButton() {
|
|
await this.addToFavoritesButton.click();
|
|
}
|
|
|
|
async clickDeleteFromFavoritesButton() {
|
|
await this.deleteFromFavoritesButton.click();
|
|
}
|
|
|
|
async clickExportBottomBarButton() {
|
|
await this.exportBottomBarButton.click();
|
|
}
|
|
|
|
async clickDeleteRecordsButton() {
|
|
await this.deleteRecordsButton.click();
|
|
}
|
|
}
|