/** 
 | 
 * @file        S&OP EditField component to wrap common methods the team encounter during development 
 | 
 * @description EditField class extending e2elib's EditField. 
 | 
 * All S&OP page objects inherit from our own class (inheriting e2e/libappbase), but we can propose common methods to them. 
 | 
 * @author      Clarence (clarence.chan@3ds.com) 
 | 
 * @copyright   Dassault Systèmes 
 | 
 */ 
 | 
import { QUtils } from '../e2elib/lib/src/main/qutils.class'; 
 | 
import { EditField } from '../e2elib/lib/src/pageobjects/editfield.component'; 
 | 
import { ElementFinder } from '../e2elib/node_modules/protractor/built'; 
 | 
import { UIActionSOP } from './objectsop'; 
 | 
  
 | 
export class EditFieldSOP extends EditField implements UIActionSOP { 
 | 
  public constructor(componentPath: string, isCustomPath?: boolean, elementObj?: ElementFinder, private readonly overridenLabel?: string) { 
 | 
    super(componentPath, isCustomPath, elementObj); 
 | 
  } 
 | 
  
 | 
  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 editfield ${await this.getComponentLabel()}. Expecting action link text '${expectedActionLinkText}'.`); 
 | 
  
 | 
    if (isActionLinkMatch) { 
 | 
      await this.clickActionLink(); 
 | 
    } 
 | 
  } 
 | 
  
 | 
  public async getValueString(): Promise<string> { 
 | 
    return this.getText(); 
 | 
  } 
 | 
  
 | 
  public async setValue(value: string): Promise<void> { 
 | 
    // Wait present before typing value into edit field (e.g Account dialog cost field only appear after selecting cost driver) 
 | 
    await this.waitUntilPresent(); 
 | 
    if (await this.isDisabled() && await this.hasActionLink()) { 
 | 
      await this.clickActionLink(); 
 | 
    } 
 | 
    await this.sendInput(value); 
 | 
  } 
 | 
  
 | 
  public async toggleValue(): Promise<void> { 
 | 
    // Wait present before typing value into edit field (e.g Account dialog cost field only appear after selecting cost driver) 
 | 
    await this.waitUntilPresent(); 
 | 
    const previousValue = await this.getText(); 
 | 
    const convertNumPreviousValue = Number(previousValue); // returns NaN if not a number 
 | 
  
 | 
    // If text is string, change value by appending character 
 | 
    if (isNaN(convertNumPreviousValue)) { 
 | 
      await this.sendInput(`${previousValue  }X`); 
 | 
    } else { 
 | 
      // If text is number, change value by incrementing 
 | 
      const newValueStr = (convertNumPreviousValue + 1).toString(); 
 | 
      await this.sendInput(newValueStr); 
 | 
    } 
 | 
  } 
 | 
  
 | 
  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 editfield ${await this.getComponentLabel()} supports batch edit (expected enable = ${expectedEnable} & action link = ${expectedActionLinkText}).`); 
 | 
  } 
 | 
  
 | 
  public async verifyHasMaskError(expectedValue: boolean): Promise<void> { 
 | 
    // Implements UIActionSOP 
 | 
    const actualHasMaskError = await this.hasMaskError(expectedValue); 
 | 
    expect(actualHasMaskError).toBe(expectedValue, `Verify has mask error for editfield ${await this.getEffectiveComponentLabel()}.`); 
 | 
  } 
 | 
  
 | 
  public async verifyTooltip(expectedValue: string): Promise<void> { 
 | 
    const tooltip = await QUtils.getTooltip(this.tooltipLabelElement, true, true, true); 
 | 
    expect(tooltip).toBe(expectedValue, `Hover ${await this.getEffectiveComponentLabel()} to verify tooltip.`); 
 | 
  } 
 | 
  
 | 
  public async verifyEnabled(expectedEnable: boolean): Promise<void> { 
 | 
    expect(!await this.isDisabled()).toBe(expectedEnable, `Verify enable state for editfield ${await this.getEffectiveComponentLabel()}.`); 
 | 
  } 
 | 
  
 | 
  public async verifyValue(expectedValue: string): Promise<void> { 
 | 
    expect(await this.getText()).toBe(expectedValue, `Verify value for editfield ${await this.getEffectiveComponentLabel()}.`); 
 | 
  } 
 | 
  
 | 
  public async verifyVisible(expectedValue: string): Promise<void> { 
 | 
    expect(await this.isVisible()).toBe(expectedValue.toLowerCase() === 'true', `Verify visible state for editfield ${await this.getEffectiveComponentLabel()}.`); 
 | 
  } 
 | 
  
 | 
  /** 
 | 
   * Return the label if defined, else use the name provided by scriptor. 
 | 
   * Sometimes, designer didn't define a label for edit field as it's used in combination with some other UI component that has label (side by side). 
 | 
   * 
 | 
   * @returns The effective label to use. 
 | 
   */ 
 | 
  private async getEffectiveComponentLabel(): Promise<string> { 
 | 
    let uiLabel = await this.getComponentLabel(); 
 | 
    if (uiLabel === '') { 
 | 
      uiLabel = this.overridenLabel as string; 
 | 
    } 
 | 
  
 | 
    return uiLabel; 
 | 
  } 
 | 
} 
 |