@fatcore/gantt-lite 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.editorconfig +16 -0
- package/.vscode/extensions.json +4 -0
- package/.vscode/launch.json +20 -0
- package/.vscode/tasks.json +42 -0
- package/README.md +27 -0
- package/angular.json +165 -0
- package/dist17/gantt-lite/README.md +24 -0
- package/dist17/gantt-lite/esm2022/gantt-lite.mjs +5 -0
- package/dist17/gantt-lite/esm2022/gantt-lite.module.mjs +18 -0
- package/dist17/gantt-lite/esm2022/lib/gantt-lite-base.mjs +290 -0
- package/dist17/gantt-lite/esm2022/lib/gantt-lite.component.mjs +359 -0
- package/dist17/gantt-lite/esm2022/lib/gantt-lite.helper.mjs +107 -0
- package/dist17/gantt-lite/esm2022/lib/gantt-lite.model.mjs +2 -0
- package/dist17/gantt-lite/esm2022/public-api.mjs +3 -0
- package/dist17/gantt-lite/fesm2022/gantt-lite.mjs +774 -0
- package/dist17/gantt-lite/fesm2022/gantt-lite.mjs.map +1 -0
- package/dist17/gantt-lite/gantt-lite.module.d.ts +8 -0
- package/dist17/gantt-lite/index.d.ts +5 -0
- package/dist17/gantt-lite/lib/gantt-lite-base.d.ts +50 -0
- package/dist17/gantt-lite/lib/gantt-lite.component.d.ts +55 -0
- package/dist17/gantt-lite/lib/gantt-lite.helper.d.ts +20 -0
- package/dist17/gantt-lite/lib/gantt-lite.model.d.ts +47 -0
- package/dist17/gantt-lite/public-api.d.ts +2 -0
- package/dist18/gantt-lite/README.md +24 -0
- package/dist18/gantt-lite/esm2022/gantt-lite.mjs +5 -0
- package/dist18/gantt-lite/esm2022/gantt-lite.module.mjs +18 -0
- package/dist18/gantt-lite/esm2022/lib/gantt-lite-base.mjs +290 -0
- package/dist18/gantt-lite/esm2022/lib/gantt-lite.component.mjs +359 -0
- package/dist18/gantt-lite/esm2022/lib/gantt-lite.helper.mjs +107 -0
- package/dist18/gantt-lite/esm2022/lib/gantt-lite.model.mjs +2 -0
- package/dist18/gantt-lite/esm2022/public-api.mjs +3 -0
- package/dist18/gantt-lite/fesm2022/gantt-lite.mjs +774 -0
- package/dist18/gantt-lite/fesm2022/gantt-lite.mjs.map +1 -0
- package/dist18/gantt-lite/gantt-lite.module.d.ts +8 -0
- package/dist18/gantt-lite/index.d.ts +5 -0
- package/dist18/gantt-lite/lib/gantt-lite-base.d.ts +50 -0
- package/dist18/gantt-lite/lib/gantt-lite.component.d.ts +55 -0
- package/dist18/gantt-lite/lib/gantt-lite.helper.d.ts +20 -0
- package/dist18/gantt-lite/lib/gantt-lite.model.d.ts +47 -0
- package/dist18/gantt-lite/public-api.d.ts +2 -0
- package/dist19/gantt-lite/README.md +24 -0
- package/dist19/gantt-lite/fesm2022/gantt-lite.mjs +774 -0
- package/dist19/gantt-lite/fesm2022/gantt-lite.mjs.map +1 -0
- package/dist19/gantt-lite/gantt-lite.module.d.ts +8 -0
- package/dist19/gantt-lite/index.d.ts +5 -0
- package/dist19/gantt-lite/lib/gantt-lite-base.d.ts +50 -0
- package/dist19/gantt-lite/lib/gantt-lite.component.d.ts +55 -0
- package/dist19/gantt-lite/lib/gantt-lite.helper.d.ts +20 -0
- package/dist19/gantt-lite/lib/gantt-lite.model.d.ts +47 -0
- package/dist19/gantt-lite/public-api.d.ts +2 -0
- package/dist20/gantt-lite/README.md +24 -0
- package/dist20/gantt-lite/fesm2022/gantt-lite.mjs +774 -0
- package/dist20/gantt-lite/fesm2022/gantt-lite.mjs.map +1 -0
- package/dist20/gantt-lite/index.d.ts +159 -0
- package/my-workspace-0.0.0.tgz +0 -0
- package/package.json +45 -0
- package/projects/gantt-lite/README.md +24 -0
- package/projects/gantt-lite/ng-package.json +7 -0
- package/projects/gantt-lite/package.json +10 -0
- package/projects/gantt-lite/src/gantt-lite.module.ts +10 -0
- package/projects/gantt-lite/src/lib/gantt-lite-base.ts +300 -0
- package/projects/gantt-lite/src/lib/gantt-lite.component.html +128 -0
- package/projects/gantt-lite/src/lib/gantt-lite.component.scss +323 -0
- package/projects/gantt-lite/src/lib/gantt-lite.component.ts +391 -0
- package/projects/gantt-lite/src/lib/gantt-lite.helper.ts +124 -0
- package/projects/gantt-lite/src/lib/gantt-lite.model.ts +56 -0
- package/projects/gantt-lite/src/public-api.ts +5 -0
- package/projects/gantt-lite/tsconfig.lib.json +14 -0
- package/projects/gantt-lite/tsconfig.lib.prod.json +10 -0
- package/projects/gantt-lite/tsconfig.spec.json +14 -0
- package/projects/my-app/server.ts +56 -0
- package/projects/my-app/src/app/app.component.html +336 -0
- package/projects/my-app/src/app/app.component.scss +0 -0
- package/projects/my-app/src/app/app.component.spec.ts +29 -0
- package/projects/my-app/src/app/app.component.ts +13 -0
- package/projects/my-app/src/app/app.config.server.ts +11 -0
- package/projects/my-app/src/app/app.config.ts +9 -0
- package/projects/my-app/src/app/app.routes.ts +3 -0
- package/projects/my-app/src/assets/.gitkeep +0 -0
- package/projects/my-app/src/favicon.ico +0 -0
- package/projects/my-app/src/index.html +13 -0
- package/projects/my-app/src/main.server.ts +7 -0
- package/projects/my-app/src/main.ts +6 -0
- package/projects/my-app/src/styles.scss +1 -0
- package/projects/my-app/tsconfig.app.json +18 -0
- package/projects/my-app/tsconfig.spec.json +14 -0
- package/tsconfig.json +37 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gantt-lite.mjs","sources":["../../../projects/gantt-lite/src/lib/gantt-lite.helper.ts","../../../projects/gantt-lite/src/lib/gantt-lite-base.ts","../../../projects/gantt-lite/src/lib/gantt-lite.component.ts","../../../projects/gantt-lite/src/lib/gantt-lite.component.html","../../../projects/gantt-lite/src/gantt-lite.module.ts","../../../projects/gantt-lite/src/gantt-lite.ts"],"sourcesContent":["import { DateMode, GanttScale, ScaleConfig } from \"./gantt-lite.model\";\n\nexport class SlotIndexToDateLabelConverter {\n private timeFormatter!: Intl.DateTimeFormat;\n private dayFormatter!: Intl.DateTimeFormat;\n constructor(\n private dateMode: DateMode,\n private originDate: number,\n private slotSeconds: number,\n private hasNegativeDependencySpace: boolean\n ) {\n this.initFormatters();\n }\n\n private initFormatters(): void {\n this.timeFormatter = new Intl.DateTimeFormat([], {\n timeZone: this.dateMode === 'utc' ? 'UTC' : undefined,\n day: '2-digit',\n month: '2-digit',\n year: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n hour12: false\n });\n\n this.dayFormatter = new Intl.DateTimeFormat([], {\n timeZone: this.dateMode === 'utc' ? 'UTC' : undefined,\n day: '2-digit',\n month: '2-digit',\n year: 'numeric'\n });\n}\n\n private get slotMs(): number {\n return this.slotSeconds * 1000;\n }\n\n private indexToDate(index: number): Date {\n const realIndex = this.hasNegativeDependencySpace && index > 0 ? index - 1 : index;\n return new Date(this.originDate + realIndex * this.slotMs);\n }\n\n public getLabelCalendar(index: number, scale: string): string {\n if (this.hasNegativeDependencySpace && index === 0) {\n return 'N/A';\n }\n\n const date = this.indexToDate(index);\n switch (scale) {\n case '1m':\n case '10m':\n case '30m':\n case 'hour':\n case '6 hours':\n case '12 hours':\n return this.formatTime(date);\n case 'day':\n return this.formatDay(date);\n case 'week':\n return this.formatRange(date, 7);\n case 'month':\n return this.formatMonthRange(date);\n case 'year':\n return this.formatYearRange(date);\n default:\n return '';\n }\n }\n\n public getLabelDuration(index: number, scale: string): string {\n if (index === -1) {\n return 'N/A';\n }\n\n switch (scale) {\n case '1m':\n return `${index * 1}m`;\n case '10m':\n return `${index * 10}m`;\n case '30m':\n return `${index * 30}m`;\n case 'hour':\n return `${index}h`;\n case '6 hours':\n return `${index * 6}h`;\n case '12 hours':\n return `${index * 12}h`;\n case 'day':\n return `${index}D`;\n case 'week':\n return `${index * 7}D - ${index * 7 + 7}D`;\n case 'month':\n return `${index * 30}D - ${index * 30 + 30}D`;\n case 'year':\n return `${index * 365}D - ${index * 365 + 365}D`;\n default:\n return '';\n }\n }\n\n private formatTime(date: Date): string {\n return this.timeFormatter.format(date);\n }\n\n private formatDay(date: Date): string {\n return this.dayFormatter.format(date);\n }\n\n private formatRange(start: Date, days: number): string {\n const end = new Date(start);\n end.setDate(end.getDate() + days);\n return `${start.toLocaleDateString()} - ${end.toLocaleDateString()}`;\n }\n\n private formatMonthRange(start: Date): string {\n const date = new Date(start);\n date.setDate(1);\n return date.toLocaleDateString();\n }\n\n private formatYearRange(start: Date): string {\n return `${start.toLocaleDateString()}`;\n }\n}\n","import { Directive, Input } from '@angular/core';\r\nimport { DataType, DateMode, DependencyPath, GanttColumn, GanttScale, GanttTask, ScaleConfig } from './gantt-lite.model';\r\nimport { TimelineSlot } from './gantt-lite.model';\r\n\r\n@Directive()\r\nexport abstract class GanttLiteBase {\r\n @Input() public rowHeight: number = 40;\r\n @Input() public defaultScale: GanttScale = 'day';\r\n @Input() public dataType: DataType = 'duration';\r\n @Input() public dateMode: DateMode = 'local';\r\n @Input() public extraColumns: GanttColumn[] = [];\r\n protected slots: TimelineSlot[] = [];\r\n protected tasks: GanttTask[] = [];\r\n public dependencyPaths: DependencyPath[] = [];\r\n protected scaleSelected: ScaleConfig = this.getScaleConfig(this.defaultScale);\r\n protected headerHeight: number = 32;\r\n protected ganttHeight: number = 0;\r\n protected ganttWidth: number = 0;\r\n protected leftPanelWidth = 320;\r\n protected visibleGridColumns: GanttColumn[] = [];\r\n protected visibleTooltipColumns: GanttColumn[] = [];\r\n protected layout = { rootMaxHeight: 0, bodyHeight: 0, scrollHeight: 0, resizerHeight: 0 };\r\n protected readonly scales: GanttScale[] = ['1m', '10m', '30m', 'hour', '6 hours', '12 hours', 'day', 'week', 'month', 'year'];\r\n protected readonly scalesDate: GanttScale[] = ['1m', '10m', '30m', 'hour', 'day', 'week', 'month', 'year'];\r\n protected readonly negativeSlotWidth = 50;\r\n protected hasNegativeDependencySpace = false;\r\n\r\n constructor() { }\r\n \r\n // recompute all sizes\r\n protected recomputeLayout(): void {\r\n this.layout.rootMaxHeight = this.ganttHeight - this.headerHeight + this.rowHeight - 3;\r\n this.layout.bodyHeight = this.ganttHeight - this.rowHeight / 3;\r\n this.layout.scrollHeight = this.ganttHeight - this.rowHeight;\r\n this.layout.resizerHeight = this.ganttHeight + this.headerHeight - this.rowHeight;\r\n }\r\n\r\n protected get columns(): GanttColumn[] {\r\n return [\r\n ...this.coreColumns,\r\n ...this.extraColumns\r\n ];\r\n }\r\n\r\n // minimum columns to show gantt\r\n protected readonly coreColumns: GanttColumn[] = [\r\n {\r\n id: 'label',\r\n title: 'Name',\r\n valueGetter: t => t.label,\r\n showInGrid: true,\r\n showInTooltip: true\r\n },\r\n {\r\n id: 'start',\r\n title: 'Start',\r\n valueGetter: t => this.getDateString(t.start),\r\n showInGrid: true,\r\n showInTooltip: true,\r\n hidden: () => this.dataType !== 'calendar'\r\n },\r\n {\r\n id: 'end',\r\n title: 'End',\r\n valueGetter: t => this.getDateString(t.end),\r\n showInGrid: true,\r\n showInTooltip: true,\r\n hidden: () => this.dataType !== 'calendar'\r\n },\r\n {\r\n id: 'duration',\r\n title: 'Duration',\r\n valueGetter: t => this.getDuration(t),\r\n showInGrid: true,\r\n showInTooltip: true,\r\n hidden: () => this.dataType !== 'duration'\r\n }\r\n ];\r\n\r\n protected ganttWidthCalcul(): void {\r\n this.ganttWidth = this.slots.length * this.scaleSelected.px;\r\n }\r\n\r\n protected ganttHeightCalcul(): void {\r\n const max = Math.max(...this.tasks.map((t) => t.row));\r\n this.ganttHeight = (max + 2) * this.rowHeight;\r\n }\r\n\r\n protected refreshVisibleColumns(): void {\r\n this.visibleGridColumns = this.columns.filter(c =>\r\n c.showInGrid &&\r\n (!c.hidden || !c.hidden())\r\n );\r\n\r\n this.visibleTooltipColumns = this.columns.filter(c =>\r\n c.showInTooltip &&\r\n (!c.hidden || !c.hidden())\r\n );\r\n }\r\n\r\n protected getRawTaskX(task: GanttTask): number {\r\n return (task.startSlot ?? 0) * this.scaleSelected.px;\r\n }\r\n\r\n protected getDateString(date: Date | number | undefined | null): string {\r\n if (!date) return '';\r\n if (this.dateMode === 'utc') {\r\n return (date as Date)\r\n .toLocaleString([], {\r\n timeZone: 'UTC',\r\n day: '2-digit',\r\n month: '2-digit',\r\n year: 'numeric',\r\n hour: '2-digit',\r\n minute: '2-digit',\r\n hour12: false,\r\n })\r\n .replace(',', '');\r\n }\r\n\r\n return (date as Date)\r\n .toLocaleString([], {\r\n day: '2-digit',\r\n month: '2-digit',\r\n year: 'numeric',\r\n hour: '2-digit',\r\n minute: '2-digit',\r\n hour12: false,\r\n })\r\n .replace(',', '');\r\n }\r\n\r\n protected getDuration(task: GanttTask | undefined | null): string {\r\n if (!task) return '';\r\n\r\n if (typeof task.start !== 'number' || typeof task.end !== 'number') {\r\n throw new Error(`Task ${task.id} is not in duration mode`);\r\n }\r\n\r\n let total = task.end - task.start;\r\n const days = Math.floor(total / 86400);\r\n total %= 86400;\r\n const hours = Math.floor(total / 3600);\r\n total %= 3600;\r\n const minutes = Math.floor(total / 60);\r\n const seconds = total % 60;\r\n let result = '';\r\n\r\n if (days > 0) result += `${days}d `;\r\n if (hours > 0 || days > 0) result += `${hours}h `;\r\n if (minutes > 0 || hours > 0 || days > 0) result += `${minutes}m `;\r\n\r\n result += `${seconds}s`;\r\n return result.trim();\r\n }\r\n\r\n protected getTaskWidth(task: GanttTask): number {\r\n return ((task.endSlot ?? 0) - (task.startSlot ?? 0)) * this.scaleSelected.px;\r\n }\r\n\r\n protected getGridTop(i: number): number {\r\n return i * this.rowHeight;\r\n }\r\n\r\n protected getTaskX(task: GanttTask): number {\r\n const base = (task.startSlot ?? 0) * this.scaleSelected.px;\r\n return this.hasNegativeDependencySpace ? this.negativeSlotWidth + base : base;\r\n }\r\n\r\n protected getTaskY(task: GanttTask): number {\r\n return task.row * this.rowHeight + this.rowHeight / 10;\r\n }\r\n\r\n public trackByIndex(index: number): number {\r\n return index;\r\n }\r\n\r\n // get per arrow the path\r\n protected getDependencyPath(fromId: string, toId: string): string {\r\n const from = this.tasks.find((t) => t.id === fromId);\r\n const to = this.tasks.find((t) => t.id === toId);\r\n if (!from || !to) return '';\r\n const fromRight = this.getTaskX(from) + this.getTaskWidth(from);\r\n const toLeft = this.getTaskX(to);\r\n const fromY = this.getTaskY(from) + this.rowHeight / 2 - this.rowHeight / 12;\r\n const toY = this.getTaskY(to) + this.rowHeight / 2 - this.rowHeight / 12;\r\n\r\n if (from.row === to.row) {\r\n return `\r\n M ${fromRight} ${fromY}\r\n H ${fromRight + 20}\r\n V ${toY}\r\n H ${toLeft}`;\r\n }\r\n\r\n // consistent U-turn style (even if not strictly needed)\r\n const escapeY = toY - this.rowHeight * 0.54;\r\n const midX1 = fromRight + 25;\r\n const midX2 = toLeft - 25;\r\n return `\r\n M ${fromRight} ${fromY}\r\n H ${midX1}\r\n V ${escapeY}\r\n H ${midX2}\r\n V ${toY}\r\n H ${toLeft}`;\r\n }\r\n\r\n // size of columns per minutes\r\n protected getScaleConfig(scale: any): ScaleConfig {\r\n switch (scale) {\r\n case '1m':\r\n return { secondes: 60, px: 120 };\r\n case '10m':\r\n return { secondes: 600, px: 120 };\r\n case '30m':\r\n return { secondes: 1800, px: 120 };\r\n case 'hour':\r\n return { secondes: 3600, px: 120 };\r\n case '6 hours':\r\n return { secondes: 21600, px: 120 };\r\n case '12 hours':\r\n return { secondes: 43200, px: 120 };\r\n case 'day':\r\n return { secondes: 86400, px: 150 };\r\n case 'week':\r\n return { secondes: 604800, px: 200 };\r\n case 'month':\r\n return { secondes: 2592000, px: 350 };\r\n case 'year':\r\n return { secondes: 31536000, px: 500 };\r\n default:\r\n return { secondes: 1800, px: 120 };\r\n }\r\n }\r\n\r\n protected alignOriginByScale(date: Date, defaultScale: GanttScale): Date {\r\n const d = new Date(date);\r\n switch (defaultScale) {\r\n case 'week': {\r\n // align monday\r\n const d = new Date(date);\r\n const day = d.getDay(); // 0 = Sunday, 1 = Monday, ...\r\n const diff = day === 0 ? -6 : 1 - day; // move back to Monday\r\n d.setDate(d.getDate() + diff);\r\n d.setHours(0, 0, 0, 0);\r\n return d\r\n }\r\n case 'month': {\r\n d.setDate(1);\r\n d.setHours(0, 0, 0, 0);\r\n return d;\r\n }\r\n case 'year': {\r\n d.setMonth(0, 1); // Jan 1\r\n d.setHours(0, 0, 0, 0);\r\n return d;\r\n }\r\n case 'day': {\r\n // shift back by 1 day (buffer slot)\r\n d.setDate(d.getDate() - 1);\r\n d.setHours(0, 0, 0, 0);\r\n return d;\r\n }\r\n case 'hour': {\r\n // shift back by 1 hour\r\n d.setHours(d.getHours() - 1);\r\n d.setMinutes(0, 0, 0);\r\n return d;\r\n }\r\n case '6 hours': {\r\n d.setHours(d.getHours() - 6);\r\n d.setMinutes(0, 0, 0);\r\n return d;\r\n }\r\n case '12 hours': {\r\n d.setHours(d.getHours() - 12);\r\n d.setMinutes(0, 0, 0);\r\n return d;\r\n }\r\n case '30m': {\r\n d.setMinutes(d.getMinutes() - 30);\r\n d.setSeconds(0, 0);\r\n return d;\r\n }\r\n case '10m': {\r\n d.setMinutes(d.getMinutes() - 10);\r\n d.setSeconds(0, 0);\r\n return d;\r\n }\r\n case '1m': {\r\n d.setMinutes(d.getMinutes() - 1);\r\n d.setSeconds(0, 0);\r\n return d;\r\n }\r\n default:\r\n return d;\r\n }\r\n }\r\n}\r\n","import { Component, ElementRef, ViewChild, Input, ChangeDetectorRef, ChangeDetectionStrategy } from '@angular/core';\r\nimport { DependencyPath, GanttScale, GanttTask, GanttTaskView } from './gantt-lite.model';\r\nimport { SlotIndexToDateLabelConverter } from './gantt-lite.helper';\r\nimport { GanttLiteBase } from './gantt-lite-base';\r\n\r\n@Component({\r\n selector: 'gantt-lite',\r\n templateUrl: './gantt-lite.component.html',\r\n styleUrls: ['./gantt-lite.component.scss'],\r\n standalone: false,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class GanttLiteComponent extends GanttLiteBase {\r\n @Input()\r\n public set rawTasks(value: GanttTask[]) {\r\n this._rawTasks = value ?? [];\r\n this.recalculteAll();\r\n }\r\n public get rawTasks(): GanttTask[] {\r\n return this._rawTasks;\r\n }\r\n @ViewChild('ganttBodyScroll') private ganttBodyScroll!: ElementRef<HTMLDivElement>;\r\n @ViewChild('ganttContent') private ganttContent!: ElementRef<HTMLDivElement>;\r\n @ViewChild('ganttScroll') private ganttScroll!: ElementRef<HTMLDivElement>;\r\n @ViewChild('leftPanel') private leftPanel!: ElementRef<HTMLButtonElement>;\r\n @ViewChild('timelineHeader') private timelineHeader!: ElementRef<HTMLDivElement>;\r\n @ViewChild('leftBtn') private leftBtn!: ElementRef<HTMLButtonElement>;\r\n @ViewChild('rightBtn') private rightBtn!: ElementRef<HTMLButtonElement>;\r\n public toolbarHeight: number = 27;\r\n public hoveredDependencyIds = new Set<string>();\r\n public selectedTaskId: string | null = null;\r\n public tooltipTask: GanttTask | null = null;\r\n public tooltipX = 0;\r\n public tooltipY = 0;\r\n public maxSlotsAlert: boolean = false;\r\n public loading: boolean = false;\r\n public showLeftBtn = false;\r\n public showRightBtn = true;\r\n public buttonsHeight: number = 20;\r\n public viewTasks: GanttTaskView[] = [];\r\n private _rawTasks: GanttTask[] = [];\r\n private originDate: number = 0;\r\n private resizing = false;\r\n private scrollInterval: any;\r\n private labelConverter: SlotIndexToDateLabelConverter | null = null;\r\n\r\n constructor(private cdr: ChangeDetectorRef) { super(); }\r\n\r\n // recalculate all Gantt\r\n private recalculteAll(): void {\r\n this.loading = true;\r\n this.cdr.markForCheck();\r\n setTimeout(() => {\r\n const start = performance.now();\r\n this.refreshVisibleColumns();\r\n this.scaleSelected = this.getScaleConfig(this.defaultScale);\r\n\r\n if (this.dataType !== 'duration') {\r\n const base = new Date(Math.min(...this.rawTasks.map((t) => (t.start as Date).getTime())));\r\n this.originDate = this.alignOriginByScale(base, this.defaultScale).getTime();\r\n this.labelConverter = new SlotIndexToDateLabelConverter(\r\n this.dateMode,\r\n this.originDate,\r\n this.scaleSelected.secondes,\r\n this.hasNegativeDependencySpace\r\n );\r\n this.buildTaskSlotsFromDates();\r\n } else {\r\n this.labelConverter = new SlotIndexToDateLabelConverter(\r\n this.dateMode,\r\n this.originDate,\r\n this.scaleSelected.secondes,\r\n this.hasNegativeDependencySpace\r\n );\r\n this.buildTaskSlotsFromDuration();\r\n }\r\n this.detectNegativeDependencySpace();\r\n this.calculateTimelineSlots();\r\n this.getAllDependencyPaths();\r\n this.ganttHeightCalcul();\r\n this.ganttWidthCalcul();\r\n this.recomputeLayout();\r\n this.ganttScroll.nativeElement.style.height = this.layout.scrollHeight + 'px';\r\n this.ganttBodyScroll.nativeElement.style.height = this.layout.bodyHeight + 'px';\r\n this.timelineHeader.nativeElement.style.height = this.headerHeight + 'px';\r\n this.ganttContent.nativeElement.style.height = this.ganttHeight - this.rowHeight + 'px';\r\n this.ganttContent.nativeElement.style.width = this.ganttWidth + 'px';\r\n this.leftPanel.nativeElement.style.width = this.leftPanelWidth + 'px';\r\n\r\n this.buildViewTasks();\r\n setTimeout(() => {\r\n this.recenterSelectedTask();\r\n }, 0);\r\n this.loading = false;\r\n this.cdr.markForCheck();\r\n requestAnimationFrame(() => {\r\n const end = performance.now();\r\n console.log('frame time including render:', end - start, 'ms');\r\n });\r\n }, 0);\r\n }\r\n \r\n\r\n private buildViewTasks(): void {\r\n const h = this.rowHeight / 1.25;\r\n\r\n this.viewTasks = this.tasks.map((t): GanttTaskView => {\r\n return {\r\n ...t,\r\n x: this.getTaskX(t),\r\n y: this.getTaskY(t),\r\n width: this.getTaskWidth(t),\r\n height: h,\r\n };\r\n });\r\n }\r\n\r\n // click on button 10m, hour, months\r\n public setScale(scale: GanttScale): void {\r\n this.defaultScale = scale;\r\n this.recalculteAll();\r\n }\r\n\r\n\r\n // if task was selected scroll back to it\r\n private recenterSelectedTask(): void {\r\n if (!this.selectedTaskId) {\r\n if (!this.ganttScroll) return;\r\n this.ganttScroll.nativeElement.scrollLeft = 0;\r\n\r\n // force header sync\r\n if (this.timelineHeader?.nativeElement) {\r\n this.timelineHeader.nativeElement.scrollLeft = 0;\r\n }\r\n this.onScrolled();\r\n }\r\n\r\n const task = this.tasks.find((t) => t.id === this.selectedTaskId);\r\n if (!task || !this.ganttScroll) return;\r\n\r\n // scroll X\r\n const viewportWidth = this.ganttScroll.nativeElement.clientWidth;\r\n const targetScrollLeft = this.getTaskX(task) - viewportWidth / 2;\r\n this.ganttScroll.nativeElement.scrollTo({ left: Math.max(targetScrollLeft, 0), behavior: 'auto' });\r\n\r\n // scroll Y\r\n const viewportHeight = this.ganttBodyScroll.nativeElement.clientHeight;\r\n const targetTop = task.row * this.rowHeight;\r\n const scrollTop = targetTop - viewportHeight / 2 + this.rowHeight / 2;\r\n this.ganttBodyScroll.nativeElement.scrollTo({ top: Math.max(scrollTop, 0), behavior: 'auto' });\r\n\r\n this.onScrolled();\r\n }\r\n\r\n // detect if there is a need to add the N/A slot in order to be able to show dependency arrow before 0.\r\n private detectNegativeDependencySpace(): void {\r\n const originTasks = this.tasks.filter((t) => (t.startSlot ?? 0) === 0);\r\n\r\n this.hasNegativeDependencySpace = originTasks.some((task) => {\r\n const fromRight = this.getRawTaskX(task) + this.getTaskWidth(task);\r\n return (task.dependencies ?? []).some((depId: any) => {\r\n const target = this.tasks.find((t) => t.id === depId);\r\n if (!target) return false;\r\n\r\n const toLeft = this.getRawTaskX(target);\r\n // true if dependency goes \"backwards\"\r\n return toLeft < fromRight;\r\n });\r\n });\r\n }\r\n\r\n // scroll buttons left/right => click small go, stay clicked scroll a lot\r\n public startScroll(direction: 'left' | 'right'): void {\r\n // instant first move \r\n this.scrollInterval = setInterval(() => {\r\n this.ganttScroll.nativeElement.scrollLeft += direction === 'left' ? -100 : 100;\r\n this.onScrolled();\r\n }, 50);\r\n }\r\n\r\n // update buttons left/right after a scroll.\r\n private onScrolled(): void {\r\n const el = this.ganttScroll.nativeElement;\r\n const maxScrollLeft = el.scrollWidth - el.clientWidth;\r\n // left button\r\n this.showLeftBtn = el.scrollLeft > 0;\r\n if (this.leftBtn?.nativeElement) {\r\n if (this.showLeftBtn) {\r\n this.leftBtn.nativeElement.style.display = 'block';\r\n this.leftBtn.nativeElement.style.left = this.leftPanel.nativeElement.style.width;\r\n } else {\r\n this.leftBtn.nativeElement.style.display = 'none';\r\n this.leftBtn.nativeElement.style.left = this.leftPanel.nativeElement.style.width;\r\n }\r\n }\r\n // right button\r\n this.showRightBtn = el.scrollLeft < maxScrollLeft - 1 || el.scrollLeft === 0; // small tolerance\r\n if (this.rightBtn?.nativeElement) {\r\n if (this.showRightBtn) {\r\n this.rightBtn.nativeElement.style.display = 'block';\r\n } else {\r\n this.rightBtn.nativeElement.style.display = 'none';\r\n }\r\n }\r\n if (!this.showLeftBtn || !this.showRightBtn) {\r\n this.stopScroll();\r\n }\r\n }\r\n\r\n public stopScroll(): void{\r\n clearInterval(this.scrollInterval);\r\n }\r\n\r\n // to sync header and grid\r\n public onHorizontalScroll(event: Event): void {\r\n this.timelineHeader.nativeElement.scrollLeft = (event.target as HTMLElement).scrollLeft;\r\n }\r\n\r\n // highlight dependencies (arrows)\r\n private updateHoveredDependencies(task: GanttTask | null): void {\r\n this.hoveredDependencyIds.clear();\r\n if (!task) {\r\n return;\r\n }\r\n\r\n // outgoing dependencies\r\n for (const dep of task.dependencies ?? []) {\r\n this.hoveredDependencyIds.add(`${dep}->${task.id}`);\r\n }\r\n\r\n // incoming dependencies\r\n for (const t of this.tasks) {\r\n if ((t.dependencies ?? []).includes(task.id)) {\r\n this.hoveredDependencyIds.add(`${task.id}->${t.id}`);\r\n }\r\n }\r\n }\r\n\r\n // select task left and right panel\r\n public selectTask(task: GanttTask, scroll: boolean): void {\r\n if (this.selectedTaskId === task.id) {\r\n this.selectedTaskId = null;\r\n this.hoveredDependencyIds.clear();\r\n this.hideTooltip();\r\n this.onScrolled();\r\n return;\r\n }\r\n\r\n this.selectedTaskId = task.id;\r\n this.updateHoveredDependencies(task);\r\n this.onScrolled();\r\n if (!scroll || !this.ganttScroll) return;\r\n\r\n const container = this.ganttScroll.nativeElement as HTMLElement;\r\n const viewportWidth = container.clientWidth;\r\n const targetScrollLeft = this.getTaskX(task) - viewportWidth / 2;\r\n\r\n container.scrollTo({\r\n left: Math.max(targetScrollLeft, 0),\r\n behavior: 'smooth',\r\n });\r\n this.onScrolled();\r\n }\r\n\r\n // resize between panel left and right\r\n public startResize(event: MouseEvent): void {\r\n event.preventDefault();\r\n this.resizing = true;\r\n const containerRect = this.ganttBodyScroll.nativeElement.getBoundingClientRect();\r\n const left = containerRect.left;\r\n const min = 50;\r\n const max = containerRect.width - 75;\r\n const moveHandler = (e: MouseEvent): void => {\r\n if (!this.resizing) return;\r\n const x = e.clientX - left;\r\n const width = x < min ? min : x > max ? max : x;\r\n\r\n // direct DOM update (no Angular)\r\n this.leftPanel.nativeElement.style.width = width + 'px';\r\n if (this.leftBtn?.nativeElement) {\r\n this.leftBtn.nativeElement.style.left = `${width}px`;\r\n }\r\n };\r\n\r\n const upHandler = (): void => {\r\n this.resizing = false;\r\n window.removeEventListener('mousemove', moveHandler);\r\n window.removeEventListener('mouseup', upHandler);\r\n };\r\n\r\n window.addEventListener('mousemove', moveHandler);\r\n window.addEventListener('mouseup', upHandler);\r\n }\r\n\r\n public showTooltip(event: MouseEvent, task: GanttTask): void {\r\n this.tooltipTask = task;\r\n const tooltip = document.querySelector('.global-tooltip') as HTMLElement;\r\n if (!tooltip) return;\r\n tooltip.style.left = `${event.clientX + 10}px`;\r\n tooltip.style.top = `${event.clientY - 50}px`;\r\n tooltip.style.display = 'block';\r\n }\r\n\r\n public hideTooltip(): void {\r\n this.tooltipTask = null;\r\n const tooltip = document.querySelector('.global-tooltip') as HTMLElement;\r\n if (!tooltip) return;\r\n tooltip.style.display = 'none';\r\n }\r\n\r\n private buildTaskSlotsFromDates(): void {\r\n const slotMs = this.scaleSelected.secondes * 1000;\r\n this.tasks = this.rawTasks.map((t) => {\r\n if (!(t.start instanceof Date) || !(t.end instanceof Date)) {\r\n throw new Error(`Task \"${t.id}\" must have Date start/end values.`);\r\n }\r\n\r\n const startSlot = ((t.start as Date).getTime() - this.originDate) / slotMs;\r\n const endSlot = ((t.end as Date).getTime() - this.originDate) / slotMs;\r\n return { ...t, startSlot, endSlot };\r\n });\r\n }\r\n\r\n private buildTaskSlotsFromDuration(): void {\r\n this.tasks = this.rawTasks.map((t) => {\r\n if (typeof t.start !== 'number' || typeof t.end !== 'number') {\r\n throw new Error(`Task \"${t.id}\" must have numeric start/end values expressed in minutes.`);\r\n }\r\n\r\n const startSlot = t.start / this.scaleSelected.secondes;\r\n const endSlot = t.end / this.scaleSelected.secondes;\r\n return { ...t, startSlot, endSlot };\r\n });\r\n }\r\n\r\n // get all slots (timeline)\r\n private calculateTimelineSlots(): void {\r\n const maxSlot = Math.max(...this.tasks.map(t => t.endSlot ?? 0));\r\n if (maxSlot > 53000) {\r\n this.maxSlotsAlert = true;\r\n this.slots = [];\r\n return;\r\n }\r\n this.maxSlotsAlert = false;\r\n const buffer = [];\r\n let offsetX = 0;\r\n\r\n if (this.hasNegativeDependencySpace) {\r\n buffer.push({\r\n index: -1,\r\n x: 0,\r\n width: this.negativeSlotWidth,\r\n label: 'N/A'\r\n });\r\n offsetX = this.negativeSlotWidth;\r\n }\r\n\r\n for (let i = 0; i <= maxSlot + 2; i++) {\r\n buffer.push({\r\n index: i,\r\n x: offsetX + i * this.scaleSelected.px,\r\n width: this.scaleSelected.px,\r\n label: this.getSlotLabel(i) ?? 'Error',\r\n });\r\n }\r\n\r\n this.slots = buffer;\r\n }\r\n\r\n // get all paths of arrows\r\n protected getAllDependencyPaths(): void {\r\n this.dependencyPaths = this.tasks.flatMap((task): DependencyPath[] =>\r\n (task.dependencies ?? []).map(\r\n (dep: any): DependencyPath => ({\r\n from: dep,\r\n to: task.id,\r\n id: `${dep}->${task.id}`,\r\n path: this.getDependencyPath(dep, task.id),\r\n })\r\n )\r\n );\r\n }\r\n\r\n // get label for date header\r\n private getSlotLabel(index: number): string {\r\n if (this.dataType === 'calendar') {\r\n return this.labelConverter?.getLabelCalendar(index, this.defaultScale) ?? 'Error';\r\n }\r\n return this.labelConverter?.getLabelDuration(index, this.defaultScale) ?? 'Error';\r\n }\r\n}\r\n","<div class=\"gantt-root\" [style.max-height.px]=\"layout.rootMaxHeight\" [style.min-height.px]=\"100\">\n <!-- TOOLBAR -->\n <div class=\"toolbar\" [style.height.px]=\"buttonsHeight\">\n <div *ngIf=\"dateMode === 'utc' || dataType === 'duration'\">\n <button class=\"gantt-button\" *ngFor=\"let s of scales\" (click)=\"setScale(s)\" [class.active]=\"defaultScale === s\">\n {{ s }}\n </button>\n </div>\n <div *ngIf=\"dateMode !== 'utc' && dataType === 'calendar'\">\n <button class=\"gantt-button\" *ngFor=\"let s of scalesDate\" (click)=\"setScale(s)\"\n [class.active]=\"defaultScale === s\">\n {{ s }}\n </button>\n </div>\n <label *ngIf=\"maxSlotsAlert\" style=\"color: red;\">\n Data is too massive to show Gantt smoothly, try changing the scale\n </label>\n </div>\n <!-- TOOLTIP -->\n <div class=\"global-tooltip\" [style.display]=\"tooltipTask ? 'block' : 'none'\">\n <ng-container *ngIf=\"tooltipTask as task\">\n <div *ngFor=\"let column of visibleTooltipColumns\">\n <strong>{{ column?.title }}:</strong>\n {{ column?.valueGetter(task) }}\n </div>\n </ng-container>\n </div>\n <!-- BUTTONS FOR SCROLL GANTT -->\n <div *ngIf=\"!maxSlotsAlert && loading === false\" class=\"floating-nav\">\n <button class=\"nav-btn left\" (mousedown)=\"startScroll('left')\"\n (mouseup)=\"stopScroll()\" (mouseleave)=\"stopScroll()\" #leftBtn >\n ‹\n </button>\n <button class=\"nav-btn right\" (mousedown)=\"startScroll('right')\"\n (mouseup)=\"stopScroll()\" (mouseleave)=\"stopScroll()\" #rightBtn>\n ›\n </button>\n </div>\n <!-- LOADING -->\n <div class=\"loading-overlay\" *ngIf=\"loading\" [style.top]=\"'50%'\">\n <div class=\"spinner\"></div>\n </div>\n <!-- SINGLE VERTICAL SCROLL -->\n <div class=\"gantt-body\" #ganttBodyScroll>\n <!-- LEFT PANEL -->\n <div class=\"left-panel\" #leftPanel>\n <div class=\"task-row header\" [style.height.px]=\"headerHeight\">\n <div class=\"cell\" *ngFor=\"let column of visibleGridColumns\" [style.width.px]=\"column.width || 120\">\n {{ column?.title }}\n </div>\n </div>\n <div class=\"task-row\" *ngFor=\"let task of tasks\" [style.height.px]=\"rowHeight\"\n (click)=\"selectTask(task, true); $event.stopPropagation()\"\n [class.highlighted-row]=\"selectedTaskId === task.id\">\n <div class=\"cell\" *ngFor=\"let column of visibleGridColumns\" [style.width.px]=\"column.width || 120\">\n {{ column?.valueGetter(task) }}\n </div>\n </div>\n </div>\n <!-- RESIZER -->\n <div class=\"resizer\" [style.height.px]=\"layout.resizerHeight\" (mousedown)=\"startResize($event)\">\n </div>\n <!-- RIGHT PANEL -->\n <div class=\"right-panel\" *ngIf=\"!maxSlotsAlert\">\n <!-- TIMELINE -->\n <div class=\"timeline-header\" #timelineHeader>\n <div class=\"timeline-slot\" *ngFor=\"let slot of slots\" [style.width.px]=\"slot.width\">\n {{ slot.label }}\n </div>\n </div>\n <!-- HORIZONTAL SCROLL ONLY -->\n <div class=\"horizontal-scroll\" (scroll)=\"onHorizontalScroll($event)\" #ganttScroll>\n <div class=\"gantt-content\" #ganttContent>\n <!-- GRID -->\n <div class=\"grid-layer\">\n <div *ngFor=\"let slot of slots; let i = index; trackBy: trackByIndex\" class=\"grid-line\"\n [style.left.px]=\"slot.x - 1\">\n </div>\n <!-- final vertical line -->\n <div class=\"grid-line\" [style.left.px]=\"ganttWidth - 1\">\n </div>\n <!-- horizontal lines -->\n <div class=\"horizontal-grid-layer\">\n <div *ngFor=\"let task of tasks; let i = index; trackBy: trackByIndex\"\n class=\"horizontal-line\" [style.top.px]=\"getGridTop(i)\">\n </div>\n <!-- final horizontal line -->\n <div class=\"horizontal-line\" [style.top.px]=\"ganttHeight\">\n </div>\n </div>\n </div>\n <!-- TASKS -->\n <div class=\"tasks-layer\">\n <div *ngFor=\"let task of viewTasks; let i = index; trackBy: trackByIndex\" class=\"task\"\n (mouseenter)=\"showTooltip($event, task)\" (mouseleave)=\"hideTooltip()\"\n (click)=\"selectTask(task, false); $event.stopPropagation()\"\n [class.highlighted-task]=\"selectedTaskId === task.id\" [style.left.px]=\"task.x\"\n [style.top.px]=\"task.y\" [style.width.px]=\"task.width\" [style.height.px]=\"task.height\">\n <div class=\"task-label\">\n {{ task.label }}\n </div>\n </div>\n </div>\n <!-- DEPENDENCIES -->\n <svg class=\"dependencies-svg\">\n <defs>\n <marker id=\"arrow\" viewBox=\"0 0 10 10\" refX=\"9\" refY=\"5\" markerWidth=\"6\" markerHeight=\"6\"\n orient=\"auto\">\n <path d=\"M 0 0 L 10 5 L 0 10 z\" fill=\"#868d97\" />\n </marker>\n </defs>\n <g class=\"dependencies-normal\">\n <path *ngFor=\"let dep of dependencyPaths\" [attr.d]=\"dep.path\" class=\"dependency\"\n [class.hidden]=\"hoveredDependencyIds.has(dep.id)\" marker-end=\"url(#arrow)\">\n </path>\n </g>\n <g class=\"dependencies-highlighted\">\n <path *ngFor=\"let dep of dependencyPaths\" [attr.d]=\"dep.path\" class=\"highlighted-dependency\"\n [class.hidden]=\"!hoveredDependencyIds.has(dep.id)\" marker-end=\"url(#arrow)\">\n </path>\n </g>\n </svg>\n </div>\n </div>\n </div>\n <div class=\"right-panel-dead\" *ngIf=\"maxSlotsAlert\"></div>\n </div>\n</div>","import { NgModule } from \"@angular/core\";\r\nimport { GanttLiteComponent } from \"./lib/gantt-lite.component\";\r\nimport { CommonModule } from \"@angular/common\";\r\n\r\n@NgModule({\r\n declarations: [GanttLiteComponent],\r\n imports: [CommonModule],\r\n exports: [GanttLiteComponent]\r\n})\r\nexport class GanttLiteModule {}","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import * as i0 from "@angular/core";
|
|
2
|
+
import * as i1 from "./lib/gantt-lite.component";
|
|
3
|
+
import * as i2 from "@angular/common";
|
|
4
|
+
export declare class GanttLiteModule {
|
|
5
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<GanttLiteModule, never>;
|
|
6
|
+
static ɵmod: i0.ɵɵNgModuleDeclaration<GanttLiteModule, [typeof i1.GanttLiteComponent], [typeof i2.CommonModule], [typeof i1.GanttLiteComponent]>;
|
|
7
|
+
static ɵinj: i0.ɵɵInjectorDeclaration<GanttLiteModule>;
|
|
8
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { DataType, DateMode, DependencyPath, GanttColumn, GanttScale, GanttTask, ScaleConfig } from './gantt-lite.model';
|
|
2
|
+
import { TimelineSlot } from './gantt-lite.model';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
export declare abstract class GanttLiteBase {
|
|
5
|
+
rowHeight: number;
|
|
6
|
+
defaultScale: GanttScale;
|
|
7
|
+
dataType: DataType;
|
|
8
|
+
dateMode: DateMode;
|
|
9
|
+
extraColumns: GanttColumn[];
|
|
10
|
+
protected slots: TimelineSlot[];
|
|
11
|
+
protected tasks: GanttTask[];
|
|
12
|
+
dependencyPaths: DependencyPath[];
|
|
13
|
+
protected scaleSelected: ScaleConfig;
|
|
14
|
+
protected headerHeight: number;
|
|
15
|
+
protected ganttHeight: number;
|
|
16
|
+
protected ganttWidth: number;
|
|
17
|
+
protected leftPanelWidth: number;
|
|
18
|
+
protected visibleGridColumns: GanttColumn[];
|
|
19
|
+
protected visibleTooltipColumns: GanttColumn[];
|
|
20
|
+
protected layout: {
|
|
21
|
+
rootMaxHeight: number;
|
|
22
|
+
bodyHeight: number;
|
|
23
|
+
scrollHeight: number;
|
|
24
|
+
resizerHeight: number;
|
|
25
|
+
};
|
|
26
|
+
protected readonly scales: GanttScale[];
|
|
27
|
+
protected readonly scalesDate: GanttScale[];
|
|
28
|
+
protected readonly negativeSlotWidth = 50;
|
|
29
|
+
protected hasNegativeDependencySpace: boolean;
|
|
30
|
+
constructor();
|
|
31
|
+
protected recomputeLayout(): void;
|
|
32
|
+
protected get columns(): GanttColumn[];
|
|
33
|
+
protected readonly coreColumns: GanttColumn[];
|
|
34
|
+
protected ganttWidthCalcul(): void;
|
|
35
|
+
protected ganttHeightCalcul(): void;
|
|
36
|
+
protected refreshVisibleColumns(): void;
|
|
37
|
+
protected getRawTaskX(task: GanttTask): number;
|
|
38
|
+
protected getDateString(date: Date | number | undefined | null): string;
|
|
39
|
+
protected getDuration(task: GanttTask | undefined | null): string;
|
|
40
|
+
protected getTaskWidth(task: GanttTask): number;
|
|
41
|
+
protected getGridTop(i: number): number;
|
|
42
|
+
protected getTaskX(task: GanttTask): number;
|
|
43
|
+
protected getTaskY(task: GanttTask): number;
|
|
44
|
+
trackByIndex(index: number): number;
|
|
45
|
+
protected getDependencyPath(fromId: string, toId: string): string;
|
|
46
|
+
protected getScaleConfig(scale: any): ScaleConfig;
|
|
47
|
+
protected alignOriginByScale(date: Date, defaultScale: GanttScale): Date;
|
|
48
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<GanttLiteBase, never>;
|
|
49
|
+
static ɵdir: i0.ɵɵDirectiveDeclaration<GanttLiteBase, never, never, { "rowHeight": { "alias": "rowHeight"; "required": false; }; "defaultScale": { "alias": "defaultScale"; "required": false; }; "dataType": { "alias": "dataType"; "required": false; }; "dateMode": { "alias": "dateMode"; "required": false; }; "extraColumns": { "alias": "extraColumns"; "required": false; }; }, {}, never, never, false, never>;
|
|
50
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { ChangeDetectorRef } from '@angular/core';
|
|
2
|
+
import { GanttScale, GanttTask, GanttTaskView } from './gantt-lite.model';
|
|
3
|
+
import { GanttLiteBase } from './gantt-lite-base';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
export declare class GanttLiteComponent extends GanttLiteBase {
|
|
6
|
+
private cdr;
|
|
7
|
+
set rawTasks(value: GanttTask[]);
|
|
8
|
+
get rawTasks(): GanttTask[];
|
|
9
|
+
private ganttBodyScroll;
|
|
10
|
+
private ganttContent;
|
|
11
|
+
private ganttScroll;
|
|
12
|
+
private leftPanel;
|
|
13
|
+
private timelineHeader;
|
|
14
|
+
private leftBtn;
|
|
15
|
+
private rightBtn;
|
|
16
|
+
toolbarHeight: number;
|
|
17
|
+
hoveredDependencyIds: Set<string>;
|
|
18
|
+
selectedTaskId: string | null;
|
|
19
|
+
tooltipTask: GanttTask | null;
|
|
20
|
+
tooltipX: number;
|
|
21
|
+
tooltipY: number;
|
|
22
|
+
maxSlotsAlert: boolean;
|
|
23
|
+
loading: boolean;
|
|
24
|
+
showLeftBtn: boolean;
|
|
25
|
+
showRightBtn: boolean;
|
|
26
|
+
buttonsHeight: number;
|
|
27
|
+
viewTasks: GanttTaskView[];
|
|
28
|
+
private _rawTasks;
|
|
29
|
+
private originDate;
|
|
30
|
+
private resizing;
|
|
31
|
+
private scrollInterval;
|
|
32
|
+
private labelConverter;
|
|
33
|
+
constructor(cdr: ChangeDetectorRef);
|
|
34
|
+
private recalculteAll;
|
|
35
|
+
private buildViewTasks;
|
|
36
|
+
setScale(scale: GanttScale): void;
|
|
37
|
+
private recenterSelectedTask;
|
|
38
|
+
private detectNegativeDependencySpace;
|
|
39
|
+
startScroll(direction: 'left' | 'right'): void;
|
|
40
|
+
private onScrolled;
|
|
41
|
+
stopScroll(): void;
|
|
42
|
+
onHorizontalScroll(event: Event): void;
|
|
43
|
+
private updateHoveredDependencies;
|
|
44
|
+
selectTask(task: GanttTask, scroll: boolean): void;
|
|
45
|
+
startResize(event: MouseEvent): void;
|
|
46
|
+
showTooltip(event: MouseEvent, task: GanttTask): void;
|
|
47
|
+
hideTooltip(): void;
|
|
48
|
+
private buildTaskSlotsFromDates;
|
|
49
|
+
private buildTaskSlotsFromDuration;
|
|
50
|
+
private calculateTimelineSlots;
|
|
51
|
+
protected getAllDependencyPaths(): void;
|
|
52
|
+
private getSlotLabel;
|
|
53
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<GanttLiteComponent, never>;
|
|
54
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<GanttLiteComponent, "gantt-lite", never, { "rawTasks": { "alias": "rawTasks"; "required": false; }; }, {}, never, never, false, never>;
|
|
55
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { DateMode } from "./gantt-lite.model";
|
|
2
|
+
export declare class SlotIndexToDateLabelConverter {
|
|
3
|
+
private dateMode;
|
|
4
|
+
private originDate;
|
|
5
|
+
private slotSeconds;
|
|
6
|
+
private hasNegativeDependencySpace;
|
|
7
|
+
private timeFormatter;
|
|
8
|
+
private dayFormatter;
|
|
9
|
+
constructor(dateMode: DateMode, originDate: number, slotSeconds: number, hasNegativeDependencySpace: boolean);
|
|
10
|
+
private initFormatters;
|
|
11
|
+
private get slotMs();
|
|
12
|
+
private indexToDate;
|
|
13
|
+
getLabelCalendar(index: number, scale: string): string;
|
|
14
|
+
getLabelDuration(index: number, scale: string): string;
|
|
15
|
+
private formatTime;
|
|
16
|
+
private formatDay;
|
|
17
|
+
private formatRange;
|
|
18
|
+
private formatMonthRange;
|
|
19
|
+
private formatYearRange;
|
|
20
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
export interface GanttTask {
|
|
2
|
+
id: string;
|
|
3
|
+
label: string;
|
|
4
|
+
start: Date | number;
|
|
5
|
+
end: Date | number;
|
|
6
|
+
startSlot?: number;
|
|
7
|
+
endSlot?: number;
|
|
8
|
+
row: number;
|
|
9
|
+
dependencies: string[];
|
|
10
|
+
}
|
|
11
|
+
export interface GanttData extends GanttTask {
|
|
12
|
+
fields?: Record<string, any>;
|
|
13
|
+
}
|
|
14
|
+
export type GanttScale = '1m' | '10m' | '30m' | 'hour' | '6 hours' | '12 hours' | 'day' | 'week' | 'month' | 'year';
|
|
15
|
+
export interface TimelineSlot {
|
|
16
|
+
index: number;
|
|
17
|
+
x: number;
|
|
18
|
+
width: number;
|
|
19
|
+
label?: string;
|
|
20
|
+
}
|
|
21
|
+
export interface DependencyPath {
|
|
22
|
+
from: string;
|
|
23
|
+
to: string;
|
|
24
|
+
id: string;
|
|
25
|
+
path: string;
|
|
26
|
+
}
|
|
27
|
+
export interface ScaleConfig {
|
|
28
|
+
secondes: number;
|
|
29
|
+
px: number;
|
|
30
|
+
}
|
|
31
|
+
export type DataType = 'duration' | 'calendar';
|
|
32
|
+
export type DateMode = 'utc' | 'local';
|
|
33
|
+
export type GanttTaskView = GanttTask & {
|
|
34
|
+
x: number;
|
|
35
|
+
y: number;
|
|
36
|
+
width: number;
|
|
37
|
+
height: number;
|
|
38
|
+
};
|
|
39
|
+
export interface GanttColumn {
|
|
40
|
+
id: string;
|
|
41
|
+
title: string;
|
|
42
|
+
width?: number;
|
|
43
|
+
showInGrid?: boolean;
|
|
44
|
+
showInTooltip?: boolean;
|
|
45
|
+
hidden?: () => boolean;
|
|
46
|
+
valueGetter?: (task: GanttData) => any;
|
|
47
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# GanttLite
|
|
2
|
+
|
|
3
|
+
This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 17.3.0.
|
|
4
|
+
|
|
5
|
+
## Code scaffolding
|
|
6
|
+
|
|
7
|
+
Run `ng generate component component-name --project gantt-lite` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module --project gantt-lite`.
|
|
8
|
+
> Note: Don't forget to add `--project gantt-lite` or else it will be added to the default project in your `angular.json` file.
|
|
9
|
+
|
|
10
|
+
## Build
|
|
11
|
+
|
|
12
|
+
Run `ng build gantt-lite` to build the project. The build artifacts will be stored in the `dist/` directory.
|
|
13
|
+
|
|
14
|
+
## Publishing
|
|
15
|
+
|
|
16
|
+
After building your library with `ng build gantt-lite`, go to the dist folder `cd dist/gantt-lite` and run `npm publish`.
|
|
17
|
+
|
|
18
|
+
## Running unit tests
|
|
19
|
+
|
|
20
|
+
Run `ng test gantt-lite` to execute the unit tests via [Karma](https://karma-runner.github.io).
|
|
21
|
+
|
|
22
|
+
## Further help
|
|
23
|
+
|
|
24
|
+
To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI Overview and Command Reference](https://angular.io/cli) page.
|