@include('partials.pms-clean-filter-get-scripts') // Scheme filters: clean GET (no empty keys; checked flags only); Select2; plan sync name / UID / ADP var $schemeFilterForm = $('#schemeFilterForm'); var $mecSectorSelect, $mecSubSectorSelect; if ($schemeFilterForm.length) { window.pmsBindCleanFilterFormSubmit('#schemeFilterForm', { beforeCollect: function (form, add) { if (form.getAttribute('data-context') !== 'plan') { return; } var params = new URLSearchParams(window.location.search); if (params.get('show_approved_schemes') === '1') { add('show_approved_schemes', '1'); } ['plan_type', 'month', 'year'].forEach(function (key) { var v = params.get(key); if (v) { add(key, v); } }); var formPlanType = form.getAttribute('data-plan-type'); if (formPlanType && !params.get('plan_type')) { add('plan_type', formPlanType); } }, onUncheckedCheckbox: function (name, el, add) { if (name !== 'filter_fpa') { return; } var form = el.form; if (!form || form.getAttribute('data-context') !== 'plan') { return; } if (String(form.getAttribute('data-plan-type') || '').toUpperCase() !== 'PMP') { return; } add('filter_fpa_off', '1'); }, }); var select2Base = { theme: 'bootstrap4', width: '100%', allowClear: true }; $schemeFilterForm.find('select:not([multiple]):not(:disabled):not(.pms-select2-lookup)').each(function () { var $sel = $(this); if ($sel.hasClass('select2-hidden-accessible')) { return; } var placeholder = $.trim($sel.find('option[value=""]').first().text() || ''); var opts = $.extend({}, select2Base); if (placeholder !== '') { opts.placeholder = placeholder; opts.allowClear = true; } $sel.select2(opts); }); $schemeFilterForm.find('select[multiple]:not(:disabled):not(.pms-select2-lookup)').each(function () { var $sel = $(this); if ($sel.hasClass('select2-hidden-accessible')) { return; } var ph = $sel.data('placeholder') || ''; $sel.select2($.extend({}, select2Base, { closeOnSelect: false, placeholder: ph })); }); (function () { if (typeof window.pmsBindSchemeFilterCollapses === 'function') { window.pmsBindSchemeFilterCollapses(document); return; } var $planCollapse = $('.scheme-filters-plan-collapse').first(); var $toggle = $('.scheme-filters-collapse-toggle').first(); if (!$planCollapse.length || !$toggle.length) { return; } var $label = $toggle.find('.scheme-filters-collapse-label'); function syncLabel() { $label.text($planCollapse.hasClass('show') ? 'Hide filters' : 'Show filters'); } $planCollapse.on('hidden.bs.collapse shown.bs.collapse', function () { syncLabel(); $(window).trigger('resize'); }); syncLabel(); })(); } if ($schemeFilterForm.length && $schemeFilterForm.find('.scheme-project-sync').length) { var $syncSelects = $schemeFilterForm.find('select.scheme-project-sync'); $mecSectorSelect = $schemeFilterForm.find('select[name="mec_sector_id"]'); $mecSubSectorSelect = $schemeFilterForm.find('select[name="mec_sub_sector_id"]'); var schemeFilterFormTripleSyncing = false; function fillMecSectorFromProject(detail) { if (!$mecSectorSelect.length) { return; } if (!detail || !detail.mec_sector) { $mecSectorSelect.val('').trigger('change'); return; } var raw = (detail.mec_sector || '').trim(); var map = window.schemeFilterMecSectorNameToId; if (!map || Array.isArray(map)) { map = {}; } var id = raw ? map[raw.toLowerCase()] : null; if (id) { $mecSectorSelect.val(String(id)).trigger('change'); } else { $mecSectorSelect.val('').trigger('change'); } } $(document).on('change.schemeTripleSync select2:select.schemeTripleSync select2:clear.schemeTripleSync', '#schemeFilterForm select.scheme-project-sync', function () { if (schemeFilterFormTripleSyncing) { return; } var $this = $(this); var pid = $this.val() || ''; var itemData = null; if (pid !== '') { var $selectedOption = $this.find('option:selected'); if ($selectedOption.length && $selectedOption.data('select2Data')) { itemData = $selectedOption.data('select2Data'); } else { // Fallback to select2 data API var s2data = $this.select2('data'); if (s2data && s2data.length > 0) { itemData = s2data[0]; } } } schemeFilterFormTripleSyncing = true; try { $syncSelects.not(this).each(function () { var $other = $(this); if (($other.val() || '') !== pid) { if (pid !== '' && itemData) { // Create option if it doesn't exist if (!$other.find('option[value="' + pid + '"]').length) { var lookupType = $other.data('lookup-type') || ''; var label = pid; if (lookupType === 'adp') label = itemData.adp_number || '—'; else if (lookupType === 'uid') label = itemData.code || itemData.uid || '—'; else label = itemData.name || itemData.text || '—'; var $newOpt = new Option(label, pid, true, true); $($newOpt).data('select2Data', itemData); $other.append($newOpt); } } $other.val(pid).trigger('change.select2'); } }); } finally { schemeFilterFormTripleSyncing = false; } fillMecSectorFromProject(itemData); }); }