/** 
 | 
 * @file        S&OP DropDownList component to wrap common methods the team encounter during development 
 | 
 * @description DropDownList class extending Abstraction API's QDropDownList. 
 | 
 * All S&OP page objects inherit from our own class (inheriting e2e/Abstraction API), but we can propose common methods to them. 
 | 
 * @author      Clarence (clarence.chan@3ds.com) 
 | 
 * @copyright   Dassault Systèmes 
 | 
 */ 
 | 
import { QDropDownList } from '../e2elib/lib/api/pageobjects/qdropdownlist.component'; 
 | 
import { QUtils } from '../e2elib/lib/src/main/qutils.class'; 
 | 
import { UIActionSOP } from './objectsop'; 
 | 
import { browser } from '../e2elib/node_modules/protractor'; 
 | 
import { Timeout } from '../libmp/appmp'; 
 | 
  
 | 
export class DropDownListSOP extends QDropDownList implements UIActionSOP { 
 | 
  public constructor(componentPath: string) { 
 | 
    super(componentPath); 
 | 
  } 
 | 
  
 | 
  public async clickActionLinkText(expectedActionLinkText: string): Promise<void> { 
 | 
    const isActionLinkMatch = (await this.hasActionLink()) && (await this.getActionLinkText()) === expectedActionLinkText; 
 | 
    expect(isActionLinkMatch).toBe( 
 | 
      true, 
 | 
      `Unable to proceed click action link for dropdownlist ${await this.getComponentLabel()}. Expecting action link text '${expectedActionLinkText}'.`, 
 | 
    ); 
 | 
  
 | 
    if (isActionLinkMatch) { 
 | 
      await this.clickActionLink(); 
 | 
    } 
 | 
  } 
 | 
  
 | 
  public async getValueString(): Promise<string> { 
 | 
    return this.getSelectedString(); 
 | 
  } 
 | 
  
 | 
  /** 
 | 
   * Use browser wait to wait for dropdown to be selectable. 
 | 
   * 
 | 
   * @param selectionItem Items to select from dropdown. 
 | 
   * @param timeout Timeout in milliseconds to wait for dropdown to be selectable and select the item. 
 | 
   */ 
 | 
  public async selectItemSOP(selectionItem: string | number, timeout: number = Timeout.Medium): Promise<void> { 
 | 
    await browser.wait( 
 | 
      async () => { 
 | 
        try { 
 | 
          const selectedItem = await super.findAndSelectItem(selectionItem); 
 | 
          return selectedItem === selectionItem; 
 | 
        } catch { 
 | 
          return false; 
 | 
        } 
 | 
      }, 
 | 
      timeout, 
 | 
      `Timeout waiting to select '${selectionItem}' in dropdownlist ${await this.getComponentLabel()}.`, 
 | 
    ); 
 | 
  } 
 | 
  
 | 
  public async setValue(value: string): Promise<void> { 
 | 
    await this.selectItemSOP(value); 
 | 
  } 
 | 
  
 | 
  public async verifyAvailableValues(expectedValues: string[]): Promise<void> { 
 | 
    // Ensure dropdown contains exactly the size expected (for long list this might not accurate as some options are out of viewport/core tech design of dropdownlist/list) 
 | 
    expect(await this.getNumberOfElements()).toBe( 
 | 
      expectedValues.length, 
 | 
      `Expected dropdownlist ${await this.getComponentLabel()} to have exactly ${expectedValues.length} values.`, 
 | 
    ); 
 | 
  
 | 
    // Don't use foreach loop as that's synchronous and doesn't support await 
 | 
    for (const val of expectedValues) { 
 | 
      await this.verifyHelperValueExist(val, true); 
 | 
    } 
 | 
  } 
 | 
  
 | 
  public async verifyBatchEditEnabled(expectedEnable: boolean, expectedActionLinkText: string): Promise<void> { 
 | 
    const isBatchEditEnableDisableOK = (await this.hasActionLink()) && (await this.getActionLinkText()) === expectedActionLinkText && !(await this.isDisabled()) === expectedEnable; 
 | 
    expect(isBatchEditEnableDisableOK).toBe( 
 | 
      true, 
 | 
      `Verify dropdownlist ${await this.getComponentLabel()} supports batch edit (expected enable = ${expectedEnable} & action link = ${expectedActionLinkText}).`, 
 | 
    ); 
 | 
  } 
 | 
  
 | 
  public async verifyHasMaskError(expectedValue: boolean): Promise<void> { 
 | 
    // Implements UIActionSOP 
 | 
    await this.hasMaskError(expectedValue); 
 | 
  } 
 | 
  
 | 
  public async verifyTooltip(expectedValue: string): Promise<void> { 
 | 
    const tooltip = await QUtils.getTooltip(this.tooltipLabelElement, true, true, true); 
 | 
    expect(tooltip).toBe(expectedValue, `Hover ${await this.getComponentLabel()} to verify tooltip.`); 
 | 
  } 
 | 
  
 | 
  public async verifyEnabled(expectedEnable: boolean): Promise<void> { 
 | 
    expect(!(await this.isDisabled())).toBe(expectedEnable, `Verify enable state for dropdownlist ${await this.getComponentLabel()}.`); 
 | 
  } 
 | 
  
 | 
  public async verifyValue(expectedValue: string): Promise<void> { 
 | 
    expect(await this.getSelectedString()).toBe(expectedValue, `Verify value for dropdownlist ${await this.getComponentLabel()}.`); 
 | 
  } 
 | 
  
 | 
  public async verifyVisible(expectedValue: string): Promise<void> { 
 | 
    expect(await this.isVisible()).toBe(expectedValue.toLowerCase() === 'true', `Verify visible state for dropdownlist ${await this.getComponentLabel()}.`); 
 | 
  } 
 | 
  
 | 
  public async verifyValueExist(expectedValue: string): Promise<void> { 
 | 
    await this.verifyHelperValueExist(expectedValue, true); 
 | 
  } 
 | 
  
 | 
  public async verifyValueNotExist(expectedValue: string): Promise<void> { 
 | 
    await this.verifyHelperValueExist(expectedValue, false); 
 | 
  } 
 | 
  
 | 
  public async verifyNumAvailableValues(expectedNum: number): Promise<void> { 
 | 
    expect(await this.getNumberOfElements()).toBe(expectedNum, `Verify number of values in drop down list to be ${expectedNum}`); 
 | 
  } 
 | 
  
 | 
  private async verifyHelperValueExist(expectedValue: string, expectedExist: boolean): Promise<void> { 
 | 
    let isItemFound = true; 
 | 
    await this.selectItemSOP(expectedValue).catch(() => (isItemFound = false)); 
 | 
  
 | 
    const msgFoundOrNot = expectedExist ? '' : 'not '; 
 | 
    expect(isItemFound).toBe(expectedExist, `Verify "${expectedValue}" should ${msgFoundOrNot}be found in dropdownlist ${await this.getComponentLabel()}.`); 
 | 
  } 
 | 
} 
 | 
  
 | 
const stepDropDownList = { 
 | 
  verifyNumAvailableValues: (title: string, expectedNum: number): string => `In the dropdownlist "${title}",  verify that there are ${expectedNum} available options.`, 
 | 
  verifyValueExist: (title: string, expectedValue: string): string => `In the dropdownlist ${title}, verify that "${expectedValue}" is a valid option.`, 
 | 
  verifyAvailableValues: (title: string, expectedValues: string[]): string => `In the dropdownlist ${title}, verify that "${expectedValues}" are the only valid options.`, 
 | 
}; 
 | 
export { stepDropDownList as StepDropDownList }; 
 |