import { EditField } from '../../e2elib/lib/src/pageobjects/editfield.component'; 
 | 
import { compareDateFromDateTimeSelector } from '../../libappbase/timeutils'; 
 | 
import { DialogBase } from '../../libappbase/dialogbase'; 
 | 
import { CheckboxBase } from '../../libappbase/checkboxbase'; 
 | 
import { QInputComponent } from '../../e2elib/lib/src/pageobjects/base/qinput.component'; 
 | 
import { LogMessage } from '../../libappbase/logmessage'; 
 | 
import { DateTimeSelectorSOP } from '../../libappsop/datetimeselectorsop'; 
 | 
import { DropDownListSOP } from '../../libappsop/dropdownlistsop'; 
 | 
import { DropDownStringListSOP } from '../../libappsop/dropdownstringlistsop'; 
 | 
  
 | 
export class DialogStockingCost extends DialogBase { 
 | 
  public ddlAccount = new DropDownListSOP('DropDownListAccount'); 
 | 
  public ddlCostDriver = new DropDownStringListSOP('DropDownStringListCostDriver'); 
 | 
  public ddlStockingPoint = new DropDownListSOP('DropDownListStockingPoint'); 
 | 
  public dtsStart = new DateTimeSelectorSOP('DateSelectorCostStart'); 
 | 
  public ddslTimeUnit = new DropDownStringListSOP('DropDownStringListTimeUnit'); 
 | 
  public efLengthTime = new EditField('EditFieldLengthOfTime'); 
 | 
  public efCost = new EditField('EditFieldCost'); 
 | 
  public cbIsBatchEditTimeUnit = new CheckboxBase('CheckboxBatchEditTimeUnit'); 
 | 
  public cbIsBatchEditLengthOfTime = new CheckboxBase('CheckboxBatchEditLengthOfTime'); 
 | 
  public cbIsBatchEditCost = new CheckboxBase('CheckboxBatchEditCost'); 
 | 
  
 | 
  public constructor() { 
 | 
    super('DialogCreateEditStockingCost', 'btnOk', 'btnCancel'); 
 | 
  } 
 | 
  
 | 
  /** 
 | 
   * Update field value in the dialog 
 | 
   * 
 | 
   * @param account Account field value 
 | 
   * @param costDriver Cost driver field value 
 | 
   * @param stockingPoint Stocking Point field value 
 | 
   * @param startDate Start field value 
 | 
   * @param cost Cost field value 
 | 
   * @param timeunit Timeunit field value 
 | 
   */ 
 | 
  public async updateDialog( 
 | 
    account?: string, 
 | 
    costDriver?: string, 
 | 
    stockingPoint?: string, 
 | 
    startDate?: Date, 
 | 
    cost?: number, 
 | 
    timeunit?: string, 
 | 
    lengthOfTime?: string, 
 | 
  ): Promise<void> { 
 | 
    if (account) { 
 | 
      await this.ddlAccount.selectItemSOP(account); 
 | 
    } 
 | 
    if (costDriver) { 
 | 
      await this.ddlCostDriver.selectItem(costDriver); 
 | 
    } 
 | 
    if (stockingPoint) { 
 | 
      await this.ddlStockingPoint.selectItemSOP(stockingPoint); 
 | 
    } 
 | 
    if (startDate) { 
 | 
      await this.dtsStart.setDate(startDate); 
 | 
    } 
 | 
    if (cost) { 
 | 
      await this.efCost.sendInput(cost.toString(), true); 
 | 
    } 
 | 
  
 | 
    if (timeunit) { 
 | 
      await this.ddslTimeUnit.selectItem(timeunit); 
 | 
    } 
 | 
    if (lengthOfTime) { 
 | 
      await this.efLengthTime.sendInput(lengthOfTime); 
 | 
    } 
 | 
  } 
 | 
  
 | 
  /** 
 | 
   * Verify some batch edit fields that should be disabled, and all batch checkboxes should be visible and unchecked. 
 | 
   */ 
 | 
  public async verifyBatchEditFieldAccess(): Promise<string[]> { 
 | 
    // for input components such as dropdown, date time selector, edit field etc. 
 | 
    const getFeedbacksIfNotDisabled = async (...inputComponents: QInputComponent[]): Promise<string[]> => { 
 | 
      const feedbacks: string[] = []; 
 | 
      for (const component of inputComponents) { 
 | 
        const isDisabled = await component.isDisabled(); 
 | 
        if (!isDisabled) { 
 | 
          const label = await component.getComponentLabel(); 
 | 
          feedbacks.push(`${label.trim()} field should be disabled.`); 
 | 
        } 
 | 
      } 
 | 
      return feedbacks; 
 | 
    }; 
 | 
  
 | 
    const feedbackTexts = await getFeedbacksIfNotDisabled( 
 | 
      this.ddlAccount, 
 | 
      this.ddlCostDriver, 
 | 
      this.ddlStockingPoint, 
 | 
      this.dtsStart, 
 | 
      this.ddslTimeUnit, 
 | 
      this.efLengthTime, 
 | 
      this.efCost, 
 | 
    ); 
 | 
  
 | 
    for (const cb of [this.cbIsBatchEditCost, this.cbIsBatchEditLengthOfTime, this.cbIsBatchEditTimeUnit]) { 
 | 
      const isVisible = await cb.isVisible(); 
 | 
      if (!isVisible) { 
 | 
        feedbackTexts.push(`${LogMessage.checkbox_notVisible(cb.componentName)}`); 
 | 
      } else { 
 | 
        const isChecked = await cb.isChecked(); 
 | 
        // make sure it's not checked 
 | 
        if (isChecked) { 
 | 
          feedbackTexts.push(`${LogMessage.checkbox_isChecked(cb.componentName)}`); 
 | 
        } 
 | 
      } 
 | 
    } 
 | 
    return feedbackTexts; 
 | 
  } 
 | 
  
 | 
  /** 
 | 
   * Verify values in the appropriate fields match passed arguments 
 | 
   * 
 | 
   * @param account Account name of the Stocking Cost 
 | 
   * @param costDriver Cost Driver 
 | 
   * @param stockingPoint Stocking Point 
 | 
   * @param startDate Start Date 
 | 
   * @param timeUnit Time unit 
 | 
   * @param lengthTime Length of time 
 | 
   * @param cost Cost 
 | 
   * 
 | 
   * @returns string that indicates which field does not have expected value. Empty - if all the field values are a sexpected 
 | 
   */ 
 | 
  public async verifyDialogValue( 
 | 
    account?: string, 
 | 
    costDriver?: string, 
 | 
    stockingPoint?: string, 
 | 
    startDate?: Date, 
 | 
    timeUnit?: string, 
 | 
    lengthOfTime?: number, 
 | 
    cost?: number, 
 | 
  ): Promise<string[]> { 
 | 
    const feedbacks: string[] = []; 
 | 
    let actual = ''; 
 | 
    const pushFeedback = (dialogField: string, expectedValue: string, actualValue: string): void => { 
 | 
      if (expectedValue !== actual) { 
 | 
        feedbacks.push(`${dialogField} should be ${expectedValue}, but actual value is "${actualValue}"`); 
 | 
      } 
 | 
    }; 
 | 
    // explicitly checks for undefined because empty string '' will also make below statement false 
 | 
    if (account !== undefined) { 
 | 
      actual = await this.ddlAccount.getSelectedString(); 
 | 
      pushFeedback('Account', account, actual); 
 | 
    } 
 | 
    if (costDriver !== undefined) { 
 | 
      actual = await this.ddlCostDriver.getSelectedString(); 
 | 
      pushFeedback('Cost driver', costDriver, actual); 
 | 
    } 
 | 
    if (stockingPoint !== undefined) { 
 | 
      actual = await this.ddlStockingPoint.getSelectedString(); 
 | 
      pushFeedback('Stocking point', stockingPoint, actual); 
 | 
    } 
 | 
    if (startDate !== undefined) { 
 | 
      const [isMatch, feedback] = await compareDateFromDateTimeSelector(startDate, this.dtsStart, true); 
 | 
      if (!isMatch) { 
 | 
        feedbacks.push(feedback); 
 | 
      } 
 | 
    } 
 | 
    if (timeUnit !== undefined) { 
 | 
      actual = await this.ddslTimeUnit.getSelectedString(); 
 | 
      pushFeedback('Time unit', timeUnit, actual); 
 | 
    } 
 | 
    if (lengthOfTime !== undefined) { 
 | 
      actual = await this.efLengthTime.getText(); 
 | 
      pushFeedback('Length of time', lengthOfTime.toString(), actual); 
 | 
    } 
 | 
    if (cost !== undefined) { 
 | 
      actual = await this.efCost.getText(); 
 | 
      pushFeedback('Cost', cost.toString(), actual); 
 | 
    } 
 | 
    return feedbacks; 
 | 
  } 
 | 
  
 | 
  /** 
 | 
   * Verify that DropDown has the expected number of elements 
 | 
   * 
 | 
   * @param drpd DropDown to be checked 
 | 
   * @param expectedCount Expected number of elements inside drpd 
 | 
   * 
 | 
   * @returns boolean to indicate whether the number elements inside drpd is the same expected 
 | 
   */ 
 | 
  public async verifyDropDownCount(drpd: DropDownListSOP | DropDownStringListSOP, expectedCount: number): Promise<boolean> { 
 | 
    const count = await drpd.getNumberOfElements(); 
 | 
    return count === expectedCount; 
 | 
  } 
 | 
  
 | 
  /** 
 | 
   * 
 | 
   * Verify that DropDown contains certain values 
 | 
   * 
 | 
   * @param drpd DropDown to be checked 
 | 
   * @param values Values that are expected to be present inside drpd 
 | 
   * 
 | 
   * @returns boolean to indicate whether all the values passed are present in drpd 
 | 
   */ 
 | 
  public async verifyDropDownContainValues(drpd: DropDownListSOP | DropDownStringListSOP, values: string[]): Promise<boolean> { 
 | 
    let isSuccess = true; 
 | 
  
 | 
    for (const value of values) { 
 | 
      try { 
 | 
        if (drpd instanceof DropDownListSOP) { 
 | 
          await drpd.selectItemSOP(value); 
 | 
        } else { 
 | 
          await drpd.selectItem(value); 
 | 
        } 
 | 
      } catch { 
 | 
        isSuccess = false; 
 | 
        break; 
 | 
      } 
 | 
    } 
 | 
    return isSuccess; 
 | 
  } 
 | 
  
 | 
  /** 
 | 
   * Get Start Date of the dialog 
 | 
   * 
 | 
   * @returns string to indicate the date of the start datatime selector 
 | 
   */ 
 | 
  public async getStartDate(): Promise<string> { 
 | 
    let day = await this.dtsStart.getDay(); 
 | 
    if (day[0] === '0') { 
 | 
      day = day.slice(-1); 
 | 
    } 
 | 
    const month = await this.dtsStart.getMonth(); 
 | 
    const year = await this.dtsStart.getYear(); 
 | 
    return `${day}-${month}-${year}`; 
 | 
  } 
 | 
  
 | 
  /** 
 | 
   * Get precondition feedback text on the OK button 
 | 
   * 
 | 
   * @returns Precondition feedback text in string 
 | 
   */ 
 | 
  public async getOKButtonTooltip(): Promise<string> { 
 | 
    return this.btnOk.getTooltip(); 
 | 
  } 
 | 
} 
 |