import { ExtractionType } from '../e2elib/lib/src/helper/enumhelper';
|
import { GanttChartNode } from '../e2elib/lib/src/pageobjects/ganttchart/ganttchartnode';
|
import { GanttChartRow } from '../e2elib/lib/src/pageobjects/ganttchart/ganttchartrow';
|
import { getHtmlContent, getValuePairsFromHtmlTable } from './utils';
|
import { convertDateToUTC } from './timeutils';
|
import { promise } from '../e2elib/node_modules/@types/selenium-webdriver/';
|
import { protractor } from '../e2elib/node_modules/protractor';
|
import { GanttChartNodeCompartment } from '../e2elib/lib/src/pageobjects/ganttchart/qgcnodecompartment';
|
import { GanttChart } from '../e2elib/lib/src/pageobjects/ganttchart/ganttchart.component';
|
|
export class GanttChartBase extends GanttChart {
|
|
/**
|
* Find a node in an array which its Start Date & End Date matches
|
*
|
* @param nodes An array of nodes to find the node
|
* @param startDate The start date of the node to find
|
* @param endDate The end date of the node to find
|
* @param isUTC Indicate whether both the start and end date is in UTC
|
*/
|
public async findNodeByStartEndDate(nodes: GanttChartNode[], startDate: Date, endDate: Date, isUTC: boolean = true): Promise<GanttChartNode | undefined> {
|
if (!isUTC) {
|
startDate = convertDateToUTC(startDate);
|
endDate = convertDateToUTC(endDate);
|
}
|
|
for (const node of nodes) {
|
const start = await node.getStartDate();
|
const end = await node.getEndDate();
|
|
if (start && end) {
|
const startDateIsMatch = start.getTime() === startDate.getTime();
|
const endDataIsMatch = end.getTime() === endDate.getTime();
|
|
if (startDateIsMatch && endDataIsMatch) {
|
return node;
|
}
|
}
|
}
|
return undefined;
|
}
|
|
/**
|
* Get all the visible rows in the gantt chart
|
*
|
*/
|
public async getAllRows(): Promise<GanttChartRow[]> {
|
const promises: promise.Promise<any>[] = [];
|
const numRows = await this.getNumRows();
|
for (let i = 0; i < numRows; i++) {
|
promises.push(this.getRow(i));
|
}
|
return protractor.promise.all(promises);
|
}
|
|
/**
|
* Get all the visible nodes in the gantt chart. If gantt chart row is provided, it will proceed to get all visible nodes from the given row,.
|
*
|
* @param gcRow Gantt chart row which will be extracted for all visible nodes in the given row.
|
*/
|
public async getAllNodes(gcRow?: GanttChartRow): Promise<GanttChartNode[]> {
|
const promises: promise.Promise<any>[] = [];
|
if (gcRow) {
|
const numNodes = await gcRow.getNumNodes();
|
for (let i = 0; i < numNodes; i++) {
|
promises.push(gcRow.getNode(i));
|
}
|
} else {
|
// when gcRow param is not given, perform recursion for each row present in the gantt chart with gcRow param.
|
// with gcRow param passed in, this else block will not execute. only if block will be executed.
|
const rows = await this.getAllRows();
|
for (const row of rows) {
|
promises.concat(this.getAllNodes(row));
|
}
|
}
|
|
return protractor.promise.all(promises);
|
}
|
|
/**
|
* Get gantt chart row title
|
*
|
* @param gcRow Target GCRow to retrieve row title value
|
*/
|
public async getGCRowTitle(gcRow: GanttChartRow): Promise<string> {
|
const titleHTML = await gcRow.getTitle();
|
return getHtmlContent(titleHTML).join(' ');
|
}
|
|
/**
|
* Get the last node of a row in gantt chart
|
*
|
* @param row row to get its last node
|
* @returns last node of the specified row
|
*/
|
public async getLastNode(row: GanttChartRow): Promise<GanttChartNode> {
|
const numNodes = await row.getNumNodes();
|
return await row.getNode(numNodes - 1) as GanttChartNode;
|
}
|
|
/**
|
* Get node of a row based on node text in gantt chart
|
*
|
* @param row row to get its last node
|
* @returns node of the specified row based on node text
|
*/
|
public async getNode(row: GanttChartRow, nodeText: string): Promise<GanttChartNode | undefined> {
|
const rowNodes = await this.getAllNodes(row);
|
for (const node of rowNodes) {
|
if ((await this.getNodeText(node)) === nodeText) {
|
return node;
|
}
|
}
|
return undefined;
|
}
|
|
/**
|
* Get nodes of a row that fall between the specified start and end date
|
*
|
* @param rowName Name of the row to get nodes
|
* @param startDate Start date to get from
|
* @param endDate End date to get from
|
* @param isUTC Indicates to convert the start and end date into UTC
|
* @returns Array of GanttChartNode
|
*/
|
public async getNodesBetweenDates(rowName: string, startDate: Date, endDate: Date, isUTC: boolean = true): Promise<GanttChartNode[]> {
|
const rows = await this.getRowsByTitle(rowName);
|
if (!isUTC) {
|
startDate = convertDateToUTC(startDate);
|
endDate = convertDateToUTC(endDate);
|
}
|
|
expect(rows.length).toBe(1, `Row with title ${rowName} couldn't be found.`);
|
expect(rows.length).not.toBeGreaterThan(1, `${rows.length} of rows with title ${rowName} are retrieved.`);
|
|
const row = rows[0];
|
const nodes = await row.getNodes(startDate, endDate, ExtractionType.BOTH, true);
|
|
return nodes;
|
}
|
|
/**
|
* Get the color of the Gantt chart nodes
|
*
|
* @param nodes Nodes to get its color
|
* @param compartmentIndex The index of the compartment of the node
|
*/
|
public async getNodesColor(nodes: GanttChartNode[], compartmentIndex: number = 0): Promise<string[]> {
|
const colors: promise.Promise<string>[] = [];
|
|
for (const node of nodes) {
|
const color = node.getCompartment(compartmentIndex).then((gcCompartment: GanttChartNodeCompartment | undefined) => {
|
if (gcCompartment) {
|
return gcCompartment.getBackgroundColor();
|
}
|
return node.getBackgroundColor();
|
});
|
|
colors.push(color);
|
}
|
|
return protractor.promise.all(colors);
|
}
|
|
/**
|
* Get the total number of nodes of all rows within the specified period
|
*
|
* @param periodStart Date of start of period
|
* @param periodEnd Date of end of period
|
* @returns Number of nodes of all rows within period
|
*/
|
public async getNumNodesFromAllRowsWithinPeriod(periodStart: Date, periodEnd: Date): Promise<number> {
|
let numNodes = 0;
|
const rowNum = await this.getNumRows();
|
for (let i = 0; i <= rowNum; i++) {
|
const row = await this.getRow(i);
|
if (row !== undefined) {
|
const nodes = await row.getNodes(periodStart, periodEnd);
|
numNodes += nodes.length;
|
}
|
}
|
return numNodes;
|
}
|
|
/**
|
* Get all the visible nodes' text of Gantt chart row
|
*
|
* @param rowTitle The title of the Gantt chart row
|
*/
|
public async getNodesText(row: GanttChartRow): Promise<string[]> {
|
const texts: promise.Promise<string>[] = [];
|
let text: Promise<string>;
|
|
const nodes = await this.getAllNodes(row);
|
|
for (const node of nodes) {
|
text = this.getNodeText(node);
|
texts.push(text);
|
}
|
|
return protractor.promise.all(texts);
|
}
|
|
/**
|
* Get GanttChartNode text
|
*
|
* @param gcNode Target GCNode to retrieve node text value
|
*/
|
public async getNodeText(gcNode: GanttChartNode): Promise<string> {
|
const nodeHTMLText = await gcNode.getLeftNodeText();
|
const nodeText = getHtmlContent(nodeHTMLText).join(' ');
|
return nodeText;
|
}
|
|
/**
|
* Trigger the tooltip on the GC Node and retrieve its value
|
*
|
* @param gcNode Target GC node to retrieve tooltip value
|
* @returns Map object with titles map to values
|
*
|
*/
|
public async getNodeTooltipValuePairs(gcNode: GanttChartNode): Promise<Map<string, string>> {
|
const tooltip = await this.triggerTooltip(gcNode);
|
|
return getValuePairsFromHtmlTable(tooltip);
|
}
|
}
|