{"version":3,"sources":["webpack:///./app/javascript/schedules/controllers/skd_event_form_controller.ts"],"names":["EventType","rrule","a","useResetForm","this","allDayEnabledValue","toggleAllDayFields","target","value","durationContainerTarget","toggleAttribute","allDayModeCheckboxTarget","checked","startTimeTimeContainerTarget","endTimeDateContainerTarget","untilDatePickerTarget","required","event","datefield","HTMLInputElement","dayjs","isAfter","toString","sameDay","startTimeValue","isSame","updateTypeModal","setAttribute","b","detail","getAttribute","isEqual","parseJSON","submitter","cancel","element","id","$","modal","updateType","targetId","input","document","createElement","type","name","append","requestSubmit","hasSubmitBtnTarget","submitBtnTarget","disabled","nextFrame","formTypeValue","timezoneContainerTarget","removeAttribute","getElementById","message","numberOfIssues","issuesCount","issuesCountTarget","textContent","authorizationWarningMessageTarget","innerHTML","authorizationWarningTarget","classList","remove","add","closeAuthorizationWarning","cancelEventCreationTarget","click","addAuthorizationCheck","formData","FormData","eventFormTarget","cleanFormData","removeEmptyKey","get","Therapy","authorizationCheckerTarget","stopPropagation","preventDefault","checkValidity","checkAuthorizationValidation","makeRequest","authorizationVerificationUrlValue","data","valid","showAuthorizationWarning","authorization_issues","join","length","removeAuthorizationCheck","src","axios","post","headers","accept","credentials","dispatch","bubbles","key","newFormData","entries","formKey","trim","Controller","values","startTime","String","allDayEnabled","Boolean","authorizationVerificationUrl","formType","default","targets"],"mappings":"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","file":"js/88-b6f2974506bdd622a4cd.chunk.js","sourcesContent":["import { Controller } from '@hotwired/stimulus';\nimport dayjs from 'lib/dayjs';\nimport { cancel } from 'helpers/dom-helper';\nimport { nextFrame } from 'helpers/timing';\nimport isEqual from 'lodash.isequal';\nimport useResetForm from 'stimulus-hooks/use-reset-form';\nimport type AwcAutocompleteElement from '@ambiki/impulse-view-components/dist/elements/autocomplete';\nimport axios from 'axios';\nimport { parseJSON } from 'helpers/string';\n\nenum EventType {\n Therapy = '75957118-d9d3-422d-913c-2cdde72062d8',\n}\n\nexport default class extends Controller {\n static values = {\n startTime: String,\n allDayEnabled: Boolean,\n authorizationVerificationUrl: String,\n formType: {\n default: 'events-new-form',\n type: String,\n },\n };\n\n static targets = [\n 'allDayModeCheckbox',\n 'durationContainer',\n 'startTimeTimeContainer',\n 'endTimeDateContainer',\n 'timezoneContainer',\n 'whenDatePicker',\n 'untilDatePicker',\n 'submitBtn',\n 'rruleSelect',\n 'authorizationWarning',\n 'cancelEventCreation',\n 'authorizationChecker',\n 'authorizationWarningMessage',\n 'eventForm',\n 'issuesCount',\n ];\n\n rrule = '';\n\n async connect() {\n useResetForm(this);\n if (this.allDayEnabledValue) {\n this.toggleAllDayFields();\n }\n }\n\n // Store selected element's rrule value.\n rruleSelectTargetConnected(target: AwcAutocompleteElement) {\n this.rrule = target.value;\n }\n\n // Clear rrule if select is removed from the DOM.\n rruleSelectTargetDisconnected() {\n this.rrule = '';\n }\n\n toggleAllDayFields(): void {\n this.durationContainerTarget.toggleAttribute('hidden', this.allDayModeCheckboxTarget.checked);\n this.startTimeTimeContainerTarget.toggleAttribute('hidden', this.allDayModeCheckboxTarget.checked);\n this.endTimeDateContainerTarget.toggleAttribute('hidden', !this.allDayModeCheckboxTarget.checked);\n this.untilDatePickerTarget.required = this.allDayModeCheckboxTarget.checked;\n }\n\n updateEndDatePicker(event: Event) {\n const datefield = event.target;\n if (!(datefield instanceof HTMLInputElement)) return;\n\n if (dayjs(datefield.value).isAfter(dayjs(this.untilDatePickerTarget.value))) {\n this.untilDatePickerTarget.value = datefield.value.toString();\n }\n }\n\n startDateChange(event: Event) {\n const datefield = event.target;\n if (!(datefield instanceof HTMLInputElement)) return;\n const sameDay = dayjs(this.startTimeValue).isSame(dayjs(datefield.value), 'day');\n // Set an attribute so that we can listen to changes on the `skd_event_update_type_controller.ts`\n // If day changes, we need to hide the 'All events in the series' update type.\n this.updateTypeModal?.setAttribute('data-skd-event-update-type-same-day-value', sameDay.toString());\n }\n\n rruleChange(event: CustomEvent<{ target: HTMLElement }>) {\n const { target } = event.detail;\n const value = target.getAttribute('value') || '';\n\n const isSame = isRRuleEqual(value, this.rrule);\n this.updateTypeModal?.setAttribute('data-skd-event-update-type-same-rrule-value', isSame.toString());\n }\n\n showUpdateTypeModal(event: SubmitEvent) {\n if (!event.submitter) return; // If we submit programmatically, then do nothing\n\n cancel(event);\n if (!this.updateTypeModal) return;\n\n this.updateTypeModal.setAttribute('data-form-id', this.element.id);\n $(this.updateTypeModal).modal('show');\n }\n\n requestSubmit(event: CustomEvent) {\n const { updateType, targetId } = event.detail;\n if (targetId !== this.element.id) return;\n\n const input = document.createElement('input');\n input.type = 'hidden';\n input.name = 'event[update_type]';\n input.value = updateType;\n this.element.append(input);\n\n this.element.requestSubmit();\n }\n\n enableSubmitBtn() {\n if (this.hasSubmitBtnTarget) {\n this.submitBtnTarget.disabled = false;\n }\n }\n\n disableSubmitBtn() {\n if (this.hasSubmitBtnTarget) {\n this.submitBtnTarget.disabled = true;\n }\n }\n\n async resetForm() {\n await nextFrame();\n if (this.allDayEnabledValue) this.toggleAllDayFields();\n if (this.formTypeValue === 'events-new-form') {\n this.timezoneContainerTarget.setAttribute('data-reveal-index-value', '1'); // hide timezone container and show \"View time zone\" button\n }\n this.updateTypeModal?.removeAttribute('data-skd-event-update-type-same-rrule-value');\n }\n\n // eslint-disable-next-line class-methods-use-this\n private get updateTypeModal() {\n return document.getElementById('update-type-event');\n }\n\n showAuthorizationWarning(message: string, numberOfIssues: number) {\n const issuesCount = `${numberOfIssues} Authorization ${numberOfIssues > 1 ? 'issues' : 'issue'} found`;\n this.issuesCountTarget.textContent = issuesCount;\n this.authorizationWarningMessageTarget.innerHTML = message;\n this.authorizationWarningTarget.classList.remove('d-none');\n this.authorizationWarningTarget.classList.add('d-block');\n }\n\n closeAuthorizationWarning() {\n this.authorizationWarningTarget.classList.remove('d-block');\n this.authorizationWarningTarget.classList.add('d-none');\n }\n\n cancelAuthorizationWarning() {\n this.closeAuthorizationWarning();\n if (this.formTypeValue === 'events-new-form') {\n this.cancelEventCreationTarget.click();\n }\n }\n\n continueSave() {\n this.addAuthorizationCheck();\n this.closeAuthorizationWarning();\n this.submitBtnTarget.click();\n }\n\n async verifyAuthorization(event: SubmitEvent) {\n const formData = new FormData(this.eventFormTarget);\n const cleanFormData = this.removeEmptyKey(formData, 'event[type_id]'); // sometimes we get duplicate keys for event[type_id].\n\n // check if the authorization checker has been disabled or if its not a therapy event!\n if (cleanFormData.get('event[type_id]') === EventType.Therapy && !this.authorizationCheckerTarget.checked) {\n event.stopPropagation();\n event.preventDefault();\n }\n\n if (this.eventFormTarget.checkValidity() && cleanFormData.get('event[type_id]') === EventType.Therapy) {\n if (!this.authorizationCheckerTarget.checked) {\n await this.checkAuthorizationValidation(formData);\n }\n }\n }\n\n async checkAuthorizationValidation(formData: FormData) {\n const data = await this.makeRequest(this.authorizationVerificationUrlValue, formData);\n\n if (data?.valid) {\n this.addAuthorizationCheck();\n this.submitBtnTarget.click();\n } else {\n this.showAuthorizationWarning(data.authorization_issues.join(' '), data.authorization_issues.length);\n this.removeAuthorizationCheck();\n }\n }\n\n // eslint-disable-next-line consistent-return\n private async makeRequest(src: string, formData: FormData) {\n formData.delete('_method');\n try {\n const { data } = await axios.post(src, formData, {\n headers: {\n accept: 'application/json',\n credentials: 'same-origin',\n 'Content-Type': 'multipart/form-data',\n },\n });\n\n this.dispatch('success', { bubbles: true });\n return data;\n } catch (error) {\n this.dispatch('error', { bubbles: true });\n }\n }\n\n removeEmptyKey(formData: FormData, key: string) {\n // Create a new FormData object to store the filtered data\n const newFormData = new FormData();\n\n // Iterate over the entries in the original FormData object\n for (const [formKey, value] of formData.entries()) {\n // Only append to new FormData if it's not the specified key with an empty value\n if (formKey !== key || (formKey === key && value.trim() !== '')) {\n newFormData.append(formKey, value);\n }\n }\n\n return newFormData;\n }\n\n removeAuthorizationCheck() {\n this.authorizationCheckerTarget.removeAttribute('checked');\n }\n\n addAuthorizationCheck() {\n this.authorizationCheckerTarget.setAttribute('checked', '1');\n }\n\n declare readonly startTimeValue: string;\n declare readonly authorizationVerificationUrlValue: string;\n declare readonly allDayEnabledValue: boolean;\n declare readonly allDayModeCheckboxTarget: HTMLInputElement;\n declare readonly startTimeTimeContainerTarget: HTMLElement;\n declare readonly endTimeDateContainerTarget: HTMLElement;\n declare readonly durationContainerTarget: HTMLElement;\n declare readonly timezoneContainerTarget: HTMLElement;\n declare readonly whenDatePickerTarget: HTMLInputElement;\n declare readonly untilDatePickerTarget: HTMLInputElement;\n declare readonly submitBtnTarget: HTMLInputElement;\n declare readonly hasSubmitBtnTarget: boolean;\n declare readonly authorizationWarningTarget: HTMLElement;\n declare readonly cancelEventCreationTarget: HTMLElement;\n declare readonly authorizationCheckerTarget: HTMLInputElement;\n declare readonly authorizationWarningMessageTarget: HTMLElement;\n declare readonly eventFormTarget: HTMLFormElement;\n declare readonly issuesCountTarget: HTMLElement;\n declare readonly formTypeValue: string;\n}\n\nfunction isRRuleEqual(a: string, b: string) {\n return isEqual(parseJSON(a, a), parseJSON(b, b));\n}\n"],"sourceRoot":""}