Example of Search component using a custom service: EDR API
This example uses a custom search service, created in the /usr/services/edr directory and implementing the search service interface
<Search
limitTo="advanced"
source={{
customApi: {
formatUrl: uiFilter=>{const{conn,inputs}=uiFilter;let ret={sourceUrl:"http://www.edr-edr.it/edr_programmi/edr_api.php?ancient_city=roma",options:{}};// ๐น Processa i filtri avanzati con form2querystring
const filterQuery=edr_form2querystring(conn,inputs);// ๐น Verifica che ci siano filtri validi
if(filterQuery&&Object.keys(filterQuery).length>0){const serializedQuery=Object.entries(filterQuery).map(([key,value])=>`${key}=${encodeURIComponent(value)}`).join("&");ret.sourceUrl+=`&${serializedQuery}`;}// ๐น LOG della URL generata
console.log("Generated URL:",ret.sourceUrl);return ret;},
parseResponse: async response=>{try{const output=await response.json();// ๐น Se la risposta API รจ vuota, restituisce un array vuoto senza errori
if(!output||output.results&&output.results.length===0){console.warn("No result found");return[];}// ๐น Determina i risultati di base (usa `results` per EDR)
let allResults=output.results||output;// ๐น Filtra i record che contengono "ignoratur", "Roma?"
allResults=allResults.filter(item=>{var _item$localization;const loc=(((_item$localization=item.localization)===null||_item$localization===void 0?void 0:_item$localization.discovery_location)||"").toLowerCase();return!loc.includes("ignoratur")&&!loc.includes("roma?");});// ๐น Se dopo il filtro non rimangono risultati, mostra un avviso ma non genera un errore
if(allResults.length===0){console.warn("No result found.");return[];}return allResults;}catch(error){console.error("Errore durante il parsing della risposta API:",error);return[];// ๐น Evita il crash restituendo un array vuoto
}},
form2querystring: (conn,plain)=>{if(!plain||plain.length===0){return{};// ๐น Ritorna un oggetto vuoto se non ci sono filtri
}const edrQuery={};// ๐น Applica gli operatori speciali per l'API EDR
plain.forEach(({field,operator,value})=>{if(field&&value!=null){if(operator==="_gte"){edrQuery[field]=`>${value}`;}else if(operator==="_lte"){edrQuery[field]=`<${value}`;}else{edrQuery[field]=value;// ๐น Operatore di default "="
}}});return edrQuery;}
}
}}
operators={{
_contains: "Contains",
_gte: "Greater or Equal",
_lte: "Less or Equal"
}}
fieldList={{
text: "Text",
record_number: "Record number",
discovery_location: "Discovery location",
inscription_type: {
label: "Inscription type",
values: [
"sacer",
"cetera",
"fasti, leges, acta",
"honorarius",
"ignoratur",
"inscr. parietariae",
"oper. publ. priv.que",
"sepulcralis",
"term. non sep.",
"tit. in artis operib. inscr."
]
},
material: {
label: "Material (Rei materia)",
values: [
"aes",
"arenatum",
"argentum",
"aurum",
"cera",
"ceterum",
"creta",
"eburneus",
"ferrum",
"ignoratur",
"lapis",
"lignum",
"marmor",
"musivum",
"plumbum",
"tectorium",
"vitrum"
]
},
language: {
label: "Language (Lingua)",
values: [
"latina",
"graeca",
"latina-graeca",
"incerta",
"ignoratur",
"alia"
]
},
religion: {
label: "Religion (Religione)",
values: [
"Christiana",
"Hebraica",
"Pagana",
"Incerta"
]
},
type_of_persons_mentionated: {
label: "Type of persons mentionated (Virorum distributio)",
values: [
"imp.",
"reges, viri notab. exter. gent.",
"ord. sen.",
"ord. eq.",
"ord. mun.",
"mil.",
"eccl.",
"offic. magg., Augg., mun.",
"offic. pag., vic., colleg.",
"offic. priv.",
"cet.",
"ignoratur",
"imp.?",
"reges, viri notab. exter. gent.?",
"ord. sen.?",
"ord. eq.?",
"ord. mun.?",
"mil.?",
"eccl.?",
"offic. magg., Augg., mun.?",
"offic. pag., vic., colleg.?",
"offic. priv.?",
"cet.?"
]
},
year_from: {
label: "Year from",
operator: "_gte"
},
year_to: {
label: "Year to",
operator: "_lte"
}
}}
resultItemTemplate={item=>
<div
className="card my-3"
key={item.identification.record_number}>
<div className="card-body">
<h5 className="card-title">{item.identification.record_number} โ {item.localization.discovery_location}</h5>
<a
href={item.identification.url}
target="_blank">{item.identification.url}</a>
<pre className="mt-2 ps-5">{item.text.text.replace(/\<br\>/gi,"\n")}</pre>
</div>
</div>}
/>