addTaskLayer

zeigt eine zusätzliche Ebene mit benutzerdefinierten Elementen für eine Aufgabe im Timeline-Bereich an

string addTaskLayer(TaskLayerRender | TaskLayerConfig func);
funcTaskLayerRender | TaskLayerConfigeine Render-Funktion oder ein Konfigurationsobjekt
stringein DOM-Element, das in der Ebene angezeigt wird

Available only in PRO Edition

Example

gantt.init("gantt_here");
gantt.addTaskLayer(function draw_deadline(task) {
    if (task.deadline) {
        var el = document.createElement('div');
        el.className = 'deadline';
        var sizes = gantt.getTaskPosition(task, task.deadline);
 
        el.style.left = sizes.left + 'px';
        el.style.top = sizes.top + 'px';
 
        el.setAttribute('title', gantt.templates.task_date(task.deadline));
        return el;
    }
    return false;
});

Related samples

Details

Diese Funktionalität ist nur in der PRO-Edition verfügbar.

Das Argument kann folgende Typen haben:

  • taskLayerRender (task, timeline, config, viewport): HTMLElement|boolean|void - eine Funktion, die ein Aufgabenobjekt als Parameter nimmt und ein DOM-Element zurückgeben muss, das in der Ebene angezeigt wird.

    • task - (Task) - das Aufgabenobjekt
    • timeline? - (any) - die Timeline-Ansicht
    • config? - (GanttConfigOptions) - das Gantt-Konfigurationsobjekt
    • viewport? - (LayerViewport) - das Viewport-Objekt
  • taskLayerConfig - (object) - das Konfigurationsobjekt für die zusätzliche Aufgabenebene. Hat die folgenden Eigenschaften:

    • id? - (string | number) - optional, die Ebenen-ID
    • renderer - (object) - obligatorisch, eine Funktion, die für das Rendern der Elemente der Ebene verantwortlich ist
      • render - (TaskLayerRender) - die Funktion, die das zu rendernde HTML-Element zurückgibt
      • update? - (Function): void - optional, eine Funktion, in der Sie die gerenderten HTML-Elemente aktualisieren können
        • task - (Task) - das Aufgabenobjekt
        • node - (HTMLElement) - der Container des gerenderten Knotens
        • timeline? - (any) - die Timeline-Ansicht
        • config? - (GanttConfigOptions) - das Gantt-Konfigurationsobjekt
        • viewport? - (LayerViewport) - das Viewport-Objekt
      • onrender? - (Function): void - optional, diese Funktion wird nach Abschluss des Renderings aufgerufen. Sie können es verwenden, um native Komponenten zu rendern (zum Beispiel mit der Methode ReactDOM.render)
        • task - (Task) - das Aufgabenobjekt
        • node - (HTMLElement) - der Container des gerenderten Knotens
        • view? - (any) - die Layout-Zelle, in die die Ebene hinzugefügt wird (standardmäßig Timeline)
      • getRectangle? - (Function): { left: number, top: number, height: number, width: number } | void - optional, eine Funktion, die die Koordinaten des Viewport-Rechtecks zurückgibt
        • task - (Task) - das Aufgabenobjekt
        • view? - (any) - die Layout-Zelle, in die die Ebene hinzugefügt wird (standardmäßig Timeline)
        • config? - (GanttConfigOptions) - das Gantt-Konfigurationsobjekt
        • gantt? - (GanttStatic) - das Gantt-Objekt
      • getVisibleRange - (Function): {start: number, end: number} | undefined | void - eine Funktion, die das Objekt mit dem sichtbaren Bereich zurückgibt
        • gantt? - (GanttStatic) - das Gantt-Objekt
        • view? - (any) - die Layout-Zelle, in die die Ebene hinzugefügt wird (standardmäßig Timeline)
        • config? - (GanttConfigOptions) - das Gantt-Konfigurationsobjekt
        • datastore? - (any) - das Aufgaben-Datastore-Objekt
        • viewport? - (LayerViewport) - das Viewport-Objekt
    • container? - (HTMLElement) - optional, ein Container der Ebene
    • topmost? - (boolean) - optional, wenn true, wird das Element über der Aufgabe angezeigt
    • filter? - (Function): boolean - optional, eine Funktion, die ein Aufgabenobjekt als Parameter nimmt. Wenn 'false' zurückgegeben wird, wird die 'renderer'-Funktion für eine Aufgabe nicht aufgerufen
      • task - (Task) - das Aufgabenobjekt

Der Layer-Viewport hat diese Eigenschaften:

  • viewport - (object) - das Layer-Viewport-Objekt

    • x - (number) - die linke Rechteckposition
    • x_end - (number) - die rechte Rechteckposition
    • y - (number) - die obere Rechteckposition
    • y_end - (number) - die untere Rechteckposition
    • width - (number) - die Breite des Rechtecks
    • height - (number) - die Höhe des Rechtecks
  • Beachten Sie, dass benutzerdefinierte Ebenen nach dem nächsten Aufruf von gantt.init zurückgesetzt werden.

  • Der Aufruf der Methode gantt.resetLayout() wird ebenfalls benutzerdefinierte Ebenen zurücksetzen. Damit benutzerdefinierte Ebenen auf einer Seite angezeigt werden, müssen Sie die gantt.addTaskLayer-Methode nach dem Aufruf von resetLayout neu definieren.

Smart Rendering für benutzerdefinierte Ebenen

Smart Rendering versucht, nur die HTML-Elemente anzuzeigen, die dem Benutzer aktuell sichtbar sind und nicht unter horizontalen und vertikalen Scrollleisten verborgen sind.

Im Falle von benutzerdefinierten Ebenen weiß Gantt jedoch nicht, wo benutzerdefinierte Elemente platziert sind, da dies vollständig der Implementierung der benutzerdefinierten Rendering-Funktion überlassen ist.

Als Lösung geht das Smart Rendering davon aus, dass sich ein benutzerdefiniertes Element in derselben Zeile befindet, in der sich seine zugehörige Aufgabe befindet. Benutzerdefinierte Elemente werden zur Seitenmarkierung hinzugefügt, wenn Zeilen ihrer zugehörigen Aufgaben auf dem Bildschirm gerendert werden. In diesem Modus berücksichtigt Gantt die Position der horizontalen Scrollleiste nicht, ein benutzerdefiniertes Element wird in der Markierung gerendert, ist jedoch aufgrund des horizontalen Scrollens nicht auf der Seite sichtbar.

Meistens ist das ausreichend, aber wenn Sie viele Ebenen haben, möchten Sie das Rendering möglicherweise noch weiter optimieren, indem Sie Gantt Informationen zur Position der benutzerdefinierten Elemente bereitstellen.

Dazu müssen Sie den object-Parameter der addTaskLayer()-Methode verwenden und dem renderer-Objekt die folgenden Methoden bereitstellen:

  • render - eine Rendering-Funktion
  • getRectangle - eine Funktion, die ein Objekt mit den Koordinaten der benutzerdefinierten Elemente zurückgibt
gantt.addTaskLayer({
    renderer: {
        render: function(task, timeline, viewport){
            ...
            return  HTMLElement
        },
        getRectangle: function(task, view){
            ....
            return {left, top, height, width};
        }
    }
});

Die Logik des Renderings benutzerdefinierter Elemente ist folgende:

1. Wenn sich die Position des horizontalen Scrolls ändert, erhält das Smart Rendering neue Koordinaten des Bereichs, der derzeit auf dem Bildschirm sichtbar ist.
2. dhtmlxGantt ruft die getRectangle-Funktion für jede Aufgabe/Verbindung auf, um die genauen Koordinaten eines benutzerdefinierten Elements zu erhalten.
3. Wenn die getRectangle-Funktion den Wert null zurückgibt, wird die render-Funktion nicht aufgerufen und das benutzerdefinierte Element wird nicht angezeigt.
4. Wenn die getRectangle-Funktion ein Objekt mit den Koordinaten einer Aufgabe/Verbindung zurückgibt und die erhaltenen Koordinaten in den aktuellen Viewport fallen, wird die render-Funktion aufgerufen, um eine Aufgabe/Verbindung anzuzeigen.

gantt.addTaskLayer({
    renderer: {
      render: function draw_planned(task) {
        if (task.planned_start && task.planned_end) {
          var sizes = gantt.getTaskPosition(task,task.planned_start,task.planned_end);
          var el = document.createElement('div');
          el.className = 'baseline';
          el.style.left = sizes.left + 'px';
          el.style.width = sizes.width + 'px';
          el.style.top = sizes.top + gantt.config.task_height + 13 + 'px';
          return el;
        }
        return false;
      },
      // define getRectangle in order to hook layer with the smart rendering
      getRectangle: function(task, view){
        return gantt.getTaskPosition(task, task.planned_start, task.planned_end);
      }
    }
});

Rendering sichtbarer Teile benutzerdefinierter Elemente

Das renderer-Objekt der addTaskLayer()-Methode bietet die Möglichkeit, das Node-Markup eines benutzerdefinierten Elements zu aktualisieren und den sichtbaren Inhalt im aktuellen Viewport über die update-Methode anzuzeigen:

gantt.addTaskLayer({
    renderer: {
        render: function(task, timeline, viewport){
            ...
            return  HTMLElement
        },
        update: function(task, node, timeline, viewport){
            ...
            // setzen Sie den aktuell sichtbaren Teil des Elements in den inneren HTML-Code des Knotens
        },
        getRectangle: function(task, view){
            ....
            return {left, top, height, width};
        }
    }
});
  • update - ermöglicht das Aktualisieren des inneren HTML-Codes eines benutzerdefinierten Elements, d.h. das Verbergen nicht sichtbarer Zellen und das Anzeigen der sichtbaren

Die update-Methode wird aufgerufen, nachdem das onGanttScroll-Ereignis ausgelöst wurde. Es bietet einen Aufgaben-Knoten (der ursprünglich von der render-Methode erstellt wurde) und einen aktuellen Viewport.

Rendering sichtbarer Aufgabenzeilen

Seit v7.1.8 ermöglicht das renderer-Objekt der addTaskLayer()-Methode das Abrufen eines sichtbaren Bereichs von Aufgabenzeilen mit der getVisibleRange-Funktion:

gantt.addTaskLayer({
    renderer: {
        render: function(task, timeline, viewport){
            ...
            return  HTMLElement
        },
        getVisibleRange: function(){
            ...
            return { 
                start: indexStart,
                end: indexEnd
            }
        }
    }
});
  • getVisibleRange - eine Funktion, die ein Objekt mit den Start- und Endindizes der sichtbaren Aufgabenzeilen zurückgibt. Wenn eine Aufgabe außerhalb des angegebenen Bereichs liegt, wird für sie keine zusätzliche Ebene gerendert.

Wenn die getVisibleRange-Funktion anstelle eines Objekts false zurückgibt, nimmt Gantt an, dass der gesamte Bereich der Aufgaben verwendet wird und eine zusätzliche Ebene gerendert wird, auch wenn eine Aufgabe nicht auf dem Bildschirm sichtbar ist.

Element-Render-Callback

Das renderer-Objekt der addTaskLayer()-Methode bietet den onrender-Callback:

gantt.addTaskLayer({
    renderer: {
        render: function(task, timeline, viewport){
            ...
            return  HTMLElement
        },
        onrender: function(item, node, view){
            console.log("render", item, node)
        }
    }
});

Die onrender-Funktion wird aufgerufen, wenn immer das Daten-Item der Ebene im DOM gerendert wird. Die Argumente geben Ihnen Zugriff auf das gerenderte Daten-Item, das resultierende DOM-Element und das View-Objekt, das das Rendern aufgerufen hat (Grid oder Timeline).

Der Callback kann entweder verwendet werden, um DOM-Elemente nach dem Rendern im DOM zu modifizieren oder um Drittanbieter-Widgets innerhalb der gerenderten Elemente zu initialisieren.

See also
  • API
  • Articles
  • Zurück nach oben