Ab Version 5.0 unterstützt Gantt die Definition eines anpassbaren Layouts, das es Ihnen ermöglicht, die Elemente der Komponente als innere Ansichten innerhalb eines Layouts anzuordnen. Diese Funktion ermöglicht das Hinzufügen zusätzlicher Zeitachsen und Grids und schafft so eine flexible Gantt-Diagrammstruktur mit verschiedenen Möglichkeiten zur Organisation der einzelnen Bereiche.
Zum Beispiel können Sie ein zusätzliches Grid auf der rechten Seite der Zeitachse hinzufügen:
Related sample: Grid columns rightside of gantt
Oder ein weiteres Grid und eine zusätzliche Zeitachse unterhalb der Standardansichten einfügen.
Related sample: Gantt chart with resource panel
Das Layout wird über die Einstellung gantt.config.layout gesteuert. Hier ist die Standardkonfiguration des Layouts:
gantt.config.layout = {
css: "gantt_container",
rows:[
{
cols: [
{
// die Standard-Grid-Ansicht
view: "grid",
scrollX:"scrollHor",
scrollY:"scrollVer"
},
{ resizer: true, width: 1 },
{
// die Standard-Timeline-Ansicht
view: "timeline",
scrollX:"scrollHor",
scrollY:"scrollVer"
},
{
view: "scrollbar",
id:"scrollVer"
}
]},
{
view: "scrollbar",
id:"scrollHor"
}
]
}
Das Gantt-Layout besteht aus Zellen, die mit Ansichten gefüllt werden. Diese Ansichten repräsentieren die Haupt- und Hilfselemente von Gantt, wie zum Beispiel:
Jede Ansicht wird über ein Objekt mit entsprechenden Eigenschaften konfiguriert. Sie können Einstellungen anpassen für die grid- und timeline-Ansichten. Standardmäßig werden die Optionen aus dem globalen gantt.config-Objekt übernommen.
Beachten Sie, dass die Layout-Konfiguration vor der Initialisierung von Gantt festgelegt werden sollte. Wenn Sie das Layout später ändern, aktualisieren Sie es mit resetLayout.
Scrollbalken im Layout werden durch die Ansicht "scrollbar" definiert. Es können sowohl horizontale als auch vertikale Scrollbalken verwendet werden.
Um einen Scrollbalken einzubinden, verknüpfen Sie ihn mit der entsprechenden Ansicht, indem Sie die Eigenschaften scrollX oder scrollY mit der ID des Scrollbalkens festlegen.
Mehrere Ansichten können denselben Scrollbalken gemeinsam nutzen. Um eine Ansicht mit einem Scrollbalken zu verbinden:
Das Platzieren eines Scrollbalkens im cols
-Array erzeugt einen vertikalen Scrollbalken, während das Platzieren im rows
-Array einen horizontalen Scrollbalken erzeugt. Alternativ können Sie die Scrollrichtung explizit mit der Eigenschaft scroll angeben:
{ view: "scrollbar", id:"scroller", scroll: "x" } // horizontal
oder:
{ view: "scrollbar", id:"scroller", scroll: "y" } // vertikal
Hier ein Beispiel, wie benutzerdefinierte Grid- und Timeline-Ansichten an einen vertikalen Scrollbalken gebunden werden:
gantt.config.layout = {
css: "gantt_container",
rows:[
{
cols: [
{
view: "grid",
scrollY:"scrollVer"
},
{ resizer: true, width: 1 },
{
view: "timeline",
scrollY:"scrollVer"
},
{
view: "scrollbar",
id:"scrollVer"
}
]}
]
}
Durch das Scrollen des vertikalen Scrollbalkens werden sowohl Grid als auch Timeline gemeinsam verschoben. Im Standardlayout sind Grid- und Timeline-Ansichten sowohl mit horizontalen als auch mit vertikalen Scrollbalken verbunden.
Sie können auch einen separaten horizontalen Scrollbalken nur für die Grid-Ansicht festlegen. Details dazu finden Sie im entsprechenden Abschnitt.
Wie bereits gezeigt, können Sie einer Ansicht einen einzelnen Scrollbalken mit einer einfachen Layout-Konfiguration zuweisen, zum Beispiel:
{cols: [ {rows: [{}, {}]}, {rows: [{}, {}]}]}
oder
{rows: [ {cols: [{}, {}]}, {cols: [{}, {}]}]}
Wenn Sie eine Ansicht sowohl mit vertikalen als auch mit horizontalen Scrollbalken verbinden möchten, benötigen Sie ein komplexeres Layout, in dem cols
- und rows
-Arrays mehrfach verschachtelt sind, zum Beispiel:
{cols: [
{
rows: [
{
cols: [{}, {}]
},
{
cols: [{}, {}]
}
]
},
{
rows: [
{
cols: [{}, {}]
},
{
cols: [
{
rows: [{}, {}]
},
{
rows: [{}, {}]
}
]
}
]
}
]}
Sehen Sie sich diese Beispiele an:
Sie können das Standardlayout anpassen und ein Layout-Schema definieren, das Ihren Anforderungen entspricht, indem Sie dem Gantt-Diagramm zusätzliche Ansichten hinzufügen.
Um beispielsweise ein Ressourcen-Panel unterhalb des Haupt-Gantt-Diagramms mit zusätzlichen Grid- und Timeline-Ansichten zu erstellen, gehen Sie wie folgt vor:
So könnte die Konfiguration aussehen:
gantt.config.layout = {
css: "gantt_container",
rows:[
{
// das Standardlayout
cols: [
{view: "grid",
config: mainGridConfig, scrollY:"scrollVer"},
{resizer: true, width: 1},
{view: "timeline",
scrollX:"scrollHor", scrollY:"scrollVer"},
{view: "scrollbar", id:"scrollVer"}
]
},
{resizer: true, width: 1},
{
// ein benutzerdefiniertes Layout
cols: [
{view: "grid", id: "resourceGrid", bind:"resource",
config:resourceGridConfig, scrollY:"resourceVScroll"},
{resizer: true, width: 1},
{view:"timeline", id:"resourceTimeline", scrollX:"scrollHor",
bind:"resource", bindLinks: null, layers: resourceLayers,
scrollY:"resourceVScroll"},
{view: "scrollbar", id:"resourceVScroll"}
]
},
{view: "scrollbar", id:"scrollHor"}
]
};
In diesem Beispiel zeigt eine zusätzliche Grid-Ansicht Ressourcen und deren Arbeitslast an, während die zusätzliche Timeline die Verteilung der Arbeitsstunden über den Monat darstellt und dabei Standard- und Überstunden hervorhebt.
Benutzerdefinierte Grid- und Timeline-Ansichten umfassen einige zusätzliche Eigenschaften:
Um benutzerdefinierte Ansichten mit den richtigen Daten zu füllen, muss ein separater Datenspeicher hinzugefügt werden. Die Erstellung eines neuen Datenspeichers erfolgt über die Methode createDatastore, bei der Sie die Konfiguration des Datenspeichers angeben:
var resourcesStore = gantt.createDatastore({
name:"resource",
initItem: function(item){
item.id = item.key || gantt.uid();
return item;
}
});
In diesem Beispiel wird ein Datenspeicher mit dem Namen "resource" erstellt.
Um Daten aus dem Datenspeicher in benutzerdefinierte Ansichten zu laden, wird die Methode parse verwendet:
resourcesStore.parse([// resources
{key:'0', label: "N/A"},
{key:'1', label: "John"},
{key:'2', label: "Mike"},
{key:'3', label: "Anna"}
]);
Um ein Konfigurationsobjekt für einen bestimmten Datenspeicher zu erhalten, verwenden Sie die Methode getDatastore:
var tasksStore = gantt.getDatastore("task");
Diese Methode erwartet den Namen des Datenspeichers als Parameter.
Bei der Verwendung von integrierten Ressourcenansichten kann der gantt den Datenspeicher automatisch erstellen. Weitere Details hier.
Manchmal ist es notwendig, die Resizer zwischen den gantt-Zellen dynamisch zu deaktivieren. Der einfachste Weg ist, sie per CSS auszublenden.
Sie können dazu folgende CSS-Regel verwenden:
.no_resizers .gantt_resizer{
display:none;
}
Fügen Sie anschließend die Klasse dem gantt-Container hinzu, um die Resizer auszublenden:
gantt.$container.classList.add("no_resizers");
Um die Resizer wieder anzuzeigen, entfernen Sie einfach die Klasse:
gantt.$container.classList.remove("no_resizers");
Benutzerdefiniertes HTML kann ebenfalls als innere Ansicht innerhalb des Gantt-Layouts verwendet werden. Hier ein Beispiel:
gantt.config.layout = {
css: "gantt_container",
rows: [
{
cols: [
{view: "grid",scrollX: "scrollHor", scrollY: "scrollVer"},
{ html:"<div class='custom-content'>custom content</div>",
css:"custom-content", width:50},
{view: "timeline", scrollX: "scrollHor", scrollY: "scrollVer"},
{ html:"<div class='custom-content'>custom content</div>",
css:"custom-content", width:50},
{view: "scrollbar", id: "scrollVer"}
]
},
{view: "scrollbar", scroll: "x", id: "scrollHor"}
]
}
Die öffentliche API des gantt-Objekts umfasst Methoden, die an bestimmte Layout-Ansichten gebunden sind, wie getTaskPosition, getTaskNode und getScrollState.
Damit diese Methoden korrekt funktionieren, muss das Layout das Standard-Grid, die Zeitleiste, die Scrollleisten enthalten und der gantt muss diese finden können. Dies wird erreicht, indem bestimmten Ansichten spezifische IDs zugewiesen werden:
gantt.config.layout = {
css: "gantt_container",
rows: [
{
cols: [
{view: "grid", id: "grid", scrollX: "scrollHor", scrollY: "scrollVer"},
{view: "timeline", id: "timeline", scrollX: "scrollHor", scrollY: "scrollVer"},
{view: "scrollbar", id: "scrollVer"}
]
},
{view: "scrollbar", id: "scrollHor"}
]
};
Die erforderlichen Ansichten und ihre IDs sind:
Falls keine ID gesetzt ist, verwendet gantt entweder den View-Namen als Standard-ID oder generiert automatisch eine eindeutige ID. Für das Standard-Grid und die Zeitleiste kann der "id"-Parameter also weggelassen werden:
gantt.config.layout = {
css: "gantt_container",
rows: [
{
cols: [
{view: "grid", scrollX: "scrollHor", scrollY: "scrollVer"},
{view: "timeline", scrollX: "scrollHor", scrollY: "scrollVer"},
{view: "scrollbar", id: "scrollVer"}
]
},
{view: "scrollbar", id: "scrollHor"}
]
};
Sie können beliebig viele zusätzliche Ansichten zum Layout hinzufügen.
Grid- und Timeline-Ansichten verwenden Templates und Konfigurationen aus den globalen gantt.config/gantt.templates. Diese können jedoch für bestimmte Ansichten auf Layout-Ebene überschrieben werden.
Beispiel:
var secondGridColumns = {
columns: [
{
name: "status", label: "Status", width: 60, align: "center",
template: function (task) {
var progress = task.progress || 0;
return Math.floor(progress * 100) + "";
}
},
{
name: "impact", width: 80, label: "Impact", template: function (task) {
return (task.duration * 1000).toLocaleString("en-US", {
style: 'currency', currency: 'USD'
});
}
}
]
};
gantt.config.layout = {
css: "gantt_container",
rows: [
{
cols: [
{view: "grid", id: "grid", width: 320, scrollY: "scrollVer"},
{resizer: true, width: 1},
{view: "timeline", id: "timeline", scrollX: "scrollHor", scrollY: "scrollVer"},
{resizer: true, width: 1},
{view: "grid", width: 120, bind:"task",
scrollY:"scrollVer", config:secondGridColumns}, {view: "scrollbar", scroll: "y", id: "scrollVer"}
]
},
{view: "scrollbar", id: "scrollHor", height: 20}
]
};
Ansichten können auch Konfigurationen und Templates vom übergeordneten Layout erben:
var resourceConfig = { scale_height: 30 };
gantt.config.layout = {
css: "gantt_container",
rows: [
{
cols: [
{view: "grid", group:"grids", scrollY: "scrollVer"},
{resizer: true, width: 1},
{view: "timeline", scrollX: "scrollHor", scrollY: "scrollVer"},
{view: "scrollbar", id: "scrollVer", group:"vertical"}
],
gravity:2
},
{resizer: true, width: 1},
{
config: resourceConfig, cols: [
{view: "resourceGrid", group:"grids", width: 435, scrollY: "resourceVScroll" },
{resizer: true, width: 1},
{view: "resourceTimeline", scrollX: "scrollHor", scrollY: "resourceVScroll"},
{view: "scrollbar", id: "resourceVScroll", group:"vertical"}
],
gravity:1
},
{view: "scrollbar", id: "scrollHor"}
]
};
Weitere Informationen finden Sie im Artikel Resource Management.
Manchmal ist es nützlich, die Sichtbarkeit bestimmter Layout-Elemente zu synchronisieren. Wenn sich beispielsweise horizontale Scrollleisten in benachbarten Zellen befinden, möchten Sie vielleicht, dass beide gleichzeitig angezeigt oder ausgeblendet werden.
Related sample: Horizontal scroll inside Grid
Ein weiteres Beispiel ist, wenn mehrere Grids in unterschiedlichen Zeitleisten-Zeilen die gleiche Breite teilen sollen. Wenn ein Grid in der Breite angepasst wird, sollen sich die anderen entsprechend anpassen.
Related sample: Resource load diagram
Beide Szenarien lassen sich mit der group-Eigenschaft einer Ansicht lösen. Diese Eigenschaft akzeptiert einen beliebigen String, und Ansichten mit demselben group-Wert werden synchronisiert.
Beispiel für die Synchronisation der Sichtbarkeit von Scrollleisten:
gantt.config.layout = {
css: "gantt_container",
cols: [
{
width:400,
minWidth: 200,
maxWidth: 600,
rows:[
{view: "grid", scrollX: "gridScroll", scrollable: true, scrollY: "scrollVer"},
{view: "scrollbar", id: "gridScroll", group:"horizontal"} ]
},
{resizer: true, width: 1},
{
rows:[
{view: "timeline", scrollX: "scrollHor", scrollY: "scrollVer"},
{view: "scrollbar", id: "scrollHor", group:"horizontal"} ]
},
{view: "scrollbar", id: "scrollVer"}
]
};
Beispiel für die Synchronisation der Grid-Breiten:
gantt.config.layout = {
css: "gantt_container",
rows: [
{
cols: [
{view: "grid", group:"grids", scrollY: "scrollVer"},
{resizer: true, width: 1},
{view: "timeline", scrollX: "scrollHor", scrollY: "scrollVer"},
{view: "scrollbar", id: "scrollVer", group:"vertical"} ],
gravity:2
},
{resizer: true, width: 1},
{
config: resourceConfig,
cols: [
{view: "resourceGrid", group:"grids", width: 435, scrollY: "resourceVScroll" },
{resizer: true, width: 1},
{view: "resourceTimeline", scrollX: "scrollHor", scrollY: "resourceVScroll"},
{view: "scrollbar", id: "resourceVScroll", group:"vertical"} ],
gravity:1
},
{view: "scrollbar", id: "scrollHor"}
]
};
Die relativen Größen der Gantt-Layout-Zellen können mit der gravity-Eigenschaft in der Konfiguration jeder Zelle gesteuert werden. Dieser Wert legt das Größenverhältnis zwischen den Zellen fest.
gantt.config.layout = {
css: "gantt_container",
rows: [
{
cols: [
// columns config
],
gravity:2 },
{ resizer: true, width: 1 },
{
config: resourceConfig,
cols: [
// columns config
],
gravity:1 },
{view: "scrollbar", id: "scrollHor"}
]
};
In diesem Beispiel teilen sich das Gantt-Diagramm und das Ressourcen-Diagramm den Platz im Verhältnis 2:1. Das bedeutet, das Gantt-Diagramm nimmt etwa 66% ein, das Ressourcen-Diagramm etwa 33%. Mit einem Verhältnis von 1:1 wird der Platz gleichmäßig aufgeteilt.
Um die Größe von Layout-Teilen beim Resizing zu begrenzen, verwenden Sie die Eigenschaften minWidth/maxWidth für Zellen innerhalb des cols-Arrays. Entsprechend können minHeight/maxHeight für Zellen im rows-Array gesetzt werden, um die Höhenbegrenzung zu steuern.
Hier ein Beispiel, wie minWidth/maxWidth in Spaltenkonfigurationen genutzt werden:
gantt.config.grid_elastic_columns = true;
gantt.config.layout = {
css: "gantt_container",
cols: [
{
width: 400,
minWidth: 200, maxWidth: 600, rows: [
{
view: "grid", scrollable: true, scrollX: "scrollHor1", scrollY: "scrollVer"
},
{
view: "scrollbar", id: "scrollHor1", scroll: 'x', group: 'hor'
},
]
},
{ resizer: true, width: 1 },
{
rows: [
{
view: "timeline", scrollX: "scrollHor", scrollY: "scrollVer"
},
{
view: "scrollbar", id: "scrollHor", scroll: 'x', group: 'hor'
},
]
},
{
view: "scrollbar", id: "scrollVer"
}
]
}
Wenn eine Layout-Ansicht ausgeblendet werden soll, sobald alle untergeordneten Ansichten unsichtbar sind, setzen Sie hide_empty:true in der Konfiguration dieser Layout-Zelle, wie folgt:
gantt.config.layout = {
css: "gantt_container",
cols: [
{
hide_empty: true, rows:[
{view: "grid"}
]
},
{resizer: true},
{
hide_empty: true, rows:[
{view: "timeline"}
]
}
]
};
Related sample: Hiding grid/timeline views
Um zwischen verschiedenen Layout-Ansichten zu wechseln, lesen Sie die Abschnitte How to toggle grid/chart und How to toggle the resource view für detaillierte Anweisungen.
Es ist möglich, ein Gantt-Diagramm mit einer oder mehreren eingefrorenen Spalten zu initialisieren. Anleitungen dazu finden Sie im Abschnitt How to freeze/fix columns in the grid.
Zurück nach oben