@ganttloom/gantt-vue 0.2.0 → 0.4.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/README.md +53 -0
- package/dist/index.cjs +37 -4
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +75 -0
- package/dist/index.d.ts +75 -0
- package/dist/index.js +37 -4
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -8,6 +8,8 @@ wrapper: it owns no scheduling logic of its own, just Vue lifecycle,
|
|
|
8
8
|
props-as-events, and an exposed handle for the escape hatches (undo/redo,
|
|
9
9
|
zoom, export) that don't fit the declarative-props model.
|
|
10
10
|
|
|
11
|
+

|
|
12
|
+
|
|
11
13
|
## Install
|
|
12
14
|
|
|
13
15
|
```bash
|
|
@@ -109,6 +111,27 @@ shift-click selects a range. Then drive it from the handle:
|
|
|
109
111
|
|
|
110
112
|
Both off by default (same construction-time-only wiring caveat as
|
|
111
113
|
`task-create` below — attach the listener from the first render).
|
|
114
|
+
Double-clicking a task bar itself fires the separate
|
|
115
|
+
`@task-dblclick="(task) => ..."`, same caveat.
|
|
116
|
+
|
|
117
|
+
## Filling the viewport at any zoom level
|
|
118
|
+
|
|
119
|
+
A short project at month/year zoom, or just a handful of tasks, naturally
|
|
120
|
+
renders narrow. `auto-fit-to-viewport` stretches (never shrinks) the
|
|
121
|
+
timeline to fill the container instead of leaving empty space:
|
|
122
|
+
|
|
123
|
+
```vue
|
|
124
|
+
<GanttChart :tasks="tasks" auto-fit-to-viewport />
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
Off by default — upgrading doesn't silently change an existing chart's
|
|
128
|
+
pixel layout for anyone who hasn't opted in.
|
|
129
|
+
|
|
130
|
+
Always on, separately: the visible range is padded to a minimum tick count
|
|
131
|
+
per zoom level, so a short project at year/quarter zoom never collapses
|
|
132
|
+
into one or two lonely columns, and the date header stays pinned to the
|
|
133
|
+
top while scrolling a tall task list vertically (still scrolling
|
|
134
|
+
horizontally in sync with the bars).
|
|
112
135
|
|
|
113
136
|
## Drag-to-create
|
|
114
137
|
|
|
@@ -145,6 +168,21 @@ See `@ganttloom/gantt-core`'s README for the full behavior of each — the
|
|
|
145
168
|
props/events here are 1:1 mirrors of its `GanttOptions` fields, and
|
|
146
169
|
`filterTasks` is a pure re-export.
|
|
147
170
|
|
|
171
|
+
## Column sorting
|
|
172
|
+
|
|
173
|
+
Mark a column `sortable`; clicking its header cycles asc → desc → none:
|
|
174
|
+
|
|
175
|
+
```vue
|
|
176
|
+
<GanttChart
|
|
177
|
+
:tasks="tasks"
|
|
178
|
+
:columns="[{ id: 'name', title: 'Task', sortable: true }]"
|
|
179
|
+
@sort-change="(sort) => console.log(sort)"
|
|
180
|
+
/>
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
`chartRef.value?.setSort(columnId, direction)` / `.getSort()` are also
|
|
184
|
+
available on the handle.
|
|
185
|
+
|
|
148
186
|
## Resource leveling and multi-page PNG export
|
|
149
187
|
|
|
150
188
|
```ts
|
|
@@ -169,6 +207,21 @@ const histogramSvg = computed(() => renderResourceHistogramSVG(chartRef.value?.g
|
|
|
169
207
|
</template>
|
|
170
208
|
```
|
|
171
209
|
|
|
210
|
+
## Hover tooltips
|
|
211
|
+
|
|
212
|
+
On by default (name/dates/progress/assignees/notes), styled via plain CSS
|
|
213
|
+
(`.gantt-tooltip`, see `gantt-core`'s README) — not the browser's native
|
|
214
|
+
tooltip. `renderTooltip` fully replaces the content:
|
|
215
|
+
|
|
216
|
+
```vue
|
|
217
|
+
<GanttChart
|
|
218
|
+
:tasks="tasks"
|
|
219
|
+
:render-tooltip="(task) => (task.isMilestone ? null : `${task.name} — ${task.progress ?? 0}%`)"
|
|
220
|
+
/>
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
Set `:show-tooltip="false"` to disable it entirely.
|
|
224
|
+
|
|
172
225
|
## `useGanttChart` (lower-level composable)
|
|
173
226
|
|
|
174
227
|
If you want to own the container element/DOM tree yourself instead of using
|
package/dist/index.cjs
CHANGED
|
@@ -97,7 +97,8 @@ var EMPTY_RENDER_MODEL = {
|
|
|
97
97
|
columns: [],
|
|
98
98
|
theme: {},
|
|
99
99
|
markers: [],
|
|
100
|
-
rangeStart: /* @__PURE__ */ new Date(0)
|
|
100
|
+
rangeStart: /* @__PURE__ */ new Date(0),
|
|
101
|
+
sort: null
|
|
101
102
|
};
|
|
102
103
|
function hasInitialListener(eventName) {
|
|
103
104
|
const instance = (0, import_vue2.getCurrentInstance)();
|
|
@@ -118,6 +119,13 @@ var ganttChartProps = {
|
|
|
118
119
|
showCriticalPath: { type: Boolean, default: void 0 },
|
|
119
120
|
showBaseline: { type: Boolean, default: void 0 },
|
|
120
121
|
showDeadlines: { type: Boolean, default: void 0 },
|
|
122
|
+
/** hover tooltip on task bars, defaults to true. A floating, CSS-customizable element (`.gantt-tooltip`) - not the browser's native title tooltip. */
|
|
123
|
+
showTooltip: { type: Boolean, default: void 0 },
|
|
124
|
+
/** fully control tooltip content/markup; return null/undefined to suppress it for a specific task. Defaults to name/dates/progress/assignees/notes. */
|
|
125
|
+
renderTooltip: {
|
|
126
|
+
type: Function,
|
|
127
|
+
default: void 0
|
|
128
|
+
},
|
|
121
129
|
showAssigneeAvatars: { type: Boolean, default: void 0 },
|
|
122
130
|
enableHistory: { type: Boolean, default: void 0 },
|
|
123
131
|
keyboardAccessible: { type: Boolean, default: void 0 },
|
|
@@ -132,7 +140,13 @@ var ganttChartProps = {
|
|
|
132
140
|
/** a group task with no explicit `progress` gets a duration-weighted average of its children's progress instead of 0 */
|
|
133
141
|
autoRollupProgress: { type: Boolean, default: void 0 },
|
|
134
142
|
/** enables click/ctrl-click/shift-click multi-selection of task bars, and the handle's bulkShiftDates()/bulkDelete() */
|
|
135
|
-
selectable: { type: Boolean, default: void 0 }
|
|
143
|
+
selectable: { type: Boolean, default: void 0 },
|
|
144
|
+
/**
|
|
145
|
+
* Stretch (never shrink) the timeline to fill the container's width instead of leaving empty
|
|
146
|
+
* space - the common "short project at month/year zoom" or "just a few tasks" case. Off by
|
|
147
|
+
* default (a new chart's pixel layout shouldn't change for existing consumers who don't opt in).
|
|
148
|
+
*/
|
|
149
|
+
autoFitToViewport: { type: Boolean, default: void 0 }
|
|
136
150
|
};
|
|
137
151
|
var ganttChartEmits = {
|
|
138
152
|
"date-change": (_task, _start, _end) => true,
|
|
@@ -141,13 +155,15 @@ var ganttChartEmits = {
|
|
|
141
155
|
"dependency-remove": (_dep) => true,
|
|
142
156
|
"dependency-dblclick": (_dep) => true,
|
|
143
157
|
"task-click": (_task) => true,
|
|
158
|
+
"task-dblclick": (_task) => true,
|
|
144
159
|
"group-toggle": (_task, _collapsed) => true,
|
|
145
160
|
"context-menu": (_task, _evt) => true,
|
|
146
161
|
"task-create": (_task) => true,
|
|
147
162
|
"column-resize": (_columnId, _width) => true,
|
|
148
163
|
"column-reorder": (_order) => true,
|
|
149
164
|
"task-reorder": (_draggedTaskId, _targetTaskId, _position) => true,
|
|
150
|
-
"selection-change": (_taskIds) => true
|
|
165
|
+
"selection-change": (_taskIds) => true,
|
|
166
|
+
"sort-change": (_sort) => true
|
|
151
167
|
};
|
|
152
168
|
var GanttChart = (0, import_vue2.defineComponent)({
|
|
153
169
|
name: "GanttChart",
|
|
@@ -162,6 +178,7 @@ var GanttChart = (0, import_vue2.defineComponent)({
|
|
|
162
178
|
const wireColumnReorder = hasInitialListener("onColumnReorder");
|
|
163
179
|
const wireTaskReorder = hasInitialListener("onTaskReorder");
|
|
164
180
|
const wireDependencyDblClick = hasInitialListener("onDependencyDblClick");
|
|
181
|
+
const wireTaskDblClick = hasInitialListener("onTaskDblClick");
|
|
165
182
|
const getOptions = () => ({
|
|
166
183
|
viewMode: props.viewMode,
|
|
167
184
|
columns: props.columns,
|
|
@@ -175,6 +192,8 @@ var GanttChart = (0, import_vue2.defineComponent)({
|
|
|
175
192
|
showCriticalPath: props.showCriticalPath,
|
|
176
193
|
showBaseline: props.showBaseline,
|
|
177
194
|
showDeadlines: props.showDeadlines,
|
|
195
|
+
showTooltip: props.showTooltip,
|
|
196
|
+
renderTooltip: props.renderTooltip,
|
|
178
197
|
showAssigneeAvatars: props.showAssigneeAvatars,
|
|
179
198
|
enableHistory: props.enableHistory,
|
|
180
199
|
keyboardAccessible: props.keyboardAccessible,
|
|
@@ -186,12 +205,14 @@ var GanttChart = (0, import_vue2.defineComponent)({
|
|
|
186
205
|
markers: props.markers,
|
|
187
206
|
autoRollupProgress: props.autoRollupProgress,
|
|
188
207
|
selectable: props.selectable,
|
|
208
|
+
autoFitToViewport: props.autoFitToViewport,
|
|
189
209
|
onContextMenu: noop,
|
|
190
210
|
onTaskCreate: wireTaskCreate ? noop : void 0,
|
|
191
211
|
onColumnResize: wireColumnResize ? noop : void 0,
|
|
192
212
|
onColumnReorder: wireColumnReorder ? noop : void 0,
|
|
193
213
|
onTaskReorder: wireTaskReorder ? noop : void 0,
|
|
194
|
-
onDependencyDblClick: wireDependencyDblClick ? noop : void 0
|
|
214
|
+
onDependencyDblClick: wireDependencyDblClick ? noop : void 0,
|
|
215
|
+
onTaskDblClick: wireTaskDblClick ? noop : void 0
|
|
195
216
|
});
|
|
196
217
|
const { chart } = useGanttChart(
|
|
197
218
|
containerRef,
|
|
@@ -208,6 +229,7 @@ var GanttChart = (0, import_vue2.defineComponent)({
|
|
|
208
229
|
instance.on("dependency-remove", handleDependencyRemove);
|
|
209
230
|
instance.on("dependency-dblclick", handleDependencyDblClick);
|
|
210
231
|
instance.on("task-click", handleTaskClick);
|
|
232
|
+
instance.on("task-dblclick", handleTaskDblClick);
|
|
211
233
|
instance.on("group-toggle", handleGroupToggle);
|
|
212
234
|
instance.on("context-menu", handleContextMenu);
|
|
213
235
|
instance.on("task-create", handleTaskCreate);
|
|
@@ -215,6 +237,7 @@ var GanttChart = (0, import_vue2.defineComponent)({
|
|
|
215
237
|
instance.on("column-reorder", handleColumnReorder);
|
|
216
238
|
instance.on("task-reorder", handleTaskReorder);
|
|
217
239
|
instance.on("selection-change", handleSelectionChange);
|
|
240
|
+
instance.on("sort-change", handleSortChange);
|
|
218
241
|
onCleanup(() => {
|
|
219
242
|
instance.off("date-change", handleDateChange);
|
|
220
243
|
instance.off("progress-change", handleProgressChange);
|
|
@@ -222,6 +245,7 @@ var GanttChart = (0, import_vue2.defineComponent)({
|
|
|
222
245
|
instance.off("dependency-remove", handleDependencyRemove);
|
|
223
246
|
instance.off("dependency-dblclick", handleDependencyDblClick);
|
|
224
247
|
instance.off("task-click", handleTaskClick);
|
|
248
|
+
instance.off("task-dblclick", handleTaskDblClick);
|
|
225
249
|
instance.off("group-toggle", handleGroupToggle);
|
|
226
250
|
instance.off("context-menu", handleContextMenu);
|
|
227
251
|
instance.off("task-create", handleTaskCreate);
|
|
@@ -229,6 +253,7 @@ var GanttChart = (0, import_vue2.defineComponent)({
|
|
|
229
253
|
instance.off("column-reorder", handleColumnReorder);
|
|
230
254
|
instance.off("task-reorder", handleTaskReorder);
|
|
231
255
|
instance.off("selection-change", handleSelectionChange);
|
|
256
|
+
instance.off("sort-change", handleSortChange);
|
|
232
257
|
});
|
|
233
258
|
}, { flush: "sync" });
|
|
234
259
|
function handleDateChange(p) {
|
|
@@ -249,6 +274,9 @@ var GanttChart = (0, import_vue2.defineComponent)({
|
|
|
249
274
|
function handleTaskClick(p) {
|
|
250
275
|
emit("task-click", p.task);
|
|
251
276
|
}
|
|
277
|
+
function handleTaskDblClick(p) {
|
|
278
|
+
emit("task-dblclick", p.task);
|
|
279
|
+
}
|
|
252
280
|
function handleGroupToggle(p) {
|
|
253
281
|
emit("group-toggle", p.task, p.collapsed);
|
|
254
282
|
}
|
|
@@ -270,6 +298,9 @@ var GanttChart = (0, import_vue2.defineComponent)({
|
|
|
270
298
|
function handleSelectionChange(p) {
|
|
271
299
|
emit("selection-change", p.taskIds);
|
|
272
300
|
}
|
|
301
|
+
function handleSortChange(p) {
|
|
302
|
+
emit("sort-change", p.sort);
|
|
303
|
+
}
|
|
273
304
|
(0, import_vue2.onBeforeUnmount)(() => {
|
|
274
305
|
containerRef.value = null;
|
|
275
306
|
});
|
|
@@ -300,6 +331,8 @@ var GanttChart = (0, import_vue2.defineComponent)({
|
|
|
300
331
|
selectAllVisible: () => chart.value?.selectAllVisible(),
|
|
301
332
|
clearSelection: () => chart.value?.clearSelection(),
|
|
302
333
|
getSelectedTaskIds: () => chart.value?.getSelectedTaskIds() ?? [],
|
|
334
|
+
setSort: (columnId, direction) => chart.value?.setSort(columnId, direction),
|
|
335
|
+
getSort: () => chart.value?.getSort() ?? null,
|
|
303
336
|
bulkShiftDates: (deltaMs) => chart.value?.bulkShiftDates(deltaMs),
|
|
304
337
|
bulkDelete: () => chart.value?.bulkDelete(),
|
|
305
338
|
toSVGString: () => chart.value?.toSVGString() ?? "",
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/GanttChart.ts","../src/useGanttChart.ts"],"sourcesContent":["export { GanttChart, default } from \"./GanttChart\";\nexport type { GanttChartProps, GanttChartHandle } from \"./GanttChart\";\n\nexport { useGanttChart } from \"./useGanttChart\";\nexport type { UseGanttChartResult } from \"./useGanttChart\";\n\n// Re-exported so consumers never need to add @ganttloom/gantt-core as a direct\n// dependency just to reference its types.\nexport type {\n ViewMode,\n DependencyType,\n GanttDependency,\n GanttAssignee,\n GanttTask,\n GanttColumn,\n GanttTheme,\n GanttRenderRow,\n GanttRenderBar,\n GanttRenderLink,\n GanttRenderTick,\n GanttRenderModel,\n GanttOptions,\n GanttEventMap,\n WorkingCalendar,\n ConstraintType,\n ResourceHistogramOptions,\n ResourceLoadBucket,\n GanttMarker,\n GanttRenderMarker,\n FilterTasksOptions,\n FilterTasksResult,\n Density,\n ResourceLevelingOptions,\n ResourceLevelingResult,\n} from \"@ganttloom/gantt-core\";\n\nexport {\n computeWBSCodes,\n applyConstraint,\n isWorkingDay,\n isHoliday,\n isWithinWorkingHours,\n isWorkingTime,\n nextWorkingDay,\n previousWorkingDay,\n shiftToWorkingDay,\n shiftToWorkingTime,\n computeResourceHistogram,\n renderResourceHistogramSVG,\n filterTasks,\n colorByField,\n applyColorByField,\n DEFAULT_PALETTE,\n DENSITY_PRESETS,\n levelResources,\n} from \"@ganttloom/gantt-core\";\n","// Pulls in the core's default styles so consumers get a working chart out of the box.\n// This resolves through gantt-core's package.json \"exports\" map (\"./styles.css\" -> \"./dist/styles.css\").\n// If your bundler can't resolve CSS imports from a dependency's export map, import it yourself instead:\n// import \"@ganttloom/gantt-core/styles.css\";\nimport \"@ganttloom/gantt-core/styles.css\";\n\nimport {\n defineComponent,\n getCurrentInstance,\n h,\n onBeforeUnmount,\n ref,\n watch,\n type ExtractPropTypes,\n type PropType,\n} from \"vue\";\nimport type {\n GanttChart as GanttCore,\n GanttColumn,\n GanttDependency,\n GanttMarker,\n GanttOptions,\n GanttRenderModel,\n GanttTask,\n GanttTheme,\n ResourceHistogramOptions,\n ResourceLoadBucket,\n ResourceLevelingOptions,\n ResourceLevelingResult,\n ViewMode,\n WorkingCalendar,\n} from \"@ganttloom/gantt-core\";\nimport { useGanttChart } from \"./useGanttChart\";\n\n/** Imperative escape hatches, available via a template ref (see the package README). */\nexport interface GanttChartHandle {\n undo(): void;\n redo(): void;\n canUndo(): boolean;\n canRedo(): boolean;\n expandAll(): void;\n collapseAll(): void;\n toggleGroup(taskId: string): void;\n removeDependency(fromId: string, toId: string): void;\n updateDependency(fromId: string, toId: string, partial: Partial<GanttDependency>): void;\n updateTask(id: string, partial: Partial<GanttTask>): void;\n setViewMode(mode: ViewMode): void;\n fitToViewport(containerWidthPx: number): void;\n scrollToToday(): void;\n scrollToRangeStart(): void;\n scrollToRangeEnd(): void;\n getPageCount(): number;\n setPage(page: number): void;\n zoomIn(factor?: number): void;\n zoomOut(factor?: number): void;\n getZoomLevel(): number;\n getResourceHistogram(options?: ResourceHistogramOptions): ResourceLoadBucket[];\n getLeveledTasks(options?: ResourceLevelingOptions): ResourceLevelingResult;\n selectTask(id: string, options?: { additive?: boolean }): void;\n selectAllVisible(): void;\n clearSelection(): void;\n getSelectedTaskIds(): string[];\n bulkShiftDates(deltaMs: number): void;\n bulkDelete(): void;\n toSVGString(): string;\n toPNGDataURL(): Promise<string>;\n toPNGDataURLs(options?: { pageWidthPx?: number; pageHeightPx?: number }): Promise<string[]>;\n getRenderModel(): GanttRenderModel | null;\n /** Direct access to the underlying framework-agnostic core instance (null before mount). */\n getInstance(): GanttCore | null;\n}\n\nconst EMPTY_RENDER_MODEL: GanttRenderModel = {\n width: 0,\n height: 0,\n rowHeight: 0,\n headerHeight: 0,\n rows: [],\n bars: [],\n links: [],\n ticks: [],\n columns: [],\n theme: {} as GanttTheme,\n markers: [],\n rangeStart: new Date(0),\n};\n\n/**\n * Checks whether the parent actually bound a listener for `eventName` (e.g. \"onTaskCreate\")\n * on this component's *initial* vnode. A handful of gantt-core options only wire up their\n * DOM interaction (drag-to-create, column resize/reorder, dependency double-click, context\n * menu) when the corresponding callback is truthy AT CONSTRUCTION TIME — so a stable no-op\n * is passed there to force the wiring on, and the real dispatch goes through the reactive\n * \"task-create\" etc. event subscription below instead. Reading `vnode.props` (rather than a\n * declared prop/emit) is what lets this stay accurate for both `@task-create=\"...\"` template\n * listeners and a plain `onTaskCreate` prop, without needing the caller to pass anything else.\n */\nfunction hasInitialListener(eventName: string): boolean {\n const instance = getCurrentInstance();\n return !!(instance?.vnode.props && eventName in instance.vnode.props);\n}\n\nconst ganttChartProps = {\n tasks: { type: Array as PropType<GanttTask[]>, required: true },\n dependencies: { type: Array as PropType<GanttDependency[]>, default: () => [] },\n viewMode: { type: String as PropType<ViewMode>, default: undefined },\n columns: { type: Array as PropType<GanttColumn[]>, default: undefined },\n theme: { type: Object as PropType<Partial<GanttTheme>>, default: undefined },\n colorScheme: { type: String as PropType<\"light\" | \"dark\" | \"auto\">, default: undefined },\n columnWidth: { type: Number, default: undefined },\n readonly: { type: Boolean, default: undefined },\n showProgress: { type: Boolean, default: undefined },\n showDependencies: { type: Boolean, default: undefined },\n gridPanelWidth: { type: Number, default: undefined },\n showCriticalPath: { type: Boolean, default: undefined },\n showBaseline: { type: Boolean, default: undefined },\n showDeadlines: { type: Boolean, default: undefined },\n showAssigneeAvatars: { type: Boolean, default: undefined },\n enableHistory: { type: Boolean, default: undefined },\n keyboardAccessible: { type: Boolean, default: undefined },\n virtualScroll: { type: Boolean, default: undefined },\n autoSchedule: { type: Boolean, default: undefined },\n pagination: { type: Object as PropType<{ pageSize: number; page: number }>, default: undefined },\n snapToUnit: { type: [String, Boolean] as PropType<\"hour\" | \"day\" | \"week\" | false>, default: undefined },\n /** working-day/holiday definition used to shade non-working time and (with autoSchedule) skip it when cascading */\n calendar: { type: Object as PropType<WorkingCalendar>, default: undefined },\n /** arbitrary labeled vertical lines on the timeline, independent of any task */\n markers: { type: Array as PropType<GanttMarker[]>, default: undefined },\n /** a group task with no explicit `progress` gets a duration-weighted average of its children's progress instead of 0 */\n autoRollupProgress: { type: Boolean, default: undefined },\n /** enables click/ctrl-click/shift-click multi-selection of task bars, and the handle's bulkShiftDates()/bulkDelete() */\n selectable: { type: Boolean, default: undefined },\n} as const;\n\nexport type GanttChartProps = ExtractPropTypes<typeof ganttChartProps>;\n\nconst ganttChartEmits = {\n \"date-change\": (_task: GanttTask, _start: Date, _end: Date) => true,\n \"progress-change\": (_task: GanttTask, _progress: number) => true,\n \"dependency-create\": (_dep: GanttDependency) => true,\n \"dependency-remove\": (_dep: GanttDependency) => true,\n \"dependency-dblclick\": (_dep: GanttDependency) => true,\n \"task-click\": (_task: GanttTask) => true,\n \"group-toggle\": (_task: GanttTask, _collapsed: boolean) => true,\n \"context-menu\": (_task: GanttTask, _evt: PointerEvent) => true,\n \"task-create\": (_task: GanttTask) => true,\n \"column-resize\": (_columnId: string, _width: number) => true,\n \"column-reorder\": (_order: string[]) => true,\n \"task-reorder\": (\n _draggedTaskId: string,\n _targetTaskId: string,\n _position: \"before\" | \"after\" | \"inside\"\n ) => true,\n \"selection-change\": (_taskIds: string[]) => true,\n};\n\nexport const GanttChart = defineComponent({\n name: \"GanttChart\",\n props: ganttChartProps,\n emits: ganttChartEmits,\n setup(props, { emit, expose }) {\n const containerRef = ref<HTMLElement | null>(null);\n const noop = () => {};\n\n // See hasInitialListener's doc comment: these five only affect whether gantt-core wires\n // up the relevant DOM interaction at construction, and are captured once, up front.\n // onContextMenu is deliberately always wired (unlike the other five) so right-click\n // handling works out of the box even for consumers who haven't attached a listener.\n const wireTaskCreate = hasInitialListener(\"onTaskCreate\");\n const wireColumnResize = hasInitialListener(\"onColumnResize\");\n const wireColumnReorder = hasInitialListener(\"onColumnReorder\");\n const wireTaskReorder = hasInitialListener(\"onTaskReorder\");\n const wireDependencyDblClick = hasInitialListener(\"onDependencyDblClick\");\n\n // gantt-core invokes every one of these seven callbacks from a call site that ALSO\n // unconditionally emits the matching public event (\"date-change\", \"selection-change\", ...).\n // So none of them belong in `options` below — doing that would fire the Vue listener\n // twice per event, once here and once through the chart.on(...) subscription further down.\n // options only ever needs: (a) the six gate-a-DOM-feature callbacks, as stable no-ops/undefined\n // purely to control wiring, and (b) everything else, which is plain reactive config.\n const getOptions = (): GanttOptions => ({\n viewMode: props.viewMode,\n columns: props.columns,\n theme: props.theme,\n colorScheme: props.colorScheme,\n columnWidth: props.columnWidth,\n readonly: props.readonly,\n showProgress: props.showProgress,\n showDependencies: props.showDependencies,\n gridPanelWidth: props.gridPanelWidth,\n showCriticalPath: props.showCriticalPath,\n showBaseline: props.showBaseline,\n showDeadlines: props.showDeadlines,\n showAssigneeAvatars: props.showAssigneeAvatars,\n enableHistory: props.enableHistory,\n keyboardAccessible: props.keyboardAccessible,\n virtualScroll: props.virtualScroll,\n autoSchedule: props.autoSchedule,\n pagination: props.pagination,\n snapToUnit: props.snapToUnit,\n calendar: props.calendar,\n markers: props.markers,\n autoRollupProgress: props.autoRollupProgress,\n selectable: props.selectable,\n onContextMenu: noop,\n onTaskCreate: wireTaskCreate ? noop : undefined,\n onColumnResize: wireColumnResize ? noop : undefined,\n onColumnReorder: wireColumnReorder ? noop : undefined,\n onTaskReorder: wireTaskReorder ? noop : undefined,\n onDependencyDblClick: wireDependencyDblClick ? noop : undefined,\n });\n\n const { chart } = useGanttChart(\n containerRef,\n () => props.tasks,\n () => props.dependencies,\n getOptions\n );\n\n // getOptions() builds a fresh object every call, so this only re-syncs gantt-core's\n // options when one of the reactive prop values it reads actually changed.\n watch(getOptions, (options) => chart.value?.setOptions(options));\n\n // All real event dispatch goes through the chart's public emitter — set up once when the\n // instance appears. `emit` is stable for the component's lifetime, so (unlike the React\n // wrapper's ref-of-latest-callback dance) there's no need to guard against re-subscribing.\n watch(chart, (instance, _prev, onCleanup) => {\n if (!instance) return;\n instance.on(\"date-change\", handleDateChange);\n instance.on(\"progress-change\", handleProgressChange);\n instance.on(\"dependency-create\", handleDependencyCreate);\n instance.on(\"dependency-remove\", handleDependencyRemove);\n instance.on(\"dependency-dblclick\", handleDependencyDblClick);\n instance.on(\"task-click\", handleTaskClick);\n instance.on(\"group-toggle\", handleGroupToggle);\n instance.on(\"context-menu\", handleContextMenu);\n instance.on(\"task-create\", handleTaskCreate);\n instance.on(\"column-resize\", handleColumnResize);\n instance.on(\"column-reorder\", handleColumnReorder);\n instance.on(\"task-reorder\", handleTaskReorder);\n instance.on(\"selection-change\", handleSelectionChange);\n onCleanup(() => {\n instance.off(\"date-change\", handleDateChange);\n instance.off(\"progress-change\", handleProgressChange);\n instance.off(\"dependency-create\", handleDependencyCreate);\n instance.off(\"dependency-remove\", handleDependencyRemove);\n instance.off(\"dependency-dblclick\", handleDependencyDblClick);\n instance.off(\"task-click\", handleTaskClick);\n instance.off(\"group-toggle\", handleGroupToggle);\n instance.off(\"context-menu\", handleContextMenu);\n instance.off(\"task-create\", handleTaskCreate);\n instance.off(\"column-resize\", handleColumnResize);\n instance.off(\"column-reorder\", handleColumnReorder);\n instance.off(\"task-reorder\", handleTaskReorder);\n instance.off(\"selection-change\", handleSelectionChange);\n });\n }, { flush: \"sync\" }); // synchronous: chart.value is set inside useGanttChart's onMounted,\n // and listeners must be attached before that same tick's synchronous code (e.g. a ref call\n // right after mount) can trigger an event — Vue's default 'pre' flush would run this a tick late.\n\n function handleDateChange(p: { task: GanttTask; start: Date; end: Date }) {\n emit(\"date-change\", p.task, p.start, p.end);\n }\n function handleProgressChange(p: { task: GanttTask; progress: number }) {\n emit(\"progress-change\", p.task, p.progress);\n }\n function handleDependencyCreate(dep: GanttDependency) {\n emit(\"dependency-create\", dep);\n }\n function handleDependencyRemove(dep: GanttDependency) {\n emit(\"dependency-remove\", dep);\n }\n function handleDependencyDblClick(dep: GanttDependency) {\n emit(\"dependency-dblclick\", dep);\n }\n function handleTaskClick(p: { task: GanttTask }) {\n emit(\"task-click\", p.task);\n }\n function handleGroupToggle(p: { task: GanttTask; collapsed: boolean }) {\n emit(\"group-toggle\", p.task, p.collapsed);\n }\n function handleContextMenu(p: { task: GanttTask; evt: PointerEvent }) {\n emit(\"context-menu\", p.task, p.evt);\n }\n function handleTaskCreate(p: { task: GanttTask }) {\n emit(\"task-create\", p.task);\n }\n function handleColumnResize(p: { columnId: string; width: number }) {\n emit(\"column-resize\", p.columnId, p.width);\n }\n function handleColumnReorder(p: { order: string[] }) {\n emit(\"column-reorder\", p.order);\n }\n function handleTaskReorder(p: {\n draggedTaskId: string;\n targetTaskId: string;\n position: \"before\" | \"after\" | \"inside\";\n }) {\n emit(\"task-reorder\", p.draggedTaskId, p.targetTaskId, p.position);\n }\n function handleSelectionChange(p: { taskIds: string[] }) {\n emit(\"selection-change\", p.taskIds);\n }\n\n onBeforeUnmount(() => {\n containerRef.value = null;\n });\n\n const handle: GanttChartHandle = {\n undo: () => chart.value?.undo(),\n redo: () => chart.value?.redo(),\n canUndo: () => chart.value?.canUndo ?? false,\n canRedo: () => chart.value?.canRedo ?? false,\n expandAll: () => chart.value?.expandAll(),\n collapseAll: () => chart.value?.collapseAll(),\n toggleGroup: (taskId) => chart.value?.toggleGroup(taskId),\n removeDependency: (fromId, toId) => chart.value?.removeDependency(fromId, toId),\n updateDependency: (fromId, toId, partial) => chart.value?.updateDependency(fromId, toId, partial),\n updateTask: (id, partial) => chart.value?.updateTask(id, partial),\n setViewMode: (mode) => chart.value?.setViewMode(mode),\n fitToViewport: (containerWidthPx) => chart.value?.fitToViewport(containerWidthPx),\n scrollToToday: () => chart.value?.scrollToToday(),\n scrollToRangeStart: () => chart.value?.scrollToRangeStart(),\n scrollToRangeEnd: () => chart.value?.scrollToRangeEnd(),\n getPageCount: () => chart.value?.getPageCount() ?? 1,\n setPage: (page) => chart.value?.setPage(page),\n zoomIn: (factor) => chart.value?.zoomIn(factor),\n zoomOut: (factor) => chart.value?.zoomOut(factor),\n getZoomLevel: () => chart.value?.getZoomLevel() ?? 0,\n getResourceHistogram: (options) => chart.value?.getResourceHistogram(options) ?? [],\n getLeveledTasks: (options) => chart.value?.getLeveledTasks(options) ?? { tasks: [], shifted: [] },\n selectTask: (id, options) => chart.value?.selectTask(id, options),\n selectAllVisible: () => chart.value?.selectAllVisible(),\n clearSelection: () => chart.value?.clearSelection(),\n getSelectedTaskIds: () => chart.value?.getSelectedTaskIds() ?? [],\n bulkShiftDates: (deltaMs) => chart.value?.bulkShiftDates(deltaMs),\n bulkDelete: () => chart.value?.bulkDelete(),\n toSVGString: () => chart.value?.toSVGString() ?? \"\",\n toPNGDataURL: () => chart.value?.toPNGDataURL() ?? Promise.resolve(\"\"),\n toPNGDataURLs: (options) => chart.value?.toPNGDataURLs(options) ?? Promise.resolve([]),\n getRenderModel: () => chart.value?.getRenderModel() ?? EMPTY_RENDER_MODEL,\n getInstance: () => chart.value,\n };\n expose(handle);\n\n // A single root element: class/style attrs fall through onto it automatically.\n return () => h(\"div\", { ref: containerRef });\n },\n});\n\nexport default GanttChart;\n","import { onBeforeUnmount, onMounted, shallowRef, watch, type Ref, type ShallowRef } from \"vue\";\nimport { GanttChart as GanttCore } from \"@ganttloom/gantt-core\";\nimport type { GanttDependency, GanttOptions, GanttTask } from \"@ganttloom/gantt-core\";\n\nexport interface UseGanttChartResult {\n /** The underlying framework-agnostic GanttChart instance, or null before the mount effect runs. */\n chart: ShallowRef<GanttCore | null>;\n /** Reactive, subscribed to the core's \"history-change\" event. Only meaningful when `enableHistory` is set in options. */\n canUndo: Ref<boolean>;\n /** Reactive, subscribed to the core's \"history-change\" event. Only meaningful when `enableHistory` is set in options. */\n canRedo: Ref<boolean>;\n}\n\n/**\n * Lower-level escape hatch for consumers who want to own their own container element\n * and DOM tree instead of using the <GanttChart /> component. Constructs a\n * @ganttloom/gantt-core GanttChart instance against `containerRef.value` on mount,\n * keeps it in sync with the tasks/dependencies/options getters via setTasks / setDependencies /\n * setOptions (reference-equality checks only — return a new array/object to trigger a sync),\n * and destroys it on unmount.\n *\n * `getTasks`/`getDependencies`/`getOptions` are plain functions (not refs) so this composable\n * can track whatever reactive source each one reads — a prop, a ref, a computed — without\n * imposing a shape on the caller.\n */\nexport function useGanttChart(\n containerRef: Ref<HTMLElement | null>,\n getTasks: () => GanttTask[],\n getDependencies: () => GanttDependency[],\n getOptions: () => GanttOptions\n): UseGanttChartResult {\n const chart = shallowRef<GanttCore | null>(null);\n const canUndo = shallowRef(false);\n const canRedo = shallowRef(false);\n\n let onHistoryChange: ((state: { canUndo: boolean; canRedo: boolean }) => void) | undefined;\n\n onMounted(() => {\n const container = containerRef.value;\n if (!container) return;\n\n const instance = new GanttCore(container, getTasks(), getDependencies(), getOptions());\n chart.value = instance;\n canUndo.value = instance.canUndo;\n canRedo.value = instance.canRedo;\n\n onHistoryChange = (state) => {\n canUndo.value = state.canUndo;\n canRedo.value = state.canRedo;\n };\n instance.on(\"history-change\", onHistoryChange);\n });\n\n onBeforeUnmount(() => {\n const instance = chart.value;\n if (!instance) return;\n if (onHistoryChange) instance.off(\"history-change\", onHistoryChange);\n instance.destroy();\n chart.value = null;\n canUndo.value = false;\n canRedo.value = false;\n });\n\n // Non-immediate: the initial values were already passed to the constructor above,\n // so these only need to fire on subsequent changes.\n watch(getTasks, (tasks) => chart.value?.setTasks(tasks));\n watch(getDependencies, (deps) => chart.value?.setDependencies(deps));\n watch(getOptions, (options) => chart.value?.setOptions(options));\n\n return { chart, canUndo, canRedo };\n}\n"],"mappings":"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","names":["import_vue","GanttCore","import_gantt_core"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/GanttChart.ts","../src/useGanttChart.ts"],"sourcesContent":["export { GanttChart, default } from \"./GanttChart\";\nexport type { GanttChartProps, GanttChartHandle } from \"./GanttChart\";\n\nexport { useGanttChart } from \"./useGanttChart\";\nexport type { UseGanttChartResult } from \"./useGanttChart\";\n\n// Re-exported so consumers never need to add @ganttloom/gantt-core as a direct\n// dependency just to reference its types.\nexport type {\n ViewMode,\n DependencyType,\n GanttDependency,\n GanttAssignee,\n GanttTask,\n GanttColumn,\n GanttTheme,\n GanttRenderRow,\n GanttRenderBar,\n GanttRenderLink,\n GanttRenderTick,\n GanttRenderModel,\n GanttOptions,\n GanttEventMap,\n WorkingCalendar,\n ConstraintType,\n ResourceHistogramOptions,\n ResourceLoadBucket,\n GanttMarker,\n GanttRenderMarker,\n FilterTasksOptions,\n FilterTasksResult,\n Density,\n ResourceLevelingOptions,\n ResourceLevelingResult,\n} from \"@ganttloom/gantt-core\";\n\nexport {\n computeWBSCodes,\n applyConstraint,\n isWorkingDay,\n isHoliday,\n isWithinWorkingHours,\n isWorkingTime,\n nextWorkingDay,\n previousWorkingDay,\n shiftToWorkingDay,\n shiftToWorkingTime,\n computeResourceHistogram,\n renderResourceHistogramSVG,\n filterTasks,\n colorByField,\n applyColorByField,\n DEFAULT_PALETTE,\n DENSITY_PRESETS,\n levelResources,\n} from \"@ganttloom/gantt-core\";\n","// Pulls in the core's default styles so consumers get a working chart out of the box.\n// This resolves through gantt-core's package.json \"exports\" map (\"./styles.css\" -> \"./dist/styles.css\").\n// If your bundler can't resolve CSS imports from a dependency's export map, import it yourself instead:\n// import \"@ganttloom/gantt-core/styles.css\";\nimport \"@ganttloom/gantt-core/styles.css\";\n\nimport {\n defineComponent,\n getCurrentInstance,\n h,\n onBeforeUnmount,\n ref,\n watch,\n type ExtractPropTypes,\n type PropType,\n} from \"vue\";\nimport type {\n GanttChart as GanttCore,\n GanttColumn,\n GanttDependency,\n GanttMarker,\n GanttOptions,\n GanttRenderModel,\n GanttTask,\n GanttTheme,\n ResourceHistogramOptions,\n ResourceLoadBucket,\n ResourceLevelingOptions,\n ResourceLevelingResult,\n ViewMode,\n WorkingCalendar,\n} from \"@ganttloom/gantt-core\";\nimport { useGanttChart } from \"./useGanttChart\";\n\n/** Imperative escape hatches, available via a template ref (see the package README). */\nexport interface GanttChartHandle {\n undo(): void;\n redo(): void;\n canUndo(): boolean;\n canRedo(): boolean;\n expandAll(): void;\n collapseAll(): void;\n toggleGroup(taskId: string): void;\n removeDependency(fromId: string, toId: string): void;\n updateDependency(fromId: string, toId: string, partial: Partial<GanttDependency>): void;\n updateTask(id: string, partial: Partial<GanttTask>): void;\n setViewMode(mode: ViewMode): void;\n fitToViewport(containerWidthPx: number): void;\n scrollToToday(): void;\n scrollToRangeStart(): void;\n scrollToRangeEnd(): void;\n getPageCount(): number;\n setPage(page: number): void;\n zoomIn(factor?: number): void;\n zoomOut(factor?: number): void;\n getZoomLevel(): number;\n getResourceHistogram(options?: ResourceHistogramOptions): ResourceLoadBucket[];\n getLeveledTasks(options?: ResourceLevelingOptions): ResourceLevelingResult;\n selectTask(id: string, options?: { additive?: boolean }): void;\n selectAllVisible(): void;\n clearSelection(): void;\n getSelectedTaskIds(): string[];\n setSort(columnId: string | null, direction?: \"asc\" | \"desc\" | null): void;\n getSort(): { columnId: string; direction: \"asc\" | \"desc\" } | null;\n bulkShiftDates(deltaMs: number): void;\n bulkDelete(): void;\n toSVGString(): string;\n toPNGDataURL(): Promise<string>;\n toPNGDataURLs(options?: { pageWidthPx?: number; pageHeightPx?: number }): Promise<string[]>;\n getRenderModel(): GanttRenderModel | null;\n /** Direct access to the underlying framework-agnostic core instance (null before mount). */\n getInstance(): GanttCore | null;\n}\n\nconst EMPTY_RENDER_MODEL: GanttRenderModel = {\n width: 0,\n height: 0,\n rowHeight: 0,\n headerHeight: 0,\n rows: [],\n bars: [],\n links: [],\n ticks: [],\n columns: [],\n theme: {} as GanttTheme,\n markers: [],\n rangeStart: new Date(0),\n sort: null,\n};\n\n/**\n * Checks whether the parent actually bound a listener for `eventName` (e.g. \"onTaskCreate\")\n * on this component's *initial* vnode. A handful of gantt-core options only wire up their\n * DOM interaction (drag-to-create, column resize/reorder, dependency double-click, context\n * menu) when the corresponding callback is truthy AT CONSTRUCTION TIME — so a stable no-op\n * is passed there to force the wiring on, and the real dispatch goes through the reactive\n * \"task-create\" etc. event subscription below instead. Reading `vnode.props` (rather than a\n * declared prop/emit) is what lets this stay accurate for both `@task-create=\"...\"` template\n * listeners and a plain `onTaskCreate` prop, without needing the caller to pass anything else.\n */\nfunction hasInitialListener(eventName: string): boolean {\n const instance = getCurrentInstance();\n return !!(instance?.vnode.props && eventName in instance.vnode.props);\n}\n\nconst ganttChartProps = {\n tasks: { type: Array as PropType<GanttTask[]>, required: true },\n dependencies: { type: Array as PropType<GanttDependency[]>, default: () => [] },\n viewMode: { type: String as PropType<ViewMode>, default: undefined },\n columns: { type: Array as PropType<GanttColumn[]>, default: undefined },\n theme: { type: Object as PropType<Partial<GanttTheme>>, default: undefined },\n colorScheme: { type: String as PropType<\"light\" | \"dark\" | \"auto\">, default: undefined },\n columnWidth: { type: Number, default: undefined },\n readonly: { type: Boolean, default: undefined },\n showProgress: { type: Boolean, default: undefined },\n showDependencies: { type: Boolean, default: undefined },\n gridPanelWidth: { type: Number, default: undefined },\n showCriticalPath: { type: Boolean, default: undefined },\n showBaseline: { type: Boolean, default: undefined },\n showDeadlines: { type: Boolean, default: undefined },\n /** hover tooltip on task bars, defaults to true. A floating, CSS-customizable element (`.gantt-tooltip`) - not the browser's native title tooltip. */\n showTooltip: { type: Boolean, default: undefined },\n /** fully control tooltip content/markup; return null/undefined to suppress it for a specific task. Defaults to name/dates/progress/assignees/notes. */\n renderTooltip: {\n type: Function as PropType<(task: GanttTask) => HTMLElement | string | null | undefined>,\n default: undefined,\n },\n showAssigneeAvatars: { type: Boolean, default: undefined },\n enableHistory: { type: Boolean, default: undefined },\n keyboardAccessible: { type: Boolean, default: undefined },\n virtualScroll: { type: Boolean, default: undefined },\n autoSchedule: { type: Boolean, default: undefined },\n pagination: { type: Object as PropType<{ pageSize: number; page: number }>, default: undefined },\n snapToUnit: { type: [String, Boolean] as PropType<\"hour\" | \"day\" | \"week\" | false>, default: undefined },\n /** working-day/holiday definition used to shade non-working time and (with autoSchedule) skip it when cascading */\n calendar: { type: Object as PropType<WorkingCalendar>, default: undefined },\n /** arbitrary labeled vertical lines on the timeline, independent of any task */\n markers: { type: Array as PropType<GanttMarker[]>, default: undefined },\n /** a group task with no explicit `progress` gets a duration-weighted average of its children's progress instead of 0 */\n autoRollupProgress: { type: Boolean, default: undefined },\n /** enables click/ctrl-click/shift-click multi-selection of task bars, and the handle's bulkShiftDates()/bulkDelete() */\n selectable: { type: Boolean, default: undefined },\n /**\n * Stretch (never shrink) the timeline to fill the container's width instead of leaving empty\n * space - the common \"short project at month/year zoom\" or \"just a few tasks\" case. Off by\n * default (a new chart's pixel layout shouldn't change for existing consumers who don't opt in).\n */\n autoFitToViewport: { type: Boolean, default: undefined },\n} as const;\n\nexport type GanttChartProps = ExtractPropTypes<typeof ganttChartProps>;\n\nconst ganttChartEmits = {\n \"date-change\": (_task: GanttTask, _start: Date, _end: Date) => true,\n \"progress-change\": (_task: GanttTask, _progress: number) => true,\n \"dependency-create\": (_dep: GanttDependency) => true,\n \"dependency-remove\": (_dep: GanttDependency) => true,\n \"dependency-dblclick\": (_dep: GanttDependency) => true,\n \"task-click\": (_task: GanttTask) => true,\n \"task-dblclick\": (_task: GanttTask) => true,\n \"group-toggle\": (_task: GanttTask, _collapsed: boolean) => true,\n \"context-menu\": (_task: GanttTask, _evt: PointerEvent) => true,\n \"task-create\": (_task: GanttTask) => true,\n \"column-resize\": (_columnId: string, _width: number) => true,\n \"column-reorder\": (_order: string[]) => true,\n \"task-reorder\": (\n _draggedTaskId: string,\n _targetTaskId: string,\n _position: \"before\" | \"after\" | \"inside\"\n ) => true,\n \"selection-change\": (_taskIds: string[]) => true,\n \"sort-change\": (_sort: { columnId: string; direction: \"asc\" | \"desc\" } | null) => true,\n};\n\nexport const GanttChart = defineComponent({\n name: \"GanttChart\",\n props: ganttChartProps,\n emits: ganttChartEmits,\n setup(props, { emit, expose }) {\n const containerRef = ref<HTMLElement | null>(null);\n const noop = () => {};\n\n // See hasInitialListener's doc comment: these six only affect whether gantt-core wires\n // up the relevant DOM interaction at construction, and are captured once, up front.\n // onContextMenu is deliberately always wired (unlike the other six) so right-click\n // handling works out of the box even for consumers who haven't attached a listener.\n const wireTaskCreate = hasInitialListener(\"onTaskCreate\");\n const wireColumnResize = hasInitialListener(\"onColumnResize\");\n const wireColumnReorder = hasInitialListener(\"onColumnReorder\");\n const wireTaskReorder = hasInitialListener(\"onTaskReorder\");\n const wireDependencyDblClick = hasInitialListener(\"onDependencyDblClick\");\n const wireTaskDblClick = hasInitialListener(\"onTaskDblClick\");\n\n // gantt-core invokes every one of these seven callbacks from a call site that ALSO\n // unconditionally emits the matching public event (\"date-change\", \"selection-change\", ...).\n // So none of them belong in `options` below — doing that would fire the Vue listener\n // twice per event, once here and once through the chart.on(...) subscription further down.\n // options only ever needs: (a) the six gate-a-DOM-feature callbacks, as stable no-ops/undefined\n // purely to control wiring, and (b) everything else, which is plain reactive config.\n const getOptions = (): GanttOptions => ({\n viewMode: props.viewMode,\n columns: props.columns,\n theme: props.theme,\n colorScheme: props.colorScheme,\n columnWidth: props.columnWidth,\n readonly: props.readonly,\n showProgress: props.showProgress,\n showDependencies: props.showDependencies,\n gridPanelWidth: props.gridPanelWidth,\n showCriticalPath: props.showCriticalPath,\n showBaseline: props.showBaseline,\n showDeadlines: props.showDeadlines,\n showTooltip: props.showTooltip,\n renderTooltip: props.renderTooltip,\n showAssigneeAvatars: props.showAssigneeAvatars,\n enableHistory: props.enableHistory,\n keyboardAccessible: props.keyboardAccessible,\n virtualScroll: props.virtualScroll,\n autoSchedule: props.autoSchedule,\n pagination: props.pagination,\n snapToUnit: props.snapToUnit,\n calendar: props.calendar,\n markers: props.markers,\n autoRollupProgress: props.autoRollupProgress,\n selectable: props.selectable,\n autoFitToViewport: props.autoFitToViewport,\n onContextMenu: noop,\n onTaskCreate: wireTaskCreate ? noop : undefined,\n onColumnResize: wireColumnResize ? noop : undefined,\n onColumnReorder: wireColumnReorder ? noop : undefined,\n onTaskReorder: wireTaskReorder ? noop : undefined,\n onDependencyDblClick: wireDependencyDblClick ? noop : undefined,\n onTaskDblClick: wireTaskDblClick ? noop : undefined,\n });\n\n const { chart } = useGanttChart(\n containerRef,\n () => props.tasks,\n () => props.dependencies,\n getOptions\n );\n\n // getOptions() builds a fresh object every call, so this only re-syncs gantt-core's\n // options when one of the reactive prop values it reads actually changed.\n watch(getOptions, (options) => chart.value?.setOptions(options));\n\n // All real event dispatch goes through the chart's public emitter — set up once when the\n // instance appears. `emit` is stable for the component's lifetime, so (unlike the React\n // wrapper's ref-of-latest-callback dance) there's no need to guard against re-subscribing.\n watch(chart, (instance, _prev, onCleanup) => {\n if (!instance) return;\n instance.on(\"date-change\", handleDateChange);\n instance.on(\"progress-change\", handleProgressChange);\n instance.on(\"dependency-create\", handleDependencyCreate);\n instance.on(\"dependency-remove\", handleDependencyRemove);\n instance.on(\"dependency-dblclick\", handleDependencyDblClick);\n instance.on(\"task-click\", handleTaskClick);\n instance.on(\"task-dblclick\", handleTaskDblClick);\n instance.on(\"group-toggle\", handleGroupToggle);\n instance.on(\"context-menu\", handleContextMenu);\n instance.on(\"task-create\", handleTaskCreate);\n instance.on(\"column-resize\", handleColumnResize);\n instance.on(\"column-reorder\", handleColumnReorder);\n instance.on(\"task-reorder\", handleTaskReorder);\n instance.on(\"selection-change\", handleSelectionChange);\n instance.on(\"sort-change\", handleSortChange);\n onCleanup(() => {\n instance.off(\"date-change\", handleDateChange);\n instance.off(\"progress-change\", handleProgressChange);\n instance.off(\"dependency-create\", handleDependencyCreate);\n instance.off(\"dependency-remove\", handleDependencyRemove);\n instance.off(\"dependency-dblclick\", handleDependencyDblClick);\n instance.off(\"task-click\", handleTaskClick);\n instance.off(\"task-dblclick\", handleTaskDblClick);\n instance.off(\"group-toggle\", handleGroupToggle);\n instance.off(\"context-menu\", handleContextMenu);\n instance.off(\"task-create\", handleTaskCreate);\n instance.off(\"column-resize\", handleColumnResize);\n instance.off(\"column-reorder\", handleColumnReorder);\n instance.off(\"task-reorder\", handleTaskReorder);\n instance.off(\"selection-change\", handleSelectionChange);\n instance.off(\"sort-change\", handleSortChange);\n });\n }, { flush: \"sync\" }); // synchronous: chart.value is set inside useGanttChart's onMounted,\n // and listeners must be attached before that same tick's synchronous code (e.g. a ref call\n // right after mount) can trigger an event — Vue's default 'pre' flush would run this a tick late.\n\n function handleDateChange(p: { task: GanttTask; start: Date; end: Date }) {\n emit(\"date-change\", p.task, p.start, p.end);\n }\n function handleProgressChange(p: { task: GanttTask; progress: number }) {\n emit(\"progress-change\", p.task, p.progress);\n }\n function handleDependencyCreate(dep: GanttDependency) {\n emit(\"dependency-create\", dep);\n }\n function handleDependencyRemove(dep: GanttDependency) {\n emit(\"dependency-remove\", dep);\n }\n function handleDependencyDblClick(dep: GanttDependency) {\n emit(\"dependency-dblclick\", dep);\n }\n function handleTaskClick(p: { task: GanttTask }) {\n emit(\"task-click\", p.task);\n }\n function handleTaskDblClick(p: { task: GanttTask }) {\n emit(\"task-dblclick\", p.task);\n }\n function handleGroupToggle(p: { task: GanttTask; collapsed: boolean }) {\n emit(\"group-toggle\", p.task, p.collapsed);\n }\n function handleContextMenu(p: { task: GanttTask; evt: PointerEvent }) {\n emit(\"context-menu\", p.task, p.evt);\n }\n function handleTaskCreate(p: { task: GanttTask }) {\n emit(\"task-create\", p.task);\n }\n function handleColumnResize(p: { columnId: string; width: number }) {\n emit(\"column-resize\", p.columnId, p.width);\n }\n function handleColumnReorder(p: { order: string[] }) {\n emit(\"column-reorder\", p.order);\n }\n function handleTaskReorder(p: {\n draggedTaskId: string;\n targetTaskId: string;\n position: \"before\" | \"after\" | \"inside\";\n }) {\n emit(\"task-reorder\", p.draggedTaskId, p.targetTaskId, p.position);\n }\n function handleSelectionChange(p: { taskIds: string[] }) {\n emit(\"selection-change\", p.taskIds);\n }\n function handleSortChange(p: { sort: { columnId: string; direction: \"asc\" | \"desc\" } | null }) {\n emit(\"sort-change\", p.sort);\n }\n\n onBeforeUnmount(() => {\n containerRef.value = null;\n });\n\n const handle: GanttChartHandle = {\n undo: () => chart.value?.undo(),\n redo: () => chart.value?.redo(),\n canUndo: () => chart.value?.canUndo ?? false,\n canRedo: () => chart.value?.canRedo ?? false,\n expandAll: () => chart.value?.expandAll(),\n collapseAll: () => chart.value?.collapseAll(),\n toggleGroup: (taskId) => chart.value?.toggleGroup(taskId),\n removeDependency: (fromId, toId) => chart.value?.removeDependency(fromId, toId),\n updateDependency: (fromId, toId, partial) => chart.value?.updateDependency(fromId, toId, partial),\n updateTask: (id, partial) => chart.value?.updateTask(id, partial),\n setViewMode: (mode) => chart.value?.setViewMode(mode),\n fitToViewport: (containerWidthPx) => chart.value?.fitToViewport(containerWidthPx),\n scrollToToday: () => chart.value?.scrollToToday(),\n scrollToRangeStart: () => chart.value?.scrollToRangeStart(),\n scrollToRangeEnd: () => chart.value?.scrollToRangeEnd(),\n getPageCount: () => chart.value?.getPageCount() ?? 1,\n setPage: (page) => chart.value?.setPage(page),\n zoomIn: (factor) => chart.value?.zoomIn(factor),\n zoomOut: (factor) => chart.value?.zoomOut(factor),\n getZoomLevel: () => chart.value?.getZoomLevel() ?? 0,\n getResourceHistogram: (options) => chart.value?.getResourceHistogram(options) ?? [],\n getLeveledTasks: (options) => chart.value?.getLeveledTasks(options) ?? { tasks: [], shifted: [] },\n selectTask: (id, options) => chart.value?.selectTask(id, options),\n selectAllVisible: () => chart.value?.selectAllVisible(),\n clearSelection: () => chart.value?.clearSelection(),\n getSelectedTaskIds: () => chart.value?.getSelectedTaskIds() ?? [],\n setSort: (columnId, direction) => chart.value?.setSort(columnId, direction),\n getSort: () => chart.value?.getSort() ?? null,\n bulkShiftDates: (deltaMs) => chart.value?.bulkShiftDates(deltaMs),\n bulkDelete: () => chart.value?.bulkDelete(),\n toSVGString: () => chart.value?.toSVGString() ?? \"\",\n toPNGDataURL: () => chart.value?.toPNGDataURL() ?? Promise.resolve(\"\"),\n toPNGDataURLs: (options) => chart.value?.toPNGDataURLs(options) ?? Promise.resolve([]),\n getRenderModel: () => chart.value?.getRenderModel() ?? EMPTY_RENDER_MODEL,\n getInstance: () => chart.value,\n };\n expose(handle);\n\n // A single root element: class/style attrs fall through onto it automatically.\n return () => h(\"div\", { ref: containerRef });\n },\n});\n\nexport default GanttChart;\n","import { onBeforeUnmount, onMounted, shallowRef, watch, type Ref, type ShallowRef } from \"vue\";\nimport { GanttChart as GanttCore } from \"@ganttloom/gantt-core\";\nimport type { GanttDependency, GanttOptions, GanttTask } from \"@ganttloom/gantt-core\";\n\nexport interface UseGanttChartResult {\n /** The underlying framework-agnostic GanttChart instance, or null before the mount effect runs. */\n chart: ShallowRef<GanttCore | null>;\n /** Reactive, subscribed to the core's \"history-change\" event. Only meaningful when `enableHistory` is set in options. */\n canUndo: Ref<boolean>;\n /** Reactive, subscribed to the core's \"history-change\" event. Only meaningful when `enableHistory` is set in options. */\n canRedo: Ref<boolean>;\n}\n\n/**\n * Lower-level escape hatch for consumers who want to own their own container element\n * and DOM tree instead of using the <GanttChart /> component. Constructs a\n * @ganttloom/gantt-core GanttChart instance against `containerRef.value` on mount,\n * keeps it in sync with the tasks/dependencies/options getters via setTasks / setDependencies /\n * setOptions (reference-equality checks only — return a new array/object to trigger a sync),\n * and destroys it on unmount.\n *\n * `getTasks`/`getDependencies`/`getOptions` are plain functions (not refs) so this composable\n * can track whatever reactive source each one reads — a prop, a ref, a computed — without\n * imposing a shape on the caller.\n */\nexport function useGanttChart(\n containerRef: Ref<HTMLElement | null>,\n getTasks: () => GanttTask[],\n getDependencies: () => GanttDependency[],\n getOptions: () => GanttOptions\n): UseGanttChartResult {\n const chart = shallowRef<GanttCore | null>(null);\n const canUndo = shallowRef(false);\n const canRedo = shallowRef(false);\n\n let onHistoryChange: ((state: { canUndo: boolean; canRedo: boolean }) => void) | undefined;\n\n onMounted(() => {\n const container = containerRef.value;\n if (!container) return;\n\n const instance = new GanttCore(container, getTasks(), getDependencies(), getOptions());\n chart.value = instance;\n canUndo.value = instance.canUndo;\n canRedo.value = instance.canRedo;\n\n onHistoryChange = (state) => {\n canUndo.value = state.canUndo;\n canRedo.value = state.canRedo;\n };\n instance.on(\"history-change\", onHistoryChange);\n });\n\n onBeforeUnmount(() => {\n const instance = chart.value;\n if (!instance) return;\n if (onHistoryChange) instance.off(\"history-change\", onHistoryChange);\n instance.destroy();\n chart.value = null;\n canUndo.value = false;\n canRedo.value = false;\n });\n\n // Non-immediate: the initial values were already passed to the constructor above,\n // so these only need to fire on subsequent changes.\n watch(getTasks, (tasks) => chart.value?.setTasks(tasks));\n watch(getDependencies, (deps) => chart.value?.setDependencies(deps));\n watch(getOptions, (options) => chart.value?.setOptions(options));\n\n return { chart, canUndo, canRedo };\n}\n"],"mappings":"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","names":["import_vue","GanttCore","import_gantt_core"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -33,6 +33,11 @@ interface GanttChartHandle {
|
|
|
33
33
|
selectAllVisible(): void;
|
|
34
34
|
clearSelection(): void;
|
|
35
35
|
getSelectedTaskIds(): string[];
|
|
36
|
+
setSort(columnId: string | null, direction?: "asc" | "desc" | null): void;
|
|
37
|
+
getSort(): {
|
|
38
|
+
columnId: string;
|
|
39
|
+
direction: "asc" | "desc";
|
|
40
|
+
} | null;
|
|
36
41
|
bulkShiftDates(deltaMs: number): void;
|
|
37
42
|
bulkDelete(): void;
|
|
38
43
|
toSVGString(): string;
|
|
@@ -102,6 +107,16 @@ declare const ganttChartProps: {
|
|
|
102
107
|
readonly type: BooleanConstructor;
|
|
103
108
|
readonly default: undefined;
|
|
104
109
|
};
|
|
110
|
+
/** hover tooltip on task bars, defaults to true. A floating, CSS-customizable element (`.gantt-tooltip`) - not the browser's native title tooltip. */
|
|
111
|
+
readonly showTooltip: {
|
|
112
|
+
readonly type: BooleanConstructor;
|
|
113
|
+
readonly default: undefined;
|
|
114
|
+
};
|
|
115
|
+
/** fully control tooltip content/markup; return null/undefined to suppress it for a specific task. Defaults to name/dates/progress/assignees/notes. */
|
|
116
|
+
readonly renderTooltip: {
|
|
117
|
+
readonly type: PropType<(task: GanttTask) => HTMLElement | string | null | undefined>;
|
|
118
|
+
readonly default: undefined;
|
|
119
|
+
};
|
|
105
120
|
readonly showAssigneeAvatars: {
|
|
106
121
|
readonly type: BooleanConstructor;
|
|
107
122
|
readonly default: undefined;
|
|
@@ -153,6 +168,15 @@ declare const ganttChartProps: {
|
|
|
153
168
|
readonly type: BooleanConstructor;
|
|
154
169
|
readonly default: undefined;
|
|
155
170
|
};
|
|
171
|
+
/**
|
|
172
|
+
* Stretch (never shrink) the timeline to fill the container's width instead of leaving empty
|
|
173
|
+
* space - the common "short project at month/year zoom" or "just a few tasks" case. Off by
|
|
174
|
+
* default (a new chart's pixel layout shouldn't change for existing consumers who don't opt in).
|
|
175
|
+
*/
|
|
176
|
+
readonly autoFitToViewport: {
|
|
177
|
+
readonly type: BooleanConstructor;
|
|
178
|
+
readonly default: undefined;
|
|
179
|
+
};
|
|
156
180
|
};
|
|
157
181
|
type GanttChartProps = ExtractPropTypes<typeof ganttChartProps>;
|
|
158
182
|
declare const GanttChart: vue.DefineComponent<ExtractPropTypes<{
|
|
@@ -212,6 +236,16 @@ declare const GanttChart: vue.DefineComponent<ExtractPropTypes<{
|
|
|
212
236
|
readonly type: BooleanConstructor;
|
|
213
237
|
readonly default: undefined;
|
|
214
238
|
};
|
|
239
|
+
/** hover tooltip on task bars, defaults to true. A floating, CSS-customizable element (`.gantt-tooltip`) - not the browser's native title tooltip. */
|
|
240
|
+
readonly showTooltip: {
|
|
241
|
+
readonly type: BooleanConstructor;
|
|
242
|
+
readonly default: undefined;
|
|
243
|
+
};
|
|
244
|
+
/** fully control tooltip content/markup; return null/undefined to suppress it for a specific task. Defaults to name/dates/progress/assignees/notes. */
|
|
245
|
+
readonly renderTooltip: {
|
|
246
|
+
readonly type: PropType<(task: GanttTask) => HTMLElement | string | null | undefined>;
|
|
247
|
+
readonly default: undefined;
|
|
248
|
+
};
|
|
215
249
|
readonly showAssigneeAvatars: {
|
|
216
250
|
readonly type: BooleanConstructor;
|
|
217
251
|
readonly default: undefined;
|
|
@@ -263,6 +297,15 @@ declare const GanttChart: vue.DefineComponent<ExtractPropTypes<{
|
|
|
263
297
|
readonly type: BooleanConstructor;
|
|
264
298
|
readonly default: undefined;
|
|
265
299
|
};
|
|
300
|
+
/**
|
|
301
|
+
* Stretch (never shrink) the timeline to fill the container's width instead of leaving empty
|
|
302
|
+
* space - the common "short project at month/year zoom" or "just a few tasks" case. Off by
|
|
303
|
+
* default (a new chart's pixel layout shouldn't change for existing consumers who don't opt in).
|
|
304
|
+
*/
|
|
305
|
+
readonly autoFitToViewport: {
|
|
306
|
+
readonly type: BooleanConstructor;
|
|
307
|
+
readonly default: undefined;
|
|
308
|
+
};
|
|
266
309
|
}>, () => vue.VNode<vue.RendererNode, vue.RendererElement, {
|
|
267
310
|
[key: string]: any;
|
|
268
311
|
}>, {}, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, {
|
|
@@ -272,6 +315,7 @@ declare const GanttChart: vue.DefineComponent<ExtractPropTypes<{
|
|
|
272
315
|
"dependency-remove": (_dep: GanttDependency) => boolean;
|
|
273
316
|
"dependency-dblclick": (_dep: GanttDependency) => boolean;
|
|
274
317
|
"task-click": (_task: GanttTask) => boolean;
|
|
318
|
+
"task-dblclick": (_task: GanttTask) => boolean;
|
|
275
319
|
"group-toggle": (_task: GanttTask, _collapsed: boolean) => boolean;
|
|
276
320
|
"context-menu": (_task: GanttTask, _evt: PointerEvent) => boolean;
|
|
277
321
|
"task-create": (_task: GanttTask) => boolean;
|
|
@@ -279,6 +323,10 @@ declare const GanttChart: vue.DefineComponent<ExtractPropTypes<{
|
|
|
279
323
|
"column-reorder": (_order: string[]) => boolean;
|
|
280
324
|
"task-reorder": (_draggedTaskId: string, _targetTaskId: string, _position: "before" | "after" | "inside") => boolean;
|
|
281
325
|
"selection-change": (_taskIds: string[]) => boolean;
|
|
326
|
+
"sort-change": (_sort: {
|
|
327
|
+
columnId: string;
|
|
328
|
+
direction: "asc" | "desc";
|
|
329
|
+
} | null) => boolean;
|
|
282
330
|
}, string, vue.PublicProps, Readonly<ExtractPropTypes<{
|
|
283
331
|
readonly tasks: {
|
|
284
332
|
readonly type: PropType<GanttTask[]>;
|
|
@@ -336,6 +384,16 @@ declare const GanttChart: vue.DefineComponent<ExtractPropTypes<{
|
|
|
336
384
|
readonly type: BooleanConstructor;
|
|
337
385
|
readonly default: undefined;
|
|
338
386
|
};
|
|
387
|
+
/** hover tooltip on task bars, defaults to true. A floating, CSS-customizable element (`.gantt-tooltip`) - not the browser's native title tooltip. */
|
|
388
|
+
readonly showTooltip: {
|
|
389
|
+
readonly type: BooleanConstructor;
|
|
390
|
+
readonly default: undefined;
|
|
391
|
+
};
|
|
392
|
+
/** fully control tooltip content/markup; return null/undefined to suppress it for a specific task. Defaults to name/dates/progress/assignees/notes. */
|
|
393
|
+
readonly renderTooltip: {
|
|
394
|
+
readonly type: PropType<(task: GanttTask) => HTMLElement | string | null | undefined>;
|
|
395
|
+
readonly default: undefined;
|
|
396
|
+
};
|
|
339
397
|
readonly showAssigneeAvatars: {
|
|
340
398
|
readonly type: BooleanConstructor;
|
|
341
399
|
readonly default: undefined;
|
|
@@ -387,6 +445,15 @@ declare const GanttChart: vue.DefineComponent<ExtractPropTypes<{
|
|
|
387
445
|
readonly type: BooleanConstructor;
|
|
388
446
|
readonly default: undefined;
|
|
389
447
|
};
|
|
448
|
+
/**
|
|
449
|
+
* Stretch (never shrink) the timeline to fill the container's width instead of leaving empty
|
|
450
|
+
* space - the common "short project at month/year zoom" or "just a few tasks" case. Off by
|
|
451
|
+
* default (a new chart's pixel layout shouldn't change for existing consumers who don't opt in).
|
|
452
|
+
*/
|
|
453
|
+
readonly autoFitToViewport: {
|
|
454
|
+
readonly type: BooleanConstructor;
|
|
455
|
+
readonly default: undefined;
|
|
456
|
+
};
|
|
390
457
|
}>> & Readonly<{
|
|
391
458
|
"onDate-change"?: ((_task: GanttTask, _start: Date, _end: Date) => any) | undefined;
|
|
392
459
|
"onProgress-change"?: ((_task: GanttTask, _progress: number) => any) | undefined;
|
|
@@ -399,8 +466,13 @@ declare const GanttChart: vue.DefineComponent<ExtractPropTypes<{
|
|
|
399
466
|
"onColumn-resize"?: ((_columnId: string, _width: number) => any) | undefined;
|
|
400
467
|
"onColumn-reorder"?: ((_order: string[]) => any) | undefined;
|
|
401
468
|
"onDependency-dblclick"?: ((_dep: GanttDependency) => any) | undefined;
|
|
469
|
+
"onTask-dblclick"?: ((_task: GanttTask) => any) | undefined;
|
|
402
470
|
"onTask-reorder"?: ((_draggedTaskId: string, _targetTaskId: string, _position: "before" | "after" | "inside") => any) | undefined;
|
|
403
471
|
"onSelection-change"?: ((_taskIds: string[]) => any) | undefined;
|
|
472
|
+
"onSort-change"?: ((_sort: {
|
|
473
|
+
columnId: string;
|
|
474
|
+
direction: "asc" | "desc";
|
|
475
|
+
} | null) => any) | undefined;
|
|
404
476
|
}>, {
|
|
405
477
|
readonly viewMode: ViewMode;
|
|
406
478
|
readonly columns: GanttColumn[];
|
|
@@ -414,6 +486,9 @@ declare const GanttChart: vue.DefineComponent<ExtractPropTypes<{
|
|
|
414
486
|
readonly showCriticalPath: boolean;
|
|
415
487
|
readonly showBaseline: boolean;
|
|
416
488
|
readonly showDeadlines: boolean;
|
|
489
|
+
readonly autoFitToViewport: boolean;
|
|
490
|
+
readonly showTooltip: boolean;
|
|
491
|
+
readonly renderTooltip: (task: GanttTask) => HTMLElement | string | null | undefined;
|
|
417
492
|
readonly showAssigneeAvatars: boolean;
|
|
418
493
|
readonly calendar: WorkingCalendar;
|
|
419
494
|
readonly markers: GanttMarker[];
|
package/dist/index.d.ts
CHANGED
|
@@ -33,6 +33,11 @@ interface GanttChartHandle {
|
|
|
33
33
|
selectAllVisible(): void;
|
|
34
34
|
clearSelection(): void;
|
|
35
35
|
getSelectedTaskIds(): string[];
|
|
36
|
+
setSort(columnId: string | null, direction?: "asc" | "desc" | null): void;
|
|
37
|
+
getSort(): {
|
|
38
|
+
columnId: string;
|
|
39
|
+
direction: "asc" | "desc";
|
|
40
|
+
} | null;
|
|
36
41
|
bulkShiftDates(deltaMs: number): void;
|
|
37
42
|
bulkDelete(): void;
|
|
38
43
|
toSVGString(): string;
|
|
@@ -102,6 +107,16 @@ declare const ganttChartProps: {
|
|
|
102
107
|
readonly type: BooleanConstructor;
|
|
103
108
|
readonly default: undefined;
|
|
104
109
|
};
|
|
110
|
+
/** hover tooltip on task bars, defaults to true. A floating, CSS-customizable element (`.gantt-tooltip`) - not the browser's native title tooltip. */
|
|
111
|
+
readonly showTooltip: {
|
|
112
|
+
readonly type: BooleanConstructor;
|
|
113
|
+
readonly default: undefined;
|
|
114
|
+
};
|
|
115
|
+
/** fully control tooltip content/markup; return null/undefined to suppress it for a specific task. Defaults to name/dates/progress/assignees/notes. */
|
|
116
|
+
readonly renderTooltip: {
|
|
117
|
+
readonly type: PropType<(task: GanttTask) => HTMLElement | string | null | undefined>;
|
|
118
|
+
readonly default: undefined;
|
|
119
|
+
};
|
|
105
120
|
readonly showAssigneeAvatars: {
|
|
106
121
|
readonly type: BooleanConstructor;
|
|
107
122
|
readonly default: undefined;
|
|
@@ -153,6 +168,15 @@ declare const ganttChartProps: {
|
|
|
153
168
|
readonly type: BooleanConstructor;
|
|
154
169
|
readonly default: undefined;
|
|
155
170
|
};
|
|
171
|
+
/**
|
|
172
|
+
* Stretch (never shrink) the timeline to fill the container's width instead of leaving empty
|
|
173
|
+
* space - the common "short project at month/year zoom" or "just a few tasks" case. Off by
|
|
174
|
+
* default (a new chart's pixel layout shouldn't change for existing consumers who don't opt in).
|
|
175
|
+
*/
|
|
176
|
+
readonly autoFitToViewport: {
|
|
177
|
+
readonly type: BooleanConstructor;
|
|
178
|
+
readonly default: undefined;
|
|
179
|
+
};
|
|
156
180
|
};
|
|
157
181
|
type GanttChartProps = ExtractPropTypes<typeof ganttChartProps>;
|
|
158
182
|
declare const GanttChart: vue.DefineComponent<ExtractPropTypes<{
|
|
@@ -212,6 +236,16 @@ declare const GanttChart: vue.DefineComponent<ExtractPropTypes<{
|
|
|
212
236
|
readonly type: BooleanConstructor;
|
|
213
237
|
readonly default: undefined;
|
|
214
238
|
};
|
|
239
|
+
/** hover tooltip on task bars, defaults to true. A floating, CSS-customizable element (`.gantt-tooltip`) - not the browser's native title tooltip. */
|
|
240
|
+
readonly showTooltip: {
|
|
241
|
+
readonly type: BooleanConstructor;
|
|
242
|
+
readonly default: undefined;
|
|
243
|
+
};
|
|
244
|
+
/** fully control tooltip content/markup; return null/undefined to suppress it for a specific task. Defaults to name/dates/progress/assignees/notes. */
|
|
245
|
+
readonly renderTooltip: {
|
|
246
|
+
readonly type: PropType<(task: GanttTask) => HTMLElement | string | null | undefined>;
|
|
247
|
+
readonly default: undefined;
|
|
248
|
+
};
|
|
215
249
|
readonly showAssigneeAvatars: {
|
|
216
250
|
readonly type: BooleanConstructor;
|
|
217
251
|
readonly default: undefined;
|
|
@@ -263,6 +297,15 @@ declare const GanttChart: vue.DefineComponent<ExtractPropTypes<{
|
|
|
263
297
|
readonly type: BooleanConstructor;
|
|
264
298
|
readonly default: undefined;
|
|
265
299
|
};
|
|
300
|
+
/**
|
|
301
|
+
* Stretch (never shrink) the timeline to fill the container's width instead of leaving empty
|
|
302
|
+
* space - the common "short project at month/year zoom" or "just a few tasks" case. Off by
|
|
303
|
+
* default (a new chart's pixel layout shouldn't change for existing consumers who don't opt in).
|
|
304
|
+
*/
|
|
305
|
+
readonly autoFitToViewport: {
|
|
306
|
+
readonly type: BooleanConstructor;
|
|
307
|
+
readonly default: undefined;
|
|
308
|
+
};
|
|
266
309
|
}>, () => vue.VNode<vue.RendererNode, vue.RendererElement, {
|
|
267
310
|
[key: string]: any;
|
|
268
311
|
}>, {}, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, {
|
|
@@ -272,6 +315,7 @@ declare const GanttChart: vue.DefineComponent<ExtractPropTypes<{
|
|
|
272
315
|
"dependency-remove": (_dep: GanttDependency) => boolean;
|
|
273
316
|
"dependency-dblclick": (_dep: GanttDependency) => boolean;
|
|
274
317
|
"task-click": (_task: GanttTask) => boolean;
|
|
318
|
+
"task-dblclick": (_task: GanttTask) => boolean;
|
|
275
319
|
"group-toggle": (_task: GanttTask, _collapsed: boolean) => boolean;
|
|
276
320
|
"context-menu": (_task: GanttTask, _evt: PointerEvent) => boolean;
|
|
277
321
|
"task-create": (_task: GanttTask) => boolean;
|
|
@@ -279,6 +323,10 @@ declare const GanttChart: vue.DefineComponent<ExtractPropTypes<{
|
|
|
279
323
|
"column-reorder": (_order: string[]) => boolean;
|
|
280
324
|
"task-reorder": (_draggedTaskId: string, _targetTaskId: string, _position: "before" | "after" | "inside") => boolean;
|
|
281
325
|
"selection-change": (_taskIds: string[]) => boolean;
|
|
326
|
+
"sort-change": (_sort: {
|
|
327
|
+
columnId: string;
|
|
328
|
+
direction: "asc" | "desc";
|
|
329
|
+
} | null) => boolean;
|
|
282
330
|
}, string, vue.PublicProps, Readonly<ExtractPropTypes<{
|
|
283
331
|
readonly tasks: {
|
|
284
332
|
readonly type: PropType<GanttTask[]>;
|
|
@@ -336,6 +384,16 @@ declare const GanttChart: vue.DefineComponent<ExtractPropTypes<{
|
|
|
336
384
|
readonly type: BooleanConstructor;
|
|
337
385
|
readonly default: undefined;
|
|
338
386
|
};
|
|
387
|
+
/** hover tooltip on task bars, defaults to true. A floating, CSS-customizable element (`.gantt-tooltip`) - not the browser's native title tooltip. */
|
|
388
|
+
readonly showTooltip: {
|
|
389
|
+
readonly type: BooleanConstructor;
|
|
390
|
+
readonly default: undefined;
|
|
391
|
+
};
|
|
392
|
+
/** fully control tooltip content/markup; return null/undefined to suppress it for a specific task. Defaults to name/dates/progress/assignees/notes. */
|
|
393
|
+
readonly renderTooltip: {
|
|
394
|
+
readonly type: PropType<(task: GanttTask) => HTMLElement | string | null | undefined>;
|
|
395
|
+
readonly default: undefined;
|
|
396
|
+
};
|
|
339
397
|
readonly showAssigneeAvatars: {
|
|
340
398
|
readonly type: BooleanConstructor;
|
|
341
399
|
readonly default: undefined;
|
|
@@ -387,6 +445,15 @@ declare const GanttChart: vue.DefineComponent<ExtractPropTypes<{
|
|
|
387
445
|
readonly type: BooleanConstructor;
|
|
388
446
|
readonly default: undefined;
|
|
389
447
|
};
|
|
448
|
+
/**
|
|
449
|
+
* Stretch (never shrink) the timeline to fill the container's width instead of leaving empty
|
|
450
|
+
* space - the common "short project at month/year zoom" or "just a few tasks" case. Off by
|
|
451
|
+
* default (a new chart's pixel layout shouldn't change for existing consumers who don't opt in).
|
|
452
|
+
*/
|
|
453
|
+
readonly autoFitToViewport: {
|
|
454
|
+
readonly type: BooleanConstructor;
|
|
455
|
+
readonly default: undefined;
|
|
456
|
+
};
|
|
390
457
|
}>> & Readonly<{
|
|
391
458
|
"onDate-change"?: ((_task: GanttTask, _start: Date, _end: Date) => any) | undefined;
|
|
392
459
|
"onProgress-change"?: ((_task: GanttTask, _progress: number) => any) | undefined;
|
|
@@ -399,8 +466,13 @@ declare const GanttChart: vue.DefineComponent<ExtractPropTypes<{
|
|
|
399
466
|
"onColumn-resize"?: ((_columnId: string, _width: number) => any) | undefined;
|
|
400
467
|
"onColumn-reorder"?: ((_order: string[]) => any) | undefined;
|
|
401
468
|
"onDependency-dblclick"?: ((_dep: GanttDependency) => any) | undefined;
|
|
469
|
+
"onTask-dblclick"?: ((_task: GanttTask) => any) | undefined;
|
|
402
470
|
"onTask-reorder"?: ((_draggedTaskId: string, _targetTaskId: string, _position: "before" | "after" | "inside") => any) | undefined;
|
|
403
471
|
"onSelection-change"?: ((_taskIds: string[]) => any) | undefined;
|
|
472
|
+
"onSort-change"?: ((_sort: {
|
|
473
|
+
columnId: string;
|
|
474
|
+
direction: "asc" | "desc";
|
|
475
|
+
} | null) => any) | undefined;
|
|
404
476
|
}>, {
|
|
405
477
|
readonly viewMode: ViewMode;
|
|
406
478
|
readonly columns: GanttColumn[];
|
|
@@ -414,6 +486,9 @@ declare const GanttChart: vue.DefineComponent<ExtractPropTypes<{
|
|
|
414
486
|
readonly showCriticalPath: boolean;
|
|
415
487
|
readonly showBaseline: boolean;
|
|
416
488
|
readonly showDeadlines: boolean;
|
|
489
|
+
readonly autoFitToViewport: boolean;
|
|
490
|
+
readonly showTooltip: boolean;
|
|
491
|
+
readonly renderTooltip: (task: GanttTask) => HTMLElement | string | null | undefined;
|
|
417
492
|
readonly showAssigneeAvatars: boolean;
|
|
418
493
|
readonly calendar: WorkingCalendar;
|
|
419
494
|
readonly markers: GanttMarker[];
|
package/dist/index.js
CHANGED
|
@@ -58,7 +58,8 @@ var EMPTY_RENDER_MODEL = {
|
|
|
58
58
|
columns: [],
|
|
59
59
|
theme: {},
|
|
60
60
|
markers: [],
|
|
61
|
-
rangeStart: /* @__PURE__ */ new Date(0)
|
|
61
|
+
rangeStart: /* @__PURE__ */ new Date(0),
|
|
62
|
+
sort: null
|
|
62
63
|
};
|
|
63
64
|
function hasInitialListener(eventName) {
|
|
64
65
|
const instance = getCurrentInstance();
|
|
@@ -79,6 +80,13 @@ var ganttChartProps = {
|
|
|
79
80
|
showCriticalPath: { type: Boolean, default: void 0 },
|
|
80
81
|
showBaseline: { type: Boolean, default: void 0 },
|
|
81
82
|
showDeadlines: { type: Boolean, default: void 0 },
|
|
83
|
+
/** hover tooltip on task bars, defaults to true. A floating, CSS-customizable element (`.gantt-tooltip`) - not the browser's native title tooltip. */
|
|
84
|
+
showTooltip: { type: Boolean, default: void 0 },
|
|
85
|
+
/** fully control tooltip content/markup; return null/undefined to suppress it for a specific task. Defaults to name/dates/progress/assignees/notes. */
|
|
86
|
+
renderTooltip: {
|
|
87
|
+
type: Function,
|
|
88
|
+
default: void 0
|
|
89
|
+
},
|
|
82
90
|
showAssigneeAvatars: { type: Boolean, default: void 0 },
|
|
83
91
|
enableHistory: { type: Boolean, default: void 0 },
|
|
84
92
|
keyboardAccessible: { type: Boolean, default: void 0 },
|
|
@@ -93,7 +101,13 @@ var ganttChartProps = {
|
|
|
93
101
|
/** a group task with no explicit `progress` gets a duration-weighted average of its children's progress instead of 0 */
|
|
94
102
|
autoRollupProgress: { type: Boolean, default: void 0 },
|
|
95
103
|
/** enables click/ctrl-click/shift-click multi-selection of task bars, and the handle's bulkShiftDates()/bulkDelete() */
|
|
96
|
-
selectable: { type: Boolean, default: void 0 }
|
|
104
|
+
selectable: { type: Boolean, default: void 0 },
|
|
105
|
+
/**
|
|
106
|
+
* Stretch (never shrink) the timeline to fill the container's width instead of leaving empty
|
|
107
|
+
* space - the common "short project at month/year zoom" or "just a few tasks" case. Off by
|
|
108
|
+
* default (a new chart's pixel layout shouldn't change for existing consumers who don't opt in).
|
|
109
|
+
*/
|
|
110
|
+
autoFitToViewport: { type: Boolean, default: void 0 }
|
|
97
111
|
};
|
|
98
112
|
var ganttChartEmits = {
|
|
99
113
|
"date-change": (_task, _start, _end) => true,
|
|
@@ -102,13 +116,15 @@ var ganttChartEmits = {
|
|
|
102
116
|
"dependency-remove": (_dep) => true,
|
|
103
117
|
"dependency-dblclick": (_dep) => true,
|
|
104
118
|
"task-click": (_task) => true,
|
|
119
|
+
"task-dblclick": (_task) => true,
|
|
105
120
|
"group-toggle": (_task, _collapsed) => true,
|
|
106
121
|
"context-menu": (_task, _evt) => true,
|
|
107
122
|
"task-create": (_task) => true,
|
|
108
123
|
"column-resize": (_columnId, _width) => true,
|
|
109
124
|
"column-reorder": (_order) => true,
|
|
110
125
|
"task-reorder": (_draggedTaskId, _targetTaskId, _position) => true,
|
|
111
|
-
"selection-change": (_taskIds) => true
|
|
126
|
+
"selection-change": (_taskIds) => true,
|
|
127
|
+
"sort-change": (_sort) => true
|
|
112
128
|
};
|
|
113
129
|
var GanttChart = defineComponent({
|
|
114
130
|
name: "GanttChart",
|
|
@@ -123,6 +139,7 @@ var GanttChart = defineComponent({
|
|
|
123
139
|
const wireColumnReorder = hasInitialListener("onColumnReorder");
|
|
124
140
|
const wireTaskReorder = hasInitialListener("onTaskReorder");
|
|
125
141
|
const wireDependencyDblClick = hasInitialListener("onDependencyDblClick");
|
|
142
|
+
const wireTaskDblClick = hasInitialListener("onTaskDblClick");
|
|
126
143
|
const getOptions = () => ({
|
|
127
144
|
viewMode: props.viewMode,
|
|
128
145
|
columns: props.columns,
|
|
@@ -136,6 +153,8 @@ var GanttChart = defineComponent({
|
|
|
136
153
|
showCriticalPath: props.showCriticalPath,
|
|
137
154
|
showBaseline: props.showBaseline,
|
|
138
155
|
showDeadlines: props.showDeadlines,
|
|
156
|
+
showTooltip: props.showTooltip,
|
|
157
|
+
renderTooltip: props.renderTooltip,
|
|
139
158
|
showAssigneeAvatars: props.showAssigneeAvatars,
|
|
140
159
|
enableHistory: props.enableHistory,
|
|
141
160
|
keyboardAccessible: props.keyboardAccessible,
|
|
@@ -147,12 +166,14 @@ var GanttChart = defineComponent({
|
|
|
147
166
|
markers: props.markers,
|
|
148
167
|
autoRollupProgress: props.autoRollupProgress,
|
|
149
168
|
selectable: props.selectable,
|
|
169
|
+
autoFitToViewport: props.autoFitToViewport,
|
|
150
170
|
onContextMenu: noop,
|
|
151
171
|
onTaskCreate: wireTaskCreate ? noop : void 0,
|
|
152
172
|
onColumnResize: wireColumnResize ? noop : void 0,
|
|
153
173
|
onColumnReorder: wireColumnReorder ? noop : void 0,
|
|
154
174
|
onTaskReorder: wireTaskReorder ? noop : void 0,
|
|
155
|
-
onDependencyDblClick: wireDependencyDblClick ? noop : void 0
|
|
175
|
+
onDependencyDblClick: wireDependencyDblClick ? noop : void 0,
|
|
176
|
+
onTaskDblClick: wireTaskDblClick ? noop : void 0
|
|
156
177
|
});
|
|
157
178
|
const { chart } = useGanttChart(
|
|
158
179
|
containerRef,
|
|
@@ -169,6 +190,7 @@ var GanttChart = defineComponent({
|
|
|
169
190
|
instance.on("dependency-remove", handleDependencyRemove);
|
|
170
191
|
instance.on("dependency-dblclick", handleDependencyDblClick);
|
|
171
192
|
instance.on("task-click", handleTaskClick);
|
|
193
|
+
instance.on("task-dblclick", handleTaskDblClick);
|
|
172
194
|
instance.on("group-toggle", handleGroupToggle);
|
|
173
195
|
instance.on("context-menu", handleContextMenu);
|
|
174
196
|
instance.on("task-create", handleTaskCreate);
|
|
@@ -176,6 +198,7 @@ var GanttChart = defineComponent({
|
|
|
176
198
|
instance.on("column-reorder", handleColumnReorder);
|
|
177
199
|
instance.on("task-reorder", handleTaskReorder);
|
|
178
200
|
instance.on("selection-change", handleSelectionChange);
|
|
201
|
+
instance.on("sort-change", handleSortChange);
|
|
179
202
|
onCleanup(() => {
|
|
180
203
|
instance.off("date-change", handleDateChange);
|
|
181
204
|
instance.off("progress-change", handleProgressChange);
|
|
@@ -183,6 +206,7 @@ var GanttChart = defineComponent({
|
|
|
183
206
|
instance.off("dependency-remove", handleDependencyRemove);
|
|
184
207
|
instance.off("dependency-dblclick", handleDependencyDblClick);
|
|
185
208
|
instance.off("task-click", handleTaskClick);
|
|
209
|
+
instance.off("task-dblclick", handleTaskDblClick);
|
|
186
210
|
instance.off("group-toggle", handleGroupToggle);
|
|
187
211
|
instance.off("context-menu", handleContextMenu);
|
|
188
212
|
instance.off("task-create", handleTaskCreate);
|
|
@@ -190,6 +214,7 @@ var GanttChart = defineComponent({
|
|
|
190
214
|
instance.off("column-reorder", handleColumnReorder);
|
|
191
215
|
instance.off("task-reorder", handleTaskReorder);
|
|
192
216
|
instance.off("selection-change", handleSelectionChange);
|
|
217
|
+
instance.off("sort-change", handleSortChange);
|
|
193
218
|
});
|
|
194
219
|
}, { flush: "sync" });
|
|
195
220
|
function handleDateChange(p) {
|
|
@@ -210,6 +235,9 @@ var GanttChart = defineComponent({
|
|
|
210
235
|
function handleTaskClick(p) {
|
|
211
236
|
emit("task-click", p.task);
|
|
212
237
|
}
|
|
238
|
+
function handleTaskDblClick(p) {
|
|
239
|
+
emit("task-dblclick", p.task);
|
|
240
|
+
}
|
|
213
241
|
function handleGroupToggle(p) {
|
|
214
242
|
emit("group-toggle", p.task, p.collapsed);
|
|
215
243
|
}
|
|
@@ -231,6 +259,9 @@ var GanttChart = defineComponent({
|
|
|
231
259
|
function handleSelectionChange(p) {
|
|
232
260
|
emit("selection-change", p.taskIds);
|
|
233
261
|
}
|
|
262
|
+
function handleSortChange(p) {
|
|
263
|
+
emit("sort-change", p.sort);
|
|
264
|
+
}
|
|
234
265
|
onBeforeUnmount2(() => {
|
|
235
266
|
containerRef.value = null;
|
|
236
267
|
});
|
|
@@ -261,6 +292,8 @@ var GanttChart = defineComponent({
|
|
|
261
292
|
selectAllVisible: () => chart.value?.selectAllVisible(),
|
|
262
293
|
clearSelection: () => chart.value?.clearSelection(),
|
|
263
294
|
getSelectedTaskIds: () => chart.value?.getSelectedTaskIds() ?? [],
|
|
295
|
+
setSort: (columnId, direction) => chart.value?.setSort(columnId, direction),
|
|
296
|
+
getSort: () => chart.value?.getSort() ?? null,
|
|
264
297
|
bulkShiftDates: (deltaMs) => chart.value?.bulkShiftDates(deltaMs),
|
|
265
298
|
bulkDelete: () => chart.value?.bulkDelete(),
|
|
266
299
|
toSVGString: () => chart.value?.toSVGString() ?? "",
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/GanttChart.ts","../src/useGanttChart.ts","../src/index.ts"],"sourcesContent":["// Pulls in the core's default styles so consumers get a working chart out of the box.\n// This resolves through gantt-core's package.json \"exports\" map (\"./styles.css\" -> \"./dist/styles.css\").\n// If your bundler can't resolve CSS imports from a dependency's export map, import it yourself instead:\n// import \"@ganttloom/gantt-core/styles.css\";\nimport \"@ganttloom/gantt-core/styles.css\";\n\nimport {\n defineComponent,\n getCurrentInstance,\n h,\n onBeforeUnmount,\n ref,\n watch,\n type ExtractPropTypes,\n type PropType,\n} from \"vue\";\nimport type {\n GanttChart as GanttCore,\n GanttColumn,\n GanttDependency,\n GanttMarker,\n GanttOptions,\n GanttRenderModel,\n GanttTask,\n GanttTheme,\n ResourceHistogramOptions,\n ResourceLoadBucket,\n ResourceLevelingOptions,\n ResourceLevelingResult,\n ViewMode,\n WorkingCalendar,\n} from \"@ganttloom/gantt-core\";\nimport { useGanttChart } from \"./useGanttChart\";\n\n/** Imperative escape hatches, available via a template ref (see the package README). */\nexport interface GanttChartHandle {\n undo(): void;\n redo(): void;\n canUndo(): boolean;\n canRedo(): boolean;\n expandAll(): void;\n collapseAll(): void;\n toggleGroup(taskId: string): void;\n removeDependency(fromId: string, toId: string): void;\n updateDependency(fromId: string, toId: string, partial: Partial<GanttDependency>): void;\n updateTask(id: string, partial: Partial<GanttTask>): void;\n setViewMode(mode: ViewMode): void;\n fitToViewport(containerWidthPx: number): void;\n scrollToToday(): void;\n scrollToRangeStart(): void;\n scrollToRangeEnd(): void;\n getPageCount(): number;\n setPage(page: number): void;\n zoomIn(factor?: number): void;\n zoomOut(factor?: number): void;\n getZoomLevel(): number;\n getResourceHistogram(options?: ResourceHistogramOptions): ResourceLoadBucket[];\n getLeveledTasks(options?: ResourceLevelingOptions): ResourceLevelingResult;\n selectTask(id: string, options?: { additive?: boolean }): void;\n selectAllVisible(): void;\n clearSelection(): void;\n getSelectedTaskIds(): string[];\n bulkShiftDates(deltaMs: number): void;\n bulkDelete(): void;\n toSVGString(): string;\n toPNGDataURL(): Promise<string>;\n toPNGDataURLs(options?: { pageWidthPx?: number; pageHeightPx?: number }): Promise<string[]>;\n getRenderModel(): GanttRenderModel | null;\n /** Direct access to the underlying framework-agnostic core instance (null before mount). */\n getInstance(): GanttCore | null;\n}\n\nconst EMPTY_RENDER_MODEL: GanttRenderModel = {\n width: 0,\n height: 0,\n rowHeight: 0,\n headerHeight: 0,\n rows: [],\n bars: [],\n links: [],\n ticks: [],\n columns: [],\n theme: {} as GanttTheme,\n markers: [],\n rangeStart: new Date(0),\n};\n\n/**\n * Checks whether the parent actually bound a listener for `eventName` (e.g. \"onTaskCreate\")\n * on this component's *initial* vnode. A handful of gantt-core options only wire up their\n * DOM interaction (drag-to-create, column resize/reorder, dependency double-click, context\n * menu) when the corresponding callback is truthy AT CONSTRUCTION TIME — so a stable no-op\n * is passed there to force the wiring on, and the real dispatch goes through the reactive\n * \"task-create\" etc. event subscription below instead. Reading `vnode.props` (rather than a\n * declared prop/emit) is what lets this stay accurate for both `@task-create=\"...\"` template\n * listeners and a plain `onTaskCreate` prop, without needing the caller to pass anything else.\n */\nfunction hasInitialListener(eventName: string): boolean {\n const instance = getCurrentInstance();\n return !!(instance?.vnode.props && eventName in instance.vnode.props);\n}\n\nconst ganttChartProps = {\n tasks: { type: Array as PropType<GanttTask[]>, required: true },\n dependencies: { type: Array as PropType<GanttDependency[]>, default: () => [] },\n viewMode: { type: String as PropType<ViewMode>, default: undefined },\n columns: { type: Array as PropType<GanttColumn[]>, default: undefined },\n theme: { type: Object as PropType<Partial<GanttTheme>>, default: undefined },\n colorScheme: { type: String as PropType<\"light\" | \"dark\" | \"auto\">, default: undefined },\n columnWidth: { type: Number, default: undefined },\n readonly: { type: Boolean, default: undefined },\n showProgress: { type: Boolean, default: undefined },\n showDependencies: { type: Boolean, default: undefined },\n gridPanelWidth: { type: Number, default: undefined },\n showCriticalPath: { type: Boolean, default: undefined },\n showBaseline: { type: Boolean, default: undefined },\n showDeadlines: { type: Boolean, default: undefined },\n showAssigneeAvatars: { type: Boolean, default: undefined },\n enableHistory: { type: Boolean, default: undefined },\n keyboardAccessible: { type: Boolean, default: undefined },\n virtualScroll: { type: Boolean, default: undefined },\n autoSchedule: { type: Boolean, default: undefined },\n pagination: { type: Object as PropType<{ pageSize: number; page: number }>, default: undefined },\n snapToUnit: { type: [String, Boolean] as PropType<\"hour\" | \"day\" | \"week\" | false>, default: undefined },\n /** working-day/holiday definition used to shade non-working time and (with autoSchedule) skip it when cascading */\n calendar: { type: Object as PropType<WorkingCalendar>, default: undefined },\n /** arbitrary labeled vertical lines on the timeline, independent of any task */\n markers: { type: Array as PropType<GanttMarker[]>, default: undefined },\n /** a group task with no explicit `progress` gets a duration-weighted average of its children's progress instead of 0 */\n autoRollupProgress: { type: Boolean, default: undefined },\n /** enables click/ctrl-click/shift-click multi-selection of task bars, and the handle's bulkShiftDates()/bulkDelete() */\n selectable: { type: Boolean, default: undefined },\n} as const;\n\nexport type GanttChartProps = ExtractPropTypes<typeof ganttChartProps>;\n\nconst ganttChartEmits = {\n \"date-change\": (_task: GanttTask, _start: Date, _end: Date) => true,\n \"progress-change\": (_task: GanttTask, _progress: number) => true,\n \"dependency-create\": (_dep: GanttDependency) => true,\n \"dependency-remove\": (_dep: GanttDependency) => true,\n \"dependency-dblclick\": (_dep: GanttDependency) => true,\n \"task-click\": (_task: GanttTask) => true,\n \"group-toggle\": (_task: GanttTask, _collapsed: boolean) => true,\n \"context-menu\": (_task: GanttTask, _evt: PointerEvent) => true,\n \"task-create\": (_task: GanttTask) => true,\n \"column-resize\": (_columnId: string, _width: number) => true,\n \"column-reorder\": (_order: string[]) => true,\n \"task-reorder\": (\n _draggedTaskId: string,\n _targetTaskId: string,\n _position: \"before\" | \"after\" | \"inside\"\n ) => true,\n \"selection-change\": (_taskIds: string[]) => true,\n};\n\nexport const GanttChart = defineComponent({\n name: \"GanttChart\",\n props: ganttChartProps,\n emits: ganttChartEmits,\n setup(props, { emit, expose }) {\n const containerRef = ref<HTMLElement | null>(null);\n const noop = () => {};\n\n // See hasInitialListener's doc comment: these five only affect whether gantt-core wires\n // up the relevant DOM interaction at construction, and are captured once, up front.\n // onContextMenu is deliberately always wired (unlike the other five) so right-click\n // handling works out of the box even for consumers who haven't attached a listener.\n const wireTaskCreate = hasInitialListener(\"onTaskCreate\");\n const wireColumnResize = hasInitialListener(\"onColumnResize\");\n const wireColumnReorder = hasInitialListener(\"onColumnReorder\");\n const wireTaskReorder = hasInitialListener(\"onTaskReorder\");\n const wireDependencyDblClick = hasInitialListener(\"onDependencyDblClick\");\n\n // gantt-core invokes every one of these seven callbacks from a call site that ALSO\n // unconditionally emits the matching public event (\"date-change\", \"selection-change\", ...).\n // So none of them belong in `options` below — doing that would fire the Vue listener\n // twice per event, once here and once through the chart.on(...) subscription further down.\n // options only ever needs: (a) the six gate-a-DOM-feature callbacks, as stable no-ops/undefined\n // purely to control wiring, and (b) everything else, which is plain reactive config.\n const getOptions = (): GanttOptions => ({\n viewMode: props.viewMode,\n columns: props.columns,\n theme: props.theme,\n colorScheme: props.colorScheme,\n columnWidth: props.columnWidth,\n readonly: props.readonly,\n showProgress: props.showProgress,\n showDependencies: props.showDependencies,\n gridPanelWidth: props.gridPanelWidth,\n showCriticalPath: props.showCriticalPath,\n showBaseline: props.showBaseline,\n showDeadlines: props.showDeadlines,\n showAssigneeAvatars: props.showAssigneeAvatars,\n enableHistory: props.enableHistory,\n keyboardAccessible: props.keyboardAccessible,\n virtualScroll: props.virtualScroll,\n autoSchedule: props.autoSchedule,\n pagination: props.pagination,\n snapToUnit: props.snapToUnit,\n calendar: props.calendar,\n markers: props.markers,\n autoRollupProgress: props.autoRollupProgress,\n selectable: props.selectable,\n onContextMenu: noop,\n onTaskCreate: wireTaskCreate ? noop : undefined,\n onColumnResize: wireColumnResize ? noop : undefined,\n onColumnReorder: wireColumnReorder ? noop : undefined,\n onTaskReorder: wireTaskReorder ? noop : undefined,\n onDependencyDblClick: wireDependencyDblClick ? noop : undefined,\n });\n\n const { chart } = useGanttChart(\n containerRef,\n () => props.tasks,\n () => props.dependencies,\n getOptions\n );\n\n // getOptions() builds a fresh object every call, so this only re-syncs gantt-core's\n // options when one of the reactive prop values it reads actually changed.\n watch(getOptions, (options) => chart.value?.setOptions(options));\n\n // All real event dispatch goes through the chart's public emitter — set up once when the\n // instance appears. `emit` is stable for the component's lifetime, so (unlike the React\n // wrapper's ref-of-latest-callback dance) there's no need to guard against re-subscribing.\n watch(chart, (instance, _prev, onCleanup) => {\n if (!instance) return;\n instance.on(\"date-change\", handleDateChange);\n instance.on(\"progress-change\", handleProgressChange);\n instance.on(\"dependency-create\", handleDependencyCreate);\n instance.on(\"dependency-remove\", handleDependencyRemove);\n instance.on(\"dependency-dblclick\", handleDependencyDblClick);\n instance.on(\"task-click\", handleTaskClick);\n instance.on(\"group-toggle\", handleGroupToggle);\n instance.on(\"context-menu\", handleContextMenu);\n instance.on(\"task-create\", handleTaskCreate);\n instance.on(\"column-resize\", handleColumnResize);\n instance.on(\"column-reorder\", handleColumnReorder);\n instance.on(\"task-reorder\", handleTaskReorder);\n instance.on(\"selection-change\", handleSelectionChange);\n onCleanup(() => {\n instance.off(\"date-change\", handleDateChange);\n instance.off(\"progress-change\", handleProgressChange);\n instance.off(\"dependency-create\", handleDependencyCreate);\n instance.off(\"dependency-remove\", handleDependencyRemove);\n instance.off(\"dependency-dblclick\", handleDependencyDblClick);\n instance.off(\"task-click\", handleTaskClick);\n instance.off(\"group-toggle\", handleGroupToggle);\n instance.off(\"context-menu\", handleContextMenu);\n instance.off(\"task-create\", handleTaskCreate);\n instance.off(\"column-resize\", handleColumnResize);\n instance.off(\"column-reorder\", handleColumnReorder);\n instance.off(\"task-reorder\", handleTaskReorder);\n instance.off(\"selection-change\", handleSelectionChange);\n });\n }, { flush: \"sync\" }); // synchronous: chart.value is set inside useGanttChart's onMounted,\n // and listeners must be attached before that same tick's synchronous code (e.g. a ref call\n // right after mount) can trigger an event — Vue's default 'pre' flush would run this a tick late.\n\n function handleDateChange(p: { task: GanttTask; start: Date; end: Date }) {\n emit(\"date-change\", p.task, p.start, p.end);\n }\n function handleProgressChange(p: { task: GanttTask; progress: number }) {\n emit(\"progress-change\", p.task, p.progress);\n }\n function handleDependencyCreate(dep: GanttDependency) {\n emit(\"dependency-create\", dep);\n }\n function handleDependencyRemove(dep: GanttDependency) {\n emit(\"dependency-remove\", dep);\n }\n function handleDependencyDblClick(dep: GanttDependency) {\n emit(\"dependency-dblclick\", dep);\n }\n function handleTaskClick(p: { task: GanttTask }) {\n emit(\"task-click\", p.task);\n }\n function handleGroupToggle(p: { task: GanttTask; collapsed: boolean }) {\n emit(\"group-toggle\", p.task, p.collapsed);\n }\n function handleContextMenu(p: { task: GanttTask; evt: PointerEvent }) {\n emit(\"context-menu\", p.task, p.evt);\n }\n function handleTaskCreate(p: { task: GanttTask }) {\n emit(\"task-create\", p.task);\n }\n function handleColumnResize(p: { columnId: string; width: number }) {\n emit(\"column-resize\", p.columnId, p.width);\n }\n function handleColumnReorder(p: { order: string[] }) {\n emit(\"column-reorder\", p.order);\n }\n function handleTaskReorder(p: {\n draggedTaskId: string;\n targetTaskId: string;\n position: \"before\" | \"after\" | \"inside\";\n }) {\n emit(\"task-reorder\", p.draggedTaskId, p.targetTaskId, p.position);\n }\n function handleSelectionChange(p: { taskIds: string[] }) {\n emit(\"selection-change\", p.taskIds);\n }\n\n onBeforeUnmount(() => {\n containerRef.value = null;\n });\n\n const handle: GanttChartHandle = {\n undo: () => chart.value?.undo(),\n redo: () => chart.value?.redo(),\n canUndo: () => chart.value?.canUndo ?? false,\n canRedo: () => chart.value?.canRedo ?? false,\n expandAll: () => chart.value?.expandAll(),\n collapseAll: () => chart.value?.collapseAll(),\n toggleGroup: (taskId) => chart.value?.toggleGroup(taskId),\n removeDependency: (fromId, toId) => chart.value?.removeDependency(fromId, toId),\n updateDependency: (fromId, toId, partial) => chart.value?.updateDependency(fromId, toId, partial),\n updateTask: (id, partial) => chart.value?.updateTask(id, partial),\n setViewMode: (mode) => chart.value?.setViewMode(mode),\n fitToViewport: (containerWidthPx) => chart.value?.fitToViewport(containerWidthPx),\n scrollToToday: () => chart.value?.scrollToToday(),\n scrollToRangeStart: () => chart.value?.scrollToRangeStart(),\n scrollToRangeEnd: () => chart.value?.scrollToRangeEnd(),\n getPageCount: () => chart.value?.getPageCount() ?? 1,\n setPage: (page) => chart.value?.setPage(page),\n zoomIn: (factor) => chart.value?.zoomIn(factor),\n zoomOut: (factor) => chart.value?.zoomOut(factor),\n getZoomLevel: () => chart.value?.getZoomLevel() ?? 0,\n getResourceHistogram: (options) => chart.value?.getResourceHistogram(options) ?? [],\n getLeveledTasks: (options) => chart.value?.getLeveledTasks(options) ?? { tasks: [], shifted: [] },\n selectTask: (id, options) => chart.value?.selectTask(id, options),\n selectAllVisible: () => chart.value?.selectAllVisible(),\n clearSelection: () => chart.value?.clearSelection(),\n getSelectedTaskIds: () => chart.value?.getSelectedTaskIds() ?? [],\n bulkShiftDates: (deltaMs) => chart.value?.bulkShiftDates(deltaMs),\n bulkDelete: () => chart.value?.bulkDelete(),\n toSVGString: () => chart.value?.toSVGString() ?? \"\",\n toPNGDataURL: () => chart.value?.toPNGDataURL() ?? Promise.resolve(\"\"),\n toPNGDataURLs: (options) => chart.value?.toPNGDataURLs(options) ?? Promise.resolve([]),\n getRenderModel: () => chart.value?.getRenderModel() ?? EMPTY_RENDER_MODEL,\n getInstance: () => chart.value,\n };\n expose(handle);\n\n // A single root element: class/style attrs fall through onto it automatically.\n return () => h(\"div\", { ref: containerRef });\n },\n});\n\nexport default GanttChart;\n","import { onBeforeUnmount, onMounted, shallowRef, watch, type Ref, type ShallowRef } from \"vue\";\nimport { GanttChart as GanttCore } from \"@ganttloom/gantt-core\";\nimport type { GanttDependency, GanttOptions, GanttTask } from \"@ganttloom/gantt-core\";\n\nexport interface UseGanttChartResult {\n /** The underlying framework-agnostic GanttChart instance, or null before the mount effect runs. */\n chart: ShallowRef<GanttCore | null>;\n /** Reactive, subscribed to the core's \"history-change\" event. Only meaningful when `enableHistory` is set in options. */\n canUndo: Ref<boolean>;\n /** Reactive, subscribed to the core's \"history-change\" event. Only meaningful when `enableHistory` is set in options. */\n canRedo: Ref<boolean>;\n}\n\n/**\n * Lower-level escape hatch for consumers who want to own their own container element\n * and DOM tree instead of using the <GanttChart /> component. Constructs a\n * @ganttloom/gantt-core GanttChart instance against `containerRef.value` on mount,\n * keeps it in sync with the tasks/dependencies/options getters via setTasks / setDependencies /\n * setOptions (reference-equality checks only — return a new array/object to trigger a sync),\n * and destroys it on unmount.\n *\n * `getTasks`/`getDependencies`/`getOptions` are plain functions (not refs) so this composable\n * can track whatever reactive source each one reads — a prop, a ref, a computed — without\n * imposing a shape on the caller.\n */\nexport function useGanttChart(\n containerRef: Ref<HTMLElement | null>,\n getTasks: () => GanttTask[],\n getDependencies: () => GanttDependency[],\n getOptions: () => GanttOptions\n): UseGanttChartResult {\n const chart = shallowRef<GanttCore | null>(null);\n const canUndo = shallowRef(false);\n const canRedo = shallowRef(false);\n\n let onHistoryChange: ((state: { canUndo: boolean; canRedo: boolean }) => void) | undefined;\n\n onMounted(() => {\n const container = containerRef.value;\n if (!container) return;\n\n const instance = new GanttCore(container, getTasks(), getDependencies(), getOptions());\n chart.value = instance;\n canUndo.value = instance.canUndo;\n canRedo.value = instance.canRedo;\n\n onHistoryChange = (state) => {\n canUndo.value = state.canUndo;\n canRedo.value = state.canRedo;\n };\n instance.on(\"history-change\", onHistoryChange);\n });\n\n onBeforeUnmount(() => {\n const instance = chart.value;\n if (!instance) return;\n if (onHistoryChange) instance.off(\"history-change\", onHistoryChange);\n instance.destroy();\n chart.value = null;\n canUndo.value = false;\n canRedo.value = false;\n });\n\n // Non-immediate: the initial values were already passed to the constructor above,\n // so these only need to fire on subsequent changes.\n watch(getTasks, (tasks) => chart.value?.setTasks(tasks));\n watch(getDependencies, (deps) => chart.value?.setDependencies(deps));\n watch(getOptions, (options) => chart.value?.setOptions(options));\n\n return { chart, canUndo, canRedo };\n}\n","export { GanttChart, default } from \"./GanttChart\";\nexport type { GanttChartProps, GanttChartHandle } from \"./GanttChart\";\n\nexport { useGanttChart } from \"./useGanttChart\";\nexport type { UseGanttChartResult } from \"./useGanttChart\";\n\n// Re-exported so consumers never need to add @ganttloom/gantt-core as a direct\n// dependency just to reference its types.\nexport type {\n ViewMode,\n DependencyType,\n GanttDependency,\n GanttAssignee,\n GanttTask,\n GanttColumn,\n GanttTheme,\n GanttRenderRow,\n GanttRenderBar,\n GanttRenderLink,\n GanttRenderTick,\n GanttRenderModel,\n GanttOptions,\n GanttEventMap,\n WorkingCalendar,\n ConstraintType,\n ResourceHistogramOptions,\n ResourceLoadBucket,\n GanttMarker,\n GanttRenderMarker,\n FilterTasksOptions,\n FilterTasksResult,\n Density,\n ResourceLevelingOptions,\n ResourceLevelingResult,\n} from \"@ganttloom/gantt-core\";\n\nexport {\n computeWBSCodes,\n applyConstraint,\n isWorkingDay,\n isHoliday,\n isWithinWorkingHours,\n isWorkingTime,\n nextWorkingDay,\n previousWorkingDay,\n shiftToWorkingDay,\n shiftToWorkingTime,\n computeResourceHistogram,\n renderResourceHistogramSVG,\n filterTasks,\n colorByField,\n applyColorByField,\n DEFAULT_PALETTE,\n DENSITY_PRESETS,\n levelResources,\n} from \"@ganttloom/gantt-core\";\n"],"mappings":"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","names":["onBeforeUnmount","watch","watch","onBeforeUnmount"]}
|
|
1
|
+
{"version":3,"sources":["../src/GanttChart.ts","../src/useGanttChart.ts","../src/index.ts"],"sourcesContent":["// Pulls in the core's default styles so consumers get a working chart out of the box.\n// This resolves through gantt-core's package.json \"exports\" map (\"./styles.css\" -> \"./dist/styles.css\").\n// If your bundler can't resolve CSS imports from a dependency's export map, import it yourself instead:\n// import \"@ganttloom/gantt-core/styles.css\";\nimport \"@ganttloom/gantt-core/styles.css\";\n\nimport {\n defineComponent,\n getCurrentInstance,\n h,\n onBeforeUnmount,\n ref,\n watch,\n type ExtractPropTypes,\n type PropType,\n} from \"vue\";\nimport type {\n GanttChart as GanttCore,\n GanttColumn,\n GanttDependency,\n GanttMarker,\n GanttOptions,\n GanttRenderModel,\n GanttTask,\n GanttTheme,\n ResourceHistogramOptions,\n ResourceLoadBucket,\n ResourceLevelingOptions,\n ResourceLevelingResult,\n ViewMode,\n WorkingCalendar,\n} from \"@ganttloom/gantt-core\";\nimport { useGanttChart } from \"./useGanttChart\";\n\n/** Imperative escape hatches, available via a template ref (see the package README). */\nexport interface GanttChartHandle {\n undo(): void;\n redo(): void;\n canUndo(): boolean;\n canRedo(): boolean;\n expandAll(): void;\n collapseAll(): void;\n toggleGroup(taskId: string): void;\n removeDependency(fromId: string, toId: string): void;\n updateDependency(fromId: string, toId: string, partial: Partial<GanttDependency>): void;\n updateTask(id: string, partial: Partial<GanttTask>): void;\n setViewMode(mode: ViewMode): void;\n fitToViewport(containerWidthPx: number): void;\n scrollToToday(): void;\n scrollToRangeStart(): void;\n scrollToRangeEnd(): void;\n getPageCount(): number;\n setPage(page: number): void;\n zoomIn(factor?: number): void;\n zoomOut(factor?: number): void;\n getZoomLevel(): number;\n getResourceHistogram(options?: ResourceHistogramOptions): ResourceLoadBucket[];\n getLeveledTasks(options?: ResourceLevelingOptions): ResourceLevelingResult;\n selectTask(id: string, options?: { additive?: boolean }): void;\n selectAllVisible(): void;\n clearSelection(): void;\n getSelectedTaskIds(): string[];\n setSort(columnId: string | null, direction?: \"asc\" | \"desc\" | null): void;\n getSort(): { columnId: string; direction: \"asc\" | \"desc\" } | null;\n bulkShiftDates(deltaMs: number): void;\n bulkDelete(): void;\n toSVGString(): string;\n toPNGDataURL(): Promise<string>;\n toPNGDataURLs(options?: { pageWidthPx?: number; pageHeightPx?: number }): Promise<string[]>;\n getRenderModel(): GanttRenderModel | null;\n /** Direct access to the underlying framework-agnostic core instance (null before mount). */\n getInstance(): GanttCore | null;\n}\n\nconst EMPTY_RENDER_MODEL: GanttRenderModel = {\n width: 0,\n height: 0,\n rowHeight: 0,\n headerHeight: 0,\n rows: [],\n bars: [],\n links: [],\n ticks: [],\n columns: [],\n theme: {} as GanttTheme,\n markers: [],\n rangeStart: new Date(0),\n sort: null,\n};\n\n/**\n * Checks whether the parent actually bound a listener for `eventName` (e.g. \"onTaskCreate\")\n * on this component's *initial* vnode. A handful of gantt-core options only wire up their\n * DOM interaction (drag-to-create, column resize/reorder, dependency double-click, context\n * menu) when the corresponding callback is truthy AT CONSTRUCTION TIME — so a stable no-op\n * is passed there to force the wiring on, and the real dispatch goes through the reactive\n * \"task-create\" etc. event subscription below instead. Reading `vnode.props` (rather than a\n * declared prop/emit) is what lets this stay accurate for both `@task-create=\"...\"` template\n * listeners and a plain `onTaskCreate` prop, without needing the caller to pass anything else.\n */\nfunction hasInitialListener(eventName: string): boolean {\n const instance = getCurrentInstance();\n return !!(instance?.vnode.props && eventName in instance.vnode.props);\n}\n\nconst ganttChartProps = {\n tasks: { type: Array as PropType<GanttTask[]>, required: true },\n dependencies: { type: Array as PropType<GanttDependency[]>, default: () => [] },\n viewMode: { type: String as PropType<ViewMode>, default: undefined },\n columns: { type: Array as PropType<GanttColumn[]>, default: undefined },\n theme: { type: Object as PropType<Partial<GanttTheme>>, default: undefined },\n colorScheme: { type: String as PropType<\"light\" | \"dark\" | \"auto\">, default: undefined },\n columnWidth: { type: Number, default: undefined },\n readonly: { type: Boolean, default: undefined },\n showProgress: { type: Boolean, default: undefined },\n showDependencies: { type: Boolean, default: undefined },\n gridPanelWidth: { type: Number, default: undefined },\n showCriticalPath: { type: Boolean, default: undefined },\n showBaseline: { type: Boolean, default: undefined },\n showDeadlines: { type: Boolean, default: undefined },\n /** hover tooltip on task bars, defaults to true. A floating, CSS-customizable element (`.gantt-tooltip`) - not the browser's native title tooltip. */\n showTooltip: { type: Boolean, default: undefined },\n /** fully control tooltip content/markup; return null/undefined to suppress it for a specific task. Defaults to name/dates/progress/assignees/notes. */\n renderTooltip: {\n type: Function as PropType<(task: GanttTask) => HTMLElement | string | null | undefined>,\n default: undefined,\n },\n showAssigneeAvatars: { type: Boolean, default: undefined },\n enableHistory: { type: Boolean, default: undefined },\n keyboardAccessible: { type: Boolean, default: undefined },\n virtualScroll: { type: Boolean, default: undefined },\n autoSchedule: { type: Boolean, default: undefined },\n pagination: { type: Object as PropType<{ pageSize: number; page: number }>, default: undefined },\n snapToUnit: { type: [String, Boolean] as PropType<\"hour\" | \"day\" | \"week\" | false>, default: undefined },\n /** working-day/holiday definition used to shade non-working time and (with autoSchedule) skip it when cascading */\n calendar: { type: Object as PropType<WorkingCalendar>, default: undefined },\n /** arbitrary labeled vertical lines on the timeline, independent of any task */\n markers: { type: Array as PropType<GanttMarker[]>, default: undefined },\n /** a group task with no explicit `progress` gets a duration-weighted average of its children's progress instead of 0 */\n autoRollupProgress: { type: Boolean, default: undefined },\n /** enables click/ctrl-click/shift-click multi-selection of task bars, and the handle's bulkShiftDates()/bulkDelete() */\n selectable: { type: Boolean, default: undefined },\n /**\n * Stretch (never shrink) the timeline to fill the container's width instead of leaving empty\n * space - the common \"short project at month/year zoom\" or \"just a few tasks\" case. Off by\n * default (a new chart's pixel layout shouldn't change for existing consumers who don't opt in).\n */\n autoFitToViewport: { type: Boolean, default: undefined },\n} as const;\n\nexport type GanttChartProps = ExtractPropTypes<typeof ganttChartProps>;\n\nconst ganttChartEmits = {\n \"date-change\": (_task: GanttTask, _start: Date, _end: Date) => true,\n \"progress-change\": (_task: GanttTask, _progress: number) => true,\n \"dependency-create\": (_dep: GanttDependency) => true,\n \"dependency-remove\": (_dep: GanttDependency) => true,\n \"dependency-dblclick\": (_dep: GanttDependency) => true,\n \"task-click\": (_task: GanttTask) => true,\n \"task-dblclick\": (_task: GanttTask) => true,\n \"group-toggle\": (_task: GanttTask, _collapsed: boolean) => true,\n \"context-menu\": (_task: GanttTask, _evt: PointerEvent) => true,\n \"task-create\": (_task: GanttTask) => true,\n \"column-resize\": (_columnId: string, _width: number) => true,\n \"column-reorder\": (_order: string[]) => true,\n \"task-reorder\": (\n _draggedTaskId: string,\n _targetTaskId: string,\n _position: \"before\" | \"after\" | \"inside\"\n ) => true,\n \"selection-change\": (_taskIds: string[]) => true,\n \"sort-change\": (_sort: { columnId: string; direction: \"asc\" | \"desc\" } | null) => true,\n};\n\nexport const GanttChart = defineComponent({\n name: \"GanttChart\",\n props: ganttChartProps,\n emits: ganttChartEmits,\n setup(props, { emit, expose }) {\n const containerRef = ref<HTMLElement | null>(null);\n const noop = () => {};\n\n // See hasInitialListener's doc comment: these six only affect whether gantt-core wires\n // up the relevant DOM interaction at construction, and are captured once, up front.\n // onContextMenu is deliberately always wired (unlike the other six) so right-click\n // handling works out of the box even for consumers who haven't attached a listener.\n const wireTaskCreate = hasInitialListener(\"onTaskCreate\");\n const wireColumnResize = hasInitialListener(\"onColumnResize\");\n const wireColumnReorder = hasInitialListener(\"onColumnReorder\");\n const wireTaskReorder = hasInitialListener(\"onTaskReorder\");\n const wireDependencyDblClick = hasInitialListener(\"onDependencyDblClick\");\n const wireTaskDblClick = hasInitialListener(\"onTaskDblClick\");\n\n // gantt-core invokes every one of these seven callbacks from a call site that ALSO\n // unconditionally emits the matching public event (\"date-change\", \"selection-change\", ...).\n // So none of them belong in `options` below — doing that would fire the Vue listener\n // twice per event, once here and once through the chart.on(...) subscription further down.\n // options only ever needs: (a) the six gate-a-DOM-feature callbacks, as stable no-ops/undefined\n // purely to control wiring, and (b) everything else, which is plain reactive config.\n const getOptions = (): GanttOptions => ({\n viewMode: props.viewMode,\n columns: props.columns,\n theme: props.theme,\n colorScheme: props.colorScheme,\n columnWidth: props.columnWidth,\n readonly: props.readonly,\n showProgress: props.showProgress,\n showDependencies: props.showDependencies,\n gridPanelWidth: props.gridPanelWidth,\n showCriticalPath: props.showCriticalPath,\n showBaseline: props.showBaseline,\n showDeadlines: props.showDeadlines,\n showTooltip: props.showTooltip,\n renderTooltip: props.renderTooltip,\n showAssigneeAvatars: props.showAssigneeAvatars,\n enableHistory: props.enableHistory,\n keyboardAccessible: props.keyboardAccessible,\n virtualScroll: props.virtualScroll,\n autoSchedule: props.autoSchedule,\n pagination: props.pagination,\n snapToUnit: props.snapToUnit,\n calendar: props.calendar,\n markers: props.markers,\n autoRollupProgress: props.autoRollupProgress,\n selectable: props.selectable,\n autoFitToViewport: props.autoFitToViewport,\n onContextMenu: noop,\n onTaskCreate: wireTaskCreate ? noop : undefined,\n onColumnResize: wireColumnResize ? noop : undefined,\n onColumnReorder: wireColumnReorder ? noop : undefined,\n onTaskReorder: wireTaskReorder ? noop : undefined,\n onDependencyDblClick: wireDependencyDblClick ? noop : undefined,\n onTaskDblClick: wireTaskDblClick ? noop : undefined,\n });\n\n const { chart } = useGanttChart(\n containerRef,\n () => props.tasks,\n () => props.dependencies,\n getOptions\n );\n\n // getOptions() builds a fresh object every call, so this only re-syncs gantt-core's\n // options when one of the reactive prop values it reads actually changed.\n watch(getOptions, (options) => chart.value?.setOptions(options));\n\n // All real event dispatch goes through the chart's public emitter — set up once when the\n // instance appears. `emit` is stable for the component's lifetime, so (unlike the React\n // wrapper's ref-of-latest-callback dance) there's no need to guard against re-subscribing.\n watch(chart, (instance, _prev, onCleanup) => {\n if (!instance) return;\n instance.on(\"date-change\", handleDateChange);\n instance.on(\"progress-change\", handleProgressChange);\n instance.on(\"dependency-create\", handleDependencyCreate);\n instance.on(\"dependency-remove\", handleDependencyRemove);\n instance.on(\"dependency-dblclick\", handleDependencyDblClick);\n instance.on(\"task-click\", handleTaskClick);\n instance.on(\"task-dblclick\", handleTaskDblClick);\n instance.on(\"group-toggle\", handleGroupToggle);\n instance.on(\"context-menu\", handleContextMenu);\n instance.on(\"task-create\", handleTaskCreate);\n instance.on(\"column-resize\", handleColumnResize);\n instance.on(\"column-reorder\", handleColumnReorder);\n instance.on(\"task-reorder\", handleTaskReorder);\n instance.on(\"selection-change\", handleSelectionChange);\n instance.on(\"sort-change\", handleSortChange);\n onCleanup(() => {\n instance.off(\"date-change\", handleDateChange);\n instance.off(\"progress-change\", handleProgressChange);\n instance.off(\"dependency-create\", handleDependencyCreate);\n instance.off(\"dependency-remove\", handleDependencyRemove);\n instance.off(\"dependency-dblclick\", handleDependencyDblClick);\n instance.off(\"task-click\", handleTaskClick);\n instance.off(\"task-dblclick\", handleTaskDblClick);\n instance.off(\"group-toggle\", handleGroupToggle);\n instance.off(\"context-menu\", handleContextMenu);\n instance.off(\"task-create\", handleTaskCreate);\n instance.off(\"column-resize\", handleColumnResize);\n instance.off(\"column-reorder\", handleColumnReorder);\n instance.off(\"task-reorder\", handleTaskReorder);\n instance.off(\"selection-change\", handleSelectionChange);\n instance.off(\"sort-change\", handleSortChange);\n });\n }, { flush: \"sync\" }); // synchronous: chart.value is set inside useGanttChart's onMounted,\n // and listeners must be attached before that same tick's synchronous code (e.g. a ref call\n // right after mount) can trigger an event — Vue's default 'pre' flush would run this a tick late.\n\n function handleDateChange(p: { task: GanttTask; start: Date; end: Date }) {\n emit(\"date-change\", p.task, p.start, p.end);\n }\n function handleProgressChange(p: { task: GanttTask; progress: number }) {\n emit(\"progress-change\", p.task, p.progress);\n }\n function handleDependencyCreate(dep: GanttDependency) {\n emit(\"dependency-create\", dep);\n }\n function handleDependencyRemove(dep: GanttDependency) {\n emit(\"dependency-remove\", dep);\n }\n function handleDependencyDblClick(dep: GanttDependency) {\n emit(\"dependency-dblclick\", dep);\n }\n function handleTaskClick(p: { task: GanttTask }) {\n emit(\"task-click\", p.task);\n }\n function handleTaskDblClick(p: { task: GanttTask }) {\n emit(\"task-dblclick\", p.task);\n }\n function handleGroupToggle(p: { task: GanttTask; collapsed: boolean }) {\n emit(\"group-toggle\", p.task, p.collapsed);\n }\n function handleContextMenu(p: { task: GanttTask; evt: PointerEvent }) {\n emit(\"context-menu\", p.task, p.evt);\n }\n function handleTaskCreate(p: { task: GanttTask }) {\n emit(\"task-create\", p.task);\n }\n function handleColumnResize(p: { columnId: string; width: number }) {\n emit(\"column-resize\", p.columnId, p.width);\n }\n function handleColumnReorder(p: { order: string[] }) {\n emit(\"column-reorder\", p.order);\n }\n function handleTaskReorder(p: {\n draggedTaskId: string;\n targetTaskId: string;\n position: \"before\" | \"after\" | \"inside\";\n }) {\n emit(\"task-reorder\", p.draggedTaskId, p.targetTaskId, p.position);\n }\n function handleSelectionChange(p: { taskIds: string[] }) {\n emit(\"selection-change\", p.taskIds);\n }\n function handleSortChange(p: { sort: { columnId: string; direction: \"asc\" | \"desc\" } | null }) {\n emit(\"sort-change\", p.sort);\n }\n\n onBeforeUnmount(() => {\n containerRef.value = null;\n });\n\n const handle: GanttChartHandle = {\n undo: () => chart.value?.undo(),\n redo: () => chart.value?.redo(),\n canUndo: () => chart.value?.canUndo ?? false,\n canRedo: () => chart.value?.canRedo ?? false,\n expandAll: () => chart.value?.expandAll(),\n collapseAll: () => chart.value?.collapseAll(),\n toggleGroup: (taskId) => chart.value?.toggleGroup(taskId),\n removeDependency: (fromId, toId) => chart.value?.removeDependency(fromId, toId),\n updateDependency: (fromId, toId, partial) => chart.value?.updateDependency(fromId, toId, partial),\n updateTask: (id, partial) => chart.value?.updateTask(id, partial),\n setViewMode: (mode) => chart.value?.setViewMode(mode),\n fitToViewport: (containerWidthPx) => chart.value?.fitToViewport(containerWidthPx),\n scrollToToday: () => chart.value?.scrollToToday(),\n scrollToRangeStart: () => chart.value?.scrollToRangeStart(),\n scrollToRangeEnd: () => chart.value?.scrollToRangeEnd(),\n getPageCount: () => chart.value?.getPageCount() ?? 1,\n setPage: (page) => chart.value?.setPage(page),\n zoomIn: (factor) => chart.value?.zoomIn(factor),\n zoomOut: (factor) => chart.value?.zoomOut(factor),\n getZoomLevel: () => chart.value?.getZoomLevel() ?? 0,\n getResourceHistogram: (options) => chart.value?.getResourceHistogram(options) ?? [],\n getLeveledTasks: (options) => chart.value?.getLeveledTasks(options) ?? { tasks: [], shifted: [] },\n selectTask: (id, options) => chart.value?.selectTask(id, options),\n selectAllVisible: () => chart.value?.selectAllVisible(),\n clearSelection: () => chart.value?.clearSelection(),\n getSelectedTaskIds: () => chart.value?.getSelectedTaskIds() ?? [],\n setSort: (columnId, direction) => chart.value?.setSort(columnId, direction),\n getSort: () => chart.value?.getSort() ?? null,\n bulkShiftDates: (deltaMs) => chart.value?.bulkShiftDates(deltaMs),\n bulkDelete: () => chart.value?.bulkDelete(),\n toSVGString: () => chart.value?.toSVGString() ?? \"\",\n toPNGDataURL: () => chart.value?.toPNGDataURL() ?? Promise.resolve(\"\"),\n toPNGDataURLs: (options) => chart.value?.toPNGDataURLs(options) ?? Promise.resolve([]),\n getRenderModel: () => chart.value?.getRenderModel() ?? EMPTY_RENDER_MODEL,\n getInstance: () => chart.value,\n };\n expose(handle);\n\n // A single root element: class/style attrs fall through onto it automatically.\n return () => h(\"div\", { ref: containerRef });\n },\n});\n\nexport default GanttChart;\n","import { onBeforeUnmount, onMounted, shallowRef, watch, type Ref, type ShallowRef } from \"vue\";\nimport { GanttChart as GanttCore } from \"@ganttloom/gantt-core\";\nimport type { GanttDependency, GanttOptions, GanttTask } from \"@ganttloom/gantt-core\";\n\nexport interface UseGanttChartResult {\n /** The underlying framework-agnostic GanttChart instance, or null before the mount effect runs. */\n chart: ShallowRef<GanttCore | null>;\n /** Reactive, subscribed to the core's \"history-change\" event. Only meaningful when `enableHistory` is set in options. */\n canUndo: Ref<boolean>;\n /** Reactive, subscribed to the core's \"history-change\" event. Only meaningful when `enableHistory` is set in options. */\n canRedo: Ref<boolean>;\n}\n\n/**\n * Lower-level escape hatch for consumers who want to own their own container element\n * and DOM tree instead of using the <GanttChart /> component. Constructs a\n * @ganttloom/gantt-core GanttChart instance against `containerRef.value` on mount,\n * keeps it in sync with the tasks/dependencies/options getters via setTasks / setDependencies /\n * setOptions (reference-equality checks only — return a new array/object to trigger a sync),\n * and destroys it on unmount.\n *\n * `getTasks`/`getDependencies`/`getOptions` are plain functions (not refs) so this composable\n * can track whatever reactive source each one reads — a prop, a ref, a computed — without\n * imposing a shape on the caller.\n */\nexport function useGanttChart(\n containerRef: Ref<HTMLElement | null>,\n getTasks: () => GanttTask[],\n getDependencies: () => GanttDependency[],\n getOptions: () => GanttOptions\n): UseGanttChartResult {\n const chart = shallowRef<GanttCore | null>(null);\n const canUndo = shallowRef(false);\n const canRedo = shallowRef(false);\n\n let onHistoryChange: ((state: { canUndo: boolean; canRedo: boolean }) => void) | undefined;\n\n onMounted(() => {\n const container = containerRef.value;\n if (!container) return;\n\n const instance = new GanttCore(container, getTasks(), getDependencies(), getOptions());\n chart.value = instance;\n canUndo.value = instance.canUndo;\n canRedo.value = instance.canRedo;\n\n onHistoryChange = (state) => {\n canUndo.value = state.canUndo;\n canRedo.value = state.canRedo;\n };\n instance.on(\"history-change\", onHistoryChange);\n });\n\n onBeforeUnmount(() => {\n const instance = chart.value;\n if (!instance) return;\n if (onHistoryChange) instance.off(\"history-change\", onHistoryChange);\n instance.destroy();\n chart.value = null;\n canUndo.value = false;\n canRedo.value = false;\n });\n\n // Non-immediate: the initial values were already passed to the constructor above,\n // so these only need to fire on subsequent changes.\n watch(getTasks, (tasks) => chart.value?.setTasks(tasks));\n watch(getDependencies, (deps) => chart.value?.setDependencies(deps));\n watch(getOptions, (options) => chart.value?.setOptions(options));\n\n return { chart, canUndo, canRedo };\n}\n","export { GanttChart, default } from \"./GanttChart\";\nexport type { GanttChartProps, GanttChartHandle } from \"./GanttChart\";\n\nexport { useGanttChart } from \"./useGanttChart\";\nexport type { UseGanttChartResult } from \"./useGanttChart\";\n\n// Re-exported so consumers never need to add @ganttloom/gantt-core as a direct\n// dependency just to reference its types.\nexport type {\n ViewMode,\n DependencyType,\n GanttDependency,\n GanttAssignee,\n GanttTask,\n GanttColumn,\n GanttTheme,\n GanttRenderRow,\n GanttRenderBar,\n GanttRenderLink,\n GanttRenderTick,\n GanttRenderModel,\n GanttOptions,\n GanttEventMap,\n WorkingCalendar,\n ConstraintType,\n ResourceHistogramOptions,\n ResourceLoadBucket,\n GanttMarker,\n GanttRenderMarker,\n FilterTasksOptions,\n FilterTasksResult,\n Density,\n ResourceLevelingOptions,\n ResourceLevelingResult,\n} from \"@ganttloom/gantt-core\";\n\nexport {\n computeWBSCodes,\n applyConstraint,\n isWorkingDay,\n isHoliday,\n isWithinWorkingHours,\n isWorkingTime,\n nextWorkingDay,\n previousWorkingDay,\n shiftToWorkingDay,\n shiftToWorkingTime,\n computeResourceHistogram,\n renderResourceHistogramSVG,\n filterTasks,\n colorByField,\n applyColorByField,\n DEFAULT_PALETTE,\n DENSITY_PRESETS,\n levelResources,\n} from \"@ganttloom/gantt-core\";\n"],"mappings":"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","names":["onBeforeUnmount","watch","watch","onBeforeUnmount"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ganttloom/gantt-vue",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0",
|
|
4
4
|
"description": "Vue 3 wrapper for @ganttloom/gantt-core — fully customizable Gantt chart component.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.cjs",
|
|
@@ -40,7 +40,7 @@
|
|
|
40
40
|
"vue": ">=3.3"
|
|
41
41
|
},
|
|
42
42
|
"dependencies": {
|
|
43
|
-
"@ganttloom/gantt-core": "0.
|
|
43
|
+
"@ganttloom/gantt-core": "0.4.0"
|
|
44
44
|
},
|
|
45
45
|
"devDependencies": {
|
|
46
46
|
"vue": "^3.5.13",
|