# Finder API
De finder wordt op de volgende pagina's gebruikt:
- Opleidingen
- Opleidingen Engels
- Lectoraten
- Onderzoeker
- Vacatures
- Vacatures ICT
- Onze mensen (medewerker vinden)
- Vacatures Insite
# Opzetten finder
Voor het plaatsen van de finder is een section--finder nodig met window.FinderSettings
. Bekijk de pagina's voor exacte implementatie per zoeker.
<div class="section section--finder layout-media">
<div class="section-wrapper">
<div class="section__content">
<script>
window.FinderSettings = {
api: "/.netlify/functions/coursefinder/",
showSearch: true,
paginate: 10,
breadcrumb: [{
label: "Home",
href: "/",
preventDefault: false
}, {
label: "Studenten",
href: "/studenten/",
preventDefault: false
}, {
label: "Opleidingen",
href: "/studenten/opleidingen",
preventDefault: false
}],
labels: {
title: 'Opleidingen',
showMoreFilters: "Toon meer",
showLessFilters: "Toon minder",
clearAllFilters: "Alle filters wissen",
noResults: "Geen resultaten",
show: "Toon",
resultsSingle: "resultaat",
resultsPlural: "resultaten",
clearAll: "Alles wissen",
close: "Sluiten",
filters: "Filters",
filterAll: "Filter opleidingen",
noResultsTitle: "Helaasā¦",
noResultsMessage: "We kunnen helaas geen resultaten vinden voor:",
noResultsFound: "Geen opleidingen gevonden",
singleResultFound: "1 Opleiding gevonden",
multipleResultsFound: 'Er zijn <x> opleidingen gevonden',
searchInputLabel: "Zoek een opleiding, cursus etc.",
clearSearchInput: "Zoekveld leegmaken",
searchButtonLabel: "Zoeken",
errorTitle: "Oepsā¦",
errorMessage: "Er ging iets mis.",
errorMessageReload: "Herlaad deze pagina.",
showTooltip: "Bekijk tooltip",
showFilterGroup: "Filters tonen",
hideFilterGroup: "Filters verbergen",
loading: "Ladenā¦",
paginationLabel: "Resultaatpagina's",
paginationNext: "Volgende",
paginationPrev: "Vorige",
}
};
</script>
<div class="js-finder"></div>
</div>
</div>
</div>
# Javascript inladen
Naast de findersettings moet ook op de pagina van een finder finder.js
worden ingeladen.
<script src="/static/js/images.vx.x.x" defer></script>
<script src="/static/js/libs.vx.x.x" defer></script>
<script src="/static/js/components.vx.x.x" defer></script>
<script src="/static/js/modal.vx.x.x" defer></script>
- <script src="/static/js/coursefinder.vx.x.x" defer></script>
+ <script src="/static/js/finder.vx.x.x" defer></script>
# Request payload
Er gaat een POST met de volgende payload naartoe:
{
"filters": ["type-opleiding-voltijd"],
"query": "foo",
"handshake": "jwt5edcw",
}
wanneer pagination wordt gebruikt is de payload als volgt:
{
"filters": ["type-opleiding-voltijd"],
"query": "foo",
"handshake": "jwt5edcw",
"resultsPerPage": 10,
"currentPage": 5
}
# API JSON response
De finder verwacht de volgende JSON als response van api.
{
"numResults": 428,
"handshake": "jwt5edcw",
"results": [
{
"name": "Afasie: communicatie na hersenletsel",
"url": "https://www.google.com",
"description": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum quis elementum augue, in dapibus arcu. Nulla semper, tortor vel volutpat porta, enim arcu interdum mi, at ultricies lacus felis quis mauris.",
"avatar": "https://hannl.imgix.net/han-balk.png?w=144&h=144",
"meta": [
{ "label": "Arnhem", "icon": "marker" },
{ "label": "32 uur", "icon": "clock-line" },
{ "label": "2.850", "icon": "euro" },
{ "label": "Mbo", "icon": "diploma" }
]
},
ā¦
],
"filters": [
{
"title": "Type opleiding",
"id": "type-opleiding",
"collapsed": true,
"fields": [
{
"label": "Voltijd",
"id": "type-opleiding-voltijd",
"numResults": 3,
"helpText": "dit is uitleg over <a href=\"#takeover1\">Voltijd</a>",
"collapsible": true
},
{
"label": "Deeltijd",
"id": "type-opleiding-deeltijd",
"numResults": 2,
},
{
"label": "Duaal",
"id": "type-opleiding-duaal",
"numResults": 0,
"helpText": "dit is uitleg over bachelor",
}
]
},
ā¦
]
}
# Results
Required | Key | Type | Description |
---|---|---|---|
x | numResults | {Integer} | totaal aantal resultaten |
x | handshake | {String} | unieke key om oude requests te kunnen annuleren |
x | results | {Array} | Lege array of gevuld met ResultObject |
x | filters | {Array} | Lege array of gevuld met FilterObject |
totalResults | {Number} | Totaal aantal resultaten, voor als pagination aanwezig is | |
currentPage | {Number} | waarde van currentPage parameter uit request payload |
# ResultObject
Required | Key | Type | Description |
---|---|---|---|
x | name | {String} | Naam van de opleiding |
x | url | {String} | Link naar de pagina |
x | description | {String} | Korte beschrijving van de opleiding |
avatar | {String} | Link naar afbeelding, 144x144 | |
image | {String} | Link naar afbeelding, 450x375. Wordt gebruikt in detail weergave | |
note | {String} | Voor bijvoorbeeld aanvullende eisen | |
meta | {Array} | Bevat label/icon pairs | |
meta[].label | {String} | bijv. Voltijd, Deeltijd | |
meta{}.icon | {String} | bijv. arrow, hat etc |
# FilterObject
Required | Key | Type | Description |
---|---|---|---|
x | title | {String} | Label van de filter groep |
x | id | {String} | Id van de filter groep |
x | collapsed | {Boolean} | Groep verborgen/getoond |
x | fields | {Array} | |
x | fields[].label | {String} | label bij het filter |
x | fields[].id | {String} | unieke id van de filter |
x | fields[].numResults | {Integer} | aantal bijbehorende resultaten |
fields[].helptext | {String} | optionele helptekst, kan html-link bevatten (tooltip) | |
fields[].collapsible | {true} | optioneel uitklapbaar (zoals bij startdatum) |
# Extra zoekopties
Optioneel kunnen er nog extra zoek opties (queryOptions
) meegegeven worden.
# Request payload
{
"filters": ["type-opleiding-voltijd"]
"query": "foo",
"queryOptions": ["team"],
"handshake": "jwt5edcw"
}
# API JSON response
{
ā¦
"queryOptions": [
{
"label": "Zoekresultaten uitbreiden metā¦",
"options": [
{
"id": "role-expertise",
"label": "Rol & expertise"
},
{
"id": "team",
"label": "Team"
},
{
"id": "department",
"label": "Afdeling"
}
]
}
],
}
# Details / Lijst weergave
Voor de finder kunnen tab knoppen toegevoegd worden waarmee de gebruiker kan kiezen voor detail of lijst weergave. Dit kan geconfigureerd worden met de volgende finder settings:
window.FinderSettings = {
ā¦
+ listDisplayActive: "detail",
+ listDisplayOptions: [
+ {
+ label: "Details",
+ value: "detail",
+ icon: "detail",
+ },
+ {
+ label: "Lijst",
+ value: "list",
+ icon: "list",
+ },
+ ],
}
Op de detail weergave wordt een afbeelding getoond bij een resultaat. In ResultObject wordt hiervoor de image
property uitgelezen.
# Notitie weergeven in finder result
Bij de resultaten kan een optionele notitie weergegeven worden. Notitie kan toegeovegd worden door op een ResultObject een string mee te geven via de note
property.
# Aanbevolen resultaten
In de finder kunnen bovenaan de resultatenlijst aanbevolen resultaten getoond worden.
De finder verwacht de volgende data:
{
ā¦
recommendations: [
{
"numResultsLabel": "Deze <b>2 opleidingen</b> sluiten het meest aan op jouw vooropleiding",
"results": []
},
{
"numResultsLabel": "Deze <b>3 opleidingen</b> sluiten breeder aan op jouw vooropleiding",
"results": []
}
]
}
De property recommendations
is een lijst van objecten. Zo kunnen er verschillende lijsten met aanbevelingen weergegeven worden.
# RecommendationObject
Required | Key | Type | Description |
---|---|---|---|
x | numResultsLabel | {String} | Label van met aantal resultaten. Omdat de label qua inhoud afhankelijk is van de filter zit deze niet in de finder settings. |
x | results | {Array} | Lijst met ResultObjects |
Verder aan de finder settings kunnen de volgende optionele labels toegevoegd worden:
singleResultFoundWithRecommendation: "Er is <b>1 andere opleiding</b> gevonden",
multipleResultsFoundWithRecommendation: "Er zijn <b><x> andere opleidingen</b> gevonden"
# Filter met tabbladen
Om onder een filter titel tabladen te tonen met meerdere filters verwacht de finder de property subfilters
in plaats van fields
:
{
"title": "Vooropleiding",
"id": "vooropleiding",
- "fields": []
+ "subfilters": [
+ {
+ "title": "Havo/Vwo",
+ "fields": []
+ },
+ {
+ "title": "Mbo Niveau 4",
+ "fields": []
+ }
+ ]
}
# Filter widget met zoekveld
De widget van een subfilter kan aangepast worden naar een widget met zoekveld:
{
"title": "Vooropleiding",
"id": "vooropleiding",
"subfilters": [
{
"title": "Havo/Vwo",
"fields": []
},
{
"title": "Mbo Niveau 4",
"fields": [],
+ "widget": "filterable-multiselect",
+ "labels": {
+ "input": "Wat is jouw mbo-4 opleiding?",
+ "noResults": "Geen opleidingen gevonden",
+ "toggleItems": "Schakel weergave van mbo-opleidingen lijst"
+ }
}
]
}