| 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(); | 
|   } | 
| } |