Skip to content

Commit 3d57721

Browse files
junedchhipaclaude
andcommitted
feat: add selectionChange and dependencyArrowUpdate events; move apexgantt to peerDependencies
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 412eda9 commit 3d57721

File tree

4 files changed

+83
-43
lines changed

4 files changed

+83
-43
lines changed

package-lock.json

Lines changed: 9 additions & 9 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,9 @@
3030
"type-check": "vue-tsc --noEmit"
3131
},
3232
"peerDependencies": {
33+
"apexgantt": "^3.9.0",
3334
"vue": "^3.3.0"
3435
},
35-
"dependencies": {
36-
"apexgantt": "^3.4.1"
37-
},
3836
"devDependencies": {
3937
"@types/node": "^20.0.0",
4038
"@vitejs/plugin-vue": "^5.0.0",
@@ -58,4 +56,4 @@
5856
"type": "git",
5957
"url": ""
6058
}
61-
}
59+
}

src/components/ApexGanttChart.vue

Lines changed: 39 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,10 @@ import type { CSSProperties } from "vue";
88
import ApexGantt from "apexgantt";
99
import type {
1010
GanttUserOptions,
11+
GanttEventMap,
1112
TaskInput,
1213
ViewMode,
1314
ThemeMode,
14-
TaskUpdateEventDetail,
15-
TaskUpdateSuccessEventDetail,
16-
TaskValidationErrorEventDetail,
17-
TaskUpdateErrorEventDetail,
18-
TaskDraggedEventDetail,
19-
TaskResizedEventDetail,
2015
} from "apexgantt";
2116
import { GanttEvents } from "apexgantt";
2217
@@ -31,13 +26,21 @@ export interface ApexGanttChartProps {
3126
style?: CSSProperties;
3227
}
3328
29+
type EventDetail<K extends keyof GanttEventMap> =
30+
GanttEventMap[K] extends CustomEvent<infer D> ? D : never;
31+
3432
export interface ApexGanttChartEmits {
35-
(e: "taskUpdate", detail: TaskUpdateEventDetail): void;
36-
(e: "taskUpdateSuccess", detail: TaskUpdateSuccessEventDetail): void;
37-
(e: "taskValidationError", detail: TaskValidationErrorEventDetail): void;
38-
(e: "taskUpdateError", detail: TaskUpdateErrorEventDetail): void;
39-
(e: "taskDragged", detail: TaskDraggedEventDetail): void;
40-
(e: "taskResized", detail: TaskResizedEventDetail): void;
33+
(e: "taskUpdate", detail: EventDetail<"taskUpdate">): void;
34+
(e: "taskUpdateSuccess", detail: EventDetail<"taskUpdateSuccess">): void;
35+
(e: "taskValidationError", detail: EventDetail<"taskValidationError">): void;
36+
(e: "taskUpdateError", detail: EventDetail<"taskUpdateError">): void;
37+
(e: "taskDragged", detail: EventDetail<"taskDragged">): void;
38+
(e: "taskResized", detail: EventDetail<"taskResized">): void;
39+
(e: "selectionChange", detail: EventDetail<"selectionChange">): void;
40+
(
41+
e: "dependencyArrowUpdate",
42+
detail: EventDetail<"dependencyArrowUpdate">,
43+
): void;
4144
}
4245
4346
export interface ApexGanttChartExpose {
@@ -69,7 +72,7 @@ const containerStyle = computed(
6972
height:
7073
typeof props.height === "number" ? `${props.height}px` : props.height,
7174
...props.style,
72-
})
75+
}),
7376
);
7477
7578
// compute full options
@@ -81,7 +84,7 @@ const fullOptions = computed(
8184
width: props.width,
8285
height: props.height,
8386
...props.options,
84-
})
87+
}),
8588
);
8689
8790
// event listeners
@@ -91,40 +94,52 @@ const setupEventListeners = (): void => {
9194
const container = chartContainer.value;
9295
9396
container.addEventListener(GanttEvents.TASK_UPDATE, ((
94-
e: CustomEvent<TaskUpdateEventDetail>
97+
e: GanttEventMap["taskUpdate"],
9598
) => {
9699
emit("taskUpdate", e.detail);
97100
}) as EventListener);
98101
99102
container.addEventListener(GanttEvents.TASK_UPDATE_SUCCESS, ((
100-
e: CustomEvent<TaskUpdateSuccessEventDetail>
103+
e: GanttEventMap["taskUpdateSuccess"],
101104
) => {
102105
emit("taskUpdateSuccess", e.detail);
103106
}) as EventListener);
104107
105108
container.addEventListener(GanttEvents.TASK_VALIDATION_ERROR, ((
106-
e: CustomEvent<TaskValidationErrorEventDetail>
109+
e: GanttEventMap["taskValidationError"],
107110
) => {
108111
emit("taskValidationError", e.detail);
109112
}) as EventListener);
110113
111114
container.addEventListener(GanttEvents.TASK_UPDATE_ERROR, ((
112-
e: CustomEvent<TaskUpdateErrorEventDetail>
115+
e: GanttEventMap["taskUpdateError"],
113116
) => {
114117
emit("taskUpdateError", e.detail);
115118
}) as EventListener);
116119
117120
container.addEventListener(GanttEvents.TASK_DRAGGED, ((
118-
e: CustomEvent<TaskDraggedEventDetail>
121+
e: GanttEventMap["taskDragged"],
119122
) => {
120123
emit("taskDragged", e.detail);
121124
}) as EventListener);
122125
123126
container.addEventListener(GanttEvents.TASK_RESIZED, ((
124-
e: CustomEvent<TaskResizedEventDetail>
127+
e: GanttEventMap["taskResized"],
125128
) => {
126129
emit("taskResized", e.detail);
127130
}) as EventListener);
131+
132+
container.addEventListener(GanttEvents.SELECTION_CHANGE, ((
133+
e: GanttEventMap["selectionChange"],
134+
) => {
135+
emit("selectionChange", e.detail);
136+
}) as EventListener);
137+
138+
container.addEventListener(GanttEvents.DEPENDENCY_ARROW_UPDATE, ((
139+
e: GanttEventMap["dependencyArrowUpdate"],
140+
) => {
141+
emit("dependencyArrowUpdate", e.detail);
142+
}) as EventListener);
128143
};
129144
130145
// initialize chart
@@ -185,29 +200,29 @@ watch(
185200
() => {
186201
update({ series: props.tasks });
187202
},
188-
{ deep: true }
203+
{ deep: true },
189204
);
190205
191206
watch(
192207
() => props.viewMode,
193208
(newMode: ViewMode) => {
194209
update({ viewMode: newMode });
195-
}
210+
},
196211
);
197212
198213
watch(
199214
() => props.theme,
200215
(newTheme: ThemeMode) => {
201216
update({ theme: newTheme });
202-
}
217+
},
203218
);
204219
205220
watch(
206221
() => props.options,
207222
(newOptions: Partial<GanttUserOptions> | undefined) => {
208223
update(newOptions || {});
209224
},
210-
{ deep: true }
225+
{ deep: true },
211226
);
212227
213228
// lifecycle hooks

src/index.ts

Lines changed: 33 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,27 +14,54 @@ export { useGanttData } from "./composables/useGanttData";
1414
// utilities
1515
export { setApexGanttLicense } from "./utils/license";
1616

17-
// re-export types from apexgantt for convenience
17+
// Type-only re-exports from apexgantt (zero runtime cost)
1818
export type {
19-
Annotation,
19+
// Options
2020
GanttUserOptions,
21-
TaskInput,
22-
TaskType,
23-
ThemeMode,
2421
GanttTheme,
22+
ThemeMode,
23+
24+
// Task model
25+
TaskInput,
26+
Task,
27+
TaskDependency,
28+
DependencyType,
29+
BaselineInput,
30+
BaselineOptions,
2531
ParsingConfig,
2632
ParsingValue,
33+
34+
// Annotations
35+
Annotation,
36+
Orientation,
37+
38+
// Toolbar
39+
ToolbarItem,
40+
ToolbarButton,
41+
ToolbarSelect,
42+
ToolbarSeparator,
43+
ToolbarContext,
44+
ColumnListItem,
45+
46+
// Typed event map and detail interfaces
47+
GanttEventMap,
2748
TaskUpdateEventDetail,
28-
TaskValidationErrorEventDetail,
2949
TaskUpdateSuccessEventDetail,
3050
TaskUpdateErrorEventDetail,
51+
TaskValidationErrorEventDetail,
3152
TaskDraggedEventDetail,
3253
TaskResizedEventDetail,
54+
SelectionChangeEventDetail,
55+
DependencyArrowUpdateDetail,
3356
} from "apexgantt";
3457

58+
// Value re-exports (needed at runtime)
3559
export {
60+
ApexGantt,
3661
ViewMode,
62+
TaskType,
3763
ColumnKey,
64+
ColumnList,
3865
GanttEvents,
3966
LightTheme,
4067
DarkTheme,

0 commit comments

Comments
 (0)