import { DialogGoal } from './dialog.goal'; 
 | 
import { DialogSOP } from '../../libappsop/dialogsop'; 
 | 
import { EditFieldSOP } from '../../libappsop/editfieldsop'; 
 | 
import { ListSOP } from '../../libappsop/listsop'; 
 | 
import { PanelBase } from '../../libappbase/panelbase'; 
 | 
import { CheckboxSOP } from '../../libappsop/checkboxsop'; 
 | 
import { DialogDummy } from './dialog.dummy'; 
 | 
import { Image } from '../../e2elib/lib/src/pageobjects/image.component'; 
 | 
  
 | 
export interface DialogStrategyFields { 
 | 
  Name?: string; 
 | 
  NumPeriodsForAverageDemand?: string; 
 | 
  NumPeriodsForSmartPlan?: string; 
 | 
  UseSlidingWindow?: string; 
 | 
  NrOfPeriodsInWindow?: string; 
 | 
  NrOfPeriodsPerSlide?: string; 
 | 
  EnableCampaignOptimizer?: string; 
 | 
  MaxNrOfElementsInCampaignCombi?: string; 
 | 
  UseMetaOptimizer?: string; 
 | 
  MetaOverrideFirstFocusLevel?: string; 
 | 
  MetaFirstFocusLevel?: string; 
 | 
  MetaOverrideLastFocusLevel?: string; 
 | 
  MetaLastFocusLevel?: string; 
 | 
  MetaMaxTimeAllIterations?: string; 
 | 
  MetaWeightCollapsedSlackLevel?: string; 
 | 
  UseShiftPatternOptimization?: string; 
 | 
} 
 | 
  
 | 
export enum DialogStrategyWarningImage { 
 | 
  Warning = 'WARNING', 
 | 
} 
 | 
  
 | 
export interface ListActiveGoalsColumn { 
 | 
  KPI?: string; 
 | 
  Level?: string; 
 | 
  Weight?: string; 
 | 
} 
 | 
  
 | 
export enum ListActiveGoalsContextMenuItemOLD { 
 | 
  MenuEditKPIWeight = 'MenuEditKPIWeight', 
 | 
  MenuIncreaseWeight = 'MenuIncreaseWeight', 
 | 
} 
 | 
  
 | 
const listActiveGoalsContextMenuItem = { 
 | 
  Edit: { ContextMenu: 'listContextMenuGeneral', Name: 'MenuEditKPIWeight', Label: 'Edit' }, 
 | 
  IncreaseWeight: { ContextMenu: 'listContextMenuGeneral', Name: 'MenuIncreaseWeight', Label: 'Increase weight' }, 
 | 
  DecreaseWeight: { ContextMenu: 'listContextMenuGeneral', Name: 'MenuDecreaseWeight', Label: 'Decrease weight' }, 
 | 
  Deactivate: { ContextMenu: 'listContextMenuGeneral', Name: 'MenuDeactivateKPIWeight', Label: 'Deactivate' }, 
 | 
  DecreaseLevel: { ContextMenu: 'listContextMenuGeneral', Name: 'MenuDecreasePriority', Label: 'Decrease level' }, 
 | 
  IncreaseLevel: { ContextMenu: 'listContextMenuGeneral', Name: 'MenuIncreasePriority', Label: 'Increase level' }, 
 | 
}; 
 | 
  
 | 
export { listActiveGoalsContextMenuItem as ListActiveGoalsContextMenuItem }; 
 | 
  
 | 
export class DialogStrategy extends DialogSOP<DialogStrategyFields> { 
 | 
  public static readonly title = 'Optimizer Strategy'; 
 | 
  
 | 
  private readonly _efName = new EditFieldSOP('EditFieldName'); 
 | 
  private readonly _efNumPeriodsAverageDemand = new EditFieldSOP('EditFieldAvgDemand'); 
 | 
  private readonly _efNumPeriodsSmartPlan = new EditFieldSOP('EditFieldNrOfPeriodsSmartPlan'); 
 | 
  private readonly _efNrOfPeriodsInWindow = new EditFieldSOP('EditFieldNrOfPeriodsInWindow'); 
 | 
  private readonly _efNrOfPeriodsPerSlide = new EditFieldSOP('EditFieldNrOfPeriodsPerSlide'); 
 | 
  private readonly _cbUseSlidingWindow = new CheckboxSOP('CheckboxUseSlidingWindowsApproach'); 
 | 
  // Meta optimizer fields 
 | 
  private readonly _cbUseMetaOpt = new CheckboxSOP('CheckboxUseMetaOptimizer'); 
 | 
  private readonly _cbMetaOverrideFirstFocusLevel = new CheckboxSOP('CheckboxOverrideFirstFocusLevel'); 
 | 
  private readonly _efMetaFirstFocusLevel = new EditFieldSOP('EditFieldMetaFirstFocusLevel'); 
 | 
  private readonly _cbMetaOverrideLastFocusLevel = new CheckboxSOP('CheckboxOverrideLastFocusLevel'); 
 | 
  private readonly _efMetaLastFocusLevel = new EditFieldSOP('EditFieldMetaLastFocusLevel'); 
 | 
  private readonly _efMetaMaxTimeAllIterations = new EditFieldSOP('EditFieldMaxiTimeForAllIteration'); 
 | 
  private readonly _efMetaWeightCollapsedSlackLevel = new EditFieldSOP('EditFieldMetaCollapseLevel'); 
 | 
  private readonly _cbUseShiftPatternOptimization = new CheckboxSOP('CheckboxUseShiftPatternOptimization'); 
 | 
  
 | 
  // Warning image when goal configuration violated (if certain goals defined on certain levels, to warn user) 
 | 
  private readonly _warningImage = new Image('ImageOptimizerUnbounded'); 
 | 
  
 | 
  public listActiveGoals = new ListActiveGoals(); 
 | 
  public listInactiveGoals = new ListInactiveGoals(); 
 | 
  
 | 
  // Advanced tab 
 | 
  private readonly _cbUseCampaignSequencingOptimizer = new CheckboxSOP('CheckboxUseCampaignSequencingOptimizer'); 
 | 
  private readonly _efMaxNrOfElemInCampaignCombi = new EditFieldSOP('EditFieldMaxNrOfElementsInCampaignCombi'); 
 | 
  public readonly panelAdvanced = new PanelBase('PanelAdvanced'); 
 | 
  public readonly panelSettings = new PanelBase('PanelSettings'); 
 | 
  
 | 
  public constructor() { 
 | 
    super('DialogCreateEditStrategy'); 
 | 
  
 | 
    // Set UI element mapping to pair the UI name to the UI element for use in DialogSOP to find the UI object to set value or verify value 
 | 
    // This prevents each new Dialog to duplicate code just to set/verify UI element value 
 | 
    this._uiMap.set('Name', this._efName); 
 | 
    this._uiMap.set('NumPeriodsForAverageDemand', this._efNumPeriodsAverageDemand); 
 | 
    this._uiMap.set('NumPeriodsForSmartPlan', this._efNumPeriodsSmartPlan); 
 | 
    this._uiMap.set('UseSlidingWindow', this._cbUseSlidingWindow); 
 | 
    this._uiMap.set('NrOfPeriodsInWindow', this._efNrOfPeriodsInWindow); 
 | 
    this._uiMap.set('NrOfPeriodsPerSlide', this._efNrOfPeriodsPerSlide); 
 | 
    this._uiMap.set('EnableCampaignOptimizer', this._cbUseCampaignSequencingOptimizer); 
 | 
    this._uiMap.set('MaxNrOfElementsInCampaignCombi', this._efMaxNrOfElemInCampaignCombi); 
 | 
    // Meta optimizer fields 
 | 
    this._uiMap.set('UseMetaOptimizer', this._cbUseMetaOpt); 
 | 
    this._uiMap.set('MetaOverrideFirstFocusLevel', this._cbMetaOverrideFirstFocusLevel); 
 | 
    this._uiMap.set('MetaFirstFocusLevel', this._efMetaFirstFocusLevel); 
 | 
    this._uiMap.set('MetaOverrideLastFocusLevel', this._cbMetaOverrideLastFocusLevel); 
 | 
    this._uiMap.set('MetaLastFocusLevel', this._efMetaLastFocusLevel); 
 | 
    this._uiMap.set('MetaMaxTimeAllIterations', this._efMetaMaxTimeAllIterations); 
 | 
    this._uiMap.set('MetaWeightCollapsedSlackLevel', this._efMetaWeightCollapsedSlackLevel); 
 | 
    this._uiMap.set('UseShiftPatternOptimization', this._cbUseShiftPatternOptimization); 
 | 
  } 
 | 
  
 | 
  public async verifyHasWarningImage(expectedHasWarning: boolean, warningImageName?: DialogStrategyWarningImage): Promise<void> { 
 | 
    const isShown = await this._warningImage.isVisible(); 
 | 
  
 | 
    expect(isShown).toBe(expectedHasWarning, 'Verify strategy warning image shown.'); 
 | 
  
 | 
    if (expectedHasWarning && warningImageName) { 
 | 
      const actualImageName = await this._warningImage.getName(); 
 | 
      expect(actualImageName).toBe(warningImageName, 'Verify correct strategy warning image shown.'); 
 | 
    } 
 | 
  } 
 | 
} 
 | 
  
 | 
export class ListActiveGoals extends ListSOP<DialogGoal, ListActiveGoalsColumn> { 
 | 
  public static readonly title = 'Active goals'; 
 | 
  public readonly name = 'Active goals'; 
 | 
  public constructor() { 
 | 
    super('ListActiveGoals', new DialogGoal()); 
 | 
  } 
 | 
  
 | 
  public async getActiveGoals(): Promise<any[]> { 
 | 
    const goals = new Array(); 
 | 
    const rows = await this.getAllRows(); 
 | 
    for (const row of rows) { 
 | 
      const goal = await (await row.getCell('KPI')).getValue(); 
 | 
      const level = await (await row.getCell('Level')).getValue(); 
 | 
      const weight = await (await row.getCell('Weight')).getValue(); 
 | 
  
 | 
      // Push to return array 
 | 
      goals.push({ goal, level, weight }); 
 | 
    } 
 | 
  
 | 
    // Sort rows for caller to compare if 2 strategy has matching goals 
 | 
    // Just arbitary string sorting, no need accurate by goal/KPI level 
 | 
    goals.sort((a: any, b: any) => { 
 | 
      const jsonA = JSON.stringify(a); 
 | 
      const jsonB = JSON.stringify(b); 
 | 
      // TypeScript sort requires return -1 if 1st value smaller, return 1 if greater and 0 if equal 
 | 
      return jsonA < jsonB ? -1 : jsonA > jsonB ? 1 : 0; 
 | 
    }); 
 | 
  
 | 
    return goals; 
 | 
  } 
 | 
  
 | 
  /** 
 | 
   * Perform quick update and verify active goal weightage is edited. 
 | 
   * 
 | 
   * @param kpi KPI Name for active goal 
 | 
   * @param weight Weight for active goal 
 | 
   */ 
 | 
  public async updateActiveGoalWeight(kpi: string, weight: string): Promise<void> { 
 | 
    const selectRow = await this.getRow({ KPI: kpi }); 
 | 
    const [dlgGoal] = await this.selectContextMenu(listActiveGoalsContextMenuItem.Edit, selectRow); 
 | 
    await dlgGoal.updateDialogValues({ Weight: weight }); 
 | 
    await dlgGoal.clickOK(); 
 | 
    await this.verifyRowValues(selectRow, { Weight: weight }); 
 | 
  } 
 | 
} 
 | 
  
 | 
export interface ListInactiveGoalsColumn { 
 | 
  Goal?: string; 
 | 
} 
 | 
  
 | 
export class ListInactiveGoals extends ListSOP<DialogDummy, ListInactiveGoalsColumn> { 
 | 
  public static readonly title = 'Inactive goals'; 
 | 
  public constructor() { 
 | 
    super('ListInactiveGoals', new DialogDummy()); 
 | 
  } 
 | 
} 
 | 
  
 | 
/** 
 | 
 * Tooltips for info 
 | 
 */ 
 | 
// Break line string for tooltip (<br>) 
 | 
const br = '<br>'; 
 | 
export const campaignOptimizerTooltip = { 
 | 
  checkBox_enableCampaignOptimizer: `When enabled, the optimizer is allowed to replan the sequence and the quantities of the campaigns based on the constraints of campaign types and transition types.${br}When disabled, the optimizer is only allowed to replan the quantities of the campaigns based on the constraints of the campaigns created manually.`, 
 | 
  editField_maxNrOfElementsInCampaignCombi: 'Limit on the number of campaign and transition changes per combi.', 
 | 
}; 
 | 
  
 | 
/** 
 | 
 * Tooltips for precondition 
 | 
 */ 
 | 
export const btnOkTooltip = { 
 | 
  maxNrOfElementsInCampaignCombi_isNumberNegative: (input: string): string => `Maximum number of elements in campaign combi (${input}) must be greater than or equal to 1.`, 
 | 
  maxNrOfElementsInCampaignCombi_isInputInvalid: (): string => 'Invalid input for Maximum number of elements in campaign combi', 
 | 
  numPeriodsForAverageDemand_Invalid: (input: string): string => `The default number of periods for average demand (${input}) should be greater than zero.`, 
 | 
  numPeriodsForSmartPlan_Invalid: (input: string): string => `Number of smart plan periods (${input}) must be greater than 0.`, 
 | 
  numPeriodsForSlidingWindow_Invalid: (input: string): string => `The number of periods in the sliding window (${input}) should be at least 1.`, 
 | 
  // Meta optimizer related tooltip 
 | 
  metaFirstFocusLevel_Invalid: (input: string): string => `First focus level (${input}) must be greater than or equal to 0.`, 
 | 
  metaLastFocusLevel_Invalid: (input: string): string => `Last focus level (${input}) must be greater than or equal to 1.`, 
 | 
}; 
 | 
  
 | 
// Step description to re-use in spec file to prevent scriptor re-write each time 
 | 
const stepDialogStrategy = { 
 | 
  verifyHasWarningImage: (expectedHasWarning: boolean, expectedWarningImageName: string = ''): string => `In dialog ${DialogStrategy.title}, verify warning image is visible = ${expectedHasWarning} and warning image = ${expectedWarningImageName}.`, 
 | 
}; 
 | 
  
 | 
export { stepDialogStrategy as StepDialogStrategy }; 
 |