feat: preserve search text in saved tender filters

This commit is contained in:
2026-09-06 16:03:49 +03:00
parent e4a1fd0f5b
commit bcfeb6995c
5 changed files with 35 additions and 4 deletions
+18
View File
@@ -7,6 +7,9 @@ export const SmartFilterBuilder = () => {
const { savedFilters, applySavedFilter, addSavedFilter, deleteSavedFilter, setActiveTab, sektorListesi, savingCount, saveError } = useApp();
const [filterName, setFilterName] = useState('');
const [keyword,setKeyword] = useState('');
const [institutionName,setInstitutionName] = useState('');
const [registration,setRegistration] = useState('');
const [selectedKurumTip, setSelectedKurumTip] = useState('');
const [selectedUsul, setSelectedUsul] = useState('');
const [selectedCity, setSelectedCity] = useState('');
@@ -33,6 +36,9 @@ export const SmartFilterBuilder = () => {
setSuccessMessage('');
const saved=await addSavedFilter({
name: filterName.trim(),
anahtarKelime: keyword.trim(),
kurumAdi: institutionName.trim(),
ikn: registration.trim(),
kurumTipi: selectedKurumTip,
usul: selectedUsul,
sehir: selectedCity,
@@ -139,6 +145,18 @@ export const SmartFilterBuilder = () => {
<p className="text-[11px] text-slate-400">Bu ad kayıtlı filtre listenizde görünür.</p>
</div>
<div className="bg-white rounded-xl border border-slate-200 p-5 space-y-3">
<h3 className="font-bold text-sm">Arama metinleri</h3>
<p className="text-xs text-slate-600">Dolu alanlar birlikte uygulanır. Boş bıraktığınız alan aramayı sınırlamaz.</p>
{[
['Anahtar kelime',keyword,setKeyword],
['Kurum adı',institutionName,setInstitutionName],
['İKN / DT no',registration,setRegistration],
].map(([label,value,setValue])=><label key={label} className="block text-xs font-semibold text-slate-600">
{label}<input type="text" value={value} onChange={e=>setValue(e.target.value)} className="mt-1 w-full bg-slate-50 border border-slate-300 rounded-lg px-3 py-2 text-sm"/>
</label>)}
</div>
{/* Middle Grid */}
<div className="grid grid-cols-1 md:grid-cols-2 gap-6">
+2 -2
View File
@@ -735,8 +735,8 @@ export const AppProvider = ({ children }) => {
const applySavedFilter = filter => {
try {
const criteria=savedFilterCriteria(filter);
setDetailedQueries({institution:'',registration:''});
setSearchQuery('');setSelectedCpvler([]);setQuickFilter('all');
setDetailedQueries({institution:criteria.institutionName,registration:criteria.registration});
setSearchQuery(criteria.keyword);setSelectedCpvler([]);setQuickFilter('all');
setSelectedCity(criteria.city);setSelectedRegion(criteria.region);
setSelectedAlimTuru(criteria.procedure);setSelectedKurumTipi(criteria.institution);
setSelectedSektorler(criteria.sector?[criteria.sector]:[]);setActiveTab('list');setSaveError(null);
+1 -1
View File
@@ -15,5 +15,5 @@ export function savedFilterCriteria(filter){
const read=key=>{if(filter[key]!=null&&typeof filter[key]!=='string')throw new Error('Kayıtlı filtre ölçütü geçersiz.');return (filter[key] || '').trim();};
const region=read('bolge');
if(region&&!Object.keys(REGION_CITIES).includes(norm(region)))throw new Error('Kayıtlı bölge tanınmadı; filtreyi yeniden düzenleyin.');
return {city:read('sehir'),region:region?norm(region):'',sector:read('sektor'),institution:read('kurumTipi'),procedure:read('usul')};
return {city:read('sehir'),region:region?norm(region):'',sector:read('sektor'),institution:read('kurumTipi'),procedure:read('usul'),keyword:read('anahtarKelime'),institutionName:read('kurumAdi'),registration:read('ikn')};
}