yanweiyuan3
2023-08-09 588bc7829387dfc761cc25f06f77d4c81818bd10
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
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();
  }
}