| import { Form } from '../../e2elib/lib/src/pageobjects/form.component'; | 
| import { ListBase } from '../../libappbase/listbase'; | 
| import { DialogStockingCost } from '../dialogs/dialog.stockingcost'; | 
| import { ListRow } from '../../e2elib/lib/src/pageobjects/list/listrow.component'; | 
| import { AppMP } from '../appmp'; | 
| import { CheckboxBase } from '../../libappbase/checkboxbase'; | 
| import { LogMessage } from '../../libappbase/logmessage'; | 
| import { ActionTriggerType } from '../../libappbase/utils'; | 
| import { QContextMenu } from '../../e2elib/lib/api/pageobjects/qcontextmenu.component'; | 
| import { ContextMenuSOP } from '../../libappsop/contextmenusop'; | 
|   | 
| export class FormStockingCost extends Form { | 
|   public lstStockingCost = new ListStockingCost(); | 
|   public cbFilterByAccount = new CheckboxBase('cbFilterByAccounts'); | 
|   | 
|   public constructor() { | 
|     super('FormStockingCosts'); | 
|   } | 
|   | 
|   /** | 
|    * Open StockingPoint Dialog via "Copy" button in abp | 
|    */ | 
|   public async openCopyStockingCostDialog(): Promise<DialogStockingCost> { | 
|     await AppMP.getInstance().abpData.btnCopy.click(); | 
|     await this.lstStockingCost.dlgStockingCost.waitUntilPresent(); | 
|     return this.lstStockingCost.dlgStockingCost; | 
|   } | 
| } | 
|   | 
| export class ListStockingCost extends ListBase { | 
|   private readonly _cmMenu = new QContextMenu('lsContextMenuAccCosts'); | 
|   public dlgStockingCost = new DialogStockingCost(); | 
|   | 
|   public constructor() { | 
|     super('lsAccountCosts'); | 
|   } | 
|   | 
|   /** | 
|    * To open stocking cost dialog via context menu or action bar page to "Create" or "Edit" (if pass-in stockingCostRow) | 
|    * | 
|    * @param via Open the dialog via button or context menu. | 
|    * @param stockingCostRow [Optional] Target stocking cost row to be edited. | 
|    * @returns stocking cost dialog | 
|    */ | 
|   public async openStockingCostDialog(via: ActionTriggerType, stockingCostRow?: ListRow, isCopy: boolean = false): Promise<DialogStockingCost> { | 
|     switch (via) { | 
|       case ActionTriggerType.Button: | 
|         await this.focus(); | 
|         if (stockingCostRow) { | 
|           await stockingCostRow.leftClick(); | 
|           if (isCopy) { | 
|             await AppMP.getInstance().abpData.btnCopy.click(); | 
|           } else { | 
|             await AppMP.getInstance().abpData.btnEdit.click(); | 
|           } | 
|         } else { | 
|           await AppMP.getInstance().abpData.btnCreate.click(); | 
|         } | 
|         break; | 
|       case ActionTriggerType.ContextMenu: | 
|         if (stockingCostRow) { | 
|           if (isCopy) { | 
|             await stockingCostRow.rightClick(undefined, this._cmMenu, ListStockingCostContextMenuItem.Copy); | 
|           } else { | 
|             await stockingCostRow.rightClick(undefined, this._cmMenu, ListStockingCostContextMenuItem.Edit); | 
|           } | 
|         } else { | 
|           await this.rightClick(undefined, this._cmMenu, ListStockingCostContextMenuItem.Create); | 
|         } | 
|         break; | 
|       default: | 
|         break; | 
|     } | 
|     await this.dlgStockingCost.waitForScreenUpdate(); | 
|     return this.dlgStockingCost; | 
|   } | 
|   | 
|   /** | 
|    * Open Edit Stocking Cost Dialog | 
|    * | 
|    * @returns stocking cost dialog | 
|    */ | 
|   public async openEditStockingCostDialog(): Promise<DialogStockingCost> { | 
|     await this.rightClick(undefined, this._cmMenu, ListStockingCostContextMenuItem.Edit); | 
|     await this.dlgStockingCost.waitForScreenUpdate(); | 
|     return this.dlgStockingCost; | 
|   } | 
|   | 
|   /** | 
|    * Check stocking cost is existed by value from the list | 
|    * | 
|    * @param stockingPoint Stocking Point column value | 
|    * @param account Account column value | 
|    * @param costDriver Cost driver column value | 
|    * @param cost Cost column value | 
|    * @param uom UoM column value | 
|    * @param start Start column value | 
|    * @param end End column value | 
|    * @returns boolean to indicate whether a the row is existed in the list | 
|    */ | 
|   public async isStockingCostExisted(stockingPoint: string, account: string, costDriver: string, cost: string, uom: string, start: string, end: string): Promise<boolean> { | 
|     const result = await this.getRowByValue([ | 
|       { columnID: ListStockingCostColumn.StockingPoint, value: stockingPoint }, | 
|       { columnID: ListStockingCostColumn.Account, value: account }, | 
|       { columnID: ListStockingCostColumn.CostDriver, value: costDriver }, | 
|       { columnID: ListStockingCostColumn.Cost, value: cost }, | 
|       { columnID: ListStockingCostColumn.UoM, value: uom }, | 
|       { columnID: ListStockingCostColumn.Start, value: start }, | 
|       { columnID: ListStockingCostColumn.End, value: end }, | 
|     ]).catch(() => { | 
|       // do nothing as error is thrown due to no row is found | 
|     }); | 
|     return result !== undefined; | 
|   } | 
|   | 
|   /** | 
|    * Returns tooltip of the menu item | 
|    * | 
|    * @param menuItemPath MenuItem name | 
|    * @returns tooltip text of the menu item | 
|    */ | 
|   public async getMenuItemTooltip(menuItemPath: string): Promise<string> { | 
|     await this._cmMenu.waitForScreenUpdate(); | 
|     const tooltip = await this._cmMenu.getToolTip(menuItemPath); | 
|     await this._cmMenu.dismiss(); | 
|     return tooltip; | 
|   } | 
|   | 
|   /** | 
|    * Check if the context menu item is disabled | 
|    * | 
|    * @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, menuItemDisabledTooltip] = await ContextMenuSOP.verifyIsMenuItemClickable(this._cmMenu, menuitem); | 
|     await this._cmMenu.dismiss(); | 
|     return [isMenuItemClickable, menuItemDisabledTooltip]; | 
|   } | 
|   | 
|   /** | 
|    * Get stocking cost by value from the list | 
|    * | 
|    * @param stockingPoint Stocking Point column value | 
|    * @param cost Cost column value | 
|    */ | 
|   public async getStockingCost(stockingPoint: string, cost: string): Promise<ListRow> { | 
|     return this.getRowByValue([ | 
|       { columnID: ListStockingCostColumn.StockingPoint, value: stockingPoint }, | 
|       { columnID: ListStockingCostColumn.Cost, value: cost }, | 
|     ]); | 
|   } | 
|   | 
|   /** | 
|    * Get all stocking costs with the account name | 
|    * | 
|    * @param accountName Account column value | 
|    * @returns An array of ListRow that match the account name | 
|    */ | 
|   public async getStockingCostsByAccount(accountName: string): Promise<ListRow[]> { | 
|     const allRows = await this.getAllRows(); | 
|     const resultRows: ListRow[] = []; | 
|     for (const row of allRows) { | 
|       if ((await this.getCellValueFromRow(ListStockingCostColumn.Account, row)) === accountName) { | 
|         resultRows.push(row); | 
|       } | 
|     } | 
|     return resultRows; | 
|   } | 
|   | 
|   /** | 
|    * Delete stocking cost | 
|    * | 
|    * @param row Stocking Cost row | 
|    */ | 
|   public async deleteStockingCost(row: ListRow): Promise<void> { | 
|     return row.rightClick(undefined, this._cmMenu, ListStockingCostContextMenuItem.Delete); | 
|   } | 
|   | 
|   public async openStockingCostDialogViaAbp(): Promise<DialogStockingCost> { | 
|     const appMP = AppMP.getInstance(); | 
|     const abpData = appMP.abpData; | 
|   | 
|     await this.leftClickOnWhiteSpace(); | 
|     await abpData.btnCreate.click(); | 
|     await this.dlgStockingCost.waitUntilPresent(); | 
|     expect(await this.dlgStockingCost.isVisible()).toBe(true, LogMessage.dialog_notVisible('Stocking Cost')); | 
|   | 
|     return this.dlgStockingCost; | 
|   } | 
|   | 
|   /** | 
|    * Click on "Edit" button on "Data" action bar page and wait for Stocking Cost dialog to appear | 
|    * | 
|    * @returns Stocking Cost dialog | 
|    */ | 
|   public async startEditViaButton(): Promise<DialogStockingCost> { | 
|     await AppMP.getInstance().abpData.btnEdit.click(); | 
|     await this.dlgStockingCost.waitForScreenUpdate(); | 
|     return this.dlgStockingCost; | 
|   } | 
| } | 
|   | 
| export enum ListStockingCostColumn { | 
|   StockingPoint = 'Stocking Point', | 
|   Account = 'Account', | 
|   CostDriver = 'Cost driver', | 
|   Cost = 'Cost', | 
|   UoM = 'UoM', | 
|   Start = 'Start', | 
|   End = 'End', | 
| } | 
|   | 
| export enum ListStockingCostContextMenuItem { | 
|   Create = 'MenuCreate', | 
|   Edit = 'MenuEdit', | 
|   Copy = 'MenuCopy', | 
|   Delete = 'MenuDelete', | 
| } |