2026-06-24 20:31:05 +05:00

162 lines
5.1 KiB
TypeScript

import {ElementHandle, Page} from '@playwright/test';
import {slct, waitForCondition} from '../../utils';
import {CommonSelectors} from '../constants/common-selectors';
import {ChartSettingsDialogQA} from '../../../src/shared';
export enum ChartSettingsItems {
Navigator = 'navigator-switcher',
Groupping = 'groupping-switcher',
Pagination = 'pagination-switcher',
TitleMode = 'title-mode-switcher',
Totals = 'totals-switcher',
Legend = 'legend-switcher',
TooltipSum = 'tooltip-sum-switcher',
PivotTableFallback = 'pivot-fallback-switcher',
}
export default class ChartSettings {
private dialogCloseButtonSelector = '.wizard-chart-settings .g-dialog-btn-close__btn';
private limitInputSelector = '.dialog-settings-limit-input__text-input input';
private applyButtonSelector = '.wizard-chart-settings .g-dialog-footer__button-apply';
private openChartSettingsSelector = slct('visualization-select-settings-btn');
private titleInput = slct('title-input');
private page: Page;
constructor(page: Page) {
this.page = page;
}
async open() {
await this.page.click(this.openChartSettingsSelector);
}
async close() {
await this.page.click(this.dialogCloseButtonSelector);
}
async isPaginationSwitcherDisabled() {
let classAttribute: string | null | undefined;
await waitForCondition(async () => {
const paginationItem = await this.page.$(slct(ChartSettingsItems.Pagination));
classAttribute = await paginationItem?.getAttribute('class');
return classAttribute;
}).catch(() => {
throw new Error('Attribute class not found in pagination selector');
});
return classAttribute?.includes('g-switch_disabled');
}
async getSettingItem(settingQa: string) {
let settingItem: null | ElementHandle | undefined;
await waitForCondition(async () => {
settingItem = await this.page.$(slct(settingQa));
return settingItem;
}).catch(() => {
throw new Error(`Settings was not found: ${settingItem}`);
});
return settingItem!;
}
async checkItemAttribute(settingItem: ElementHandle, expectedMode: 'on' | 'off') {
let checkedAttribute: string | null | undefined;
await waitForCondition(async () => {
const inputItem = await settingItem.$('input');
checkedAttribute = await inputItem?.getAttribute('aria-checked');
if (checkedAttribute) {
return expectedMode === 'on'
? checkedAttribute === 'true'
: checkedAttribute === 'false';
} else {
throw new Error('Attribute responsible for checked status not found');
}
}).catch(() => {
throw new Error(
`Mode attribute ${checkedAttribute}, and expected ${
expectedMode === 'on' ? 'true' : 'false'
}`,
);
});
}
async toggleSettingItem(settingQa: string, mode: 'on' | 'off') {
const settingItem: ElementHandle = await this.getSettingItem(settingQa);
await settingItem.click();
await this.checkItemAttribute(settingItem, mode);
}
async checkSettingMode(settingQa: string, mode: 'on' | 'off') {
const settingItem: ElementHandle = await this.getSettingItem(settingQa);
await this.checkItemAttribute(settingItem, mode);
}
async getTitleValue() {
return await this.page.locator(`${this.titleInput} input`).inputValue();
}
async setTitle(title: string) {
await this.page.fill(`${this.titleInput} input`, title);
}
async setLimit(limit: number) {
await this.page.fill(this.limitInputSelector, String(limit));
}
async setFeed(feedValue: string) {
await this.page.fill(`${slct('feed-input')} input`, feedValue);
}
async setMetricFontSize(size: string) {
const sizeOption = this.page
.locator(slct(ChartSettingsDialogQA.IndicatorFontSize))
.locator(CommonSelectors.RadioButtonOption, {hasText: size});
await sizeOption.click();
}
async setNavigatorLinesMode(linesMode: 'all' | 'selected') {
await this.page.click(
`${slct('navigator-lines-mode')} ${
CommonSelectors.RadioButtonOptionControl
}[value=${linesMode}]`,
{force: true},
);
}
async selectLines(names: string[]) {
// Click and open the selector
await this.page.click(`${slct('navigator-lines-select')}`);
for (const name of names) {
await this.page.click(`${slct('select-list')} >> text=${name}`);
}
// Closing the selector, since it is a multiselect
await this.page.click(`${slct('navigator-lines-select')}`);
}
async waitForSettingsRender() {
await waitForCondition(async () => {
return await this.page.$('.wizard-chart-settings__settings');
});
}
async apply() {
await this.page.click(this.applyButtonSelector);
}
}