ng-devui
Version:
DevUI components based on Angular
689 lines • 125 kB
JavaScript
import { ChangeDetectorRef, Component, ElementRef, EventEmitter, Input, Output, TemplateRef, ViewChild, } from '@angular/core';
import { fromEvent } from 'rxjs';
import { distinctUntilChanged, map, pluck, takeUntil, tap } from 'rxjs/operators';
import { GanttService } from '../gantt.service';
import * as i0 from "@angular/core";
import * as i1 from "../gantt.service";
import * as i2 from "@angular/common";
import * as i3 from "@angular/cdk/overlay";
export class GanttBarComponent {
constructor(cdr, ganttService, ele) {
this.cdr = cdr;
this.ganttService = ganttService;
this.ele = ele;
this.mouseMoveTimer = null;
this.mouseLeaveTimer = null;
this.barHovering = false;
this.progressHovering = false;
this.focused = false;
this.MIN_WIDTH = 10;
this.left = 0;
this.width = 0;
this.EARLYOFFSET = 3;
this.cdkOverlayOffsetX = 0;
this.max = 100;
this.min = 0;
this.step = 1;
this.mouseEventDalay = 100;
this.tipHovered = false;
this.mouseMoveOnBar = false;
this.movedOut = false;
this.scrollTimer = null;
this.SCROLL_STEP = 10;
this.outDirection = 'right';
this.scrollViewRange = [0, 0];
this.barMoveDisabled = false;
this.barResizeDisabled = false;
this.progressDisabled = false;
this.progressRate = 0;
this.originOffsetX = 0;
this.showTitle = false;
this.customBarClass = '';
this.customBgClass = '';
this.customTitleClass = '';
this.status = 'normal';
this.barMoveStartEvent = new EventEmitter();
this.barMovingEvent = new EventEmitter();
this.barMoveEndEvent = new EventEmitter();
this.barResizeStartEvent = new EventEmitter();
this.barResizingEvent = new EventEmitter();
this.barResizeEndEvent = new EventEmitter();
this.barProgressEvent = new EventEmitter();
this.onTouchedCallback = (v) => { };
this.onChangeCallback = (v) => { };
}
ngOnInit() {
this.checkRangeValues(this.min, this.max);
this.checkStepValue();
if (this.progressRate === null) {
this.setValue(this.ensureValueInRange(null));
}
this.originStartDate = this.startDate;
this.originEndDate = this.endDate;
this.duration = this.ganttService.getDuration(this.startDate, this.endDate) + 'd';
this.ganttScaleStatusHandler = this.ganttService.ganttScaleConfigChange.subscribe((config) => {
if (config.startDate) {
this.left = this.ganttService.getDatePostionOffset(this.startDate);
}
if (config.unit) {
this.left = this.ganttService.getDatePostionOffset(this.startDate);
this.width = this.ganttService.getDurationWidth(this.startDate, this.endDate);
}
});
}
ngOnChanges(changes) {
const { progressRate, startDate, endDate, barMoveDisabled, barResizeDisabled, progressDisabled } = changes;
if (Object.prototype.hasOwnProperty.call(changes, 'min') ||
Object.prototype.hasOwnProperty.call(changes, 'max') ||
Object.prototype.hasOwnProperty.call(changes, 'step')) {
this.checkRangeValues(this.min, this.max);
this.checkStepValue();
}
if (progressRate && this.progressRate >= 0) {
this.updateTrackAndHandle();
}
if (startDate) {
this.left = this.ganttService.getDatePostionOffset(this.startDate);
this.width = this.ganttService.getDurationWidth(this.startDate, this.endDate);
}
if (endDate) {
this.width = this.ganttService.getDurationWidth(this.startDate, this.endDate);
}
if (barMoveDisabled) {
if (this.barMoveDisabled) {
this.unsubscribeMouseActions(['start'], ['barMove']);
}
else {
this.subscribeMouseActions(['start'], ['barMove']);
}
}
if (barResizeDisabled) {
if (this.barResizeDisabled) {
this.unsubscribeMouseActions(['start'], ['barResize']);
}
else {
this.subscribeMouseActions(['start'], ['barResize']);
}
}
if (progressDisabled) {
if (this.progressDisabled) {
this.unsubscribeMouseActions(['start'], ['progress']);
}
else {
this.subscribeMouseActions(['start'], ['progress']);
}
}
}
ngAfterViewInit() {
if (this.startDate && this.endDate) {
this.registerMouseEventsListeners();
this.registerHandleHoverPopoverListener();
if (!this.barMoveDisabled) {
this.subscribeMouseActions(['start'], ['barMove']);
}
if (!this.barResizeDisabled) {
this.subscribeMouseActions(['start'], ['barResize']);
}
if (!this.progressDisabled) {
this.subscribeMouseActions(['start'], ['progress']);
}
}
if (this.progressRate && this.progressRate > 0) {
this.updateTrackAndHandle();
}
}
registerOnChange(fn) {
this.onChangeCallback = fn;
}
registerOnTouched(fn) {
this.onTouchedCallback = fn;
}
writeValue(newValue) {
this.setValue(this.ensureValueInRange(newValue));
}
checkRangeValues(minValue, maxValue) {
if (maxValue <= minValue) {
throw new Error(`max value must be greater than min value`);
}
}
checkStepValue() {
if (this.step < 0 || !this.step) {
throw new Error('step value must be greater than 0.');
}
else if ((this.max - this.min) % this.step) {
throw new Error('(max - min) must be divisible by step.');
}
}
ratioToValue(ratio, min, max, step) {
let value = (max - min) * ratio + min;
if (step > 0) {
value = Math.round(value / step) * step;
}
return this.clamp(min, value, max);
}
convertHandlePositionToRatio(handleX, startX, totalLength) {
return this.clamp(0, (handleX - startX) / totalLength, 1);
}
clamp(min, n, max) {
return Math.max(min, Math.min(n, max));
}
updateStyle(percentage) {
this.percentage = Math.min(1, Math.max(0, percentage));
if (this.ganttBarTrack && this.ganttBarTrack.nativeElement) {
this.ganttBarTrack.nativeElement.style.width = `${this.percentage * 100}%`;
}
if (this.ganttBarProgress && this.ganttBarProgress.nativeElement) {
this.ganttBarProgress.nativeElement.style.left = `${this.percentage * 100}%`;
}
}
registerMouseEventsListeners() {
this.moveBarStartListener = fromEvent(this.ganttBarMain.nativeElement, 'mousedown').pipe(tap((e) => {
e.stopPropagation();
e.preventDefault();
}), pluck('pageX'));
this.dragProgressStartListener = fromEvent(this.ganttBarProgress.nativeElement, 'mousedown').pipe(tap((e) => {
e.stopPropagation();
e.preventDefault();
}), pluck('pageX'), map((position) => this.mousePositionToAdaptiveValue(position)));
this.resizeBarLeftStartListener = fromEvent(this.ganttBarDarggerLeft.nativeElement, 'mousedown').pipe(tap((e) => {
e.stopPropagation();
e.preventDefault();
}), pluck('pageX'));
this.resizeBarRightStartListener = fromEvent(this.ganttBarDarggerRight.nativeElement, 'mousedown').pipe(tap((e) => {
e.stopPropagation();
e.preventDefault();
}), pluck('pageX'));
this.mouseEndListener = fromEvent(document, 'mouseup');
this.mouseMoveListener = fromEvent(document, 'mousemove').pipe(tap((e) => {
e.stopPropagation();
e.preventDefault();
}), pluck('pageX'), distinctUntilChanged(), takeUntil(this.mouseEndListener));
}
getSliderPagePosition() {
const rect = this.ganttBar.nativeElement.getBoundingClientRect();
const window = this.ganttBar.nativeElement.ownerDocument.defaultView;
return rect.left + window.pageXOffset;
}
getRailLength() {
return this.ganttBarRail.nativeElement.clientWidth;
}
mousePositionToAdaptiveValue(handleX) {
const sliderStartX = this.getSliderPagePosition();
const sliderLength = this.getRailLength();
const ratio = this.convertHandlePositionToRatio(handleX, sliderStartX, sliderLength);
const value = this.ratioToValue(ratio, this.min, this.max, this.step);
return parseFloat(value.toFixed(this.getDecimals(this.step)));
}
getDecimals(value) {
const valueString = value.toString();
const integerLength = valueString.indexOf('.') + 1;
return integerLength >= 0 ? valueString.length - integerLength : 0;
}
progressStartDrag(value) {
this.dragProgressStart = true;
this.handleController(true);
this.setValue(value);
}
barStartMoving(value) {
this.scrollViewRange = [
this.scrollElement.getBoundingClientRect().left + this.originOffsetX,
this.scrollElement.getBoundingClientRect().right,
];
this.moveBarStart = true;
this.barMoveStartPageX = value;
this.barOriginLeft = parseInt(this.ganttBar.nativeElement.style.left, 10);
this.handleController(true);
this.barMoveStartEvent.emit(this.getGanttTaskInfo());
}
barLeftStartResizing(value) {
this.resizeBarLeftStart = true;
this.barResizeStartPageX = value;
this.barOriginLeft = parseInt(this.ganttBar.nativeElement.style.left, 10);
this.barOriginWidth = this.ganttBar.nativeElement.style.width;
this.handleController(true);
this.barResizeStartEvent.emit(this.getGanttTaskInfo());
}
barRightStartResizing(value) {
this.resizeBarRightStart = true;
this.barResizeStartPageX = value;
this.barOriginLeft = parseInt(this.ganttBar.nativeElement.style.left, 10);
this.barOriginWidth = this.ganttBar.nativeElement.style.width;
this.handleController(true);
this.barResizeStartEvent.emit(this.getGanttTaskInfo());
}
mouseMoving(value) {
if (this.dragProgressStart) {
this.setValue(this.mousePositionToAdaptiveValue(value));
this.cdr.markForCheck();
}
if (this.resizeBarLeftStart) {
this.mouseMoveOnBar = true;
const offset = value - this.barResizeStartPageX;
const finalWidth = parseInt(this.barOriginWidth, 10) - Math.round(offset);
if (finalWidth < this.MIN_WIDTH) {
return;
}
const timeOffset = Math.round((offset / this.ganttService.getScaleUnitPixel()) * GanttService.DAY_DURATION);
this.startDate = new Date(this.originStartDate.getTime() + timeOffset);
this.ganttService.roundDate(this.startDate);
if (this.endDate < this.startDate) {
this.startDate = this.endDate;
}
const earlyDateTime = this.startDate.getTime() - this.EARLYOFFSET * GanttService.DAY_DURATION;
if (offset < 0 && earlyDateTime < this.ganttService.scaleStartDate.getTime()) {
this.ganttService.setScaleConfig({ startDate: new Date(earlyDateTime) });
this.barOriginLeft = this.EARLYOFFSET * this.ganttService.getScaleUnitPixel() - Math.round(offset);
}
const finalLeft = this.barOriginLeft + Math.round(offset);
this.left = finalLeft;
this.width = finalWidth;
this.dispatchGanttBarStatus();
const info = this.getGanttTaskInfo();
info.moveOffset = offset;
this.barResizingEvent.emit(info);
}
if (this.resizeBarRightStart) {
this.mouseMoveOnBar = true;
const offset = value - this.barResizeStartPageX;
const finalWidth = parseInt(this.barOriginWidth, 10) + Math.round(offset);
if (finalWidth < this.MIN_WIDTH) {
return;
}
const timeOffset = Math.round((offset / this.ganttService.getScaleUnitPixel()) * GanttService.DAY_DURATION);
this.endDate = new Date(this.originEndDate.getTime() + timeOffset);
this.ganttService.roundDate(this.endDate);
if (this.endDate < this.startDate) {
this.endDate = this.startDate;
}
const lateDateTime = this.endDate.getTime() + this.EARLYOFFSET * GanttService.DAY_DURATION;
if (offset > 0 && lateDateTime > this.ganttService.scaleEndDate.getTime()) {
this.ganttService.setScaleConfig({ endDate: new Date(lateDateTime) });
}
this.width = finalWidth;
this.dispatchGanttBarStatus();
const info = this.getGanttTaskInfo();
info.moveOffset = offset;
this.barResizingEvent.emit(info);
}
if (this.moveBarStart) {
this.checkIsOut(value);
if (this.movedOut) {
return;
}
this.mouseMoveOnBar = true;
const offset = value - this.barMoveStartPageX;
const timeOffset = Math.round((Math.round(offset) / this.ganttService.getScaleUnitPixel()) * GanttService.DAY_DURATION);
const newStartDate = new Date(this.originStartDate.getTime() + timeOffset);
this.ganttService.roundDate(newStartDate);
this.startDate = newStartDate;
const newEndDate = new Date(this.originEndDate.getTime() + timeOffset);
this.ganttService.roundDate(newEndDate);
this.endDate = newEndDate;
const earlyDateTime = this.startDate.getTime() - this.EARLYOFFSET * GanttService.DAY_DURATION;
const lateDateTime = this.endDate.getTime() + this.EARLYOFFSET * GanttService.DAY_DURATION;
if (earlyDateTime < this.ganttService.scaleStartDate.getTime()) {
this.ganttService.setScaleConfig({ startDate: new Date(earlyDateTime) });
}
else if (lateDateTime > this.ganttService.scaleEndDate.getTime()) {
this.ganttService.setScaleConfig({ endDate: new Date(lateDateTime) });
}
const finalLeft = this.barOriginLeft + Math.round(offset);
this.left = finalLeft;
this.dispatchGanttBarStatus();
const info = this.getGanttTaskInfo();
info.moveOffset = offset;
this.barMovingEvent.emit(info);
}
}
checkIsOut(value) {
this.outDirection = value - this.barMoveStartPageX > 0 ? 'right' : 'left';
if (this.outDirection === 'left') {
this.movedOut = value < this.scrollViewRange[0];
}
else {
this.movedOut = value > this.scrollViewRange[1];
}
if (this.movedOut) {
this.autoScroll();
}
else if (this.scrollTimer) {
const left = this.outDirection === 'left'
? this.scrollElement.scrollLeft + (value - this.scrollElement.getBoundingClientRect().left) - this.originOffsetX
: this.scrollElement.scrollLeft + this.scrollElement.clientWidth - this.originOffsetX;
this.setLeft(Math.round(left));
this.stopAutoScroll();
this.barMoveStartPageX = value;
}
}
autoScroll() {
if (!this.scrollTimer) {
this.scrollTimer = setInterval(() => {
this.outDirection === 'left'
? (this.scrollElement.scrollLeft -= this.SCROLL_STEP)
: (this.scrollElement.scrollLeft += this.SCROLL_STEP);
}, 10);
}
}
stopAutoScroll() {
clearInterval(this.scrollTimer);
this.scrollTimer = null;
}
setLeft(left) {
const offset = left - this.left;
const timeOffset = (Math.round(offset) / this.ganttService.getScaleUnitPixel()) * GanttService.DAY_DURATION;
const newStartDate = new Date(this.startDate.getTime() + timeOffset);
this.ganttService.roundDate(newStartDate);
this.startDate = newStartDate;
const newEndDate = new Date(this.endDate.getTime() + timeOffset);
this.ganttService.roundDate(newEndDate);
this.endDate = newEndDate;
this.originStartDate = this.startDate;
this.originEndDate = this.endDate;
this.barOriginLeft = left;
this.left = left;
}
getGanttTaskInfo() {
this.duration = this.ganttService.getDuration(this.startDate, this.endDate) + 'd';
const progress = this.progressRate + '%';
const taskInfo = {
id: this.id,
startDate: this.startDate,
endDate: this.endDate,
duration: this.duration,
progress: progress,
left: this.left,
width: this.width,
};
return taskInfo;
}
mouseStopMoving() {
this.mouseMoveOnBar = false;
this.ganttService.roundDate(this.startDate);
this.ganttService.roundDate(this.endDate);
this.originStartDate = this.startDate;
this.originEndDate = this.endDate;
const taskInfo = this.getGanttTaskInfo();
if (this.moveBarStart) {
const finalLeft = this.ganttService.getDatePostionOffset(this.startDate);
this.left = finalLeft > 0 ? finalLeft : 0;
this.barMoveEndEvent.emit(taskInfo);
}
if (this.resizeBarLeftStart) {
const finalLeft = this.ganttService.getDatePostionOffset(this.startDate);
const finalWidth = this.ganttService.getDurationWidth(this.startDate, this.endDate);
this.left = finalLeft > 0 ? finalLeft : 0;
this.width = finalWidth;
this.barResizeEndEvent.emit(taskInfo);
}
if (this.resizeBarRightStart) {
const finalWidth = this.ganttService.getDurationWidth(this.startDate, this.endDate);
this.width = finalWidth;
this.barResizeEndEvent.emit(taskInfo);
}
if (this.dragProgressStart) {
this.barProgressEvent.emit(this.progressRate);
}
this.handleController(false);
this.stopAutoScroll();
this.cdr.markForCheck();
}
subscribeMouseActions(mouseActions = ['start', 'move', 'end'], events = ['barMove', 'barResize', 'progress']) {
if (mouseActions.indexOf('start') !== -1 &&
this.dragProgressStartListener &&
!this.dragProgressStartHandler &&
events.indexOf('progress') !== -1) {
this.dragProgressStartHandler = this.dragProgressStartListener.subscribe(this.progressStartDrag.bind(this));
}
if (mouseActions.indexOf('start') !== -1 &&
this.moveBarStartListener &&
!this.moveBarStartHandler &&
events.indexOf('barMove') !== -1) {
this.moveBarStartHandler = this.moveBarStartListener.subscribe(this.barStartMoving.bind(this));
}
if (mouseActions.indexOf('start') !== -1 &&
this.resizeBarLeftStartListener &&
!this.resizeBarLeftStartHandler &&
events.indexOf('barResize') !== -1) {
this.resizeBarLeftStartHandler = this.resizeBarLeftStartListener.subscribe(this.barLeftStartResizing.bind(this));
}
if (mouseActions.indexOf('start') !== -1 &&
this.resizeBarRightStartListener &&
!this.resizeBarRightStartHandler &&
events.indexOf('barResize') !== -1) {
this.resizeBarRightStartHandler = this.resizeBarRightStartListener.subscribe(this.barRightStartResizing.bind(this));
}
if (mouseActions.indexOf('move') !== -1 && this.mouseMoveListener && !this.mouseMoveHandler) {
this.mouseMoveHandler = this.mouseMoveListener.subscribe(this.mouseMoving.bind(this));
}
if (mouseActions.indexOf('end') !== -1 && this.mouseEndListener && !this.mouseEndHandler) {
this.mouseEndHandler = this.mouseEndListener.subscribe(this.mouseStopMoving.bind(this));
}
}
unsubscribeMouseActions(dragStages = ['start', 'move', 'end'], events = ['barMove', 'barResize', 'progress']) {
if (dragStages.indexOf('start') !== -1 && events.indexOf('progress') !== -1 && this.dragProgressStartHandler) {
this.dragProgressStartHandler.unsubscribe();
this.dragProgressStartHandler = null;
}
if (dragStages.indexOf('start') !== -1 && events.indexOf('barMove') !== -1 && this.moveBarStartHandler) {
this.moveBarStartHandler.unsubscribe();
this.moveBarStartHandler = null;
}
if (dragStages.indexOf('start') !== -1 && events.indexOf('barResize') !== -1 && this.resizeBarLeftStartHandler) {
this.resizeBarLeftStartHandler.unsubscribe();
this.resizeBarLeftStartHandler = null;
}
if (dragStages.indexOf('start') !== -1 && events.indexOf('barResize') !== -1 && this.resizeBarRightStartHandler) {
this.resizeBarRightStartHandler.unsubscribe();
this.resizeBarRightStartHandler = null;
}
if (dragStages.indexOf('move') !== -1 && this.mouseMoveHandler) {
this.mouseMoveHandler.unsubscribe();
this.mouseMoveHandler = null;
}
if (dragStages.indexOf('end') !== -1 && this.mouseEndHandler) {
this.mouseEndHandler.unsubscribe();
this.mouseEndHandler = null;
}
}
handleController(movable) {
if (movable) {
this.focused = this.focusController();
this.subscribeMouseActions(['move', 'end']);
}
else {
this.dragProgressStart = false;
this.moveBarStart = false;
this.resizeBarLeftStart = false;
this.resizeBarRightStart = false;
this.focused = this.focusController();
this.unsubscribeMouseActions(['move', 'end']);
}
}
setValue(value) {
if (this.progressRate !== value) {
this.progressRate = value;
this.updateTrackAndHandle();
}
this.onChangeCallback(this.progressRate);
}
ensureValueInRange(value) {
let safeValue;
if (!this.valueMustBeValid(value)) {
safeValue = this.min;
}
else {
safeValue = this.clamp(this.min, value, this.max);
}
return safeValue;
}
updateTrackAndHandle() {
const value = this.progressRate;
const offset = this.valueToOffset(value);
this.updateStyle(offset / 100);
this.cdr.markForCheck();
}
valueMustBeValid(value) {
return !isNaN(typeof value !== 'number' ? parseFloat(value) : value);
}
valueToOffset(value) {
return ((value - this.min) / (this.max - this.min)) * 100;
}
registerHandleHoverPopoverListener() {
const mouseOverProgressListener = fromEvent(this.ganttBarProgress.nativeElement, 'mouseover');
const mouseLeaveProgressListener = fromEvent(this.ganttBarProgress.nativeElement, 'mouseout');
this.mouseOverProgressHandler = mouseOverProgressListener.subscribe(this.ganttProgressPopoverOnMouseHover.bind(this));
this.mouseLeaveProgressHandler = mouseLeaveProgressListener.subscribe(this.ganttProgressPopoverOnMouseLeave.bind(this));
}
ganttBarPopoverOnMouseHover($event) {
if (this.mouseLeaveTimer) {
clearTimeout(this.mouseLeaveTimer);
}
this.mouseMoveTimer = setTimeout(() => {
const barLeft = this.ganttBar.nativeElement.getClientRects()[0].left;
const eventLeft = $event.clientX;
this.cdkOverlayOffsetX = eventLeft - barLeft;
this.barHovering = true;
this.focused = this.focusController();
this.dispatchGanttBarStatus();
this.cdr.markForCheck();
}, this.mouseEventDalay);
}
ganttBarPopoverOnMouseLeave() {
if (this.mouseMoveTimer) {
clearTimeout(this.mouseMoveTimer);
}
this.mouseLeaveTimer = setTimeout(() => {
this.barHovering = false;
this.focused = this.focusController();
this.dispatchGanttBarStatus();
this.cdr.markForCheck();
}, this.mouseEventDalay);
}
mouseLeaveTip() {
setTimeout(() => {
this.tipHovered = false;
}, this.mouseEventDalay);
}
ganttProgressPopoverOnMouseHover() {
this.progressHovering = true;
}
ganttProgressPopoverOnMouseLeave() {
this.progressHovering = false;
}
unregisterHandleHoverTooltip() {
if (this.mouseOverProgressHandler) {
this.mouseOverProgressHandler.unsubscribe();
this.mouseOverProgressHandler = null;
}
if (this.mouseLeaveProgressHandler) {
this.mouseLeaveProgressHandler.unsubscribe();
this.mouseLeaveProgressHandler = null;
}
}
clearTimer() {
if (this.mouseLeaveTimer) {
clearTimeout(this.mouseLeaveTimer);
}
if (this.mouseMoveTimer) {
clearTimeout(this.mouseMoveTimer);
}
}
focusController() {
return this.dragProgressStart || this.moveBarStart || this.resizeBarLeftStart || this.resizeBarRightStart || this.barHovering;
}
dispatchGanttBarStatus() {
const status = {
focused: this.focused,
startDate: this.startDate,
endDate: this.endDate,
};
this.ganttService.changeGanttBarStatus(status);
}
ngOnDestroy() {
this.clearTimer();
this.unsubscribeMouseActions();
this.unregisterHandleHoverTooltip();
if (this.ganttScaleStatusHandler) {
this.ganttScaleStatusHandler.unsubscribe();
this.ganttScaleStatusHandler = null;
}
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: GanttBarComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.GanttService }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: GanttBarComponent, selector: "d-gantt-bar", inputs: { barMoveDisabled: "barMoveDisabled", barResizeDisabled: "barResizeDisabled", progressDisabled: "progressDisabled", startDate: "startDate", endDate: "endDate", progressRate: "progressRate", tipTemplateRef: "tipTemplateRef", titleTemplateRef: "titleTemplateRef", data: "data", originOffsetX: "originOffsetX", id: "id", title: "title", showTitle: "showTitle", customBarClass: "customBarClass", customBgClass: "customBgClass", customTitleClass: "customTitleClass", scrollElement: "scrollElement", status: "status" }, outputs: { barMoveStartEvent: "barMoveStartEvent", barMovingEvent: "barMovingEvent", barMoveEndEvent: "barMoveEndEvent", barResizeStartEvent: "barResizeStartEvent", barResizingEvent: "barResizingEvent", barResizeEndEvent: "barResizeEndEvent", barProgressEvent: "barProgressEvent" }, viewQueries: [{ propertyName: "ganttBar", first: true, predicate: ["ganttBar"], descendants: true }, { propertyName: "ganttBarMain", first: true, predicate: ["ganttBarMain"], descendants: true }, { propertyName: "ganttBarProgress", first: true, predicate: ["ganttBarProgress"], descendants: true }, { propertyName: "ganttBarTrack", first: true, predicate: ["ganttBarTrack"], descendants: true }, { propertyName: "ganttBarRail", first: true, predicate: ["ganttBarRail"], descendants: true }, { propertyName: "ganttBarDarggerLeft", first: true, predicate: ["ganttBarDarggerLeft"], descendants: true }, { propertyName: "ganttBarDarggerRight", first: true, predicate: ["ganttBarDarggerRight"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div\n *ngIf=\"startDate && endDate\"\n class=\"devui-gantt-bar {{ customBarClass }}\"\n #ganttBar\n cdk-overlay-origin\n #progress=\"cdkOverlayOrigin\"\n [style.left]=\"left + 'px'\"\n [style.width]=\"width + 'px'\"\n (mouseover)=\"ganttBarPopoverOnMouseHover($event)\"\n (mouseleave)=\"ganttBarPopoverOnMouseLeave()\"\n>\n <div class=\"devui-gantt-hover-layer\" [style.width]=\"width + 24 + 'px'\" [style.display]=\"focused ? 'block' : 'none'\">\n <div #ganttBarDarggerLeft class=\"devui-gantt-dragger left\">\n <div class=\"handle\" [ngClass]=\"{ disabled: barResizeDisabled }\"></div>\n </div>\n <div #ganttBarDarggerRight class=\"devui-gantt-dragger right\">\n <div class=\"handle\" [ngClass]=\"{ disabled: barResizeDisabled }\"></div>\n </div>\n </div>\n <div #ganttBarMain class=\"devui-gantt-main\" [ngClass]=\"{ disabled: barMoveDisabled }\">\n <div class=\"devui-gantt-bar-rail devui-gantt-bar-rail-{{ status }}\" #ganttBarRail></div>\n <div class=\"devui-gantt-bar-track devui-gantt-bar-track-{{ status }}\" #ganttBarTrack></div>\n </div>\n <div\n class=\"devui-gantt-bar-progress\"\n #ganttBarProgress\n [ngClass]=\"{ disabled: progressDisabled, visible: focused }\"\n [attr.title]=\"progressRate ? progressRate : 0 + '%'\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n width=\"12px\"\n height=\"16px\"\n viewBox=\"0 0 12 16\"\n version=\"1.1\"\n >\n <g id=\"gantt-bar-handle\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\">\n <path\n d=\"M7.06066017,1.35355339 C6.76776695,1.06066017 6.38388348,0.914213562 6,0.914213562 C5.61611652,0.914213562 5.23223305,1.06066017 4.93933983,1.35355339 L0.5,5.79289322 L0.5,13 C0.5,13.6903559 0.779822031,14.3153559 1.23223305,14.767767 C1.68464406,15.220178 2.30964406,15.5 3,15.5 L9,15.5 C9.69035594,15.5 10.3153559,15.220178 10.767767,14.767767 C11.220178,14.3153559 11.5,13.6903559 11.5,13 L11.5,5.79289322 L7.06066017,1.35355339 Z\"\n stroke=\"none\"\n fill=\"none\"\n />\n </g>\n </svg>\n </div>\n <div class=\"devui-gantt-bar-title {{ customTitleClass }}\" *ngIf=\"showTitle\">\n <ng-container *ngIf=\"titleTemplateRef\">\n <ng-template [ngTemplateOutlet]=\"titleTemplateRef\" [ngTemplateOutletContext]=\"{ data: data }\"></ng-template>\n </ng-container>\n <ng-container *ngIf=\"!titleTemplateRef\">{{ title }}</ng-container>\n </div>\n <ng-template\n *ngIf=\"tipTemplateRef\"\n cdk-connected-overlay\n [cdkConnectedOverlayOffsetX]=\"cdkOverlayOffsetX\"\n [cdkConnectedOverlayOrigin]=\"progress\"\n [cdkConnectedOverlayOpen]=\"(focused || tipHovered) && !mouseMoveOnBar\"\n >\n <div class=\"devui-gantt-tips\" (mouseover)=\"tipHovered = true\" (mouseleave)=\"mouseLeaveTip()\">\n <ng-template [ngTemplateOutlet]=\"tipTemplateRef\" [ngTemplateOutletContext]=\"{ ganttInstance: this, data: data }\"></ng-template>\n </div>\n </ng-template>\n</div>\n\n<div\n *ngIf=\"moveBarStart\"\n class=\"moving-bg {{ customBgClass }}\"\n [style.left]=\"originOffsetX + left + 'px'\"\n [style.width]=\"width + 'px'\"\n></div>\n", styles: [":host{display:block}.devui-gantt-bar{position:relative;width:100%;cursor:pointer;box-sizing:border-box;height:24px;z-index:3}.devui-gantt-bar .devui-gantt-main{cursor:move}.devui-gantt-bar .devui-gantt-main.disabled{cursor:not-allowed}.devui-gantt-bar .devui-gantt-bar-rail-normal{background:#9dbdfc}.devui-gantt-bar .devui-gantt-bar-rail-overdue{background:#fabdc1}.devui-gantt-bar .devui-gantt-bar-rail-done{background:#dfdfdf}.devui-gantt-bar .devui-gantt-bar-rail{position:absolute;box-shadow:var(--devui-shadow-length-base, 0 1px 6px 0) #5170ff30;height:20px;margin-top:4px;width:100%;border-radius:var(--devui-border-radius, 2px)}.devui-gantt-bar .devui-gantt-bar-rail.disabled{background-color:var(--devui-area, #f3f3f3)}.devui-gantt-bar .devui-gantt-hover-layer{display:none;position:absolute;height:24px;top:2px;left:-12px;border-radius:var(--devui-border-radius, 2px);background-color:var(--devui-connected-overlay-bg, #ffffff);box-shadow:var(--devui-shadow-length-hover, 0 8px 24px 0) #5170ff4d}.devui-gantt-bar .devui-gantt-hover-layer .devui-gantt-dragger{position:absolute;width:12px;height:24px;cursor:col-resize;display:flex;align-items:center}.devui-gantt-bar .devui-gantt-hover-layer .devui-gantt-dragger.left{left:0}.devui-gantt-bar .devui-gantt-hover-layer .devui-gantt-dragger.right{right:0}.devui-gantt-bar .devui-gantt-hover-layer .devui-gantt-dragger .handle{width:2px;height:14px;background:var(--devui-icon-fill, #595959);border-radius:var(--devui-border-radius, 2px);margin:4px}.devui-gantt-bar .devui-gantt-hover-layer .devui-gantt-dragger .handle.disabled{cursor:not-allowed}.devui-gantt-bar .devui-gantt-bar-track-overdue{background-color:var(--devui-danger, #e02128)}.devui-gantt-bar .devui-gantt-bar-track-done{background-color:#939393}.devui-gantt-bar .devui-gantt-bar-track-normal{background-color:var(--devui-brand, #0a59f7);box-shadow:var(--devui-shadow-length-base, 0 1px 6px 0) #5170ff66}.devui-gantt-bar .devui-gantt-bar-track{position:absolute;border-radius:var(--devui-border-radius, 2px) 0 0 var(--devui-border-radius, 2px);height:20px;margin-top:4px;width:0}.devui-gantt-bar .devui-gantt-bar-progress{display:none;position:absolute;left:0;bottom:-8px;transform:translate(-50%);cursor:pointer}.devui-gantt-bar .devui-gantt-bar-progress>svg{display:block}.devui-gantt-bar .devui-gantt-bar-progress>svg>g>path{fill:var(--devui-icon-bg, #ffffff);stroke:var(--devui-icon-fill-active, #191919)}.devui-gantt-bar .devui-gantt-bar-progress.visible{display:block}.devui-gantt-bar .devui-gantt-bar-progress.disabled{cursor:not-allowed}.devui-gantt-bar:hover .devui-gantt-bar-progress{display:block}.devui-gantt-bar .devui-gantt-bar-title{position:absolute;display:inline-flex;align-items:center;left:100%;height:100%;margin-left:12px;word-break:keep-all}.devui-gantt-tips{width:280px;min-height:100px;background:var(--devui-base-bg, #ffffff);box-shadow:var(--devui-shadow-length-feedback-overlay, 0 8px 24px 0) #5170ff1a;border-radius:var(--devui-border-radius-card, 6px);padding:16px;margin-top:8px}.moving-bg{position:absolute;height:100%;top:0;bottom:0;background:var(--devui-float-block-shadow, rgba(94, 124, 224, .3));opacity:.3}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i3.CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "directive", type: i3.CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: GanttBarComponent, decorators: [{
type: Component,
args: [{ selector: 'd-gantt-bar', template: "<div\n *ngIf=\"startDate && endDate\"\n class=\"devui-gantt-bar {{ customBarClass }}\"\n #ganttBar\n cdk-overlay-origin\n #progress=\"cdkOverlayOrigin\"\n [style.left]=\"left + 'px'\"\n [style.width]=\"width + 'px'\"\n (mouseover)=\"ganttBarPopoverOnMouseHover($event)\"\n (mouseleave)=\"ganttBarPopoverOnMouseLeave()\"\n>\n <div class=\"devui-gantt-hover-layer\" [style.width]=\"width + 24 + 'px'\" [style.display]=\"focused ? 'block' : 'none'\">\n <div #ganttBarDarggerLeft class=\"devui-gantt-dragger left\">\n <div class=\"handle\" [ngClass]=\"{ disabled: barResizeDisabled }\"></div>\n </div>\n <div #ganttBarDarggerRight class=\"devui-gantt-dragger right\">\n <div class=\"handle\" [ngClass]=\"{ disabled: barResizeDisabled }\"></div>\n </div>\n </div>\n <div #ganttBarMain class=\"devui-gantt-main\" [ngClass]=\"{ disabled: barMoveDisabled }\">\n <div class=\"devui-gantt-bar-rail devui-gantt-bar-rail-{{ status }}\" #ganttBarRail></div>\n <div class=\"devui-gantt-bar-track devui-gantt-bar-track-{{ status }}\" #ganttBarTrack></div>\n </div>\n <div\n class=\"devui-gantt-bar-progress\"\n #ganttBarProgress\n [ngClass]=\"{ disabled: progressDisabled, visible: focused }\"\n [attr.title]=\"progressRate ? progressRate : 0 + '%'\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n width=\"12px\"\n height=\"16px\"\n viewBox=\"0 0 12 16\"\n version=\"1.1\"\n >\n <g id=\"gantt-bar-handle\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\">\n <path\n d=\"M7.06066017,1.35355339 C6.76776695,1.06066017 6.38388348,0.914213562 6,0.914213562 C5.61611652,0.914213562 5.23223305,1.06066017 4.93933983,1.35355339 L0.5,5.79289322 L0.5,13 C0.5,13.6903559 0.779822031,14.3153559 1.23223305,14.767767 C1.68464406,15.220178 2.30964406,15.5 3,15.5 L9,15.5 C9.69035594,15.5 10.3153559,15.220178 10.767767,14.767767 C11.220178,14.3153559 11.5,13.6903559 11.5,13 L11.5,5.79289322 L7.06066017,1.35355339 Z\"\n stroke=\"none\"\n fill=\"none\"\n />\n </g>\n </svg>\n </div>\n <div class=\"devui-gantt-bar-title {{ customTitleClass }}\" *ngIf=\"showTitle\">\n <ng-container *ngIf=\"titleTemplateRef\">\n <ng-template [ngTemplateOutlet]=\"titleTemplateRef\" [ngTemplateOutletContext]=\"{ data: data }\"></ng-template>\n </ng-container>\n <ng-container *ngIf=\"!titleTemplateRef\">{{ title }}</ng-container>\n </div>\n <ng-template\n *ngIf=\"tipTemplateRef\"\n cdk-connected-overlay\n [cdkConnectedOverlayOffsetX]=\"cdkOverlayOffsetX\"\n [cdkConnectedOverlayOrigin]=\"progress\"\n [cdkConnectedOverlayOpen]=\"(focused || tipHovered) && !mouseMoveOnBar\"\n >\n <div class=\"devui-gantt-tips\" (mouseover)=\"tipHovered = true\" (mouseleave)=\"mouseLeaveTip()\">\n <ng-template [ngTemplateOutlet]=\"tipTemplateRef\" [ngTemplateOutletContext]=\"{ ganttInstance: this, data: data }\"></ng-template>\n </div>\n </ng-template>\n</div>\n\n<div\n *ngIf=\"moveBarStart\"\n class=\"moving-bg {{ customBgClass }}\"\n [style.left]=\"originOffsetX + left + 'px'\"\n [style.width]=\"width + 'px'\"\n></div>\n", styles: [":host{display:block}.devui-gantt-bar{position:relative;width:100%;cursor:pointer;box-sizing:border-box;height:24px;z-index:3}.devui-gantt-bar .devui-gantt-main{cursor:move}.devui-gantt-bar .devui-gantt-main.disabled{cursor:not-allowed}.devui-gantt-bar .devui-gantt-bar-rail-normal{background:#9dbdfc}.devui-gantt-bar .devui-gantt-bar-rail-overdue{background:#fabdc1}.devui-gantt-bar .devui-gantt-bar-rail-done{background:#dfdfdf}.devui-gantt-bar .devui-gantt-bar-rail{position:absolute;box-shadow:var(--devui-shadow-length-base, 0 1px 6px 0) #5170ff30;height:20px;margin-top:4px;width:100%;border-radius:var(--devui-border-radius, 2px)}.devui-gantt-bar .devui-gantt-bar-rail.disabled{background-color:var(--devui-area, #f3f3f3)}.devui-gantt-bar .devui-gantt-hover-layer{display:none;position:absolute;height:24px;top:2px;left:-12px;border-radius:var(--devui-border-radius, 2px);background-color:var(--devui-connected-overlay-bg, #ffffff);box-shadow:var(--devui-shadow-length-hover, 0 8px 24px 0) #5170ff4d}.devui-gantt-bar .devui-gantt-hover-layer .devui-gantt-dragger{position:absolute;width:12px;height:24px;cursor:col-resize;display:flex;align-items:center}.devui-gantt-bar .devui-gantt-hover-layer .devui-gantt-dragger.left{left:0}.devui-gantt-bar .devui-gantt-hover-layer .devui-gantt-dragger.right{right:0}.devui-gantt-bar .devui-gantt-hover-layer .devui-gantt-dragger .handle{width:2px;height:14px;background:var(--devui-icon-fill, #595959);border-radius:var(--devui-border-radius, 2px);margin:4px}.devui-gantt-bar .devui-gantt-hover-layer .devui-gantt-dragger .handle.disabled{cursor:not-allowed}.devui-gantt-bar .devui-gantt-bar-track-overdue{background-color:var(--devui-danger, #e02128)}.devui-gantt-bar .devui-gantt-bar-track-done{background-color:#939393}.devui-gantt-bar .devui-gantt-bar-track-normal{background-color:var(--devui-brand, #0a59f7);box-shadow:var(--devui-shadow-length-base, 0 1px 6px 0) #5170ff66}.devui-gantt-bar .devui-gantt-bar-track{position:absolute;border-radius:var(--devui-border-radius, 2px) 0 0 var(--devui-border-radius, 2px);height:20px;margin-top:4px;width:0}.devui-gantt-bar .devui-gantt-bar-progress{display:none;position:absolute;left:0;bottom:-8px;transform:translate(-50%);cursor:pointer}.devui-gantt-bar .devui-gantt-bar-progress>svg{display:block}.devui-gantt-bar .devui-gantt-bar-progress>svg>g>path{fill:var(--devui-icon-bg, #ffffff);stroke:var(--devui-icon-fill-active, #191919)}.devui-gantt-bar .devui-gantt-bar-progress.visible{display:block}.devui-gantt-bar .devui-gantt-bar-progress.disabled{cursor:not-allowed}.devui-gantt-bar:hover .devui-gantt-bar-progress{display:block}.devui-gantt-bar .devui-gantt-bar-title{position:absolute;display:inline-flex;align-items:center;left:100%;height:100%;margin-left:12px;word-break:keep-all}.devui-gantt-tips{width:280px;min-height:100px;background:var(--devui-base-bg, #ffffff);box-shadow:var(--devui-shadow-length-feedback-overlay, 0 8px 24px 0) #5170ff1a;border-radius:var(--devui-border-radius-card, 6px);padding:16px;margin-top:8px}.moving-bg{position:absolute;height:100%;top:0;bottom:0;background:var(--devui-float-block-shadow, rgba(94, 124, 224, .3));opacity:.3}\n"] }]
}], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i1.GanttService }, { type: i0.ElementRef }], propDecorators: { ganttBar: [{
type: ViewChild,
args: ['ganttBar']
}], ganttBarMain: [{
type: ViewChild,
args: ['ganttBarMain']
}], ganttBarProgress: [{
type: ViewChild,
args: ['ganttBarProgress']
}], ganttBarTrack: [{
type: ViewChild,
args: ['ganttBarTrack']
}], ganttBarRail: [{
type: ViewChild,
args: ['ganttBarRail']
}], ganttBarDarggerLeft: [{
type: ViewChild,
args: ['ganttBarDarggerLeft']
}], ganttBarDarggerRight: [{
type: ViewChild,
args: ['ganttBarDarggerRight']
}], barMoveDisabled: [{
type: Input
}], barResizeDisabled: [{
type: Input
}], progressDisabled: [{
type: Input
}], startDate: [{
type: Input
}], endDate: [{
type: Input
}], progressRate: [{
type: Input
}], tipTemplateRef: [{
type: Input
}], titleTemplateRef: [{
type: Input
}], data: [{
type: Input
}], originOffsetX: [{
type: Input
}], id: [{
type: Input
}], title: [{
type: Input
}], showTitle: [{
type: Input
}], customBarClass: [{
type: Input
}], customBgClass: [{
type: Input
}], customTitleClass: [{
type: Input
}], scrollElement: [{
type: Input
}], status: [{
type: Input
}], barMoveStartEvent: [{
type: Output
}], barMovingEvent: [{
type: Output
}], barMoveEndEvent: [{
type: Output
}], barResizeStartEvent: [{
type: Output
}], barResizingEvent: [{
type: Output
}], barResizeEndEvent: [{
type: Output
}], barProgressEvent: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2FudHQtYmFyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2RldnVpL2dhbnR0L2dhbnR0LWJhci9nYW50dC1iYXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vZGV2dWkvZ2FudHQvZ2FudHQtYmFyL2dhbnR0LWJhci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLEtBQUssRUFJTCxNQUFNLEVBRU4sV0FBVyxFQUNYLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQTRCLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMzRCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFbEYsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGtCQUFrQixDQUFDOzs7OztBQU9oRCxNQUFNLE9BQU8saUJBQWlCO0lBMEc1QixZQUFvQixHQUFzQixFQUFVLFlBQTBCLEVBQVUsR0FBZTtRQUFuRixRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQUFVLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBQVUsUUFBRyxHQUFILEdBQUcsQ0FBWTtRQTFGdkcsbUJBQWMsR0FBUSxJQUFJLENBQUM7UUFDM0Isb0JBQWUsR0FBUSxJQUFJLENBQUM7UUFjcEIsZ0JBQVcsR0FBRyxLQUFLLENBQUM7UUFDcEIscUJBQWdCLEdBQUcsS0FBSyxDQUFDO1FBRzFCLFlBQU8sR0FBRyxLQUFLLENBQUM7UUFDZixjQUFTLEdBQUcsRUFBRSxDQUFDO1FBQ3ZCLFNBQUksR0FBRyxDQUFDLENBQUM7UUFDVCxVQUFLLEdBQUcsQ0FBQyxDQUFDO1FBQ0YsZ0JBQVcsR0FBRyxDQUFDLENBQUM7UUFFeEIsc0JBQWlCLEdBQUcs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