import { Form } from '../../e2elib/lib/src/pageobjects/form.component'; 
 | 
import { ListBase } from '../../libappbase/listbase'; 
 | 
import { ListRow } from '../../e2elib/lib/src/pageobjects/list/listrow.component'; 
 | 
import { DialogUnitCost } from '../dialogs/dialog.unitcost'; 
 | 
import { AppMP } from '../appmp'; 
 | 
import { CheckboxBase } from '../../libappbase/checkboxbase'; 
 | 
import { QContextMenu } from '../../e2elib/lib/api/pageobjects/qcontextmenu.component'; 
 | 
import { ContextMenuSOP } from '../../libappsop/contextmenusop'; 
 | 
  
 | 
export class FormUnitCost extends Form { 
 | 
  public listUnitCost = new ListUnitCost(); 
 | 
  public cbFilterByAccounts = new CheckboxBase('cbFilterByAccounts'); 
 | 
  
 | 
  public constructor() { 
 | 
    super('FormUnitCosts'); 
 | 
  } 
 | 
  
 | 
  /** 
 | 
   * To pass-in boolean to toggle on FilterByAccount checbox 
 | 
   * 
 | 
   * @param toBeToggleOn boolean to toggle on or off check box (false | true) 
 | 
   */ 
 | 
  public async toggleFilterByAccount(toBeToggleOn: boolean): Promise<void> { 
 | 
    await this.cbFilterByAccounts.toggle(toBeToggleOn); 
 | 
  } 
 | 
} 
 | 
  
 | 
export class ListUnitCost extends ListBase { 
 | 
  public cmMenu = new QContextMenu('lsContextMenuAccCosts'); 
 | 
  public dlgUnitCost = new DialogUnitCost(); 
 | 
  
 | 
  public constructor() { 
 | 
    super('lsAccountCosts'); 
 | 
  } 
 | 
  
 | 
  /** 
 | 
   * Check if the context menu item is clickable 
 | 
   * 
 | 
   * @param menuitem Name of target menu item 
 | 
   * @returns An array of combination of boolean and string, where boolean indicate whether the menuItem is clickable and string inidcate the disabled tooltip 
 | 
   */ 
 | 
  public async verifyIsMenuItemClickable(menuitem: string): Promise<[boolean, string]> { 
 | 
    const [isMenuItemClickable, cmMenuItemDisabledTooltip] = await ContextMenuSOP.verifyIsMenuItemClickable(this.cmMenu, menuitem); 
 | 
    await this.cmMenu.dismiss(); 
 | 
    return [isMenuItemClickable, cmMenuItemDisabledTooltip]; 
 | 
  } 
 | 
  
 | 
  /** 
 | 
   * Open create edit unit cost dialog in the list. 
 | 
   * 
 | 
   * @param row Row, or rows of unit cost to edit. Create dialog will be triggered if this is undefined. Batch edit will be triggered if 
 | 
   * row is of type `ListRow[]`. 
 | 
   * @param isCopy Indicate to open the dialog for copy or edit, defaulted to false (edit). Only works if row is of type `ListRow` for now 
 | 
   * (until there's batch copy feature in MP) 
 | 
   */ 
 | 
  public async openEditDialog(row?: ListRow | ListRow[], isCopy: boolean = false): Promise<DialogUnitCost> { 
 | 
    if (row !== undefined && !Array.isArray(row)) { 
 | 
      await row.rightClick(undefined, this.cmMenu, isCopy ? ListUnitCostContextMenuItem.MenuCopy : ListUnitCostContextMenuItem.MenuEdit); 
 | 
    } else if (row === undefined || row.length <= 0) { 
 | 
      await this.rightClick(undefined, this.cmMenu, ListUnitCostContextMenuItem.MenuCreate); 
 | 
    } else { 
 | 
      const modifier = { control: true }; 
 | 
      await row[0].leftClick(); 
 | 
      for (let index = 1; index < row.length - 1; index++) { 
 | 
        await row[index].leftClick(modifier); 
 | 
      } 
 | 
      await row[row.length - 1].rightClick(modifier, this.cmMenu, ListUnitCostContextMenuItem.MenuEdit); 
 | 
    } 
 | 
    await this.dlgUnitCost.waitUntilPresent(); 
 | 
    return this.dlgUnitCost; 
 | 
  } 
 | 
  
 | 
  /** 
 | 
   * Find unit cost by value from the list 
 | 
   * 
 | 
   * @param unit Unit column value 
 | 
   * @param account Account column value 
 | 
   * @param costDriver Cost driver column value 
 | 
   * @param start Start column value 
 | 
   * @returns ListRow that matched or undefined if no row found 
 | 
   */ 
 | 
  public async getUnitCostRowByValues(unit: string, account: string, costDriver: string, start: string): Promise<ListRow | undefined> { 
 | 
    const result = await this.getRowByValue([ 
 | 
      { columnID: ListUnitCostColumn.Unit, value: unit }, 
 | 
      { columnID: ListUnitCostColumn.Account, value: account }, 
 | 
      { columnID: ListUnitCostColumn.CostDriver, value: costDriver }, 
 | 
      { columnID: ListUnitCostColumn.Start, value: start }, 
 | 
    ]).catch(() => undefined); 
 | 
  
 | 
    return result; 
 | 
  } 
 | 
  
 | 
  /** 
 | 
   * Open edit unit cost dialog on row action bar page 
 | 
   * 
 | 
   * @param row Unit cost row to edit 
 | 
   */ 
 | 
  public async editRowByActionBarPage(row: ListRow): Promise<DialogUnitCost> { 
 | 
    await row.leftClick(); 
 | 
    await AppMP.getInstance().abpData.btnEdit.click(); 
 | 
    await this.dlgUnitCost.waitUntilPresent(); 
 | 
    return this.dlgUnitCost; 
 | 
  } 
 | 
  
 | 
  /** 
 | 
   * Drag the source list row and drop it on the target list row 
 | 
   * 
 | 
   * @param sourceRow The list row to be dragged 
 | 
   * @param targetRow The list row to be dropped 
 | 
   * @returns DialogUnitCost 
 | 
   */ 
 | 
  public async dragEntityToCreateUnitCost(sourceRow: ListRow | ListRow[], targetRow: ListRow): Promise<DialogUnitCost> { 
 | 
    await this.dropRowOnTargetRow(sourceRow, targetRow); 
 | 
    await this.dlgUnitCost.waitUntilPresent(); 
 | 
    return this.dlgUnitCost; 
 | 
  } 
 | 
  
 | 
  /** 
 | 
   * Select multiple rows by display name to drag and drop onto a selected element 
 | 
   * 
 | 
   * @param entityRows Target entity rows to be drag 
 | 
   * @param targetElement Target element to drop onto 
 | 
   * @returns DialogUnitCost 
 | 
   */ 
 | 
  public async dragEntitiesToCreateUnitCost(entityRows: ListRow[], targetRow: ListRow): Promise<DialogUnitCost> { 
 | 
    for (const [index, entityRow] of entityRows.entries()) { 
 | 
      const modifier = index === 0 ? undefined : { control: true }; 
 | 
      await entityRow.leftClick(modifier); 
 | 
    } 
 | 
    return this.dragEntityToCreateUnitCost(entityRows, targetRow); 
 | 
  } 
 | 
  
 | 
  /** 
 | 
   * Delete pass-in UnitCost row via "Delete" context menu 
 | 
   * 
 | 
   * @param unitCostRows Target unit cost row(s) to be delete 
 | 
   */ 
 | 
  public async deleteUnitCostViaContextMenu(unitCostRows: ListRow[]): Promise<void> { 
 | 
    for (const [index, row] of unitCostRows.entries()) { 
 | 
      const modifiers = index !== 0 ? { control: true } : undefined; 
 | 
  
 | 
      if (index === unitCostRows.length - 1) { 
 | 
        await row.rightClick(modifiers, this.cmMenu, ListUnitCostContextMenuItem.MenuDelete); 
 | 
      } else { 
 | 
        await row.leftClick(modifiers); 
 | 
      } 
 | 
    } 
 | 
  } 
 | 
  
 | 
  /** 
 | 
   * Delete pass-in UnitCost row via "Delete" action bar button 
 | 
   * 
 | 
   * @param unitCostRows Target unit cost row(s) to be delete 
 | 
   */ 
 | 
  public async deleteUnitCostsViaActionBarButton(unitCostRows: ListRow[]): Promise<void> { 
 | 
    for (const [index, row] of unitCostRows.entries()) { 
 | 
      const modifiers = index !== 0 ? { control: true } : undefined; 
 | 
      await row.leftClick(modifiers); 
 | 
    } 
 | 
    await AppMP.getInstance().abpData.btnDelete.click(); 
 | 
  } 
 | 
} 
 | 
  
 | 
export enum ListUnitCostColumn { 
 | 
  Unit = 'Unit', 
 | 
  Account = 'Account', 
 | 
  CostDriver = 'Cost driver', 
 | 
  Cost = 'Cost', 
 | 
  UoM = 'UoM', 
 | 
  Start = 'Start', 
 | 
  End = 'End', 
 | 
} 
 | 
  
 | 
export enum ListUnitCostContextMenuItem { 
 | 
  // Component names 
 | 
  MenuCreate = 'MenuCreate', 
 | 
  MenuEdit = 'MenuEdit', 
 | 
  MenuCopy = 'MenuCopy', 
 | 
  MenuDelete = 'MenuDelete', 
 | 
} 
 |