The following features provide additional functionality for Workshop's Dynamic Scheduling capability.
The Scheduling Gantt Chart widget is backed by Scenarios, enabling the creation and comparison of what-if analyses. Changes made in the widget are therefore not directly written to the Ontology; instead, they are, effectively, "staged" or "simulated" changes. A schedule save action is needed to write the changes to the Ontology.
To write proposed changes to the Ontology, a simple modify action (which can be configured via the OMA Wizard) is usually sufficient. If further edits are required after updating the Ontology, you can use a custom save action, backed by a Function.
Sample code snippets for types and example functions are provided below.
The types below represent the serialized details of a schedule change, which includes information about both the old and new state of the given allocation.
/* Changelog types */
type ChangelogEntryType = "allocation";
interface IChangelogEntryBase {
type: ChangelogEntryType;
id: string;
touchCounter: number;
parentEntryId?: string;
}
interface IAllocationChangelogEntry extends IChangelogEntryBase {
type: "allocation";
puckId: string;
allocatedTo: string | undefined;
allocatedFrom: string | undefined;
newStartTime: number | undefined;
newEndTime: number | undefined;
previousStartTime: number | undefined;
previousEndTime: number | undefined;
id: string;
touchCounter: number;
parentEntryId?: string;
}
export interface IEnhancedChangelog extends IAllocationChangelogEntry {
fixedResourceObjectTypeId: string;
puckId: string;
}
export interface ISubmitAllocationPayload {
changelog: IEnhancedChangelog[];
comment?: string;
}
Copied!1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
import { IEnhancedChangelog, ISubmitAllocationPayload } from "./types"; export class MyFunctions { @Edits(scheduleObjectAPI) @OntologyEditFunction() public functionName(submissionPayload: string): void { const payload: ISubmitAllocationPayload = JSON.parse(serializedInput) as ISubmitAllocationPayload; const entries: IEnhancedChangelog[] = payload.changelog; const allocations = Objects.search().objectAPI().all(); entries.forEach(entry => { const maybeAllocation = allocations.find(alloc => alloc.assignmentId === entry.puckId); if (maybeAllocation == null) { return; } maybeAllocation.endTimestamp = entry.newEndTime !== undefined ? Timestamp.fromJsDate(new Date(entry.newEndTime)) : undefined; maybeAllocation.startTimestamp = entry.newStartTime !== undefined ? Timestamp.fromJsDate(new Date(entry.newStartTime)) : undefined; if (entry.fixedResourceObjectTypeId === objectId) { maybeAllocation.fixedResourceKey = entry.allocatedTo } else { maybeAllocation.schedulableKey = entry.allocatedTo } }); }
Allocation behavior refers to how pucks behave after they have been moved in the drag-and-drop interface. The Scheduling Gantt Chart widget comes with five predefined options intended to cover the majority of use cases. You can also define your own custom allocation behavior using a TypeScript function, as shown in the example below.
/* Changelog types */
/* Note: these are types also used for Custom Save Actions and may already be in
your functions repo. */
type ChangelogEntryType = "allocation";
interface IChangelogEntryBase {
type: ChangelogEntryType;
id: string;
touchCounter: number;
parentEntryId?: string;
}
interface IAllocationChangelogEntry extends IChangelogEntryBase {
type: "allocation";
puckId: string;
allocatedTo: string | undefined;
allocatedFrom: string | undefined;
newStartTime: number | undefined;
newEndTime: number | undefined;
previousStartTime: number | undefined;
previousEndTime: number | undefined;
id: string;
touchCounter: number;
parentEntryId?: string;
}