{"version":3,"sources":["webpack:///./app/javascript/calendar/filters.js"],"names":["loadCalendarFilterById","id","undefined","url","window","calendarSettings","loadFilterLink","replace","$","ajax","method","dataType","success","data","removeClass","addClass","val","title","patient_ids","forEach","option","document","querySelector","setValue","clear","mode_type_ids","therapist_ids","loadedCalendarFilter","error","xhr","status","console","updateQuickButtons","getElementById","remove","existingHeaderToolbar","quickButtonsContainer","createElement","className","parentNode","insertBefore","nextSibling","activeFilter","URLSearchParams","location","search","get","innerHTML","buttonWrapper","Array","isArray","calendarFiltersData","pinnedFilters","filter","distinction","activeFilterExists","some","activeFilterObject","find","isActive","button","type","dataset","uuid","active","action","icon","length","substring","appendChild","loadCalendarFilters","show","urlParams","filterUrl","filtersLink","toString","filtersListPinned","filtersListSaved","filtersListOther","empty","admin","isAdmin","distinctionIcon","class","grippie","listItem","attr","filterSpan","text","dataId","defaultIcon","defaultLink","href","append","deleteLink","prepend","children","hide","newCalendarFilter","event","preventDefault","prop","loadCalendarFilter","target","deleteCalendarFilter","dUrl","deleteFilterLink","eId","parent","confirm","defaultCalendarFilter","defaultFilterLink","saveAndApplyCalendarFilter","form","checkValidity","saveUrl","saveFilterLink","serialize","set","newUrl","pathname","Turbolinks","visit","reportValidity","saveFilterPositionChange","ui","list","filterItems","item","index","moveUrl","moveFilterLink","showEmptyDropzones","src","savedFilters","otherFilters","registerFilters","off","on","this","closest","modal","sortable","connectWith","revert","handle","placeholder","helper","axis","opacity","start","receive","update","stop","originalIndex","items","eq","before"],"mappings":"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","file":"js/73-bf0d0e09e01b965c26a4.chunk.js","sourcesContent":["import { constructURL } from 'helpers/url';\n\n// Loads a calendar filter by its ID via an AJAX request and populates the filter form.\n//\n// @param {number} id - The ID of the calendar filter to load.\n// @return {void}\nconst loadCalendarFilterById = (id) => {\n if (id === undefined || id === null) {\n return false;\n }\n const url = window.calendarSettings?.loadFilterLink.replace('000', id);\n $.ajax({\n url,\n method: 'GET',\n dataType: 'json',\n success(data) {\n $('li.saved-calendar-filter').removeClass('bg-warning');\n $(`li[data-id=\"${data.id}\"]`).addClass('bg-warning');\n $('#calendar_filter_id').val(data.id);\n $('#calendar_filter_title').val(data.title);\n data.patient_ids.forEach((option) => {\n document.querySelector('awc-autocomplete#patient_ids').setValue(option[1], option[0]);\n });\n if (document.querySelector('awc-autocomplete#mode_type_ids')) {\n document.querySelector('awc-autocomplete#mode_type_ids').clear();\n data.mode_type_ids.forEach((option) => {\n document.querySelector('awc-autocomplete#mode_type_ids').setValue(option[1], option[0]);\n });\n }\n if (document.querySelector('awc-autocomplete#therapists_ids')) {\n document.querySelector('awc-autocomplete#therapists_ids').clear();\n data.therapist_ids.forEach((option) => {\n document.querySelector('awc-autocomplete#therapists_ids').setValue(option[1], option[0]);\n });\n }\n window.loadedCalendarFilter = id;\n },\n error(xhr, status, error) {\n console.error('Request failed:', status, error);\n },\n });\n};\n\n// Update the quick filter buttons based on pinned filters and the active filter from the URL.\n// Ensures the active filter is shown first, even if it isn't pinned.\n//\n// @return {void}\nconst updateQuickButtons = () => {\n // Remove any existing quick-buttons container to ensure a fresh render\n document.getElementById('quick-buttons')?.remove();\n // Find the existing header toolbar\n const existingHeaderToolbar = document.querySelector('.fc-header-toolbar.fc-toolbar');\n if (!existingHeaderToolbar) return;\n // Create and insert the new quick-buttons container\n const quickButtonsContainer = document.createElement('div');\n quickButtonsContainer.id = 'quick-buttons';\n quickButtonsContainer.className = 'fc-header-toolbar fc-toolbar';\n existingHeaderToolbar.parentNode.insertBefore(quickButtonsContainer, existingHeaderToolbar.nextSibling);\n // Get the 'filter' parameter from the URL\n const urlParams = new URLSearchParams(window.location.search);\n const activeFilter = urlParams.get('filter'); // Get the filter UUID from the URL\n // Add the button wrapper\n quickButtonsContainer.innerHTML = `
`;\n const buttonWrapper = quickButtonsContainer.querySelector('.d-flex');\n if (!Array.isArray(window.calendarFiltersData)) return;\n // Get pinned filters\n let pinnedFilters = window.calendarFiltersData.filter(filter => filter.distinction === 'pinned');\n // Check if active filter exists in pinned list\n const activeFilterExists = pinnedFilters.some(filter => filter.id === activeFilter);\n // If active filter isn't pinned, find it and place it at the beginning\n if (activeFilter && !activeFilterExists) {\n const activeFilterObject = window.calendarFiltersData.find(filter => filter.id === activeFilter);\n if (activeFilterObject) {\n pinnedFilters = [activeFilterObject, ...pinnedFilters]; // Prepend active filter\n }\n }\n // Render buttons\n pinnedFilters.forEach(filter => {\n const isActive = filter.id === activeFilter;\n const button = document.createElement('button');\n button.type = 'button';\n button.className = `btn btn-sm ${isActive ? 'btn-primary pr-1' : 'btn-light'} m-0`;\n button.dataset.uuid = filter.id;\n button.dataset.active = isActive ? 'true' : 'false';\n button.dataset.default = filter.default;\n button.dataset.action = document.querySelector('admin-calendar') ? 'click->admin-calendar#filterEvents' : 'click->therapist-calendar#filterEvents';\n button.innerHTML = `\n \n ${filter.title.length > 30 ? filter.title.substring(0, 27) + '...' : filter.title}\n ${isActive ? \"\" : ''}\n `;\n buttonWrapper.appendChild(button);\n });\n};\nwindow.updateQuickButtons = updateQuickButtons;\n\n// Loads calendar filters via an AJAX request and updates the filter lists in the UI.\n// Assigns the method to the `window` object for global access.\n//\n// @return {void}\nconst loadCalendarFilters = () => {\n $('#filterMask').show();\n const urlParams = new URLSearchParams(window.location.search);\n let filterUrl = `${window.calendarSettings.filtersLink}?${urlParams.toString()}`;\n if (document.querySelector('admin-calendar')) {\n filterUrl += '&admin=true';\n }\n $.ajax({\n url: filterUrl,\n method: 'GET',\n dataType: 'json',\n success(data) {\n const filtersListPinned = $('#calendarFiltersPinnedFilters');\n const filtersListSaved = $('#calendarFiltersSavedFilters');\n const filtersListOther = $('#calendarFiltersTransientFilters');\n // Clear any existing items\n filtersListPinned.empty();\n filtersListSaved.empty();\n filtersListOther.empty();\n // Store the data in windows\n window.calendarFiltersData = data;\n // Loop through the data and create list items\n data.forEach((filter) => {\n if ((filter.admin && window.calendarSettings.isAdmin) || (!filter.admin && !window.calendarSettings.isAdmin)) {\n let distinctionIcon;\n if (filter.distinction === 'transient') {\n distinctionIcon = $('', { class: `filterIcon pr-1 bi bi-${filter.icon}` });\n } else if (filter.distinction === 'pinned') {\n distinctionIcon = $('', { class: `filterIcon pr-1 bi bi-${filter.icon}` });\n } else {\n distinctionIcon = $('', { class: `filterIcon pr-1 bi bi-${filter.icon}` });\n }\n const grippie = $('', { class: 'bi bi-three-dots-vertical grippie' });\n const listItem = $('
  • ', { class: 'saved-calendar-filter list-group-item py-1 pl-1 pr-2' }).attr('data-id', filter.id);\n if (filter.active) {\n listItem.addClass('bg-warning');\n }\n const filterSpan = $('', { class: 'loadFilter filter', text: filter.title, dataId: filter.id });\n const defaultIcon = $('', { class: filter.default ? 'bi bi-check-square' : 'bi bi-square' });\n const defaultLink = $('', {\n href: 'javascript:void(0);',\n class: 'defaultFilter',\n dataId: filter.id,\n }).append(defaultIcon);\n const deleteLink = $('', {\n href: 'javascript:void(0);',\n class: 'deleteFilter',\n dataId: filter.id,\n }).append($('', { class: 'bi bi-trash' }));\n listItem.prepend(distinctionIcon);\n listItem.prepend(grippie);\n if (filter.distinction === 'pinned') {\n listItem.append(filterSpan).append(deleteLink).append(defaultLink);\n filtersListPinned.append(listItem);\n } else if (filter.distinction === 'saved') {\n listItem.append(filterSpan).append(deleteLink).append(defaultLink);\n filtersListSaved.append(listItem);\n } else {\n listItem.append(filterSpan);\n filtersListOther.append(listItem);\n }\n }\n });\n // If there are no filters say so\n if (filtersListPinned.children().length === 0) {\n filtersListPinned.append('
  • No pinned filters
  • ');\n }\n if (filtersListSaved.children().length === 0) {\n filtersListSaved.append('
  • No saved filters
  • ');\n }\n if (filtersListOther.children().length === 0) {\n filtersListOther.append('
  • No unsaved filters
  • ');\n }\n $('#filterMask').hide();\n // Reload the loaded filter to make sure we have the right one.\n if (window.loadedCalendarFilter !== undefined) {\n loadCalendarFilterById(window.loadedCalendarFilter);\n }\n // Load quick buttons as defined in the calendar\n window.updateQuickButtons?.();\n },\n error(xhr, status, error) {\n console.error('Unable to load calendar filters:', status, error);\n $('#filterMask').hide();\n },\n });\n};\nwindow.loadCalendarFilters = loadCalendarFilters;\n\n// Prepares the UI for creating a new filter by clearing the form inputs.\n//\n// @param {Event} event - The event object triggering this action.\n// @return {void}\nconst newCalendarFilter = (event) => {\n event?.preventDefault();\n $('li.saved-calendar-filter').removeClass('bg-warning');\n $('#calendarFilterSaveFilter').prop('disabled', false);\n $('#calendar_filter_id').val('');\n $('#calendar_filter_title').val('');\n $('#calendar_filter_quick_button').prop('checked', false);\n document.querySelector('awc-autocomplete#patient_ids').clear();\n document.querySelector('awc-autocomplete#mode_type_ids').clear();\n if (document.querySelector('awc-autocomplete#therapists_ids')) {\n document.querySelector('awc-autocomplete#therapists_ids').clear();\n }\n};\n\n// Loads a calendar filter back into the form based on the event's data.\n//\n// @param {Event} event - The event object containing the filter ID.\n// @return {void}\nconst loadCalendarFilter = (event) => {\n event?.preventDefault();\n newCalendarFilter(event);\n const id = $(event.target).attr('dataid');\n if (id) {\n loadCalendarFilterById(id);\n }\n};\n\n// Deletes (demotes to transient) a filter via an AJAX request, after confirming with the user.\n//\n// @param {Event} event - The event object triggering this action.\n// @return {void}\nconst deleteCalendarFilter = (event) => {\n event?.preventDefault();\n $('#filterMask').show();\n const dUrl = window.calendarSettings?.deleteFilterLink;\n const eId = $(event.target).parent().attr('dataid');\n if (!dUrl || !eId || !window.confirm(\"You're about to remove this filters saved/pinned status. Are you sure?\")) {\n $('#filterMask').hide();\n return;\n }\n $.ajax({\n url: dUrl.replace('000', eId),\n method: 'POST',\n dataType: 'json',\n success(data) {\n loadCalendarFilters();\n newCalendarFilter();\n },\n error(xhr,status, error) {\n console.error('Request failed:', status, error);\n },\n });\n};\n\n// Sets a filter as default via an AJAX request, after confirming with the user.\n//\n// @param {Event} event - The event object triggering this action.\n// @return {void}\nconst defaultCalendarFilter = (event) => {\n event?.preventDefault();\n $('#filterMask').show();\n const dUrl = window.calendarSettings?.defaultFilterLink;\n const eId = $(event.target).parent().attr('dataid');\n if (!dUrl || !eId || !window.confirm(\"You're about to toggle this filters default state. Are you sure?\")) {\n $('#filterMask').hide();\n return;\n }\n $.ajax({\n url: dUrl.replace('000', eId),\n method: 'POST',\n dataType: 'json',\n success(data) {\n loadCalendarFilters();\n newCalendarFilter();\n },\n error(xhr,status, error) {\n console.error('Request failed:', status, error);\n },\n });\n};\n\n// Send the selected filter to the server so it can save it and then reload the UI with that filter selected\n//\n// @param {Event} event - The event object triggering this action.\n// @return {void}\nconst saveAndApplyCalendarFilter = (event) => {\n event?.preventDefault();\n // Get the form element\n const form = document.getElementById('caseload-new-form');\n // Check if the form is valid before proceeding\n if (!form.checkValidity()) {\n form.reportValidity();\n return;\n }\n $('#calendarFiltersSaveAndApplyFilter').prop('disabled', true);\n const saveUrl = window?.calendarSettings?.saveFilterLink;\n $.ajax({\n url: saveUrl,\n method: 'POST',\n dataType: 'json',\n data: $(form).serialize(),\n success(data) {\n const urlParams = new URLSearchParams(window.location.search);\n urlParams.delete('filter'); // Remove the \"filter\" param\n urlParams.set('filter', data.id); // Add or update the \"filter\" param\n const newUrl = `${window.location.pathname}?${urlParams.toString()}`;\n Turbolinks.visit(newUrl);\n },\n error(xhr, status, error) {\n // This happens because the filter is empty! So just refresh which is fine.\n const urlParams = new URLSearchParams(window.location.search);\n urlParams.delete('filter'); // Remove the \"filter\" param\n const newUrl = `${window.location.pathname}?${urlParams.toString()}`;\n Turbolinks.visit(newUrl);\n },\n });\n};\n\n// Update the filter's position on the server after a drag-and-drop change, then reload the calendar filters.\n//\n// @param {Object} ui - The jQuery UI object representing the moved filter.\n// @param {string} list - The list type ('transient' or other).\n// @return {void}\nconst saveFilterPositionChange = (ui, list) => {\n $('#filterMask').show();\n const filterItems = ui.item.parent().children('.saved-calendar-filter');\n const uuid = ui.item.data('id');\n const index = list === 'transient' ? 0 : filterItems.index(ui.item);\n let moveUrl = window?.calendarSettings?.moveFilterLink;\n moveUrl = moveUrl.replace('A', uuid).replace('B', index).replace('C', list);\n $.ajax({\n url: moveUrl,\n method: 'PATCH',\n dataType: 'json',\n success(data) {\n loadCalendarFilters();\n },\n error(xhr,status, error) {\n console.error('Request failed:', status, error);\n },\n });\n};\n\n// Show or hide empty drop zones in filter lists based on the provided state.\n// If showing, ensures each section has a placeholder if no filters exist.\n// If hiding, removes all drop zone placeholders.\n//\n// @param {boolean} show - Whether to show or hide the empty drop zones.\n// @param {string|null} src - The source list being modified ('pinned', 'saved', 'transient').\n// @return {void}\nconst showEmptyDropzones = (show, src = null) => {\n if (show) {\n const pinnedFilters = $('#calendarFiltersPinnedFilters li.saved-calendar-filter').length;\n if ((src !== 'pinned' && pinnedFilters === 0) || (src === 'pinned' && pinnedFilters === 1)) {\n $('#calendarFiltersPinnedFilters').append('
  • Pinned filters
  • ');\n }\n const savedFilters = $('#calendarFiltersSavedFilters li.saved-calendar-filter').length;\n if ((src !== 'saved' && savedFilters === 0) || (src === 'saved' && savedFilters === 1)) {\n $('#calendarFiltersSavedFilters').append('
  • Saved filters
  • ');\n }\n const otherFilters = $('#calendarFiltersOtherFilters li.saved-calendar-filter').length;\n if ((src !== 'transient' && otherFilters === 0) || (src === 'transient' && otherFilters === 1)) {\n $('#calendarFiltersOtherFilters').append('
  • Unsaved filter
  • ');\n }\n $('.filterListCard').addClass('no-overflow');\n $('.nofilters').addClass('hidden');\n } else {\n $('#calendarFiltersPinnedFilters .drop-zone').remove();\n $('#calendarFiltersSavedFilters .drop-zone').remove();\n $('#calendarFiltersOtherFilters .drop-zone').remove();\n $('.filterListCard').removeClass('no-overflow');\n $('.nofilters').removeClass('hidden');\n }\n};\n\n// Registers event listeners for various UI interactions related to filters and initializes the filters.\n//\n// @return {void}\nwindow.registerFilters = () => {\n const urlParams = new URLSearchParams(window.location.search);\n window.loadedCalendarFilter = urlParams.get('filter');\n loadCalendarFilters();\n $(document).off('.calendar');\n $(document).on('click.calendar', '#calendarFiltersSaveAndApplyFilter', saveAndApplyCalendarFilter);\n $(document).on('click.calendar', '#calendarFilterNewFilter', newCalendarFilter);\n $(document).on('click.calendar', 'span.loadFilter', loadCalendarFilter);\n $(document).on('click.calendar', 'a.deleteFilter', deleteCalendarFilter);\n $(document).on('click.calendar', 'a.defaultFilter', defaultCalendarFilter);\n $(document).on('click.calendar', '[data-bs-dismiss=\"modal\"]', function () {\n $(this).closest('.modal').modal('hide');\n });\n\n // If we are in the admin area, and we don't have a filter set then we need to pop the filter modal\n if (document.querySelector('admin-calendar') && window.loadedCalendarFilter == null) {\n $('.filter-required-warning').removeClass('hidden');\n $('#calendarFilters').modal('show');\n }\n\n // Below we hook up the dragging of filters to save or pin them.\n // From the transient filters to saved or pinned.\n $('#calendarFiltersTransientFilters').sortable({\n connectWith: '#calendarFiltersSavedFilters, #calendarFiltersPinnedFilters', // Can send items to Saved Filters\n revert: true, // Revert if dropped in the same list\n handle: '.grippie',\n placeholder: 'dragging',\n helper: 'clone',\n axis: 'y',\n opacity: 0.8,\n start(event, ui) {\n showEmptyDropzones(true, 'transient');\n ui.item.data('originalIndex', ui.item.index());\n },\n receive(event, ui) { // called when we are dropped on\n saveFilterPositionChange(ui, 'transient');\n },\n update(event, ui) {\n // do nothing.\n },\n stop(event, ui) {\n // If we are dragging/dropping fromtransient to transient, don't update.\n const originalIndex = ui.item.data('originalIndex');\n if (ui.item.parent().attr('id') === 'calendarFiltersTransientFilters') {\n $(this).sortable('cancel');\n const items = $(this).children();\n if (originalIndex >= 0 && originalIndex < items.length) {\n items.eq(originalIndex).before(ui.item);\n }\n }\n showEmptyDropzones(false);\n },\n });\n\n // From the saved filters to transient or pinned\n $('#calendarFiltersSavedFilters').sortable({\n connectWith: '#calendarFiltersTransientFilters, #calendarFiltersPinnedFilters',\n revert: false,\n handle: '.grippie',\n placeholder: 'dragging',\n axis: 'y',\n opacity: 0.8,\n start(event, ui) {\n showEmptyDropzones(true,'saved');\n },\n receive(event, ui) { // called when we are dropped on\n saveFilterPositionChange(ui, 'saved');\n },\n update(event, ui) { // called when we reorder within same list\n saveFilterPositionChange(ui, 'saved');\n },\n stop(event, ui) {\n showEmptyDropzones(false);\n },\n });\n\n // From the pinned filters to transient or saved\n $('#calendarFiltersPinnedFilters').sortable({\n connectWith: '#calendarFiltersTransientFilters, #calendarFiltersSavedFilters',\n revert: false,\n handle: '.grippie',\n placeholder: 'dragging',\n axis: 'y',\n opacity: 0.8,\n start(event, ui) {\n showEmptyDropzones(true,'pinned');\n },\n receive(event, ui) { // called when we are dropped on\n saveFilterPositionChange(ui, 'pinned');\n },\n update(event, ui) { // called when we reorder within same list\n saveFilterPositionChange(ui, 'pinned');\n },\n stop(event, ui) {\n showEmptyDropzones(false);\n },\n });\n};\n"],"sourceRoot":""}