Kľúčové slová
API Integrácia - jQuery UI autocomplete
Integrácia prostredníctvom jQuery UI widgetu
autocomplete
vyžaduje odoslanie autentifikačného API kľúča ako POST parameter xauth.
Z toho dôvodu vyžaduje miernu úpravu metódy "source" pre načítanie zdrojových dát.
API kľúč ku konkrétnej aplikácii / webu nájdete po prihlásení v Nastaveniach - časť
API Integrácia.
Vrátený zoznam nájdených subjektov obsahuje zakódované dáta vo formáte JSON, ktoré po zvolení položky zo zoznamu dekódujeme a nastavíme do potrebných polí. Nie je potrebné zasielať ďalšiu API požiadavku pre načítanie detailov zvoleného subjektu. Popis podporovaných API metód a parametrov pozrite tu.
- Príklad #1 - jednoduchý - vyhľadanie firmy/subjektu
- Príklad #2 - pokročilý - vyhľadanie firmy/subjektu
- Príklad #3 - vyhľadanie firmy/subjektu podľa adresy
- Príklad #4 - výber štatutára podľa firmy/subjektu
- Príklad #5 - vyhľadanie štatutára vo všetkých subjektoch
Pokiaľ preferujete integráciu bez externých závislostí, môžete využiť predpripravenú knižnicu vanilla JS.
Najjednoduchší variant, avšak aj najmenej flexibilný. Neumožňuje napr. ošetrenie chyby - pozrite príklad #2. Vrátená odpoveď obsahuje zakódovaný JSON reťazec s atribútmi subjektu a nevyžaduje odoslanie ďalšej API požiadavky.
Obr. 1 - Vzor výstupu - vyhľadanie firmy podľa názvu, IČO, DIČ
<!-- načítame externé javascript knižnice do HTML tagu <head> - jQuery, jQueryUI -->
<script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
<script src="https://code.jquery.com/ui/1.13.2/jquery-ui.min.js"></script>
<!-- vložíme pole do HTML <body> pre zadanie hľadaného názvu subjektu -->
<input type="text" id="company-suggester1" placeholder="Vyhľadať .." class="form-control" />
$("#company-suggester1").autocomplete({
// nemá zmysel hľadať subjekty pre menej ako 3 písmená - výsledky sú irelevantné
minLength: 3,
source : function(request, response) {
// CORS POST request
$.post({
url: 'https://bizdata.sk/api/v1/search-company',
data: {
term: request.term, // company name, DIČ or IČO
xauth: "my-secret-key", // find authentication key in your account settings
// optional options and search attributes - see the documentation
// is_active: 'any', // search in active and inactive entities
// zip: '957', // partial match supported, returns both "95701" and "95702"
option_size: 5
},
dataType: "json",
success: function(resp) {
if (resp && resp.length) {
// render list items, already contains label - value pairs
response(resp);
/* // alternatively - customize labels ie. add IČO ..
response($.map(resp, function(item) {
var data = $.parseJSON( item.value );
return {
label: item.label + " (IČO "+data.ico+")",
value: item.value
}
})); */
} else {
// show error or message "Žiadne záznamy."
alert(resp.errorMsg ? resp.errorMsg : "Žiadne záznamy.");
}
}
});
},
// vypneme nastavenie "value" hodnoty, nakoľko by nastavilo zakódovaný JSON reťazec
focus : function(event, ui) {
event.preventDefault();
},
// spracovanie zvolenej položky zo zoznamu
select : function(event, ui) {
event.preventDefault(); // don't set the value (which is encoded JSON) ..
$(this).val( ui.item.label ); // .. instead set the label - company name
try{
// dekódujeme JSON reťazec - údaje subjektu
var data = $.parseJSON( ui.item.value );
alert("Vybratý záznam:"
+"\nNázov: " + data.obchodne_meno
+"\nAdresa: "+ data.addr_street_nr +", "+ data.addr_zip +" "+ data.addr_city
+(data.ico ? "\nIČO: " + data.ico : "")
+(data.dic ? "\nDIČ: " + data.dic : "")
+"\nVznik: " + data.date_vznik
+"\nSubjekt aktívny: " + (data.is_active ? 'Áno' : 'Nie')
+"\nTyp osoby: " + data.kod_typ_osoby
+"\n ... "
);
// príp. nastavíme údaje subjektu do potrebných polí
$("#company-name").val(data.obchodne_meno);
$("#company-street-number").val(data.addr_street_nr);
$("#company-zip-city").val(data.addr_zip +" "+ data.addr_city);
$("#company-ico").val(data.ico ? data.ico : "-");
// ... atď ...
} catch (error) {
alert("Neplatné JSON údaje .. \n"+error);
}
}
})
Pokročilejšia alternatíva - umožňuje napr. ošetrenie užívateľského vstupu, zobrazenie chyby,
vloženie spinner loadera (koliesko) a zobrazenie IČO aj DIČ subjektu.
Atribút value zvolenej položky obsahuje zakódovaný JSON reťazec
s atribútmi subjektu a nevyžaduje odoslanie ďalšej API požiadavky.
Obr. 2 - Vzor výstupu - vyhľadanie firmy podľa názvu, IČO, DIČ
<!-- načítame externé knižnice do HTML <head> - jQuery, jQueryUI a CSS štýly -->
<script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
<script src="https://code.jquery.com/ui/1.13.2/jquery-ui.min.js"></script>
<link href="https://code.jquery.com/ui/1.13.1/themes/smoothness/jquery-ui.css" rel="stylesheet">
<!-- vložíme HTML kód do elementu <body> pre zadanie hľadaného názvu subjektu -->
<div class="my-3 offset-2 col-8" id="wrapper-suggester2">
<input type="text" id="suggester2" class="form-control" placeholder="Vyhľadať ..">
<div id="suggester2-message" class="py-2"></div>
</div>
/* modify original jQuery CSS - remove border, set BG color .. */
#wrapper-suggester2 .ui-state-active,
#wrapper-suggester2 .ui-widget-content .ui-state-active
{
border: 0;
background-color: #ffa5006e;
transition: background-color 100ms linear;
margin: 0;
}
#wrapper-suggester2 .ui-widget.ui-widget-content
{
border-radius: 4px;
box-shadow: rgba(0, 0, 0, 0.35) 0px 5px 15px;
}
/* položka v zozname */
.item-wrapper {
display: block;
border-bottom: 1px solid orange;
padding: 0;
margin: 0;
clear: both;
overflow: hidden;
font-size: 14px;
}
/* nazov subjektu */
.item-left {
float: left;
display: inline-block;
width: 47%;
padding: 5px;
margin: 0;
overflow: hidden;
}
/* IČO, DIČ */
.item-right {
float: right;
display: inline-block;
width: 53%;
text-align: right;
padding: 5px;
margin: 0;
white-space: nowrap;
}
$("#suggester2").autocomplete({
// nemá zmysel hľadať subjekty pre menej ako 3 písmená - výsledky sú irelevantné
minLength: 3,
// (msec) požiadavku odošleme až keď užívateľ ukončil písanie (throttling)
delay : 500,
// responsivita - zabezpečíme posun zoznamu pri zmene veľkosti okna
appendTo : "#wrapper-suggester2",
// centrujeme mierne posunuté doľava a nadol
position : {
my : "left+2 top+5"
},
// načítanie zoznamu subjektov prostredníctvom funkcie
source : function(request, response){
var msg = $("#suggester2-message"),
me = this.element,
err = '';
// ak zostalo z predošlej požiadavky koliesko/loader, odstránime ho
$(".spinner-border").remove();
// kontrola vstupu od užívateľa, musí byť 3 - 20 znakov
request.term = request.term.replace(/[ ]+$/g, ' '); // flatten whitespaces
if (!$.trim(request.term)) {
err = 'Zadajte názov firmy alebo meno podnikateľa.';
} else if(request.term.length < 3) {
err = 'Príliš krátky názov, zadajte aspoň 3 znaky.';
} else if(request.term.length > 20) {
err = 'Príliš dlhý názov, zadajte najviac 20 znakov.';
}
if (err) {
me.autocomplete('close');
msg.html('<div class="alert alert-danger">'+err+'</div>');
return;
}
// spinner - koliesko
$('<span class="spinner-border text-muted" '
+'style="position:absolute;right:20px;top:2px;"></span>').insertAfter(me);
// načítame zoznam subjektov
$.post({
url: "https://bizdata.sk/api/v1/search-company",
data: {
xauth: "my-secret-key",
term: request.term // company name, DIČ or IČO
// additional options and search attributes - see the documentation
// is_active: 'any',
// zip: '957', // partial match supported, returns both "95701" and "95702"
// city: 'Bánovce',
// option_size: 3,
// option_extra_field: 'text_druh_vlastnictva, orsr_den_zapisu'
},
complete: function() {
$(".spinner-border").remove();
},
success: function (resp) {
if (resp && resp.length && resp[0]['label'] != undefined) {
// clear previous error
msg.html("");
// render list items or return resp, which already contains labels + values
response($.map(resp, function(item) {
// here we can parse JSON and customize labels
return {
label: item.label,
value: item.value
}
}));
} else {
// chyba ošetrená a vrátená serverom
var e = resp.errorMsg ? resp.errorMsg : "Žiadne záznamy.";
msg.hide().html('<div class="alert alert-danger">'+e+'</div>').fadeIn();
me.autocomplete('close');
}
},
error: function(xhr) {
// typicky chyba spojenia alebo neošetrená chyba
var txt = 'Chyba spojenia.';
if(xhr && xhr.responseJSON && xhr.responseJSON.errorMsg != undefined){
txt = 'Chyba! ' + xhr.responseJSON.errorMsg;
}
msg.html('<div class="alert alert-danger">'+txt+'</div>');
me.autocomplete('close');
}
})
},
create : function() {
// vlastné formátovanie zoznamu subjektov s IČO, DIČ
$(this).data('ui-autocomplete')._renderItem = function( ul, item ) {
var data = $.parseJSON( item.value ),
name = item.label.substring(0, 22);
// zvýrazníme text
name = String($.trim(name))
.replace(new RegExp($.trim(this.term), "gi"), "<b>$&</b>");
if(data.dic){
data.dic = String($.trim(data.dic))
.replace(new RegExp($.trim(this.term), "gi"), "<b>$&</b>");
}
if(data.ico){
data.ico = String($.trim(data.ico))
.replace(new RegExp($.trim(this.term), "gi"), "<b>$&</b>");
}
// vložíme záznam s IČO, DIČ ..
return $( "<li class='item-wrapper'>"
+"<div class='item-left'>"
+ name + (item.label.length > 22 ? ".." : "")
+"</div>"
+"<div class='item-right'>"
+(data.dic ? " DIČ: "+data.dic : "")
+(data.ico ? " IČO: "+data.ico : "")
+"</div>"
+"</li>" ).appendTo( ul );
};
},
// vypneme nastavenie "value" hodnoty, nakoľko by nastavilo nezmyselný JSON reťazec
focus : function(event, ui) {
event.preventDefault();
},
// spracovanie zvolenej položky zo zoznamu
select : function(event, ui) {
event.preventDefault();
$(this).val( ui.item.label );
try{
// dekódujeme JSON reťazec - údaje subjektu
var data = $.parseJSON( ui.item.value );
if (data) {
var txt = "<div class='jumbotron p-3 mb-0'><u>Vybratý záznam:</u>"
+"<br>Názov: <b>" + data.obchodne_meno + "</b>"
+"<br>Adresa: " + data.addr_street_nr +", "
+ data.addr_zip +" "+ data.addr_city
+(data.ico ? "<br>IČO: " + data.ico : "")
+(data.dic ? "<br>DIČ: " + data.dic : "")
+"<br>Vznik: " + data.date_vznik
+"<br>Typ osoby: " + data.kod_typ_osoby
+"<br>Subjekt aktívny: " + (data.is_active ? 'Áno' : 'Nie')
+"<br> ... </div>";
$("#suggester2-message").html(txt);
// príp. nastavíme údaje subjektu do potrebných polí
$("#company-name").val(data.obchodne_meno);
$("#company-street-number").val(data.addr_street_nr);
$("#company-zip-city").val(data.addr_zip +" "+ data.addr_city);
$("#company-ico").val(data.ico ? data.ico : "-");
// ... atď ...
}
} catch (error) {
alert("Neplatné JSON údaje .. \n"+error);
}
}
});
Vyhľadanie firmy je tiež možné podľa adresy odoslaním špeciálne parsovaného poľa full_address.
Pole musí obsahovať reťazec s uvedením ulice (môže obsahovať aj popisné číslo), obce a PSČ.
Tieto tri časti adresy musia byť oddelené čiarkou a môžu byť uvedené v ľubovoľnom poradí -
napr. Strážovská 1201, Bánovce alebo Bratislava, 85102.
Nie je nutné uvádzať všetky tri časti adresy, postačí uvedenie aspoň jednej časti.
Pre vrátenie odpovede priamo vo formáte optimizovanom pre jQuery autocomplete je potrebné tiež nastaviť option_format na hodnotu label-value.
(nastavenie nie je potrebné pri odoslaní poľa term - ktoré však v tomto prípade neodosielame).
Obr. 3 - Vzor výstupu - vyhľadanie firmy podľa adresy
<!-- načítame externé javascript knižnice do HTML tagu <head> - jQuery, jQueryUI -->
<script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
<script src="https://code.jquery.com/ui/1.13.2/jquery-ui.min.js"></script>
<!-- vložíme pole do HTML <body> pre zadanie hľadaného názvu subjektu -->
<input type="text" id="suggester3" placeholder=" Ulica, obec, PSČ .." class="form-control" />
$("#suggester3").autocomplete({
// nemá zmysel hľadať subjekty pre menej ako 3 písmená - výsledky sú irelevantné
minLength: 3,
source : function(request, response) {
// CORS POST request
$.post({
url: 'https://bizdata.sk/api/v1/search-company',
data: {
xauth: "my-secret-key",
full_address: request.term, // napr. "Pekná cesta, Bratislava"
// is_active: 'any', // hľadať v aktívnych / neaktívnych / všetkých subjektoch
option_format: 'label-value', // enforce returning pairs label - value
option_size: 5
},
dataType: "json",
success: function(resp) {
if (resp && resp.length) {
// render list items
response($.map(resp, function(item) {
var data = $.parseJSON( item.value );
return {
value: item.value,
// customize labels - add full address
label: item.label + " (" + data.addr_street_nr
+", "+ data.addr_zip +" "+ data.addr_city +")"
}
}));
} else {
// show error or message "No records." into some element ID="msg-sample-3"
$("#msg-sample-3").finish().hide()
.html(resp.errorMsg ? resp.errorMsg : "Žiadne záznamy.").fadeIn();
// enforce closing previous list
response({});
}
}
});
},
// vypneme nastavenie "value" hodnoty, nakoľko by nastavilo nezmyselný JSON reťazec
focus : function(event, ui) {
event.preventDefault();
},
// spracovanie zvolenej položky zo zoznamu
select : function(event, ui) {
event.preventDefault(); // don't set the value (which is JSON hash)
try{
// dekódujeme JSON reťazec a zobrazíme údaje subjektu
var data = $.parseJSON( ui.item.value );
$("#msg-sample-3").hide().html(
"<div class='g-color-black jumbotron p-2'>"
+"Názov: <b>" + data.obchodne_meno + "</b>"
+"<br>Obec: <b>"+ data.addr_city+"</b>"
+"<br>Ulica: <b>"+ data.addr_street_nr +"</b>"
+"<br>PSČ: <b>"+ data.addr_zip +"</b>"
+(data.ico ? "<br>IČO: " + data.ico : "")
+(data.dic ? "<br>DIČ: " + data.dic : "")
+"<br>Vznik: " + data.date_vznik
+"<br>Subjekt aktívny: " + (data.is_active ? 'Áno' : 'Nie')
+"<br>Typ osoby: " + data.kod_typ_osoby
+"<br>...atď. </div>"
).fadeIn();
} catch (error) {
alert("Neplatné JSON údaje .. \n"+error);
}
}
})
Vyhľadanie štatutárov spoločnosti umožňuje metóda search-person-by-company.
Vrátený zoznam obsahuje meno štatutára (resp. SZČO) a názov spoločnosti.
Nasledujúci príklad umožňuje nastavenie štatutára napr. ako adresáta listovej zásielky.
Obr. 4 - Vzor výstupu - vloženie mena štatutára zvoleného subjektu
<!-- načítame externé javascript knižnice do HTML tagu <head> - jQuery, jQueryUI -->
<script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
<script src="https://code.jquery.com/ui/1.13.2/jquery-ui.min.js"></script>
<!-- vložíme pole do HTML <body> pre zadanie hľadaného názvu subjektu -->
<input type="text" id="suggester4" placeholder=" Názov firmy, IČO .." class="form-control" />
$("#suggester4").autocomplete({
// nemá zmysel hľadať subjekty pre menej ako 3 písmená - výsledky sú velmi nepresné
minLength: 3,
source : function(request, response) {
// CORS POST request
$.post({
url: 'https://bizdata.sk/api/v1/search-person-by-company',
data: {
xauth: "my-secret-key",
term: request.term,
// is_active: 'any', // hľadať v aktívnych / neaktívnych / všetkých subjektoch
option_size: 5 // vrátený počet záznamov 1-100, default 10
},
dataType: "json",
success: function(resp) {
if (resp && resp.length) {
// render list items
response($.map(resp, function(item) {
var person = $.parseJSON( item.value ),
company = person.company,
role = person.role_title.toLowerCase();
// label already contains representative name, customize if needed
return {
value: item.value, // encoded JSON data or set other attribute
label: item.label + " ("
+ ( company.obchodne_meno == item.label ?
"IČO " + company.ico + (role ? ", " + role : '')
: (role ? role + ", " : '')
+ company.obchodne_meno + ", IČO " + company.ico
) + ")"
}
}));
} else {
// show error or message "No records." into some element ID="msg-sample-3"
$("#msg-sample-4").finish().hide()
.html(resp.errorMsg ? resp.errorMsg : "Žiadne záznamy.").fadeIn();
// enforce closing previous list
response({});
}
}
});
},
// vypneme nastavenie "value" hodnoty, nakoľko by nastavilo nezmyselný JSON reťazec
focus : function(event, ui) {
event.preventDefault();
},
// spracovanie zvolenej položky zo zoznamu
select : function(event, ui) {
event.preventDefault(); // don't set the value (which is JSON hash)
try{
// dekódujeme JSON reťazec a zobrazíme meno zvoleného štatutára a adresu firmy
var person = $.parseJSON( ui.item.value ),
company = person.company;
$("#msg-sample-4").hide().html(
"<div class='g-color-black jumbotron p-2'>"
+ "Adresované na:"
+ "<br><b>"+ person.person_name +"</b>"
//+"<br>" + person.role_title // looks unusual :-)
+"<hr class='my-1 col-8'>"
+"<b>"+ company.obchodne_meno +"</b>"
+"<br>"+ company.addr_street_nr
+"<br>"+ company.addr_zip +" "+ company.addr_city
+"</div>"
).fadeIn();
} catch (error) {
alert("Neplatné JSON údaje .. \n"+error);
}
}
})
V prípade, ak je potrebné vyhľadať osobu vo firme, ktorej názov nepoznáte, môžete využiť metódu search-person.
Táto vráti zoznam všetkých nájdených osôb (tzn. štatutárov, konateľov, akcionárov apod.) vo všetkých subjektoch.
Obr. 5 - Vzor výstupu - vyhľadanie štatutára vo všetkých subjektoch
<!-- načítame externé javascript knižnice do HTML tagu <head> - jQuery, jQueryUI -->
<script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
<script src="https://code.jquery.com/ui/1.13.2/jquery-ui.min.js"></script>
<!-- vložíme pole do HTML <body> pre zadanie hľadaného názvu subjektu -->
<input type="text" id="suggester5" placeholder=" Priezvisko a meno osoby .." class="form-control" />
$("#suggester5").autocomplete({
// nemá zmysel hľadať subjekty pre menej ako 3 písmená - výsledky sú velmi nepresné
minLength: 3,
source : function(request, response) {
// CORS POST request
$.post({
url: 'https://bizdata.sk/api/v1/search-person',
data: {
xauth: "my-secret-key",
term: request.term,
// is_active: 'any',
option_size: 5
},
dataType: "json",
success: function(resp) {
if (resp && resp.length) {
// render list items
response($.map(resp, function(item) {
var person = $.parseJSON( item.value ),
company = person.company,
// zistime, ci meno osoby obsahuje skratku spoločnosti napr. "s.r.o."
isJurist = /(\ba\. ?s\.|\bk\.s\.|\bs\. ?r\. ?o\.|\bspol\. ?s ?r\. ?o\.|\bv\. ?o\. ?s\.|\bs ?\.p\.|GmbH)/i.test(person.person_name);
// label already contains representative name, customize if needed
return {
value: item.value, // encoded JSON data
label: item.label.substring(0,40) + (item.label.length > 40 ? '..' : '')
// ie. "John Doe" pobytom v Bratislava vo firme My company, s.r.o., IČO 12345678
+ ( person.city ? " "+(isJurist ? "sídlom" : "bytom")+" " + person.city + ", " : "" )
+ ( company.obchodne_meno == item.label ? " IČO "+company.ico
: " vo firme "+company.obchodne_meno.substring(0,25)
+ (company.obchodne_meno.length > 25 ? '..' : '') + ", IČO "+company.ico+", "+company.addr_city )
}
}));
} else {
// show error or message "No records." into some element ID="msg-sample-3"
$("#msg-sample-5").finish().hide()
.html(resp.errorMsg ? resp.errorMsg : "Žiadne záznamy.").fadeIn();
// enforce closing previous list
response({});
}
}
});
},
// vypneme nastavenie "value" hodnoty, nakoľko by nastavilo nezmyselný JSON reťazec
focus : function(event, ui) {
event.preventDefault();
},
// spracovanie zvolenej položky zo zoznamu
select : function(event, ui) {
event.preventDefault(); // don't set the value (which is JSON hash)
try{
// dekódujeme JSON reťazec a zobrazíme meno zvoleného štatutára a adresu firmy
var person = $.parseJSON( ui.item.value ),
company = person.company;
$("#msg-sample-5").hide().html(
"<div class='g-color-black jumbotron p-2'>"
+ "Adresované na:"
+ "<br><b>"+ person.person_name +"</b>"
+ "<hr class='my-1 col-8'>"
+ "<b>"+ company.obchodne_meno +"</b>"
+ "<br>"+ company.addr_street_nr
+ "<br>"+ company.addr_zip +" "+ company.addr_city
+ "</div>"
).fadeIn();
} catch (error) {
alert("Neplatné JSON údaje .. \n"+error);
}
}
})