/** 
 | 
 * @file        S&OP Panel component to wrap common methods the team encounter during development 
 | 
 * @description Panel class extending e2elib's PanelBase. 
 | 
 * All S&OP page objects inherit from our own class (inheriting e2e/libappbase), but we can propose common methods to them. 
 | 
 * @author      Clarence (clarence.chan@3ds.com) 
 | 
 * @copyright   Dassault Systèmes 
 | 
 */ 
 | 
import { PanelBase } from '../libappbase/panelbase'; 
 | 
  
 | 
export class PanelSOP extends PanelBase { 
 | 
  public constructor(componentPath: string) { 
 | 
    super(componentPath); 
 | 
  } 
 | 
  
 | 
  /** 
 | 
   * Ensure only 1 collapsible panel is expanded. 
 | 
   * 
 | 
   * @param panel The panel to be expanded. For the rest, if it's expanded, click to collapse. 
 | 
   */ 
 | 
  public async showOnlyPanel(panel: PanelSOP): Promise<void> { 
 | 
    // Get all property name and check whether it is PanelSOP type 
 | 
    const allPropertyName = Object.getOwnPropertyNames(this); 
 | 
    for (const propertyName of allPropertyName) { 
 | 
      const property = Object.getOwnPropertyDescriptor(this, propertyName); 
 | 
      if (property!.value instanceof PanelSOP) { 
 | 
        const childComponent = property!.value; 
 | 
        // Ensure only target panel is expanded (for the rest, if it's expanded, click to collapse) 
 | 
        const canClick = (panel === childComponent) !== (await childComponent.isShown()); 
 | 
  
 | 
        if (canClick) { 
 | 
          await childComponent.clickPanel(); 
 | 
        } 
 | 
      } 
 | 
    } 
 | 
  } 
 | 
  
 | 
  public async verifyTitle(expectedTitle: string): Promise<void> { 
 | 
    expect(await this.getTitle()).toBe(expectedTitle, `Verify panel ${await this.getComponentLabel()} title value.`); 
 | 
  } 
 | 
} 
 | 
  
 | 
// Step description to re-use in spec file to prevent scriptor re-write each time 
 | 
const stepPanel = { 
 | 
  showOnlyPanel: (panelName: string): string => `Collapse all panels and ensure only panel ${panelName} is expanded.`, 
 | 
  verifyTitle: (panelName: string, expectedTitle: string): string => `In panel '${panelName}, verify title = '${expectedTitle}'.'`, 
 | 
}; 
 | 
  
 | 
export { stepPanel as StepPanel }; 
 |