MediaWiki:EveryCRT-SearchEngine.js: Difference between revisions

No edit summary
No edit summary
 
(4 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 dropdown = ms.querySelector('.crt-multiselect-dropdown');
             var filterKey = ms.dataset.filter;
             var filterKey = ms.dataset.filter;


             input.addEventListener('focus', function() {
             input.addEventListener('focus', function() {
                 dropdown.classList.add('visible');
                 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)) {
                     dropdown.classList.remove('visible');
                     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();
             api.get({
             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) {
Line 474: 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 480: 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 837: Line 845:


             var arr = Array.from(matchingModels).sort();
             var arr = Array.from(matchingModels).sort();
             totalResults = arr.length;
             var mainConditions = queryData.mainQuery.replace('[[Category:' + cfg.category + ']]', '').trim();
            totalResultsKnown = true;


             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) {
MediaWiki Appliance - Powered by TurnKey Linux