import { Form } from '../../../e2elib/lib/src/pageobjects/form.component';
|
import { ListRow } from '../../../e2elib/lib/src/pageobjects/list/listrow.component';
|
import { DialogBookmark } from '../../dialogs/dialog.bookmark';
|
import { Button } from '../../../e2elib/lib/src/pageobjects/button/button.component';
|
import { ListBase } from '../../../libappbase/listbase';
|
import { ListSOP } from '../../../libappsop/listsop';
|
import { DialogDummy } from '../../dialogs/dialog.dummy';
|
import { ButtonSOP } from '../../../libappsop/buttonsop';
|
import { DataHierarchy, DataHierarchyProvider } from '../../../libappsop/datahierarchy';
|
import { PanelPeriod } from './panel.period';
|
|
export class FormNavigationPanel extends Form {
|
public static readonly btnAddBookmark = 'Bookmark current selection';
|
|
// Buttons
|
public btnBookmark = new ButtonSOP('ButtonNavBookmark');
|
public btnEntity = new ButtonSOP('ButtonNavEntity');
|
public btnProduct = new ButtonSOP('ButtonNavProduct');
|
public btnSalesSegment = new ButtonSOP('ButtonNavSalesSegment');
|
public btnHome = new ButtonSOP('ButtonNavHome');
|
public btnPeriod = new ButtonSOP('ButtonNavPeriod');
|
public btnAddBookmark = new ButtonSOP('ButtonNavAddBookmark');
|
|
// Lists
|
public listBookmark = new ListBookmark();
|
public listEntity = new ListEntity();
|
public listProduct = new ListProduct();
|
public listSalesSegment = new ListSalesSegment();
|
|
// Panels
|
public pnlPeriod = new PanelPeriod();
|
|
public constructor() {
|
super('FormNavigationPanel');
|
}
|
|
/**
|
* Open navigation form and filter by stocking point
|
*
|
* @param name Display name of the stocking point
|
* @param parentNames Display name of all parent stocking points
|
* @returns Boolean to indicate if the entity is checked
|
*/
|
public async filterByEntity(name: string, parentNames?: string[]): Promise<boolean> {
|
await this.openNavigationPanel();
|
await this.toggleEntityList();
|
const row = await this.listEntity.getEntityRowByName(name, parentNames);
|
await row.checkboxClick();
|
return row.isChecked();
|
}
|
|
/**
|
* Open navigation form and filter by product
|
*
|
* @param name Name of the product
|
* @param parentNames Name of all parent rows
|
* @returns Boolean to indicate if the product is checked
|
*/
|
public async filterByProduct(name: ListProductColumn, parentNames: ListProductColumn[]): Promise<void> {
|
await this.openNavigationPanel();
|
await this.toggleProductList();
|
const row = await this.listProduct.getRow(name, parentNames);
|
await row.checkboxClick();
|
}
|
|
/**
|
* Open navigation panel if it is collapse / minimize
|
* And wait until navigation panel is opened and stable
|
*/
|
public async openNavigationPanel(): Promise<void> {
|
// Check if navigation panel form is close
|
if (await this.isOpen(false)) {
|
await this.restore();
|
}
|
await this.waitUntilPresent();
|
}
|
|
/**
|
* To reset data selection in navigation panel and hide all navigation lists
|
*/
|
public async reset(): Promise<void> {
|
await this.resetNaviToRoot();
|
|
// Hide all the lists
|
await this.toggleBookmarkList(false);
|
await this.toggleEntityList(false);
|
await this.toggleProductList(false);
|
}
|
|
/**
|
* Reset navigation panel filter if there is any
|
*/
|
public async resetNaviToRoot(): Promise<void> {
|
await this.btnHome.click();
|
}
|
|
/**
|
* Open or hide Bookmark list in navigation panel
|
*
|
* @param toOpen Boolean indicating whether to open/hide Bookmark list in navigation panel, default is true
|
*/
|
public async toggleBookmarkList(toOpen: boolean = true): Promise<void> {
|
return this.toggleList(this.listBookmark, this.btnBookmark, toOpen);
|
}
|
|
/**
|
* Open or hide Entity list in navigation panel
|
*
|
* @param toOpen Boolean indicating whether to open/hide Entity list in navigation panel, default is true
|
*/
|
|
public async toggleEntityList(toOpen: boolean = true): Promise<void> {
|
return this.toggleList(this.listEntity, this.btnEntity, toOpen);
|
}
|
|
/**
|
* Open or hide Product list in navigation panel
|
*
|
* @param toOpen Boolean indicating whether to open/hide Product list in navigation panel, default is true
|
*/
|
public async toggleProductList(toOpen: boolean = true): Promise<void> {
|
return this.toggleList(this.listProduct, this.btnProduct, toOpen);
|
}
|
|
/**
|
* Open or hide SalesSegment list in navigation panel
|
*
|
* @param toOpen Boolean indicating whether to open/hide Product list in navigation panel, default is true
|
*/
|
public async toggleSalesSegmentList(toOpen: boolean = true): Promise<void> {
|
return this.toggleList(this.listSalesSegment, this.btnSalesSegment, toOpen);
|
}
|
|
/**
|
* Open or hide the Period panel in Navigation panel.
|
*
|
* @param toOpen Boolean indicating whether to open/hide Period panel. Default is true
|
*/
|
public async togglePeriod(toOpen: boolean = true): Promise<void> {
|
if ((await this.pnlPeriod.isVisible()) !== toOpen) {
|
await this.btnPeriod.click();
|
await this.pnlPeriod.waitUntilPresent();
|
}
|
}
|
|
/**
|
* Show or hide a list in navigation panel.
|
*
|
* @param list List to be shown/hidden in navigation panel
|
* @param button Button that show/hide the given list in navigation panel
|
* @param toShow Indicates to show/hide the given list in navigation panel
|
*/
|
private async toggleList(list: ListBase, button: Button, toShow: boolean = true): Promise<void> {
|
if (toShow !== (await list.isVisible())) {
|
await button.click();
|
await list.waitUntilPresent();
|
}
|
}
|
}
|
|
export class ListBookmark extends ListSOP<DialogBookmark, ListBookmarkColumn> {
|
public static title = 'Bookmarks';
|
|
public constructor() {
|
super('ListBookmark', new DialogBookmark());
|
|
// Set primary key column name(s), to display in error message when assert fails
|
this.rowPrimaryColumnNames = { Name: '' };
|
}
|
}
|
|
export class ListEntity extends ListSOP<DialogDummy, ListEntityColumn> {
|
public static title = 'Stocking points and units';
|
|
public constructor() {
|
super('ListEntity', new DialogDummy());
|
}
|
|
/**
|
* Get entity row by pass-in entity DisplayName and parent entity DisplayName(s)
|
*
|
* @param name target entity DisplayName
|
* @param parentNames all parent row entity DisplayName of target entity
|
* @returns row of entity
|
*/
|
public async getEntityRowByName(name: string, parentNames?: string[]): Promise<ListRow> {
|
return this.getRowByCellValue(ListEntityColumnName.DisplayName, name, parentNames);
|
}
|
|
/**
|
* Toggle Entity Row's checkbox on/off
|
*
|
* @param expectedState true = ON / false = OFF
|
* @param displayName target entity display name
|
* @param parentNames target entity parent(s) display name
|
* @returns Entity Row of pass-in displayName
|
*/
|
public async toggleEntityRowCheckbox(expectedState: boolean, displayName: string, parentNames?: string[]): Promise<ListRow> {
|
const row = await this.getEntityRowByName(displayName, parentNames);
|
const currentState = await row.isChecked();
|
if (currentState !== expectedState) {
|
await row.checkboxClick();
|
}
|
return row;
|
}
|
|
// Overrides ListSOP
|
public getHierarchy(hierarchyProvider: DataHierarchyProvider, name: DataHierarchy): [ListEntityColumn, ListEntityColumn[] | undefined] {
|
const [targetRowName, parentRowNames] = hierarchyProvider.getHierarchy(name);
|
|
const thisProduct: ListEntityColumn = { DisplayName: targetRowName.Name };
|
// Only if ondraw image defined
|
if (targetRowName.OndrawImageName) {
|
thisProduct.OndrawImageName = targetRowName.OndrawImageName;
|
}
|
|
const parents: ListEntityColumn[] = [];
|
for (const p of parentRowNames) {
|
const parentObj: ListEntityColumn = { DisplayName: p.Name };
|
// Only if ondraw image defined
|
if (p.OndrawImageName) {
|
parentObj.OndrawImageName = p.OndrawImageName;
|
}
|
|
parents.push(parentObj);
|
}
|
|
return [thisProduct, parents.length > 0 ? parents : undefined];
|
}
|
}
|
|
export class ListProduct extends ListSOP<DialogDummy, ListProductColumn> {
|
public static title = 'Products';
|
|
public constructor() {
|
super('ListProduct', new DialogDummy());
|
}
|
|
// Overrides ListSOP
|
public getHierarchy(hierarchyProvider: DataHierarchyProvider, name: DataHierarchy): [ListProductColumn, ListProductColumn[] | undefined] {
|
const [targetRowName, parentRowNames] = hierarchyProvider.getHierarchy(name);
|
|
const thisProduct: ListProductColumn = { Name: targetRowName.Name };
|
const parents: ListProductColumn[] = [];
|
for (const p of parentRowNames) {
|
parents.push({ Name: p.Name });
|
}
|
|
return [thisProduct, parents.length > 0 ? parents : undefined];
|
}
|
}
|
|
export class ListSalesSegment extends ListSOP<DialogDummy, ListSalesSegmentColumn> {
|
public static title = 'Sales segmants';
|
|
public constructor() {
|
super('ListSalesSegment', new DialogDummy()); // Just read-only list, no context menu to create/edit/delete thus use dummy dialog
|
}
|
|
// Overrides ListSOP
|
public getHierarchy(hierarchyProvider: DataHierarchyProvider, name: DataHierarchy): [ListSalesSegmentColumn, ListSalesSegmentColumn[] | undefined] {
|
const [targetRowName, parentRowNames] = hierarchyProvider.getHierarchy(name);
|
|
const thisSalesSegment: ListSalesSegmentColumn = { Name: targetRowName.Name };
|
const parents: ListSalesSegmentColumn[] = [];
|
for (const p of parentRowNames) {
|
parents.push({ Name: p.Name });
|
}
|
|
return [thisSalesSegment, parents.length > 0 ? parents : undefined];
|
}
|
}
|
|
export interface ListBookmarkColumn {
|
Name?: string;
|
}
|
|
const listBookmarkContextMenuItem = {
|
CreateFolder: { ContextMenu: 'listContextMenu445', Name: 'MenuCreateFolder', Label: 'Create folder' },
|
};
|
|
export { listBookmarkContextMenuItem as ListBookmarkContextMenuItem };
|
|
// List Entity columns (suffix New to be removed in future once the old enum ListEntityColumn removed after we extend from ListSOP)
|
export interface ListEntityColumn {
|
OndrawImageName?: string;
|
DisplayName: string;
|
}
|
|
// List Entity columns
|
export enum ListEntityColumnName {
|
DisplayName = 'DisplayName',
|
}
|
|
// List Product columns
|
export interface ListProductColumn {
|
Name?: string;
|
}
|
|
export interface ListSalesSegmentColumn {
|
Name?: string;
|
}
|
|
// Step description to re-use in spec file to prevent scriptor re-write each time
|
const stepNavigationPanel = {
|
checkProducts: (products: string[]): string => `In left Navigation panel, check product(s) ${products.join(', ')}.`,
|
checkSalesSegments: (salesSegments: string[]): string => `In left Navigation panel, check sales segment(s) ${salesSegments.join(', ')}.`,
|
checkStockingPoints: (stockingPoints: string[]): string => `In left Navigation panel, check stocking point(s) ${stockingPoints.join(', ')}.`,
|
checkUnits: (units: string[]): string => `In left Navigation panel, check unit(s) ${units.join(', ')}.`,
|
clickHomeResetToRoot: (): string => 'In left Navigation panel, click Home button to reset to Root.',
|
openNavigationPanel: (): string => 'Open left docked Navigation panel form.',
|
showEntitiesList: (): string => 'In left Navigation panel, show Stocking points and Units list by clicking Stocking points and Units button.',
|
showPeriodPanel: (): string => 'In left Navigation panel, show Period Panel by clicking Period button.',
|
showProductsList: (): string => 'In left Navigation panel, show Products list by clicking Products button.',
|
showSalesSegmentsList: (): string => 'In left Navigation panel, show Sales Segments list by clicking Sales Segments button.',
|
showBookmarkList: (): string => 'In left Navigation panel, show Bookmarks list by clicking Bookmarks button.',
|
unCheckProducts: (products: string[]): string => `In left Navigation panel, uncheck product(s) ${products.join(', ')}.`,
|
unCheckStockingPoints: (stockingpoints: string[]): string => `In left Navigation panel, uncheck stocking point(s) ${stockingpoints.join(', ')}.`,
|
unCheckSalesSegments: (salesSegments: string[]): string => `In left Navigation panel, uncheck sales segment(s) ${salesSegments.join(', ')}.`,
|
uncheckUnits: (units: string[]): string => `In left Navigation panel, uncheck unit(s) ${units.join(', ')}.`,
|
};
|
|
export { stepNavigationPanel as StepNavigationPanel };
|