MediaWiki:EveryCRT-SearchEngine.js: Difference between revisions
No edit summary |
No edit summary |
||
| (3 intermediate revisions by the same user not shown) | |||
| Line 186: | Line 186: | ||
html += '<label>' + filter.label + '</label>'; | html += '<label>' + filter.label + '</label>'; | ||
html += '<div class="crt-multiselect" id="filter-' + filterKey + '" data-filter="' + filterKey + '">'; | html += '<div class="crt-multiselect" id="filter-' + filterKey + '" data-filter="' + filterKey + '">'; | ||
html += '<div class="crt-multiselect-container">'; | |||
html += '<div class="crt-multiselect-selected"></div>'; | html += '<div class="crt-multiselect-selected"></div>'; | ||
html += '<input type="text" class="crt-multiselect-input" placeholder="Search ' + filter.label.toLowerCase() + '...">'; | html += '<input type="text" class="crt-multiselect-input" placeholder="Search ' + filter.label.toLowerCase() + '...">'; | ||
html += '</div>'; | |||
html += '<div class="crt-multiselect-dropdown"></div>'; | html += '<div class="crt-multiselect-dropdown"></div>'; | ||
html += '</div>'; | html += '</div>'; | ||
| Line 325: | Line 327: | ||
container.querySelectorAll('.crt-multiselect').forEach(function(ms) { | container.querySelectorAll('.crt-multiselect').forEach(function(ms) { | ||
var input = ms.querySelector('.crt-multiselect-input'); | var input = ms.querySelector('.crt-multiselect-input'); | ||
var filterKey = ms.dataset.filter; | var filterKey = ms.dataset.filter; | ||
input.addEventListener('focus', function() { | input.addEventListener('focus', function() { | ||
ms.classList.add('open'); | |||
updateMultiselectDropdown(ms, filterKey); | updateMultiselectDropdown(ms, filterKey); | ||
}); | }); | ||
input.addEventListener('input', function() { | input.addEventListener('input', function() { | ||
ms.classList.add('open'); | |||
updateMultiselectDropdown(ms, filterKey, this.value); | updateMultiselectDropdown(ms, filterKey, this.value); | ||
}); | }); | ||
| Line 339: | Line 341: | ||
document.addEventListener('click', function(e) { | document.addEventListener('click', function(e) { | ||
if (!ms.contains(e.target)) { | if (!ms.contains(e.target)) { | ||
ms.classList.remove('open'); | |||
} | } | ||
}); | }); | ||
| Line 422: | Line 424: | ||
var filter = section.filters[filterKey]; | var filter = section.filters[filterKey]; | ||
if (filter.loadFrom === 'category') { | if (filter.loadFrom === 'category') { | ||
promises.push(loadCategoryOptions(filterKey, filter.category)); | promises.push(loadCategoryOptions(filterKey, filter.category, filter.categoryMemberTypes)); | ||
} else if (filter.loadFrom === 'smw') { | } else if (filter.loadFrom === 'smw') { | ||
promises.push(loadSMWOptions(filterKey, filter.smwQuery, filter.smwProperty)); | promises.push(loadSMWOptions(filterKey, filter.smwQuery, filter.smwProperty)); | ||
| Line 476: | Line 478: | ||
format: 'json' | format: 'json' | ||
}).done(function(data) { | }).done(function(data) { | ||
var seen = {}; | |||
filterOptions[filterKey] = []; | filterOptions[filterKey] = []; | ||
if (data.query && data.query.results) { | if (data.query && data.query.results) { | ||
| Line 482: | Line 485: | ||
result.printouts[smwProperty].forEach(function(val) { | result.printouts[smwProperty].forEach(function(val) { | ||
var v = typeof val === 'object' ? (val.fulltext || val.value || '') : String(val); | var v = typeof val === 'object' ? (val.fulltext || val.value || '') : String(val); | ||
if (v) filterOptions[filterKey].push({ value: v, label: v }); | if (v && !seen[v]) { | ||
seen[v] = true; | |||
filterOptions[filterKey].push({ value: v, label: v }); | |||
} | |||
}); | }); | ||
} | } | ||
| Line 839: | Line 845: | ||
var arr = Array.from(matchingModels).sort(); | var arr = Array.from(matchingModels).sort(); | ||
var mainConditions = queryData.mainQuery.replace('[[Category:' + cfg.category + ']]', '').trim(); | |||
if (!mainConditions) { | |||
totalResults = arr.length; | |||
totalResultsKnown = true; | |||
} else { | |||
totalResults = 0; | |||
totalResultsKnown = false; | |||
} | |||
fetchModelDetailsBatched(arr, mainConditions, sortProperty, sortOpt); | fetchModelDetailsBatched(arr, mainConditions, sortProperty, sortOpt); | ||
}).catch(function(error) { | }).catch(function(error) { | ||