UNPKG

@syncfusion/ej2-gantt

Version:
875 lines (874 loc) 62 kB
import { createElement, isNullOrUndefined, isObject, remove } from '@syncfusion/ej2-base'; import * as cls from '../base/css-constants'; import { isScheduledTask } from '../base/utils'; import { SvgRenderer } from '@syncfusion/ej2-svg-base'; /** * To render the connector line in Gantt */ var ConnectorLine = /** @class */ (function () { function ConnectorLine(ganttObj) { this.transform = ''; this.connectorLinePath = ''; this.arrowPath = ''; this.taskLineValue = 0; this.expandedRecords = []; this.parent = ganttObj; this.dependencyViewContainer = createElement('div', { className: cls.dependencyViewContainer }); Object.assign(this.dependencyViewContainer.style, { width: '100%', height: '100%', zIndex: 2, position: 'absolute', pointerEvents: 'none' }); this.renderer = new SvgRenderer(this.parent.element.id); this.initPublicProp(); this.svgObject = this.renderer.createSvg({ id: this.parent.element.id + '_svg' }); this.svgObject.setAttribute('height', '100%'); this.svgObject.setAttribute('width', '100%'); } /** * To get connector line gap. * * @param {IConnectorLineObject} data . * @returns {number} . * @private */ ConnectorLine.prototype.getconnectorLineGap = function (data) { var width = 0; width = (data.milestoneChild ? ((this.parent.chartRowsModule.milestoneMarginTop / 2) + (this.parent.chartRowsModule.milestoneHeight / 2)) : ((this.parent.chartRowsModule.taskBarMarginTop / 2) + (this.parent.chartRowsModule.taskBarHeight / 2))); return width; }; /** * To initialize the public property. * * @returns {void} * @private */ ConnectorLine.prototype.initPublicProp = function () { this.lineColor = this.parent.connectorLineBackground; this.lineStroke = (this.parent.connectorLineWidth) > 4 ? 4 : this.parent.connectorLineWidth; this.createConnectorLineTooltipTable(); }; ConnectorLine.prototype.getTaskbarMidpoint = function (isMilestone) { return Math.floor(isMilestone ? (this.parent.chartRowsModule.milestoneMarginTop + (this.parent.chartRowsModule.milestoneHeight / 2)) : (this.parent.chartRowsModule.taskBarMarginTop + (this.parent.chartRowsModule.taskBarHeight / 2))) + 1; }; /** * To connector line object collection. * * @param {IGanttData} parentGanttData . * @param {IGanttData} childGanttData . * @param {IPredecessor} predecessor . * @param {number} rowHeight . * @returns {void} * @private */ ConnectorLine.prototype.createConnectorLineObject = function (parentGanttData, childGanttData, predecessor, rowHeight) { if (rowHeight === void 0) { rowHeight = 0; } var connectorObj = {}; var updatedRecords; if (this.parent.pdfExportModule && this.parent.pdfExportModule.isPdfExport && this.parent.pdfExportModule.helper.exportProps && this.parent.pdfExportModule.helper.exportProps.fitToWidthSettings && this.parent.pdfExportModule.helper.exportProps.fitToWidthSettings.isFitToWidth) { updatedRecords = this.parent.pdfExportModule.helper.beforeSinglePageExport['cloneFlatData']; } else { updatedRecords = this.parent.pdfExportModule && this.parent.pdfExportModule.isPdfExport ? this.parent.flatData : this.expandedRecords; } var parentIndex; var childIndex; if (this.parent.pdfExportModule && this.parent.pdfExportModule.isPdfExport && this.parent.pdfExportModule.helper.exportProps && this.parent.pdfExportModule.helper.exportProps.fitToWidthSettings && this.parent.pdfExportModule.helper.exportProps.fitToWidthSettings.isFitToWidth) { var parentData = this.parent.flatData.filter(function (data) { return data.ganttProperties.taskId.toString() === parentGanttData.ganttProperties.taskId.toString(); })[0]; var childData = this.parent.flatData.filter(function (data) { return data.ganttProperties.taskId.toString() === childGanttData.ganttProperties.taskId.toString(); })[0]; parentIndex = parentData.index; childIndex = childData.index; } else { parentIndex = updatedRecords.indexOf(parentGanttData); childIndex = updatedRecords.indexOf(childGanttData); } var parentGanttRecord = parentGanttData.ganttProperties; var childGanttRecord = childGanttData.ganttProperties; var currentData; if (this.parent.pdfExportModule && this.parent.pdfExportModule.isPdfExport && this.parent.pdfExportModule.helper.exportProps && this.parent.pdfExportModule.helper.exportProps.fitToWidthSettings && this.parent.pdfExportModule.helper.exportProps.fitToWidthSettings.isFitToWidth) { currentData = this.parent.virtualScrollModule && this.parent.enableVirtualization ? this.parent.pdfExportModule.helper.beforeSinglePageExport['cloneFlatData'] : this.parent.getExpandedRecords(this.parent.pdfExportModule.helper.beforeSinglePageExport['cloneFlatData']); } else { currentData = this.parent.virtualScrollModule && this.parent.enableVirtualization ? this.parent.currentViewData : this.parent.expandedRecords; } connectorObj.parentIndexInCurrentView = currentData.indexOf(parentGanttData); connectorObj.childIndexInCurrentView = currentData.indexOf(childGanttData); var isVirtualScroll = this.parent.virtualScrollModule && this.parent.enableVirtualization; if ((!isVirtualScroll && (connectorObj.parentIndexInCurrentView === -1 || connectorObj.childIndexInCurrentView === -1)) || connectorObj.parentIndexInCurrentView === -1 && connectorObj.childIndexInCurrentView === -1) { return null; } else { connectorObj.parentLeft = parentGanttRecord.isMilestone ? parentGanttRecord.left - (this.parent.chartRowsModule.milestoneHeight / 2) : parentGanttRecord.left; connectorObj.childLeft = childGanttRecord.isMilestone ? childGanttRecord.left - (this.parent.chartRowsModule.milestoneHeight / 2) : childGanttRecord.left; connectorObj.parentWidth = parentGanttRecord.width === 0 || parentGanttRecord.isMilestone ? (Math.floor(this.parent.chartRowsModule.milestoneHeight)) : parentGanttRecord.width; connectorObj.childWidth = childGanttRecord.width === 0 || childGanttRecord.isMilestone ? (Math.floor(this.parent.chartRowsModule.milestoneHeight)) : childGanttRecord.width; connectorObj.parentIndex = parentIndex; connectorObj.childIndex = childIndex; if (rowHeight === 0) { var chartRows = this.parent.ganttChartModule.getChartRows(); connectorObj.rowHeight = !isNullOrUndefined(chartRows) && chartRows[0] && chartRows[0].offsetHeight; } else { connectorObj.rowHeight = rowHeight; } connectorObj.type = predecessor.type; var parentId = this.parent.viewType === 'ResourceView' ? parentGanttRecord.taskId : parentGanttRecord.rowUniqueID; var childId = this.parent.viewType === 'ResourceView' ? childGanttRecord.taskId : childGanttRecord.rowUniqueID; connectorObj.connectorLineId = 'parent' + parentId + 'child' + childId; connectorObj.milestoneParent = parentGanttRecord.isMilestone ? true : false; connectorObj.milestoneChild = childGanttRecord.isMilestone ? true : false; connectorObj.parentEndPoint = connectorObj.parentLeft + connectorObj.parentWidth; connectorObj.childEndPoint = connectorObj.childLeft + connectorObj.childWidth; if (isNullOrUndefined(isScheduledTask(parentGanttRecord)) || isNullOrUndefined(isScheduledTask(childGanttRecord))) { return null; } else { return connectorObj; } } }; /** * To render connector line. * * @param {IConnectorLineObject} connectorLinesCollection . * @returns {void} * @private */ ConnectorLine.prototype.renderConnectorLines = function (connectorLinesCollection) { var connectorLine; var ariaConnector = []; this.svgObject.innerHTML = ''; for (var index = 0; index < connectorLinesCollection.length; index++) { connectorLine = this.getConnectorLineTemplate(connectorLinesCollection[index]); this.svgObject.appendChild(connectorLine); ariaConnector.push(connectorLinesCollection[index]); } var childNodes = this.parent.connectorLineModule.svgObject.childNodes; for (var i = 0; i < childNodes.length; i++) { var innerChild = childNodes[i].childNodes; for (var j = 0; j < innerChild.length; j++) { var ariaString = 'Connector Line ' + this.parent.connectorLineModule.generateAriaLabel(ariaConnector[i]); innerChild[j].setAttribute('aria-label', ariaString); innerChild[j].setAttribute('role', 'img'); } } this.parent.ganttChartModule.chartBodyContent.insertBefore(this.dependencyViewContainer, this.parent.ganttChartModule.chartBodyContent.lastChild); this.dependencyViewContainer.appendChild(this.svgObject); for (var i = 0; i < this.svgObject.children.length; i++) { this.svgObject.children[i].children[0].setAttribute('tabindex', '-1'); } }; /** * To get parent position. * * @param {IConnectorLineObject} data . * @returns {void} * @private */ ConnectorLine.prototype.getParentPosition = function (data) { if (data.parentIndex < data.childIndex) { if (data.type === 'FF') { if ((data.childLeft + data.childWidth) >= (data.parentLeft + data.parentWidth)) { return 'FFType2'; } else { return 'FFType1'; } } else if ((data.parentLeft < data.childLeft) && (data.childLeft > (data.parentLeft + data.parentWidth + 25))) { if (data.type === 'FS') { return 'FSType1'; } if (data.type === 'SF') { return 'SFType1'; } else if (data.type === 'SS') { return 'SSType2'; } } else if ((data.parentLeft < data.childLeft && (data.childLeft < (data.parentLeft + data.parentWidth))) || (data.parentLeft === data.childLeft || data.parentLeft > data.childLeft)) { if (data.parentLeft > (data.childLeft + data.childWidth + 25)) { if (data.type === 'SF') { return 'SFType2'; } } if (data.parentLeft > data.childLeft) { if (data.type === 'SS') { return 'SSType1'; } if (data.type === 'SF') { return 'SFType1'; } } if (data.type === 'FS') { return 'FSType2'; } else if (data.type === 'SS') { return 'SSType2'; } else if (data.type === 'SF') { return 'SFType1'; } } else if ((data.parentLeft) < data.childLeft) { if (data.type === 'FS') { return 'FSType2'; } else if (data.type === 'SS') { return 'SSType2'; } else if (data.type === 'SF') { return 'SFType1'; } } } else if (data.parentIndex > data.childIndex) { if ((data.parentLeft < data.childLeft) && (data.childLeft > (data.parentLeft + data.parentWidth))) { if (data.type === 'FS') { if (30 >= (data.childLeft - (data.milestoneParent ? (data.parentLeft + data.parentWidth + 4) : (data.parentLeft + data.parentWidth)))) { return 'FSType3'; } else { return 'FSType4'; } } if (((data.childLeft + data.childWidth) > (data.parentLeft + data.parentWidth))) { if (data.type === 'SS') { return 'SSType4'; } if (data.type === 'FF') { return 'FFType4'; } if (data.type === 'SF') { return 'SFType4'; } } } else if ((data.parentLeft < data.childLeft && (data.childLeft < (data.parentLeft + data.parentWidth))) || (data.parentLeft === data.childLeft || data.parentLeft > data.childLeft)) { if ((data.childLeft + data.childWidth) <= (data.parentLeft + data.parentWidth)) { if (data.type === 'FF') { return 'FFType3'; } if (data.type === 'SF') { if ((data.childLeft + data.childWidth + 25) < (data.parentLeft)) { return 'SFType3'; } else { return 'SFType4'; } } if (data.type === 'SS') { if (data.childLeft <= data.parentLeft) { return 'SSType3'; } else { return 'SSType4'; } } } else if ((data.childLeft + data.childWidth) > (data.parentLeft + data.parentWidth)) { if (data.type === 'FF') { return 'FFType4'; } if (data.type === 'SF') { return 'SFType4'; } if (data.type === 'SS') { if (data.childLeft <= data.parentLeft) { return 'SSType3'; } else { return 'SSType4'; } } } if (data.type === 'FS') { return 'FSType3'; } } else if (data.parentLeft < data.childLeft) { if (data.type === 'FS') { return 'FSType3'; } if (data.type === 'SS') { return 'SSType4'; } if (data.type === 'FF') { return 'FFType4'; } if (data.type === 'SF') { return 'SFType4'; } } } return null; }; /** * To get line height. * * @param {IConnectorLineObject} data . * @returns {void} * @private */ ConnectorLine.prototype.getHeightValue = function () { if (this.parent.showOverAllocation && !this.parent.allowTaskbarOverlap) { return (this.parentRowIndexHeight) > (this.childRowIndexHeight) ? ((this.parentRowIndexHeight) - (this.childRowIndexHeight)) : ((this.childRowIndexHeight) - (this.parentRowIndexHeight)); } else { return (this.parentRowIndexHeight) > (this.childRowIndexHeight) ? ((this.parentRowIndexHeight) - (this.childRowIndexHeight)) : ((this.childRowIndexHeight) - (this.parentRowIndexHeight)); } }; /** * To get sstype2 inner element width. * * @param {IConnectorLineObject} data . * @returns {void} * @private */ ConnectorLine.prototype.getInnerElementWidthSSType2 = function (data) { if (data.parentLeft === data.childLeft) { return 10; } return (data.childLeft - data.parentLeft); }; /** * To get sstype2 inner element left. * * @param {IConnectorLineObject} data . * @returns {void} * @private */ ConnectorLine.prototype.getInnerElementLeftSSType2 = function (data) { if (data.parentLeft === data.childLeft) { return (data.parentLeft - 20); } return (data.parentLeft - 10); }; /** * To get sstype2 inner child element width. * * @param {IConnectorLineObject} data . * @returns {void} * @private */ ConnectorLine.prototype.getInnerChildWidthSSType2 = function (data) { if ((data.parentLeft + data.parentWidth) < data.childLeft) { return 10; } if (data.parentLeft === data.childLeft) { return 20; } if ((data.parentLeft + data.parentWidth) >= data.childLeft) { return 10; } return (data.childLeft - data.parentLeft); }; // private getBorderStyles(cssType: string, unit: number): string { // const borderWidth: string = 'border-' + cssType + '-width:' + unit + 'px;'; // const borderStyle: string = 'border-' + cssType + '-style:solid;'; // const borderColor: string = !isNullOrUndefined(this.lineColor) ? 'border-' + cssType + '-color:' + this.lineColor + ';' : ''; // return (borderWidth + borderStyle + borderColor); // } ConnectorLine.prototype.calculateAdjustments = function (rowHeight, isMilestone, type) { var taskbarHeightValue = this.parent.renderBaseline ? 0.45 : ((!isNullOrUndefined(document.body.className) && document.body.className.includes('e-bigger')) ? 0.7 : 0.62); var defaultTaskbarHeight = Math.floor(this.parent.rowHeight * taskbarHeightValue); if (((isNullOrUndefined(this.parent.taskbarHeight) && rowHeight <= 36) || (!isNullOrUndefined(this.parent.taskbarHeight) && this.parent.taskbarHeight <= defaultTaskbarHeight)) || !isMilestone) { return { adjustY1: 0, adjustX: 0, adjustY2: 0, adjustZ: 0 }; } else { // Calculate adjustments dynamically for rowHeight greater than 36 var divisorY1 = ((type === 'FSType2' || type === 'FSType3' || type === 'FSType4' || type === 'SSType1' || type === 'SSType2' || type === 'SSType4' || type === 'SFType2')) ? 12 : 24; var adjustY1 = (rowHeight - 36) / divisorY1; var adjustX = -(rowHeight - 36) / 4; var adjustZ = -2 * (rowHeight - 36) / 24; if (rowHeight <= 36) { return { adjustY1: 0, adjustX: 0, adjustY2: 0, adjustZ: 0 }; } return { adjustY1: adjustY1, adjustX: adjustX, adjustZ: adjustZ }; } }; ConnectorLine.prototype.shouldAdjustForBaseline = function (data, type) { if (!this.parent.renderBaseline || !(data.milestoneParent || data.milestoneChild) || (data.milestoneParent && data.milestoneChild)) { return 0; } switch (type) { case 'FSType1': case 'FSType2': if (data.milestoneParent) { return -this.parent.chartRowsModule.milestoneMarginTop / 2; } else { return this.parent.chartRowsModule.taskBarMarginTop; } case 'FSType3': case 'FFType2': case 'SFType2': case 'SSType2': if (data.milestoneParent) { return this.parent.chartRowsModule.milestoneMarginTop / 2; } else { return -this.parent.chartRowsModule.taskBarMarginTop; } case 'FSType4': case 'FFType3': case 'SFType4': case 'FFType4': case 'SFType3': case 'SFType1': if (data.milestoneParent) { return -this.parent.chartRowsModule.milestoneMarginTop / 2; } else { return this.parent.chartRowsModule.taskBarMarginTop; } case 'SSType3': case 'SSType4': if (data.milestoneParent) { return -this.parent.chartRowsModule.taskBarMarginTop; } else { return this.parent.chartRowsModule.taskBarMarginTop; } case 'SSType1': case 'FFType1': if (data.milestoneParent) { return this.parent.chartRowsModule.taskBarMarginTop; } else { return -this.parent.chartRowsModule.milestoneMarginTop / 2; } default: return 0; } }; // Method to fetch the row element height from top row to the parent row index, child row index , last row index ConnectorLine.prototype.updateParentChildRowsHeight = function (data) { var lastRowIndex = this.parent.currentViewData.length - 1; var rowElements = this.parent.ganttChartModule.getChartRows(); this.parentRowIndexHeight = data.parentIndexInCurrentView * data.rowHeight; this.childRowIndexHeight = data.childIndexInCurrentView * data.rowHeight; this.lastRowIndexHeight = lastRowIndex * data.rowHeight; var totalDisplayedRows = 0; if (!this.parent.allowTaskbarOverlap && this.parent.enableMultiTaskbar) { this.parentRowIndexHeight = this.childRowIndexHeight = this.lastRowIndexHeight = 0; for (var i = 0; i < lastRowIndex; i++) { var rowElement = rowElements[i]; if (rowElement && rowElement.style.display !== 'none') { if (totalDisplayedRows < data.parentIndexInCurrentView) { this.parentRowIndexHeight += rowElements[i]['offsetHeight']; } if (totalDisplayedRows < data.childIndexInCurrentView) { this.childRowIndexHeight += rowElements[i]['offsetHeight']; } this.lastRowIndexHeight += rowElements[i]['offsetHeight']; totalDisplayedRows++; } } } }; /** * To get connector line template. * * @param {IConnectorLineObject} data . * @returns {void} * @private */ ConnectorLine.prototype.getConnectorLineTemplate = function (data) { var setInnerChildWidthSSType2 = this.getInnerChildWidthSSType2(data); var setInnerElementWidthSSType2 = this.getInnerElementWidthSSType2(data); var setInnerElementLeftSSType2 = this.getInnerElementLeftSSType2(data); this.updateParentChildRowsHeight(data); var height = this.getHeightValue(); var isMilestone = data.milestoneChild ? true : false; var connectorLine = this.getPosition(data, this.getParentPosition(data), height); var rowPosition = this.getPosition(data, this.getParentPosition(data), height); var rowPositionHeight = rowPosition.top; var isMilestoneValue = 0; if (this.parent.renderBaseline) { var modifiedValue = (this.parent.rowHeight / 36) * 5; isMilestoneValue = (data.milestoneParent && data.milestoneChild) ? 0 : data.milestoneParent ? -modifiedValue : data.milestoneChild ? modifiedValue : 0; } var heightValue = connectorLine.height; var borderTopWidth = 0; var addTop = 0; var parentOverlapTopValue = 0; var childOverlapTopValue = 0; var count = 0; if (this.parent.showOverAllocation && !this.parent.allowTaskbarOverlap) { for (var i = 0; i < this.parent.currentViewData.length; i++) { if (this.parent.getRowByIndex(i).style.display !== 'none') { if (count < data.parentIndex) { count++; parentOverlapTopValue = parentOverlapTopValue + this.parent.getRowByIndex(i).offsetHeight; } } } count = 0; for (var j = 0; j < this.parent.currentViewData.length; j++) { if (this.parent.getRowByIndex(j).style.display !== 'none') { if (count < data.childIndex) { count++; childOverlapTopValue = childOverlapTopValue + this.parent.getRowByIndex(j).offsetHeight; } } } } var expandedData = this.parent.connectorLineModule.expandedRecords; if (expandedData[data.parentIndex] && expandedData[data.childIndex] && this.parent.allowParentDependency) { var fromRecordIsParent = expandedData[data.parentIndex].hasChildRecords; var toRecordIsParent = expandedData[data.childIndex].hasChildRecords; var fromRecordIsManual = expandedData[data.parentIndex].ganttProperties.isAutoSchedule; var toRecordIsManual = expandedData[data.childIndex].ganttProperties.isAutoSchedule; var isValid = true; if (((fromRecordIsParent && fromRecordIsManual) && !toRecordIsParent) || ((toRecordIsParent && toRecordIsManual) && !fromRecordIsParent) || (fromRecordIsParent && fromRecordIsManual && toRecordIsManual && toRecordIsParent) || (!fromRecordIsParent && !toRecordIsParent)) { isValid = false; } if (isValid) { if (((fromRecordIsParent && !fromRecordIsManual) && (toRecordIsParent && !toRecordIsManual))) { addTop = -11; } else if (!((fromRecordIsParent && !fromRecordIsManual) && (toRecordIsParent && !toRecordIsManual))) { if (data.childIndex > data.parentIndex) { if (!fromRecordIsParent && toRecordIsParent) { borderTopWidth = -11; } else { borderTopWidth = 11; addTop = -11; } } else { if ((fromRecordIsParent && !toRecordIsParent)) { borderTopWidth = -11; } else { borderTopWidth = 11; addTop = -11; } } } if (this.parent.currentViewData[data.parentIndex].ganttProperties.isMilestone) { if (data.parentIndex > data.childIndex) { addTop = -11; borderTopWidth = 12; } else if (data.type === 'SS' || data.type === 'FF') { addTop = -5; } } else if (this.parent.currentViewData[data.childIndex].ganttProperties.isMilestone) { if (data.parentIndex > data.childIndex) { addTop = 5; borderTopWidth = -10; } else if (data.parentIndex < data.childIndex) { if (data.type === 'SS' || data.type === 'FF') { addTop = -10; } } } else { if (data.parentIndex < data.childIndex && fromRecordIsManual && !toRecordIsManual) { addTop = 0; borderTopWidth = -11; } else if (data.childIndex < data.parentIndex && !fromRecordIsManual && toRecordIsManual) { addTop = 0; borderTopWidth = -11; } } rowPositionHeight += addTop; } } var predType = this.getParentPosition(data); if (predType) { // Create the group element var type = this.getParentPosition(data); var rowHeight1 = this.parent.rowHeight; var adjustments = this.calculateAdjustments(rowHeight1, isMilestone, type); this.transform = this.parent.enableRtl ? "translate(" + (this.parent.enableTimelineVirtualization ? this.parent.timelineModule.wholeTimelineWidth : this.parent.timelineModule.totalTimelineWidth) + ", 0) scale(-1, 1)" : ''; this.connectorId = 'ConnectorLine' + data.connectorLineId; this.groupObject = this.renderer.createGroup({ id: this.connectorId, transform: this.transform, style: 'pointer-events: stroke', class: cls.connectorLineContainer }); // Create the path element for the connector line this.connectorPath = this.renderer.drawPath({ class: cls.connectorLineSVG, d: this.connectorLinePath, fill: 'transparent', 'stroke-width': this.lineStroke }); // Create the path element for the arrow this.arrowlinePath = this.renderer.drawPath({ d: this.arrowPath, class: cls.connectorLineArrow }); var outlineColor = (this.lineColor) && !(this.parent.enableCriticalPath) ? this.lineColor : ''; this.connectorPath.style.stroke = outlineColor; this.arrowlinePath.style.fill = outlineColor; // Append the path element to the group element this.groupObject.appendChild(this.connectorPath); this.groupObject.appendChild(this.arrowlinePath); var adjustedValue = this.shouldAdjustForBaseline(data, predType); if (predType === 'FSType1') { this.taskLineValue = data.milestoneChild ? 1 : 0; this.x1 = data.parentEndPoint + (data.milestoneParent ? -1 : (data.milestoneChild ? -1 : 0)); this.x2 = data.milestoneParent ? ((((data.childLeft - (data.parentLeft + data.parentWidth + 10)) + this.lineStroke) - 10) + 1) : (((data.childLeft - (data.parentLeft + data.parentWidth + 10)) + this.lineStroke) - 10); this.y1 = rowPositionHeight; this.y2 = heightValue + this.taskLineValue + borderTopWidth - this.lineStroke; this.connectorLinePath = 'M ' + this.x1 + ' ' + (this.y1 - adjustedValue) + ' L ' + ((this.x1 + this.x2) + adjustments['adjustZ']) + ' ' + (this.y1 - adjustedValue) + ' L ' + ((this.x1 + this.x2) + adjustments['adjustZ']) + ' ' + ((this.y1 + this.y2) + adjustments['adjustY1']) + ' L ' + ((this.x1 + this.x2 + 12) + adjustments['adjustX']) + ' ' + ((this.y1 + this.y2) + adjustments['adjustY1']); this.arrowPath = 'M ' + ((this.x1 + this.x2 + 20) + adjustments['adjustX']) + ' ' + ((this.y1 + this.y2) + adjustments['adjustY1']) + ' L ' + ((this.x1 + this.x2 + 12) + adjustments['adjustX']) + ' ' + ((this.y1 + this.y2 - (4 + this.lineStroke)) + adjustments['adjustY1']) + ' L ' + ((this.x1 + this.x2 + 12) + adjustments['adjustX']) + ' ' + ((this.y1 + this.y2 + 4) + adjustments['adjustY1']) + ' Z'; } if (predType === 'FSType2') { this.x1 = data.parentLeft; this.x2 = data.parentWidth + (data.milestoneParent ? -1 : 0); this.x3 = this.x2 + (data.milestoneParent ? 11 : 10); this.x4 = data.parentWidth - ((data.parentEndPoint - data.childLeft) + 20); this.y1 = rowPositionHeight; this.y2 = heightValue + borderTopWidth - this.getconnectorLineGap(data) - this.lineStroke; this.y3 = this.getconnectorLineGap(data); this.y4 = (!this.parent.allowTaskbarOverlap ? childOverlapTopValue : (this.y1 + this.y2 - ((this.y1 + this.y2) % data.rowHeight))); this.connectorLinePath = 'M ' + (this.x1 + this.x2) + ' ' + (this.y1 - adjustedValue) + ' ' + ' L ' + (this.x1 + this.x3) + ' ' + (this.y1 - adjustedValue) + ' L ' + (this.x1 + this.x3) + ' ' + this.y4 + ' L ' + ((this.x1 + this.x4) + adjustments['adjustZ']) + ' ' + this.y4 + ' L ' + ((this.x1 + this.x4) + adjustments['adjustZ']) + ' ' + ((this.y1 + this.y2 + this.y3) + adjustments['adjustY1']) + ' L ' + ((this.x1 + this.x4 + 12) + adjustments['adjustX']) + ' ' + ((this.y1 + this.y2 + this.y3) + adjustments['adjustY1']); this.arrowPath = 'M ' + ((this.x1 + this.x4 + 20) + adjustments['adjustX']) + ' ' + ((this.y1 + this.y2 + this.y3) + adjustments['adjustY1']) + ' L ' + ((this.x1 + this.x4 + 12) + adjustments['adjustX']) + ' ' + ((this.y1 + this.y2 + this.y3 - (4 + this.lineStroke)) + adjustments['adjustY1']) + ' L ' + ((this.x1 + this.x4 + 12) + adjustments['adjustX']) + ' ' + ((this.y1 + this.y2 + this.y3 + 4 + this.lineStroke) + adjustments['adjustY1']) + ' Z'; } if (predType === 'FSType3') { this.taskLineValue = data.milestoneChild ? 1 : 0; this.point1 = rowPositionHeight; this.x1 = (data.childLeft + (data.milestoneChild ? -1 : 0) + (data.milestoneParent ? 1 : 0)) - 20; this.x2 = (data.parentEndPoint - data.childLeft) + 30; this.y1 = this.point1; this.y2 = this.point1 + heightValue + borderTopWidth - this.getconnectorLineGap(data) - this.lineStroke + this.taskLineValue; this.y3 = this.getconnectorLineGap(data); this.y4 = this.y2 - (this.y2 % data.rowHeight); this.connectorLinePath = 'M ' + (this.x1 + 12) + ' ' + ((this.y1 - adjustedValue) + adjustments['adjustY1']) + ' L ' + this.x1 + ' ' + ((this.y1 - adjustedValue) + adjustments['adjustY1']) + ' L ' + this.x1 + ' ' + this.y4 + ' L ' + (this.x1 + this.x2) + ' ' + this.y4 + ' L ' + (this.x1 + this.x2) + ' ' + (this.y2 + this.y3) + ' L ' + (this.x1 + this.x2 - 12) + ' ' + (this.y2 + this.y3); this.arrowPath = 'M ' + ((this.x1 + 20) + adjustments['adjustX']) + ' ' + ((this.y1 - adjustedValue) + adjustments['adjustY1']) + ' L ' + ((this.x1 + 12) + adjustments['adjustX']) + ' ' + ((this.y1 - (4 + this.lineStroke) - adjustedValue) + adjustments['adjustY1']) + ' L ' + ((this.x1 + 12) + adjustments['adjustX']) + ' ' + ((this.y1 + 4 + this.lineStroke - adjustedValue) + adjustments['adjustY1']) + ' Z'; } if (predType === 'FSType4') { this.point1 = rowPositionHeight; this.taskLineValue = this.parent.renderBaseline ? this.taskLineValue : 0; this.x1 = data.parentEndPoint + (data.milestoneChild ? -1 : 0) + (data.milestoneParent ? 1 : 0); this.x2 = data.childLeft - data.parentEndPoint - 20; this.y1 = this.point1 + (data.milestoneChild ? -1 : 0); this.y2 = this.point1 + heightValue + borderTopWidth - this.lineStroke + 1 + this.taskLineValue; this.connectorLinePath = 'M ' + (this.x1 + this.x2 + 12) + ' ' + ((this.y1) + adjustments['adjustY1']) + ' L ' + (this.x1 + this.x2) + ' ' + ((this.y1) + adjustments['adjustY1']) + ' L ' + (this.x1 + this.x2) + ' ' + (this.y2 - adjustedValue) + ' L ' + this.x1 + ' ' + (this.y2 - adjustedValue); this.arrowPath = 'M ' + ((this.x1 + this.x2 + 20) + adjustments['adjustX']) + ' ' + ((this.y1) + adjustments['adjustY1']) + ' L ' + ((this.x1 + this.x2 + 12) + adjustments['adjustX']) + ' ' + ((this.y1 - (4 + this.lineStroke)) + adjustments['adjustY1']) + ' L ' + ((this.x1 + this.x2 + 12) + adjustments['adjustX']) + ' ' + ((this.y1 + 4 + this.lineStroke) + adjustments['adjustY1']) + ' Z'; } if (predType === 'SSType4') { var adjustedX = adjustments['adjustX'] !== 0 ? adjustments['adjustX'] + 2 : adjustments['adjustX']; this.taskLineValue = this.parent.renderBaseline ? this.taskLineValue : 0; this.point1 = heightValue + this.taskLineValue + borderTopWidth; this.x1 = data.parentLeft - 10; this.x2 = data.childLeft - data.parentLeft; this.y1 = rowPositionHeight; this.y2 = this.y1 + this.point1; this.connectorLinePath = 'M ' + ((this.x1 + this.x2) + adjustedX) + ' ' + (this.y1) + ' L ' + this.x1 + ' ' + (this.y1) + ' L ' + this.x1 + ' ' + (this.y2 - adjustedValue) + ' L ' + (this.x1 + 10) + ' ' + (this.y2 - adjustedValue); this.arrowPath = 'M ' + ((this.x1 + this.x2 + 8) + adjustedX) + ' ' + (this.y1) + ' L ' + ((this.x1 + this.x2) + adjustedX) + ' ' + (this.y1 - (4 + this.lineStroke)) + ' L ' + ((this.x1 + this.x2) + adjustedX) + ' ' + (this.y1 + 4 + this.lineStroke) + ' Z'; } if (predType === 'SSType3') { this.taskLineValue = this.parent.renderBaseline ? this.taskLineValue : data.milestoneChild ? 1 : 0; this.point1 = heightValue + this.taskLineValue + borderTopWidth - (this.lineStroke - 1); this.x1 = data.childLeft - 20; this.y1 = rowPositionHeight; this.x2 = data.parentLeft - data.childLeft + 21; this.y2 = this.y1 + this.point1; this.connectorLinePath = 'M ' + ((this.x1 + 12) + adjustments['adjustX']) + ' ' + (this.y1) + ' L ' + this.x1 + ' ' + (this.y1) + ' L ' + this.x1 + ' ' + (this.y2 - adjustedValue) + ' L ' + (this.x1 + this.x2) + ' ' + (this.y2 - adjustedValue); this.arrowPath = 'M ' + ((this.x1 + 20) + adjustments['adjustX']) + ' ' + (this.y1) + ' L ' + ((this.x1 + 12) + adjustments['adjustX']) + ' ' + (this.y1 - (4 + this.lineStroke)) + ' L ' + ((this.x1 + 12) + adjustments['adjustX']) + ' ' + (this.y1 + 4 + this.lineStroke) + ' Z'; } if (predType === 'SSType2') { var adjustedX = adjustments['adjustX'] !== 0 ? adjustments['adjustX'] + 2 : adjustments['adjustX']; this.taskLineValue = this.parent.renderBaseline ? this.taskLineValue : data.milestoneChild ? 1 : 0; this.point1 = heightValue + this.taskLineValue + borderTopWidth - this.lineStroke; this.x1 = setInnerElementLeftSSType2; this.x2 = setInnerChildWidthSSType2 + 1; this.y1 = rowPositionHeight; this.y2 = this.y1 + this.point1; this.connectorLinePath = 'M ' + (this.x1 + this.x2) + ' ' + (this.y1) + ' L ' + this.x1 + ' ' + (this.y1) + ' L ' + this.x1 + ' ' + (this.y2 + adjustments['adjustY1'] - adjustedValue) + ' L ' + ((this.x1 + setInnerElementWidthSSType2) + adjustedX) + ' ' + (this.y2 + adjustments['adjustY1'] - adjustedValue); this.arrowPath = 'M ' + ((this.x1 + setInnerElementWidthSSType2 + 8) + adjustedX) + ' ' + ((this.y2) + adjustments['adjustY1'] - adjustedValue) + ' L ' + ((this.x1 + setInnerElementWidthSSType2) + adjustedX) + ' ' + ((this.y2 - (4 + this.lineStroke)) + adjustments['adjustY1'] - adjustedValue) + ' L ' + ((this.x1 + setInnerElementWidthSSType2) + adjustedX) + ' ' + ((this.y2 + 4 + this.lineStroke) + adjustments['adjustY1'] - adjustedValue) + ' Z'; } if (predType === 'SSType1') { this.taskLineValue = this.parent.renderBaseline ? this.taskLineValue : data.milestoneChild ? 1 : 0; this.point1 = heightValue + this.taskLineValue + borderTopWidth - this.lineStroke; this.x1 = data.childLeft - 20; this.x2 = data.parentLeft - data.childLeft + 21; this.y1 = rowPositionHeight; this.y2 = this.y1 + this.point1; this.connectorLinePath = 'M ' + (this.x1 + this.x2) + ' ' + (this.y1) + ' L ' + this.x1 + ' ' + (this.y1) + ' L ' + this.x1 + ' ' + (this.y2 + adjustments['adjustY1'] - adjustedValue) + ' L ' + ((this.x1 + 12) + adjustments['adjustX']) + ' ' + (this.y2 + adjustments['adjustY1'] - adjustedValue); this.arrowPath = 'M ' + ((this.x1 + 20) + adjustments['adjustX']) + ' ' + ((this.y2) + adjustments['adjustY1'] - adjustedValue) + ' L ' + ((this.x1 + 12) + adjustments['adjustX']) + ' ' + ((this.y2 - (4 + this.lineStroke)) + adjustments['adjustY1'] - adjustedValue) + ' L ' + ((this.x1 + 12) + adjustments['adjustX']) + ' ' + ((this.y2 + 4 + this.lineStroke) + adjustments['adjustY1'] - adjustedValue) + ' Z'; } if (predType === 'FFType1') { var adjustedX = adjustments['adjustX'] !== 0 ? adjustments['adjustX'] + 11 : adjustments['adjustX']; this.taskLineValue = this.parent.renderBaseline ? this.taskLineValue : (data.milestoneChild ? 1 : 0); this.x1 = data.childEndPoint; this.x2 = data.parentEndPoint + (data.milestoneParent ? -1 : 0); this.x3 = data.milestoneParent ? 22 : 21; this.x4 = data.milestoneChild ? 4 : 8; this.y1 = rowPositionHeight; this.y2 = heightValue + this.taskLineValue + borderTopWidth - this.lineStroke + 1; var arrowX = this.parent.renderBaseline ? 0 : adjustedX; this.connectorLinePath = 'M ' + this.x2 + ' ' + (this.y1) + ' L ' + (this.x2 + this.x3) + ' ' + (this.y1) + ' L ' + (this.x2 + this.x3) + ' ' + ((this.y1 + this.y2) + adjustments['adjustY1'] - adjustedValue) + ' L ' + (this.x1 + this.x4) + ' ' + ((this.y1 + this.y2) + adjustments['adjustY1'] - adjustedValue); this.arrowPath = 'M ' + ((this.x1) + arrowX) + ' ' + ((this.y1 + this.y2) + adjustments['adjustY1'] - adjustedValue) + ' L ' + ((this.x1 + 8) + arrowX) + ' ' + ((this.y1 + this.y2 - (4 + this.lineStroke)) + adjustments['adjustY1'] - adjustedValue) + ' L ' + ((this.x1 + 8) + arrowX) + ' ' + ((this.y1 + this.y2 + 4 + this.lineStroke) + adjustments['adjustY1'] - adjustedValue) + ' Z'; } if (predType === 'FFType2') { var adjustedX = adjustments['adjustX'] !== 0 ? adjustments['adjustX'] + 11 : adjustments['adjustX']; this.taskLineValue = this.parent.renderBaseline ? this.taskLineValue : (data.milestoneChild ? 1 : 0); this.x1 = data.parentEndPoint; this.x2 = data.childEndPoint + (data.milestoneParent ? 22 : 21); this.x3 = data.childEndPoint + (data.milestoneChild ? 9 : 8); this.y1 = rowPositionHeight; this.y2 = heightValue + this.taskLineValue + borderTopWidth - this.lineStroke + 1; var arrowX = this.parent.renderBaseline ? 0 : adjustedX; this.connectorLinePath = 'M ' + this.x1 + ' ' + (this.y1) + ' L ' + this.x2 + ' ' + (this.y1) + ' L ' + this.x2 + ' ' + ((this.y1 + this.y2) + adjustments['adjustY1'] - adjustedValue) + ' L ' + this.x3 + ' ' + ((this.y1 + this.y2) + adjustments['adjustY1'] - adjustedValue); this.arrowPath = 'M ' + ((this.x3 - 8) + arrowX) + ' ' + ((this.y1 + this.y2) + adjustments['adjustY1'] - adjustedValue) + ' L ' + (this.x3 + arrowX) + ' ' + ((this.y1 + this.y2 - (4 + this.lineStroke)) + adjustments['adjustY1'] - adjustedValue) + ' L ' + (this.x3 + arrowX) + ' ' + ((this.y1 + this.y2 + 4 + this.lineStroke) + adjustments['adjustY1'] - adjustedValue) + ' Z'; } if (predType === 'FFType3') { var adjustedX = adjustments['adjustX'] !== 0 ? adjustments['adjustX'] + 11 : adjustments['adjustX']; this.taskLineValue = this.parent.renderBaseline ? this.taskLineValue : 0; this.x1 = data.childEndPoint; this.x2 = this.x1 + (data.milestoneChild ? 4 : 8); this.x3 = data.parentEndPoint - data.childEndPoint + (data.milestoneChild ? 16 : 10); this.x4 = data.parentEndPoint + (data.milestoneParent ? -1 : 0); this.y1 = rowPositionHeight; this.y2 = heightValue + this.taskLineValue + borderTopWidth - this.lineStroke + 1; var arrowX = this.parent.renderBaseline ? 0 : adjustedX; this.connectorLinePath = 'M ' + this.x2 + ' ' + (this.y1) + ' L ' + (this.x2 + this.x3) + ' ' + (this.y1) + ' L ' + (this.x2 + this.x3) + ' ' + (this.y1 + this.y2 - adjustedValue) + ' L ' + this.x4 + ' ' + (this.y1 + this.y2 - adjustedValue); this.arrowPath = 'M ' + (this.x1 + arrowX) + ' ' + (this.y1) + ' L ' + ((this.x1 + 8) + arrowX) + ' ' + (this.y1 - (4 + this.lineStroke)) + ' L ' + ((this.x1 + 8) + arrowX) + ' ' + (this.y1 + 4 + this.lineStroke) + ' Z'; } if (predType === 'FFType4') { var adjustedX = adjustments['adjustX'] !== 0 ? adjustments['adjustX'] + 11 : adjustments['adjustX']; this.taskLineValue = this.parent.renderBaseline ? this.taskLineValue : 0; this.x1 = data.parentEndPoint; this.x2 = data.childEndPoint + (data.milestoneChild ? 7 : 8); this.x3 = this.x2 + (data.milestoneChild ? 12 : 11); this.y1 = rowPositionHeight; this.y2 = heightValue + this.taskLineValue + borderTopWidth - this.lineStroke + 1; var arrowX = this.parent.renderBaseline ? 0 : adjustedX; this.connectorLinePath = 'M ' + this.x2 + ' ' + (this.y1) + ' L ' + this.x3 + ' ' + (this.y1) + ' L ' + this.x3 + ' ' + (this.y1 + this.y2 - adjustedValue) + ' L ' + this.x1 + ' ' + (this.y1 + this.y2 - adjustedValue); this.arrowPath = 'M ' + ((this.x2 - 8) + arrowX) + ' ' + (this.y1) + ' L ' + (this.x2 + arrowX) + ' ' + (this.y1 - (4 + this.lineStroke)) + ' L ' + (this.x2 + arrowX) + ' ' + (this.y1 + 4 + this.lineStroke) + ' Z'; } if (predType === 'SFType4') { var adjustedX = adjustments['adjustX'] !== 0 ? adjustments['adjustX'] + 11 : adjustments['adjustX']; this.taskLineValue = this.parent.renderBaseline ? this.taskLineValue : (data.milestoneChild ? -1 : 0); this.point1 = (this.taskLineValue + heightValue + borderTopWidth - this.getconnectorLineGap(data) - (this.lineStroke - 1)); this.point2 = rowPositionHeight; this.x1 = data.parentLeft - 10; this.x2 = this.x1 + ((data.childEndPoint - data.parentLeft) + 18); this.x3 = this.x2 + (data.milestoneChild ? 16 : 11); this.y1 = this.point2; this.y2 = this.y1 + this.point1; this.y3 = this.getconnectorLineGap(data); this.y4 = this.y2 - (this.y2 % data.rowHeight); var arrowX = this.parent.renderBaseline ? 0 : adjustedX; this.connectorLinePath = 'M ' + this.x2 + ' ' + ((this.y1) - adjustments['adjustY1']) + ' L ' + this.x3 + ' ' + ((this.y1) - adjustments['adjustY1']) + ' L ' + this.x3 + ' ' + this.y4 + ' L ' + this.x1 + ' ' + this.y4 + ' L ' + this.x1 + ' ' + ((this.y2 + this.y3) - adjustedValue) + ' L ' + (this.x1 + 11) + ' ' + ((this.y2 + this.y3) - adjustedValue); this.arrowPath = 'M ' + ((this.x2 - 8) + arrowX) + ' ' + ((this.y1) - adjustments['adjustY1']) + ' L ' + (this.x2 + arrowX) + ' ' + ((this.y1 - (4 + this.lineStroke)) - adjustments['adjustY1']) + ' L ' + (this.x2 + arrowX) + ' ' + ((this.y1 + 4 + this.lineStroke) - adjustments['adjustY1']) + ' Z'; } if (predType === 'SFType3') { var adjustedX = adjustments['adjustX'] !== 0 ? adjustments['adjustX'] + 11 : adjustments['adjustX']; this.taskLineValue = this.parent.renderBaseline ? this.taskLineValue : 0; this.point1 = (data.parentLeft - (data.childEndPoint + (data.milestoneParent ? 23 : 20))) + 1; this.point2 = rowPositionHeight; this.x1 = data.childEndPoint; this.x2 = this.x1 + (data.milestoneChild ? 9 : 8);