Erstellen Sie ein Panel
Erfahren Sie, wie Sie Panel-Apps für bestimmte Seiten in Coupa erstellen.
Einleitung
Mit Panel-Apps können Kunden Daten aus externen Quellen innerhalb eines UI-Panels auf einer bestimmten Coupa-Seite anzeigen. Diese Daten können kontextspezifisch sein und automatisch oder manuell aktualisiert werden. Wenn beispielsweise eine Lieferantenseite in Coupa geladen wird, kann eine Panel-App auf dieser Seite automatisch Daten von einer externen Quelle über eine API abrufen, die sich auf diesen bestimmten Lieferanten beziehen, und die Daten in Coupa anzeigen.
Um eine Panel-App zu erstellen, gehen Sie auf Setup > Plattform > IFrames und Panels und klicken Sie auf die Schaltfläche Erstellen und dann auf die Option: Panel. Der Schlüssel zum Erstellen und Konfigurieren einer Panel-App liegt im Descriptor, einem JSON-Format mit Parametern für Ihre App.
Hier ist ein Beispiel für eine Panel-App auf der Coupa-Startseite.
Sie können eine Panel-App erstellen, indem Sie auf Setup > Plattform > Installierte Apps gehen. Klicken Sie auf die Schaltfläche Erstellen und wählen Sie Neue Panel-App erstellen.
Anforderungen
Ab R29 benötigen Panel-Apps mindestens TLS v1.2, um ausgehende Verbindungen zu APIs von Drittanbietern herzustellen.
Panel-App-Grundlagen
Panel-Apps werden mit einem App-Deskriptor erstellt, der das JSON-Format verwendet. Der Deskriptor besteht aus zwei Haupteigenschaften: Daten und Blöcken. Daten werden mit JQ v1.6 verarbeitet.
Eigenschaft | Beschreibung |
---|---|
steckplatz |
Legt den Seitentyp fest, auf dem das Panel gerendert wird. Aktuelle Optionen sind:
Pro Panel-App kann nur ein Steckplatz angegeben werden. Damit die App auf mehreren Seiten angezeigt wird, erstellen Sie die App erneut mit |
|
Das DATA-Attribut beschreibt, wie die gewünschten Daten abgerufen werden, die im Bedienfeld gerendert werden. Ein JSON-Objekt, das beschreibt, welche Daten zum Rendern des Panels abgerufen werden sollen. Die Werte in diesem Objekt sind URLs, an die Coupa eine Anforderung sendet, um Daten abzurufen. Die Antworten aus allen diesen Datenanforderungen werden zu einem Hash zusammengeführt, der unter dem Schlüsselnamen steht, der ihnen in diesem Objekt zugewiesen wurde.
|
kontext |
Ein API-Aufruf zur NY Times-Artikelsuche nach aktuellen Artikeln über einen Lieferanten würde wie folgt aussehen:
Wenden Sie sich an Coupa, um eine aktualisierte Liste der für jeden Steckplatz verfügbaren Kontextdaten zu erhalten. |
API-Aufrufe parametrieren (Eigenschaften) |
Ein Array von Eigenschaften, die ein Benutzer/Administrator nach der Aktivierung Ihrer Panel-App bereitstellen muss. Wenn Ihre App/API für jeden Coupa-Kunden, der sie aktiviert, einen eindeutigen API-Schlüssel oder ein Login/Passwort benötigt, stellen Sie diese Option folgendermaßen bereit. Ein Beispielblock wäre:
Sie verweisen dann in den Datenblöcken wie folgt auf Ihre Eigenschaften:
Wenn ein Coupa-Administrator eine neue Panel-App aktiviert, wird er aufgefordert, alle in Ihrem App-Deskriptor angegebenen „Eigenschaften“ -Felder auszufüllen. |
starten |
Fügt eine Startschaltfläche hinzu, die verwendet werden kann, wenn eine Panel-App nicht sofort angezeigt werden muss. Anstatt dass sich die Panel-App automatisch an den Drittanbieter wendet und die Daten rendert, wendet sie sich nur, wenn der Endbenutzer manuell auf die Schaltfläche Starten klickt. Dieses JSON-Objekt enthält
Verwendung von
|
allow_refresh |
Fügt eine Aktualisierungsschaltfläche hinzu, die verwendet werden kann, wenn sich die Daten auf der Seite ändern und sich auf die in der Panel-App gerenderten Daten auswirken. Dies ist praktisch für Ihre Warenkorb-Panel-App, wenn eine Anforderungszeile aktualisiert wird. Der Benutzer kann auf die Schaltfläche Aktualisieren klicken, um die Daten in der Panel-App zu aktualisieren. Diese boolesche Option wird verwendet, um eine Aktualisierungsschaltfläche in der Panel-App im App-Deskriptor anzuzeigen: "allow_refresh": wahr Verwendung von
Wenn Sie darauf klicken, aktualisiert die Schaltfläche den Inhalt dieser App. Dieses Feld sollte auf der gleichen Ebene wie "Steckplatz", "Daten", "Start" usw. hinzugefügt werden, jedoch nicht in Blöcken. Die Schaltfläche „Aktualisieren“ wird oben in der Panel-Anwendung angezeigt. |
blöcke |
Das Attribut blocks beschreibt, wie Daten im Panel gerendert werden. Es handelt sich um ein Array von JSON-Objekten („Blöcken“) verschiedener Typen, die jeweils eine separate Visualisierung beschreiben. Blöcke haben Zugriff auf die zuvor gesendeten Daten und verwenden diese, um Visualisierungen zu erstellen. |
error_blocks |
Das Attribut error blocks funktioniert ähnlich wie das Attribut blocks, wird aber verwendet, um Fehlermeldungen zu erstellen, wenn es ein Problem beim Abrufen oder Rendern der Daten gibt. |
Daten werden abgerufen
Wir erlauben Apps, bis zu 5 separate HTTP-Aufrufe zu tätigen, um Daten für die App abzurufen. Diese werden über das Attribut data im Deskriptor spezifiziert. API-Aufrufe sollten entweder json (bevorzugt) oder XML zurückgeben.
Panel-App-Blocktypen
Die Panel-App rendert diese Daten auf einer vorhandenen Coupa-Seite mithilfe verschiedener Arten von UI-Elementen, die als Blöcke bezeichnet werden. Coupa unterstützt die folgenden Blocktypen:
- Rich-Text (einschließlich Bilder)
- Felder (im Wesentlichen Schlüssel-Wert-Paare)
- Nummer
- Geldbetrag
- Kreisdiagramm
- Linien-/Balken-/Säulendiagramm
- Starten
- Neu laden
- Zeile
- Dynamische Tabelle
App-Konfiguration
Attribut | Beschreibung |
---|---|
|
Identifiziert den Blocktyp. Zum Beispiel |
|
Dieses JSON-Objekt hat je nach Strategie unterschiedliche Eigenschaften. JQ
Verarbeitung von Daten mit JQ Beispielsweise könnte das folgende JQ-Skript verwendet werden, um mehrere spezifische Datenelemente zu extrahieren und in einem anderen JSON-Objekt neu zu verpacken:
Dies würde dazu führen, dass das folgende JSON-Objekt erzeugt wird:
Mehr Informationen: |
|
Verschiedene Blocktypen können andere Eigenschaften aufweisen, die für diesen Blocktyp spezifisch sind. |
Panel-App-Blocktypen
Textsperre
Attribut | Beschreibung |
---|---|
|
Muss gleicher |
vorlage |
Der Textblocktyp verwendet eine Liquid Markdown-Vorlage. Die Vorlage wird zunächst als Liquid geparst, um die Daten zu interpolieren, die von den Anforderungen zurückgegeben werden. Anschließend wird die Vorlage erneut als Markdown geparst, um das HTML zu generieren. Markdown bietet eine sichere Methode zum Generieren von HTML, und aus Sicherheitsgründen blockiert Coupa Inline-HTML in der Vorlage. Es gibt kein Zeichenlimit außer dem maximalen Limit der Datenspalte, in der die Konfiguration des Blocks gespeichert ist. Markdown ermöglicht Kopfzeilen, Inline-Hervorhebungsformatierungen, Listen, Bilder, Links und Blockzitate. Coupa unterstützt auch Syntaxhervorhebung und Tabellen. Ausführliche Informationen zur Arbeit mit Liquid und Markdown finden Sie unter Liquid-Vorlagensprache und Mastering Markdown. |
daten |
Die Datenstrategie muss ein einzelnes JSON-Objekt erzeugen. Alle Schlüssel im Objekt stehen der Liquid-Vorlage als Variablen zur Verfügung
|
Feldblock
Eigenschaft | Beschreibung |
---|---|
|
Muss gleich sein |
daten |
Die Datenstrategie muss ein Array von JSON-Objekten mit Label- und Value-Attributen erzeugen. Beim Rendern wird die Bezeichnung als Feldbezeichnung und der Wert als Feldwert verwendet.
|
titel |
Ein optionaler Titel, der über der Liste der Felder angezeigt wird. |
Stangen-/Linienblock
Eigenschaft | Beschreibung |
---|---|
|
Muss gleich |
daten |
Die Datenstrategie muss ein Array von Arrays erzeugen. Im Gegensatz zum Tabellenblock sind die Daten für Balken-/Liniendiagramme spaltenorientiert. Jedes Array stellt eine einzelne Reihe von Daten dar, die angezeigt werden. Das erste Element ist der Name der Reihe, dann sind die verbleibenden Elemente die Punkte in der Reihe.
|
achse |
Ermöglicht die Konfiguration der Beschriftungen auf der x- und y-Achse. |
titel |
Optionaler Titel, der über dem Diagramm angezeigt wird. |
beschreibung |
Eine Optionsbeschreibung, die unterhalb des Diagramms in kleinerem Text angezeigt wird. |
Tortendiagramm
Eigenschaft | Beschreibung |
---|---|
|
Muss gleich Kuchen sein |
daten |
Die Datenstrategie muss ein spaltenorientiertes Array von Arrays erzeugen, wie im Abschnitt Balken/Linienblock beschrieben.
|
titel |
Optionaler Titel, der über dem Diagramm angezeigt wird. |
beschreibung |
Eine Optionsbeschreibung, die unterhalb des Diagramms in kleinerem Text angezeigt wird. |
Geldsperre
Eigenschaft | Beschreibung |
---|---|
|
Muss gleich Geld sein |
daten |
Die Datenstrategie muss ein JSON-Objekt mit der folgenden Struktur erzeugen:
|
Titel |
Ein optionaler Titel, der über der Nummer angezeigt wird. |
Beschreibung |
Eine optionale Beschreibung, die unterhalb der Zahl in kleinerem Text angezeigt wird. |
Nummernblock
Eigenschaft | Beschreibung |
---|---|
|
Muss gleiche Zahlen sein |
Daten |
Die Datenstrategie muss eine einzelne json Integer oder Float erzeugen.
|
Dezimaltrennzeichen |
Anzahl der nach dem Dezimalpunkt anzuzeigenden Dezimalstellen. Die Standardeinstellung ist 0. |
Titel |
Ein optionaler Titel, der über der Nummer angezeigt wird. |
Beschreibung |
Eine optionale Beschreibung, die unter der Nummer in kleinerem Text angezeigt wird.Beispiel Panel-Apps |
Benutzerdefinierte Felder
Der Zugriff auf benutzerdefinierte Felder für ein kontextbezogenes Objekt folgt diesem allgemeinen Format: context.<object>.custom_fields.<field_name>
Wo <field_name>
befindet sich die Eingabeaufforderung für den Feldnamen beim Erstellen eines benutzerdefinierten Felds:
Da wir uns das Lieferantenobjekt ansehen und ein Feld, Telefonnummer, haben, würden Sie es wie folgt referenzieren: context.supplier.custom_fields.phone_number
Slot | Benutzerdefinierter Feldzugriff |
---|---|
contractss.show | context.contract.custom_fields.<field_name> |
projects.show | context.project.custom_fields.<field_name> |
angebote/Anfragen.show | context.quote_request.custom_fields.<field_name> |
requisition_headers.edit | context.requisition_header.custom_fields.<field_name> |
suppliers.show | context.supplier.custom_fields.<field_name> |
Benutzerdefinierte Felder gelten nicht für Steckplätze, die nicht auf ein bestimmtes Objekt verweisen, z. B.:
user.home
expenses.index
API-Details
Authentifizierung
Coupa unterstützt die folgenden Authentifizierungstypen:
Methode | Beispiel |
---|---|
Standard-API-Schlüssel |
|
Standard-Authentifizierung |
|
Anforderung für kurzlebiges Token mit "before_data" -Anforderung |
|
API-URLs
- URLs müssen https sein
- URLs müssen für Coupa-Server zugänglich sein (d. h. eine HEAD-ANFRAGE muss erfolgreich sein)
- URLs müssen erfolgreich als gültige Liquid-Vorlagen analysiert werden. Dies soll die Interpolation ermöglichen
API-Anforderungsdetails
- Bei der Interpolation von Daten in die URLs mit Liquid muss das Ergebnis eine gültige URL sein
- Antwortcode muss 200 oder 204 sein
- Der Remote-Server muss innerhalb einer Zeitüberschreitung von 5 Sekunden antworten
- Der Antwortinhaltstyp muss entweder
application/json
oderapplication/xml sein
Tasten
Sie können eine Schaltfläche zum Starten (Launch
)und eine Schaltfläche zum Aktualisieren (allow_refresh
) für Ihre Panel-Apps konfigurieren. Während die Funktionalität wie ein Block aussieht und sich anfühlt, sind Schaltflächen technisch gesehen keine Blöcke. Weitere Informationen zu Schaltflächen finden Sie im Abschnitt Grundlagen der Panel-App in diesem Artikel. für weitere Informationen.
Panel-App-Kontext
Sie können Panel-Apps für die folgenden Seiten erstellen:
- Startseite:
/
und/user/home
- Lieferantenseite:
/suppliers/:id/record
- Vertragsseite:
/contracts/show/:id
- Warenkorb:
/requisition_headers/{id}/edit
- Projekt-Startseite:
projects.show
- Seite Sourcing-Event-Einstellungen:
quotes/requests.show
Jeder Panel-App-Typ hat seine eigene Kontextnutzlast. Nachfolgend finden Sie die Felder, die in der Panel-Apps-API-Nutzlast bereitgestellt werden, die als Kontext zum Abgleichen und Suchen von Daten verwendet werden.
Seite | Verfügbare Felder |
---|---|
Alle Panel-Apps | user_instance (d. h. [Domainname].coupahost.com) ist in der Nutzlast enthalten. |
Startseite | id , email , fullname , login , employee_number |
Rechnung anzeigen/bearbeiten |
|
Supplier page |
custom_fields: |
Vertragsseite | id , parent_contract_id , name , number , version , supplier_id , start_date , status |
Einkaufswagen | Die Warenkorb-Panel-App-Nutzlast enthält dieselben Felder wie die Anforderungskopf-API-Nutzlast |
Projekte | Alle Felder des Projektsystems und benutzerdefinierte Felder |
Beschaffungsereignis |
|
Panel-App-Beispiele
New York Times Artikelsuche
Diese App fügt die neuesten Nachrichten über den Lieferanten von der New York Times auf der Seite des Lieferanten hinzu. Sie benötigen einen NYT-API-Schlüssel, damit dieser funktioniert.
Dies ist der Code, der die App antreibt.
{
"properties": {
"api_key": {
"type": "Zeichenfolge"
}
},
"slot": "lieferanten.show",
"before_data": {},
"data": {
"nyt_data": {
"URI": "https://api.nytimes.com/svc/search/v2/articlesearch.json?q={context.supplier.name}&api-key={properties.api_key}"
}
},
"blocks": [
{
"type": "Text",
"data": {
"type": "jq",
"jq": "{ \"docs\": .nyt_data | .response | .docs }"
},
"text": "![nyt logo](http://www.transervice.com/wp-content/uploads/2018/06/the-new-york-times-4.png){:height=\"100px\"}"
},
{
"type": "Text",
"data": {
"type": "jq",
"jq": "{ \"docs\": .nyt_data | .response | .docs }"
},
"text": "1. [{{ docs[0] .headline.main}}]({{ docs[0].web_url }}) \n2. [{{ docs[1] .headline.main}}]({{ docs[1].web_url }})\n3. [{{ docs[2] .headline.main}}]({{ docs[2].web_url }})\n4. [{{ docs[3] .headline.main}}]({{ docs[2].web_url }})\n5. [{{ docs[2] .headline.main}}]({{ docs[4].web_url }})\n"
}
]
}
Wetter-Panel-App
Diese Beispiel-App zeigt die grafische Darstellung von Temperaturaspekten eines Standorts. Sie benötigen einen API-Schlüssel, damit dieser funktioniert.
Dies ist der Code, der die App antreibt.
{
"properties": {},
"slot": "lieferanten.show",
"data": {
"chicago_data": {
"method": "abrufen",
"uri": "https://api.openweathermap.org/data/2.5/weather?q=Chicago&appid=155057bc8e3dde82a6482e76bddf9c10&units=imperial"
}
},
"blocks": [
{
"type": "Bar",
"Titel": "Hier ist das Wetter in Chicago",
"data": {
"type": "jq",
"jq": "[{name: \"Temp\", data: [.chicago_data.main.temp]}, {name: \"Windgeschwindigkeit\", data: [.chicago_data.wind.speed]}, {name: \"Luftfeuchtigkeit\", data: [.chicago_data.main.humidity]}]"
},
"axes": {
"xAxis": {
"labels": {
"enabled": false
}
},
"yAxis": {
"title": {
"text": ""
},
"max": 100
}
}
},
{
"type": "Zeile",
"Titel": "Hier ist das Wetter in Chicago",
"data": {
"type": "jq",
"jq": "[{name: \"Minimum, Current, max temp for Chicago\", data: [[.chicago_data.main.temp_min], [.chicago_data.main.temp], [.chicago_data.main.temp_max]] }, {name: \"Fake data not from API\", data: [44, 52, 130, 87, 74, 88] }]"
},
"axes": {
"xAxis": {
"labels": {
"enabled": true
},
"categories": [
"Jan",
"Feb",
"März",
"Apr",
"Mai",
"Juni"
]
},
"yAxis": {
"title": {
"text": ""
},
"max": 200
}
}
}
]
}
Beispiel für eine Panel-App-API
Unten finden Sie den App-Deskriptor, der für einen automatisierten Test verwendet wird. Wir streichen die API-Antwort aus, um genau dies zurückzugeben:
[
{
"data_title":"Titel",
"DATA_number":42,
"second_score":88
}
]
{
# Hier würden Sie kundenspezifische Felder einrichten. Wie Login/Passwort. Der Kunde wird aufgefordert,
# diese Werte einmal beim Aktivieren der Anwendung
"properties": {},
# Dies ist die Seite, auf der die App angezeigt wird. Mögliche Werte finden Sie in der Eigenschaft "slot".
"slot": "lieferanten.show",
# Für einige APIs ist ein Bearer-Token oder ein 2-Schritt-Prozess erforderlich. Hier können Sie damit umgehen.
"before_data": {},
"data": {
"coupa_data": {
# Sie können diesem API-Aufruf kontextspezifische Werte hinzufügen, z. B. {{context.contract.supplier_name}}
"URI": "http://fake.test",
# Dies funktioniert intuitiv, geben Sie hier einfach Ihre API-Header, Bearer-Token, Parameter usw. an.
"headers": {}
}
},
"blocks": [
{
"type": "Nummer",
# Dies ist ein fest codierter Titel für diesen Block, kann hier keine API-Daten oder Kontextdaten verwenden
"Titel": "Titel für Nummernblock",
# "coupa_data" war die API-Antwort oben, .[0] gibt den Inhalt in {} zurück, ".data_number" erhält den Wert,
# in diesem Fall "42"
"data": {
"type": "jq",
"jq": ".coupa_data | .[0] | .data_number"
}
},
# Dieser Block gibt also einen speziell formatierten Zahlenblock mit der Nummer "42" in großer fetter Schrift wieder,
# und eine Textbeschriftung/Titel von "Titel für Nummernblock"
{
# Fields block has some of the strictest requirements for data, It displays all data in key -> value pairs
"type": "Felder",
"data": {
"type": "jq",
"jq": ".coupa_data | .[] | to_entries | map({ label: .key, value: .value })"
}
},
{
# Für diesen Block ziehen wir einfach den Hash aus dem [] und verwenden die darin enthaltenen Werte
"type": "Text",
"data": {
"type": "jq",
"jq": " .coupa_data | .[0]"
},
# Textblöcke bietet Ihnen viel Flexibilität für die Anzeige von Daten aus der API-Antwort im Kontext.
# Der Text kann wie Markup formatiert werden, so dass Sie Links, Tabellen, Rendering/Größenänderung von Bildern usw. erstellen können.
"text": "{{ data_number }} ist die DATA_number"
},
{
# Das Einrichten des Balkendiagramms ist ziemlich schwierig, vielleicht arbeiten Sie mit uns zusammen, wenn Sie diesen Weg gehen möchten.
# In diesem Beispiel wird jedoch ein Balkendiagramm mit Werten/Etikettengrößen basierend auf den Werten in der API-Antwort erstellt
"type": "bar",
"Titel": "Balkendiagramm mit gefälschten Daten",
"data": {
"type": "jq",
"jq": "[{name: \"Gesamtpunktzahl\", Daten: [.coupa_data | .[0].data_number]},
{name: \"Umwelt-Score\", Daten: [.coupa_data | .[0].second_score]}]"
},
"axes": {"xAxis": {"labels": { "enabled": false}}, "yAxis": {"title": { "text": ""}, "max": 100} }
}
]
}
Test in der Instanz des Partners
Um dies in Coupa zu testen, müssen Sie Version R25.0 oder höher verwenden. Am Ende wird Ihre App ein Teil des App-Verzeichnisses und keine benutzerdefinierte Panel-App sein. Mit diesen Schritten können Sie sie jedoch selbst testen, bevor Coupa die App offiziell dem App-Verzeichnis hinzufügt.
- Wählen Sie Konfiguration
- Klicken Sie unter Plattform auf „Installierte Apps“
- Klicken Sie auf die Schaltfläche „Erstellen“ und wählen Sie dann „Neue Panel-App erstellen“
- Die App erstellen
- Namen hinzufügen
- Geben Sie im Abschnitt Deskriptor den oben aufgeführten Code ein
Wenn keine Fehler aufgetreten sind, wird auf jeder Lieferantenseite eine Panel-App angezeigt.
Laden Sie eine App vom Coupa App-Marktplatz herunter
Besuchen Sie den Coupa App Marketplace, um ein Panel herunterzuladen und die bereitgestellten Installationsanweisungen zu befolgen. Weitere Informationen zum Anzeigen installierter Apps finden Sie im App Marketplace von Coupa.