Standardmäßig misst dhtmlxGantt die Aufgabendauer in Kalenderzeit, was bedeutet, dass Wochenenden und Feiertage in die Gesamtdauer einbezogen werden.
Weitere Informationen zur Formatierung von Enddaten finden Sie im Artikel Task end date display & Inclusive end dates.
Wenn Sie möchten, dass die Aufgabendauer nur auf Arbeitszeit basiert, können Sie die Option work_time verwenden:
Aktivieren Sie die Arbeitszeiterfassung für Aufgabendauern
gantt.config.work_time = true; // schließt Nicht-Arbeitszeit aus den Berechnungen aus gantt.config.skip_off_time = true; // verbirgt Nicht-Arbeitszeit im Diagramm
gantt.init("gantt_here");
Beachten Sie, dass die Konfigurationsoption skip_off_time nur in der PRO-Version verfügbar ist.
Related sample: Duration includes only working days
Abhängig vom Wert der duration_unit berechnet dhtmlxGantt Aufgabendauern in verschiedenen Zeiteinheiten (z.B. wenn duration_unit = "hour"
, werden Dauern in Arbeitsstunden gemessen).
Diese Funktion ist nur in der PRO-Edition verfügbar.
Ab Version 6.3 unterstützt dhtmlxGantt die Angabe von Aufgabendauern in Dezimalformaten wie "2.5 days", "0.5 hours" oder "3.75 hours" mithilfe des Duration Formatter Moduls.
Es ist wichtig zu beachten, dass Gantt intern Aufgabendauern als Ganzzahlen speichert. Das Modul hilft dabei, vom Benutzer eingegebene Dezimalwerte in das in Gantt gespeicherte Format zu konvertieren (z.B. wird "1.5 hours" zu 90
Minuten) und umgekehrt, gespeicherte Werte zurück in ein lesbares Format zu konvertieren (z.B. werden 12
Stunden zu "0.5 days").
Aufgabendauern können als Bruchteile unterstützter Einheiten wie Stunden oder Tagen ausgedrückt werden, jedoch nicht Minuten, wie durch die Einstellung duration_unit definiert.
Um Aufgabendauern im Dezimalformat anzuzeigen, befolgen Sie diese Schritte:
gantt.config.work_time = true;
gantt.config.duration_unit = "minute";
Stellen Sie sicher, dass Aufgabendauern in kleineren Einheiten als im angezeigten Dezimalformat gespeichert werden. Zum Beispiel: - Um Benutzern zu erlauben, Dauern als Bruchteile einer Stunde anzugeben (z.B. "0.5 hours"), setzen Sie duration_unit auf "minute". - Um Benutzern zu erlauben, Dauern als Bruchteile eines Tages anzugeben, setzen Sie duration_unit auf "hour". In diesem Fall funktioniert "0.5 day", aber "0.5 hour" wird auf 1 Stunde gerundet, da Dauern als ganze Stunden gespeichert werden.
Standardmäßig schnappen Aufgabenzeiten an die Zeitskala. Wenn Ihre Skala auf Tage eingestellt ist, müssen Sie das Snapping möglicherweise deaktivieren, um das Ziehen von Aufgaben auf bestimmte Stunden zu ermöglichen. Deaktivieren Sie round_dnd_dates und passen Sie time_step entsprechend an.
Zum Beispiel:
// 15-Minuten-Zeitschritte, erfordert "minute" als Dauereinheit
gantt.config.time_step = 15;
gantt.config.round_dnd_dates = false;
oder
// 1-Stunden-Zeitschritte, geeignet, wenn die Dauereinheit "hour" ist
gantt.config.time_step = 60;
gantt.config.round_dnd_dates = false;
// Formatieren der Dauer
var formatter = gantt.ext.formatters.durationFormatter({
enter: "day",
store: "minute", // duration_unit
format: "day",
hoursPerDay: 8,
hoursPerWeek: 40,
daysPerMonth: 30
});
gantt.config.columns = [
{name: "text", tree: true, width: 170, resize: true, editor: textEditor},
{name: "start_date", align: "center", resize: true, editor: dateEditor},
{name: "duration", label:"Duration", resize: true, align: "center",
template: function(task) { return formatter.format(task.duration); }, width: 100},
{name: "add", width: 44}
];
gantt.config.lightbox.sections = [
{name: "description", height: 70, map_to: "text", type: "textarea", focus: true},
{name: "time", type: "duration", map_to: "auto", formatter: formatter}
];
var durationEditor = {
type: "duration",
map_to: "duration",
formatter: formatter, min:0, max:1000
};
gantt.config.columns = [
{name: "text", tree: true, width: 170, resize: true},
{name: "start_date", align: "center", resize: true},
{name: "duration", label:"Duration", resize: true, align: "center",
template: function(task) {
return formatter.format(task.duration);
}, editor: durationEditor, width: 100}, {name: "add", width: 44}
];
Wenn Dauern bereits in Einheiten wie Minuten oder Stunden gespeichert sind, können Sie dennoch das Duration Formatter Modul verwenden, um sie im Dezimalformat anzuzeigen.
Standardmäßig ist die Arbeitszeit definiert als:
Um diese Einstellungen anzupassen, verwenden Sie die Methode setWorkTime:
Anpassen der Arbeitszeit
// Arbeitsstunden für Wochentage festlegen
gantt.setWorkTime({ hours:["9:00-18:00"] });
// Freitage als freie Tage markieren
gantt.setWorkTime({ day:5, hours:false });
// Spezifische Stunden für Freitage und Samstage festlegen
gantt.setWorkTime({day : 5, hours : ["8:00-12:00"]});
gantt.setWorkTime({day : 6, hours : ["8:00-12:00"]});
// Ein bestimmtes Datum als Arbeitstag festlegen
gantt.setWorkTime({date : new Date(2019, 2, 31)});
// Ein bestimmtes Datum als freien Tag festlegen
gantt.setWorkTime({date:new Date(2019,0,1), hours:false})
Related sample: Custom working days and time
Stellen Sie sicher, dass das hours Attribut in setWorkTime
in aufsteigender Reihenfolge ist. Andernfalls werden einige Intervalle ignoriert. Zum Beispiel:
// Diese Einstellungen funktionieren nicht wie erwartet
gantt.setWorkTime({day : 5, hours : ["16:00-18:00", "14:00-15:00", "08:00-10:00"]});
gantt.setWorkTime({day : 5, hours : ["16:00-18:00", "00:00-04:00", "05:00-06:00"]});
Für Nachtschichten teilen Sie die Stunden auf zwei Tage auf:
gantt.setWorkTime({day : 5, hours : ["16:00-18:00"]});
gantt.setWorkTime({day : 6, hours : ["00:00-04:00", "05:00-06:00"]});
Sie können verschiedene Arbeitszeitregeln für bestimmte Zeiträume mit dem customWeeks Attribut in setWorkTime
definieren. Zum Beispiel, um unterschiedliche Stunden für die Wintermonate festzulegen:
// Arbeitszeiten für Wintermonate anpassen
gantt.setWorkTime({
customWeeks: {
winter: {
from: new Date(2018, 11, 1), // 1. Dezember 2018
to: new Date(2019, 2, 1), // 1. März 00:00, 2019
hours: ["9:00-13:00", "14:00-16:00"],
days: [ 1, 1, 1, 1, 0, 0, 0]
}
}
});
Wenn Sie Arbeitszeiten mit Minuten angeben müssen (z.B. "8:15-12:45"), setzen Sie duration_unit auf "minute".
Arbeitszeiten mit Minutenpräzision anpassen
gantt.config.duration_unit = "minute";
// Arbeitszeiten mit Minutenpräzision festlegen
gantt.setWorkTime({hours:["8:15-12:45"]});
Das alte Arbeitszeitformat (verwendet vor Version 7.0) wird weiterhin unterstützt:
gantt.setWorkTime({hours:[9, 18]})
Wenn Sie die Methode für dasselbe Datum mehrmals aufrufen, ersetzt die zuletzt festgelegte Arbeitszeitregel die vorherige. Um eine bestehende Regel anzupassen oder zu entfernen, können Sie die Methode gantt.setWorkTime()
mit einer neuen Konfiguration verwenden:
gantt.setWorkTime({hours:["8:00-12:00"]});
gantt.setWorkTime({hours:["13:00-17:00"]});
// Die resultierende Arbeitszeit wird 13:00-17:00 sein,
// nicht eine Kombination der beiden Befehle.
Um eine Arbeitszeiteinstellung zu entfernen, können Sie die Methode gantt.unsetWorkTime()
verwenden:
// Setzt die Arbeitszeit für Arbeitstage auf ["8:00-12:00"]
gantt.setWorkTime({hours:["8:00-12:00"]});
// Entfernt die Arbeitszeit
gantt.unsetWorkTime({hours:["8:00-12:00"]});
Um festzustellen, ob ein bestimmtes Datum in die Arbeitszeit fällt, verwenden Sie die Methode gantt.isWorkTime()
:
// Markiert den 1. Januar 2019 als freien Tag
gantt.setWorkTime({date:new Date(2019,0,1), hours:false});
gantt.isWorkTime(new Date(2019,0,1)) // -> false
// Setzt den 15. März 2019 als Arbeitstag von 9:00 bis 18:00
gantt.setWorkTime({date : new Date(2019, 2, 15), hours:["8:00-17:00"]});
gantt.isWorkTime(new Date(2019, 2, 15,10,0), "hour"); // -> true gantt.isWorkTime(new Date(2019, 2, 15,8,0), "hour"); // -> false
Related sample: Correct task position on drag
Um die Arbeitsstunden für ein bestimmtes Datum zu erhalten, können Sie die Methode gantt.getWorkHours()
verwenden:
gantt.getWorkHours(new Date(2019,3,30))// -> ["8:00-17:00"]
Wenn Sie den nächsten Arbeitstag zu einem bestimmten Datum benötigen, verwenden Sie die Methode gantt.getClosestWorkTime()
:
gantt.getClosestWorkTime(new Date(2019,3,30));
Manchmal möchten Sie Arbeitszeiten definieren, die sich an bestimmten Tagen wiederholen, wie z.B. den letzten Freitag jedes Monats zu einem kurzen Tag machen oder den 25. Dezember als Feiertag markieren. Derzeit bietet dhtmlxGantt keine integrierten Optionen dafür. Es ermöglicht Ihnen:
Für Ausnahmen von diesen Regeln müssen Sie die relevanten Daten manuell identifizieren und die Einstellungen individuell anwenden.
Zum Beispiel, wenn ein Projekt fünf Jahre umfasst und Sie möchten, dass der 1. Januar immer ein freier Tag ist, können Sie es so festlegen:
gantt.setWorkTime({hours:false, date: new Date(2021, 0, 1)});
gantt.setWorkTime({hours:false, date: new Date(2022, 0, 1)});
gantt.setWorkTime({hours:false, date: new Date(2023, 0, 1)});
gantt.setWorkTime({hours:false, date: new Date(2024, 0, 1)});
gantt.setWorkTime({hours:false, date: new Date(2025, 0, 1)});
Um den letzten Freitag jedes Monats zu einem kurzen Tag zu machen, können Sie den folgenden Code verwenden:
function lastFridayOfMonth(date) {
var lastDay = new Date(date.getFullYear(), date.getMonth() + 1, 0);
if (lastDay.getDay() < 5) {
lastDay.setDate(lastDay.getDate() - 7);
}
lastDay.setDate(lastDay.getDate() - (lastDay.getDay() - 5));
return lastDay;
}
var projectStart = new Date(2020, 5, 1);
var projectEnd = new Date(2025, 5, 1);
var currentDate = new Date(projectStart);
while (currentDate.valueOf() <= projectEnd.valueOf()) {
var lastFriday = lastFridayOfMonth(currentDate);
gantt.setWorkTime({hours:["8:00-12:00", "13:00-15:00"], date: lastFriday});
currentDate = gantt.date.add(currentDate, 1, "month");
}
Um Nicht-Arbeitszeiten im Diagramm visuell hervorzuheben, können Sie das Template gantt.templates.timeline_cell_class
verwenden:
gantt.templates.timeline_cell_class = function(task, date){
if (!gantt.isWorkTime({task:task, date: date}))
return "week_end";
return "";
};
Related sample: Custom working days and time
Weitere Details finden Sie im Artikel highlighting time slots.
Um Nicht-Arbeitszeiten auszublenden, beachten Sie die Technik im Artikel custom scale.
Zusätzlich zu den globalen Arbeitszeiteinstellungen unterstützt Gantt mehrere Arbeitszeitkalender, die einzelnen Aufgaben oder Aufgabengruppen zugewiesen werden können.
Sie können einen neuen Kalender mit der Methode gantt.createCalendar()
erstellen. Diese Methode bietet zwei Optionen:
var calendar = gantt.createCalendar();
var newCalendar = gantt.createCalendar(calendar);
Sobald erstellt, ist der Kalender von Gantt getrennt und hat keine Auswirkungen, bis er hinzugefügt wird.
Nachdem Sie einen Kalender erstellt haben, fügen Sie ihn mit der Methode gantt.addCalendar()
zu Gantt hinzu. Sie können:
var calendarId = gantt.addCalendar(calendar);
worktime
Objekts mit Arbeitstagen und -stunden:var calendarId = gantt.addCalendar({
id: "custom", // optional
worktime: {
hours: ["8:00-17:00"],
days: [1, 1, 1, 1, 1, 1, 1]
}
});
Diese Option kann auch verwendet werden, um einen Kalender zu erstellen.
Ab Version 7.1 können Sie unterschiedliche Arbeitszeiten für bestimmte Zeiträume innerhalb eines Kalenders festlegen. Zum Beispiel können Sie einen separaten Zeitplan für die Wintermonate mit der Eigenschaft customWeeks
in der Methode addCalendar
definieren:
var calendarId = gantt.addCalendar({
id: "global", // optional
worktime: {
hours: ["8:00-17:00"],
days: [1, 1, 1, 1, 1, 1, 1],
customWeeks: {
winter: {
from: new Date(2018, 11, 1), // 1. Dezember 2018
to: new Date(2019, 2, 1), // 1. März 2019
hours: ["9:00-13:00", "14:00-16:00"],
days: [1, 1, 1, 1, 0, 0, 0]
}
}
},
});
Related sample: Different worktimes for different time periods
Um die Arbeitszeiten für bestimmte Tage in einem Kalender zu aktualisieren, verwenden Sie die Methode setWorkTime()
:
var calendar = gantt.getCalendar("custom");
calendar.setWorkTime({day: 6, hours: ["8:00-12:00"]});
calendar.setWorkTime({date: new Date(2021, 0, 1), hours: ["8:00-12:00"]});
Sie können Kalenderobjekte zur weiteren Verwendung abrufen. Hier sind die verfügbaren Optionen:
Um den globalen Gantt-Kalender abzurufen, verwenden Sie die Methode gantt.getCalendar()
:
var calendar = gantt.getCalendar(id);
Der standardmäßige globale Kalender kann mit der vordefinierten ID "global"
abgerufen werden:
var globalSettings = gantt.getCalendar("global");
Dieser Kalender ist der Standard für Aufgaben, es sei denn, ein anderer Kalender wird angegeben.
Um den Kalender abzurufen, der einer bestimmten Aufgabe zugewiesen ist, verwenden Sie die Methode gantt.getTaskCalendar()
, indem Sie das Aufgabenobjekt übergeben:
var task = gantt.getTask(taskId);
var calendar = gantt.getTaskCalendar(task);
if (calendar.isWorkTime(date)) {
alert("TaskWorkTime");
}
Related sample: Task level calendars
Wenn die Arbeitszeit in der Gantt-Konfiguration deaktiviert ist, gibt die Methode einen 24/7-Arbeitszeitkalender zurück.
Gantt bietet globale Methoden, um Aufgabendauern zu berechnen oder Daten zu überprüfen, ohne direkt auf den Kalender einer Aufgabe zuzugreifen:
gantt.isWorkTime
:if (gantt.isWorkTime({date: date, task: task})) {
alert("work time of a task" + task.text);
}
Entspricht:
var calendar = gantt.getTaskCalendar(task);
if (calendar.isWorkTime({date: date})) {
alert("work time of a task" + task.text);
}
gantt.calculateEndDate
:var end_date = gantt.calculateEndDate({start_date: date, duration: duration, task: task});
// oder
var end_date = gantt.calculateEndDate(task);
gantt.calculateDuration
:var duration = gantt.calculateDuration({start_date: start, end_date: end, task: task});
// oder
var duration = gantt.calculateDuration(task);
gantt.getClosestWorkTime
:var closestTime = gantt.getClosestWorkTime({date: date, task: task});
Um alle zu Gantt hinzugefügten Kalender (global und aufgabenbezogen) abzurufen, verwenden Sie die Methode gantt.getCalendars()
:
var calendars = gantt.getCalendars();
Diese Methode gibt ein Array von Kalenderobjekten zurück.
Wenn ein Kalender nicht mehr benötigt wird, können Sie ihn mit der Methode gantt.deleteCalendar()
entfernen. Übergeben Sie einfach die Kalender-ID:
// Hinzufügen eines Kalenders
gantt.addCalendar({
id: "custom",
worktime: {
hours: ["8:00-17:00"],
days: [1, 1, 1, 1, 1, 1, 1]
}
});
// Löschen des Kalenders
gantt.deleteCalendar("custom");
Um einen Kalender einer Aufgabe zuzuweisen, fügen Sie zuerst den Kalender mit seiner ID und seinen Arbeitseinstellungen hinzu:
gantt.addCalendar({
id: "custom", // optional
worktime: {
hours: ["8:00-17:00"],
days: [1, 1, 1, 1, 1, 1, 1]
}
});
Setzen Sie dann die Kalender-ID im "calendar_id"
Attribut des Aufgabenobjekts:
{
"id": 2, "calendar_id": "custom", "text": "Task #1", "start_date": "02-04-2019",
"duration": "8", "parent": "1", "progress": 0.5, "open": true
}
Falls erforderlich, können Sie den Namen der Aufgaben-Eigenschaft ändern, die den Kalender verknüpft, indem Sie die Option gantt.config.calendar_property
verwenden:
gantt.config.calendar_property = "property_name";
Related sample: Task level calendars
Diese Funktionalität ist nur in der PRO-Edition verfügbar.
Sie können spezifische Arbeitskalender Aufgaben zuweisen, die bestimmte Ressourcen benötigen, wie Personen oder Ausrüstung. Beispielsweise möchten Sie möglicherweise, dass Aufgaben individuellen Kalendern folgen, basierend auf dem Benutzer, dem sie zugewiesen sind. So funktioniert es:
gantt.config.resource_property = "user";
gantt.config.resource_calendars = {
1 : gantt.addCalendar({
worktime: {
days: [0, 1, 1, 1, 1, 1, 0]
}
}),
2 : gantt.addCalendar({
worktime: {
days: [1, 0, 0, 0, 0, 0, 1]
}
}),
3 : gantt.addCalendar({
worktime: {
days: [0, 1, 1, 1, 0, 1, 1]
}
})
};
Dieses Objekt enthält Schlüssel-Wert-Paare, wobei der Schlüssel die Ressourcen-ID ist und der Wert die Kalender-ID, die von der Methode addCalendar zurückgegeben wird.
{ "id":1, "user":"1", "text":"Project #2", "start_date":"01-04-2019", "duration":"5" },
{ "id":2, "user":"0", "text":"Task #1", "start_date":"02-04-2019", "duration":"2" },
{ "id":3, "user":"2", "text":"Task #2", "start_date":"11-04-2019", "duration":"4" },
{ "id":4, "user":"3", "text":"Task #3", "start_date":"13-04-2019", "duration":"3" },
{ "id":5, "user":"0", "text":"Task #1.1", "start_date":"02-04-2019", "duration":"7" },
{ "id":6, "user":"1", "text":"Task #1.2", "start_date":"03-04-2019", "duration":"7" }
Related sample: Resource level calendars
Wenn einer Aufgabe sowohl ein benutzerdefinierter Kalender als auch ein Ressourcenkalender zugewiesen ist, hat der benutzerdefinierte Kalender Vorrang und überschreibt den Ressourcenkalender.
Ab Version 7.0 können Sie mehrere Kalender zu einem zusammenführen. Beispielsweise, wenn zwei Ressourcen mit unterschiedlichen Arbeitszeiten derselben Aufgabe zugewiesen sind, können deren Arbeitszeiten zu einem einzigen Kalender kombiniert werden. Zum Beispiel, wenn eine Ressource von 9:00 bis 15:00 arbeitet und eine andere von 12:00 bis 17:00, deckt der zusammengeführte Kalender 12:00 bis 15:00 ab.
Um diese Funktion automatisch zu aktivieren, setzen Sie die Konfiguration dynamic_resource_calendars auf true:
gantt.config.dynamic_resource_calendars = true;
Related sample: Merge work Calendars of different resources
Alternativ können Sie Kalender manuell mit der Methode mergeCalendars zusammenführen:
const johnCalendarId = gantt.addCalendar({
worktime: {
hours: ["0:00-24:00"],
days: [0, 1, 1, 1, 1, 1, 0]
}
});
const mikeCalendarId = gantt.addCalendar({
worktime: {
hours: ["8:00-12:00", "13:00-17:00"],
days: [0, 1, 1, 1, 1, 1, 0]
}
});
const joinedCalendar = gantt.mergeCalendars(
gantt.getCalendar(mikeCalendarId),
gantt.getCalendar(johnCalendarId)
);
Details zur Zusammenführung von Arbeitszeiten finden Sie im Artikel mergeCalendars().
Diese Funktionalität ist nur in der PRO-Edition verfügbar.
Sie können auch einem Projekt einen Arbeitskalender zuweisen, sodass Aufgaben den Kalender ihres übergeordneten Projekts erben. So funktioniert es:
Um diese Funktion zu aktivieren, setzen Sie die Konfigurationsoption inherit_calendar auf true. Standardmäßig ist diese Option deaktiviert.
gantt.config.inherit_calendar = true;
Im folgenden Beispiel erben Aufgaben standardmäßig Kalender von ihren übergeordneten Projekten. Wenn jedoch einer Aufgabe ein eigener Kalender zugewiesen ist, verwendet sie diesen stattdessen. Zum Beispiel verwenden die Aufgaben #2.2 und #3 die "Vollwoche"-Kalender anstelle des Kalenders ihres übergeordneten Projekts:
Related sample: Project level calendars
Ab Version 7.0 erkennt Gantt automatisch Änderungen am Kalender einer Aufgabe und berechnet den Zeitplan der Aufgabe neu.
Wenn nötig, können Sie jedoch den Zeitplan der Aufgabe manuell aktualisieren, wenn sich ihr Kalender ändert. Beispielsweise möchten Sie den Zeitplan aktualisieren, wenn ein Kalender über die Lightbox geändert wird:
function updateTaskTiming(task) {
task.start_date = gantt.getClosestWorkTime({
dir: "future",
date: task.start_date,
unit: gantt.config.duration_unit,
task: task
});
task.end_date = gantt.calculateEndDate(task);
}
gantt.attachEvent("onLightboxSave", function(id, task, is_new){
updateTaskTiming(task);
return true;
});
Alternativ können Sie eine Neuberechnung für alle Aufgaben definieren, wenn dies erforderlich ist:
gantt.batchUpdate(function(){
gantt.eachTask(function(task){
task.start_date = gantt.getClosestWorkTime({
dir: "future",
date: task.start_date,
unit: gantt.config.duration_unit,
task: task
});
task.end_date = gantt.calculateEndDate(task);
gantt.updateTask(task.id);
});
});
Zurück nach oben