ApexGantt 3.20.0 shipped on November 5, 2026, 3.21.0 on November 8 and 3.22.0 on November 9. 3.20 changes several defaults, so check the table below, and take 3.22.0 for its tooltip escaping fix.

Key takeaways

  • update() keeps the edits made in the chart (3.20), and new getters read them back.
  • Bars move and resize from the keyboard (3.20).
  • Only a Premium or higher key removes the watermark (3.20); see pricing.
  • Ignite UI theming is an opt-in add-on, and a passed option beats the CSS variable (3.21).
  • Locale packs, week start and fiscal year (3.22), with a draft Japanese pack.
  • Task names in the default tooltips are escaped (3.22).

Which behaviours changed?

ChangeReleaseWhat you will seeHow to reverse it
Watermark needs a Premium key3.20A Pro key leaves the trial watermarkUse a Premium or higher key; call setLicense('') before stepping down to a lower plan (details)
update() keeps edits3.20An options-only update() keeps drags and updateTask() changesPass series
taskUpdate, taskUpdateSuccess and beforeTaskUpdate run on every edit path3.20Saving on both taskDragged and taskUpdateSuccess saves each drag twiceSave on taskUpdateSuccess, or filter by detail.source
Any calendar object means Monday to Friday (except one holding only weekStart / fiscalYearStartMonth, 3.22)3.20Weekends are striped and not workedworkingWeekdays: [0, 1, 2, 3, 4, 5, 6]
No height fills the container3.20A container's CSS height sizes the chartheight: 500
A passed option beats --apex-gantt-*3.21The option wins, even at its default valueRemove the option
Week cells follow the week start3.22With a de, fr, ru or en-gb dateLocale (or the ja pack), weeks start on Mondaycalendar.weekStart: 0
inputDateFormat reads new tokens3.22Q, Do, k, w, W, X, x, L print valuesWrap literal text in [ ]

Does update() keep my edits now?

Yes. Through 3.19, update() rebuilt the chart from its original series, discarding drags, updateTask() and link changes. From 3.20.0 it keeps the current tasks unless the call passes series or parsing, and passing series clears the undo history. Three getters read the chart back:

gantt.update({ pixelsPerDay: 20 })   // zooms; edits stay

const task = gantt.getTask('task-42')  // a copy, or null for an unknown id
const saved = {
  tasks: gantt.getTasks(),             // tree order, collapsed and filtered rows included
  links: gantt.getDependencies(),      // [{ fromId, toId, type, lag }]
}

3.20 also adds expandTask() and collapseTask(), and keyboard editing: on a focused bar, ArrowLeft and ArrowRight move it one snap unit, and Shift plus an arrow resizes its end. See update, getTasks and keyboard editing.

What does 3.21 add?

The Ignite UI add-on: import 'apexgantt/ignite-ui', or apexgantt.ignite-ui.min.js by script tag, and the chart takes its colours, font and light or dark variant from the Ignite UI theme on the page. It needs no extra licence key.

An option you pass now beats --apex-gantt-* (see the table). theme also takes a registered theme's name, and PNG and PDF exports use the background the chart paints. See the family post and Using with Ignite UI.

How do I localize a gantt chart?

3.22.0 makes every remaining English string a message key (72 new ones), and function keys take templates such as 'Edit: {name}'. A locale pack sets a whole language under every other locale field:

import ApexGantt from 'apexgantt'
import { ja } from 'apexgantt/locales/ja'

const gantt = new ApexGantt(el, {
  series: tasks,
  locale: {
    pack: ja,                          // messages, date names, header word order
    displayDateFormat: 'YYYY-MM-DD',   // explicit locale fields win over the pack
  },
  calendar: { weekStart: 0 },          // calendar.* also beats the pack (ja starts weeks on Monday)
})
gantt.render()

locale.tag sets the root's lang, plural rules and sort collation; locale.crosshairFormat and locale.timelineHeaderFormat format the crosshair and header. calendar.weekStart and calendar.fiscalYearStartMonth shape the header and on their own never turn working days on. The Japanese pack, about 2.8 KB gzipped in its own file, is a draft awaiting a native speaker's review. See Locale packs and Week start and fiscal year.

Is the tooltip fix a security update?

Yes. Up to 3.21.0 the default bar tooltip, the baseline tooltip and the edit dialog title wrote the task name into the page as HTML, so a name such as <img src=x onerror=...> ran script. 3.22.0 escapes it. Names without <, &, " or ' render as before. A custom tooltipTemplate must still escape task data itself; use the exported escapeHtml. If task names come from users or another system, upgrade to 3.22.0. See Escaping task data.

Which wrapper versions go with these?

  • react-apexgantt, vue-apexgantt and ngx-apexgantt 1.3.0 accept registered theme names. vue-apexgantt needs apexgantt 3.21.0 or later, and its theme prop no longer defaults to 'light'. The 1.2.0 releases, for 3.20, send update() only what changed. From ngx-apexgantt 1.2.0, core events stop at the chart: use the Outputs, because a listener on an ancestor element no longer hears them.
  • Blazor-ApexGantt 1.5.0 bundles 3.21.0 and adds ApexGanttConfiguration.IgniteUI and GanttOptions.ThemeName, Tokens and DesignSystem. It does not carry 3.22 yet. See Blazor Gantt chart.

The full lists are in the 3.20.0 and 3.22.0 GitHub releases; 3.21's changes are covered in Using with Ignite UI.

Upgrading

npm install apexgantt@3.22.0

apexgantt.min.js is about 8 KB gzipped larger than in 3.21.0. Then check:

  • Your key is Premium or higher.
  • React, Vue and Angular wrappers are at 1.2.0 or later, moved together with the core.
  • beforeTaskUpdate handles every edit path and returns false synchronously.
  • Server echoes go through updateTask(id, updates, { silent: true }).
  • addDependency() now throws for self-links and cycles; call canAddDependency() first.

Earlier ApexGantt posts: 3.19, 3.18 and 3.15.

Frequently asked questions

Do I need new React, Vue or Angular wrappers for ApexGantt 3.20?

Yes. Use react-apexgantt, vue-apexgantt or ngx-apexgantt 1.2.0 or later with 3.20: the 1.1.x React and Vue wrappers resend `series` on every prop change, which now clears undo history, and ngx 1.1.x fires each Output twice. vue-apexgantt 1.3.0 needs apexgantt 3.21.0 or later.

How do I save an ApexGantt chart after users edit it?

Save `getTasks()` and `getDependencies()` together. A task's own `dependency` field holds only the link it was loaded with, so links drawn or removed in the chart live only in `getDependencies()`. Listen to `taskUpdateSuccess` to know when to save; its `source` says which edit path committed the change.

Is the ApexGantt Japanese locale pack final?

No. It ships with `status: 'draft'` while the wording waits for a native speaker's review, and its strings may change in a minor release when that review is signed off. Override any key you need through `locale.messages`, which always wins over the pack.