Servis: dogruzavanje rezultata pri pretrazi postojećeg klijenta

Dropdown za pretragu klijenta u Novom nalogu je imao tvrdi limit od 100
rezultata. Sada radi po istom obrascu kao u Novoj prodaji — učitava po 30,
i dogrejava sledećih 30 kad korisnik skroluje do dna liste.
This commit is contained in:
2026-07-01 16:57:09 +02:00
parent e7a130bb90
commit 7fe40096cc
2 changed files with 25 additions and 5 deletions
+22 -3
View File
@@ -303,6 +303,7 @@ document.addEventListener('alpine:init', () => {
izabrani: null, izabrani: null,
izabraniId: 0, izabraniId: 0,
prikaziListu: false, prikaziListu: false,
limitKlijenata: 30,
// polja novog klijenta (vezana x-model-om na inpute) // polja novog klijenta (vezana x-model-om na inpute)
noviIme: '', noviIme: '',
noviPrezime: '', noviPrezime: '',
@@ -326,8 +327,9 @@ document.addEventListener('alpine:init', () => {
get vrednostKlijentId() { get vrednostKlijentId() {
return this.izabraniId || '' return this.izabraniId || ''
}, },
// filtrira klijente po tipu i početnim karakterima unosa (najviše 8) // svi klijenti koji odgovaraju tipu/pretrazi (bez ograničenja) — zna se da li ima
get filtrirani() { // još rezultata za dogruzavanje pri skrolu
get svihFiltriranih() {
const q = this.pretraga.trim().toLowerCase() const q = this.pretraga.trim().toLowerCase()
const tip = this.tip const tip = this.tip
return this.klijenti.filter(k => { return this.klijenti.filter(k => {
@@ -338,7 +340,19 @@ document.addEventListener('alpine:init', () => {
const punoIme = ((k.Ime || '') + ' ' + (k.Prezime || '')).trim() const punoIme = ((k.Ime || '') + ' ' + (k.Prezime || '')).trim()
const polja = (tip === 'pravno') ? [k.NazivFirme] : [punoIme, k.Ime, k.Prezime] const polja = (tip === 'pravno') ? [k.NazivFirme] : [punoIme, k.Ime, k.Prezime]
return polja.some(p => (p || '').toLowerCase().startsWith(q)) return polja.some(p => (p || '').toLowerCase().startsWith(q))
}).slice(0, 100) })
},
get filtrirani() {
return this.svihFiltriranih.slice(0, this.limitKlijenata)
},
get imaJosKlijenata() {
return this.limitKlijenata < this.svihFiltriranih.length
},
ucitajViseKlijenata(e) {
const el = e.target
if (el.scrollTop + el.clientHeight >= el.scrollHeight - 40 && this.imaJosKlijenata) {
this.limitKlijenata += 30
}
}, },
jeTip(t) { jeTip(t) {
return this.tip === t return this.tip === t
@@ -387,9 +401,14 @@ document.addEventListener('alpine:init', () => {
this.tip = t this.tip = t
this.ocisti() this.ocisti()
this.pretraga = '' this.pretraga = ''
this.limitKlijenata = 30
this.noviIme = '' this.noviIme = ''
this.noviPrezime = '' this.noviPrezime = ''
this.noviNaziv = '' this.noviNaziv = ''
},
pretragaPromenjena() {
this.prikaziListu = true
this.limitKlijenata = 30
} }
})) }))
+3 -2
View File
@@ -151,10 +151,10 @@
<div x-show="nijeIzabran" style="position:relative;" @click.outside="prikaziListu=false"> <div x-show="nijeIzabran" style="position:relative;" @click.outside="prikaziListu=false">
<label class="polje-labela">Pretraži postojećeg klijenta</label> <label class="polje-labela">Pretraži postojećeg klijenta</label>
<input type="text" x-model="pretraga" autocomplete="off" <input type="text" x-model="pretraga" autocomplete="off"
@focus="prikaziListu=true" @input="prikaziListu=true" @focus="prikaziListu=true" @input="pretragaPromenjena()"
@keydown.enter.prevent="potvrdiNovog()" @keydown.enter.prevent="potvrdiNovog()"
placeholder="Ukucajte početak imena ili naziva..." style="width:100%;"> placeholder="Ukucajte početak imena ili naziva..." style="width:100%;">
<div x-show="prikaziListu && filtrirani.length" x-cloak <div x-show="prikaziListu && filtrirani.length" x-cloak @scroll="ucitajViseKlijenata($event)"
style="position:absolute;z-index:30;left:0;right:0;margin-top:4px;background:var(--pozadina-kartica,var(--pozadina));border:1px solid var(--ivica);border-radius:10px;max-height:240px;overflow:auto;box-shadow:0 8px 24px rgba(0,0,0,.14);"> style="position:absolute;z-index:30;left:0;right:0;margin-top:4px;background:var(--pozadina-kartica,var(--pozadina));border:1px solid var(--ivica);border-radius:10px;max-height:240px;overflow:auto;box-shadow:0 8px 24px rgba(0,0,0,.14);">
<template x-for="k in filtrirani" :key="k.ID"> <template x-for="k in filtrirani" :key="k.ID">
<div @click="izaberi(k)" class="klijent-stavka" <div @click="izaberi(k)" class="klijent-stavka"
@@ -164,6 +164,7 @@
x-text="detalj(k)"></div> x-text="detalj(k)"></div>
</div> </div>
</template> </template>
<div x-show="imaJosKlijenata" style="padding:6px 12px;text-align:center;font-size:11px;color:var(--tekst-sporedni);">Skrolujte za još rezultata...</div>
</div> </div>
</div> </div>