Skip to content

Das Kanban-Modul verbindet strukturierte Darstellung mit interaktiver Steuerung. So organisierst du Projekte, Aufgaben und Arbeitsflüsse klar und flexibel. Wie bei all unseren Modulen stehen hohe Performance und maximale Flexibilität im Mittelpunkt. Zu den Highlights gehören:

  • Einfache Gruppierung von Cards in Spalten und Gruppen
  • Verschieben von Cards per Drag & Drop, auch auf mobilen Geräten
  • Umfrangreiche Optionen für Actions, Updates on Drop und Interaktionsbeschränkungen
  • Karten innerhalb von Spalten und Gruppen per Drag & Drop sortieren
  • Add-Button zum Erstellen neuer Cards

Eyecatcher Kanban

Funktionen und Aussehen

Im Kanban-Modul dreht sich alles um das Anordnen und Gruppieren deiner Cards. Du ordnest sie den Kanban-Spalten zu und kannst sie innerhalb der Spalten zusätzlich in beliebig vielen Ebenen gruppieren. Spalten und Gruppen bieten praktische Funktionen: Titel anpassen, Styling über CSS-Classes und Inline-Styles steuern sowie ein- und ausklappen.

Der Inhalt der Cards ist frei gestaltbar und kann Text, andere GIP- Module sowie HTML-Elemente enthalten. Deiner Kreativität sind keine Grenzen gesetzt. Auch die Cards kannst du individuell stylen, indem du entweder den Style-Key für Inline-Styles nutzt oder den Class-Key, um deine globalen Classes zu referenzieren.

Nutzer-Interaktion

Karten sind die zentralen Elemente deines Kanban-Boards. Du verschiebst sie ganz einfach per Drag & Drop zwischen Spalten und kannst sie auch innerhalb einer Spalte neu sortieren. In beiden Fällen stehen die spezielle Keys zur Verfügung, um diese Updates in Ninox-Felder zu übertragen. Zusätzlich kannst du Regeln festlegen, welche Cards wohin gezogen werden dürfen.

Wenn du das Verschieben von Karten für das komplette Board deaktivieren möchtest, kannst du unseren integrierten Lock-Button. Das ist besonders auf mobilen Geräten hilfreich, auf denen Touch-Events schnell zu versehentlichem Verschieben führen. Den Sperrstatus kannst du einfach umschalten und ebenfalls in einem Ninox-Feld speichern.

Für jedes Element deines Boards – Karten, Spalten, Gruppen oder das gesamte Board – kannst du individuelle Aktionen definieren. Jede Aktion wird durch einen Trigger (z.B. Klick oder Mausbewegung) ausgelöst und führt eine Abfolge von Skripten aus. Eine Übersicht möglicher Events findest du in dieser Liste.

Modulcode

json
GIP_kanban({
   uniqueId: "myUniqueName" + Nr,
   embedded: true,
   kanbanColumns: [{
   	titleContent: {
   		value: *any*,
   	},
   	cards: [{
   		recordId: raw(Nr),
   		value: *any*,
   	}],
   }],
})
json
GIP_kanban({
   uniqueId: "myUniqueName" + Nr,
   embedded: true,
   style: "",
   kanbanColumns: [{
   	style: "",
   	titleContent: {
   		style: "",
   		value: *any*,
   	},
   	cards: [{
   		recordId: raw(Nr),
   		style: "",
   		value: *any*,
   		draggable: true,
   	}],
   	cardGroups: [{
   		style: "",
   		titleContent: {
   			style: "",
   			value: *any*,
   		},
   		cards: [{
   			recordId: raw(Nr),
   			style: "",
   			value: *any*,
   			draggable: true,
   		}],
   		droppable: true,
   	}],
   	droppable: true,
   }],
})
json
GIP_kanban({
   uniqueId: "myUniqueName" + Nr,
   embedded: true,
   class: "",
   style: "",
   kanbanColumns: [{
   	class: "",
   	style: "",
   	titleContent: {
   		class: "",
   		style: "",
   		value: *any*,
   		addButton: {
   			tableId: "",
   			changeFieldValues: [{
   				fieldId: "",
   				value: *any*,
   			}],
   			displayAfterCreate: "popup",
   			setNewRecordId: [{
   				recordId: raw(Nr),
   				fieldId: "",
   			}],
   		},
   		actions: [{
   			trigger: "click",
   			scripts: [{
   				type: "",
   			}],
   		}],
   	},
   	cards: [{
   		recordId: raw(Nr),
   		class: "",
   		style: "",
   		sorting: {
   			fieldId: "",
   			sortNr: 1,
   		},
   		value: *any*,
   		actions: [{
   			trigger: "click",
   			scripts: [{
   				type: "",
   			}],
   		}],
   		draggable: true,
   	}],
   	cardGroups: [{
   		class: "",
   		style: "",
   		titleContent: {
   			class: "",
   			style: "",
   			value: *any*,
   			addButton: {
   				tableId: "",
   				changeFieldValues: [{
   					fieldId: "",
   					value: *any*,
   				}],
   				displayAfterCreate: "popup",
   				setNewRecordId: [{
   					recordId: raw(Nr),
   					fieldId: "",
   				}],
   			},
   			actions: [{
   				trigger: "click",
   				scripts: [{
   					type: "",
   				}],
   			}],
   		},
   		cards: [{
   			recordId: raw(Nr),
   			class: "",
   			style: "",
   			sorting: {
   				fieldId: "",
   				sortNr: 1,
   			},
   			value: *any*,
   			actions: [{
   				trigger: "click",
   				scripts: [{
   					type: "",
   				}],
   			}],
   			draggable: true,
   		}],
   		cardGroups: [{
   		}],
   		droppable: true,
   		dropUpdates: [{
   			fieldId: "",
   			value: *any*,
   		}],
   	}],
   	droppable: true,
   	dropUpdates: [{
   		fieldId: "",
   		value: *any*,
   	}],
   }],
   lockButton: {
   	recordId: raw(Nr),
   	fieldId: "",
   	value: *any*,
   },
})
json
GIP_kanban({
   uniqueId: "",
   embedded: {
   	height: "",
   	styleHtml: "",
   	styleStri: "",
   	presets: "",
   },
   class: "",
   style: "",
   kanbanColumns: [{
   	collapseChildren: {
   		recordId: "",
   		fieldId: "",
   		value: *any*,
   	},
   	class: "",
   	collapsible: true,
   	style: "",
   	titleContent: {
   		class: "",
   		style: "",
   		value: *any*,
   		addButton: {
   			tableId: "",
   			tab: "",
   			changeFieldValues: [{
   				fieldId: "",
   				value: *any*,
   			}],
   			displayAfterCreate: "",
   			setNewRecordId: [{
   				recordId: "",
   				fieldId: "",
   			}],
   		},
   		actions: [{
   			trigger: "",
   			scripts: [{
   				type: "",
   			}],
   		}],
   	},
   	cards: [{
   		recordId: "",
   		class: "",
   		style: "",
   		sorting: {
   			fieldId: "",
   			sortNr: 0,
   		},
   		value: *any*,
   		actions: [{
   			trigger: "",
   			scripts: [{
   				type: "",
   			}],
   		}],
   		draggable: {
   		},
   	}],
   	cardGroups: [{
   		collapseChildren: {
   			recordId: "",
   			fieldId: "",
   			value: *any*,
   		},
   		class: "",
   		collapsible: true,
   		style: "",
   		titleContent: {
   			class: "",
   			style: "",
   			value: *any*,
   			addButton: {
   				tableId: "",
   				tab: "",
   				changeFieldValues: [{
   					fieldId: "",
   					value: *any*,
   				}],
   				displayAfterCreate: "",
   				setNewRecordId: [{
   					recordId: "",
   					fieldId: "",
   				}],
   			},
   			actions: [{
   				trigger: "",
   				scripts: [{
   					type: "",
   				}],
   			}],
   		},
   		cards: [{
   			recordId: "",
   			class: "",
   			style: "",
   			sorting: {
   				fieldId: "",
   				sortNr: 0,
   			},
   			value: *any*,
   			actions: [{
   				trigger: "",
   				scripts: [{
   					type: "",
   				}],
   			}],
   			draggable: {
   			},
   		}],
   		cardGroups: [{
   		}],
   		droppable: {
   		},
   		dropUpdates: [{
   			fieldId: "",
   			value: *any*,
   		}],
   	}],
   	droppable: {
   	},
   	dropUpdates: [{
   		fieldId: "",
   		value: *any*,
   	}],
   }],
   lockButton: {
   	recordId: "",
   	fieldId: "",
   	value: *any*,
   },
})
json
html( raw(GIP_master({})) + 
raw(GIP_kanban({
   uniqueId: "",
   embedded: {
   	height: "",
   	styleHtml: "",
   	styleStri: "",
   	presets: "",
   },
   class: "",
   style: "",
   kanbanColumns: [{
   	collapseChildren: {
   		recordId: "",
   		fieldId: "",
   		value: *any*,
   	},
   	class: "",
   	collapsible: true,
   	style: "",
   	titleContent: {
   		class: "",
   		style: "",
   		value: *any*,
   		addButton: {
   			tableId: "",
   			tab: "",
   			changeFieldValues: [{
   				fieldId: "",
   				value: *any*,
   			}],
   			displayAfterCreate: "",
   			setNewRecordId: [{
   				recordId: "",
   				fieldId: "",
   			}],
   		},
   		actions: [{
   			trigger: "",
   			scripts: [{
   				type: "",
   			}],
   		}],
   	},
   	cards: [{
   		recordId: "",
   		class: "",
   		style: "",
   		sorting: {
   			fieldId: "",
   			sortNr: 0,
   		},
   		value: *any*,
   		actions: [{
   			trigger: "",
   			scripts: [{
   				type: "",
   			}],
   		}],
   		draggable: {
   		},
   	}],
   	cardGroups: [{
   		collapseChildren: {
   			recordId: "",
   			fieldId: "",
   			value: *any*,
   		},
   		class: "",
   		collapsible: true,
   		style: "",
   		titleContent: {
   			class: "",
   			style: "",
   			value: *any*,
   			addButton: {
   				tableId: "",
   				tab: "",
   				changeFieldValues: [{
   					fieldId: "",
   					value: *any*,
   				}],
   				displayAfterCreate: "",
   				setNewRecordId: [{
   					recordId: "",
   					fieldId: "",
   				}],
   			},
   			actions: [{
   				trigger: "",
   				scripts: [{
   					type: "",
   				}],
   			}],
   		},
   		cards: [{
   			recordId: "",
   			class: "",
   			style: "",
   			sorting: {
   				fieldId: "",
   				sortNr: 0,
   			},
   			value: *any*,
   			actions: [{
   				trigger: "",
   				scripts: [{
   					type: "",
   				}],
   			}],
   			draggable: {
   			},
   		}],
   		cardGroups: [{
   		}],
   		droppable: {
   		},
   		dropUpdates: [{
   			fieldId: "",
   			value: *any*,
   		}],
   	}],
   	droppable: {
   	},
   	dropUpdates: [{
   		fieldId: "",
   		value: *any*,
   	}],
   }],
   lockButton: {
   	recordId: "",
   	fieldId: "",
   	value: *any*,
   },
})
))

Key-Table

arrow_rightuniqueIdRequired
string
Default: -
Eindeutige Kennung des eingesetzten Moduls. Ideal ist eine Kombination aus Text und der Record-ID, also z.B.: uniqueId: "LayoutÜberschrift" + Nr
Ist die ID nicht einzigartig, kann es zu Fehlern bei Anzeige und Funktion der eingesetzten Module in der Tabelle kommen.
arrow_rightembeddedRequired
boolean, object
Default: false
Wenn des Modul in einem anderen Modul eingebettet ist, wird der boolesche Wert true eingetragen.
Liegt das Modul alleine, bzw. als äußerster Container in einem Formelfeld, kann entweder false oder ein Object mit Angaben zur Höhe und Styling des Formelfeldes angegeben werden.
arrow_rightheight
string
Default: "auto"
Höhe des Moduls in Pixeln (px).
arrow_rightstyleHtml
string
Default: "padding: 0 !important; user-select: none !important; -webkit-user-select: none !important; -ms-user-select: none !important; background: none !important; border-radius: 0px !important; height: auto; min-height: 34px !important;"
Inline CSS-Styling des Html-Containers des Formel-Feldes, in dem die GIP-Module liegen.
arrow_rightstyleStri
string
Default: "background: none !important; border: 0 !important;"
Inline CSS-Styling des Stringeditor-Containers des Formel-Feldes, in dem die GIP-Module liegen.
arrow_rightpresets
string
Default: -
Mit diesem Key können Voreingestellte, besondere Stylings übergeben werden. Die aktuell verfügbaren sind:
  • paddingless: Entfernt Paddings des Ninox-Formelfeldes.
  • borderless: Entfernt Paddings sowie den Titel des Ninox-Formelfeldes und skaliert es auf 100% der Seiten-Höhe.
  • fullscreen: Entfernt die Ninox-Kopfleiste des Records (enthält Tabs, Schließen-Button, Anhänge, Kommentare und Änderungsverlauf). Für eine vollständige Vollbild-Ansicht muss der Record entweder mit der Ninox Funktion "openFullscreen()" oder dem GIP-Action-Type "openFullscreen" geöffnet werden.
Nach Ändern der Presets sollte die Ansicht neu geladen werden. Den Ninox-Tab zu wechseln reicht.
arrow_rightclass
string
Default: -
Styling des Moduls mithilfe der in GIP_globalCSS vordefinierten CSS-Stylings (siehe globaler GIP-Modul-Code). Um mehrere CSS-Stylings zu referenzieren, werden die Class-Namen einfach mit Leerzeichen als String aneinandergereiht.
arrow_rightstyle
string
Default: Siehe <a href="/GlobalerCSS-Code">Globaler CSS-Code</a>
Inline CSS-Styling des Moduls oder Elements.
arrow_rightkanbanColumnsRequired
array of objects
Default: -
Anlagen der Kanban-Spalten mit Informationen zur Cards, Card-Groups, Titel, Stylings, Actions, Drop-Updates und Drop-Einschränkungen.
arrow_rightcollapseChildren
boolean, object
Default: false
Wenn 'true'/'false' angegeben ist, bestimmt dieser Wert, ob beim initialen Laden der Table die Gruppe eingeklappt ist (true) oder nicht (false).
Wenn ein Object angegeben ist mit fieldId, recordId und value, kann so der Collapsed-Status direkt aus Ninox kontrolliert werden.
arrow_rightrecordIdRequired
string
Default: -
ID des Ziel-Records.
arrow_rightfieldIdRequired
string
Default: -
ID des Ziel-Feldes.
arrow_rightvalueRequired
any
Default: -
Eingabe des gewünschten Wertes.
arrow_rightclass
string
Default: -
Styling des Moduls mithilfe der in GIP_globalCSS vordefinierten CSS-Stylings (siehe globaler GIP-Modul-Code). Um mehrere CSS-Stylings zu referenzieren, werden die Class-Namen einfach mit Leerzeichen als String aneinandergereiht.
arrow_rightcollapsible
boolean
Default: true
Mit diesem Key kann eine komplette Gruppe als nicht-einklappbar (false) definiert werden. In diesem Fall ist die Gruppe dauerhaft ausgeklappt und ein Nutzer kann sie nicht einklappen.
arrow_rightstyle
string
Default: Siehe <a href="/GlobalerCSS-Code">Globaler CSS-Code</a>
Inline CSS-Styling des Moduls oder Elements.
arrow_righttitleContent
object
Default: -
Einstellungen zu Inhalt, Styling und Actions des Titels.
arrow_rightclass
string
Default: -
Styling des Moduls mithilfe der in GIP_globalCSS vordefinierten CSS-Stylings (siehe globaler GIP-Modul-Code). Um mehrere CSS-Stylings zu referenzieren, werden die Class-Namen einfach mit Leerzeichen als String aneinandergereiht.
arrow_rightstyle
string
Default: Siehe <a href="/GlobalerCSS-Code">Globaler CSS-Code</a>
Inline CSS-Styling des Moduls oder Elements.
arrow_rightvalueRequired
any
Default: -
Eingabe des gewünschten Wertes.
arrow_rightaddButton
boolean, object
Default: false
Damit der Button einen neuen Ninox-Record erstellen kann, müssen Informationen ähnlich zur create-Action eingetragen werden.
arrow_righttableIdRequired
string
Default: -
ID der Ziel-Tabelle.
arrow_righttab
string
Default: -
Name des Ziel-Tabs.
arrow_rightchangeFieldValues
array of objects
Default: -
Schreibt Werte in Ziel-Felder eines neu erstellten Records.
arrow_rightfieldIdRequired
string
Default: -
ID des Ziel-Feldes.
arrow_rightvalueRequired
any
Default: -
Eingabe des gewünschten Wertes.
arrow_rightdisplayAfterCreate
string
Default: -
Öffnet einen neu erstellten Record wahlweise direkt, als Popup oder als Vollbildansicht.
arrow_rightsetNewRecordId
array of objects
Default: -
Schreibt die ID eines neu erstellten Records in Ziel-Felder von Ziel-Records.
arrow_rightrecordIdRequired
string
Default: -
ID des Ziel-Records.
arrow_rightfieldIdRequired
string
Default: -
ID des Ziel-Feldes.
arrow_rightactions
array of objects
Default: -
Enthält ein Array mehrerer Actions. Jede Action ist aus einem Trigger, der die Action auslöst, und einem Array der auszuführenden Funktionen nach Auslösen des Triggers (Script) aufgebaut.
arrow_righttriggerRequired
string
Default: -
Legt fest, durch welche User-Eingaben die Funktionen der Action ausgelöst werden. Als Trigger können alle HTML Mouse Events gewählt werden.
arrow_rightscriptsRequired
array of objects
Default: -
Enthält ein Array der Funktionen, die durch den Trigger der Aktion ausgeführt werden.
arrow_righttypeRequired
string
Default: -
Der Typ der Funktion wird aus der Liste der verfügbaren Funktionen gewählt.
arrow_rightcardsRequired
array of objects
Default: -
Übergibt die Informationen zu den Cards, wie Inhalte, Stylings, Actions und Sortierung.
arrow_rightrecordIdRequired
string
Default: -
ID des Ziel-Records.
arrow_rightclass
string
Default: -
Styling des Moduls mithilfe der in GIP_globalCSS vordefinierten CSS-Stylings (siehe globaler GIP-Modul-Code). Um mehrere CSS-Stylings zu referenzieren, werden die Class-Namen einfach mit Leerzeichen als String aneinandergereiht.
arrow_rightstyle
string
Default: Siehe <a href="/GlobalerCSS-Code">Globaler CSS-Code</a>
Inline CSS-Styling des Moduls oder Elements.
arrow_rightsorting
object
Default: -
Übergabe von Information zur Sortierposition der Card in der Card-Group und zum Feld, das bei Ändern dieser Sortierung geupdated werden soll.
arrow_rightfieldIdRequired
string
Default: -
ID des Ziel-Feldes.
arrow_rightsortNrRequired
number
Default: -
Sortierposition der Card in der Card-Group.
arrow_rightvalueRequired
any
Default: -
Eingabe des gewünschten Wertes.
arrow_rightactions
array of objects
Default: -
Enthält ein Array mehrerer Actions. Jede Action ist aus einem Trigger, der die Action auslöst, und einem Array der auszuführenden Funktionen nach Auslösen des Triggers (Script) aufgebaut.
arrow_righttriggerRequired
string
Default: -
Legt fest, durch welche User-Eingaben die Funktionen der Action ausgelöst werden. Als Trigger können alle HTML Mouse Events gewählt werden.
arrow_rightscriptsRequired
array of objects
Default: -
Enthält ein Array der Funktionen, die durch den Trigger der Aktion ausgeführt werden.
arrow_righttypeRequired
string
Default: -
Der Typ der Funktion wird aus der Liste der verfügbaren Funktionen gewählt.
arrow_rightdraggable
boolean, object
Default: true
Gibt an, ob ein Drag-Element gezogen werden kann. Es kann ein Boolean-Wert (true / false) oder auch ein Object übergeben werden.
Das Object übergibt den ersten Teil der Payload des Drop-Updates. Der zweite Teil wird im Target im Key droppable definiert. Nur wenn beide Teile der Payload übereinstimmen, kann das Drag-Element auf das Target gedroppt werden.

Beispiel: Wenn droppable: { name: ["Emil", "Anna"] } dürfen nur Elemente hier gedroppt werden, die entweder draggable: { name: "Emil" } oder draggable: { name: "Anna" } haben. Ein Element mit draggable: { name: "Hubert" } oder auch draggable: true wird nicht akzeptiert.
arrow_rightcardGroups
array of objects
Default: -
Gruppierung von Cards mit Information zum anzuzeigenden Titel, Stylings, Actions, Drop-Updates und Drop-Einschränkungen.
arrow_rightcollapseChildren
boolean, object
Default: false
Wenn 'true'/'false' angegeben ist, bestimmt dieser Wert, ob beim initialen Laden der Table die Gruppe eingeklappt ist (true) oder nicht (false).
Wenn ein Object angegeben ist mit fieldId, recordId und value, kann so der Collapsed-Status direkt aus Ninox kontrolliert werden.
arrow_rightrecordIdRequired
string
Default: -
ID des Ziel-Records.
arrow_rightfieldIdRequired
string
Default: -
ID des Ziel-Feldes.
arrow_rightvalueRequired
any
Default: -
Eingabe des gewünschten Wertes.
arrow_rightclass
string
Default: -
Styling des Moduls mithilfe der in GIP_globalCSS vordefinierten CSS-Stylings (siehe globaler GIP-Modul-Code). Um mehrere CSS-Stylings zu referenzieren, werden die Class-Namen einfach mit Leerzeichen als String aneinandergereiht.
arrow_rightcollapsible
boolean
Default: true
Mit diesem Key kann eine komplette Gruppe als nicht-einklappbar (false) definiert werden. In diesem Fall ist die Gruppe dauerhaft ausgeklappt und ein Nutzer kann sie nicht einklappen.
arrow_rightstyle
string
Default: Siehe <a href="/GlobalerCSS-Code">Globaler CSS-Code</a>
Inline CSS-Styling des Moduls oder Elements.
arrow_righttitleContent
object
Default: -
Einstellungen zu Inhalt, Styling und Actions des Titels.
arrow_rightclass
string
Default: -
Styling des Moduls mithilfe der in GIP_globalCSS vordefinierten CSS-Stylings (siehe globaler GIP-Modul-Code). Um mehrere CSS-Stylings zu referenzieren, werden die Class-Namen einfach mit Leerzeichen als String aneinandergereiht.
arrow_rightstyle
string
Default: Siehe <a href="/GlobalerCSS-Code">Globaler CSS-Code</a>
Inline CSS-Styling des Moduls oder Elements.
arrow_rightvalueRequired
any
Default: -
Eingabe des gewünschten Wertes.
arrow_rightaddButton
boolean, object
Default: false
Damit der Button einen neuen Ninox-Record erstellen kann, müssen Informationen ähnlich zur create-Action eingetragen werden.
arrow_righttableIdRequired
string
Default: -
ID der Ziel-Tabelle.
arrow_righttab
string
Default: -
Name des Ziel-Tabs.
arrow_rightchangeFieldValues
array of objects
Default: -
Schreibt Werte in Ziel-Felder eines neu erstellten Records.
arrow_rightfieldIdRequired
string
Default: -
ID des Ziel-Feldes.
arrow_rightvalueRequired
any
Default: -
Eingabe des gewünschten Wertes.
arrow_rightdisplayAfterCreate
string
Default: -
Öffnet einen neu erstellten Record wahlweise direkt, als Popup oder als Vollbildansicht.
arrow_rightsetNewRecordId
array of objects
Default: -
Schreibt die ID eines neu erstellten Records in Ziel-Felder von Ziel-Records.
arrow_rightrecordIdRequired
string
Default: -
ID des Ziel-Records.
arrow_rightfieldIdRequired
string
Default: -
ID des Ziel-Feldes.
arrow_rightactions
array of objects
Default: -
Enthält ein Array mehrerer Actions. Jede Action ist aus einem Trigger, der die Action auslöst, und einem Array der auszuführenden Funktionen nach Auslösen des Triggers (Script) aufgebaut.
arrow_righttriggerRequired
string
Default: -
Legt fest, durch welche User-Eingaben die Funktionen der Action ausgelöst werden. Als Trigger können alle HTML Mouse Events gewählt werden.
arrow_rightscriptsRequired
array of objects
Default: -
Enthält ein Array der Funktionen, die durch den Trigger der Aktion ausgeführt werden.
arrow_righttypeRequired
string
Default: -
Der Typ der Funktion wird aus der Liste der verfügbaren Funktionen gewählt.
arrow_rightcardsRequired
array of objects
Default: -
Übergibt die Informationen zu den Cards, wie Inhalte, Stylings, Actions und Sortierung.
arrow_rightrecordIdRequired
string
Default: -
ID des Ziel-Records.
arrow_rightclass
string
Default: -
Styling des Moduls mithilfe der in GIP_globalCSS vordefinierten CSS-Stylings (siehe globaler GIP-Modul-Code). Um mehrere CSS-Stylings zu referenzieren, werden die Class-Namen einfach mit Leerzeichen als String aneinandergereiht.
arrow_rightstyle
string
Default: Siehe <a href="/GlobalerCSS-Code">Globaler CSS-Code</a>
Inline CSS-Styling des Moduls oder Elements.
arrow_rightsorting
object
Default: -
Übergabe von Information zur Sortierposition der Card in der Card-Group und zum Feld, das bei Ändern dieser Sortierung geupdated werden soll.
arrow_rightfieldIdRequired
string
Default: -
ID des Ziel-Feldes.
arrow_rightsortNrRequired
number
Default: -
Sortierposition der Card in der Card-Group.
arrow_rightvalueRequired
any
Default: -
Eingabe des gewünschten Wertes.
arrow_rightactions
array of objects
Default: -
Enthält ein Array mehrerer Actions. Jede Action ist aus einem Trigger, der die Action auslöst, und einem Array der auszuführenden Funktionen nach Auslösen des Triggers (Script) aufgebaut.
arrow_righttriggerRequired
string
Default: -
Legt fest, durch welche User-Eingaben die Funktionen der Action ausgelöst werden. Als Trigger können alle HTML Mouse Events gewählt werden.
arrow_rightscriptsRequired
array of objects
Default: -
Enthält ein Array der Funktionen, die durch den Trigger der Aktion ausgeführt werden.
arrow_righttypeRequired
string
Default: -
Der Typ der Funktion wird aus der Liste der verfügbaren Funktionen gewählt.
arrow_rightdraggable
boolean, object
Default: true
Gibt an, ob ein Drag-Element gezogen werden kann. Es kann ein Boolean-Wert (true / false) oder auch ein Object übergeben werden.
Das Object übergibt den ersten Teil der Payload des Drop-Updates. Der zweite Teil wird im Target im Key droppable definiert. Nur wenn beide Teile der Payload übereinstimmen, kann das Drag-Element auf das Target gedroppt werden.

Beispiel: Wenn droppable: { name: ["Emil", "Anna"] } dürfen nur Elemente hier gedroppt werden, die entweder draggable: { name: "Emil" } oder draggable: { name: "Anna" } haben. Ein Element mit draggable: { name: "Hubert" } oder auch draggable: true wird nicht akzeptiert.
arrow_rightcardGroups
array of objects
Default: -
Gruppierung von Cards mit Information zum anzuzeigenden Titel, Stylings, Actions, Drop-Updates und Drop-Einschränkungen.
arrow_rightdroppable
boolean, object
Default: true
Gibt an, ob ein Drag-Element auf dieses Target gedroppt werden kann. Es kann ein Boolean-Wert (true / false) oder auch ein Object übergeben werden.
Das Object übergibt den zweiten Teil der Payload des Drop-Updates und vervollständigt den ersten Teil der Payload, der im Drag-Element im Key draggable definiert wird. Nur wenn beide Teile der Payload übereinstimmen, kann das Drag-Element auf das Target gedroppt werden.

Beispiel: Wenn droppable: { name: ["Emil", "Anna"] } dürfen nur Elemente hier gedroppt werden, die entweder draggable: { name: "Emil" } oder draggable: { name: "Anna" } haben. Ein Element mit draggable: { name: "Hubert" } oder auch draggable: true wird nicht akzeptiert.
arrow_rightdropUpdates
array of objects
Default: -
Mir diesem Key werden die Felder übergeben, wie im Record der Card mit dem angegebenen Wert geupdated werden sollen.
arrow_rightfieldIdRequired
string
Default: -
ID des Ziel-Feldes.
arrow_rightvalueRequired
any
Default: -
Eingabe des gewünschten Wertes.
arrow_rightdroppable
boolean, object
Default: true
Gibt an, ob ein Drag-Element auf dieses Target gedroppt werden kann. Es kann ein Boolean-Wert (true / false) oder auch ein Object übergeben werden.
Das Object übergibt den zweiten Teil der Payload des Drop-Updates und vervollständigt den ersten Teil der Payload, der im Drag-Element im Key draggable definiert wird. Nur wenn beide Teile der Payload übereinstimmen, kann das Drag-Element auf das Target gedroppt werden.

Beispiel: Wenn droppable: { name: ["Emil", "Anna"] } dürfen nur Elemente hier gedroppt werden, die entweder draggable: { name: "Emil" } oder draggable: { name: "Anna" } haben. Ein Element mit draggable: { name: "Hubert" } oder auch draggable: true wird nicht akzeptiert.
arrow_rightdropUpdates
array of objects
Default: -
Mir diesem Key werden die Felder übergeben, wie im Record der Card mit dem angegebenen Wert geupdated werden sollen.
arrow_rightfieldIdRequired
string
Default: -
ID des Ziel-Feldes.
arrow_rightvalueRequired
any
Default: -
Eingabe des gewünschten Wertes.
arrow_rightlockButton
boolean, object
Default: false
Gibt an, ob ein Lock-Button angezeigt werden soll. Mit diesem kann für alle Cards das Verschieben blockiert werden. Soll der Locked-Status auch in Ninox hinterlegt werden, dann wird ein Object mit Informationen zum entsprechenden Feld übergeben.
arrow_rightrecordIdRequired
string
Default: -
ID des Ziel-Records.
arrow_rightfieldIdRequired
string
Default: -
ID des Ziel-Feldes.
arrow_rightvalueRequired
any
Default: -
Eingabe des gewünschten Wertes.

Beispiele

Kanban: Basic ohne Gruppen

Beschreibung

Wir möchten ein Kanban zur Verwaltung von Aufgaben bauen. Dabei sollen die Spalten des Kanbans jeweils einen Aufgaben-Status darstellen.

Im Key kanbanColumns erstellen wir zunächst pro Projektstatus ein Object, indem wir durch die Stati iterieren. Für jede dieser Status-Spalten suchen wir uns dann die dazugehörigen Aufgaben, welche wir als cards übergeben.

json
{
	uniqueId: "ProjektAufgabenVerwaltungBasic" + Nr,
	embedded: false,
	class: "",
	style: "height: 600px;",
	kanbanColumns: for column in allStati do
		let columnTasks := tasks[number(Status) = number(column)];
		column.{
			class: "",
			style: "",
			cards: for card in columnTasks do
				card.{
					class: "",
					style: "border-left: 6px solid " + Verantwortlicher.Farbe + ";",
					recordId: raw(Nr),
					draggable: true,
					value: Bezeichnung,
					actions: [{
							trigger: "click",
							scripts: [{
									type: "popup",
									recordId: raw(Nr)
								}]
						}]
				}
			end
		}
	end
}

Nachdem die Aufgaben in Spalten eingeordnet sind, legen wir noch fest, welchen Titel unsere Spalten haben sollen und ob die Spalten eingeklappt werden können. Wir können mit collapseChildren außerdem einen initialen Einklappstatus festlegen.

json
{
	uniqueId: "ProjektAufgabenVerwaltungBasic" + Nr,
	embedded: false,
	class: "",
	style: "height: 600px;",
	kanbanColumns: for column in allStati do
		let columnTasks := tasks[number(Status) = number(column)];
		column.{
			class: "",
			style: "",
			collapsible: true,
			collapseChildren: {
				recordId: raw(Nr),
				fieldId: fieldId(this, "Collapse in Kanban"),
				value: 'Collapse in Kanban'
			},
			titleContent: {
				class: "",
				style: "background-color: " + Farbe,
				value: Bezeichnung
			},
			cards: for card in columnTasks do
				card.{
					class: "",
					style: "border-left: 6px solid " + Verantwortlicher.Farbe + ";",
					recordId: raw(Nr),
					draggable: true,
					value: Bezeichnung,
					actions: [{
							trigger: "click",
							scripts: [{
									type: "popup",
									recordId: raw(Nr)
								}]
						}]
				}
			end
		}
	end
}

Zuletzt müssen wir noch festlegen, welche Ninox-Felder beim Verschieben einer Aufgabe in eine andere Spalte passieren soll. In unserem Fall möchten wir das Statusfeld in der Aufgabe aktualisieren. Dafür übergeben in dropUpdates in einem Object die Field-ID des Status-Feldes in den Aufgaben und der neue Wert, der gesetzt werden soll, in diesem Fall die Number des Status der Spalte.

json
{
	uniqueId: "ProjektAufgabenVerwaltungBasic" + Nr,
	embedded: false,
	class: "",
	style: "height: 600px;",
	kanbanColumns: for column in allStati do
		let columnTasks := tasks[number(Status) = number(column)];
		column.{
			class: "",
			style: "",
			dropUpdates: [{
					fieldId: fieldId(first(tasks), "Status"),
					value: number(this)
				}],
			collapsible: true,
			collapseChildren: {
				recordId: raw(Nr),
				fieldId: fieldId(this, "Collapse in Kanban"),
				value: 'Collapse in Kanban'
			},
			titleContent: {
				class: "",
				style: "background-color: " + Farbe,
				value: Bezeichnung
			},
			cards: for card in columnTasks do
				card.{
					class: "",
					style: "border-left: 6px solid " + Verantwortlicher.Farbe + ";",
					recordId: raw(Nr),
					draggable: true,
					value: Bezeichnung,
					actions: [{
							trigger: "click",
							scripts: [{
									type: "popup",
									recordId: raw(Nr)
								}]
						}]
				}
			end
		}
	end
}

Es könnten auch noch weitere dropUpdates definiert werden, z.B. welcher Nutzer die Aufgabe zuletzt verschoben hat.

json
dropUpdates: [{
		fieldId: fieldId(first(tasks), "Status"),
		value: number(this)
	},{
		fieldId: fieldId(first(tasks), "Nutzer"),
		value: user()
	}],
Code des Beispiels
json
let allStati := ((select Status) order by Reihenfolge);
let tasks := (select Aufgaben);
html(raw(GIP_master({})) +
raw(GIP_kanban({
		uniqueId: "ProjektAufgabenVerwaltungBasic" + Nr,
		embedded: false,
		class: "",
		style: "height: 600px;",
		kanbanColumns: for column in allStati do
			let columnTasks := tasks[number(Status) = number(column)];
			column.{
				class: "",
				style: "",
				dropUpdates: [{
						fieldId: fieldId(first(tasks), "Status"),
						value: number(this)
					}],
				collapsible: true,
				collapseChildren: {
					recordId: raw(Nr),
					fieldId: fieldId(this, "Collapse in Kanban"),
					value: 'Collapse in Kanban'
				},
				titleContent: {
					class: "",
					style: "background-color: " + Farbe,
					value: Bezeichnung
				},
				cards: for card in columnTasks do
					card.{
						class: "",
						style: "border-left: 6px solid " + Verantwortlicher.Farbe + ";",
						recordId: raw(Nr),
						draggable: true,
						value: Bezeichnung,
						actions: [{
								trigger: "click",
								scripts: [{
										type: "popup",
										recordId: raw(Nr)
									}]
							}]
					}
				end
			}
		end
	})))
json
let allStati := ((select Status) order by Reihenfolge);
let tasks := (select Aufgaben);
GIP_kanban({
	uniqueId: "ProjektAufgabenVerwaltungBasic" + Nr,
	embedded: true,
	class: "",
	style: "height: 600px;",
	kanbanColumns: for column in allStati do
		let columnTasks := tasks[number(Status) = number(column)];
		column.{
			class: "",
			style: "",
			dropUpdates: [{
					fieldId: fieldId(first(tasks), "Status"),
					value: number(this)
				}],
			collapsible: true,
			collapseChildren: {
				recordId: raw(Nr),
				fieldId: fieldId(this, "Collapse in Kanban"),
				value: 'Collapse in Kanban'
			},
			titleContent: {
				class: "",
				style: "background-color: " + Farbe,
				value: Bezeichnung
			},
			cards: for card in columnTasks do
				card.{
					class: "",
					style: "border-left: 6px solid " + Verantwortlicher.Farbe + ";",
					recordId: raw(Nr),
					draggable: true,
					value: Bezeichnung,
					actions: [{
							trigger: "click",
							scripts: [{
									type: "popup",
									recordId: raw(Nr)
								}]
						}]
				}
			end
		}
	end
})

Kanban: Mit Gruppen

Beschreibung

Wir möchten ein Kanban anlegen, in dem unsere Spalten verschiedene Aufgaben-Stati sind. Zusätzlich möchten wir innerhalb dieser Spalten die Aufgaben nach Verantwortlichen gruppieren.

Zunächst legen wir wie gewohnt unsere kanbanColumns an. In diesen definieren wir das dropUpdate für die Spalte: Es soll das Feld "Status" mit dem Status der Spalte aktualisiert werden.

json
{
	uniqueId: "ProjektAufgabenVerwaltungGroups" + Nr,
	embedded: true,
	class: "",
	style: "height: 600px;",
	kanbanColumns: for column in allStati do
		column.{
			class: "",
			style: "",
			dropUpdates: [{
					fieldId: fieldId(first(tasks), "Status"),
					value: number(this)
				}],
			collapsible: true,
			collapseChildren: {
				recordId: raw(Nr),
				fieldId: fieldId(this, "Collapse in Kanban"),
				value: 'Collapse in Kanban'
			},
			titleContent: {
				class: "",
				style: "background-color: " + Farbe,
				value: Bezeichnung
			}
		}
	end
}

Nun legen wir noch Gruppen für die Verantwortlichen in jeder Spalte an. Dafür definieren wir cardGroups innerhalb der kanbanColumns. Die Struktur der Gruppen und der Spalten ist identisch, wir ersetzen nur die Werte der Keys. Bei dropUpdates der cardGroups beziehen wir uns in auf der Feld "Verantwortlicher" in unseren Aufgaben und übergeben die ID des Verantwortlichen. Die cards, also die Aufgaben, übergeben wir in den cardGroups.

json
{
	uniqueId: "ProjektAufgabenVerwaltungGroups" + Nr,
	embedded: true,
	class: "",
	style: "height: 600px;",
	kanbanColumns: for column in allStati do
		column.{
			class: "",
			style: "",
			dropUpdates: [{
					fieldId: fieldId(first(tasks), "Status"),
					value: number(this)
				}],
			collapsible: true,
			collapseChildren: {
				recordId: raw(Nr),
				fieldId: fieldId(this, "Collapse in Kanban"),
				value: 'Collapse in Kanban'
			},
			titleContent: {
				class: "",
				style: "background-color: " + Farbe,
				value: Bezeichnung
			},
			cardGroups: for teamMember in teamMembers do
				let groupTasks := tasks[number(Status) = number(column) and number(Verantwortlicher) = number(teamMember)];
				teamMember.{
					class: "",
					style: "",
					dropUpdates: [{
							fieldId: fieldId(first(tasks), "Verantwortlicher"),
							value: number(this)
						}],
					collapsible: true,
					collapseChildren: false,
					titleContent: {
						class: "",
						style: "color: " + Farbe + ";",
						value: Name
					},
					cards: for card in groupTasks do
						card.{...}
					end
				}
			end
		}
	end
}

Die definierten dropUpdates der Spalten und Gruppen funktionieren sowohl separat (eine Aufgabe in eine neue Spalte ODER eine neue Gruppe ziehen), als auch zusammen (eine Aufgabe in eine neue Spalte UND eine neue Gruppe ziehen). Das bedeutet, dass man der Aufgabe gleichzeitig einen neuen Status und einen neuen Verantwortlichen zuweisen kann.

Code des Beispiels
json
let allStati := ((select Status) order by Reihenfolge);
let teamMembers := (select Mitarbeiter);
let tasks := (select Aufgaben);
html(raw(GIP_master({})) +
raw(GIP_kanban({
		uniqueId: "ProjektAufgabenVerwaltungGroups" + Nr,
		embedded: false,
		class: "",
		style: "height: 600px;",
		kanbanColumns: for column in allStati do
			column.{
				class: "",
				style: "",
				dropUpdates: [{
						fieldId: fieldId(first(tasks), "Status"),
						value: number(this)
					}],
				collapsible: true,
				collapseChildren: {
					recordId: raw(Nr),
					fieldId: fieldId(this, "Collapse in Kanban"),
					value: 'Collapse in Kanban'
				},
				titleContent: {
					class: "",
					style: "background-color: " + Farbe,
					value: Bezeichnung
				},
				cardGroups: for teamMember in teamMembers do
					let groupTasks := tasks[number(Status) = number(column) and number(Verantwortlicher) = number(teamMember)];
					teamMember.{
						class: "",
						style: "",
						dropUpdates: [{
								fieldId: fieldId(first(tasks), "Verantwortlicher"),
								value: number(this)
							}],
						collapsible: true,
						collapseChildren: false,
						titleContent: {
							class: "",
							style: "color: " + Farbe + ";",
							value: Name
						},
						cards: for card in groupTasks do
							card.{
								class: "",
								style: "",
								recordId: raw(Nr),
								draggable: true,
								value: Bezeichnung,
								actions: [{
										trigger: "click",
										scripts: [{
												type: "popup",
												recordId: raw(Nr)
											}]
									}]
							}
						end
					}
				end
			}
		end
	})))
json
let allStati := ((select Status) order by Reihenfolge);
let teamMembers := (select Mitarbeiter);
let tasks := (select Aufgaben);
GIP_kanban({
	uniqueId: "ProjektAufgabenVerwaltungGroups" + Nr,
	embedded: true,
	class: "",
	style: "height: 600px;",
	kanbanColumns: for column in allStati do
		column.{
			class: "",
			style: "",
			dropUpdates: [{
					fieldId: fieldId(first(tasks), "Status"),
					value: number(this)
				}],
			collapsible: true,
			collapseChildren: {
				recordId: raw(Nr),
				fieldId: fieldId(this, "Collapse in Kanban"),
				value: 'Collapse in Kanban'
			},
			titleContent: {
				class: "",
				style: "background-color: " + Farbe,
				value: Bezeichnung
			},
			cardGroups: for teamMember in teamMembers do
				let groupTasks := tasks[number(Status) = number(column) and number(Verantwortlicher) = number(teamMember)];
				teamMember.{
					class: "",
					style: "",
					dropUpdates: [{
							fieldId: fieldId(first(tasks), "Verantwortlicher"),
							value: number(this)
						}],
					collapsible: true,
					collapseChildren: false,
					titleContent: {
						class: "",
						style: "color: " + Farbe + ";",
						value: Name
					},
					cards: for card in groupTasks do
						card.{
							class: "",
							style: "",
							recordId: raw(Nr),
							draggable: true,
							value: Bezeichnung,
							actions: [{
									trigger: "click",
									scripts: [{
											type: "popup",
											recordId: raw(Nr)
										}]
								}]
						}
					end
				}
			end
		}
	end
})