From 5c9771e612105ed85e3318f578b84cfb07b656e8 Mon Sep 17 00:00:00 2001 From: Terry Truong Date: Sun, 16 Oct 2022 22:55:28 +1100 Subject: Add basic display of placeholder events Make App hold an event map, passing it to TimeLine children, which use it to display events. A TimeLine emits an 'events-req' if more events in their range could be displayed, which may cause App to add placeholder events to the map. --- src/App.vue | 39 ++++++++++++++++++++++++--- src/components/TimeLine.vue | 66 +++++++++++++++++++++++++++++++++++---------- src/lib.ts | 14 ++++++++-- 3 files changed, 100 insertions(+), 19 deletions(-) diff --git a/src/App.vue b/src/App.vue index 1cd00f5..24da714 100644 --- a/src/App.vue +++ b/src/App.vue @@ -19,8 +19,9 @@
+ :vert="vert" :initialState="state" :eventMap="eventMap" + class="grow basis-full min-h-0 outline outline-1" + @remove="onTimelineRemove(idx)" @state-chg="onTimelineChg($event, idx)" @event-req="onEventReq"/>
@@ -37,7 +38,7 @@ import PlusIcon from './components/icon/PlusIcon.vue'; import SettingsIcon from './components/icon/SettingsIcon.vue'; import HelpIcon from './components/icon/HelpIcon.vue'; // Other -import {HistDate, TimelineState} from './lib'; +import {HistDate, TimelineState, HistEvent, getUnitDiff, MONTH_SCALE, DAY_SCALE, stepDate} from './lib'; import {useStore} from './store'; // Refs @@ -97,6 +98,38 @@ function onTimelineRemove(idx: number){ timelines.value.splice(idx, 1); } +// Event data +const eventMap: Ref> = ref(new Map()); // Maps event IDs to HistEvents +let nextEventId = 0; // For generating placeholder events +function onEventReq(startDate: HistDate, endDate: HistDate){ + // Get number of existing events in range + let numExisting = 0; + for (let event of eventMap.value.values()){ + if (!event.start.isEarlier(startDate) && !endDate.isEarlier(event.start)){ + numExisting += 1; + } + } + // Possibly add new events + let tempScale = 1; + let numUnits = getUnitDiff(startDate, endDate, tempScale); + if (numUnits < 2){ + tempScale = MONTH_SCALE; + numUnits = getUnitDiff(startDate, endDate, tempScale); + if (numUnits < 2){ + tempScale = DAY_SCALE; + numUnits = getUnitDiff(startDate, endDate, tempScale); + } + } + for (let i = 0; i < 3 - numExisting; i++){ + let start = startDate.clone(); + let steps = Math.floor(Math.random() * (numUnits + 1)); + stepDate(start, tempScale, {count: steps, inplace: true}); + let event = {id: nextEventId, title: `Event ${nextEventId}`, start, startUpper: null, end: null, endUpper: null}; + eventMap.value.set(event.id, event); + nextEventId += 1; + } +} + // For resize handling let lastResizeHdlrTime = 0; // Used to throttle resize handling let afterResizeHdlr = 0; // Used to trigger handler after ending a run of resize events diff --git a/src/components/TimeLine.vue b/src/components/TimeLine.vue index add7ce8..d71176f 100644 --- a/src/components/TimeLine.vue +++ b/src/components/TimeLine.vue @@ -27,6 +27,12 @@ {{date}} + +
+ {{eventMap.get(id)!.id}} +
diff --git a/src/lib.ts b/src/lib.ts index 54dffc5..ad3686d 100644 --- a/src/lib.ts +++ b/src/lib.ts @@ -266,6 +266,15 @@ export function getScaleRatio(scale: number, scale2: number){ } return scale2 / scale; } +export function getUnitDiff(date: HistDate, date2: HistDate, scale: number): number { + if (scale == DAY_SCALE){ + return date.getDayDiff(date2); + } else if (scale == MONTH_SCALE){ + return date.getMonthDiff(date2); + } else { + return date.getYearDiff(date2) / scale; + } +} // For sending timeline-bound data to BaseLine export class TimelineState { @@ -284,12 +293,13 @@ export class TimelineState { this.endOffset = endOffset; this.scaleIdx = scaleIdx; } -}; +} export type HistEvent = { + id: number, title: string, start: HistDate, startUpper: HistDate | null, - end: HistDate, + end: HistDate | null, endUpper: HistDate | null, }; -- cgit v1.2.3