@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 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
+ ![ganttloom overview — day-view Gantt chart with dependencies, critical path, and baselines](https://raw.githubusercontent.com/santhoshkumarhari/ganttLoom/master/docs/screenshots/overview.png)
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() ?? "",
@@ -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.2.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.2.1"
43
+ "@ganttloom/gantt-core": "0.4.0"
44
44
  },
45
45
  "devDependencies": {
46
46
  "vue": "^3.5.13",