Skip to content

Calendars, Gantt charts, maps, and Kanban boards

Client keyword reference / Calendars, Gantt charts, maps, and Kanban boards

IFS Cloud 26R1 · Documentation-based examples · Not compiled or executed in IFS.

Start with read-only rendering. Moving an item on a visual board requires a separate authorized server operation and recovery behavior. Use an explicit date/time-zone policy and keep a normal list available while reconciling the visualization.

  1. Expose DemoVisitSet of type DemoVisit with Title, StartAt, and EndAt (Timestamp), plus Boolean AllDay.
  2. Prepare a one-hour visit and a second visit on the next day, with known timezone semantics.
  3. Put calendar TrainingVisits using DemoVisitSet; in a page and define:
calendar TrainingVisits for DemoVisit {
label = "Training visits";
weeknumbers = [true];
events {
start = StartAt;
end = EndAt;
allday = [AllDay = true];
view Week, Month { field Title; }
view TimelineMonth { customdaterange = [true]; }
}
}

Switch views and timezone settings and compare timestamps to service data. Test zero/negative duration, an event across midnight, and the all-day case. Define separate date attributes with startdate/enddate when that is your business contract; do not silently reinterpret timestamps as dates. Resource grouping, resource, and schedule blocks require their own mapped attributes/arrays; first verify every visit appears exactly once without grouping. A UI calendar does not book capacity or prevent overlap by itself.

Expose DemoPlanSet (type DemoPlan, with PlanId and Title) and a Tasks array to DemoPlanTask with TaskId, StartAt, and FinishAt. Bind ganttchart TrainingPlan using DemoPlanSet; in a page.

ganttchart TrainingPlan for DemoPlan {
label = "Training delivery plan";
datagrid {
ganttcolumn PlanId;
ganttcolumn Title;
}
ganttchartitem TrainingTask(Tasks);
}
ganttchartitem TrainingTask for DemoPlanTask {
starttime StartAt;
endtime FinishAt;
ganttchartitemstyle TrainingTaskStyle = [true];
}
ganttchartitemstyle TrainingTaskStyle {
shape = default;
emphasis = Primary;
}

Create two plans with separate tasks; expand both and compare date positions with the source list. A nested ganttchartrow ChildPlan for DemoPlan { datagrid { ganttcolumn PlanId; ganttcolumn Title; } ganttchartitem TrainingTask(Tasks); } can be inserted through a correctly mapped ChildPlans array using ganttchartrow ChildPlan(ChildPlans);. Verify the child relationship terminates and cannot cycle before making it recursive.

A schedule requires its own DemoShift rows. The following file-scope declaration can be attached to a compatible Gantt row with ganttchartschedule TrainingShift(Shifts); and a matching row schedule ID:

ganttchartschedule TrainingShift for DemoShift {
scheduleid CalendarId;
schedulestart ShiftStart;
scheduleend ShiftEnd;
ganttchartitemstyle TrainingTaskStyle = [true];
}

For dependencies, first assign stable item IDs and expose matching predecessor/successor IDs. Then define a ganttdependency with dependencytype FinishToStart = [true];, fromitem = "${PredecessorId}";, and toitem = "${SuccessorId}"; and attach it through the dependency array. Check that each endpoint resolves to one item.

Add a mutation only after rendering passes. Inside an item definition a move command { execute { call MoveTrainingTask(TaskId, StartAt, FinishAt); } } requires that exact action contract. A resize command similarly needs a server update, not just a success toast. Test stale versions, rejected moves, cancellation, and reload. Check the new dates were saved once and failed operations restore the correct view. Keep server-side schedule constraints authoritative.

Expose a DemoDispatch record with CenterLatitude, CenterLongitude, and DispatchId; a function GetTrainingStops(DispatchId) must return stop rows with StopLatitude/StopLongitude. Place the map on a page bound to the dispatch record.

map TrainingStops for DemoDispatch {
label = "Training route stops";
location {
latitude CenterLatitude;
longitude CenterLongitude;
}
pin VisitPin using GetTrainingStops(DispatchId) {
latitude StopLatitude;
longitude StopLongitude;
tooltip { field StopName; }
}
}

Start with two permitted coordinates whose positions you know. Confirm latitude/longitude are not swapped and nulls are not converted to 0,0. Verify map service setup and the user’s permissions independently of the data query. Define a pinstyle only when you need a distinct legend; a changed pin position is not persisted without a move action.

For a line between stops, use a polyline with startlocation and endlocation, each mapping latitude/longitude. A route additionally needs the service’s route/ranking contract; it is not automatically a route optimizer. A region needs ordered boundary points or its documented center/radius contract. Validate those inputs against the official map reference before adding them to the basic map.

Expose DemoRequest with a StageKey and a function GetTrainingStageNames() returning the column-key/name format required by the Kanban contract. Seed one record in each known stage. Insert kanbanboard TrainingBoard using DemoRequestSet; in a page.

kanbanboard TrainingBoard for DemoRequest {
kanbancolumn StageKey;
kanbancolumnname = GetTrainingStageNames();
kanbancard TrainingRequestCard;
}
kanbancard TrainingRequestCard for DemoRequest {
field RequestId;
field Title;
}

Check column keys against service results, including an unknown stage and an empty column. A move command needs the documented destination-column context and a server action enforcing permitted transitions. Until that contract is implemented and verified, treat this as a read-only board. After adding movement, test a rejected transition and reload to prove that cards represent stored state.

Use the build and acceptance checklist before delivering a change.