MediaWiki:EveryCRT-SearchEngine.js: Difference between revisions
No edit summary |
No edit summary |
||
| (5 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 440: | Line 442: | ||
} | } | ||
function loadCategoryOptions(filterKey, category) { | function loadCategoryOptions(filterKey, category, memberTypes) { | ||
return new Promise(function(resolve) { | return new Promise(function(resolve) { | ||
var api = new mw.Api(); | var api = new mw.Api(); | ||
var params = { | |||
action: 'query', | action: 'query', | ||
list: 'categorymembers', | list: 'categorymembers', | ||
| Line 449: | Line 451: | ||
cmlimit: 500, | cmlimit: 500, | ||
format: 'json' | format: 'json' | ||
}).done(function(data) { | }; | ||
if (memberTypes) params.cmtype = memberTypes; | |||
api.get(params).done(function(data) { | |||
filterOptions[filterKey] = []; | filterOptions[filterKey] = []; | ||
if (data.query && data.query.categorymembers) { | if (data.query && data.query.categorymembers) { | ||
data.query.categorymembers.forEach(function(member) { | data.query.categorymembers.forEach(function(member) { | ||
filterOptions[filterKey].push({ value: | var label = member.ns === 0 ? member.title : member.title.replace(/^[^:]+:/, ''); | ||
filterOptions[filterKey].push({ value: label, label: label }); | |||
}); | }); | ||
filterOptions[filterKey].sort(function(a, b) { return a.label.localeCompare(b.label); }); | filterOptions[filterKey].sort(function(a, b) { return a.label.localeCompare(b.label); }); | ||
| Line 473: | 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 479: | 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 836: | 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) { | ||