import { KeyboardKey } from '../../e2elib/lib/src/helper/enumhelper'; 
 | 
import { QUtils } from '../../e2elib/lib/src/main/qutils.class'; 
 | 
import { Form } from '../../e2elib/lib/src/pageobjects/form.component'; 
 | 
import { DialogTimeCapacity } from '../dialogs/dialog.timecapacity'; 
 | 
import { LogMessage } from '../../libappbase/logmessage'; 
 | 
import { GanttChartSOP } from '../../libappsop/ganttchartsop'; 
 | 
import { DialogCapacityPlanningEditCalendar } from '../dialogs/dialog.capacityplanningeditcalendar'; 
 | 
  
 | 
export class FormCapacityPlanning extends Form { 
 | 
  public ganttChartCapacityPlanning = new GanttChartCapacityPlanning(); 
 | 
  
 | 
  public constructor() { 
 | 
    super('FormCapacityPlanning'); 
 | 
  } 
 | 
} 
 | 
  
 | 
export class GanttChartCapacityPlanning extends GanttChartSOP { 
 | 
  public static readonly title = 'Capacity planning'; 
 | 
  public static readonly contextMenuRowName = 'gcContextMenuCapacityPlanningRow'; 
 | 
  public static readonly contextMenuName = 'gcContextMenuCapacityPlanning'; 
 | 
  
 | 
  public dlgTimeCapacity = new DialogTimeCapacity(); 
 | 
  public dlgCapacityPlanningEditCalendar = new DialogCapacityPlanningEditCalendar(); 
 | 
  
 | 
  public constructor() { 
 | 
    super(FormCapacityPlanning.name, 'GanttChartCapacityPlanning', GanttChartCapacityPlanning.contextMenuName); 
 | 
  } 
 | 
  
 | 
  /** 
 | 
   * Scroll to the desired column by pressing RIGHT key until the desired column appears 
 | 
   * 
 | 
   * @param rightKeyCount Number of times to press RIGHT key. 
 | 
   */ 
 | 
  public async pressKeyboardRightKey(rightKeyCount: number): Promise<void> { 
 | 
    for (let index = 0; index < rightKeyCount; index++) { 
 | 
      await QUtils.keyBoardAction([KeyboardKey.RIGHT]); 
 | 
    } 
 | 
  } 
 | 
  
 | 
  /** 
 | 
   * Right click and select edit Time Capacity of selected gantt chart row 
 | 
   * 
 | 
   * @param gcrowTitle Row title of the gantt chart to edit. 
 | 
   * @param efficiency efficiency value to edit 
 | 
   */ 
 | 
  public async editRowTimeCapacity(gcrowTitle: string, efficiency: string): Promise<void> { 
 | 
    const gcrow = await this.getRowsByTitle(gcrowTitle); 
 | 
  
 | 
    // Right click on the node and select edit 
 | 
    await this.rightClickRowAndSelectMenu(gcrow[0], ganttChartCapacityPlanningContextMenuItem.EditRow); 
 | 
  
 | 
    // Edit efficiency 
 | 
    await this.dlgTimeCapacity.waitUntilPresent(); 
 | 
    await this.dlgTimeCapacity.updateDialogValues({ Efficiency: efficiency }); 
 | 
    await this.dlgTimeCapacity.clickOK(); 
 | 
  } 
 | 
  
 | 
  /** 
 | 
   * Verify the gantt chart node of selected gantt chart row between dates is not empty or undefined 
 | 
   * 
 | 
   * @param gcrowTitle Row title of the gantt chart to check. 
 | 
   * @param startDate Start Date of gantt chart to check, eg: 1-Jan-2021 
 | 
   * @param endDate End Date of gantt chart to check, eg: 1-Jan-2021 
 | 
   */ 
 | 
  public async verifyGanttChartHasValue(gcrowTitle: string, startDate: string, endDate: string): Promise<void> { 
 | 
    await this.waitGanttChartInitailise(); 
 | 
    const actualValue = await this.getGanttChartNodeValue(gcrowTitle, startDate, endDate); 
 | 
    const isGanttChartValueExist = actualValue !== undefined && actualValue !== ''; 
 | 
    expect(isGanttChartValueExist).toBe(true, `Gantt chart value of row ${gcrowTitle} between ${startDate} to ${endDate} is undefined or empty.`); 
 | 
  } 
 | 
  
 | 
  /** 
 | 
   * Verify the gantt chart node of selected gantt chart row between dates contains pass in value 
 | 
   * 
 | 
   * @param gcrowTitle Row title of the gantt chart to check. 
 | 
   * @param startDate Start Date of gantt chart to check, eg: 1-Jan-2021 
 | 
   * @param endDate End Date of gantt chart to check, eg: 1-Jan-2021 
 | 
   * @param gcNodeValue Gantt chart node value to check 
 | 
   */ 
 | 
  public async verifyGanttChartValue(gcrowTitle: string, startDate: string, endDate: string, gcNodeValue: string): Promise<void> { 
 | 
    await this.waitGanttChartInitailise(); 
 | 
    const actualValue = await this.getGanttChartNodeValue(gcrowTitle, startDate, endDate); 
 | 
  
 | 
    expect(actualValue).toBe(gcNodeValue, LogMessage.value_notMatched(gcNodeValue, actualValue)); 
 | 
  } 
 | 
  
 | 
  /** 
 | 
   * Get the gantt chart node value 
 | 
   * 
 | 
   * @param gcrowTitle Row title of the gantt chart to get. 
 | 
   * @param startDate Start Date of gantt chart to get, eg: 1-Jan-2021 
 | 
   * @param endDate End Date of gantt chart to get, eg: 1-Jan-2021 
 | 
   * @param returnNumberOnly Default false to return the node text as it is (with %). 
 | 
   * 
 | 
   * @returns Gantt chart node value string 
 | 
   */ 
 | 
  public async getGanttChartNodeValue(gcrowTitle: string, startDate: string, endDate: string, returnNumberOnly: boolean = false): Promise<string> { 
 | 
    await this.waitGanttChartInitailise(); 
 | 
    const gcNode = await this.getNodesBetweenDates(gcrowTitle, new Date(startDate), new Date(endDate), false); 
 | 
    let nodeValue = await gcNode[0].getLeftNodeText(); 
 | 
    nodeValue = nodeValue.replace('<br>', ''); // Need remove HTML breakline at the end of the left node text 
 | 
  
 | 
    if (returnNumberOnly) { 
 | 
      nodeValue = nodeValue.replace('%', ''); 
 | 
    } 
 | 
  
 | 
    return nodeValue; 
 | 
  } 
 | 
  
 | 
  /** 
 | 
   * Convert the pass in Gantt chart value based on efficiency 
 | 
   * 
 | 
   * @param gcValueToConvert Gantt chart value to convert 
 | 
   * @param efficiency Efficiency to change 
 | 
   */ 
 | 
  public convertGanttChartValueWithEfficiency(gcValueToConvert: string, efficiency: string): string { 
 | 
    const surfix = '%<br>'; 
 | 
    const gcValueRemoveSurfix = gcValueToConvert.replace(surfix, ''); 
 | 
    const convertedValue = parseInt(gcValueRemoveSurfix, 10) / parseFloat(efficiency); 
 | 
    return `${Math.round(convertedValue)}${surfix}`; 
 | 
  } 
 | 
  
 | 
  /** 
 | 
   * Calculates the average of node values in a gantt chart within the start and end date 
 | 
   * 
 | 
   * @param gcRowsTitle Rows that are used to calculate the average value 
 | 
   * @param startDates Start date array in the gantt chart. Each start element's end date corresponds to matching element position in endDates array. 
 | 
   * @param endDates End date array in the gantt chart 
 | 
   */ 
 | 
  public async getRowNodesAverageValue(gcRowsTitle: string[], startDates: string[], endDates: string[]): Promise<string> { 
 | 
    expect(startDates.length).toBe(endDates.length, `Cannot proceed get nodes average for "${gcRowsTitle.join(', ')}". Number of start dates does not match number of end dates provided.`); 
 | 
  
 | 
    let totalPercentage = 0; 
 | 
    // Loop each row then sum up nodes matching the start and end dates 
 | 
    for (const gcrowTitle of gcRowsTitle) { 
 | 
      for (let dateIndex = 0; dateIndex < startDates.length; dateIndex++) { 
 | 
        const nodeValue = await this.getGanttChartNodeValue(gcrowTitle, startDates[dateIndex], endDates[dateIndex], true); 
 | 
        totalPercentage += Number(nodeValue); 
 | 
      } 
 | 
    } 
 | 
  
 | 
    const totalNodes = gcRowsTitle.length * startDates.length; 
 | 
    return String(totalPercentage / totalNodes); 
 | 
  } 
 | 
} 
 | 
  
 | 
const ganttChartCapacityPlanningContextMenuItem = { 
 | 
  EditCalendar: { ContextMenu: GanttChartCapacityPlanning.contextMenuName, Name: 'MenuEditCalendar', Label: 'Edit calendar' }, 
 | 
  EditCalendarRow: { ContextMenu: GanttChartCapacityPlanning.contextMenuRowName, Name: 'MenuEditCalendarRow', Label: 'Edit calendar' }, 
 | 
  EditRow: { ContextMenu: GanttChartCapacityPlanning.contextMenuRowName, Name: 'MenuEditRow', Label: 'Edit' }, 
 | 
}; 
 | 
  
 | 
export { ganttChartCapacityPlanningContextMenuItem as GanttChartCapacityPlanningContextMenuItem }; 
 | 
  
 | 
/** 
 | 
 * Tooltips for Gantt Chart Capacity Planning 
 | 
 */ 
 | 
export const ganttChartPlanningToolTip = { 
 | 
  editCalendarDisabledNonTimeCapacity: (): string => 'Only applicable to unit capacity type time', 
 | 
}; 
 | 
  
 | 
// Step description to re-use in spec file to prevent scriptor re-write each time 
 | 
const stepCapacityPlanning = { 
 | 
  calcAverageCapacityPercentage: (entities: string[], startDate: any, endDate: any): string => `Get average Percentage of unit capacity from ${startDate} to ${endDate} for entities "${entities.join(', ')}".`, 
 | 
}; 
 | 
  
 | 
export { stepCapacityPlanning as StepCapacityPlanning }; 
 |