/** 
 | 
 * @file        Button component base class 
 | 
 * @description allow to check is button clickable and get tooltip value 
 | 
 * @author      Wong Jia Hui (jiahui.wong@3ds.com) 
 | 
 * @copyright   Dassault Systèmes 
 | 
 */ 
 | 
import { QUtils } from '../e2elib/lib/src/main/qutils.class'; 
 | 
import { Button } from '../e2elib/lib/src/pageobjects/button/button.component'; 
 | 
import { ContextMenuBase } from './contextmenubase'; 
 | 
import { LogMessage } from './logmessage'; 
 | 
  
 | 
export class ButtonBase extends Button { 
 | 
  public contextMenu: ContextMenuBase; 
 | 
  
 | 
  public constructor(buttonComponentPath: string, contextMenuComponentPath?: string) { 
 | 
    super(buttonComponentPath); 
 | 
    if (contextMenuComponentPath) { 
 | 
      this.contextMenu = new ContextMenuBase(contextMenuComponentPath); 
 | 
    } 
 | 
  } 
 | 
  
 | 
  public async clickDropdown(): Promise<void>; 
 | 
  
 | 
  /** 
 | 
   * Perform click on button contains dropdown 
 | 
   * 
 | 
   * @param menuPath [Optional] Menu name of the menu in contextmenu 
 | 
   * 
 | 
   * @return A tuple of boolean and string, where boolean indicate whether the context menu is clickable and string inidcate the disabled tooltip 
 | 
   */ 
 | 
  public async clickDropdown(menuPath: string | string[]): Promise<[boolean, string]>; 
 | 
  
 | 
  public async clickDropdown(menuPath?: string | string[]): Promise<void | [boolean, string]> { 
 | 
    if (this.contextMenu) { 
 | 
      await this.waitForScreenUpdate(2000); // Wait for 2 second to prevent button state not finish updated 
 | 
      await super.clickDropdown(); 
 | 
      await this.contextMenu.waitUntilPresent(); 
 | 
      const isContextMenuVisible = await this.contextMenu.isVisible(); 
 | 
      expect(isContextMenuVisible).toBe(true, LogMessage.contextMenu_notVisible()); 
 | 
  
 | 
      if (menuPath) { 
 | 
        const [isMenuItemClickable, menuItemTooltip] = await this.contextMenu.verifyIsMenuItemClickable(menuPath); 
 | 
  
 | 
        if (isMenuItemClickable) { 
 | 
          await this.contextMenu.selectMenuItem(menuPath); 
 | 
        } 
 | 
        return [isMenuItemClickable, menuItemTooltip]; 
 | 
      } 
 | 
    } 
 | 
  } 
 | 
  
 | 
  /** 
 | 
   * Get button tooltip message 
 | 
   * 
 | 
   * @param waitTime [Optional] miliseconds of how long it should wait for Button to be updates. 
 | 
   * @param isEscapeHTMLCharacter [Optional] boolean to indicate whether to escape HTML character on returned tooltip. Default = true 
 | 
   * @returns button tooltip string 
 | 
   */ 
 | 
  public async getTooltip(waitTime?: number, isEscapeHTMLCharacter?: boolean): Promise<string> { 
 | 
    await this.waitForScreenUpdate(waitTime); 
 | 
    return QUtils.getTooltip(this.tooltipElement, true, isEscapeHTMLCharacter); 
 | 
  } 
 | 
  
 | 
  /** 
 | 
   * To check if a button is able to click 
 | 
   * 
 | 
   * @param waitTime [Default = 1000] miliseconds of how long it should wait for Ok Button to be clickable. 
 | 
   * @returns boolean to indicate whether the button can be click 
 | 
   */ 
 | 
  public async isClickable(waitTime: number = 1000): Promise<boolean> { 
 | 
    await this.waitForScreenUpdate(waitTime); 
 | 
    return !(await this.isDisabled()); 
 | 
  } 
 | 
  
 | 
  /** 
 | 
   * To verify if button is clickable 
 | 
   * 
 | 
   * @param waitTime [Optional] miliseconds of how long it should wait for Button to be updates. 
 | 
   * @param isEscapeHTMLCharacter [Optional] boolean to indicate whether to escape HTML character on returned tooltip. Default = true 
 | 
   * @return A tuple of boolean and string, where boolean indicate whether the button is clickable and string indicate the disabled tooltip 
 | 
   */ 
 | 
  public async verifyIsButtonClickable(waitTime?: number, isEscapeHTMLCharacter?: boolean): Promise<[boolean, string]> { 
 | 
    let btnDisabledTooltip = ''; 
 | 
    const isOkbuttonClicked = await this.isClickable(waitTime); 
 | 
    if (!isOkbuttonClicked) { 
 | 
      btnDisabledTooltip = await this.getTooltip(waitTime, isEscapeHTMLCharacter); 
 | 
    } 
 | 
    return [isOkbuttonClicked, btnDisabledTooltip]; 
 | 
  } 
 | 
} 
 | 
  
 | 
export interface Modifiers { 
 | 
  alt?: boolean; 
 | 
  shift?: boolean; 
 | 
  control?: boolean; 
 | 
  meta?: boolean; 
 | 
} 
 |