Skip to content

Grid

Das Grid-Modul ermöglicht es dir, Inhalte präzise in einem von dir festgelegten Raster in Zeilen und Spalten anzuordnen. Da es auf dem CSS-Grid-System basiert, hast du die volle Kontrolle über die Strukturierung. Außerdem haben wir wie immer auf hohe Performance und Flexibilität Wert gelegt.

Unterscheidung zwischen Grid und Layout

Das Layout-Modul nutzt seinen flexiblen Charakter, um Elemente dynamisch entlang einer einzigen Achse – also entweder in einer Reihe oder in einer Spalte – zu verteilen und auszurichten. Das Grid-Modul hingegen spannt ein festes Raster mit Zeilen und Spalten auf, das eine präzise, zweidimensionale Positionierung von Elementen erlaubt.

Funktion und Aussehen

Der Aufbau des Grids besteht aus dem äußeren Grid-Raster und Blocks, also Blöcken, die du in diesem Grid-Raster anordnest. Der Inhalt der Blocks ist frei gestaltbar und kann beispielsweise Text, andere GIP- oder arcRider-Module sowie HTML-Elemente enthalten.

Für die Anordnung deiner Blöcke im Grid legst du zunächst die Hauptrichtung fest (horizontal / vertical), in der die Blöcke automatisch angeordnet werden.

  • direction: "horizontal": Deine Blöcke werden in horizontalen Zeilen angeordnet und fließen von links nach rechts.
  • direction: "vertical": Deine Blöcke werden in vertikalen Spalten angeordnet und fließen von oben nach unten.

Sobald das Ende einer Zeile / Spalte erreicht ist, brechen die Blöcke in die nächste Zeile / Spalte um. Damit das Grid weiß, wie viele Block-Elemente in eine Zeile / Spalte passen, definierst du sogenannte Tracks.

  • direction: "horizontal": Dein Track sind die Spalten des Grids.
  • direction: "vertical": Dein Track sind die Zeilen des Grids.

Für Tracks legst du mindestens eine der folgenden Dimensionen fest: Anzahl der Tracks und Weite jedes Tracks. Du kannst eine feste Anzahl von Tracks mit einer variablen Breite festlegen. Oder du legst eine variable Anzahl von Tracks mit festen Breiten fest. Auch eine feste Anzahl mit festen Breiten ist natürlich möglich. Du kannst aber nicht beides (Anzahl und Weite) variabel machen, da dem Grid dann die Info fehlt, wann es umbrechen soll.

In den folgenden Schaubildern haben wir dasselbe Array mit Tiernamen (["Koala", "Panda", "Tiger", "Zebra", "Bison"]) verwendet um drei verschiedene Darstellungen zu erzielen. Sie unterscheiden sich nur in der Hauptausrichtung und der Track-Anzahl.

Variante 1: Ein horizontales Grid mit 3 Tracks

json
{
	direction: "horizontal",
	gridTrackCount: 3,
	block: animalArray.[{
		value: animal
	}]
}
Track 1Track 2Track 3KoalaPandaTigerZebraBison

Variante 2: Ein horizontales Grid mit 4 Tracks

json
{
	direction: "horizontal",
	gridTrackCount: 4,
	block: animalArray.[{
		value: animal
	}]
}
Track 1Track 2Track 3Track 4KoalaPandaTigerZebraBison

Variante 3: Ein vertikales Grid mit 3 Tracks

json
{
	direction: "vertical",
	gridTrackCount: 3,
	block: animalArray.[{
		value: animal
	}]
}
Track 1Track 2Track 3KoalaPandaTigerZebraBison

Du hast außerdem die Möglichkeit, dein Grid und die Blocks unabhängig voneinander zu stylen. Nutzer dafür einfach die style- und class-Keys. Ein besonderer Vorteil des Grids ist außerdem die Möglichkeit, mit einfachen Styling-Angaben einzelne Blöcke über mehrere Zeilen oder mehrere Spalten zu spannen.

Nutzer-Interaktion

Sowohl dem Grid selbst als auch den Blocks kannst du eine beliebige Anzahl an Actions zuweisen. Jede Action besteht aus einem auslösenden Trigger und einem Array von Scripts, die bei Auslösen des Triggers ausgeführt werden. Als Trigger können Klick, Mausbewegung und alle weiteren HTML Mouse Events eingesetzt werden. Je nach Anwendung können auch andere HTML Events funktionieren. Eine Liste solcher Events findest du beispielsweise hier. Weitere Infos zu Actions findest du in diesem Teil unserer Doku.

Modulcode

json
GIP_grid({
   uniqueId: "",
   embedded: {
   	height: "",
   	styleHtml: "",
   	styleStri: "",
   	presets: "",
   },
   gridTrackCount: "" / 0,
   gridTrackSize: "",
   direction: "",
   class: "",
   style: "",
   blocks: [{
   	class: "",
   	style: "",
   	value: *any*,
   	actions: [{
   		trigger: "",
   		scripts: [{
   			type: "",
   		}],
   	}],
   }],
   actions: [{
   	trigger: "",
   	scripts: [{
   		type: "",
   	}],
   }],
})
json
GIP_grid({
   uniqueId: "",
   embedded: {
   },
   blocks: [{
   	value: *any*,
   }],
})
json
html( raw(GIP_master({})) + 
raw(GIP_grid({
   uniqueId: "",
   embedded: {
   	height: "",
   	styleHtml: "",
   	styleStri: "",
   	presets: "",
   },
   gridTrackCount: "" / 0,
   gridTrackSize: "",
   direction: "",
   class: "",
   style: "",
   blocks: [{
   	class: "",
   	style: "",
   	value: *any*,
   	actions: [{
   		trigger: "",
   		scripts: [{
   			type: "",
   		}],
   	}],
   }],
   actions: [{
   	trigger: "",
   	scripts: [{
   		type: "",
   	}],
   }],
})
))

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: -

Inline CSS-Styling des Html-Containers des Formel-Feldes, in dem die GIP-Module liegen.

arrow_rightstyleStri
string

Default: -

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: - borderless: Entfernt Paddings des Ninox-Formelfeldes. - 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.

arrow_rightgridTrackCount
string, number

Default: auto-fit

Legt fest, wie viele Tracks das Grid haben soll. Eine Definition zum Begriff "Tracks" findest du weiter oben in der Modul-Doku. Es können auch "auto-fit" und "auto-fill" als Track-Count übergeben werden. In diesem Fall muss eine feste Track-Size übergeben werden, damit das Grid automatisch den verfügbaren Platz auffüllen kann.

arrow_rightgridTrackSize
string

Default: minmax(150px, 1fr)

Legt die Größe der Tracks für das Grid fest. Eine Definition zum Begriff "Tracks" findest du weiter oben in der Modul-Doku. Es kann auch eine dynamische Weite, wie "1fr" angegeben werden. In diesem Fall muss ein fester Track-Count übergeben werden, damit das Grid den verfügbaren Platz berechnen kann.

arrow_rightdirection
string

Default: "horizontal"

Für die Ausrichtung der Blöcke des Moduls gibt es die Befehle "horizontal" (von links nach rechts nebeneinander) und "vertical" (von oben nach unten untereinander).

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 sie einfach als String mit Leerzeichen zwischen den Class-names aneinandergereiht.

arrow_rightstyle
string

Default: Siehe Globaler CSS-Code

Inline CSS-Styling des Moduls oder Elements.

arrow_rightblocksRequired
array of objects

Default: -

Enthält ein Array der Inhaltsblocks des Moduls. Für jeden Block können Wert, Styling und Aktionen bei Interaktion mit dem Block angegeben werden.

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 sie einfach als String mit Leerzeichen zwischen den Class-names aneinandergereiht.

arrow_rightstyle
string

Default: Siehe Globaler CSS-Code

Inline CSS-Styling des Moduls oder Elements.

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_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.

Beispiele

Grid: Basis Horizontal

Beschreibung

Wir möchten ein horizontales Grid erstellen, dass eine Track-Breite, also eine Spaltenbreite, von mindestens 150px und maximal 1fr hat. Das Grid soll automatisch so viele Tracks wie möglich pro Zeile erzeugen und automatisch in die nächste Zeile umbrechen.

Für diese Anforderung können wir größtenteils die Default-Einstellungen des Grids nutzen. Dort ist für die Tracks, also Spalten des Grids, eine Breite zwischen 150px und 1fr festgelegt durch minmax(150px, 1fr). Zusätzlich sagt repeat(auto-fit, ...), dass wir so viele Spalten wie möglich mit dieser Spaltenbreite pro Zeile erzeugen wollen. Für die Zeilen ist mit auto-flow definiert, dass diese automatisch erzeugt werden sollen.

CSS
grid: auto-flow / repeat(auto-fit, minmax(150px, 1fr));

Wir vergeben zusätzliche eine Höhe für das Grid. Wenn mehr Zeilen erzeugt werden, als in diese Höhe passen, wird das Grid scrollbar. Als Inhalt der Grid-Blöcke wird hier beispielhaft das GIP-Card-Modul verwendet.

Code des Beispiels
json
let speedTestData := ((select '4. Data for Speedtest' where number(Nr) < 20) order by -number(Nr));
let data := {
		uniqueId: "Basis Horizontal" + Nr,
		embedded: false,
		direction: "horizontal",
		class: "",
		style: "height: 900px;",
		blocks: speedTestData.{
			class: "",
			style: "",
			value: GIP_card({
					uniqueId: "Basis Horizontal" + Nr,
					embedded: true,
					direction: "vertical",
					class: "",
					style: "",
					blocks: [{
							style: "",
							value: GIP_materialSymbols({
									icon: "spa"
								})
						}, {
							style: "",
							value: 'Input Text 1'
						}],
					actions: [{
							trigger: "click",
							scripts: [{
									type: "popupRecord",
									recordId: raw(Nr)
								}]
						}]
				})
		}
	};
html(raw(GIP_master({})) + raw(GIP_grid(data)))
json
let speedTestData := ((select '4. Data for Speedtest' where number(Nr) < 20) order by -number(Nr));
GIP_grid({
	uniqueId: "Basis Horizontal" + Nr,
	embedded: true,
	direction: "horizontal",
	class: "",
	style: "height: 900px;",
	blocks: speedTestData.{
		class: "",
		style: "",
		value: GIP_card({
				uniqueId: "Basis Horizontal" + Nr,
				embedded: true,
				direction: "vertical",
				class: "",
				style: "",
				blocks: [{
						style: "",
						value: GIP_materialSymbols({
								icon: "spa"
							})
					}, {
						style: "",
						value: 'Input Text 1'
					}],
				actions: [{
						trigger: "click",
						scripts: [{
								type: "popupRecord",
								recordId: raw(Nr)
							}]
					}]
			})
	}
})

Grid: Basis Vertikal

Beschreibung

Wir möchten ein vertikales Grid erstellen, dass eine Track-Weite, also eine Zeilenhöhe, von mindestens 150px und maximal 1fr hat. Das Grid soll automatisch so viele Tracks wie möglich pro Spalte erzeugen und automatisch in die nächste Spalte umbrechen.

Für diese Anforderung können wir größtenteils die Default-Einstellungen des Grids nutzen. Dort ist für die Tracks, also Zeilen des Grids, eine Höhe zwischen 150px und 1fr festgelegt durch minmax(150px, 1fr). Zusätzlich sagt repeat(auto-fit, ...), dass wir so viele Zeilen wie möglich mit dieser Zeilenhöhe pro Spalte erzeugen wollen. Für die Spalten ist mit auto-flow definiert, dass diese automatisch erzeugt werden sollen.

CSS
grid: repeat(auto-fit, minmax(150px, 1fr)) / auto-flow;

Die Höhe des Ninox-Formelfeldes schrumpft durch embedded: false in diesem Beispiel immer auf die Track-Höhe zusammen. In einem Praxisbeispiel würde man entweder eine feste Höhe für das Grid vergeben oder es in einem Container einbetten, dessen Höhe variiert werden kann. Als Inhalt der Grid-Blöcke wird hier beispielhaft das GIP-Card-Modul verwendet.

Code des Beispiels
json
let speedTestData := ((select '4. Data for Speedtest' where number(Nr) < 20) order by -number(Nr));
let data := {
		uniqueId: "Basis Horizontal" + Nr,
		embedded: false,
		direction: "vertical",
		class: "",
		style: "",
		blocks: speedTestData.{
			class: "",
			style: "",
			value: GIP_card({
					uniqueId: "Basis Horizontal" + Nr,
					embedded: true,
					direction: "vertical",
					class: "",
					style: "height: 100%; width: 150px;",
					blocks: [{
							style: "",
							value: GIP_materialSymbols({
									icon: "spa"
								})
						}, {
							style: "",
							value: 'Input Text 1'
						}],
					actions: [{
							trigger: "click",
							scripts: [{
									type: "popupRecord",
									recordId: raw(Nr)
								}]
						}]
				})
		}
	};
html(raw(GIP_master({})) + raw(GIP_grid(data)))
json
let speedTestData := ((select '4. Data for Speedtest' where number(Nr) < 20) order by -number(Nr));
GIP_grid({
	uniqueId: "Basis Horizontal" + Nr,
	embedded: true,
	direction: "vertical",
	class: "",
	style: "",
	blocks: speedTestData.{
		class: "",
		style: "",
		value: GIP_card({
				uniqueId: "Basis Horizontal" + Nr,
				embedded: true,
				direction: "vertical",
				class: "",
				style: "height: 100%; width: 150px;",
				blocks: [{
						style: "",
						value: GIP_materialSymbols({
								icon: "spa"
							})
					}, {
						style: "",
						value: 'Input Text 1'
					}],
				actions: [{
						trigger: "click",
						scripts: [{
								type: "popupRecord",
								recordId: raw(Nr)
							}]
					}]
			})
	}
})

Grid: Track-Anzahl und -Weite

Beispiel Grid Fixed Track Count And Size

Beschreibung

Wir möchten ein Grid erstellen, in dem wir 5 Tracks mit jeweils einer Breite von 200px haben.

Die Anzahl der Tracks übergeben wir mit gridTrackCount: 5 und die Breite (Weite) der Tracks mit gridTrackSize: "200px". Diese Angaben werden vom GIP-Grid zu folgendem CSS-Ausdruck umgebaut:

CSS
grid: auto-flow / repeat(5, 200px);

Mit diesem Styling platziert das Grid in jeder Zeile 5 Blöcke mit je 200px Breite. Sollte die zur Verfügung stehende Breite nicht ausreichen, wird das Grid scrollbar.

Code des Beispiels
json
let speedTestData := ((select '4. Data for Speedtest' where number(Nr) < 20) order by -number(Nr));
let data := {
		uniqueId: "Fixed Tracks" + Nr,
		embedded: false,
		direction: "horizontal",
		gridTrackCount: 5,
		gridTrackSize: "200px",
		class: "",
		style: "height: 900px;",
		blocks: speedTestData.{
			class: "",
			style: "",
			value: GIP_card({
					uniqueId: "Fixed Tracks" + Nr,
					embedded: true,
					direction: "vertical",
					class: "",
					style: "",
					blocks: [{
							style: "",
							value: GIP_materialSymbols({
									icon: "spa"
								})
						}, {
							style: "",
							value: 'Input Text 1'
						}],
					actions: [{
							trigger: "click",
							scripts: [{
									type: "popupRecord",
									recordId: raw(Nr)
								}]
						}]
				})
		}
	};
html(raw(GIP_master({})) + raw(GIP_grid(data)))
json
let speedTestData := ((select '4. Data for Speedtest' where number(Nr) < 20) order by -number(Nr));
GIP_grid({
	uniqueId: "Fixed Tracks" + Nr,
	embedded: true,
	direction: "horizontal",
	gridTrackCount: 5,
	gridTrackSize: "200px",
	class: "",
	style: "height: 900px;",
	blocks: speedTestData.{
		class: "",
		style: "",
		value: GIP_card({
				uniqueId: "Fixed Tracks" + Nr,
				embedded: true,
				direction: "vertical",
				class: "",
				style: "",
				blocks: [{
						style: "",
						value: GIP_materialSymbols({
								icon: "spa"
							})
					}, {
						style: "",
						value: 'Input Text 1'
					}],
				actions: [{
						trigger: "click",
						scripts: [{
								type: "popupRecord",
								recordId: raw(Nr)
							}]
					}]
			})
	}
})