{"version":3,"file":"../elonu-plugin-program-manager-frontend-scripts.min.js","sources":["assets/js/src/elonu-plugin-program-manager-frontend-scripts.js"],"sourcesContent":["jQuery(document).ready(function($) {\n\t\n\t/**\n\t * Generic APM Table Init\n\t *\n\t * Standard dataTables initialization for tables used in most Academic\n\t * Program Manager templates.\n\t * \n\t * NOTE: original file - ../themes/黑料不打烊University-Academic/assets/js/program-tables.js\n\t */\n\t$('.elon-apm--data-table').DataTable({\n\t\tpaging: false,\n\t\tinfo: false,\n\t\tresponsive: true,\n\t\tcolumnDefs: [{\n\t\t\t\"targets\" : 'no-sort',\n\t\t\t\"orderable\": false,\n\t\t}]\n\t});\n\t\n\t/**\n\t * Advanced Programs Table Init\n\t *\n\t * Advanced dataTables initialization for the table used in the \n\t * \"黑料不打烊 APM - Programs Table Page (Advanced)\" template.\n\t * \n\t * NOTE: original file - ../themes/黑料不打烊University-Core/assets/js/projects/academic-programs-table.js\n\t */\n\tif ($('#elonApmAdvProgramsTable').length) {\n\t\t\n\t\t// Clear out search input on page refresh\n\t\t$('#elonApmProgramFiltersSearch').val('');\n\t\t\n\t\tvar table = $('#elonApmAdvProgramsTable').DataTable({\n\t\t\tpaging: false,\n\t\t\tresponsive: {\n\t\t\t\tdetails: {\n\t\t\t\t\ttype: 'column',\n\t\t\t\t\ttarget: 'button.details-control'\n\t\t\t\t}\n\t\t\t},\n\t\t\torder: [[ 0, \"asc\" ]],\n\t\t\tdom: '<\"table-top\"i>t',\n\t\t\tcolumnDefs: [\n\t\t\t\t{\n\t\t\t\t\torderable: false,\n\t\t\t\t\ttargets: -1,\n\t\t\t\t\tcreatedCell: function (td, cellData, rowData, row, col) {\n\t\t\t\t\t $(td).find('button.details-control').attr('aria-controls', 'dt-row-' + row + '-child')\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t{ \n\t\t\t\t\torderable: false,\n\t\t\t\t\ttargets: 'no-sort'\n\t\t\t\t}\n\t\t\t],\n\t\t\tlanguage: {\n\t\t\t\t\"info\": '_END_ Programs Match Your Selection',\n\t\t\t\t\"infoFiltered\": '',\n\t\t\t\t\"infoEmpty\": '0 Programs Match Your Selection',\n\t\t\t\t\"zeroRecords\": 'No programs match your search.'\n\t\t\t},\n\t\t\tinitComplete: function () {\n\t\t\t\t\n\t\t\t\t$('#elonApmTableLoader').css('display', 'none');\n\t\t\t\t$('#elonApmAdvProgramsTable').removeClass('loading');\n\t\t\t\t\n\t\t\t\tvar typeColumn = this.api().column(1);\n\t\t\t\t\n\t\t\t\t$('#elonApmProgramTypeFilter').on('change', function() {\n\t\t\t\t\tvar val = $(this).val();\n\t\t\t\t\ttypeColumn.search(val, false, false, false).draw();\n\t\t\t\t});\n\t\t\t\t\n\t\t\t\tvar schoolColumn = this.api().column(4);\n\t\t\t\t\n\t\t\t\t$('#elonApmSchoolFilter').on('change', function() {\n\t\t\t\t\tvar val = $(this).val();\n\t\t\t\t\tschoolColumn.search(val).draw();\n\t\t\t\t});\n\t\t\t\t\n\t\t\t\t$('#elonApmProgramFiltersSearch').keyup(function(){\n\t\t\t\t\ttable.columns(0).search($(this).val()).draw() ;\n\t\t\t\t});\n\t\t\t\t\n\t\t\t\t$('#elonApmProgramFiltersSearchClear').click(function() {\n\t\t\t\t\ttable.columns(0).search('').draw();\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t\t\n\t\t// Close Open Details Rows When Another is Open\n\t\t// Note:\n\t\t// Can't use dataTables row.child.isShown() function because these are responsive detail rows.\n\t\t// Responsive detail rows return the opposite of what is expected for that function.\n\t\t// Using a custom class to determine if a row is open/closed (.hide-details).\n\t\tvar openRows = new Array();\n\t\t\n\t\tfunction closeOpenedRows(table, selectedRow) {\n\t\t\t$.each(openRows, function (index, openRow) {\n\t\t\t\t// not the selected row!\n\t\t\t\tif ($.data(selectedRow) !== $.data(openRow)) {\n\t\t\t\t\tvar rowToCollapse = table.row(openRow);\n\t\t\t\t\trowToCollapse.child.hide();\n\t\t\t\t\topenRow.removeClass('parent').addClass('hide-details');\n\t\t\t\t\topenRow.find('button.details-control').removeClass('details-open').addClass('details-closed').attr('aria-expanded', 'false');\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t\t\n\t\t$('#elonApmAdvProgramsTable tbody').on('click', 'button.details-control', function () {\n\t\t\tvar tr = $(this).closest('tr');\n\t\t\tvar row = table.row(tr);\n\t\t\tvar btn = $(this);\n\t\t\t\n\t\t\tif (tr.hasClass('hide-details')) {\n\t\t\t\t// close all previously opened rows\n\t\t\t\tcloseOpenedRows(table, tr);\n\t\t\n\t\t\t\t// This row should be opened - open it \n\t\t\t\trow.child.show();\n\t\t\t\ttr.addClass('parent').removeClass('hide-details');\n\t\t\t\ttr.next('tr.child').attr('id', 'dt-row-' + row.index() + '-child');\n\t\t\t\tbtn.addClass('details-open').removeClass('details-closed').attr('aria-expanded', 'true');\n\t\t\n\t\t\t\t// store current selection\n\t\t\t\topenRows.push(tr);\n\t\t\t} else {\n\t\t\t\t// This row is already open - close it\n\t\t\t\trow.child.hide();\n\t\t\t\ttr.removeClass('parent').addClass('hide-details');\n\t\t\t\tbtn.removeClass('details-open').addClass('details-closed').attr('aria-expanded', 'false');\n\t\t\t}\n\t\t});\n\t\t\n\t\t// init select2 on table filters\n\t\t$('#elonApmProgramTypeFilter').select2({\n\t\t\tminimumResultsForSearch: Infinity,\n\t\t\tallowClear: true,\n\t\t\tsorter: function(data) {\n\t\t\t\treturn data.sort(function(a, b) {\n\t\t\t\t\ta = a.text.toLowerCase();\n\t\t\t\t\tb = b.text.toLowerCase();\n\t\t\t\t\t\n\t\t\t\t\t// using a custom sorter to place the \"undergraduate major/minor\" items first in the select list. other items are alphabetized after them.\n\t\t\t\t\tif (a[0] == 'u' && b[0] == 'u') {\n\t\t\t\t\t\treturn compare(a, b)\n\t\t\t\t\t} else if (a[0] == 'u') {\n\t\t\t\t\t\treturn -1;\n\t\t\t\t\t} else if (b[0] == 'u') {\n\t\t\t\t\t\treturn 1;\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn compare(a, b)\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t\t\n\t\tfunction compare(a, b) {\n\t\t\tif (a > b) {\n\t\t\t\treturn 1;\n\t\t\t} else if (a < b) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t\treturn 0;\n\t\t}\n\t\t\n\t\t$('#elonApmSchoolFilter').select2({\n\t\t\tminimumResultsForSearch: Infinity,\n\t\t\tallowClear: true\n\t\t});\n\t}\n\t\n\t/**\n\t * Programs List by Type Functionality\n\t *\n\t * jQuery functionality for managing an accordion interface with search filtering and accessibility enhancements.\n\t */\n\tif ($('#elonApmProgramsList').length) {\n\t\t\n\t\t// Get necessary elements from the DOM\n\t\tvar $accordion = $('#elonApmAccordion');\n\t\tvar $headers = $accordion.find('.elon-apm--accordion-header');\n\t\tvar $contentPanes = $accordion.find('div.elon-apm--accordion-content');\n\t\tvar $searchInput = $('#elonApmSearchInput');\n\t\tvar $searchClear = $('#elonApmClearSearch');\n\t\tvar $noResultsMessage = $('#noResultsMessage');\n\t\t\n\t\t// Clear out search input on page refresh\n\t\t$searchInput.val('');\n\t\t\n\t\t/**\n\t\t * Address some accessibility issues with jQuery UI accordions\n\t\t * \n\t\t * - 1. Override jQuery UI setting negative tab index on accordion headers\n\t\t * - 2. Assign appropriate aria attributes on accordion header click\n\t\t */\n\t\t \n\t\t// 1. Override jQuery UI setting negative tab index on accordion headers\n\t\t$headers.attr('tabindex', 0);\n\t\t\n\t\t// 2. Handle click event on accordion headers\n\t\t$headers.on('click', function() {\n\t\t\tvar $header = $(this);\n\t\t\tvar $content = $header.next('.elon-apm--accordion-content');\n\t\t\tvar expanded = $header.attr('aria-expanded') === 'true';\n\t\t\t\n\t\t\t// Toggle aria-expanded/hidden attributes\n\t\t\t$header.attr('aria-expanded', !expanded);\n\t\t\t$content.attr('aria-hidden', expanded);\n\t\t});\n\t\t\n\t\t// Array to store the indexes of open accordions\n\t\tvar openAccordionIndexes = [];\n\t\t\n\t\t// Check each header for the \"open\" state attribute on initial page load\n\t\t$headers.each(function(index) {\n\t\t\tif ($(this).attr('data-state') === 'open') {\n\t\t\t\topenAccordionIndexes.push(index);\n\t\t\t}\n\t\t});\n\t\t\n\t\t// Attach a click event handler to accordion headers\n\t\t$headers.on('click', function(event) {\n\t\t\t// Check if the event was triggered by the user (not programmatically)\n\t\t\tif (event.originalEvent) {\n\t\t\t\t// Get the index of the clicked header\n\t\t\t\tvar index = $headers.index(this);\n\t\t\t\t// Get the current state of the clicked header\n\t\t\t\tvar currentState = $(this).attr('data-state');\n\t\t\t\t\n\t\t\t\t// Update the openAccordionIndexes array based on the header state\n\t\t\t\tif (currentState === 'open') {\n\t\t\t\t\t// Remove the index if the a header click will close the pane\n\t\t\t\t\topenAccordionIndexes = openAccordionIndexes.filter(function(item) {\n\t\t\t\t\t\treturn item !== index;\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\t// Add the index if the a header click will open the pane\n\t\t\t\t\topenAccordionIndexes.push(index);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t// Update the state attribute\n\t\t\t\tvar newState = currentState === 'closed' ? 'open' : 'closed';\n\t\t\t\t$(this).attr('data-state', newState);\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t});\n\t\t\n\t\t// Debounce the input event handler\n\t\tvar debounceInputHandler = debounce(function(searchTerm) {\n\t\t\t\n\t\t\tif (searchTerm.trim() !== '') {\n\t\t\t\t// Show the search clear when input has a value\n\t\t\t\t$searchClear.show();\n\t\t\t\t\n\t\t\t\t// Expand all closed accordion panes once a search is initiated\n\t\t\t\texpandClosedAccordionPanes($headers, $accordion);\n\t\t\t\t\n\t\t\t\t// Filter the accordion content based on search terms\n\t\t\t\tfilterAccordionContent($contentPanes, searchTerm, $accordion, $noResultsMessage);\n\t\t\t} else {\n\t\t\t\t// Trigger click on the clear search button\n\t\t\t\t$searchClear.trigger('click');\n\t\t\t\t\n\t\t\t\t// Hide the search clear when input is empty\n\t\t\t\t$searchClear.hide();\n\t\t\t}\n\t\t\t\n\t\t}, 300);\n\t\t\n\t\t// Bind the debounced input event handler to the search input field\n\t\t$searchInput.on('input', function() {\n\t\t\t// Grab the search term\n\t\t\tvar searchTerm = $(this).val().trim().toLowerCase();\n\t\t\t\n\t\t\t// Fire the debounced input event handler\n\t\t\tdebounceInputHandler(searchTerm);\n\t\t});\n\t\t\n\t\t// Bind the keydown event handler to the search input field\n\t\t$searchInput.on('keydown', function(event) {\n\t\t\t// Check if the Enter key is pressed\n\t\t\tif (event.keyCode === 13) {\n\t\t\t\t// Prevent the default behavior (page reload)\n\t\t\t\tevent.preventDefault();\n\t\t\t\t\n\t\t\t\t// Remove the search input focus (this *should* hide virtual keyboards on touch devices on return press)\n\t\t\t\t$(this).filter(':input:focus').blur();\n\t\t\t\t\n\t\t\t\t// Calculate a scroll offset\n\t\t\t\t\n\t\t\t\t// Account for WP Admin bar if logged in\n\t\t\t\tvar wpAdminBar = parseInt($('html').css('margin-top'), 10);\n\t\t\t\t\n\t\t\t\t// Set default scroll offset value\n\t\t\t\tvar scrollOffset = wpAdminBar - 1; \n\t\t\t\t\n\t\t\t\t// Account for sticky headers (on desktop)\n\t\t\t\tvar $siteHeader = $('#headerArea');\n\t\t\t\tif ($siteHeader.length && $siteHeader.hasClass('headroom') && $(window).width() >= 1080) {\n\t\t\t\t\tvar headerTopHeight = $siteHeader.find('.site-header--top').outerHeight();\n\t\t\t\t\tvar headerBottomHeight = $siteHeader.find('.site-header--bottom').outerHeight();\n\t\t\t\t\t\n\t\t\t\t\tscrollOffset = scrollOffset + headerTopHeight + headerBottomHeight; \n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t// Scroll to the top of the programs list div\n\t\t\t\tvar $targetElement = $('#elonApmProgramsList');\n\t\t\t\tif ($targetElement.length) {\n\t\t\t\t\t$('html, body').animate({\n\t\t\t\t\t\tscrollTop: $targetElement.offset().top - scrollOffset // the - 1 accounts for the 1px border on top of the list container\n\t\t\t\t\t}, 500);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\t\n\t\t// Clear search input\n\t\t$searchClear.on('click', function() {\n\t\t\t// Clear the input and focus on it\n\t\t\t$searchInput.val('').focus();\n\t\t\t\n\t\t\t// Hide the clear button\n\t\t\t$(this).hide();\n\t\t\t\n\t\t\t// Call the filter function to reset the search results\n\t\t\tfilterAccordionContent($contentPanes, '', $accordion, $noResultsMessage);\n\t\t\t\n\t\t\t// Hide accordion panes that were not previously opened\n\t\t\t$headers.each(function(index) {\n\t\t\t\t// Check if the header is not in the \"open\" list. If it's not, it needs to be closed.\n\t\t\t\tif (!openAccordionIndexes.includes(index)) {\n\t\t\t\t\t// If it's currently open, trigger a click on the header.\n\t\t\t\t\t// This will close the content pane and toggle appropriate jQuery UI classes.\n\t\t\t\t\t// But it's important not to trigger a click on a header that may already\n\t\t\t\t\t// be closed because it could end up open again.\n\t\t\t\t\tif ($(this).attr('data-state') === 'open') {\n\t\t\t\t\t\t$(this).trigger('click');\n\t\t\t\t\t}\n\t\t\t\t\t// Regardless of current state, make sure header has appropriate aria attributes for \"closed\" state\n\t\t\t\t\t$(this).attr('aria-expanded', 'false').attr('data-state', 'closed');\n\t\t\t\t\t// Regardless of current state, make sure content has appropriate aria attributes for \"closed\" state\n\t\t\t\t\t// and the content pane is hidden.\n\t\t\t\t\t$(this).next('.elon-apm--accordion-content').attr('aria-hidden', 'true').hide();\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\t\n});\n\n/**\n * Returns a function, that, as long as it continues to be invoked, will not\n * be triggered. The function will be called after it stops being called for\n * N milliseconds.\n *\n * @param {Function} func - The function to debounce.\n * @param {number} wait - The number of milliseconds to wait before invoking the function.\n * @returns {Function} - The debounced function.\n */\nfunction debounce(func, wait) {\n\tvar timeout;\n\treturn function() {\n\t\tvar context = this,\n\t\t\targs = arguments;\n\t\tvar later = function() {\n\t\t\ttimeout = null;\n\t\t\tfunc.apply(context, args);\n\t\t};\n\t\tclearTimeout(timeout);\n\t\ttimeout = setTimeout(later, wait);\n\t};\n}\n\n/**\n * Checks if any element in a jQuery collection contains a substring matching the search term.\n *\n * @param {jQuery} $elements - The jQuery collection of elements to search.\n * @param {string} searchTerm - The search term to match against.\n * @returns {boolean} True if any element in the collection contains a matching substring, otherwise false.\n */\nfunction hasMatch($elements, searchTerm) {\n\t// Filter the jQuery collection of elements\n\treturn $elements.filter(function() {\n\t\t// Get the text content of the element.\n\t\tvar text = $(this).text().toLowerCase();\n\t\t\n\t\t// Remove the substring \"(opens a new window)\" if present.\n\t\t// This string is added to external links and we want to remove it\n\t\t// before comparing for a match so we don't get false positives\n\t\t// if someone searches for words within this string.\n\t\ttext = text.replace(/\\(opens a new window\\)/g, '').trim();\n\t\t\n\t\t// Check if the modified text contains the search term.\n\t\treturn text.indexOf(searchTerm.toLowerCase()) !== -1;\n\t}).length > 0;\n}\n\n/**\n * Expands all closed accordion panes by activating their associated headers.\n *\n * @param {jQuery} $headers - The jQuery collection of accordion headers.\n * @param {jQuery} $accordion - The jQuery object representing the accordion container.\n * @returns {void}\n */\nfunction expandClosedAccordionPanes($headers, $accordion) {\n\t// Iterate over each accordion header\n\t$headers.each(function() {\n\t\tvar $header = $(this);\n\t\t\n\t\t// Check if the header is in the closed state\n\t\tif ($header.attr('data-state') === 'closed') {\n\t\t\t// Trigger a click event on the header to open the associated accordion pane\n\t\t\t$header.trigger('click');\n\t\t\t\n\t\t\t// Update attributes to reflect the open state\n\t\t\t$header.attr('aria-expanded', 'true').attr('data-state', 'open');\n\t\t\t\n\t\t\t// Update attributes on the associated accordion content to reflect the open state\n\t\t\t$header.next('div.elon-apm--accordion-content').attr('aria-hidden', 'false');\n\t\t}\n\t});\n}\n\n/**\n * Filters list items within each unordered list based on the provided search term.\n * Hides or shows lists and their headers based on whether any list item matches the search term.\n *\n * @param {jQuery} $uls - The jQuery collection of unordered lists to filter.\n * @param {string} searchTerm - The search term to match against.\n * @returns {void}\n */\nfunction filterListItems($uls, searchTerm) {\n\t// Iterate over each unordered list\n\t$uls.each(function() {\n\t\tvar $ul = $(this);\n\t\tvar $lis = $ul.find('li');\n\t\t// Check if any list item matches the search term\n\t\tvar anyMatchInLis = hasMatch($lis, searchTerm);\n\t\t\n\t\t// Hide or show the unordered list and corresponding heading based on matching results\n\t\tif (!anyMatchInLis) {\n\t\t\t$ul.hide();\n\t\t\t$ul.prev('.accordion-content--header').hide();\n\t\t} else {\n\t\t\t$ul.show();\n\t\t\t$ul.prev('.accordion-content--header').show();\n\t\t\t\n\t\t\t// Iterate over each list item and show or hide based on matching results\n\t\t\t$lis.each(function() {\n\t\t\t\tvar $li = $(this);\n\t\t\t\tif (!hasMatch($li, searchTerm)) {\n\t\t\t\t\t$li.hide();\n\t\t\t\t} else {\n\t\t\t\t\t$li.show();\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n}\n\n/**\n * Filters accordion content based on the provided search term, showing or hiding content panes and headers accordingly.\n *\n * @param {jQuery} $contentPanes - The jQuery collection of accordion content panes to filter.\n * @param {string} searchTerm - The search term to match against.\n * @param {jQuery} $accordion - The jQuery object representing the accordion container.\n * @param {jQuery} $noResultsMessage - The jQuery object representing the message to display when no results are found.\n * @returns {void}\n */\nfunction filterAccordionContent($contentPanes, searchTerm, $accordion, $noResultsMessage) {\n\t// Flag to track if any match is found in any content pane\n\tvar anyMatchInAccordion = false;\n\t\n\t// Iterate over each content pane\n\t$contentPanes.each(function() {\n\t\t\n\t\t// Get references to the content pane, header, and unordered lists within the pane\n\t\tvar $content = $(this);\n\t\tvar $contentHeader = $content.prev('.elon-apm--accordion-header');\n\t\tvar $uls = $content.find('ul');\n\t\t\n\t\t// Check if any list item in any list in the content pane matches the search term\n\t\tvar anyMatchInULs = hasMatch($uls.find('li'), searchTerm);\n\t\t\n\t\t// No matches found anywhere in the content pane\n\t\tif (!anyMatchInULs) {\n\t\t\t// Hide the accordion header/content group\n\t\t\t$content.hide();\n\t\t\t$contentHeader.hide();\n\t\t} else {\n\t\t\t// Show the accordion header/content group\n\t\t\t$content.show();\n\t\t\t$contentHeader.show();\n\t\t\t// Set flag to true if any match is found\n\t\t\tanyMatchInAccordion = true;\n\t\t\t// Filter list items based on search term\n\t\t\tfilterListItems($uls, searchTerm);\n\t\t}\n\t\t\n\t});\n\t\n\t// Display \"no programs found\" message if no programs are found\n\tif (!anyMatchInAccordion) {\n\t\t$noResultsMessage.show();\n\t\t$accordion.hide();\n\t} else {\n\t\t$noResultsMessage.hide();\n\t\t$accordion.show();\n\t}\n}"],"names":["hasMatch","$elements","searchTerm","filter","text","$","this","toLowerCase","replace","trim","indexOf","length","expandClosedAccordionPanes","$headers","$accordion","each","$header","attr","trigger","next","filterAccordionContent","$contentPanes","$noResultsMessage","anyMatchInAccordion","$content","$contentHeader","prev","$uls","find","show","$ul","$lis","$li","hide","filterListItems","jQuery","document","ready","DataTable","paging","info","responsive","columnDefs","targets","orderable","val","table","details","type","target","order","dom","createdCell","td","cellData","rowData","row","col","language","infoFiltered","infoEmpty","zeroRecords","initComplete","css","removeClass","typeColumn","api","column","on","search","draw","schoolColumn","keyup","columns","click","openRows","Array","closeOpenedRows","selectedRow","index","openRow","data","child","addClass","compare","a","b","tr","closest","btn","hasClass","push","select2","minimumResultsForSearch","Infinity","allowClear","sorter","sort","$searchInput","$searchClear","expanded","openAccordionIndexes","event","originalEvent","currentState","item","newState","debounceInputHandler","func","wait","context","args","arguments","later","timeout","apply","clearTimeout","setTimeout","keyCode","preventDefault","blur","scrollOffset","parseInt","$siteHeader","window","width","outerHeight","$targetElement","animate","scrollTop","offset","top","focus","includes"],"mappings":"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"}