import { Form } from '../../e2elib/lib/src/pageobjects/form.component'; 
 | 
import { DialogScenario } from '../dialogs/dialog.scenario'; 
 | 
import { ListRow } from '../../e2elib/lib/src/pageobjects/list/listrow.component'; 
 | 
import { ListSOP } from '../../libappsop/listsop'; 
 | 
import { ContextMenuItemSOP } from '../../libappsop/contextmenusop'; 
 | 
import { browser } from '../../e2elib/node_modules/protractor/built'; 
 | 
import { Timeout } from '../appmp'; 
 | 
  
 | 
export class FormScenario extends Form { 
 | 
  public lstScenario = new ListScenario(); 
 | 
  
 | 
  public constructor() { 
 | 
    super('FormScenarioManager'); 
 | 
  } 
 | 
} 
 | 
  
 | 
export class ListScenario extends ListSOP<DialogScenario, ListScenarioColumn> { 
 | 
  public constructor() { 
 | 
    super('ListScenario', new DialogScenario()); 
 | 
  
 | 
    // Set primary key column name(s), to display in error message when assert fails 
 | 
    this.rowPrimaryColumnNames = { Name: '' }; 
 | 
  } 
 | 
  
 | 
  /** 
 | 
   * Click Create scenario menu to bring up Scenario dialog. 
 | 
   * Set the scenario name and click OK. 
 | 
   * Verify scenario created before returning to caller. 
 | 
   * 
 | 
   * @param name Scenario name 
 | 
   */ 
 | 
  public async createEmptyScenario(name: string): Promise<void> { 
 | 
    const [dlg] = await this.selectContextMenu(listScenarioContextMenuItem.CreateScenario); 
 | 
    await dlg.updateDialogValues({ Name: name }); 
 | 
    await dlg.clickOK(); 
 | 
  
 | 
    await this.verifyRowExists({ Name: name }); 
 | 
  
 | 
    // Focus on the new scenario to be sure (some tests that creates empty scenario one after another has problem focusing on the correct scenario to click context menu) 
 | 
    await this.selectRow({ Name: name }, [{ Name: ScenarioManager.AllScenarios }]); 
 | 
  } 
 | 
  
 | 
  /** 
 | 
   * Delete all scenarios in given folder 
 | 
   * 
 | 
   * @param folderName target folder name 
 | 
   * @param excludePrefix Ignored if empty. Define a prefix to exclude scenarios from being deleted (e.g if scenario needed for few tests). 
 | 
   * @example await deleteAllScenarios('Recycle bin') 
 | 
   */ 
 | 
  public async deleteAllScenarios(folderName: string, excludePrefix: string = ''): Promise<void> { 
 | 
    const folderRow = await this.getRowByValue([{ columnID: 'Name', value: folderName }]); 
 | 
    await folderRow.expandRow(); 
 | 
    await this.waitForScreenUpdate(); 
 | 
  
 | 
    const childRowCount = await folderRow.getChildRowCount(); 
 | 
    let currentChildRowIndex = 0; 
 | 
    for (let count = 0; count < childRowCount; count++) { 
 | 
      const row = await folderRow.getChildRow(currentChildRowIndex); 
 | 
      if (row !== undefined && row !== null) { 
 | 
        let canDelete = excludePrefix === ''; 
 | 
        // If exclude prefix defined, ensure the current scenario/folder name doesn't start with excludePrefix string 
 | 
        if (!canDelete) { 
 | 
          const cellValue = await (await row.getCell(this.extractColumnName({ Name: '' }))).getValue(); 
 | 
          canDelete = !cellValue.startsWith(excludePrefix); 
 | 
        } 
 | 
  
 | 
        if (canDelete) { 
 | 
          await this.deleteScenario(row); 
 | 
        } else { 
 | 
          currentChildRowIndex++; 
 | 
        } 
 | 
      } 
 | 
    } 
 | 
  } 
 | 
  
 | 
  /** 
 | 
   * Delete scenario via "Delete" context menu 
 | 
   * 
 | 
   * @param row target scneario row 
 | 
   */ 
 | 
  public async deleteScenario(row: ListRow): Promise<void> { 
 | 
    await this.selectContextMenu(listScenarioContextMenuItem.Delete, row); 
 | 
  } 
 | 
  
 | 
  /** 
 | 
   * Delete scenario from All scenarios and move to Recycle bin. 
 | 
   * 
 | 
   * @param name Scenario to delete. 
 | 
   */ 
 | 
  public async deleteScenarioToRecycleBin(name: string): Promise<void> { 
 | 
    const row = await this.getRow({ Name: name }, [{ Name: ScenarioManager.AllScenarios }]); 
 | 
    await this.deleteScenario(row); 
 | 
  } 
 | 
  
 | 
  /** 
 | 
   * Restore item from Recycle bin back to All scenarios folder. 
 | 
   * 
 | 
   * @param name Item to restore. 
 | 
   */ 
 | 
  public async restoreItemFromRecycleBin(name: string): Promise<void> { 
 | 
    const row = await this.getRow({ Name: name }, [{ Name: ScenarioManager.RecycleBin }]); 
 | 
    await this.selectContextMenu(listScenarioContextMenuItem.Restore, row); 
 | 
  } 
 | 
  /** 
 | 
   * Expand parent folder (if provided) to get the scenario, right click scenario and select context menu. 
 | 
   * 
 | 
   * @param scenarioName Scenario name to apply the action 
 | 
   * @param menuName context menu to click 
 | 
   * @param parents Optional. If omitted assume scenario directly under All scenarios. 
 | 
   */ 
 | 
  public async expandFolderAndSelectMenu(scenarioName: string, menuName: ContextMenuItemSOP, parents?: ListScenarioColumn[], timeout?: Timeout.Medium): Promise<void> { 
 | 
    await browser.wait( 
 | 
      async () => { 
 | 
        try { 
 | 
          const effectiveParents: ListScenarioColumn[] | undefined = parents ? parents : [{ Name: ScenarioManager.AllScenarios }]; 
 | 
          // Expand root folder if collapsed 
 | 
          if (effectiveParents.length > 0) { 
 | 
            await this.expandRow(effectiveParents[0]); 
 | 
          } 
 | 
          const row = await this.selectRow({ Name: scenarioName }, effectiveParents); 
 | 
          await this.selectContextMenu(menuName, row); 
 | 
          return true; 
 | 
        } catch (e) { 
 | 
          return false; 
 | 
        } 
 | 
      }, 
 | 
      timeout, 
 | 
      'Timeout exceeded to expand folder and select context menu.', 
 | 
    ); 
 | 
  } 
 | 
} 
 | 
  
 | 
// List Scenario columns 
 | 
export interface ListScenarioColumn { 
 | 
  Name: string; 
 | 
} 
 | 
  
 | 
// List scenario context menu items 
 | 
const listScenarioContextMenuItem = { 
 | 
  CreateScenario: { ContextMenu: 'listContextMenuScenarioFolder', Name: 'MenuCreateScenario', Label: 'Create scenario' }, 
 | 
  Delete: { ContextMenu: 'listContextMenuScenarioFolder', Name: 'MenuDelete', Label: 'Delete' }, 
 | 
  Select: { ContextMenu: 'listContextMenuScenarioFolder', Name: 'MenuSelectScenario', Label: 'Select' }, 
 | 
  Restore: { ContextMenu: 'listContextMenuScenarioFolder', Name: 'MenuRestoreItem', Label: 'Restore item' }, 
 | 
  Load: { ContextMenu: 'listContextMenuScenarioFolder', Name: 'MenuLoadScenario', Label: 'Load' }, 
 | 
  CopyScenario: { ContextMenu: 'listContextMenuScenarioFolder', Name: 'MenuCopyScenario', Label: 'Copy Scenario' }, 
 | 
}; 
 | 
  
 | 
export { listScenarioContextMenuItem as ListScenarioContextMenuItem }; 
 | 
  
 | 
// List Scenario row ondraw image names 
 | 
export enum ListScenarioOnDrawImage { 
 | 
  ActiveScenario = 'CHECK2', 
 | 
} 
 | 
  
 | 
// Default scenario manager folders 
 | 
export enum ScenarioManager { 
 | 
  AllScenarios = 'All scenarios', 
 | 
  RecycleBin = 'Recycle bin', 
 | 
} 
 | 
  
 | 
const stepScenario = { 
 | 
  createEmptyScenario: (scenarioName: string): string => 
 | 
    `In list Scenario manager, right click menu '${listScenarioContextMenuItem.CreateScenario.Label}'. Set scenario name = ${scenarioName} and click OK to create scenario.`, 
 | 
  deleteScenarioToRecycleBin: (scenarioName: string): string => `In list Scenario manager, delete scenario '${scenarioName}' to move it to ${ScenarioManager.RecycleBin}.`, 
 | 
  restoreItemFromRecycleBin: (scenarioName: string): string => `In list Scenario manager, restore scenario '${scenarioName}' from ${ScenarioManager.RecycleBin}.`, 
 | 
  expandFolderAndSelectMenu: (scenarioName: string, menuName: ContextMenuItemSOP): string => 
 | 
    `In list Scenario manager, expand folder, right click scenario '${scenarioName}' and select menu '${menuName.Label}'.`, 
 | 
}; 
 | 
  
 | 
export { stepScenario as StepScenario }; 
 |