@affino/datagrid-gantt 0.1.1
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/LICENSE +21 -0
- package/dist/calendar.d.ts +16 -0
- package/dist/calendar.d.ts.map +1 -0
- package/dist/calendar.js +109 -0
- package/dist/contracts.d.ts +222 -0
- package/dist/contracts.d.ts.map +1 -0
- package/dist/contracts.js +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -0
- package/dist/runtime.d.ts +34 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +784 -0
- package/dist/timeline.d.ts +16 -0
- package/dist/timeline.d.ts.map +1 -0
- package/dist/timeline.js +287 -0
- package/package.json +48 -0
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { BuildDataGridTimelineModelInput, BuildDataGridTimelineRenderModelsInput, DataGridGanttTimelineState, DataGridTimelineHorizontalAlign, DataGridTimelineModel, DataGridTimelineRange, DataGridTimelineRenderModels, DataGridTimelineViewport, ResolveDataGridTimelineRangeInput } from "./contracts.js";
|
|
2
|
+
export declare const DAY_MS: number;
|
|
3
|
+
export declare function resolveDataGridTimelineDateToPixel(dateMs: number, timeline: DataGridGanttTimelineState): number;
|
|
4
|
+
export declare function resolveDataGridTimelineRange(input: ResolveDataGridTimelineRangeInput): DataGridTimelineRange;
|
|
5
|
+
export declare function resolveDataGridTimelinePixelToDate(pixel: number, timeline: DataGridGanttTimelineState): number;
|
|
6
|
+
export declare function clampDataGridTimelineScrollLeft(scrollLeft: number, totalWidth: number, viewportWidth: number): number;
|
|
7
|
+
export declare function resolveDataGridTimelineScrollLeftForDate(input: {
|
|
8
|
+
dateMs: number;
|
|
9
|
+
timeline: DataGridGanttTimelineState;
|
|
10
|
+
viewportWidth: number;
|
|
11
|
+
align?: DataGridTimelineHorizontalAlign;
|
|
12
|
+
}): number;
|
|
13
|
+
export declare function resolveDataGridTimelineViewport(input: BuildDataGridTimelineModelInput): DataGridTimelineViewport;
|
|
14
|
+
export declare function buildDataGridTimelineModel(input: BuildDataGridTimelineModelInput): DataGridTimelineModel;
|
|
15
|
+
export declare function buildDataGridTimelineRenderModels(input: BuildDataGridTimelineRenderModelsInput): DataGridTimelineRenderModels;
|
|
16
|
+
//# sourceMappingURL=timeline.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timeline.d.ts","sourceRoot":"","sources":["../src/timeline.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,+BAA+B,EAC/B,sCAAsC,EACtC,0BAA0B,EAE1B,+BAA+B,EAE/B,qBAAqB,EACrB,qBAAqB,EACrB,4BAA4B,EAG5B,wBAAwB,EACxB,iCAAiC,EAClC,MAAM,gBAAgB,CAAA;AAQvB,eAAO,MAAM,MAAM,QAAsB,CAAA;AA0NzC,wBAAgB,kCAAkC,CAChD,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,0BAA0B,GACnC,MAAM,CAER;AAED,wBAAgB,4BAA4B,CAC1C,KAAK,EAAE,iCAAiC,GACvC,qBAAqB,CAwBvB;AAED,wBAAgB,kCAAkC,CAChD,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,0BAA0B,GACnC,MAAM,CAIR;AAED,wBAAgB,+BAA+B,CAC7C,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,MAAM,GACpB,MAAM,CAMR;AAED,wBAAgB,wCAAwC,CACtD,KAAK,EAAE;IACL,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,0BAA0B,CAAA;IACpC,aAAa,EAAE,MAAM,CAAA;IACrB,KAAK,CAAC,EAAE,+BAA+B,CAAA;CACxC,GACA,MAAM,CAcR;AAED,wBAAgB,+BAA+B,CAC7C,KAAK,EAAE,+BAA+B,GACrC,wBAAwB,CAsB1B;AAED,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,+BAA+B,GACrC,qBAAqB,CAmCvB;AAED,wBAAgB,iCAAiC,CAC/C,KAAK,EAAE,sCAAsC,GAC5C,4BAA4B,CAiB9B"}
|
package/dist/timeline.js
ADDED
|
@@ -0,0 +1,287 @@
|
|
|
1
|
+
import { buildDataGridNonWorkingDaySpans, resolveDataGridWorkingCalendar, startOfUtcDay, startOfUtcWeek, } from "./calendar.js";
|
|
2
|
+
export const DAY_MS = 24 * 60 * 60 * 1000;
|
|
3
|
+
const DEFAULT_TIMELINE_BUFFER_PX = 160;
|
|
4
|
+
const MAX_TIMELINE_SEGMENTS = 10000;
|
|
5
|
+
function ceilToUtcDay(ms) {
|
|
6
|
+
const dayStartMs = startOfUtcDay(ms);
|
|
7
|
+
if (dayStartMs === ms) {
|
|
8
|
+
return ms;
|
|
9
|
+
}
|
|
10
|
+
return dayStartMs + DAY_MS;
|
|
11
|
+
}
|
|
12
|
+
function startOfUtcMonth(ms) {
|
|
13
|
+
const date = new Date(ms);
|
|
14
|
+
return Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), 1);
|
|
15
|
+
}
|
|
16
|
+
function startOfUtcYear(ms) {
|
|
17
|
+
const date = new Date(ms);
|
|
18
|
+
return Date.UTC(date.getUTCFullYear(), 0, 1);
|
|
19
|
+
}
|
|
20
|
+
function addUtcDays(ms, days) {
|
|
21
|
+
return ms + (days * DAY_MS);
|
|
22
|
+
}
|
|
23
|
+
function addUtcWeeks(ms, weeks) {
|
|
24
|
+
return addUtcDays(ms, weeks * 7);
|
|
25
|
+
}
|
|
26
|
+
function addUtcMonths(ms, months) {
|
|
27
|
+
const date = new Date(ms);
|
|
28
|
+
return Date.UTC(date.getUTCFullYear(), date.getUTCMonth() + months, 1);
|
|
29
|
+
}
|
|
30
|
+
function addUtcYears(ms, years) {
|
|
31
|
+
const date = new Date(ms);
|
|
32
|
+
return Date.UTC(date.getUTCFullYear() + years, 0, 1);
|
|
33
|
+
}
|
|
34
|
+
function formatUtcDate(ms, options) {
|
|
35
|
+
return new Date(ms).toLocaleDateString(undefined, {
|
|
36
|
+
...options,
|
|
37
|
+
timeZone: "UTC",
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
function resolveWeekOfMonth(ms) {
|
|
41
|
+
const labelAnchorMs = addUtcDays(startOfUtcWeek(ms), 4);
|
|
42
|
+
const monthStartMs = startOfUtcMonth(labelAnchorMs);
|
|
43
|
+
const monthFirstWeekStartMs = startOfUtcWeek(monthStartMs);
|
|
44
|
+
return Math.floor((startOfUtcWeek(labelAnchorMs) - monthFirstWeekStartMs) / (7 * DAY_MS)) + 1;
|
|
45
|
+
}
|
|
46
|
+
function resolveTimelinePrimaryLabel(ms, zoomLevel) {
|
|
47
|
+
if (zoomLevel === "month") {
|
|
48
|
+
return formatUtcDate(ms, { year: "numeric" });
|
|
49
|
+
}
|
|
50
|
+
return formatUtcDate(ms, {
|
|
51
|
+
month: "long",
|
|
52
|
+
year: "numeric",
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
function resolveTimelineSecondaryLabel(ms, zoomLevel) {
|
|
56
|
+
if (zoomLevel === "week") {
|
|
57
|
+
return `W${resolveWeekOfMonth(ms)}`;
|
|
58
|
+
}
|
|
59
|
+
if (zoomLevel === "month") {
|
|
60
|
+
return formatUtcDate(ms, { month: "short" });
|
|
61
|
+
}
|
|
62
|
+
return formatUtcDate(ms, { day: "numeric" });
|
|
63
|
+
}
|
|
64
|
+
function resolveTimelineUnitStart(ms, unit) {
|
|
65
|
+
if (unit === "week") {
|
|
66
|
+
return startOfUtcWeek(ms);
|
|
67
|
+
}
|
|
68
|
+
if (unit === "month") {
|
|
69
|
+
return startOfUtcMonth(ms);
|
|
70
|
+
}
|
|
71
|
+
if (unit === "year") {
|
|
72
|
+
return startOfUtcYear(ms);
|
|
73
|
+
}
|
|
74
|
+
return startOfUtcDay(ms);
|
|
75
|
+
}
|
|
76
|
+
function addTimelineUnits(ms, count, unit) {
|
|
77
|
+
if (unit === "week") {
|
|
78
|
+
return addUtcWeeks(ms, count);
|
|
79
|
+
}
|
|
80
|
+
if (unit === "month") {
|
|
81
|
+
return addUtcMonths(ms, count);
|
|
82
|
+
}
|
|
83
|
+
if (unit === "year") {
|
|
84
|
+
return addUtcYears(ms, count);
|
|
85
|
+
}
|
|
86
|
+
return addUtcDays(ms, count);
|
|
87
|
+
}
|
|
88
|
+
const ZOOM_CONFIG = {
|
|
89
|
+
day: {
|
|
90
|
+
primary: {
|
|
91
|
+
unit: "month",
|
|
92
|
+
resolveLabel: ms => resolveTimelinePrimaryLabel(ms, "day"),
|
|
93
|
+
},
|
|
94
|
+
secondary: {
|
|
95
|
+
unit: "day",
|
|
96
|
+
resolveLabel: ms => resolveTimelineSecondaryLabel(ms, "day"),
|
|
97
|
+
},
|
|
98
|
+
},
|
|
99
|
+
week: {
|
|
100
|
+
primary: {
|
|
101
|
+
unit: "month",
|
|
102
|
+
resolveLabel: ms => resolveTimelinePrimaryLabel(ms, "week"),
|
|
103
|
+
},
|
|
104
|
+
secondary: {
|
|
105
|
+
unit: "week",
|
|
106
|
+
resolveLabel: ms => resolveTimelineSecondaryLabel(ms, "week"),
|
|
107
|
+
},
|
|
108
|
+
},
|
|
109
|
+
month: {
|
|
110
|
+
primary: {
|
|
111
|
+
unit: "year",
|
|
112
|
+
resolveLabel: ms => resolveTimelinePrimaryLabel(ms, "month"),
|
|
113
|
+
},
|
|
114
|
+
secondary: {
|
|
115
|
+
unit: "month",
|
|
116
|
+
resolveLabel: ms => resolveTimelineSecondaryLabel(ms, "month"),
|
|
117
|
+
},
|
|
118
|
+
},
|
|
119
|
+
};
|
|
120
|
+
function buildTimelineSegments(input) {
|
|
121
|
+
const segments = [];
|
|
122
|
+
let cursorMs = input.rangeStartMs;
|
|
123
|
+
let segmentCount = 0;
|
|
124
|
+
while (cursorMs < input.viewportEndMs && segmentCount < MAX_TIMELINE_SEGMENTS) {
|
|
125
|
+
const segmentStartX = resolveDataGridTimelineDateToPixel(cursorMs, input.timeline);
|
|
126
|
+
const segmentEndMs = addTimelineUnits(cursorMs, 1, input.unit);
|
|
127
|
+
const segmentEndX = resolveDataGridTimelineDateToPixel(segmentEndMs, input.timeline);
|
|
128
|
+
const x = segmentStartX - input.scrollLeft;
|
|
129
|
+
const width = segmentEndX - segmentStartX;
|
|
130
|
+
segments.push({
|
|
131
|
+
key: `${cursorMs}:${segmentEndMs}`,
|
|
132
|
+
startMs: cursorMs,
|
|
133
|
+
endMs: segmentEndMs,
|
|
134
|
+
x,
|
|
135
|
+
width,
|
|
136
|
+
label: input.resolveLabel(cursorMs),
|
|
137
|
+
});
|
|
138
|
+
if (segmentEndMs <= cursorMs) {
|
|
139
|
+
break;
|
|
140
|
+
}
|
|
141
|
+
cursorMs = segmentEndMs;
|
|
142
|
+
segmentCount += 1;
|
|
143
|
+
}
|
|
144
|
+
return segments;
|
|
145
|
+
}
|
|
146
|
+
function buildTimelineLines(segments, suffix) {
|
|
147
|
+
return segments.map(segment => ({
|
|
148
|
+
key: `${suffix}:${segment.startMs}`,
|
|
149
|
+
dateMs: segment.startMs,
|
|
150
|
+
x: segment.x,
|
|
151
|
+
}));
|
|
152
|
+
}
|
|
153
|
+
function buildTimelineNonWorkingSpans(input) {
|
|
154
|
+
return buildDataGridNonWorkingDaySpans({
|
|
155
|
+
startMs: input.viewportStartMs,
|
|
156
|
+
endMs: input.viewportEndMs,
|
|
157
|
+
calendar: input.workingCalendar,
|
|
158
|
+
}).map(span => ({
|
|
159
|
+
key: `non-working:${span.startMs}`,
|
|
160
|
+
startMs: span.startMs,
|
|
161
|
+
endMs: span.endMs,
|
|
162
|
+
x: resolveDataGridTimelineDateToPixel(span.startMs, input.timeline) - input.scrollLeft,
|
|
163
|
+
width: resolveDataGridTimelineDateToPixel(span.endMs, input.timeline)
|
|
164
|
+
- resolveDataGridTimelineDateToPixel(span.startMs, input.timeline),
|
|
165
|
+
}));
|
|
166
|
+
}
|
|
167
|
+
export function resolveDataGridTimelineDateToPixel(dateMs, timeline) {
|
|
168
|
+
return ((dateMs - timeline.startMs) / DAY_MS) * timeline.pixelsPerDay;
|
|
169
|
+
}
|
|
170
|
+
export function resolveDataGridTimelineRange(input) {
|
|
171
|
+
var _a, _b;
|
|
172
|
+
const minTaskDateMs = Number.isFinite(input.minTaskDateMs) ? Number(input.minTaskDateMs) : null;
|
|
173
|
+
const maxTaskDateMs = Number.isFinite(input.maxTaskDateMs) ? Number(input.maxTaskDateMs) : null;
|
|
174
|
+
const pixelsPerDay = Number.isFinite(input.pixelsPerDay) ? Math.max(1, Number(input.pixelsPerDay)) : 1;
|
|
175
|
+
const rangePaddingDays = Number.isFinite(input.rangePaddingDays)
|
|
176
|
+
? Math.max(0, Math.trunc((_a = input.rangePaddingDays) !== null && _a !== void 0 ? _a : 0))
|
|
177
|
+
: 0;
|
|
178
|
+
const fallbackDurationDays = Number.isFinite(input.fallbackDurationDays)
|
|
179
|
+
? Math.max(1, Math.trunc((_b = input.fallbackDurationDays) !== null && _b !== void 0 ? _b : 14))
|
|
180
|
+
: 14;
|
|
181
|
+
const fallbackDateMs = Number.isFinite(input.fallbackDateMs)
|
|
182
|
+
? Number(input.fallbackDateMs)
|
|
183
|
+
: Date.now();
|
|
184
|
+
const baseStartMs = startOfUtcDay(minTaskDateMs !== null && minTaskDateMs !== void 0 ? minTaskDateMs : fallbackDateMs);
|
|
185
|
+
const startMs = startOfUtcDay(baseStartMs - (rangePaddingDays * DAY_MS));
|
|
186
|
+
const baseEndMs = maxTaskDateMs !== null && maxTaskDateMs !== void 0 ? maxTaskDateMs : (baseStartMs + (fallbackDurationDays * DAY_MS));
|
|
187
|
+
const rawEndMs = baseEndMs + (rangePaddingDays * DAY_MS);
|
|
188
|
+
const endMs = Math.max(startMs + DAY_MS, ceilToUtcDay(rawEndMs));
|
|
189
|
+
return {
|
|
190
|
+
startMs,
|
|
191
|
+
endMs,
|
|
192
|
+
totalWidth: Math.max(1, ((endMs - startMs) / DAY_MS) * pixelsPerDay),
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
export function resolveDataGridTimelinePixelToDate(pixel, timeline) {
|
|
196
|
+
return Math.floor(timeline.startMs + ((pixel / timeline.pixelsPerDay) * DAY_MS));
|
|
197
|
+
}
|
|
198
|
+
export function clampDataGridTimelineScrollLeft(scrollLeft, totalWidth, viewportWidth) {
|
|
199
|
+
if (!Number.isFinite(scrollLeft)) {
|
|
200
|
+
return 0;
|
|
201
|
+
}
|
|
202
|
+
const maxScrollLeft = Math.max(0, totalWidth - Math.max(0, viewportWidth));
|
|
203
|
+
return Math.min(Math.max(0, scrollLeft), maxScrollLeft);
|
|
204
|
+
}
|
|
205
|
+
export function resolveDataGridTimelineScrollLeftForDate(input) {
|
|
206
|
+
const anchorX = resolveDataGridTimelineDateToPixel(input.dateMs, input.timeline);
|
|
207
|
+
const viewportWidth = Math.max(0, input.viewportWidth);
|
|
208
|
+
let nextScrollLeft = anchorX;
|
|
209
|
+
if (input.align === "center" || input.align == null) {
|
|
210
|
+
nextScrollLeft = anchorX - (viewportWidth / 2);
|
|
211
|
+
}
|
|
212
|
+
else if (input.align === "end") {
|
|
213
|
+
nextScrollLeft = anchorX - viewportWidth;
|
|
214
|
+
}
|
|
215
|
+
return clampDataGridTimelineScrollLeft(nextScrollLeft, input.timeline.totalWidth, viewportWidth);
|
|
216
|
+
}
|
|
217
|
+
export function resolveDataGridTimelineViewport(input) {
|
|
218
|
+
var _a;
|
|
219
|
+
const viewportWidth = Math.max(0, input.viewportWidth);
|
|
220
|
+
const scrollLeft = clampDataGridTimelineScrollLeft(input.scrollLeft, input.timeline.totalWidth, viewportWidth);
|
|
221
|
+
const bufferPx = Math.max(0, (_a = input.bufferPx) !== null && _a !== void 0 ? _a : DEFAULT_TIMELINE_BUFFER_PX);
|
|
222
|
+
const startX = Math.max(0, scrollLeft - bufferPx);
|
|
223
|
+
const endX = Math.min(input.timeline.totalWidth, scrollLeft + viewportWidth + bufferPx);
|
|
224
|
+
return {
|
|
225
|
+
scrollLeft,
|
|
226
|
+
viewportWidth,
|
|
227
|
+
startX,
|
|
228
|
+
endX,
|
|
229
|
+
startMs: startOfUtcDay(resolveDataGridTimelinePixelToDate(startX, input.timeline)),
|
|
230
|
+
endMs: Math.max(startOfUtcDay(resolveDataGridTimelinePixelToDate(startX, input.timeline)) + DAY_MS, ceilToUtcDay(resolveDataGridTimelinePixelToDate(endX, input.timeline))),
|
|
231
|
+
};
|
|
232
|
+
}
|
|
233
|
+
export function buildDataGridTimelineModel(input) {
|
|
234
|
+
var _a;
|
|
235
|
+
const workingCalendar = (_a = input.workingCalendar) !== null && _a !== void 0 ? _a : resolveDataGridWorkingCalendar(null);
|
|
236
|
+
const viewport = resolveDataGridTimelineViewport(input);
|
|
237
|
+
const zoomConfig = ZOOM_CONFIG[input.timeline.zoomLevel];
|
|
238
|
+
const secondarySegments = buildTimelineSegments({
|
|
239
|
+
timeline: input.timeline,
|
|
240
|
+
scrollLeft: viewport.scrollLeft,
|
|
241
|
+
viewportEndMs: viewport.endMs,
|
|
242
|
+
rangeStartMs: resolveTimelineUnitStart(viewport.startMs, zoomConfig.secondary.unit),
|
|
243
|
+
unit: zoomConfig.secondary.unit,
|
|
244
|
+
resolveLabel: zoomConfig.secondary.resolveLabel,
|
|
245
|
+
});
|
|
246
|
+
const primarySegments = buildTimelineSegments({
|
|
247
|
+
timeline: input.timeline,
|
|
248
|
+
scrollLeft: viewport.scrollLeft,
|
|
249
|
+
viewportEndMs: viewport.endMs,
|
|
250
|
+
rangeStartMs: resolveTimelineUnitStart(viewport.startMs, zoomConfig.primary.unit),
|
|
251
|
+
unit: zoomConfig.primary.unit,
|
|
252
|
+
resolveLabel: zoomConfig.primary.resolveLabel,
|
|
253
|
+
});
|
|
254
|
+
return {
|
|
255
|
+
viewport,
|
|
256
|
+
primarySegments,
|
|
257
|
+
secondarySegments,
|
|
258
|
+
primaryLines: buildTimelineLines(primarySegments, "primary"),
|
|
259
|
+
secondaryLines: buildTimelineLines(secondarySegments, "secondary"),
|
|
260
|
+
nonWorkingSpans: buildTimelineNonWorkingSpans({
|
|
261
|
+
timeline: input.timeline,
|
|
262
|
+
scrollLeft: viewport.scrollLeft,
|
|
263
|
+
viewportStartMs: viewport.startMs,
|
|
264
|
+
viewportEndMs: viewport.endMs,
|
|
265
|
+
workingCalendar,
|
|
266
|
+
}),
|
|
267
|
+
};
|
|
268
|
+
}
|
|
269
|
+
export function buildDataGridTimelineRenderModels(input) {
|
|
270
|
+
var _a, _b, _c;
|
|
271
|
+
return {
|
|
272
|
+
header: buildDataGridTimelineModel({
|
|
273
|
+
timeline: input.timeline,
|
|
274
|
+
scrollLeft: input.scrollLeft,
|
|
275
|
+
viewportWidth: input.viewportWidth,
|
|
276
|
+
workingCalendar: (_a = input.workingCalendar) !== null && _a !== void 0 ? _a : resolveDataGridWorkingCalendar(null),
|
|
277
|
+
bufferPx: Math.max(0, (_b = input.headerBufferPx) !== null && _b !== void 0 ? _b : 0),
|
|
278
|
+
}),
|
|
279
|
+
body: buildDataGridTimelineModel({
|
|
280
|
+
timeline: input.timeline,
|
|
281
|
+
scrollLeft: input.scrollLeft,
|
|
282
|
+
viewportWidth: input.viewportWidth,
|
|
283
|
+
workingCalendar: (_c = input.workingCalendar) !== null && _c !== void 0 ? _c : resolveDataGridWorkingCalendar(null),
|
|
284
|
+
bufferPx: input.bodyBufferPx,
|
|
285
|
+
}),
|
|
286
|
+
};
|
|
287
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@affino/datagrid-gantt",
|
|
3
|
+
"version": "0.1.1",
|
|
4
|
+
"author": "Anton Pavlov <a.pavlov@affino.dev>",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"description": "Headless Gantt projection engine for Affino DataGrid",
|
|
7
|
+
"exports": {
|
|
8
|
+
".": {
|
|
9
|
+
"types": "./dist/index.d.ts",
|
|
10
|
+
"import": "./dist/index.js"
|
|
11
|
+
}
|
|
12
|
+
},
|
|
13
|
+
"main": "dist/index.js",
|
|
14
|
+
"types": "dist/index.d.ts",
|
|
15
|
+
"files": [
|
|
16
|
+
"dist"
|
|
17
|
+
],
|
|
18
|
+
"sideEffects": false,
|
|
19
|
+
"repository": {
|
|
20
|
+
"type": "git",
|
|
21
|
+
"url": "git+https://github.com/affinio/affinio.git",
|
|
22
|
+
"directory": "packages/datagrid-gantt"
|
|
23
|
+
},
|
|
24
|
+
"homepage": "https://github.com/affinio/affinio/tree/main/packages/datagrid-gantt#readme",
|
|
25
|
+
"license": "MIT",
|
|
26
|
+
"keywords": [
|
|
27
|
+
"datagrid",
|
|
28
|
+
"gantt",
|
|
29
|
+
"timeline",
|
|
30
|
+
"engine",
|
|
31
|
+
"headless"
|
|
32
|
+
],
|
|
33
|
+
"dependencies": {
|
|
34
|
+
"@affino/datagrid-core": "0.3.3"
|
|
35
|
+
},
|
|
36
|
+
"devDependencies": {
|
|
37
|
+
"vitest": "^4.0.18"
|
|
38
|
+
},
|
|
39
|
+
"bugs": {
|
|
40
|
+
"url": "https://github.com/affinio/affinio/issues"
|
|
41
|
+
},
|
|
42
|
+
"module": "dist/index.js",
|
|
43
|
+
"scripts": {
|
|
44
|
+
"build": "tsc -p tsconfig.json",
|
|
45
|
+
"type-check": "tsc -p tsconfig.json --noEmit",
|
|
46
|
+
"test": "vitest run"
|
|
47
|
+
}
|
|
48
|
+
}
|