{"version":3,"file":"admin-CrQATHUT.js","sources":["../../../app/frontend/scripts/index.js","../../../app/frontend/scripts/scroll.js","../../../app/frontend/alpine/auto-complete.js","../../../app/frontend/alpine/auto-flag.js","../../../app/frontend/alpine/auto-update.js","../../../app/frontend/alpine/before-unload.js","../../../app/frontend/alpine/clipboard.js","../../../app/frontend/alpine/combobox.js","../../../app/frontend/alpine/dropdown.js","../../../app/frontend/alpine/file-upload.js","../../../node_modules/sortablejs/modular/sortable.esm.js","../../../app/frontend/alpine/form-builder.js","../../../app/frontend/alpine/google-maps-admin.js","../../../app/frontend/scripts/trap-focus.js","../../../app/frontend/alpine/modal.js","../../../app/frontend/alpine/moderation-filters.js","../../../app/frontend/alpine/moderation-mail-templates.js","../../../app/frontend/alpine/organization-settings.js","../../../app/frontend/alpine/project-path.js","../../../app/frontend/alpine/project-settings.js","../../../app/frontend/alpine/sidebar.js","../../../app/frontend/alpine/sortable-list.js","../../../app/frontend/alpine/sortable-homepage.js","../../../app/frontend/alpine/settings-wizard.js","../../../app/frontend/entrypoints/admin.js"],"sourcesContent":["// Helpers functions are used inside .js.haml files\n\nexport function replaceContent(query, content) {\n const el = document.querySelector(query);\n if (el) el.outerHTML = content;\n}\n\nexport function closeModal(id) {\n const modal = document.querySelector(id);\n const closeEvent = new Event('close');\n modal.dispatchEvent(closeEvent);\n}\n\n// Attach all function to window\nwindow.bpart = {};\nwindow.bpart.closeModal = closeModal;\nwindow.bpart.replaceContent = replaceContent;\n","const scrollBehavior = {\n behavior: 'smooth',\n block: 'end',\n inline: 'nearest',\n};\n\nexport function scrollIntoViewIfNeeded(element) {\n if (checkInView(element)) return;\n\n element.scrollIntoView(scrollBehavior);\n}\n\nexport const scrollToInvalid = () => {\n const firstInvalidElement = document.querySelector('.input--invalid');\n if (firstInvalidElement) firstInvalidElement.scrollIntoView(scrollBehavior);\n};\n\nfunction checkInView(element) {\n // This heavily relies on the element to check being nested inside main\n // and main being the parent in which scrolling happens)\n const container = document.querySelector('main');\n const containerBox = container.getBoundingClientRect();\n\n const elementBox = element.getBoundingClientRect();\n\n const inView = containerBox.bottom > elementBox.bottom;\n return inView;\n}\n","import { scrollIntoViewIfNeeded } from '~/scripts/scroll';\n\nexport default function autocomplete({\n activeClass = 'autocomplete__option--active',\n selectedClass = 'autocomplete__option--selected',\n} = {}) {\n return {\n expanded: false,\n query: '',\n options: [],\n groups: [],\n activeIndex: -1,\n selectedIndex: -1,\n activeClasses: Array.isArray(activeClass) ? activeClass : [activeClass],\n selectedClasses: Array.isArray(selectedClass) ? selectedClass : [selectedClass],\n\n init() {\n const value = this.$refs.field.value;\n\n // Style element based on selectedIndex and activeIndex\n // We need to setup these watchers before initializing the options\n this.$watch('activeIndex', (index, oldIndex) => {\n this.options[oldIndex]?.classList.remove(...this.activeClasses);\n this.options[index]?.classList.add(...this.activeClasses);\n });\n this.$watch('selectedIndex', (index, oldIndex) => {\n this.options[oldIndex]?.classList.remove(...this.selectedClasses);\n this.options[index]?.classList.add(...this.selectedClasses);\n let newValue = this.options[index].getAttribute('data-autocomplete-value');\n if (newValue === 'new') {\n let newOption = document.createElement('option');\n newValue = this.query;\n newOption.value = newValue;\n this.$refs.field.appendChild(newOption);\n }\n this.$refs.field.value = newValue;\n });\n\n // Find all options and add event listeners\n this.options = this.$el.querySelectorAll('[role=\"option\"]');\n this.groups = this.$el.querySelectorAll('[role=\"optgroup\"]');\n this.options.forEach((option, index) => {\n option.addEventListener('mouseover', () => (this.activeIndex = index));\n option.addEventListener('mouseout', () => (this.activeIndex = -1));\n option.addEventListener('click', () => this.setSelectedOption());\n if (option.getAttribute('data-autocomplete-value') === value) this.selectedIndex = index;\n });\n\n // Reset the activeElement when collapsing\n this.$watch('expanded', () => !this.expanded && (this.activeIndex = -1));\n\n // Make sure options are in view when opened\n this.$watch('expanded', () => {\n if (this.expanded) {\n this.$nextTick(() => scrollIntoViewIfNeeded(this.$root.querySelector(\"[x-bind='target']\")));\n }\n });\n\n // Filter options based on\n this.$watch('query', () => this.filterOptions());\n\n // Hide the fallback field\n this.$refs.field.hidden = true;\n },\n\n setSelectedOption() {\n if (this.activeIndex !== -1) this.selectedIndex = this.activeIndex;\n this.expanded = !this.expanded;\n },\n\n filterOptions() {\n this.options.forEach(\n (o) =>\n (o.hidden =\n !(this.query.length === 0 || o.getAttribute('data-autocomplete-value') === 'new') &&\n o.textContent.trim().toLowerCase().indexOf(this.query.toLowerCase()) === -1)\n );\n this.groups.forEach((g) => (g.hidden = g.querySelectorAll('[role=\"option\"]:not([hidden])').length === 0));\n },\n\n findNextActive(dir) {\n const up = dir === 'up';\n if (!this.expanded) this.expanded = true;\n let newIndex = this.activeIndex;\n do {\n newIndex += up ? -1 : 1;\n // Break out of loop if there is no next visible option\n if ((up && newIndex === -1) || newIndex === this.options.length) return;\n } while (this.options[newIndex].hidden || this.options.disabled);\n this.activeIndex = newIndex;\n },\n\n get displayValue() {\n if (this.expanded) return this.query;\n\n const selectedOption = this.options[this.selectedIndex];\n return selectedOption ? selectedOption.textContent : '';\n },\n\n trigger: {\n ['@click']() {\n this.expanded = true;\n },\n ['@keyup.esc.prevent.stop']() {\n this.expanded = false;\n },\n ['@keyup.enter.prevent.stop']() {\n this.setSelectedOption();\n },\n ['@keyup.arrow-up.prevent']() {\n this.findNextActive('up');\n },\n ['@keyup.arrow-down.prevent']() {\n this.findNextActive('down');\n },\n ['@input']($event) {\n this.expanded = true;\n this.query = $event.target.value;\n },\n },\n\n target: {\n ['x-show']() {\n return this.expanded;\n },\n ['x-transition:enter']() {\n return 'transition ease-out duration-100';\n },\n ['x-transition:enter-start']() {\n return 'transform opacity-0 scale-95';\n },\n ['x-transition:enter-end']() {\n return 'transform opacity-100 scale-100';\n },\n ['x-transition:leave']() {\n return 'transition ease-in duration-75';\n },\n ['x-transition:leave-start']() {\n return 'transform opacity-100 scale-100';\n },\n ['x-transition:leave-end']() {\n return 'transform opacity-0 scale-95';\n },\n },\n };\n}\n","export default function autoFlag(name, url) {\n return {\n name,\n url,\n\n init() {\n this.$el.addEventListener(\"change\", () => this.handleChange());\n },\n\n handleChange() {\n const body = { flags: {} };\n body.flags[this.name] = this.$root.checked;\n\n const token = document.querySelector('meta[name=csrf-token]')?.getAttribute('content');\n const request = new Request(this.url, {\n method: 'PATCH',\n headers: {\n 'content-type': 'application/json',\n 'X-CSRF-Token': token,\n },\n body: JSON.stringify(body),\n })\n fetch(request)\n }\n }\n}\n","export default function autoUpdate(name, url) {\n return {\n name,\n url,\n\n init() {\n this.$el.addEventListener(\"change\", () => this.handleChange());\n },\n\n handleChange() {\n const body = { values: {} };\n body.values[this.name] = this.$root.value;\n const token = document.querySelector('meta[name=csrf-token]')?.getAttribute('content');\n const request = new Request(this.url, {\n method: 'PATCH',\n headers: {\n 'content-type': 'application/json',\n 'X-CSRF-Token': token,\n },\n body: JSON.stringify(body),\n })\n fetch(request)\n }\n }\n}\n","import { translate } from '~/scripts/locales/translations';\n\nexport default function beforeUnload() {\n return {\n unsavedChanges: false,\n\n init() {\n this.$el.addEventListener('tinymcechange', () => this.setBeforeUnload());\n this.beforeUnloadHandler = this.beforeUnloadHandler.bind(this);\n },\n\n beforeUnloadHandler(event) {\n if (!this.unsavedChanges) return;\n\n if (event.type == 'beforeunload') {\n event.preventDefault();\n } else {\n const discardUnsavedChangesMsg = translate('before-unload', 'warning-message', document.documentElement.lang);\n\n if (window.confirm(discardUnsavedChangesMsg)) {\n this.unsavedChanges = false;\n } else {\n event.preventDefault();\n }\n }\n },\n\n // 'closeModal' is a custom event fired by the modal component\n setBeforeUnload() {\n if (this.unsavedChanges) return;\n this.unsavedChanges = true;\n window.addEventListener('beforeunload', this.beforeUnloadHandler);\n window.addEventListener('turbo:before-visit', this.beforeUnloadHandler);\n window.addEventListener('closeModal', this.beforeUnloadHandler);\n },\n\n unsetBeforeUnload() {\n this.unsavedChanges = false;\n window.removeEventListener('beforeunload', this.beforeUnloadHandler);\n window.removeEventListener('turbo:before-visit', this.beforeUnloadHandler);\n window.removeEventListener('closeModal', this.beforeUnloadHandler);\n },\n\n form: {\n ['x-on:input']() {\n this.setBeforeUnload();\n },\n ['x-on:submit']() {\n this.unsetBeforeUnload();\n },\n },\n\n googleMaps: {\n ['x-on:click']() {\n this.setBeforeUnload();\n },\n },\n };\n}\n","export default function clipboard(url) {\n return {\n url,\n showSuccess: false,\n showError: false,\n \n handleClick() {\n try {\n window.navigator.clipboard.writeText(this.url)\n this.showSuccess = true;\n setTimeout(() => this.showSuccess = false, 1500)\n } catch {\n this.showError = true;\n setTimeout(() => this.showError = false, 1500)\n }\n }\n }\n}\n","// NOTE(Robbe): This file shares a lot of similarities with the autocomplete component\n// It might be a good idea to have them share the underlying logic instead of duplicating the code\n\nimport { scrollIntoViewIfNeeded } from '~/scripts/scroll';\n\nexport default function combobox({\n activeClass = 'combobox__option--active',\n selectedClass = 'combobox__option--selected',\n} = {}) {\n return {\n expanded: false,\n query: '',\n options: [],\n groups: [],\n activeIndex: -1,\n selectedIndexes: [],\n selectedValues: [],\n activeClasses: Array.isArray(activeClass) ? activeClass : [activeClass],\n selectedClasses: Array.isArray(selectedClass) ? selectedClass : [selectedClass],\n\n init() {\n // Fill selectedValues from fallback select\n [...this.$refs.field.selectedOptions].forEach((opt) => this.selectedValues.push(opt.value));\n\n // Style element based on selectedIndex and activeIndex\n // We need to setup these watchers before initializing the options\n this.$watch('activeIndex', (index, oldIndex) => {\n this.options[oldIndex]?.classList.remove(...this.activeClasses);\n this.options[index]?.classList.add(...this.activeClasses);\n });\n this.$watch('selectedIndexes', (indexes, oldIndexes) => {\n oldIndexes.forEach((oldIndex) => this.options[oldIndex]?.classList.remove(...this.selectedClasses));\n indexes.forEach((index) => this.options[index]?.classList.add(...this.selectedClasses));\n });\n\n // Find all options and add event listeners\n this.options = this.$el.querySelectorAll('[role=\"option\"]');\n this.groups = this.$el.querySelectorAll('[role=\"optgroup\"]');\n this.options.forEach((option, index) => {\n option.addEventListener('mouseover', () => (this.activeIndex = index));\n option.addEventListener('mouseout', () => (this.activeIndex = -1));\n option.addEventListener('click', () => this.toggleSelectedOption());\n if (this.selectedValues.includes(option.getAttribute('data-combobox-value'))) this.selectedIndexes.push(index);\n });\n\n // Reset the activeElement when collapsing\n this.$watch('expanded', () => !this.expanded && (this.activeIndex = -1));\n\n // Make sure options are in view after opening\n this.$watch('expanded', () => {\n if (this.expanded) {\n this.$nextTick(() => scrollIntoViewIfNeeded(this.$root.querySelector(\"[x-bind='target']\")));\n }\n });\n\n // Filter options based on\n this.$watch('query', () => this.filterOptions());\n\n // Hide the fallback field\n this.$refs.field.hidden = true;\n },\n\n toggleSelectedOption() {\n if (this.activeIndex !== -1) {\n this.selectedIndexes.includes(this.activeIndex) ? this.removeSelectedOption() : this.addSelectedOption();\n } else {\n this.addSelectedOption();\n }\n\n this.expanded = !this.expanded;\n },\n\n addSelectedOption() {\n // Don't add duplicate values\n if (this.selectedValues.includes(this.query)) {\n this.resetQuery();\n return;\n }\n\n let newValue = Array.from(this.options).at(this.activeIndex).getAttribute('data-combobox-value');\n\n if (newValue === 'new') {\n // Don't add empty values\n if (!!!this.query) return;\n // if new value, create an option in fallback and mark it as selected\n let newOption = document.createElement('option');\n newValue = this.query;\n newOption.value = newValue;\n newOption.setAttribute('selected', 'selected');\n this.$refs.field.appendChild(newOption);\n } else {\n // if existing value, find the option and mark it as selected\n this.selectedIndexes.push(this.activeIndex);\n this.$refs.field.querySelector(`[value=\"${newValue}\"]`).setAttribute('selected', 'selected');\n }\n // Add value to list\n this.selectedValues.push(newValue);\n\n this.resetQuery();\n\n this.$dispatch('combobox-selection-changed');\n },\n\n resetQuery() {\n this.query = '';\n this.$refs.input.value = '';\n },\n\n removeSelectedOption(value = null) {\n // If we pass a value, get the index in the options list of that value\n if (value) this.activeIndex = [...this.options].findIndex((o) => o.value === value);\n\n // Remove from list of selectedIndexes\n const index = this.selectedIndexes.findIndex((opt) => opt === this.activeIndex);\n if (index !== -1) this.selectedIndexes.splice(index, 1);\n\n // Find value of option if not present\n if (!value) value = this.options[this.activeIndex].getAttribute('data-combobox-value');\n\n // Deselect option\n this.$refs.field.querySelector(`[value=\"${value}\"]`).removeAttribute('selected');\n\n // Remove option from list of selectedValues\n const valueIndex = this.selectedValues.findIndex((v) => v === value);\n if (valueIndex !== -1) this.selectedValues.splice(valueIndex, 1);\n\n this.$dispatch('combobox-selection-changed');\n },\n\n filterOptions() {\n this.options.forEach(\n (o) =>\n (o.hidden =\n !(this.query.length === 0 || o.getAttribute('data-combobox-value') === 'new') &&\n o.textContent.trim().toLowerCase().indexOf(this.query.toLowerCase()) === -1)\n );\n this.groups.forEach((g) => (g.hidden = g.querySelectorAll('[role=\"option\"]:not([hidden])').length === 0));\n },\n\n findNextActive(dir) {\n const up = dir === 'up';\n if (!this.expanded) this.expanded = true;\n let newIndex = this.activeIndex;\n do {\n newIndex += up ? -1 : 1;\n // Break out of loop if there is no next visible option\n if ((up && newIndex === -1) || newIndex === this.options.length) return;\n } while (this.options[newIndex].hidden || this.options.disabled);\n this.activeIndex = newIndex;\n },\n\n trigger: {\n ['@keyup.backspace.prevent.stop']() {\n if (this.selectedValues.length > 0) this.removeSelectedOption(this.selectedValues.at(-1));\n },\n ['@keyup.esc.prevent.stop']() {\n this.expanded = false;\n },\n ['@keydown.enter.prevent.stop']() {\n this.toggleSelectedOption();\n },\n ['@keyup.arrow-up.prevent']() {\n this.findNextActive('up');\n },\n ['@keyup.arrow-down.prevent']() {\n this.findNextActive('down');\n },\n ['@input']($event) {\n this.expanded = true;\n this.query = $event.target.value.trim();\n },\n },\n\n target: {\n ['x-show']() {\n return this.expanded;\n },\n ['x-transition:enter']() {\n return 'transition ease-out duration-100';\n },\n ['x-transition:enter-start']() {\n return 'transform opacity-0 scale-95';\n },\n ['x-transition:enter-end']() {\n return 'transform opacity-100 scale-100';\n },\n ['x-transition:leave']() {\n return 'transition ease-in duration-75';\n },\n ['x-transition:leave-start']() {\n return 'transform opacity-100 scale-100';\n },\n ['x-transition:leave-end']() {\n return 'transform opacity-0 scale-95';\n },\n },\n };\n}\n"," export default function dropdown({ activeClass = 'dropdown__item--active' } = {}) {\n return {\n expanded: false,\n activeIndex: -1,\n activeClasses: Array.isArray(activeClass) ? activeClass : [activeClass],\n\n init() {\n this.items = this.$el.querySelectorAll('[role=\"menuitem\"]');\n this.items.forEach((item, index) => {\n item.addEventListener('mouseover', () => (this.activeIndex = index));\n item.addEventListener('mouseout', () => (this.activeIndex = -1));\n });\n this.$watch('expanded', () => !this.expanded && (this.activeIndex = -1));\n this.$watch('activeIndex', (index, oldIndex) => {\n this.items[oldIndex]?.classList.remove(...this.activeClasses);\n this.items[index]?.classList.add(...this.activeClasses);\n });\n },\n\n searchMatch(searchTerm, word) {\n if (searchTerm.replace(/\\s/g, '') == '') return true;\n return word.toLowerCase().includes(searchTerm.toLowerCase());\n },\n\n trigger: {\n ['@click']() {\n this.expanded = !this.expanded;\n if (this.expanded) this.$refs.input?.focus();\n if (!this.expanded) this.$refs.input?.blur();\n },\n ['@keyup.arrow-up.prevent']() {\n if (!this.expanded) this.expanded = true;\n this.activeIndex !== 0 &&\n (this.activeIndex = this.activeIndex === -1 ? this.items.length - 1 : this.activeIndex - 1);\n },\n ['@keyup.arrow-down.prevent']() {\n if (!this.expanded) this.expanded = true;\n this.activeIndex !== this.items.length - 1 && this.activeIndex++;\n },\n ['@focusout']() {\n // We need to make sure a click inside the dropdown is followed before we collapse the dropdown\n setTimeout(() => (this.expanded = false), 500);\n },\n },\n\n target: {\n ['x-show']() {\n return this.expanded;\n },\n ['@keyup.arrow-up.prevent']() {\n this.activeIndex !== 0 && (this.activeIndex === -1 ? this.items.length - 1 : this.activeIndex - 1);\n },\n ['@keyup.arrow-down.prevent']() {\n this.activeIndex !== this.items.length - 1 && this.activeIndex++;\n },\n ['x-transition:enter']() {\n return 'transition ease-out duration-100';\n },\n ['x-transition:enter-start']() {\n return 'transform opacity-0 scale-95';\n },\n ['x-transition:enter-end']() {\n return 'transform opacity-100 scale-100';\n },\n ['x-transition:leave']() {\n return 'transition ease-in duration-75';\n },\n ['x-transition:leave-start']() {\n return 'transform opacity-100 scale-100';\n },\n ['x-transition:leave-end']() {\n return 'transform opacity-0 scale-95';\n },\n },\n };\n}\n","import ImageBlobReduce from 'image-blob-reduce';\n\n// utils\nimport fireSwal from '~/scripts/fire-swal';\nimport { translate } from '~/scripts/locales/translations';\n\nconst MAX_IMAGE_SIZE = 10485760; // 10 MB\nconst MAX_IMAGE_DIMENSION = 1600; // px\n\nconst reduce = new ImageBlobReduce();\nconst locale = document.querySelector('html').getAttribute('lang');\n\nexport default function fileUpload({ filename, fileExists }) {\n return {\n filename: filename || translate('img-resize', 'no-file-selected', locale),\n open: false,\n image_url: null,\n fileExists: fileExists == 'true',\n showPlaceholder: fileExists != 'true',\n\n async handleImageURL(url) {\n const preview = this.$refs.preview;\n const filename = String(this.image_url).split('/').pop();\n const fileExtension = filename.split('.').pop();\n const videoExtensions = ['mp4', 'mov', 'avi', 'wmf', 'flv', 'webm'];\n const errorElement = document.getElementById('file-input__error-message');\n const inputField = document.getElementById(url);\n\n if (this.image_url) {\n const re = new RegExp('^https*://', 'i');\n if (re.test(this.image_url)) {\n if (videoExtensions.includes(fileExtension)) {\n if (preview) {\n preview.src =\n '/assets/file_icons/video-27171972abad8c900fcd039956ad4816c8d6e4f15e3b9a4e023832356e9c40e2.png';\n preview.classList.remove('image-upload__preview');\n }\n } else {\n if (preview) {\n preview.src = this.image_url;\n if (!preview.classList.contains('image-upload__preview')) {\n preview.classList.add('image-upload__preview');\n }\n }\n }\n this.filename = filename;\n this.open = false;\n this.showPlaceholder = false;\n const input = this.$refs.input;\n input.value = null;\n } else {\n errorElement.innerHTML = translate('img-upload', 'error-message', locale);\n inputField.classList.add('border-red-600');\n }\n }\n },\n\n handleInput() {\n const preview = this.$refs.preview;\n const input = this.$refs.input;\n const file = input.files[0];\n\n if (file) {\n if (file.type.includes('image')) {\n fireSwal.loading({ title: translate('img-resize', 'analyzing', locale) });\n if (file.size > MAX_IMAGE_SIZE) {\n fireSwal.error({\n title: translate('img-resize', 'size-too-large__title', locale),\n text: translate('img-resize', 'size-too-large__text', locale),\n });\n input.value = null;\n return;\n } else if (file.name.includes('`')) {\n fireSwal.error({\n title: translate('img-resize', 'no-backtick-allowed__title', locale),\n text: translate('img-resize', 'no-backtick-allowed__text', locale),\n });\n input.value = null;\n return;\n }\n } else {\n if (preview)\n preview.src =\n '/assets/file_icons/video-27171972abad8c900fcd039956ad4816c8d6e4f15e3b9a4e023832356e9c40e2.png';\n this.filename = file.name;\n this.open = false;\n return;\n }\n\n const img = new Image();\n const reader = new FileReader();\n reader.readAsDataURL(file);\n\n // we wait for the reader to load the file\n reader.onload = () => {\n img.src = reader.result;\n // we wait for the image to read the reader\n img.onload = () => {\n // validate dimension\n if (img.width > MAX_IMAGE_DIMENSION || img.height > MAX_IMAGE_DIMENSION) {\n fireSwal.loading({ title: translate('img-resize', 'loading', locale) });\n\n reduce\n .toBlob(file, { max: MAX_IMAGE_DIMENSION })\n .then((blob) => {\n // transfer reduced image back to input\n let transfer = new DataTransfer();\n const reducedImg = new File([blob], file.name);\n transfer.items.add(reducedImg);\n input.files = transfer.files;\n\n fireSwal.success({ title: translate('img-resize', 'success', locale) });\n })\n .catch((e) => {\n fireSwal.error({\n title: translate('img-resize', 'error__title', locale),\n text: translate('img-resize', 'error__text', locale),\n });\n });\n } else {\n fireSwal.success({ title: translate('img-resize', 'size-ok', locale) });\n }\n };\n\n // if there is a preview image (e.g. carousel)\n if (preview) preview.src = reader.result;\n this.filename = file.name;\n this.open = false;\n this.image_url = null;\n this.showPlaceholder = false;\n };\n }\n },\n\n handleDrop(event) {\n // Ignore if dataTransfer doesn't contain exactly one item\n if (event.dataTransfer.files.length !== 1) return;\n\n this.$refs.input.files = event.dataTransfer.files;\n this.handleInput();\n },\n\n dropzone: {\n ['@drop.prevent'](event) {\n this.handleDrop(event);\n },\n ['@dragover.prevent']() {\n // Just here to prevent the file from being opened\n },\n },\n\n overlay: {\n ['x-show']() {\n return this.open;\n },\n ['x-transition:enter']() {\n return 'transition ease-out duration-300';\n },\n ['x-transition:enter-start']() {\n return 'opacity-0';\n },\n ['x-transition:enter-end']() {\n return 'opacity-100';\n },\n ['x-transition:leave']() {\n return 'ease-in duration-200';\n },\n ['x-transition:leave-start']() {\n return 'opacity-100';\n },\n ['x-transition:leave-end']() {\n return 'opacity-0';\n },\n ['@click']() {\n this.open = false;\n },\n },\n\n panel: {\n ['x-show']() {\n return this.open;\n },\n ['x-on:close']() {\n this.open = false;\n },\n ['x-on:click.outside']() {\n this.open = false;\n },\n ['@keyup.esc.prevent']() {\n this.open = false;\n },\n ['x-transition:enter']() {\n return 'transition ease-out duration-300';\n },\n ['x-transition:enter-start']() {\n return 'transform opacity-0 translate-y-4 sm:translate-y-0 sm:scale-95';\n },\n ['x-transition:enter-end']() {\n return 'opacity-100 translate-y-0 sm:scale-100';\n },\n ['x-transition:leave']() {\n return 'ease-in duration-200';\n },\n ['x-transition:leave-start']() {\n return 'opacity-100 translate-y-0 sm:scale-100';\n },\n ['x-transition:leave-end']() {\n return 'opacity-0 translate-y-4 sm:translate-y-0 sm:scale-95';\n },\n },\n };\n}\n","/**!\n * Sortable 1.15.6\n * @author\tRubaXa \n * @author\towenm \n * @license MIT\n */\nfunction ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) {\n symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n }\n keys.push.apply(keys, symbols);\n }\n return keys;\n}\nfunction _objectSpread2(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n if (i % 2) {\n ownKeys(Object(source), true).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n } else if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n }\n return target;\n}\nfunction _typeof(obj) {\n \"@babel/helpers - typeof\";\n\n if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n _typeof = function (obj) {\n return typeof obj;\n };\n } else {\n _typeof = function (obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n };\n }\n return _typeof(obj);\n}\nfunction _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n return obj;\n}\nfunction _extends() {\n _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n return target;\n };\n return _extends.apply(this, arguments);\n}\nfunction _objectWithoutPropertiesLoose(source, excluded) {\n if (source == null) return {};\n var target = {};\n var sourceKeys = Object.keys(source);\n var key, i;\n for (i = 0; i < sourceKeys.length; i++) {\n key = sourceKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n target[key] = source[key];\n }\n return target;\n}\nfunction _objectWithoutProperties(source, excluded) {\n if (source == null) return {};\n var target = _objectWithoutPropertiesLoose(source, excluded);\n var key, i;\n if (Object.getOwnPropertySymbols) {\n var sourceSymbolKeys = Object.getOwnPropertySymbols(source);\n for (i = 0; i < sourceSymbolKeys.length; i++) {\n key = sourceSymbolKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;\n target[key] = source[key];\n }\n }\n return target;\n}\nfunction _toConsumableArray(arr) {\n return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();\n}\nfunction _arrayWithoutHoles(arr) {\n if (Array.isArray(arr)) return _arrayLikeToArray(arr);\n}\nfunction _iterableToArray(iter) {\n if (typeof Symbol !== \"undefined\" && iter[Symbol.iterator] != null || iter[\"@@iterator\"] != null) return Array.from(iter);\n}\nfunction _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(o);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\nfunction _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];\n return arr2;\n}\nfunction _nonIterableSpread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\n\nvar version = \"1.15.6\";\n\nfunction userAgent(pattern) {\n if (typeof window !== 'undefined' && window.navigator) {\n return !! /*@__PURE__*/navigator.userAgent.match(pattern);\n }\n}\nvar IE11OrLess = userAgent(/(?:Trident.*rv[ :]?11\\.|msie|iemobile|Windows Phone)/i);\nvar Edge = userAgent(/Edge/i);\nvar FireFox = userAgent(/firefox/i);\nvar Safari = userAgent(/safari/i) && !userAgent(/chrome/i) && !userAgent(/android/i);\nvar IOS = userAgent(/iP(ad|od|hone)/i);\nvar ChromeForAndroid = userAgent(/chrome/i) && userAgent(/android/i);\n\nvar captureMode = {\n capture: false,\n passive: false\n};\nfunction on(el, event, fn) {\n el.addEventListener(event, fn, !IE11OrLess && captureMode);\n}\nfunction off(el, event, fn) {\n el.removeEventListener(event, fn, !IE11OrLess && captureMode);\n}\nfunction matches( /**HTMLElement*/el, /**String*/selector) {\n if (!selector) return;\n selector[0] === '>' && (selector = selector.substring(1));\n if (el) {\n try {\n if (el.matches) {\n return el.matches(selector);\n } else if (el.msMatchesSelector) {\n return el.msMatchesSelector(selector);\n } else if (el.webkitMatchesSelector) {\n return el.webkitMatchesSelector(selector);\n }\n } catch (_) {\n return false;\n }\n }\n return false;\n}\nfunction getParentOrHost(el) {\n return el.host && el !== document && el.host.nodeType ? el.host : el.parentNode;\n}\nfunction closest( /**HTMLElement*/el, /**String*/selector, /**HTMLElement*/ctx, includeCTX) {\n if (el) {\n ctx = ctx || document;\n do {\n if (selector != null && (selector[0] === '>' ? el.parentNode === ctx && matches(el, selector) : matches(el, selector)) || includeCTX && el === ctx) {\n return el;\n }\n if (el === ctx) break;\n /* jshint boss:true */\n } while (el = getParentOrHost(el));\n }\n return null;\n}\nvar R_SPACE = /\\s+/g;\nfunction toggleClass(el, name, state) {\n if (el && name) {\n if (el.classList) {\n el.classList[state ? 'add' : 'remove'](name);\n } else {\n var className = (' ' + el.className + ' ').replace(R_SPACE, ' ').replace(' ' + name + ' ', ' ');\n el.className = (className + (state ? ' ' + name : '')).replace(R_SPACE, ' ');\n }\n }\n}\nfunction css(el, prop, val) {\n var style = el && el.style;\n if (style) {\n if (val === void 0) {\n if (document.defaultView && document.defaultView.getComputedStyle) {\n val = document.defaultView.getComputedStyle(el, '');\n } else if (el.currentStyle) {\n val = el.currentStyle;\n }\n return prop === void 0 ? val : val[prop];\n } else {\n if (!(prop in style) && prop.indexOf('webkit') === -1) {\n prop = '-webkit-' + prop;\n }\n style[prop] = val + (typeof val === 'string' ? '' : 'px');\n }\n }\n}\nfunction matrix(el, selfOnly) {\n var appliedTransforms = '';\n if (typeof el === 'string') {\n appliedTransforms = el;\n } else {\n do {\n var transform = css(el, 'transform');\n if (transform && transform !== 'none') {\n appliedTransforms = transform + ' ' + appliedTransforms;\n }\n /* jshint boss:true */\n } while (!selfOnly && (el = el.parentNode));\n }\n var matrixFn = window.DOMMatrix || window.WebKitCSSMatrix || window.CSSMatrix || window.MSCSSMatrix;\n /*jshint -W056 */\n return matrixFn && new matrixFn(appliedTransforms);\n}\nfunction find(ctx, tagName, iterator) {\n if (ctx) {\n var list = ctx.getElementsByTagName(tagName),\n i = 0,\n n = list.length;\n if (iterator) {\n for (; i < n; i++) {\n iterator(list[i], i);\n }\n }\n return list;\n }\n return [];\n}\nfunction getWindowScrollingElement() {\n var scrollingElement = document.scrollingElement;\n if (scrollingElement) {\n return scrollingElement;\n } else {\n return document.documentElement;\n }\n}\n\n/**\r\n * Returns the \"bounding client rect\" of given element\r\n * @param {HTMLElement} el The element whose boundingClientRect is wanted\r\n * @param {[Boolean]} relativeToContainingBlock Whether the rect should be relative to the containing block of (including) the container\r\n * @param {[Boolean]} relativeToNonStaticParent Whether the rect should be relative to the relative parent of (including) the contaienr\r\n * @param {[Boolean]} undoScale Whether the container's scale() should be undone\r\n * @param {[HTMLElement]} container The parent the element will be placed in\r\n * @return {Object} The boundingClientRect of el, with specified adjustments\r\n */\nfunction getRect(el, relativeToContainingBlock, relativeToNonStaticParent, undoScale, container) {\n if (!el.getBoundingClientRect && el !== window) return;\n var elRect, top, left, bottom, right, height, width;\n if (el !== window && el.parentNode && el !== getWindowScrollingElement()) {\n elRect = el.getBoundingClientRect();\n top = elRect.top;\n left = elRect.left;\n bottom = elRect.bottom;\n right = elRect.right;\n height = elRect.height;\n width = elRect.width;\n } else {\n top = 0;\n left = 0;\n bottom = window.innerHeight;\n right = window.innerWidth;\n height = window.innerHeight;\n width = window.innerWidth;\n }\n if ((relativeToContainingBlock || relativeToNonStaticParent) && el !== window) {\n // Adjust for translate()\n container = container || el.parentNode;\n\n // solves #1123 (see: https://stackoverflow.com/a/37953806/6088312)\n // Not needed on <= IE11\n if (!IE11OrLess) {\n do {\n if (container && container.getBoundingClientRect && (css(container, 'transform') !== 'none' || relativeToNonStaticParent && css(container, 'position') !== 'static')) {\n var containerRect = container.getBoundingClientRect();\n\n // Set relative to edges of padding box of container\n top -= containerRect.top + parseInt(css(container, 'border-top-width'));\n left -= containerRect.left + parseInt(css(container, 'border-left-width'));\n bottom = top + elRect.height;\n right = left + elRect.width;\n break;\n }\n /* jshint boss:true */\n } while (container = container.parentNode);\n }\n }\n if (undoScale && el !== window) {\n // Adjust for scale()\n var elMatrix = matrix(container || el),\n scaleX = elMatrix && elMatrix.a,\n scaleY = elMatrix && elMatrix.d;\n if (elMatrix) {\n top /= scaleY;\n left /= scaleX;\n width /= scaleX;\n height /= scaleY;\n bottom = top + height;\n right = left + width;\n }\n }\n return {\n top: top,\n left: left,\n bottom: bottom,\n right: right,\n width: width,\n height: height\n };\n}\n\n/**\r\n * Checks if a side of an element is scrolled past a side of its parents\r\n * @param {HTMLElement} el The element who's side being scrolled out of view is in question\r\n * @param {String} elSide Side of the element in question ('top', 'left', 'right', 'bottom')\r\n * @param {String} parentSide Side of the parent in question ('top', 'left', 'right', 'bottom')\r\n * @return {HTMLElement} The parent scroll element that the el's side is scrolled past, or null if there is no such element\r\n */\nfunction isScrolledPast(el, elSide, parentSide) {\n var parent = getParentAutoScrollElement(el, true),\n elSideVal = getRect(el)[elSide];\n\n /* jshint boss:true */\n while (parent) {\n var parentSideVal = getRect(parent)[parentSide],\n visible = void 0;\n if (parentSide === 'top' || parentSide === 'left') {\n visible = elSideVal >= parentSideVal;\n } else {\n visible = elSideVal <= parentSideVal;\n }\n if (!visible) return parent;\n if (parent === getWindowScrollingElement()) break;\n parent = getParentAutoScrollElement(parent, false);\n }\n return false;\n}\n\n/**\r\n * Gets nth child of el, ignoring hidden children, sortable's elements (does not ignore clone if it's visible)\r\n * and non-draggable elements\r\n * @param {HTMLElement} el The parent element\r\n * @param {Number} childNum The index of the child\r\n * @param {Object} options Parent Sortable's options\r\n * @return {HTMLElement} The child at index childNum, or null if not found\r\n */\nfunction getChild(el, childNum, options, includeDragEl) {\n var currentChild = 0,\n i = 0,\n children = el.children;\n while (i < children.length) {\n if (children[i].style.display !== 'none' && children[i] !== Sortable.ghost && (includeDragEl || children[i] !== Sortable.dragged) && closest(children[i], options.draggable, el, false)) {\n if (currentChild === childNum) {\n return children[i];\n }\n currentChild++;\n }\n i++;\n }\n return null;\n}\n\n/**\r\n * Gets the last child in the el, ignoring ghostEl or invisible elements (clones)\r\n * @param {HTMLElement} el Parent element\r\n * @param {selector} selector Any other elements that should be ignored\r\n * @return {HTMLElement} The last child, ignoring ghostEl\r\n */\nfunction lastChild(el, selector) {\n var last = el.lastElementChild;\n while (last && (last === Sortable.ghost || css(last, 'display') === 'none' || selector && !matches(last, selector))) {\n last = last.previousElementSibling;\n }\n return last || null;\n}\n\n/**\r\n * Returns the index of an element within its parent for a selected set of\r\n * elements\r\n * @param {HTMLElement} el\r\n * @param {selector} selector\r\n * @return {number}\r\n */\nfunction index(el, selector) {\n var index = 0;\n if (!el || !el.parentNode) {\n return -1;\n }\n\n /* jshint boss:true */\n while (el = el.previousElementSibling) {\n if (el.nodeName.toUpperCase() !== 'TEMPLATE' && el !== Sortable.clone && (!selector || matches(el, selector))) {\n index++;\n }\n }\n return index;\n}\n\n/**\r\n * Returns the scroll offset of the given element, added with all the scroll offsets of parent elements.\r\n * The value is returned in real pixels.\r\n * @param {HTMLElement} el\r\n * @return {Array} Offsets in the format of [left, top]\r\n */\nfunction getRelativeScrollOffset(el) {\n var offsetLeft = 0,\n offsetTop = 0,\n winScroller = getWindowScrollingElement();\n if (el) {\n do {\n var elMatrix = matrix(el),\n scaleX = elMatrix.a,\n scaleY = elMatrix.d;\n offsetLeft += el.scrollLeft * scaleX;\n offsetTop += el.scrollTop * scaleY;\n } while (el !== winScroller && (el = el.parentNode));\n }\n return [offsetLeft, offsetTop];\n}\n\n/**\r\n * Returns the index of the object within the given array\r\n * @param {Array} arr Array that may or may not hold the object\r\n * @param {Object} obj An object that has a key-value pair unique to and identical to a key-value pair in the object you want to find\r\n * @return {Number} The index of the object in the array, or -1\r\n */\nfunction indexOfObject(arr, obj) {\n for (var i in arr) {\n if (!arr.hasOwnProperty(i)) continue;\n for (var key in obj) {\n if (obj.hasOwnProperty(key) && obj[key] === arr[i][key]) return Number(i);\n }\n }\n return -1;\n}\nfunction getParentAutoScrollElement(el, includeSelf) {\n // skip to window\n if (!el || !el.getBoundingClientRect) return getWindowScrollingElement();\n var elem = el;\n var gotSelf = false;\n do {\n // we don't need to get elem css if it isn't even overflowing in the first place (performance)\n if (elem.clientWidth < elem.scrollWidth || elem.clientHeight < elem.scrollHeight) {\n var elemCSS = css(elem);\n if (elem.clientWidth < elem.scrollWidth && (elemCSS.overflowX == 'auto' || elemCSS.overflowX == 'scroll') || elem.clientHeight < elem.scrollHeight && (elemCSS.overflowY == 'auto' || elemCSS.overflowY == 'scroll')) {\n if (!elem.getBoundingClientRect || elem === document.body) return getWindowScrollingElement();\n if (gotSelf || includeSelf) return elem;\n gotSelf = true;\n }\n }\n /* jshint boss:true */\n } while (elem = elem.parentNode);\n return getWindowScrollingElement();\n}\nfunction extend(dst, src) {\n if (dst && src) {\n for (var key in src) {\n if (src.hasOwnProperty(key)) {\n dst[key] = src[key];\n }\n }\n }\n return dst;\n}\nfunction isRectEqual(rect1, rect2) {\n return Math.round(rect1.top) === Math.round(rect2.top) && Math.round(rect1.left) === Math.round(rect2.left) && Math.round(rect1.height) === Math.round(rect2.height) && Math.round(rect1.width) === Math.round(rect2.width);\n}\nvar _throttleTimeout;\nfunction throttle(callback, ms) {\n return function () {\n if (!_throttleTimeout) {\n var args = arguments,\n _this = this;\n if (args.length === 1) {\n callback.call(_this, args[0]);\n } else {\n callback.apply(_this, args);\n }\n _throttleTimeout = setTimeout(function () {\n _throttleTimeout = void 0;\n }, ms);\n }\n };\n}\nfunction cancelThrottle() {\n clearTimeout(_throttleTimeout);\n _throttleTimeout = void 0;\n}\nfunction scrollBy(el, x, y) {\n el.scrollLeft += x;\n el.scrollTop += y;\n}\nfunction clone(el) {\n var Polymer = window.Polymer;\n var $ = window.jQuery || window.Zepto;\n if (Polymer && Polymer.dom) {\n return Polymer.dom(el).cloneNode(true);\n } else if ($) {\n return $(el).clone(true)[0];\n } else {\n return el.cloneNode(true);\n }\n}\nfunction setRect(el, rect) {\n css(el, 'position', 'absolute');\n css(el, 'top', rect.top);\n css(el, 'left', rect.left);\n css(el, 'width', rect.width);\n css(el, 'height', rect.height);\n}\nfunction unsetRect(el) {\n css(el, 'position', '');\n css(el, 'top', '');\n css(el, 'left', '');\n css(el, 'width', '');\n css(el, 'height', '');\n}\nfunction getChildContainingRectFromElement(container, options, ghostEl) {\n var rect = {};\n Array.from(container.children).forEach(function (child) {\n var _rect$left, _rect$top, _rect$right, _rect$bottom;\n if (!closest(child, options.draggable, container, false) || child.animated || child === ghostEl) return;\n var childRect = getRect(child);\n rect.left = Math.min((_rect$left = rect.left) !== null && _rect$left !== void 0 ? _rect$left : Infinity, childRect.left);\n rect.top = Math.min((_rect$top = rect.top) !== null && _rect$top !== void 0 ? _rect$top : Infinity, childRect.top);\n rect.right = Math.max((_rect$right = rect.right) !== null && _rect$right !== void 0 ? _rect$right : -Infinity, childRect.right);\n rect.bottom = Math.max((_rect$bottom = rect.bottom) !== null && _rect$bottom !== void 0 ? _rect$bottom : -Infinity, childRect.bottom);\n });\n rect.width = rect.right - rect.left;\n rect.height = rect.bottom - rect.top;\n rect.x = rect.left;\n rect.y = rect.top;\n return rect;\n}\nvar expando = 'Sortable' + new Date().getTime();\n\nfunction AnimationStateManager() {\n var animationStates = [],\n animationCallbackId;\n return {\n captureAnimationState: function captureAnimationState() {\n animationStates = [];\n if (!this.options.animation) return;\n var children = [].slice.call(this.el.children);\n children.forEach(function (child) {\n if (css(child, 'display') === 'none' || child === Sortable.ghost) return;\n animationStates.push({\n target: child,\n rect: getRect(child)\n });\n var fromRect = _objectSpread2({}, animationStates[animationStates.length - 1].rect);\n\n // If animating: compensate for current animation\n if (child.thisAnimationDuration) {\n var childMatrix = matrix(child, true);\n if (childMatrix) {\n fromRect.top -= childMatrix.f;\n fromRect.left -= childMatrix.e;\n }\n }\n child.fromRect = fromRect;\n });\n },\n addAnimationState: function addAnimationState(state) {\n animationStates.push(state);\n },\n removeAnimationState: function removeAnimationState(target) {\n animationStates.splice(indexOfObject(animationStates, {\n target: target\n }), 1);\n },\n animateAll: function animateAll(callback) {\n var _this = this;\n if (!this.options.animation) {\n clearTimeout(animationCallbackId);\n if (typeof callback === 'function') callback();\n return;\n }\n var animating = false,\n animationTime = 0;\n animationStates.forEach(function (state) {\n var time = 0,\n target = state.target,\n fromRect = target.fromRect,\n toRect = getRect(target),\n prevFromRect = target.prevFromRect,\n prevToRect = target.prevToRect,\n animatingRect = state.rect,\n targetMatrix = matrix(target, true);\n if (targetMatrix) {\n // Compensate for current animation\n toRect.top -= targetMatrix.f;\n toRect.left -= targetMatrix.e;\n }\n target.toRect = toRect;\n if (target.thisAnimationDuration) {\n // Could also check if animatingRect is between fromRect and toRect\n if (isRectEqual(prevFromRect, toRect) && !isRectEqual(fromRect, toRect) &&\n // Make sure animatingRect is on line between toRect & fromRect\n (animatingRect.top - toRect.top) / (animatingRect.left - toRect.left) === (fromRect.top - toRect.top) / (fromRect.left - toRect.left)) {\n // If returning to same place as started from animation and on same axis\n time = calculateRealTime(animatingRect, prevFromRect, prevToRect, _this.options);\n }\n }\n\n // if fromRect != toRect: animate\n if (!isRectEqual(toRect, fromRect)) {\n target.prevFromRect = fromRect;\n target.prevToRect = toRect;\n if (!time) {\n time = _this.options.animation;\n }\n _this.animate(target, animatingRect, toRect, time);\n }\n if (time) {\n animating = true;\n animationTime = Math.max(animationTime, time);\n clearTimeout(target.animationResetTimer);\n target.animationResetTimer = setTimeout(function () {\n target.animationTime = 0;\n target.prevFromRect = null;\n target.fromRect = null;\n target.prevToRect = null;\n target.thisAnimationDuration = null;\n }, time);\n target.thisAnimationDuration = time;\n }\n });\n clearTimeout(animationCallbackId);\n if (!animating) {\n if (typeof callback === 'function') callback();\n } else {\n animationCallbackId = setTimeout(function () {\n if (typeof callback === 'function') callback();\n }, animationTime);\n }\n animationStates = [];\n },\n animate: function animate(target, currentRect, toRect, duration) {\n if (duration) {\n css(target, 'transition', '');\n css(target, 'transform', '');\n var elMatrix = matrix(this.el),\n scaleX = elMatrix && elMatrix.a,\n scaleY = elMatrix && elMatrix.d,\n translateX = (currentRect.left - toRect.left) / (scaleX || 1),\n translateY = (currentRect.top - toRect.top) / (scaleY || 1);\n target.animatingX = !!translateX;\n target.animatingY = !!translateY;\n css(target, 'transform', 'translate3d(' + translateX + 'px,' + translateY + 'px,0)');\n this.forRepaintDummy = repaint(target); // repaint\n\n css(target, 'transition', 'transform ' + duration + 'ms' + (this.options.easing ? ' ' + this.options.easing : ''));\n css(target, 'transform', 'translate3d(0,0,0)');\n typeof target.animated === 'number' && clearTimeout(target.animated);\n target.animated = setTimeout(function () {\n css(target, 'transition', '');\n css(target, 'transform', '');\n target.animated = false;\n target.animatingX = false;\n target.animatingY = false;\n }, duration);\n }\n }\n };\n}\nfunction repaint(target) {\n return target.offsetWidth;\n}\nfunction calculateRealTime(animatingRect, fromRect, toRect, options) {\n return Math.sqrt(Math.pow(fromRect.top - animatingRect.top, 2) + Math.pow(fromRect.left - animatingRect.left, 2)) / Math.sqrt(Math.pow(fromRect.top - toRect.top, 2) + Math.pow(fromRect.left - toRect.left, 2)) * options.animation;\n}\n\nvar plugins = [];\nvar defaults = {\n initializeByDefault: true\n};\nvar PluginManager = {\n mount: function mount(plugin) {\n // Set default static properties\n for (var option in defaults) {\n if (defaults.hasOwnProperty(option) && !(option in plugin)) {\n plugin[option] = defaults[option];\n }\n }\n plugins.forEach(function (p) {\n if (p.pluginName === plugin.pluginName) {\n throw \"Sortable: Cannot mount plugin \".concat(plugin.pluginName, \" more than once\");\n }\n });\n plugins.push(plugin);\n },\n pluginEvent: function pluginEvent(eventName, sortable, evt) {\n var _this = this;\n this.eventCanceled = false;\n evt.cancel = function () {\n _this.eventCanceled = true;\n };\n var eventNameGlobal = eventName + 'Global';\n plugins.forEach(function (plugin) {\n if (!sortable[plugin.pluginName]) return;\n // Fire global events if it exists in this sortable\n if (sortable[plugin.pluginName][eventNameGlobal]) {\n sortable[plugin.pluginName][eventNameGlobal](_objectSpread2({\n sortable: sortable\n }, evt));\n }\n\n // Only fire plugin event if plugin is enabled in this sortable,\n // and plugin has event defined\n if (sortable.options[plugin.pluginName] && sortable[plugin.pluginName][eventName]) {\n sortable[plugin.pluginName][eventName](_objectSpread2({\n sortable: sortable\n }, evt));\n }\n });\n },\n initializePlugins: function initializePlugins(sortable, el, defaults, options) {\n plugins.forEach(function (plugin) {\n var pluginName = plugin.pluginName;\n if (!sortable.options[pluginName] && !plugin.initializeByDefault) return;\n var initialized = new plugin(sortable, el, sortable.options);\n initialized.sortable = sortable;\n initialized.options = sortable.options;\n sortable[pluginName] = initialized;\n\n // Add default options from plugin\n _extends(defaults, initialized.defaults);\n });\n for (var option in sortable.options) {\n if (!sortable.options.hasOwnProperty(option)) continue;\n var modified = this.modifyOption(sortable, option, sortable.options[option]);\n if (typeof modified !== 'undefined') {\n sortable.options[option] = modified;\n }\n }\n },\n getEventProperties: function getEventProperties(name, sortable) {\n var eventProperties = {};\n plugins.forEach(function (plugin) {\n if (typeof plugin.eventProperties !== 'function') return;\n _extends(eventProperties, plugin.eventProperties.call(sortable[plugin.pluginName], name));\n });\n return eventProperties;\n },\n modifyOption: function modifyOption(sortable, name, value) {\n var modifiedValue;\n plugins.forEach(function (plugin) {\n // Plugin must exist on the Sortable\n if (!sortable[plugin.pluginName]) return;\n\n // If static option listener exists for this option, call in the context of the Sortable's instance of this plugin\n if (plugin.optionListeners && typeof plugin.optionListeners[name] === 'function') {\n modifiedValue = plugin.optionListeners[name].call(sortable[plugin.pluginName], value);\n }\n });\n return modifiedValue;\n }\n};\n\nfunction dispatchEvent(_ref) {\n var sortable = _ref.sortable,\n rootEl = _ref.rootEl,\n name = _ref.name,\n targetEl = _ref.targetEl,\n cloneEl = _ref.cloneEl,\n toEl = _ref.toEl,\n fromEl = _ref.fromEl,\n oldIndex = _ref.oldIndex,\n newIndex = _ref.newIndex,\n oldDraggableIndex = _ref.oldDraggableIndex,\n newDraggableIndex = _ref.newDraggableIndex,\n originalEvent = _ref.originalEvent,\n putSortable = _ref.putSortable,\n extraEventProperties = _ref.extraEventProperties;\n sortable = sortable || rootEl && rootEl[expando];\n if (!sortable) return;\n var evt,\n options = sortable.options,\n onName = 'on' + name.charAt(0).toUpperCase() + name.substr(1);\n // Support for new CustomEvent feature\n if (window.CustomEvent && !IE11OrLess && !Edge) {\n evt = new CustomEvent(name, {\n bubbles: true,\n cancelable: true\n });\n } else {\n evt = document.createEvent('Event');\n evt.initEvent(name, true, true);\n }\n evt.to = toEl || rootEl;\n evt.from = fromEl || rootEl;\n evt.item = targetEl || rootEl;\n evt.clone = cloneEl;\n evt.oldIndex = oldIndex;\n evt.newIndex = newIndex;\n evt.oldDraggableIndex = oldDraggableIndex;\n evt.newDraggableIndex = newDraggableIndex;\n evt.originalEvent = originalEvent;\n evt.pullMode = putSortable ? putSortable.lastPutMode : undefined;\n var allEventProperties = _objectSpread2(_objectSpread2({}, extraEventProperties), PluginManager.getEventProperties(name, sortable));\n for (var option in allEventProperties) {\n evt[option] = allEventProperties[option];\n }\n if (rootEl) {\n rootEl.dispatchEvent(evt);\n }\n if (options[onName]) {\n options[onName].call(sortable, evt);\n }\n}\n\nvar _excluded = [\"evt\"];\nvar pluginEvent = function pluginEvent(eventName, sortable) {\n var _ref = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {},\n originalEvent = _ref.evt,\n data = _objectWithoutProperties(_ref, _excluded);\n PluginManager.pluginEvent.bind(Sortable)(eventName, sortable, _objectSpread2({\n dragEl: dragEl,\n parentEl: parentEl,\n ghostEl: ghostEl,\n rootEl: rootEl,\n nextEl: nextEl,\n lastDownEl: lastDownEl,\n cloneEl: cloneEl,\n cloneHidden: cloneHidden,\n dragStarted: moved,\n putSortable: putSortable,\n activeSortable: Sortable.active,\n originalEvent: originalEvent,\n oldIndex: oldIndex,\n oldDraggableIndex: oldDraggableIndex,\n newIndex: newIndex,\n newDraggableIndex: newDraggableIndex,\n hideGhostForTarget: _hideGhostForTarget,\n unhideGhostForTarget: _unhideGhostForTarget,\n cloneNowHidden: function cloneNowHidden() {\n cloneHidden = true;\n },\n cloneNowShown: function cloneNowShown() {\n cloneHidden = false;\n },\n dispatchSortableEvent: function dispatchSortableEvent(name) {\n _dispatchEvent({\n sortable: sortable,\n name: name,\n originalEvent: originalEvent\n });\n }\n }, data));\n};\nfunction _dispatchEvent(info) {\n dispatchEvent(_objectSpread2({\n putSortable: putSortable,\n cloneEl: cloneEl,\n targetEl: dragEl,\n rootEl: rootEl,\n oldIndex: oldIndex,\n oldDraggableIndex: oldDraggableIndex,\n newIndex: newIndex,\n newDraggableIndex: newDraggableIndex\n }, info));\n}\nvar dragEl,\n parentEl,\n ghostEl,\n rootEl,\n nextEl,\n lastDownEl,\n cloneEl,\n cloneHidden,\n oldIndex,\n newIndex,\n oldDraggableIndex,\n newDraggableIndex,\n activeGroup,\n putSortable,\n awaitingDragStarted = false,\n ignoreNextClick = false,\n sortables = [],\n tapEvt,\n touchEvt,\n lastDx,\n lastDy,\n tapDistanceLeft,\n tapDistanceTop,\n moved,\n lastTarget,\n lastDirection,\n pastFirstInvertThresh = false,\n isCircumstantialInvert = false,\n targetMoveDistance,\n // For positioning ghost absolutely\n ghostRelativeParent,\n ghostRelativeParentInitialScroll = [],\n // (left, top)\n\n _silent = false,\n savedInputChecked = [];\n\n/** @const */\nvar documentExists = typeof document !== 'undefined',\n PositionGhostAbsolutely = IOS,\n CSSFloatProperty = Edge || IE11OrLess ? 'cssFloat' : 'float',\n // This will not pass for IE9, because IE9 DnD only works on anchors\n supportDraggable = documentExists && !ChromeForAndroid && !IOS && 'draggable' in document.createElement('div'),\n supportCssPointerEvents = function () {\n if (!documentExists) return;\n // false when <= IE11\n if (IE11OrLess) {\n return false;\n }\n var el = document.createElement('x');\n el.style.cssText = 'pointer-events:auto';\n return el.style.pointerEvents === 'auto';\n }(),\n _detectDirection = function _detectDirection(el, options) {\n var elCSS = css(el),\n elWidth = parseInt(elCSS.width) - parseInt(elCSS.paddingLeft) - parseInt(elCSS.paddingRight) - parseInt(elCSS.borderLeftWidth) - parseInt(elCSS.borderRightWidth),\n child1 = getChild(el, 0, options),\n child2 = getChild(el, 1, options),\n firstChildCSS = child1 && css(child1),\n secondChildCSS = child2 && css(child2),\n firstChildWidth = firstChildCSS && parseInt(firstChildCSS.marginLeft) + parseInt(firstChildCSS.marginRight) + getRect(child1).width,\n secondChildWidth = secondChildCSS && parseInt(secondChildCSS.marginLeft) + parseInt(secondChildCSS.marginRight) + getRect(child2).width;\n if (elCSS.display === 'flex') {\n return elCSS.flexDirection === 'column' || elCSS.flexDirection === 'column-reverse' ? 'vertical' : 'horizontal';\n }\n if (elCSS.display === 'grid') {\n return elCSS.gridTemplateColumns.split(' ').length <= 1 ? 'vertical' : 'horizontal';\n }\n if (child1 && firstChildCSS[\"float\"] && firstChildCSS[\"float\"] !== 'none') {\n var touchingSideChild2 = firstChildCSS[\"float\"] === 'left' ? 'left' : 'right';\n return child2 && (secondChildCSS.clear === 'both' || secondChildCSS.clear === touchingSideChild2) ? 'vertical' : 'horizontal';\n }\n return child1 && (firstChildCSS.display === 'block' || firstChildCSS.display === 'flex' || firstChildCSS.display === 'table' || firstChildCSS.display === 'grid' || firstChildWidth >= elWidth && elCSS[CSSFloatProperty] === 'none' || child2 && elCSS[CSSFloatProperty] === 'none' && firstChildWidth + secondChildWidth > elWidth) ? 'vertical' : 'horizontal';\n },\n _dragElInRowColumn = function _dragElInRowColumn(dragRect, targetRect, vertical) {\n var dragElS1Opp = vertical ? dragRect.left : dragRect.top,\n dragElS2Opp = vertical ? dragRect.right : dragRect.bottom,\n dragElOppLength = vertical ? dragRect.width : dragRect.height,\n targetS1Opp = vertical ? targetRect.left : targetRect.top,\n targetS2Opp = vertical ? targetRect.right : targetRect.bottom,\n targetOppLength = vertical ? targetRect.width : targetRect.height;\n return dragElS1Opp === targetS1Opp || dragElS2Opp === targetS2Opp || dragElS1Opp + dragElOppLength / 2 === targetS1Opp + targetOppLength / 2;\n },\n /**\r\n * Detects first nearest empty sortable to X and Y position using emptyInsertThreshold.\r\n * @param {Number} x X position\r\n * @param {Number} y Y position\r\n * @return {HTMLElement} Element of the first found nearest Sortable\r\n */\n _detectNearestEmptySortable = function _detectNearestEmptySortable(x, y) {\n var ret;\n sortables.some(function (sortable) {\n var threshold = sortable[expando].options.emptyInsertThreshold;\n if (!threshold || lastChild(sortable)) return;\n var rect = getRect(sortable),\n insideHorizontally = x >= rect.left - threshold && x <= rect.right + threshold,\n insideVertically = y >= rect.top - threshold && y <= rect.bottom + threshold;\n if (insideHorizontally && insideVertically) {\n return ret = sortable;\n }\n });\n return ret;\n },\n _prepareGroup = function _prepareGroup(options) {\n function toFn(value, pull) {\n return function (to, from, dragEl, evt) {\n var sameGroup = to.options.group.name && from.options.group.name && to.options.group.name === from.options.group.name;\n if (value == null && (pull || sameGroup)) {\n // Default pull value\n // Default pull and put value if same group\n return true;\n } else if (value == null || value === false) {\n return false;\n } else if (pull && value === 'clone') {\n return value;\n } else if (typeof value === 'function') {\n return toFn(value(to, from, dragEl, evt), pull)(to, from, dragEl, evt);\n } else {\n var otherGroup = (pull ? to : from).options.group.name;\n return value === true || typeof value === 'string' && value === otherGroup || value.join && value.indexOf(otherGroup) > -1;\n }\n };\n }\n var group = {};\n var originalGroup = options.group;\n if (!originalGroup || _typeof(originalGroup) != 'object') {\n originalGroup = {\n name: originalGroup\n };\n }\n group.name = originalGroup.name;\n group.checkPull = toFn(originalGroup.pull, true);\n group.checkPut = toFn(originalGroup.put);\n group.revertClone = originalGroup.revertClone;\n options.group = group;\n },\n _hideGhostForTarget = function _hideGhostForTarget() {\n if (!supportCssPointerEvents && ghostEl) {\n css(ghostEl, 'display', 'none');\n }\n },\n _unhideGhostForTarget = function _unhideGhostForTarget() {\n if (!supportCssPointerEvents && ghostEl) {\n css(ghostEl, 'display', '');\n }\n };\n\n// #1184 fix - Prevent click event on fallback if dragged but item not changed position\nif (documentExists && !ChromeForAndroid) {\n document.addEventListener('click', function (evt) {\n if (ignoreNextClick) {\n evt.preventDefault();\n evt.stopPropagation && evt.stopPropagation();\n evt.stopImmediatePropagation && evt.stopImmediatePropagation();\n ignoreNextClick = false;\n return false;\n }\n }, true);\n}\nvar nearestEmptyInsertDetectEvent = function nearestEmptyInsertDetectEvent(evt) {\n if (dragEl) {\n evt = evt.touches ? evt.touches[0] : evt;\n var nearest = _detectNearestEmptySortable(evt.clientX, evt.clientY);\n if (nearest) {\n // Create imitation event\n var event = {};\n for (var i in evt) {\n if (evt.hasOwnProperty(i)) {\n event[i] = evt[i];\n }\n }\n event.target = event.rootEl = nearest;\n event.preventDefault = void 0;\n event.stopPropagation = void 0;\n nearest[expando]._onDragOver(event);\n }\n }\n};\nvar _checkOutsideTargetEl = function _checkOutsideTargetEl(evt) {\n if (dragEl) {\n dragEl.parentNode[expando]._isOutsideThisEl(evt.target);\n }\n};\n\n/**\r\n * @class Sortable\r\n * @param {HTMLElement} el\r\n * @param {Object} [options]\r\n */\nfunction Sortable(el, options) {\n if (!(el && el.nodeType && el.nodeType === 1)) {\n throw \"Sortable: `el` must be an HTMLElement, not \".concat({}.toString.call(el));\n }\n this.el = el; // root element\n this.options = options = _extends({}, options);\n\n // Export instance\n el[expando] = this;\n var defaults = {\n group: null,\n sort: true,\n disabled: false,\n store: null,\n handle: null,\n draggable: /^[uo]l$/i.test(el.nodeName) ? '>li' : '>*',\n swapThreshold: 1,\n // percentage; 0 <= x <= 1\n invertSwap: false,\n // invert always\n invertedSwapThreshold: null,\n // will be set to same as swapThreshold if default\n removeCloneOnHide: true,\n direction: function direction() {\n return _detectDirection(el, this.options);\n },\n ghostClass: 'sortable-ghost',\n chosenClass: 'sortable-chosen',\n dragClass: 'sortable-drag',\n ignore: 'a, img',\n filter: null,\n preventOnFilter: true,\n animation: 0,\n easing: null,\n setData: function setData(dataTransfer, dragEl) {\n dataTransfer.setData('Text', dragEl.textContent);\n },\n dropBubble: false,\n dragoverBubble: false,\n dataIdAttr: 'data-id',\n delay: 0,\n delayOnTouchOnly: false,\n touchStartThreshold: (Number.parseInt ? Number : window).parseInt(window.devicePixelRatio, 10) || 1,\n forceFallback: false,\n fallbackClass: 'sortable-fallback',\n fallbackOnBody: false,\n fallbackTolerance: 0,\n fallbackOffset: {\n x: 0,\n y: 0\n },\n // Disabled on Safari: #1571; Enabled on Safari IOS: #2244\n supportPointer: Sortable.supportPointer !== false && 'PointerEvent' in window && (!Safari || IOS),\n emptyInsertThreshold: 5\n };\n PluginManager.initializePlugins(this, el, defaults);\n\n // Set default options\n for (var name in defaults) {\n !(name in options) && (options[name] = defaults[name]);\n }\n _prepareGroup(options);\n\n // Bind all private methods\n for (var fn in this) {\n if (fn.charAt(0) === '_' && typeof this[fn] === 'function') {\n this[fn] = this[fn].bind(this);\n }\n }\n\n // Setup drag mode\n this.nativeDraggable = options.forceFallback ? false : supportDraggable;\n if (this.nativeDraggable) {\n // Touch start threshold cannot be greater than the native dragstart threshold\n this.options.touchStartThreshold = 1;\n }\n\n // Bind events\n if (options.supportPointer) {\n on(el, 'pointerdown', this._onTapStart);\n } else {\n on(el, 'mousedown', this._onTapStart);\n on(el, 'touchstart', this._onTapStart);\n }\n if (this.nativeDraggable) {\n on(el, 'dragover', this);\n on(el, 'dragenter', this);\n }\n sortables.push(this.el);\n\n // Restore sorting\n options.store && options.store.get && this.sort(options.store.get(this) || []);\n\n // Add animation state manager\n _extends(this, AnimationStateManager());\n}\nSortable.prototype = /** @lends Sortable.prototype */{\n constructor: Sortable,\n _isOutsideThisEl: function _isOutsideThisEl(target) {\n if (!this.el.contains(target) && target !== this.el) {\n lastTarget = null;\n }\n },\n _getDirection: function _getDirection(evt, target) {\n return typeof this.options.direction === 'function' ? this.options.direction.call(this, evt, target, dragEl) : this.options.direction;\n },\n _onTapStart: function _onTapStart( /** Event|TouchEvent */evt) {\n if (!evt.cancelable) return;\n var _this = this,\n el = this.el,\n options = this.options,\n preventOnFilter = options.preventOnFilter,\n type = evt.type,\n touch = evt.touches && evt.touches[0] || evt.pointerType && evt.pointerType === 'touch' && evt,\n target = (touch || evt).target,\n originalTarget = evt.target.shadowRoot && (evt.path && evt.path[0] || evt.composedPath && evt.composedPath()[0]) || target,\n filter = options.filter;\n _saveInputCheckedState(el);\n\n // Don't trigger start event when an element is been dragged, otherwise the evt.oldindex always wrong when set option.group.\n if (dragEl) {\n return;\n }\n if (/mousedown|pointerdown/.test(type) && evt.button !== 0 || options.disabled) {\n return; // only left button and enabled\n }\n\n // cancel dnd if original target is content editable\n if (originalTarget.isContentEditable) {\n return;\n }\n\n // Safari ignores further event handling after mousedown\n if (!this.nativeDraggable && Safari && target && target.tagName.toUpperCase() === 'SELECT') {\n return;\n }\n target = closest(target, options.draggable, el, false);\n if (target && target.animated) {\n return;\n }\n if (lastDownEl === target) {\n // Ignoring duplicate `down`\n return;\n }\n\n // Get the index of the dragged element within its parent\n oldIndex = index(target);\n oldDraggableIndex = index(target, options.draggable);\n\n // Check filter\n if (typeof filter === 'function') {\n if (filter.call(this, evt, target, this)) {\n _dispatchEvent({\n sortable: _this,\n rootEl: originalTarget,\n name: 'filter',\n targetEl: target,\n toEl: el,\n fromEl: el\n });\n pluginEvent('filter', _this, {\n evt: evt\n });\n preventOnFilter && evt.preventDefault();\n return; // cancel dnd\n }\n } else if (filter) {\n filter = filter.split(',').some(function (criteria) {\n criteria = closest(originalTarget, criteria.trim(), el, false);\n if (criteria) {\n _dispatchEvent({\n sortable: _this,\n rootEl: criteria,\n name: 'filter',\n targetEl: target,\n fromEl: el,\n toEl: el\n });\n pluginEvent('filter', _this, {\n evt: evt\n });\n return true;\n }\n });\n if (filter) {\n preventOnFilter && evt.preventDefault();\n return; // cancel dnd\n }\n }\n if (options.handle && !closest(originalTarget, options.handle, el, false)) {\n return;\n }\n\n // Prepare `dragstart`\n this._prepareDragStart(evt, touch, target);\n },\n _prepareDragStart: function _prepareDragStart( /** Event */evt, /** Touch */touch, /** HTMLElement */target) {\n var _this = this,\n el = _this.el,\n options = _this.options,\n ownerDocument = el.ownerDocument,\n dragStartFn;\n if (target && !dragEl && target.parentNode === el) {\n var dragRect = getRect(target);\n rootEl = el;\n dragEl = target;\n parentEl = dragEl.parentNode;\n nextEl = dragEl.nextSibling;\n lastDownEl = target;\n activeGroup = options.group;\n Sortable.dragged = dragEl;\n tapEvt = {\n target: dragEl,\n clientX: (touch || evt).clientX,\n clientY: (touch || evt).clientY\n };\n tapDistanceLeft = tapEvt.clientX - dragRect.left;\n tapDistanceTop = tapEvt.clientY - dragRect.top;\n this._lastX = (touch || evt).clientX;\n this._lastY = (touch || evt).clientY;\n dragEl.style['will-change'] = 'all';\n dragStartFn = function dragStartFn() {\n pluginEvent('delayEnded', _this, {\n evt: evt\n });\n if (Sortable.eventCanceled) {\n _this._onDrop();\n return;\n }\n // Delayed drag has been triggered\n // we can re-enable the events: touchmove/mousemove\n _this._disableDelayedDragEvents();\n if (!FireFox && _this.nativeDraggable) {\n dragEl.draggable = true;\n }\n\n // Bind the events: dragstart/dragend\n _this._triggerDragStart(evt, touch);\n\n // Drag start event\n _dispatchEvent({\n sortable: _this,\n name: 'choose',\n originalEvent: evt\n });\n\n // Chosen item\n toggleClass(dragEl, options.chosenClass, true);\n };\n\n // Disable \"draggable\"\n options.ignore.split(',').forEach(function (criteria) {\n find(dragEl, criteria.trim(), _disableDraggable);\n });\n on(ownerDocument, 'dragover', nearestEmptyInsertDetectEvent);\n on(ownerDocument, 'mousemove', nearestEmptyInsertDetectEvent);\n on(ownerDocument, 'touchmove', nearestEmptyInsertDetectEvent);\n if (options.supportPointer) {\n on(ownerDocument, 'pointerup', _this._onDrop);\n // Native D&D triggers pointercancel\n !this.nativeDraggable && on(ownerDocument, 'pointercancel', _this._onDrop);\n } else {\n on(ownerDocument, 'mouseup', _this._onDrop);\n on(ownerDocument, 'touchend', _this._onDrop);\n on(ownerDocument, 'touchcancel', _this._onDrop);\n }\n\n // Make dragEl draggable (must be before delay for FireFox)\n if (FireFox && this.nativeDraggable) {\n this.options.touchStartThreshold = 4;\n dragEl.draggable = true;\n }\n pluginEvent('delayStart', this, {\n evt: evt\n });\n\n // Delay is impossible for native DnD in Edge or IE\n if (options.delay && (!options.delayOnTouchOnly || touch) && (!this.nativeDraggable || !(Edge || IE11OrLess))) {\n if (Sortable.eventCanceled) {\n this._onDrop();\n return;\n }\n // If the user moves the pointer or let go the click or touch\n // before the delay has been reached:\n // disable the delayed drag\n if (options.supportPointer) {\n on(ownerDocument, 'pointerup', _this._disableDelayedDrag);\n on(ownerDocument, 'pointercancel', _this._disableDelayedDrag);\n } else {\n on(ownerDocument, 'mouseup', _this._disableDelayedDrag);\n on(ownerDocument, 'touchend', _this._disableDelayedDrag);\n on(ownerDocument, 'touchcancel', _this._disableDelayedDrag);\n }\n on(ownerDocument, 'mousemove', _this._delayedDragTouchMoveHandler);\n on(ownerDocument, 'touchmove', _this._delayedDragTouchMoveHandler);\n options.supportPointer && on(ownerDocument, 'pointermove', _this._delayedDragTouchMoveHandler);\n _this._dragStartTimer = setTimeout(dragStartFn, options.delay);\n } else {\n dragStartFn();\n }\n }\n },\n _delayedDragTouchMoveHandler: function _delayedDragTouchMoveHandler( /** TouchEvent|PointerEvent **/e) {\n var touch = e.touches ? e.touches[0] : e;\n if (Math.max(Math.abs(touch.clientX - this._lastX), Math.abs(touch.clientY - this._lastY)) >= Math.floor(this.options.touchStartThreshold / (this.nativeDraggable && window.devicePixelRatio || 1))) {\n this._disableDelayedDrag();\n }\n },\n _disableDelayedDrag: function _disableDelayedDrag() {\n dragEl && _disableDraggable(dragEl);\n clearTimeout(this._dragStartTimer);\n this._disableDelayedDragEvents();\n },\n _disableDelayedDragEvents: function _disableDelayedDragEvents() {\n var ownerDocument = this.el.ownerDocument;\n off(ownerDocument, 'mouseup', this._disableDelayedDrag);\n off(ownerDocument, 'touchend', this._disableDelayedDrag);\n off(ownerDocument, 'touchcancel', this._disableDelayedDrag);\n off(ownerDocument, 'pointerup', this._disableDelayedDrag);\n off(ownerDocument, 'pointercancel', this._disableDelayedDrag);\n off(ownerDocument, 'mousemove', this._delayedDragTouchMoveHandler);\n off(ownerDocument, 'touchmove', this._delayedDragTouchMoveHandler);\n off(ownerDocument, 'pointermove', this._delayedDragTouchMoveHandler);\n },\n _triggerDragStart: function _triggerDragStart( /** Event */evt, /** Touch */touch) {\n touch = touch || evt.pointerType == 'touch' && evt;\n if (!this.nativeDraggable || touch) {\n if (this.options.supportPointer) {\n on(document, 'pointermove', this._onTouchMove);\n } else if (touch) {\n on(document, 'touchmove', this._onTouchMove);\n } else {\n on(document, 'mousemove', this._onTouchMove);\n }\n } else {\n on(dragEl, 'dragend', this);\n on(rootEl, 'dragstart', this._onDragStart);\n }\n try {\n if (document.selection) {\n _nextTick(function () {\n document.selection.empty();\n });\n } else {\n window.getSelection().removeAllRanges();\n }\n } catch (err) {}\n },\n _dragStarted: function _dragStarted(fallback, evt) {\n awaitingDragStarted = false;\n if (rootEl && dragEl) {\n pluginEvent('dragStarted', this, {\n evt: evt\n });\n if (this.nativeDraggable) {\n on(document, 'dragover', _checkOutsideTargetEl);\n }\n var options = this.options;\n\n // Apply effect\n !fallback && toggleClass(dragEl, options.dragClass, false);\n toggleClass(dragEl, options.ghostClass, true);\n Sortable.active = this;\n fallback && this._appendGhost();\n\n // Drag start event\n _dispatchEvent({\n sortable: this,\n name: 'start',\n originalEvent: evt\n });\n } else {\n this._nulling();\n }\n },\n _emulateDragOver: function _emulateDragOver() {\n if (touchEvt) {\n this._lastX = touchEvt.clientX;\n this._lastY = touchEvt.clientY;\n _hideGhostForTarget();\n var target = document.elementFromPoint(touchEvt.clientX, touchEvt.clientY);\n var parent = target;\n while (target && target.shadowRoot) {\n target = target.shadowRoot.elementFromPoint(touchEvt.clientX, touchEvt.clientY);\n if (target === parent) break;\n parent = target;\n }\n dragEl.parentNode[expando]._isOutsideThisEl(target);\n if (parent) {\n do {\n if (parent[expando]) {\n var inserted = void 0;\n inserted = parent[expando]._onDragOver({\n clientX: touchEvt.clientX,\n clientY: touchEvt.clientY,\n target: target,\n rootEl: parent\n });\n if (inserted && !this.options.dragoverBubble) {\n break;\n }\n }\n target = parent; // store last element\n }\n /* jshint boss:true */ while (parent = getParentOrHost(parent));\n }\n _unhideGhostForTarget();\n }\n },\n _onTouchMove: function _onTouchMove( /**TouchEvent*/evt) {\n if (tapEvt) {\n var options = this.options,\n fallbackTolerance = options.fallbackTolerance,\n fallbackOffset = options.fallbackOffset,\n touch = evt.touches ? evt.touches[0] : evt,\n ghostMatrix = ghostEl && matrix(ghostEl, true),\n scaleX = ghostEl && ghostMatrix && ghostMatrix.a,\n scaleY = ghostEl && ghostMatrix && ghostMatrix.d,\n relativeScrollOffset = PositionGhostAbsolutely && ghostRelativeParent && getRelativeScrollOffset(ghostRelativeParent),\n dx = (touch.clientX - tapEvt.clientX + fallbackOffset.x) / (scaleX || 1) + (relativeScrollOffset ? relativeScrollOffset[0] - ghostRelativeParentInitialScroll[0] : 0) / (scaleX || 1),\n dy = (touch.clientY - tapEvt.clientY + fallbackOffset.y) / (scaleY || 1) + (relativeScrollOffset ? relativeScrollOffset[1] - ghostRelativeParentInitialScroll[1] : 0) / (scaleY || 1);\n\n // only set the status to dragging, when we are actually dragging\n if (!Sortable.active && !awaitingDragStarted) {\n if (fallbackTolerance && Math.max(Math.abs(touch.clientX - this._lastX), Math.abs(touch.clientY - this._lastY)) < fallbackTolerance) {\n return;\n }\n this._onDragStart(evt, true);\n }\n if (ghostEl) {\n if (ghostMatrix) {\n ghostMatrix.e += dx - (lastDx || 0);\n ghostMatrix.f += dy - (lastDy || 0);\n } else {\n ghostMatrix = {\n a: 1,\n b: 0,\n c: 0,\n d: 1,\n e: dx,\n f: dy\n };\n }\n var cssMatrix = \"matrix(\".concat(ghostMatrix.a, \",\").concat(ghostMatrix.b, \",\").concat(ghostMatrix.c, \",\").concat(ghostMatrix.d, \",\").concat(ghostMatrix.e, \",\").concat(ghostMatrix.f, \")\");\n css(ghostEl, 'webkitTransform', cssMatrix);\n css(ghostEl, 'mozTransform', cssMatrix);\n css(ghostEl, 'msTransform', cssMatrix);\n css(ghostEl, 'transform', cssMatrix);\n lastDx = dx;\n lastDy = dy;\n touchEvt = touch;\n }\n evt.cancelable && evt.preventDefault();\n }\n },\n _appendGhost: function _appendGhost() {\n // Bug if using scale(): https://stackoverflow.com/questions/2637058\n // Not being adjusted for\n if (!ghostEl) {\n var container = this.options.fallbackOnBody ? document.body : rootEl,\n rect = getRect(dragEl, true, PositionGhostAbsolutely, true, container),\n options = this.options;\n\n // Position absolutely\n if (PositionGhostAbsolutely) {\n // Get relatively positioned parent\n ghostRelativeParent = container;\n while (css(ghostRelativeParent, 'position') === 'static' && css(ghostRelativeParent, 'transform') === 'none' && ghostRelativeParent !== document) {\n ghostRelativeParent = ghostRelativeParent.parentNode;\n }\n if (ghostRelativeParent !== document.body && ghostRelativeParent !== document.documentElement) {\n if (ghostRelativeParent === document) ghostRelativeParent = getWindowScrollingElement();\n rect.top += ghostRelativeParent.scrollTop;\n rect.left += ghostRelativeParent.scrollLeft;\n } else {\n ghostRelativeParent = getWindowScrollingElement();\n }\n ghostRelativeParentInitialScroll = getRelativeScrollOffset(ghostRelativeParent);\n }\n ghostEl = dragEl.cloneNode(true);\n toggleClass(ghostEl, options.ghostClass, false);\n toggleClass(ghostEl, options.fallbackClass, true);\n toggleClass(ghostEl, options.dragClass, true);\n css(ghostEl, 'transition', '');\n css(ghostEl, 'transform', '');\n css(ghostEl, 'box-sizing', 'border-box');\n css(ghostEl, 'margin', 0);\n css(ghostEl, 'top', rect.top);\n css(ghostEl, 'left', rect.left);\n css(ghostEl, 'width', rect.width);\n css(ghostEl, 'height', rect.height);\n css(ghostEl, 'opacity', '0.8');\n css(ghostEl, 'position', PositionGhostAbsolutely ? 'absolute' : 'fixed');\n css(ghostEl, 'zIndex', '100000');\n css(ghostEl, 'pointerEvents', 'none');\n Sortable.ghost = ghostEl;\n container.appendChild(ghostEl);\n\n // Set transform-origin\n css(ghostEl, 'transform-origin', tapDistanceLeft / parseInt(ghostEl.style.width) * 100 + '% ' + tapDistanceTop / parseInt(ghostEl.style.height) * 100 + '%');\n }\n },\n _onDragStart: function _onDragStart( /**Event*/evt, /**boolean*/fallback) {\n var _this = this;\n var dataTransfer = evt.dataTransfer;\n var options = _this.options;\n pluginEvent('dragStart', this, {\n evt: evt\n });\n if (Sortable.eventCanceled) {\n this._onDrop();\n return;\n }\n pluginEvent('setupClone', this);\n if (!Sortable.eventCanceled) {\n cloneEl = clone(dragEl);\n cloneEl.removeAttribute(\"id\");\n cloneEl.draggable = false;\n cloneEl.style['will-change'] = '';\n this._hideClone();\n toggleClass(cloneEl, this.options.chosenClass, false);\n Sortable.clone = cloneEl;\n }\n\n // #1143: IFrame support workaround\n _this.cloneId = _nextTick(function () {\n pluginEvent('clone', _this);\n if (Sortable.eventCanceled) return;\n if (!_this.options.removeCloneOnHide) {\n rootEl.insertBefore(cloneEl, dragEl);\n }\n _this._hideClone();\n _dispatchEvent({\n sortable: _this,\n name: 'clone'\n });\n });\n !fallback && toggleClass(dragEl, options.dragClass, true);\n\n // Set proper drop events\n if (fallback) {\n ignoreNextClick = true;\n _this._loopId = setInterval(_this._emulateDragOver, 50);\n } else {\n // Undo what was set in _prepareDragStart before drag started\n off(document, 'mouseup', _this._onDrop);\n off(document, 'touchend', _this._onDrop);\n off(document, 'touchcancel', _this._onDrop);\n if (dataTransfer) {\n dataTransfer.effectAllowed = 'move';\n options.setData && options.setData.call(_this, dataTransfer, dragEl);\n }\n on(document, 'drop', _this);\n\n // #1276 fix:\n css(dragEl, 'transform', 'translateZ(0)');\n }\n awaitingDragStarted = true;\n _this._dragStartId = _nextTick(_this._dragStarted.bind(_this, fallback, evt));\n on(document, 'selectstart', _this);\n moved = true;\n window.getSelection().removeAllRanges();\n if (Safari) {\n css(document.body, 'user-select', 'none');\n }\n },\n // Returns true - if no further action is needed (either inserted or another condition)\n _onDragOver: function _onDragOver( /**Event*/evt) {\n var el = this.el,\n target = evt.target,\n dragRect,\n targetRect,\n revert,\n options = this.options,\n group = options.group,\n activeSortable = Sortable.active,\n isOwner = activeGroup === group,\n canSort = options.sort,\n fromSortable = putSortable || activeSortable,\n vertical,\n _this = this,\n completedFired = false;\n if (_silent) return;\n function dragOverEvent(name, extra) {\n pluginEvent(name, _this, _objectSpread2({\n evt: evt,\n isOwner: isOwner,\n axis: vertical ? 'vertical' : 'horizontal',\n revert: revert,\n dragRect: dragRect,\n targetRect: targetRect,\n canSort: canSort,\n fromSortable: fromSortable,\n target: target,\n completed: completed,\n onMove: function onMove(target, after) {\n return _onMove(rootEl, el, dragEl, dragRect, target, getRect(target), evt, after);\n },\n changed: changed\n }, extra));\n }\n\n // Capture animation state\n function capture() {\n dragOverEvent('dragOverAnimationCapture');\n _this.captureAnimationState();\n if (_this !== fromSortable) {\n fromSortable.captureAnimationState();\n }\n }\n\n // Return invocation when dragEl is inserted (or completed)\n function completed(insertion) {\n dragOverEvent('dragOverCompleted', {\n insertion: insertion\n });\n if (insertion) {\n // Clones must be hidden before folding animation to capture dragRectAbsolute properly\n if (isOwner) {\n activeSortable._hideClone();\n } else {\n activeSortable._showClone(_this);\n }\n if (_this !== fromSortable) {\n // Set ghost class to new sortable's ghost class\n toggleClass(dragEl, putSortable ? putSortable.options.ghostClass : activeSortable.options.ghostClass, false);\n toggleClass(dragEl, options.ghostClass, true);\n }\n if (putSortable !== _this && _this !== Sortable.active) {\n putSortable = _this;\n } else if (_this === Sortable.active && putSortable) {\n putSortable = null;\n }\n\n // Animation\n if (fromSortable === _this) {\n _this._ignoreWhileAnimating = target;\n }\n _this.animateAll(function () {\n dragOverEvent('dragOverAnimationComplete');\n _this._ignoreWhileAnimating = null;\n });\n if (_this !== fromSortable) {\n fromSortable.animateAll();\n fromSortable._ignoreWhileAnimating = null;\n }\n }\n\n // Null lastTarget if it is not inside a previously swapped element\n if (target === dragEl && !dragEl.animated || target === el && !target.animated) {\n lastTarget = null;\n }\n\n // no bubbling and not fallback\n if (!options.dragoverBubble && !evt.rootEl && target !== document) {\n dragEl.parentNode[expando]._isOutsideThisEl(evt.target);\n\n // Do not detect for empty insert if already inserted\n !insertion && nearestEmptyInsertDetectEvent(evt);\n }\n !options.dragoverBubble && evt.stopPropagation && evt.stopPropagation();\n return completedFired = true;\n }\n\n // Call when dragEl has been inserted\n function changed() {\n newIndex = index(dragEl);\n newDraggableIndex = index(dragEl, options.draggable);\n _dispatchEvent({\n sortable: _this,\n name: 'change',\n toEl: el,\n newIndex: newIndex,\n newDraggableIndex: newDraggableIndex,\n originalEvent: evt\n });\n }\n if (evt.preventDefault !== void 0) {\n evt.cancelable && evt.preventDefault();\n }\n target = closest(target, options.draggable, el, true);\n dragOverEvent('dragOver');\n if (Sortable.eventCanceled) return completedFired;\n if (dragEl.contains(evt.target) || target.animated && target.animatingX && target.animatingY || _this._ignoreWhileAnimating === target) {\n return completed(false);\n }\n ignoreNextClick = false;\n if (activeSortable && !options.disabled && (isOwner ? canSort || (revert = parentEl !== rootEl) // Reverting item into the original list\n : putSortable === this || (this.lastPutMode = activeGroup.checkPull(this, activeSortable, dragEl, evt)) && group.checkPut(this, activeSortable, dragEl, evt))) {\n vertical = this._getDirection(evt, target) === 'vertical';\n dragRect = getRect(dragEl);\n dragOverEvent('dragOverValid');\n if (Sortable.eventCanceled) return completedFired;\n if (revert) {\n parentEl = rootEl; // actualization\n capture();\n this._hideClone();\n dragOverEvent('revert');\n if (!Sortable.eventCanceled) {\n if (nextEl) {\n rootEl.insertBefore(dragEl, nextEl);\n } else {\n rootEl.appendChild(dragEl);\n }\n }\n return completed(true);\n }\n var elLastChild = lastChild(el, options.draggable);\n if (!elLastChild || _ghostIsLast(evt, vertical, this) && !elLastChild.animated) {\n // Insert to end of list\n\n // If already at end of list: Do not insert\n if (elLastChild === dragEl) {\n return completed(false);\n }\n\n // if there is a last element, it is the target\n if (elLastChild && el === evt.target) {\n target = elLastChild;\n }\n if (target) {\n targetRect = getRect(target);\n }\n if (_onMove(rootEl, el, dragEl, dragRect, target, targetRect, evt, !!target) !== false) {\n capture();\n if (elLastChild && elLastChild.nextSibling) {\n // the last draggable element is not the last node\n el.insertBefore(dragEl, elLastChild.nextSibling);\n } else {\n el.appendChild(dragEl);\n }\n parentEl = el; // actualization\n\n changed();\n return completed(true);\n }\n } else if (elLastChild && _ghostIsFirst(evt, vertical, this)) {\n // Insert to start of list\n var firstChild = getChild(el, 0, options, true);\n if (firstChild === dragEl) {\n return completed(false);\n }\n target = firstChild;\n targetRect = getRect(target);\n if (_onMove(rootEl, el, dragEl, dragRect, target, targetRect, evt, false) !== false) {\n capture();\n el.insertBefore(dragEl, firstChild);\n parentEl = el; // actualization\n\n changed();\n return completed(true);\n }\n } else if (target.parentNode === el) {\n targetRect = getRect(target);\n var direction = 0,\n targetBeforeFirstSwap,\n differentLevel = dragEl.parentNode !== el,\n differentRowCol = !_dragElInRowColumn(dragEl.animated && dragEl.toRect || dragRect, target.animated && target.toRect || targetRect, vertical),\n side1 = vertical ? 'top' : 'left',\n scrolledPastTop = isScrolledPast(target, 'top', 'top') || isScrolledPast(dragEl, 'top', 'top'),\n scrollBefore = scrolledPastTop ? scrolledPastTop.scrollTop : void 0;\n if (lastTarget !== target) {\n targetBeforeFirstSwap = targetRect[side1];\n pastFirstInvertThresh = false;\n isCircumstantialInvert = !differentRowCol && options.invertSwap || differentLevel;\n }\n direction = _getSwapDirection(evt, target, targetRect, vertical, differentRowCol ? 1 : options.swapThreshold, options.invertedSwapThreshold == null ? options.swapThreshold : options.invertedSwapThreshold, isCircumstantialInvert, lastTarget === target);\n var sibling;\n if (direction !== 0) {\n // Check if target is beside dragEl in respective direction (ignoring hidden elements)\n var dragIndex = index(dragEl);\n do {\n dragIndex -= direction;\n sibling = parentEl.children[dragIndex];\n } while (sibling && (css(sibling, 'display') === 'none' || sibling === ghostEl));\n }\n // If dragEl is already beside target: Do not insert\n if (direction === 0 || sibling === target) {\n return completed(false);\n }\n lastTarget = target;\n lastDirection = direction;\n var nextSibling = target.nextElementSibling,\n after = false;\n after = direction === 1;\n var moveVector = _onMove(rootEl, el, dragEl, dragRect, target, targetRect, evt, after);\n if (moveVector !== false) {\n if (moveVector === 1 || moveVector === -1) {\n after = moveVector === 1;\n }\n _silent = true;\n setTimeout(_unsilent, 30);\n capture();\n if (after && !nextSibling) {\n el.appendChild(dragEl);\n } else {\n target.parentNode.insertBefore(dragEl, after ? nextSibling : target);\n }\n\n // Undo chrome's scroll adjustment (has no effect on other browsers)\n if (scrolledPastTop) {\n scrollBy(scrolledPastTop, 0, scrollBefore - scrolledPastTop.scrollTop);\n }\n parentEl = dragEl.parentNode; // actualization\n\n // must be done before animation\n if (targetBeforeFirstSwap !== undefined && !isCircumstantialInvert) {\n targetMoveDistance = Math.abs(targetBeforeFirstSwap - getRect(target)[side1]);\n }\n changed();\n return completed(true);\n }\n }\n if (el.contains(dragEl)) {\n return completed(false);\n }\n }\n return false;\n },\n _ignoreWhileAnimating: null,\n _offMoveEvents: function _offMoveEvents() {\n off(document, 'mousemove', this._onTouchMove);\n off(document, 'touchmove', this._onTouchMove);\n off(document, 'pointermove', this._onTouchMove);\n off(document, 'dragover', nearestEmptyInsertDetectEvent);\n off(document, 'mousemove', nearestEmptyInsertDetectEvent);\n off(document, 'touchmove', nearestEmptyInsertDetectEvent);\n },\n _offUpEvents: function _offUpEvents() {\n var ownerDocument = this.el.ownerDocument;\n off(ownerDocument, 'mouseup', this._onDrop);\n off(ownerDocument, 'touchend', this._onDrop);\n off(ownerDocument, 'pointerup', this._onDrop);\n off(ownerDocument, 'pointercancel', this._onDrop);\n off(ownerDocument, 'touchcancel', this._onDrop);\n off(document, 'selectstart', this);\n },\n _onDrop: function _onDrop( /**Event*/evt) {\n var el = this.el,\n options = this.options;\n\n // Get the index of the dragged element within its parent\n newIndex = index(dragEl);\n newDraggableIndex = index(dragEl, options.draggable);\n pluginEvent('drop', this, {\n evt: evt\n });\n parentEl = dragEl && dragEl.parentNode;\n\n // Get again after plugin event\n newIndex = index(dragEl);\n newDraggableIndex = index(dragEl, options.draggable);\n if (Sortable.eventCanceled) {\n this._nulling();\n return;\n }\n awaitingDragStarted = false;\n isCircumstantialInvert = false;\n pastFirstInvertThresh = false;\n clearInterval(this._loopId);\n clearTimeout(this._dragStartTimer);\n _cancelNextTick(this.cloneId);\n _cancelNextTick(this._dragStartId);\n\n // Unbind events\n if (this.nativeDraggable) {\n off(document, 'drop', this);\n off(el, 'dragstart', this._onDragStart);\n }\n this._offMoveEvents();\n this._offUpEvents();\n if (Safari) {\n css(document.body, 'user-select', '');\n }\n css(dragEl, 'transform', '');\n if (evt) {\n if (moved) {\n evt.cancelable && evt.preventDefault();\n !options.dropBubble && evt.stopPropagation();\n }\n ghostEl && ghostEl.parentNode && ghostEl.parentNode.removeChild(ghostEl);\n if (rootEl === parentEl || putSortable && putSortable.lastPutMode !== 'clone') {\n // Remove clone(s)\n cloneEl && cloneEl.parentNode && cloneEl.parentNode.removeChild(cloneEl);\n }\n if (dragEl) {\n if (this.nativeDraggable) {\n off(dragEl, 'dragend', this);\n }\n _disableDraggable(dragEl);\n dragEl.style['will-change'] = '';\n\n // Remove classes\n // ghostClass is added in dragStarted\n if (moved && !awaitingDragStarted) {\n toggleClass(dragEl, putSortable ? putSortable.options.ghostClass : this.options.ghostClass, false);\n }\n toggleClass(dragEl, this.options.chosenClass, false);\n\n // Drag stop event\n _dispatchEvent({\n sortable: this,\n name: 'unchoose',\n toEl: parentEl,\n newIndex: null,\n newDraggableIndex: null,\n originalEvent: evt\n });\n if (rootEl !== parentEl) {\n if (newIndex >= 0) {\n // Add event\n _dispatchEvent({\n rootEl: parentEl,\n name: 'add',\n toEl: parentEl,\n fromEl: rootEl,\n originalEvent: evt\n });\n\n // Remove event\n _dispatchEvent({\n sortable: this,\n name: 'remove',\n toEl: parentEl,\n originalEvent: evt\n });\n\n // drag from one list and drop into another\n _dispatchEvent({\n rootEl: parentEl,\n name: 'sort',\n toEl: parentEl,\n fromEl: rootEl,\n originalEvent: evt\n });\n _dispatchEvent({\n sortable: this,\n name: 'sort',\n toEl: parentEl,\n originalEvent: evt\n });\n }\n putSortable && putSortable.save();\n } else {\n if (newIndex !== oldIndex) {\n if (newIndex >= 0) {\n // drag & drop within the same list\n _dispatchEvent({\n sortable: this,\n name: 'update',\n toEl: parentEl,\n originalEvent: evt\n });\n _dispatchEvent({\n sortable: this,\n name: 'sort',\n toEl: parentEl,\n originalEvent: evt\n });\n }\n }\n }\n if (Sortable.active) {\n /* jshint eqnull:true */\n if (newIndex == null || newIndex === -1) {\n newIndex = oldIndex;\n newDraggableIndex = oldDraggableIndex;\n }\n _dispatchEvent({\n sortable: this,\n name: 'end',\n toEl: parentEl,\n originalEvent: evt\n });\n\n // Save sorting\n this.save();\n }\n }\n }\n this._nulling();\n },\n _nulling: function _nulling() {\n pluginEvent('nulling', this);\n rootEl = dragEl = parentEl = ghostEl = nextEl = cloneEl = lastDownEl = cloneHidden = tapEvt = touchEvt = moved = newIndex = newDraggableIndex = oldIndex = oldDraggableIndex = lastTarget = lastDirection = putSortable = activeGroup = Sortable.dragged = Sortable.ghost = Sortable.clone = Sortable.active = null;\n savedInputChecked.forEach(function (el) {\n el.checked = true;\n });\n savedInputChecked.length = lastDx = lastDy = 0;\n },\n handleEvent: function handleEvent( /**Event*/evt) {\n switch (evt.type) {\n case 'drop':\n case 'dragend':\n this._onDrop(evt);\n break;\n case 'dragenter':\n case 'dragover':\n if (dragEl) {\n this._onDragOver(evt);\n _globalDragOver(evt);\n }\n break;\n case 'selectstart':\n evt.preventDefault();\n break;\n }\n },\n /**\r\n * Serializes the item into an array of string.\r\n * @returns {String[]}\r\n */\n toArray: function toArray() {\n var order = [],\n el,\n children = this.el.children,\n i = 0,\n n = children.length,\n options = this.options;\n for (; i < n; i++) {\n el = children[i];\n if (closest(el, options.draggable, this.el, false)) {\n order.push(el.getAttribute(options.dataIdAttr) || _generateId(el));\n }\n }\n return order;\n },\n /**\r\n * Sorts the elements according to the array.\r\n * @param {String[]} order order of the items\r\n */\n sort: function sort(order, useAnimation) {\n var items = {},\n rootEl = this.el;\n this.toArray().forEach(function (id, i) {\n var el = rootEl.children[i];\n if (closest(el, this.options.draggable, rootEl, false)) {\n items[id] = el;\n }\n }, this);\n useAnimation && this.captureAnimationState();\n order.forEach(function (id) {\n if (items[id]) {\n rootEl.removeChild(items[id]);\n rootEl.appendChild(items[id]);\n }\n });\n useAnimation && this.animateAll();\n },\n /**\r\n * Save the current sorting\r\n */\n save: function save() {\n var store = this.options.store;\n store && store.set && store.set(this);\n },\n /**\r\n * For each element in the set, get the first element that matches the selector by testing the element itself and traversing up through its ancestors in the DOM tree.\r\n * @param {HTMLElement} el\r\n * @param {String} [selector] default: `options.draggable`\r\n * @returns {HTMLElement|null}\r\n */\n closest: function closest$1(el, selector) {\n return closest(el, selector || this.options.draggable, this.el, false);\n },\n /**\r\n * Set/get option\r\n * @param {string} name\r\n * @param {*} [value]\r\n * @returns {*}\r\n */\n option: function option(name, value) {\n var options = this.options;\n if (value === void 0) {\n return options[name];\n } else {\n var modifiedValue = PluginManager.modifyOption(this, name, value);\n if (typeof modifiedValue !== 'undefined') {\n options[name] = modifiedValue;\n } else {\n options[name] = value;\n }\n if (name === 'group') {\n _prepareGroup(options);\n }\n }\n },\n /**\r\n * Destroy\r\n */\n destroy: function destroy() {\n pluginEvent('destroy', this);\n var el = this.el;\n el[expando] = null;\n off(el, 'mousedown', this._onTapStart);\n off(el, 'touchstart', this._onTapStart);\n off(el, 'pointerdown', this._onTapStart);\n if (this.nativeDraggable) {\n off(el, 'dragover', this);\n off(el, 'dragenter', this);\n }\n // Remove draggable attributes\n Array.prototype.forEach.call(el.querySelectorAll('[draggable]'), function (el) {\n el.removeAttribute('draggable');\n });\n this._onDrop();\n this._disableDelayedDragEvents();\n sortables.splice(sortables.indexOf(this.el), 1);\n this.el = el = null;\n },\n _hideClone: function _hideClone() {\n if (!cloneHidden) {\n pluginEvent('hideClone', this);\n if (Sortable.eventCanceled) return;\n css(cloneEl, 'display', 'none');\n if (this.options.removeCloneOnHide && cloneEl.parentNode) {\n cloneEl.parentNode.removeChild(cloneEl);\n }\n cloneHidden = true;\n }\n },\n _showClone: function _showClone(putSortable) {\n if (putSortable.lastPutMode !== 'clone') {\n this._hideClone();\n return;\n }\n if (cloneHidden) {\n pluginEvent('showClone', this);\n if (Sortable.eventCanceled) return;\n\n // show clone at dragEl or original position\n if (dragEl.parentNode == rootEl && !this.options.group.revertClone) {\n rootEl.insertBefore(cloneEl, dragEl);\n } else if (nextEl) {\n rootEl.insertBefore(cloneEl, nextEl);\n } else {\n rootEl.appendChild(cloneEl);\n }\n if (this.options.group.revertClone) {\n this.animate(dragEl, cloneEl);\n }\n css(cloneEl, 'display', '');\n cloneHidden = false;\n }\n }\n};\nfunction _globalDragOver( /**Event*/evt) {\n if (evt.dataTransfer) {\n evt.dataTransfer.dropEffect = 'move';\n }\n evt.cancelable && evt.preventDefault();\n}\nfunction _onMove(fromEl, toEl, dragEl, dragRect, targetEl, targetRect, originalEvent, willInsertAfter) {\n var evt,\n sortable = fromEl[expando],\n onMoveFn = sortable.options.onMove,\n retVal;\n // Support for new CustomEvent feature\n if (window.CustomEvent && !IE11OrLess && !Edge) {\n evt = new CustomEvent('move', {\n bubbles: true,\n cancelable: true\n });\n } else {\n evt = document.createEvent('Event');\n evt.initEvent('move', true, true);\n }\n evt.to = toEl;\n evt.from = fromEl;\n evt.dragged = dragEl;\n evt.draggedRect = dragRect;\n evt.related = targetEl || toEl;\n evt.relatedRect = targetRect || getRect(toEl);\n evt.willInsertAfter = willInsertAfter;\n evt.originalEvent = originalEvent;\n fromEl.dispatchEvent(evt);\n if (onMoveFn) {\n retVal = onMoveFn.call(sortable, evt, originalEvent);\n }\n return retVal;\n}\nfunction _disableDraggable(el) {\n el.draggable = false;\n}\nfunction _unsilent() {\n _silent = false;\n}\nfunction _ghostIsFirst(evt, vertical, sortable) {\n var firstElRect = getRect(getChild(sortable.el, 0, sortable.options, true));\n var childContainingRect = getChildContainingRectFromElement(sortable.el, sortable.options, ghostEl);\n var spacer = 10;\n return vertical ? evt.clientX < childContainingRect.left - spacer || evt.clientY < firstElRect.top && evt.clientX < firstElRect.right : evt.clientY < childContainingRect.top - spacer || evt.clientY < firstElRect.bottom && evt.clientX < firstElRect.left;\n}\nfunction _ghostIsLast(evt, vertical, sortable) {\n var lastElRect = getRect(lastChild(sortable.el, sortable.options.draggable));\n var childContainingRect = getChildContainingRectFromElement(sortable.el, sortable.options, ghostEl);\n var spacer = 10;\n return vertical ? evt.clientX > childContainingRect.right + spacer || evt.clientY > lastElRect.bottom && evt.clientX > lastElRect.left : evt.clientY > childContainingRect.bottom + spacer || evt.clientX > lastElRect.right && evt.clientY > lastElRect.top;\n}\nfunction _getSwapDirection(evt, target, targetRect, vertical, swapThreshold, invertedSwapThreshold, invertSwap, isLastTarget) {\n var mouseOnAxis = vertical ? evt.clientY : evt.clientX,\n targetLength = vertical ? targetRect.height : targetRect.width,\n targetS1 = vertical ? targetRect.top : targetRect.left,\n targetS2 = vertical ? targetRect.bottom : targetRect.right,\n invert = false;\n if (!invertSwap) {\n // Never invert or create dragEl shadow when target movemenet causes mouse to move past the end of regular swapThreshold\n if (isLastTarget && targetMoveDistance < targetLength * swapThreshold) {\n // multiplied only by swapThreshold because mouse will already be inside target by (1 - threshold) * targetLength / 2\n // check if past first invert threshold on side opposite of lastDirection\n if (!pastFirstInvertThresh && (lastDirection === 1 ? mouseOnAxis > targetS1 + targetLength * invertedSwapThreshold / 2 : mouseOnAxis < targetS2 - targetLength * invertedSwapThreshold / 2)) {\n // past first invert threshold, do not restrict inverted threshold to dragEl shadow\n pastFirstInvertThresh = true;\n }\n if (!pastFirstInvertThresh) {\n // dragEl shadow (target move distance shadow)\n if (lastDirection === 1 ? mouseOnAxis < targetS1 + targetMoveDistance // over dragEl shadow\n : mouseOnAxis > targetS2 - targetMoveDistance) {\n return -lastDirection;\n }\n } else {\n invert = true;\n }\n } else {\n // Regular\n if (mouseOnAxis > targetS1 + targetLength * (1 - swapThreshold) / 2 && mouseOnAxis < targetS2 - targetLength * (1 - swapThreshold) / 2) {\n return _getInsertDirection(target);\n }\n }\n }\n invert = invert || invertSwap;\n if (invert) {\n // Invert of regular\n if (mouseOnAxis < targetS1 + targetLength * invertedSwapThreshold / 2 || mouseOnAxis > targetS2 - targetLength * invertedSwapThreshold / 2) {\n return mouseOnAxis > targetS1 + targetLength / 2 ? 1 : -1;\n }\n }\n return 0;\n}\n\n/**\r\n * Gets the direction dragEl must be swapped relative to target in order to make it\r\n * seem that dragEl has been \"inserted\" into that element's position\r\n * @param {HTMLElement} target The target whose position dragEl is being inserted at\r\n * @return {Number} Direction dragEl must be swapped\r\n */\nfunction _getInsertDirection(target) {\n if (index(dragEl) < index(target)) {\n return 1;\n } else {\n return -1;\n }\n}\n\n/**\r\n * Generate id\r\n * @param {HTMLElement} el\r\n * @returns {String}\r\n * @private\r\n */\nfunction _generateId(el) {\n var str = el.tagName + el.className + el.src + el.href + el.textContent,\n i = str.length,\n sum = 0;\n while (i--) {\n sum += str.charCodeAt(i);\n }\n return sum.toString(36);\n}\nfunction _saveInputCheckedState(root) {\n savedInputChecked.length = 0;\n var inputs = root.getElementsByTagName('input');\n var idx = inputs.length;\n while (idx--) {\n var el = inputs[idx];\n el.checked && savedInputChecked.push(el);\n }\n}\nfunction _nextTick(fn) {\n return setTimeout(fn, 0);\n}\nfunction _cancelNextTick(id) {\n return clearTimeout(id);\n}\n\n// Fixed #973:\nif (documentExists) {\n on(document, 'touchmove', function (evt) {\n if ((Sortable.active || awaitingDragStarted) && evt.cancelable) {\n evt.preventDefault();\n }\n });\n}\n\n// Export utils\nSortable.utils = {\n on: on,\n off: off,\n css: css,\n find: find,\n is: function is(el, selector) {\n return !!closest(el, selector, el, false);\n },\n extend: extend,\n throttle: throttle,\n closest: closest,\n toggleClass: toggleClass,\n clone: clone,\n index: index,\n nextTick: _nextTick,\n cancelNextTick: _cancelNextTick,\n detectDirection: _detectDirection,\n getChild: getChild,\n expando: expando\n};\n\n/**\r\n * Get the Sortable instance of an element\r\n * @param {HTMLElement} element The element\r\n * @return {Sortable|undefined} The instance of Sortable\r\n */\nSortable.get = function (element) {\n return element[expando];\n};\n\n/**\r\n * Mount a plugin to Sortable\r\n * @param {...SortablePlugin|SortablePlugin[]} plugins Plugins being mounted\r\n */\nSortable.mount = function () {\n for (var _len = arguments.length, plugins = new Array(_len), _key = 0; _key < _len; _key++) {\n plugins[_key] = arguments[_key];\n }\n if (plugins[0].constructor === Array) plugins = plugins[0];\n plugins.forEach(function (plugin) {\n if (!plugin.prototype || !plugin.prototype.constructor) {\n throw \"Sortable: Mounted plugin must be a constructor function, not \".concat({}.toString.call(plugin));\n }\n if (plugin.utils) Sortable.utils = _objectSpread2(_objectSpread2({}, Sortable.utils), plugin.utils);\n PluginManager.mount(plugin);\n });\n};\n\n/**\r\n * Create sortable instance\r\n * @param {HTMLElement} el\r\n * @param {Object} [options]\r\n */\nSortable.create = function (el, options) {\n return new Sortable(el, options);\n};\n\n// Export\nSortable.version = version;\n\nvar autoScrolls = [],\n scrollEl,\n scrollRootEl,\n scrolling = false,\n lastAutoScrollX,\n lastAutoScrollY,\n touchEvt$1,\n pointerElemChangedInterval;\nfunction AutoScrollPlugin() {\n function AutoScroll() {\n this.defaults = {\n scroll: true,\n forceAutoScrollFallback: false,\n scrollSensitivity: 30,\n scrollSpeed: 10,\n bubbleScroll: true\n };\n\n // Bind all private methods\n for (var fn in this) {\n if (fn.charAt(0) === '_' && typeof this[fn] === 'function') {\n this[fn] = this[fn].bind(this);\n }\n }\n }\n AutoScroll.prototype = {\n dragStarted: function dragStarted(_ref) {\n var originalEvent = _ref.originalEvent;\n if (this.sortable.nativeDraggable) {\n on(document, 'dragover', this._handleAutoScroll);\n } else {\n if (this.options.supportPointer) {\n on(document, 'pointermove', this._handleFallbackAutoScroll);\n } else if (originalEvent.touches) {\n on(document, 'touchmove', this._handleFallbackAutoScroll);\n } else {\n on(document, 'mousemove', this._handleFallbackAutoScroll);\n }\n }\n },\n dragOverCompleted: function dragOverCompleted(_ref2) {\n var originalEvent = _ref2.originalEvent;\n // For when bubbling is canceled and using fallback (fallback 'touchmove' always reached)\n if (!this.options.dragOverBubble && !originalEvent.rootEl) {\n this._handleAutoScroll(originalEvent);\n }\n },\n drop: function drop() {\n if (this.sortable.nativeDraggable) {\n off(document, 'dragover', this._handleAutoScroll);\n } else {\n off(document, 'pointermove', this._handleFallbackAutoScroll);\n off(document, 'touchmove', this._handleFallbackAutoScroll);\n off(document, 'mousemove', this._handleFallbackAutoScroll);\n }\n clearPointerElemChangedInterval();\n clearAutoScrolls();\n cancelThrottle();\n },\n nulling: function nulling() {\n touchEvt$1 = scrollRootEl = scrollEl = scrolling = pointerElemChangedInterval = lastAutoScrollX = lastAutoScrollY = null;\n autoScrolls.length = 0;\n },\n _handleFallbackAutoScroll: function _handleFallbackAutoScroll(evt) {\n this._handleAutoScroll(evt, true);\n },\n _handleAutoScroll: function _handleAutoScroll(evt, fallback) {\n var _this = this;\n var x = (evt.touches ? evt.touches[0] : evt).clientX,\n y = (evt.touches ? evt.touches[0] : evt).clientY,\n elem = document.elementFromPoint(x, y);\n touchEvt$1 = evt;\n\n // IE does not seem to have native autoscroll,\n // Edge's autoscroll seems too conditional,\n // MACOS Safari does not have autoscroll,\n // Firefox and Chrome are good\n if (fallback || this.options.forceAutoScrollFallback || Edge || IE11OrLess || Safari) {\n autoScroll(evt, this.options, elem, fallback);\n\n // Listener for pointer element change\n var ogElemScroller = getParentAutoScrollElement(elem, true);\n if (scrolling && (!pointerElemChangedInterval || x !== lastAutoScrollX || y !== lastAutoScrollY)) {\n pointerElemChangedInterval && clearPointerElemChangedInterval();\n // Detect for pointer elem change, emulating native DnD behaviour\n pointerElemChangedInterval = setInterval(function () {\n var newElem = getParentAutoScrollElement(document.elementFromPoint(x, y), true);\n if (newElem !== ogElemScroller) {\n ogElemScroller = newElem;\n clearAutoScrolls();\n }\n autoScroll(evt, _this.options, newElem, fallback);\n }, 10);\n lastAutoScrollX = x;\n lastAutoScrollY = y;\n }\n } else {\n // if DnD is enabled (and browser has good autoscrolling), first autoscroll will already scroll, so get parent autoscroll of first autoscroll\n if (!this.options.bubbleScroll || getParentAutoScrollElement(elem, true) === getWindowScrollingElement()) {\n clearAutoScrolls();\n return;\n }\n autoScroll(evt, this.options, getParentAutoScrollElement(elem, false), false);\n }\n }\n };\n return _extends(AutoScroll, {\n pluginName: 'scroll',\n initializeByDefault: true\n });\n}\nfunction clearAutoScrolls() {\n autoScrolls.forEach(function (autoScroll) {\n clearInterval(autoScroll.pid);\n });\n autoScrolls = [];\n}\nfunction clearPointerElemChangedInterval() {\n clearInterval(pointerElemChangedInterval);\n}\nvar autoScroll = throttle(function (evt, options, rootEl, isFallback) {\n // Bug: https://bugzilla.mozilla.org/show_bug.cgi?id=505521\n if (!options.scroll) return;\n var x = (evt.touches ? evt.touches[0] : evt).clientX,\n y = (evt.touches ? evt.touches[0] : evt).clientY,\n sens = options.scrollSensitivity,\n speed = options.scrollSpeed,\n winScroller = getWindowScrollingElement();\n var scrollThisInstance = false,\n scrollCustomFn;\n\n // New scroll root, set scrollEl\n if (scrollRootEl !== rootEl) {\n scrollRootEl = rootEl;\n clearAutoScrolls();\n scrollEl = options.scroll;\n scrollCustomFn = options.scrollFn;\n if (scrollEl === true) {\n scrollEl = getParentAutoScrollElement(rootEl, true);\n }\n }\n var layersOut = 0;\n var currentParent = scrollEl;\n do {\n var el = currentParent,\n rect = getRect(el),\n top = rect.top,\n bottom = rect.bottom,\n left = rect.left,\n right = rect.right,\n width = rect.width,\n height = rect.height,\n canScrollX = void 0,\n canScrollY = void 0,\n scrollWidth = el.scrollWidth,\n scrollHeight = el.scrollHeight,\n elCSS = css(el),\n scrollPosX = el.scrollLeft,\n scrollPosY = el.scrollTop;\n if (el === winScroller) {\n canScrollX = width < scrollWidth && (elCSS.overflowX === 'auto' || elCSS.overflowX === 'scroll' || elCSS.overflowX === 'visible');\n canScrollY = height < scrollHeight && (elCSS.overflowY === 'auto' || elCSS.overflowY === 'scroll' || elCSS.overflowY === 'visible');\n } else {\n canScrollX = width < scrollWidth && (elCSS.overflowX === 'auto' || elCSS.overflowX === 'scroll');\n canScrollY = height < scrollHeight && (elCSS.overflowY === 'auto' || elCSS.overflowY === 'scroll');\n }\n var vx = canScrollX && (Math.abs(right - x) <= sens && scrollPosX + width < scrollWidth) - (Math.abs(left - x) <= sens && !!scrollPosX);\n var vy = canScrollY && (Math.abs(bottom - y) <= sens && scrollPosY + height < scrollHeight) - (Math.abs(top - y) <= sens && !!scrollPosY);\n if (!autoScrolls[layersOut]) {\n for (var i = 0; i <= layersOut; i++) {\n if (!autoScrolls[i]) {\n autoScrolls[i] = {};\n }\n }\n }\n if (autoScrolls[layersOut].vx != vx || autoScrolls[layersOut].vy != vy || autoScrolls[layersOut].el !== el) {\n autoScrolls[layersOut].el = el;\n autoScrolls[layersOut].vx = vx;\n autoScrolls[layersOut].vy = vy;\n clearInterval(autoScrolls[layersOut].pid);\n if (vx != 0 || vy != 0) {\n scrollThisInstance = true;\n /* jshint loopfunc:true */\n autoScrolls[layersOut].pid = setInterval(function () {\n // emulate drag over during autoscroll (fallback), emulating native DnD behaviour\n if (isFallback && this.layer === 0) {\n Sortable.active._onTouchMove(touchEvt$1); // To move ghost if it is positioned absolutely\n }\n var scrollOffsetY = autoScrolls[this.layer].vy ? autoScrolls[this.layer].vy * speed : 0;\n var scrollOffsetX = autoScrolls[this.layer].vx ? autoScrolls[this.layer].vx * speed : 0;\n if (typeof scrollCustomFn === 'function') {\n if (scrollCustomFn.call(Sortable.dragged.parentNode[expando], scrollOffsetX, scrollOffsetY, evt, touchEvt$1, autoScrolls[this.layer].el) !== 'continue') {\n return;\n }\n }\n scrollBy(autoScrolls[this.layer].el, scrollOffsetX, scrollOffsetY);\n }.bind({\n layer: layersOut\n }), 24);\n }\n }\n layersOut++;\n } while (options.bubbleScroll && currentParent !== winScroller && (currentParent = getParentAutoScrollElement(currentParent, false)));\n scrolling = scrollThisInstance; // in case another function catches scrolling as false in between when it is not\n}, 30);\n\nvar drop = function drop(_ref) {\n var originalEvent = _ref.originalEvent,\n putSortable = _ref.putSortable,\n dragEl = _ref.dragEl,\n activeSortable = _ref.activeSortable,\n dispatchSortableEvent = _ref.dispatchSortableEvent,\n hideGhostForTarget = _ref.hideGhostForTarget,\n unhideGhostForTarget = _ref.unhideGhostForTarget;\n if (!originalEvent) return;\n var toSortable = putSortable || activeSortable;\n hideGhostForTarget();\n var touch = originalEvent.changedTouches && originalEvent.changedTouches.length ? originalEvent.changedTouches[0] : originalEvent;\n var target = document.elementFromPoint(touch.clientX, touch.clientY);\n unhideGhostForTarget();\n if (toSortable && !toSortable.el.contains(target)) {\n dispatchSortableEvent('spill');\n this.onSpill({\n dragEl: dragEl,\n putSortable: putSortable\n });\n }\n};\nfunction Revert() {}\nRevert.prototype = {\n startIndex: null,\n dragStart: function dragStart(_ref2) {\n var oldDraggableIndex = _ref2.oldDraggableIndex;\n this.startIndex = oldDraggableIndex;\n },\n onSpill: function onSpill(_ref3) {\n var dragEl = _ref3.dragEl,\n putSortable = _ref3.putSortable;\n this.sortable.captureAnimationState();\n if (putSortable) {\n putSortable.captureAnimationState();\n }\n var nextSibling = getChild(this.sortable.el, this.startIndex, this.options);\n if (nextSibling) {\n this.sortable.el.insertBefore(dragEl, nextSibling);\n } else {\n this.sortable.el.appendChild(dragEl);\n }\n this.sortable.animateAll();\n if (putSortable) {\n putSortable.animateAll();\n }\n },\n drop: drop\n};\n_extends(Revert, {\n pluginName: 'revertOnSpill'\n});\nfunction Remove() {}\nRemove.prototype = {\n onSpill: function onSpill(_ref4) {\n var dragEl = _ref4.dragEl,\n putSortable = _ref4.putSortable;\n var parentSortable = putSortable || this.sortable;\n parentSortable.captureAnimationState();\n dragEl.parentNode && dragEl.parentNode.removeChild(dragEl);\n parentSortable.animateAll();\n },\n drop: drop\n};\n_extends(Remove, {\n pluginName: 'removeOnSpill'\n});\n\nvar lastSwapEl;\nfunction SwapPlugin() {\n function Swap() {\n this.defaults = {\n swapClass: 'sortable-swap-highlight'\n };\n }\n Swap.prototype = {\n dragStart: function dragStart(_ref) {\n var dragEl = _ref.dragEl;\n lastSwapEl = dragEl;\n },\n dragOverValid: function dragOverValid(_ref2) {\n var completed = _ref2.completed,\n target = _ref2.target,\n onMove = _ref2.onMove,\n activeSortable = _ref2.activeSortable,\n changed = _ref2.changed,\n cancel = _ref2.cancel;\n if (!activeSortable.options.swap) return;\n var el = this.sortable.el,\n options = this.options;\n if (target && target !== el) {\n var prevSwapEl = lastSwapEl;\n if (onMove(target) !== false) {\n toggleClass(target, options.swapClass, true);\n lastSwapEl = target;\n } else {\n lastSwapEl = null;\n }\n if (prevSwapEl && prevSwapEl !== lastSwapEl) {\n toggleClass(prevSwapEl, options.swapClass, false);\n }\n }\n changed();\n completed(true);\n cancel();\n },\n drop: function drop(_ref3) {\n var activeSortable = _ref3.activeSortable,\n putSortable = _ref3.putSortable,\n dragEl = _ref3.dragEl;\n var toSortable = putSortable || this.sortable;\n var options = this.options;\n lastSwapEl && toggleClass(lastSwapEl, options.swapClass, false);\n if (lastSwapEl && (options.swap || putSortable && putSortable.options.swap)) {\n if (dragEl !== lastSwapEl) {\n toSortable.captureAnimationState();\n if (toSortable !== activeSortable) activeSortable.captureAnimationState();\n swapNodes(dragEl, lastSwapEl);\n toSortable.animateAll();\n if (toSortable !== activeSortable) activeSortable.animateAll();\n }\n }\n },\n nulling: function nulling() {\n lastSwapEl = null;\n }\n };\n return _extends(Swap, {\n pluginName: 'swap',\n eventProperties: function eventProperties() {\n return {\n swapItem: lastSwapEl\n };\n }\n });\n}\nfunction swapNodes(n1, n2) {\n var p1 = n1.parentNode,\n p2 = n2.parentNode,\n i1,\n i2;\n if (!p1 || !p2 || p1.isEqualNode(n2) || p2.isEqualNode(n1)) return;\n i1 = index(n1);\n i2 = index(n2);\n if (p1.isEqualNode(p2) && i1 < i2) {\n i2++;\n }\n p1.insertBefore(n2, p1.children[i1]);\n p2.insertBefore(n1, p2.children[i2]);\n}\n\nvar multiDragElements = [],\n multiDragClones = [],\n lastMultiDragSelect,\n // for selection with modifier key down (SHIFT)\n multiDragSortable,\n initialFolding = false,\n // Initial multi-drag fold when drag started\n folding = false,\n // Folding any other time\n dragStarted = false,\n dragEl$1,\n clonesFromRect,\n clonesHidden;\nfunction MultiDragPlugin() {\n function MultiDrag(sortable) {\n // Bind all private methods\n for (var fn in this) {\n if (fn.charAt(0) === '_' && typeof this[fn] === 'function') {\n this[fn] = this[fn].bind(this);\n }\n }\n if (!sortable.options.avoidImplicitDeselect) {\n if (sortable.options.supportPointer) {\n on(document, 'pointerup', this._deselectMultiDrag);\n } else {\n on(document, 'mouseup', this._deselectMultiDrag);\n on(document, 'touchend', this._deselectMultiDrag);\n }\n }\n on(document, 'keydown', this._checkKeyDown);\n on(document, 'keyup', this._checkKeyUp);\n this.defaults = {\n selectedClass: 'sortable-selected',\n multiDragKey: null,\n avoidImplicitDeselect: false,\n setData: function setData(dataTransfer, dragEl) {\n var data = '';\n if (multiDragElements.length && multiDragSortable === sortable) {\n multiDragElements.forEach(function (multiDragElement, i) {\n data += (!i ? '' : ', ') + multiDragElement.textContent;\n });\n } else {\n data = dragEl.textContent;\n }\n dataTransfer.setData('Text', data);\n }\n };\n }\n MultiDrag.prototype = {\n multiDragKeyDown: false,\n isMultiDrag: false,\n delayStartGlobal: function delayStartGlobal(_ref) {\n var dragged = _ref.dragEl;\n dragEl$1 = dragged;\n },\n delayEnded: function delayEnded() {\n this.isMultiDrag = ~multiDragElements.indexOf(dragEl$1);\n },\n setupClone: function setupClone(_ref2) {\n var sortable = _ref2.sortable,\n cancel = _ref2.cancel;\n if (!this.isMultiDrag) return;\n for (var i = 0; i < multiDragElements.length; i++) {\n multiDragClones.push(clone(multiDragElements[i]));\n multiDragClones[i].sortableIndex = multiDragElements[i].sortableIndex;\n multiDragClones[i].draggable = false;\n multiDragClones[i].style['will-change'] = '';\n toggleClass(multiDragClones[i], this.options.selectedClass, false);\n multiDragElements[i] === dragEl$1 && toggleClass(multiDragClones[i], this.options.chosenClass, false);\n }\n sortable._hideClone();\n cancel();\n },\n clone: function clone(_ref3) {\n var sortable = _ref3.sortable,\n rootEl = _ref3.rootEl,\n dispatchSortableEvent = _ref3.dispatchSortableEvent,\n cancel = _ref3.cancel;\n if (!this.isMultiDrag) return;\n if (!this.options.removeCloneOnHide) {\n if (multiDragElements.length && multiDragSortable === sortable) {\n insertMultiDragClones(true, rootEl);\n dispatchSortableEvent('clone');\n cancel();\n }\n }\n },\n showClone: function showClone(_ref4) {\n var cloneNowShown = _ref4.cloneNowShown,\n rootEl = _ref4.rootEl,\n cancel = _ref4.cancel;\n if (!this.isMultiDrag) return;\n insertMultiDragClones(false, rootEl);\n multiDragClones.forEach(function (clone) {\n css(clone, 'display', '');\n });\n cloneNowShown();\n clonesHidden = false;\n cancel();\n },\n hideClone: function hideClone(_ref5) {\n var _this = this;\n var sortable = _ref5.sortable,\n cloneNowHidden = _ref5.cloneNowHidden,\n cancel = _ref5.cancel;\n if (!this.isMultiDrag) return;\n multiDragClones.forEach(function (clone) {\n css(clone, 'display', 'none');\n if (_this.options.removeCloneOnHide && clone.parentNode) {\n clone.parentNode.removeChild(clone);\n }\n });\n cloneNowHidden();\n clonesHidden = true;\n cancel();\n },\n dragStartGlobal: function dragStartGlobal(_ref6) {\n var sortable = _ref6.sortable;\n if (!this.isMultiDrag && multiDragSortable) {\n multiDragSortable.multiDrag._deselectMultiDrag();\n }\n multiDragElements.forEach(function (multiDragElement) {\n multiDragElement.sortableIndex = index(multiDragElement);\n });\n\n // Sort multi-drag elements\n multiDragElements = multiDragElements.sort(function (a, b) {\n return a.sortableIndex - b.sortableIndex;\n });\n dragStarted = true;\n },\n dragStarted: function dragStarted(_ref7) {\n var _this2 = this;\n var sortable = _ref7.sortable;\n if (!this.isMultiDrag) return;\n if (this.options.sort) {\n // Capture rects,\n // hide multi drag elements (by positioning them absolute),\n // set multi drag elements rects to dragRect,\n // show multi drag elements,\n // animate to rects,\n // unset rects & remove from DOM\n\n sortable.captureAnimationState();\n if (this.options.animation) {\n multiDragElements.forEach(function (multiDragElement) {\n if (multiDragElement === dragEl$1) return;\n css(multiDragElement, 'position', 'absolute');\n });\n var dragRect = getRect(dragEl$1, false, true, true);\n multiDragElements.forEach(function (multiDragElement) {\n if (multiDragElement === dragEl$1) return;\n setRect(multiDragElement, dragRect);\n });\n folding = true;\n initialFolding = true;\n }\n }\n sortable.animateAll(function () {\n folding = false;\n initialFolding = false;\n if (_this2.options.animation) {\n multiDragElements.forEach(function (multiDragElement) {\n unsetRect(multiDragElement);\n });\n }\n\n // Remove all auxiliary multidrag items from el, if sorting enabled\n if (_this2.options.sort) {\n removeMultiDragElements();\n }\n });\n },\n dragOver: function dragOver(_ref8) {\n var target = _ref8.target,\n completed = _ref8.completed,\n cancel = _ref8.cancel;\n if (folding && ~multiDragElements.indexOf(target)) {\n completed(false);\n cancel();\n }\n },\n revert: function revert(_ref9) {\n var fromSortable = _ref9.fromSortable,\n rootEl = _ref9.rootEl,\n sortable = _ref9.sortable,\n dragRect = _ref9.dragRect;\n if (multiDragElements.length > 1) {\n // Setup unfold animation\n multiDragElements.forEach(function (multiDragElement) {\n sortable.addAnimationState({\n target: multiDragElement,\n rect: folding ? getRect(multiDragElement) : dragRect\n });\n unsetRect(multiDragElement);\n multiDragElement.fromRect = dragRect;\n fromSortable.removeAnimationState(multiDragElement);\n });\n folding = false;\n insertMultiDragElements(!this.options.removeCloneOnHide, rootEl);\n }\n },\n dragOverCompleted: function dragOverCompleted(_ref10) {\n var sortable = _ref10.sortable,\n isOwner = _ref10.isOwner,\n insertion = _ref10.insertion,\n activeSortable = _ref10.activeSortable,\n parentEl = _ref10.parentEl,\n putSortable = _ref10.putSortable;\n var options = this.options;\n if (insertion) {\n // Clones must be hidden before folding animation to capture dragRectAbsolute properly\n if (isOwner) {\n activeSortable._hideClone();\n }\n initialFolding = false;\n // If leaving sort:false root, or already folding - Fold to new location\n if (options.animation && multiDragElements.length > 1 && (folding || !isOwner && !activeSortable.options.sort && !putSortable)) {\n // Fold: Set all multi drag elements's rects to dragEl's rect when multi-drag elements are invisible\n var dragRectAbsolute = getRect(dragEl$1, false, true, true);\n multiDragElements.forEach(function (multiDragElement) {\n if (multiDragElement === dragEl$1) return;\n setRect(multiDragElement, dragRectAbsolute);\n\n // Move element(s) to end of parentEl so that it does not interfere with multi-drag clones insertion if they are inserted\n // while folding, and so that we can capture them again because old sortable will no longer be fromSortable\n parentEl.appendChild(multiDragElement);\n });\n folding = true;\n }\n\n // Clones must be shown (and check to remove multi drags) after folding when interfering multiDragElements are moved out\n if (!isOwner) {\n // Only remove if not folding (folding will remove them anyways)\n if (!folding) {\n removeMultiDragElements();\n }\n if (multiDragElements.length > 1) {\n var clonesHiddenBefore = clonesHidden;\n activeSortable._showClone(sortable);\n\n // Unfold animation for clones if showing from hidden\n if (activeSortable.options.animation && !clonesHidden && clonesHiddenBefore) {\n multiDragClones.forEach(function (clone) {\n activeSortable.addAnimationState({\n target: clone,\n rect: clonesFromRect\n });\n clone.fromRect = clonesFromRect;\n clone.thisAnimationDuration = null;\n });\n }\n } else {\n activeSortable._showClone(sortable);\n }\n }\n }\n },\n dragOverAnimationCapture: function dragOverAnimationCapture(_ref11) {\n var dragRect = _ref11.dragRect,\n isOwner = _ref11.isOwner,\n activeSortable = _ref11.activeSortable;\n multiDragElements.forEach(function (multiDragElement) {\n multiDragElement.thisAnimationDuration = null;\n });\n if (activeSortable.options.animation && !isOwner && activeSortable.multiDrag.isMultiDrag) {\n clonesFromRect = _extends({}, dragRect);\n var dragMatrix = matrix(dragEl$1, true);\n clonesFromRect.top -= dragMatrix.f;\n clonesFromRect.left -= dragMatrix.e;\n }\n },\n dragOverAnimationComplete: function dragOverAnimationComplete() {\n if (folding) {\n folding = false;\n removeMultiDragElements();\n }\n },\n drop: function drop(_ref12) {\n var evt = _ref12.originalEvent,\n rootEl = _ref12.rootEl,\n parentEl = _ref12.parentEl,\n sortable = _ref12.sortable,\n dispatchSortableEvent = _ref12.dispatchSortableEvent,\n oldIndex = _ref12.oldIndex,\n putSortable = _ref12.putSortable;\n var toSortable = putSortable || this.sortable;\n if (!evt) return;\n var options = this.options,\n children = parentEl.children;\n\n // Multi-drag selection\n if (!dragStarted) {\n if (options.multiDragKey && !this.multiDragKeyDown) {\n this._deselectMultiDrag();\n }\n toggleClass(dragEl$1, options.selectedClass, !~multiDragElements.indexOf(dragEl$1));\n if (!~multiDragElements.indexOf(dragEl$1)) {\n multiDragElements.push(dragEl$1);\n dispatchEvent({\n sortable: sortable,\n rootEl: rootEl,\n name: 'select',\n targetEl: dragEl$1,\n originalEvent: evt\n });\n\n // Modifier activated, select from last to dragEl\n if (evt.shiftKey && lastMultiDragSelect && sortable.el.contains(lastMultiDragSelect)) {\n var lastIndex = index(lastMultiDragSelect),\n currentIndex = index(dragEl$1);\n if (~lastIndex && ~currentIndex && lastIndex !== currentIndex) {\n (function () {\n // Must include lastMultiDragSelect (select it), in case modified selection from no selection\n // (but previous selection existed)\n var n, i;\n if (currentIndex > lastIndex) {\n i = lastIndex;\n n = currentIndex;\n } else {\n i = currentIndex;\n n = lastIndex + 1;\n }\n var filter = options.filter;\n for (; i < n; i++) {\n if (~multiDragElements.indexOf(children[i])) continue;\n // Check if element is draggable\n if (!closest(children[i], options.draggable, parentEl, false)) continue;\n // Check if element is filtered\n var filtered = filter && (typeof filter === 'function' ? filter.call(sortable, evt, children[i], sortable) : filter.split(',').some(function (criteria) {\n return closest(children[i], criteria.trim(), parentEl, false);\n }));\n if (filtered) continue;\n toggleClass(children[i], options.selectedClass, true);\n multiDragElements.push(children[i]);\n dispatchEvent({\n sortable: sortable,\n rootEl: rootEl,\n name: 'select',\n targetEl: children[i],\n originalEvent: evt\n });\n }\n })();\n }\n } else {\n lastMultiDragSelect = dragEl$1;\n }\n multiDragSortable = toSortable;\n } else {\n multiDragElements.splice(multiDragElements.indexOf(dragEl$1), 1);\n lastMultiDragSelect = null;\n dispatchEvent({\n sortable: sortable,\n rootEl: rootEl,\n name: 'deselect',\n targetEl: dragEl$1,\n originalEvent: evt\n });\n }\n }\n\n // Multi-drag drop\n if (dragStarted && this.isMultiDrag) {\n folding = false;\n // Do not \"unfold\" after around dragEl if reverted\n if ((parentEl[expando].options.sort || parentEl !== rootEl) && multiDragElements.length > 1) {\n var dragRect = getRect(dragEl$1),\n multiDragIndex = index(dragEl$1, ':not(.' + this.options.selectedClass + ')');\n if (!initialFolding && options.animation) dragEl$1.thisAnimationDuration = null;\n toSortable.captureAnimationState();\n if (!initialFolding) {\n if (options.animation) {\n dragEl$1.fromRect = dragRect;\n multiDragElements.forEach(function (multiDragElement) {\n multiDragElement.thisAnimationDuration = null;\n if (multiDragElement !== dragEl$1) {\n var rect = folding ? getRect(multiDragElement) : dragRect;\n multiDragElement.fromRect = rect;\n\n // Prepare unfold animation\n toSortable.addAnimationState({\n target: multiDragElement,\n rect: rect\n });\n }\n });\n }\n\n // Multi drag elements are not necessarily removed from the DOM on drop, so to reinsert\n // properly they must all be removed\n removeMultiDragElements();\n multiDragElements.forEach(function (multiDragElement) {\n if (children[multiDragIndex]) {\n parentEl.insertBefore(multiDragElement, children[multiDragIndex]);\n } else {\n parentEl.appendChild(multiDragElement);\n }\n multiDragIndex++;\n });\n\n // If initial folding is done, the elements may have changed position because they are now\n // unfolding around dragEl, even though dragEl may not have his index changed, so update event\n // must be fired here as Sortable will not.\n if (oldIndex === index(dragEl$1)) {\n var update = false;\n multiDragElements.forEach(function (multiDragElement) {\n if (multiDragElement.sortableIndex !== index(multiDragElement)) {\n update = true;\n return;\n }\n });\n if (update) {\n dispatchSortableEvent('update');\n dispatchSortableEvent('sort');\n }\n }\n }\n\n // Must be done after capturing individual rects (scroll bar)\n multiDragElements.forEach(function (multiDragElement) {\n unsetRect(multiDragElement);\n });\n toSortable.animateAll();\n }\n multiDragSortable = toSortable;\n }\n\n // Remove clones if necessary\n if (rootEl === parentEl || putSortable && putSortable.lastPutMode !== 'clone') {\n multiDragClones.forEach(function (clone) {\n clone.parentNode && clone.parentNode.removeChild(clone);\n });\n }\n },\n nullingGlobal: function nullingGlobal() {\n this.isMultiDrag = dragStarted = false;\n multiDragClones.length = 0;\n },\n destroyGlobal: function destroyGlobal() {\n this._deselectMultiDrag();\n off(document, 'pointerup', this._deselectMultiDrag);\n off(document, 'mouseup', this._deselectMultiDrag);\n off(document, 'touchend', this._deselectMultiDrag);\n off(document, 'keydown', this._checkKeyDown);\n off(document, 'keyup', this._checkKeyUp);\n },\n _deselectMultiDrag: function _deselectMultiDrag(evt) {\n if (typeof dragStarted !== \"undefined\" && dragStarted) return;\n\n // Only deselect if selection is in this sortable\n if (multiDragSortable !== this.sortable) return;\n\n // Only deselect if target is not item in this sortable\n if (evt && closest(evt.target, this.options.draggable, this.sortable.el, false)) return;\n\n // Only deselect if left click\n if (evt && evt.button !== 0) return;\n while (multiDragElements.length) {\n var el = multiDragElements[0];\n toggleClass(el, this.options.selectedClass, false);\n multiDragElements.shift();\n dispatchEvent({\n sortable: this.sortable,\n rootEl: this.sortable.el,\n name: 'deselect',\n targetEl: el,\n originalEvent: evt\n });\n }\n },\n _checkKeyDown: function _checkKeyDown(evt) {\n if (evt.key === this.options.multiDragKey) {\n this.multiDragKeyDown = true;\n }\n },\n _checkKeyUp: function _checkKeyUp(evt) {\n if (evt.key === this.options.multiDragKey) {\n this.multiDragKeyDown = false;\n }\n }\n };\n return _extends(MultiDrag, {\n // Static methods & properties\n pluginName: 'multiDrag',\n utils: {\n /**\r\n * Selects the provided multi-drag item\r\n * @param {HTMLElement} el The element to be selected\r\n */\n select: function select(el) {\n var sortable = el.parentNode[expando];\n if (!sortable || !sortable.options.multiDrag || ~multiDragElements.indexOf(el)) return;\n if (multiDragSortable && multiDragSortable !== sortable) {\n multiDragSortable.multiDrag._deselectMultiDrag();\n multiDragSortable = sortable;\n }\n toggleClass(el, sortable.options.selectedClass, true);\n multiDragElements.push(el);\n },\n /**\r\n * Deselects the provided multi-drag item\r\n * @param {HTMLElement} el The element to be deselected\r\n */\n deselect: function deselect(el) {\n var sortable = el.parentNode[expando],\n index = multiDragElements.indexOf(el);\n if (!sortable || !sortable.options.multiDrag || !~index) return;\n toggleClass(el, sortable.options.selectedClass, false);\n multiDragElements.splice(index, 1);\n }\n },\n eventProperties: function eventProperties() {\n var _this3 = this;\n var oldIndicies = [],\n newIndicies = [];\n multiDragElements.forEach(function (multiDragElement) {\n oldIndicies.push({\n multiDragElement: multiDragElement,\n index: multiDragElement.sortableIndex\n });\n\n // multiDragElements will already be sorted if folding\n var newIndex;\n if (folding && multiDragElement !== dragEl$1) {\n newIndex = -1;\n } else if (folding) {\n newIndex = index(multiDragElement, ':not(.' + _this3.options.selectedClass + ')');\n } else {\n newIndex = index(multiDragElement);\n }\n newIndicies.push({\n multiDragElement: multiDragElement,\n index: newIndex\n });\n });\n return {\n items: _toConsumableArray(multiDragElements),\n clones: [].concat(multiDragClones),\n oldIndicies: oldIndicies,\n newIndicies: newIndicies\n };\n },\n optionListeners: {\n multiDragKey: function multiDragKey(key) {\n key = key.toLowerCase();\n if (key === 'ctrl') {\n key = 'Control';\n } else if (key.length > 1) {\n key = key.charAt(0).toUpperCase() + key.substr(1);\n }\n return key;\n }\n }\n });\n}\nfunction insertMultiDragElements(clonesInserted, rootEl) {\n multiDragElements.forEach(function (multiDragElement, i) {\n var target = rootEl.children[multiDragElement.sortableIndex + (clonesInserted ? Number(i) : 0)];\n if (target) {\n rootEl.insertBefore(multiDragElement, target);\n } else {\n rootEl.appendChild(multiDragElement);\n }\n });\n}\n\n/**\r\n * Insert multi-drag clones\r\n * @param {[Boolean]} elementsInserted Whether the multi-drag elements are inserted\r\n * @param {HTMLElement} rootEl\r\n */\nfunction insertMultiDragClones(elementsInserted, rootEl) {\n multiDragClones.forEach(function (clone, i) {\n var target = rootEl.children[clone.sortableIndex + (elementsInserted ? Number(i) : 0)];\n if (target) {\n rootEl.insertBefore(clone, target);\n } else {\n rootEl.appendChild(clone);\n }\n });\n}\nfunction removeMultiDragElements() {\n multiDragElements.forEach(function (multiDragElement) {\n if (multiDragElement === dragEl$1) return;\n multiDragElement.parentNode && multiDragElement.parentNode.removeChild(multiDragElement);\n });\n}\n\nSortable.mount(new AutoScrollPlugin());\nSortable.mount(Remove, Revert);\n\nexport default Sortable;\nexport { MultiDragPlugin as MultiDrag, Sortable, SwapPlugin as Swap };\n","import Sortable from 'sortablejs';\n\nexport default function formBuilder(activeLocale, locales, attributable_type) {\n return {\n activeLocale: activeLocale,\n locales: locales,\n attributable_type: attributable_type,\n activeFormField: '',\n sortable: null,\n dynAttrs: {},\n openConfirmationModal: false,\n openAdvanced: false,\n messageId: '',\n importCode: '',\n\n init() {\n // load and use relevant form field data\n document.querySelectorAll('.form-builder__settings-card').forEach((formField) => {\n const da = JSON.parse(formField.dataset.da);\n this.dynAttrs[da.id] = { count: da.count };\n\n if (da.required) {\n this.toggleRequired(da.id, true);\n }\n\n if (da.private) {\n this.togglePrivate(da.id, true);\n }\n });\n\n // initialize sortable\n this.sortable = new Sortable(formFieldList, {\n dataIdAttr: 'data-da-id',\n handle: '.form-card__header',\n filter: '.form-builder__header',\n group: 'list-group-item',\n onUpdate: () => this.updateSortable(),\n });\n\n // highlight first form field and style sortable arrows\n const firstFormField = document.querySelector('.form-builder__field-wrapper');\n if (firstFormField) {\n this.activateFormField(firstFormField.dataset.daId);\n this.hideFirstAndLastArrows();\n }\n\n // hide the spinner once everything is loaded\n this.$nextTick(() => {\n document.querySelectorAll('.loading-ring__wrapper').forEach((spinner) => {\n spinner.classList.add('hidden');\n });\n });\n },\n\n changeMarkerURL() {\n const marker = document.querySelector('gmp-advanced-marker');\n const image = marker.querySelector('img');\n image.src =\n this.$refs.markerURL.value ||\n 'https://bpart-default-assets.s3.eu-central-1.amazonaws.com/img/map-default-marker.png';\n },\n\n hasFormFields() {\n return Object.keys(this.dynAttrs).length > 0;\n },\n\n hasNoFormFields() {\n return !this.hasFormFields();\n },\n\n // ADDING FORM FIELDS\n\n showNewFieldSelector() {\n this.deactivateFormFields();\n this.activateSettingsField('formFieldSelector');\n },\n\n // Note(wh): New form fields are cloned from templates included in the DOM. These do not have an id.\n // For Alpine to identify these new form fields, we generate a unique temporary id when a new field is added.\n // When adding the form field to the DOM, Alpine will insert this temporary id where needed.\n // This id is also used to replace the child_indexes of the fields_for (named INDEX_TO_REPLACE), so Rails\n // will correctly identify the data for each new form field (e.g. topic[dynamic_attributes_attributes][child_index][sort_order]).\n\n addField(type, object) {\n let id = 1;\n if (Object.keys(this.dynAttrs).length > 0) {\n // To make sure that the new id (that will be used as a child index in the fields_for) does not overlap\n // with the existing child indexes, we multiply the highest existing id by 4\n id = Math.max(...Object.keys(this.dynAttrs)) * 4;\n }\n // We identify new form fields by a negative count, e.g. in this.isExistingFormField(id)\n this.dynAttrs[id] = { count: -1 };\n\n this.deactivateFormFields();\n\n this.addNewFormField(id, type, object);\n this.addNewSettingsField(id, type, object);\n\n const newFieldBottomButton = document.querySelector('#formFieldList');\n this.$nextTick(() => newFieldBottomButton?.scrollIntoView({ block: 'end', behavior: 'smooth' }));\n },\n\n addNewFormField(id, type, object) {\n const formFieldTemplate = document.getElementById(`new_${type}_field`);\n const newFormField = formFieldTemplate.content.firstElementChild.cloneNode(true);\n const formFieldList = document.getElementById('formFieldList');\n formFieldList.appendChild(newFormField);\n\n this.initialiseFormField(newFormField, id, type, object);\n\n this.activateFormField(newFormField.dataset.daId);\n\n this.updateSortable();\n },\n\n addNewSettingsField(id, type, object) {\n const formSettingsTemplate = document.getElementById(`new_settings_${type}_field`);\n const newSettingsField = formSettingsTemplate.content.firstElementChild.cloneNode(true);\n const formFieldSettings = document.getElementById('formFieldSettingsList');\n formFieldSettings.appendChild(newSettingsField);\n\n this.initialiseSettingsField(newSettingsField, id, type, object);\n },\n\n initialiseFormField(formField, id, type, object) {\n formField.dataset.daId = id;\n\n const formFieldHeader = formField.querySelector('.form-card');\n formFieldHeader.setAttribute('x-bind:class', `activeFormField === '${id}' ? 'form-card--active' : ''`);\n\n const formFieldHeaderDelete = formFieldHeader.querySelector('.form-card__delete-button');\n formFieldHeaderDelete.setAttribute('x-on:click', `deleteFormField('${id}')`);\n\n const sortOrderInput = formField.querySelector('input[x-ref=\"sortOrder_\"]');\n sortOrderInput.setAttribute('x-ref', `sortOrder_${id}`);\n sortOrderInput.setAttribute('value', id);\n\n formField.querySelectorAll('input, textarea').forEach((input) => {\n const regex = /INDEX_TO_REPLACE/;\n input.name = input.name.replace(regex, id);\n input.id = input.id.replace(regex, id);\n });\n\n if (['checkboxes', 'radio', 'select'].includes(type)) {\n this.initialiseOptions(formField, id);\n }\n\n if (object) this.useImportedFields(formField, id, object);\n },\n\n useImportedFields(formField, id, object) {\n locales.forEach((locale) => {\n const formFieldForLocale = formField.querySelector(`.form-field[x-show=\"activeLocale === '${locale}'\"]`);\n const name = formFieldForLocale.querySelector('input.form-card__name');\n name.value = object.name[locale];\n if (['text', 'string'].includes(object.attributeType)) {\n const placeholder = formFieldForLocale.querySelector('textarea.form-card__placeholder');\n placeholder.innerHTML = object.placeholder[locale];\n } else if (['item', 'attachment', 'map'].includes(object.attributeType)) {\n const placeholder = formFieldForLocale.querySelector(\n `#${this.attributable_type}_dynamic_attributes_attributes_${id}_placeholder_${locale}`\n );\n placeholder.value = object.placeholder[locale];\n } else if (['checkboxes', 'radio', 'select'].includes(object.attributeType)) {\n // remove the default options\n [0, 1, 2].forEach((index) => {\n const optionForLocale = formFieldForLocale.querySelector(`.option__${index}`);\n optionForLocale.remove();\n });\n\n // add the imported options value to the hidden input field\n const optionsInputForLocale = formFieldForLocale.querySelector(`#optionsInput_${locale}_${id}`);\n optionsInputForLocale.value = object.options[locale]?.join('\\r\\n');\n\n // add a visual representation for each imported option\n object.options[locale].forEach((option, index) => {\n const optionTemplate = formFieldForLocale.querySelector(`#newOption_${id}_${locale}`);\n const newOption = optionTemplate.content.firstElementChild.cloneNode(true);\n newOption.classList.add(`option_${id}_${index}`);\n newOption.querySelector('.form-card__option').value = option;\n newOption.querySelector('.form-card__option').addEventListener('change', () => this.changeOptions(id));\n newOption\n .querySelector('.form-card__delete-option')\n .addEventListener('click', () => this.removeOption(id, index));\n formFieldForLocale.appendChild(newOption);\n });\n }\n });\n },\n\n initialiseOptions(formField, id) {\n formField.querySelector('.button--outline').addEventListener('click', () => this.addOption(id));\n // adapting the x-show attribute to the new id causes Alpine to throw an error in console, so we replace it by an x-bind:class toggling hidden;\n formField.querySelector(`.form-card__add-option`).removeAttribute('x-show');\n formField\n .querySelector(`.form-card__add-option`)\n .setAttribute('x-bind:class', `activeFormField === '${id}' ? '' : 'hidden'`);\n\n this.locales.forEach((locale) => {\n const optionsInputForLocale = formField.querySelector(`#optionsInput_${locale}_`);\n optionsInputForLocale.setAttribute('id', `optionsInput_${locale}_${id}`);\n\n const newOptionForLocale = optionsInputForLocale.parentNode.querySelector(`#newOption__${locale}`);\n newOptionForLocale.setAttribute('id', `newOption_${id}_${locale}`);\n\n // A new checkboxes, radio or select field always starts with 3 options\n [0, 1, 2].forEach((index) => {\n const optionForLocale = optionsInputForLocale.parentNode.querySelector(`.option__${index}`);\n if (optionForLocale) {\n optionForLocale.classList.add(`option_${id}_${index}`);\n optionForLocale\n .querySelector('.form-card__option')\n .addEventListener('change', () => this.changeOptions(id));\n optionForLocale\n .querySelector('.form-card__delete-option')\n .addEventListener('click', () => this.removeOption(id, index));\n }\n });\n });\n },\n\n initialiseSettingsField(settingsField, id, type, object) {\n settingsField.dataset.daId = id;\n\n settingsField.querySelectorAll('input').forEach((input) => {\n const regex = /INDEX_TO_REPLACE/;\n input.name = input.name.replace(regex, id);\n input.id = input.id.replace(regex, id);\n });\n // adapting the x-show attribute to the new id causes Alpine to throw an error in console, so we replace it by an x-bind:class toggling hidden;\n settingsField.removeAttribute('x-show');\n settingsField.setAttribute('x-bind:class', `activeFormField === '${id}' ? '' : 'hidden'`);\n\n const requiredField = settingsField\n .querySelector(`.${this.attributable_type}_dynamic_required`)\n .querySelector('input[type=\"checkbox\"]');\n requiredField.addEventListener('click', () => this.toggleRequired(id, requiredField.checked));\n const privateField = settingsField\n .querySelector(`.${this.attributable_type}_dynamic_private`)\n .querySelector('input[type=\"checkbox\"]');\n privateField.addEventListener('click', () => this.togglePrivate(id, privateField.checked));\n\n if (['text', 'string'].includes(type)) {\n const maxCharsField = settingsField\n .querySelector(`.${this.attributable_type}_dynamic_maxlength`)\n .querySelector('input[type=\"number\"]');\n maxCharsField.addEventListener('change', () => this.changeMaxChars(id, maxCharsField.value));\n }\n\n if (object) this.useImportedSettings(settingsField, id, object);\n },\n\n useImportedSettings(settingsField, id, object) {\n const internal_name = settingsField.querySelector(\n `#${this.attributable_type}_dynamic_attributes_attributes_${id}_internal_name`\n );\n internal_name.value = object.internalName;\n const requiredCheckbox = settingsField.querySelector(\n `#${this.attributable_type}_dynamic_attributes_attributes_${id}_required`\n );\n requiredCheckbox.checked = object.required;\n const privateCheckbox = settingsField.querySelector(\n `#${this.attributable_type}_dynamic_attributes_attributes_${id}_private`\n );\n privateCheckbox.checked = object.private;\n\n if (['text', 'string'].includes(object.attributeType)) {\n const maxChars = settingsField.querySelector(\n `#${this.attributable_type}_dynamic_attributes_attributes_${id}_maxlength`\n );\n maxChars.value = object.maxlength;\n this.changeMaxChars(id, object.maxlength);\n } else if (object.attributeType === 'map') {\n const customMarkerUrl = settingsField.querySelector(\n `#${this.attributable_type}_dynamic_attributes_attributes_${id}_custom_marker_url`\n );\n customMarkerUrl.value = object.customMarkerUrl;\n }\n },\n\n // SORTING FORM FIELDS\n\n updateSortable() {\n const sortableArray = this.sortable.toArray();\n sortableArray.forEach((id, index) => {\n if (this.$refs[`sortOrder_${id}`]) {\n this.$refs[`sortOrder_${id}`].value = index + 1;\n }\n });\n\n this.hideFirstAndLastArrows();\n },\n\n moveFormField(direction) {\n const currentFormField = this.$el.closest('.form-builder__field-wrapper'); // the form field we clicked on\n const otherFormField = this.findOtherFormField(currentFormField, direction); // the form field to swap with\n\n if (otherFormField === null) return;\n\n switch (direction) {\n case 'up':\n currentFormField.parentNode.insertBefore(currentFormField, otherFormField);\n break;\n case 'down':\n currentFormField.parentNode.insertBefore(otherFormField, currentFormField);\n break;\n }\n\n this.updateSortable();\n },\n\n hideFirstAndLastArrows() {\n document.querySelectorAll('.form-builder__arrow--inactive')?.forEach((arrow) => {\n arrow.classList.remove('form-builder__arrow--inactive');\n });\n\n const cards = document.querySelectorAll('.form-builder__field-wrapper');\n\n if (cards.length > 0) {\n const firstCard = cards[0];\n const firstArrow = firstCard.querySelector('.form-builder__arrow.up');\n firstArrow.classList.add('form-builder__arrow--inactive');\n\n const lastCard = cards[cards.length - 1];\n const lastArrow = lastCard.querySelector('.form-builder__arrow.down');\n lastArrow.classList.add('form-builder__arrow--inactive');\n }\n },\n\n // Recursive function because there are hidden input fields on the same level as currentFormField that we need to skip\n findOtherFormField(currentFormField, direction) {\n const otherFormField =\n direction === 'down' ? currentFormField.nextElementSibling : currentFormField.previousElementSibling;\n\n if (otherFormField === null || otherFormField.classList.contains('form-builder__field-wrapper')) {\n return otherFormField;\n } else {\n return this.findOtherFormField(otherFormField, direction);\n }\n },\n\n // DELETING FORM FIELDS\n\n confirmFormFieldDeletion(id) {\n if (id && this.dynAttrs[id].count > 0) {\n this.messageId = id;\n this.openConfirmationModal = true;\n } else {\n this.deleteFormField(id);\n }\n },\n\n deleteFormField(id, viaConfirmation = false) {\n // If confirmed via the modal, we hide the confirmation message and close the modal\n if (viaConfirmation) {\n this.messageId = '';\n this.openConfirmationModal = false;\n }\n\n // for an existing form field: hide and flag for destruction,\n // for a new form field: remove from the DOM\n if (this.isExistingFormField(id)) {\n this.$refs[`destroy_${id}`].value = true;\n\n // Hide the form field\n const formField = document.querySelector(`.form-builder__field-wrapper[data-da-id=\"${id}\"]`);\n formField.classList.add('hidden');\n\n // Hide the settings card\n const formFieldSettings = document.querySelector(\n `.form-builder__settings-card[x-show=\"activeFormField === '${id}'\"]`\n );\n formFieldSettings.classList.add('hidden');\n } else {\n id ||= this.$el.closest('.form-builder__field-wrapper').dataset.daId;\n document.querySelector(`.form-builder__field-wrapper[data-da-id=\"${id}\"]`).remove();\n document.querySelector(`.form-builder__settings-card[data-da-id=\"${id}\"]`).remove();\n }\n\n delete this.dynAttrs[id];\n this.hideFirstAndLastArrows();\n },\n\n isExistingFormField(id) {\n return this.dynAttrs[id].count >= 0;\n },\n\n // SETTING CORRECT STYLING FOR (ACTIVE) FORM FIELDS\n\n activateFormField(id) {\n this.activeFormField = id.toString();\n this.closeSummary();\n },\n\n deactivateFormFields() {\n this.activeFormField = '';\n },\n\n activateSettingsField(id) {\n this.activeFormField = id.toString();\n },\n\n closeSummary() {\n document.querySelector('.form-builder__header--settings').removeAttribute('open');\n },\n\n toggleRequired(id, boolean) {\n const formField = document.querySelector(`.form-builder__field-wrapper[data-da-id=\"${id}\"]`);\n if (boolean) {\n formField.querySelectorAll('.form-card__required').forEach((formField) => {\n formField.classList.remove('hidden');\n });\n } else {\n formField.querySelectorAll('.form-card__required').forEach((formField) => {\n formField.classList.add('hidden');\n });\n }\n },\n\n togglePrivate(id, boolean) {\n const formField = document.querySelector(`.form-builder__field-wrapper[data-da-id=\"${id}\"]`);\n if (boolean) {\n formField.querySelectorAll('.form-card__hint').forEach((formField) => {\n formField.classList.remove('hidden');\n });\n } else {\n formField.querySelectorAll('.form-card__hint').forEach((formField) => {\n formField.classList.add('hidden');\n });\n }\n },\n\n changeMaxChars(id, value) {\n const formField = document.querySelector(`.form-builder__field-wrapper[data-da-id=\"${id}\"]`);\n if (value === '' || value === '0') {\n formField.querySelector('.form-card__max-chars').textContent = '';\n } else {\n formField.querySelector('.form-card__max-chars').textContent = `0/${value}`;\n }\n },\n\n // INTERACT WITH FORM FIELD OPTIONS (for checkboxes, radio buttons and select)\n\n addOption(id) {\n this.locales.forEach((locale) => {\n const formField = document.querySelector(`#optionsInput_${locale}_${id}`);\n const newIndex = formField.parentNode.querySelectorAll('.form-card__option').length;\n const optionTemplate = document.querySelector(`#newOption_${id}_${locale}`);\n const newOption = optionTemplate.content.firstElementChild.cloneNode(true);\n\n newOption.classList.add(`option_${id}_${newIndex}`);\n newOption.querySelector('.form-card__option').addEventListener('change', () => this.changeOptions(id));\n newOption\n .querySelector('.form-card__delete-option')\n .addEventListener('click', () => this.removeOption(id, newIndex));\n\n formField.parentNode.insertBefore(newOption, optionTemplate);\n this.changeOptions(id);\n });\n },\n\n removeOption(id, index) {\n Array.from(document.querySelectorAll(`.option_${id}_${index}`)).forEach((field) => {\n field.remove();\n });\n this.changeOptions(id);\n },\n\n changeOptions(id) {\n this.locales.forEach((locale) => {\n const formFieldOptionsInput = document.querySelector(`#optionsInput_${locale}_${id}`);\n const formFieldOptions = formFieldOptionsInput.parentNode.querySelectorAll('.form-card__option');\n let options = [];\n formFieldOptions.forEach((field) => {\n options.push(field.value);\n });\n formFieldOptionsInput.value = options.join('\\r\\n');\n });\n },\n\n // COPY/PASTE FORM CODE\n\n async copyFormCode() {\n const url = window.location.href.replace('edit_form', 'dynamic_attributes.json');\n const request = new Request(url);\n const response = await fetch(request);\n const data = await response.json();\n const da = JSON.stringify(data.data.dynamicAttributes, null, '\\t');\n window.navigator.clipboard.writeText(da);\n this.showMessage('copy_success');\n this.openAdvanced = false;\n },\n\n importFormCode() {\n try {\n // raise error if current form has linked entry values\n Object.values(this.dynAttrs).every((v) => {\n if (v.count > 0) {\n throw 'cant_override';\n }\n });\n\n // parse import string into JSON (and raise error if not correct syntax)\n const code = JSON.parse(this.importCode);\n\n // remove the existing form fields\n Object.keys(this.dynAttrs).forEach((key) => {\n this.deleteFormField(key);\n });\n\n // build the form fields\n code.forEach((field) => {\n this.addField(field.attributeType, field);\n });\n\n this.showMessage('import_successful');\n } catch (e) {\n if (e instanceof SyntaxError) {\n this.showMessage('your_input_seems_incorrect');\n } else if (e === 'cant_override') {\n this.showMessage('cant_override');\n }\n } finally {\n this.openAdvanced = false;\n }\n },\n\n showMessage(type) {\n const messageTemplate = document.getElementById(type);\n const newMessage = messageTemplate.content.firstElementChild.cloneNode(true);\n document.body.prepend(newMessage);\n },\n\n cardsWrapper: {\n ['@click'](event) {\n // We only want to trigger a change when clicking on a form field\n const formField = event.target.closest('.form-builder__field-wrapper');\n if (formField) {\n this.deactivateFormFields();\n this.activateFormField(formField.dataset.daId);\n formField.scrollIntoView({ block: 'center', behavior: 'smooth' });\n }\n },\n },\n\n formField: {\n ['x-transition:enter']() {\n return 'transition ease-out duration-100';\n },\n ['x-transition:enter-start']() {\n return 'transform opacity-0';\n },\n ['x-transition:enter-end']() {\n return 'transform opacity-100';\n },\n ['x-transition:leave']() {\n return 'transition ease-in duration-75';\n },\n ['x-transition:leave-start']() {\n return 'transform opacity-100';\n },\n ['x-transition:leave-end']() {\n return 'transform opacity-0';\n },\n },\n };\n}\n","// NOTE(Robbe): For some reason this markers reference can't be kept inside Alpine's state\n// If we keep track of the markers within Alpine, the old markers don't disappear on setMap(null)\nconst searchResultMarkers = [];\n\nexport default function googleMapsAdmin(\n originLatLng,\n mapParams,\n id,\n isProjectSettingsPage = false,\n noInteraction = false\n) {\n const mapSettings = mapParams.mapSettings;\n const mapOverlay = mapParams.mapOverlay;\n\n return {\n originLat: originLatLng.originLat,\n originLng: originLatLng.originLng,\n zoomLevel: mapSettings.zoomLevel,\n markerURL:\n mapParams.markerUrl || 'https://bpart-default-assets.s3.eu-central-1.amazonaws.com/img/map-default-marker.png',\n overlayURL: mapOverlay.mapOverlayImageUrl,\n geoJson: mapParams.geoJson,\n showOverlay: mapOverlay.mapOverlayVisible,\n mapType: mapSettings.mapType || 'roadmap',\n showImageError: false,\n showGeoJsonError: false,\n overlayCoords: {\n north: mapOverlay.overlayBoundNorth,\n south: mapOverlay.overlayBoundSouth,\n east: mapOverlay.overlayBoundEast,\n west: mapOverlay.overlayBoundWest,\n },\n groundOverlay: null,\n open: false,\n latInput: this.$refs.latInput,\n lngInput: this.$refs.lngInput,\n map: null,\n\n init() {\n // Initialize the map (asynchronously)\n this.initMap();\n\n // If noInteraction is set to true, we don't want to watch for changes\n if (noInteraction) return;\n\n // Watch for changes in the overlay visibility\n this.$watch('showOverlay', () => {\n this.renderOverlays(this.map);\n });\n this.$watch('overlayCoords', () => {\n if (this.overlayURL) {\n this.removeOverlayImage();\n this.renderOverlayImage(this.map);\n }\n });\n\n // Since deleting an overlay image triggers a turbo-frame render,\n // we listen to this event to remove the overlay image\n const turboFrame = this.$el.querySelector('turbo-frame');\n if (turboFrame) {\n turboFrame.addEventListener('turbo:before-frame-render', (e) => {\n if (this.overlayURL) {\n this.removeOverlayImage();\n }\n });\n }\n },\n\n async initMap() {\n // Load the Google Maps API libraries\n const { Map } = await google.maps.importLibrary('maps');\n const { AdvancedMarkerElement } = await google.maps.importLibrary('marker');\n const { Autocomplete } = await google.maps.importLibrary('places');\n\n // add noInteraction boolen to change what is loaded\n const lat = this.latInput?.value || this.originLat;\n const lng = this.lngInput?.value || this.originLng;\n const mapOptions = {\n zoom: this.zoomLevel || 14,\n center: { lat: parseFloat(lat), lng: parseFloat(lng) },\n mapTypeId: this.mapType,\n disableDefaultUI: noInteraction,\n mapTypeControl: !noInteraction,\n mapTypeControlOptions: {\n style: google.maps.MapTypeControlStyle.DROPDOWN_MENU,\n },\n gestureHandling: 'cooperative',\n mapId: id,\n };\n\n // Create the map\n let map = new Map(this.$refs.map, mapOptions);\n this.map = map;\n\n // Add a search box\n if (this.$refs.searchBox) {\n const placeAutocomplete = new Autocomplete(this.$refs.searchBox);\n\n placeAutocomplete.addListener('place_changed', async (ev) => {\n let value = this.$refs.searchBox.value;\n await this.findPlaces(value, map, AdvancedMarkerElement);\n });\n }\n\n // Add a listener to update the zoom level input unless noInteraction is set to true\n if (!noInteraction) {\n google.maps.event.addListener(map, 'zoom_changed', () => {\n if (this.$refs.mapZoom) this.$refs.mapZoom.value = map.zoom;\n });\n }\n\n // Add a marker when noInteraction is true\n if (noInteraction) {\n const icon = document.createElement('img');\n icon.src = this.markerURL;\n\n const markerLatLng = new google.maps.LatLng(lat, lng);\n\n const marker = new AdvancedMarkerElement({\n map: map,\n position: markerLatLng,\n content: icon,\n gmpDraggable: false,\n });\n\n map.setCenter(markerLatLng);\n }\n\n // Add a clickable or draggable marker to input a location (for entry or profile)\n // Draggable markers can be moved by using the keyboard. To activate dragging,\n // press Option + Space or Option + Enter (Mac), ALT + Space or Alt + Enter (Windows).\n if (this.latInput && this.lngInput) {\n const icon = document.createElement('img');\n icon.src = this.markerURL;\n\n const markerLatLng = new google.maps.LatLng(lat, lng);\n\n const marker = new AdvancedMarkerElement({\n map: map,\n position: markerLatLng,\n content: icon,\n gmpDraggable: true,\n });\n\n map.setCenter(markerLatLng);\n\n if (!noInteraction) {\n map.addListener('click', (mapsMouseEvent) => {\n const mapPosition = mapsMouseEvent.latLng;\n this.latInput.setAttribute('value', mapPosition.lat());\n this.lngInput.setAttribute('value', mapPosition.lng());\n marker.position = mapPosition;\n });\n\n marker.addListener('dragend', (evt) => {\n const markerPosition = marker.position;\n this.latInput.setAttribute('value', markerPosition.lat);\n this.lngInput.setAttribute('value', markerPosition.lng);\n });\n }\n }\n\n // Add the overlay and geoJson to the map\n this.renderOverlays(map);\n },\n\n renderOverlays(map) {\n if (google && ((isProjectSettingsPage && this.showOverlay) || !isProjectSettingsPage)) {\n if (this.overlayURL) this.renderOverlayImage(map);\n if (this.geoJson) this.renderGeoJson(map);\n } else {\n this.removeOverlayImage();\n this.removeGeoJson();\n }\n },\n\n // Overlay Image\n\n setOverlayImageURL(url) {\n if (url) {\n this.overlayURL = url;\n } else {\n this.overlayURL = this.$el.files[0] ? URL.createObjectURL(this.$el.files[0]) : '';\n }\n },\n\n renderOverlayImage(map) {\n //Extend the Overlay class so we can add a ground overlay to the map\n class MapOverlay extends google.maps.OverlayView {\n constructor(bounds, image) {\n super();\n this.bounds = bounds;\n this.image = image;\n }\n // onAdd is called when the map's panes are ready and the overlay has been added to the map.\n onAdd() {\n this.div = document.createElement('div');\n this.div.style.borderStyle = 'none';\n this.div.style.borderWidth = '0px';\n this.div.style.position = 'absolute';\n // Create the img element and attach it to the div.\n const img = document.createElement('img');\n img.src = this.image;\n img.style.width = '100%';\n img.style.height = '100%';\n img.style.position = 'absolute';\n this.div.appendChild(img);\n // Add the element to the \"overlayLayer\" pane.\n const panes = this.getPanes();\n panes.overlayLayer.appendChild(this.div);\n }\n draw() {\n // We use the south-west and north-east coordinates of the overlay to peg it to the correct position and size.\n // To do this, we need to retrieve the projection from the overlay.\n const overlayProjection = this.getProjection();\n // Retrieve the south-west and north-east coordinates of this overlay in LatLngs and convert them to pixel coordinates.\n // We'll use these coordinates to resize the div.\n const sw = overlayProjection.fromLatLngToDivPixel(this.bounds.getSouthWest());\n const ne = overlayProjection.fromLatLngToDivPixel(this.bounds.getNorthEast());\n\n // Resize the image's div to fit the indicated dimensions.\n if (this.div) {\n this.div.style.left = sw.x + 'px';\n this.div.style.top = ne.y + 'px';\n this.div.style.width = ne.x - sw.x + 'px';\n this.div.style.height = sw.y - ne.y + 'px';\n }\n }\n // The onRemove() method will be called automatically from the API if we ever set the overlay's map property to 'null'.\n onRemove() {\n if (this.div) {\n this.div.parentNode.removeChild(this.div);\n delete this.div;\n }\n }\n }\n if (checkOverlayValidity(this.overlayBounds(), this.overlayURL)) {\n this.showImageError = false;\n if (!google || !this.$refs.map) return;\n\n this.groundOverlay = new MapOverlay(this.overlayBounds(), this.overlayURL);\n this.groundOverlay.setMap(map);\n } else {\n this.showImageError = true;\n }\n },\n\n overlayBounds() {\n const overlayNorth = parseFloat(this.overlayCoords.north);\n const overlaySouth = parseFloat(this.overlayCoords.south);\n const overlayEast = parseFloat(this.overlayCoords.east);\n const overlayWest = parseFloat(this.overlayCoords.west);\n\n const bounds = new google.maps.LatLngBounds(\n new google.maps.LatLng(overlaySouth, overlayWest),\n new google.maps.LatLng(overlayNorth, overlayEast)\n );\n return bounds;\n },\n\n previewOverlayImage(url = null) {\n this.removeOverlayImage();\n this.setOverlayImageURL(url);\n if (this.overlayURL) this.renderOverlayImage(this.map);\n },\n\n removeOverlayImage() {\n this.groundOverlay && this.groundOverlay.setMap(null);\n },\n\n // GeoJSON\n\n setGeoJson() {\n const file = this.$el.files[0];\n if (file) {\n const reader = new FileReader();\n reader.readAsText(file);\n reader.onload = () => {\n this.geoJson = reader.result;\n this.renderGeoJson(this.map);\n };\n }\n },\n\n removeGeoJson() {\n this.map.data.forEach((feature) => this.map.data.remove(feature));\n },\n\n renderGeoJson(map) {\n if (checkGeoJsonValidity(this.geoJson)) {\n this.showGeoJsonError = false;\n if (!google || !this.$refs.map) return;\n\n map.data.addGeoJson(JSON.parse(this.geoJson));\n map.data.setStyle((feature) => {\n return {\n fillColor: feature.getProperty('fill'),\n fillOpacity: feature.getProperty('fill-opacity'),\n strokeColor: feature.getProperty('stroke'),\n strokeOpacity: feature.getProperty('stroke-opacity'),\n strokeWeight: feature.getProperty('stroke-width'),\n title: feature.getProperty('title'),\n clickable: false,\n };\n });\n } else {\n this.showGeoJsonError = true;\n }\n },\n\n previewGeoJson() {\n this.removeGeoJson();\n this.setGeoJson();\n },\n\n async findPlaces(searchTerm, map) {\n const { Place } = await google.maps.importLibrary('places');\n const request = {\n textQuery: searchTerm,\n fields: ['displayName', 'location'],\n };\n\n const { places } = await Place.searchByText(request);\n\n if (places.length) {\n const { LatLngBounds } = await google.maps.importLibrary('core');\n const bounds = new LatLngBounds();\n\n // Loop through and get all the results.\n places.forEach((place) => {\n bounds.extend(place.location);\n });\n\n // zoom to the bounds if there are multiple places\n if (places.length > 1) {\n map.fitBounds(bounds);\n } else {\n map.setCenter(bounds.getCenter());\n map.setZoom(this.zoomLevel || 14);\n }\n } else {\n console.log('No results');\n }\n },\n\n searchInput: {\n ['@keydown.enter.prevent']() {\n // Just here to prevent enter from submitting the form\n },\n },\n };\n}\n\nconst checkOverlayValidity = (bounds, overlayURL) => {\n if (bounds === false) return false;\n\n const overlayBounds = bounds.toJSON();\n const areImageBoundsValid = Object.values(overlayBounds).every((coord) => coord > 0);\n const isImageUrlValid = overlayURL?.length > 0;\n\n return areImageBoundsValid && isImageUrlValid;\n};\n\nconst checkGeoJsonValidity = (geoJson) => {\n if (geoJson === '') return false;\n\n const geoJsonObj = JSON.parse(geoJson);\n // For definition of geoJson, see https://datatracker.ietf.org/doc/html/rfc7946#section-1.4\n const typeList = [\n 'Feature',\n 'FeatureCollection',\n 'Point',\n 'MultiPoint',\n 'LineString',\n 'MultiLineString',\n 'Polygon',\n 'MultiPolygon',\n 'GeometryCollection',\n ];\n\n return typeList.includes(geoJsonObj.type);\n};\n","export function trapFocus(element, focusableEls) {\n var firstFocusableEl = focusableEls[0];\n var lastFocusableEl = focusableEls[focusableEls.length - 1];\n\n element.addEventListener('keydown', function (e) {\n var isTabPressed = (e.key === 'Tab' || e.keyCode === 9);\n\n if (!isTabPressed) {\n return;\n }\n\n if (e.shiftKey) /* shift + tab */ {\n if (document.activeElement === firstFocusableEl) {\n lastFocusableEl.focus();\n e.preventDefault();\n }\n } else /* tab */ {\n if (document.activeElement === lastFocusableEl) {\n firstFocusableEl.focus();\n e.preventDefault();\n }\n }\n });\n}\n","import { trapFocus } from '~/scripts/trap-focus';\n\nexport default function modal(dynamicFocusableEls, trackUnsavedChanges = true) {\n return {\n open: false,\n focusableEls: null,\n dynamicFocusableEls: dynamicFocusableEls || false,\n trackUnsavedChanges: trackUnsavedChanges,\n\n init() {\n // If the content of the modal is updated dynamically (e.g. via the x-show directive),\n // set dynamicFocusableEls to true and dynamically assign the focusable elements\n // to focusableEls.\n if (this.dynamicFocusableEls) {\n this.$watch('focusableEls', () => {\n trapFocus(this.$refs.panel, this.focusableEls);\n });\n } else {\n this.focusableEls = this.$refs.panel.querySelectorAll(\n 'a[href]:not([disabled]), button:not([disabled]), textarea:not([disabled]), input[type=\"text\"]:not([disabled]), input[type=\"radio\"]:not([disabled]), input[type=\"checkbox\"]:not([disabled]), select:not([disabled])'\n );\n\n this.$watch('open', () => {\n trapFocus(this.$refs.panel, this.focusableEls);\n });\n }\n },\n\n overlay: {\n ['x-show']() {\n return this.open;\n },\n ['@keyup.esc.prevent']() {\n this.$refs.close.click();\n },\n ['x-transition:enter']() {\n return 'transition ease-out duration-300';\n },\n ['x-transition:enter-start']() {\n return 'opacity-0';\n },\n ['x-transition:enter-end']() {\n return 'opacity-100';\n },\n ['x-transition:leave']() {\n return 'ease-in duration-200';\n },\n ['x-transition:leave-start']() {\n return 'opacity-100';\n },\n ['x-transition:leave-end']() {\n return 'opacity-0';\n },\n },\n\n input: {\n ['x-on:keydown.enter.prevent']() {\n return true;\n },\n },\n\n close: {\n ['x-on:click']() {\n if (this.trackUnsavedChanges) {\n this.$dispatch('closeModal');\n if (!this.unsavedChanges) this.open = false;\n } else {\n this.open = false;\n }\n },\n },\n\n panel: {\n ['x-show']() {\n return this.open;\n },\n ['x-on:close']() {\n this.$dispatch('closeModal');\n if (!this.unsavedChanges) this.open = false;\n },\n ['x-on:click.outside']() {\n this.$refs.close.click();\n },\n ['@keyup.esc.prevent']() {\n this.$refs.close.click();\n },\n ['x-transition:enter']() {\n return 'transition ease-out duration-300';\n },\n ['x-transition:enter-start']() {\n return 'transform opacity-0 translate-y-4 sm:translate-y-0 sm:scale-95';\n },\n ['x-transition:enter-end']() {\n return 'opacity-100 translate-y-0 sm:scale-100';\n },\n ['x-transition:leave']() {\n return 'ease-in duration-200';\n },\n ['x-transition:leave-start']() {\n return 'opacity-100 translate-y-0 sm:scale-100';\n },\n ['x-transition:leave-end']() {\n return 'opacity-0 translate-y-4 sm:translate-y-0 sm:scale-95';\n },\n },\n };\n}\n","export default function moderationFilters(opts = {}) {\n let timeout;\n\n const debounce = (fn, ms) => {\n clearTimeout(timeout);\n timeout = setTimeout(fn, ms);\n };\n\n return {\n showFilters: true,\n openTopics: false,\n openTags: false,\n searchQuery: '',\n publishStatus: opts.publishStatus,\n moderationStatus: opts.moderationStatus,\n topicsAvailable: opts.topics,\n topicsSelected: [],\n tagsAvailable: opts.tags,\n tagsSelected: [],\n activeFilters: {\n publishStatus: false,\n moderationStatus: false,\n query: false,\n topics: false,\n tags: false,\n },\n activeFilterCount: 0,\n sortBy: opts.sortBy,\n\n init() {\n this.setPublishStatusFilter(this.publishStatus, true);\n this.setModerationStatusFilter(this.moderationStatus, true);\n this.setTopicsFilter(true);\n this.setTagsFilter(true);\n this.$watch('searchQuery', () => this.submitFilters());\n },\n\n setPublishStatusFilter(status, skipSubmit = false) {\n this.publishStatus = status;\n this.$refs.publishStatus.value = status;\n this.setActiveFilters();\n if (!skipSubmit) this.submitFilters();\n },\n\n setModerationStatusFilter(status, skipSubmit = false) {\n this.moderationStatus = status;\n this.$refs.moderationStatus.value = status;\n this.setActiveFilters();\n if (!skipSubmit) this.submitFilters();\n },\n\n setTopicsFilter(skipSubmit = false) {\n let ids = [];\n this.$refs.topicFilters.querySelectorAll('input[data-topic-filter]').forEach((input) => {\n if (input.checked) ids.push(parseInt(input.dataset.topicFilter));\n });\n this.topicsSelected = ids;\n this.$refs.checkAllTopics.checked = this.allTopicsSelected();\n this.setActiveFilters();\n if (!skipSubmit) this.submitFilters();\n },\n\n toggleAllTopics() {\n if (this.allTopicsSelected()) {\n this.topicsSelected = [];\n this.uncheckAllTopics();\n } else {\n this.topicsSelected = [...this.topicsAvailable];\n this.checkAllTopics();\n }\n },\n\n allTopicsSelected() {\n return this.topicsAvailable.every((id) => this.topicsSelected.includes(id));\n },\n\n setTagsFilter(skipSubmit = false) {\n let ids = [];\n this.$refs.tagFilters.querySelectorAll('input[data-tag-filter]').forEach((input) => {\n if (input.checked) ids.push(parseInt(input.dataset.tagFilter));\n });\n this.tagsSelected = ids;\n this.$refs.checkAllTags.checked = this.allTagsSelected();\n this.setActiveFilters();\n if (!skipSubmit) this.submitFilters();\n },\n\n toggleAllTags() {\n if (this.allTagsSelected()) {\n this.tagsSelected = [];\n this.uncheckAllTags();\n } else {\n this.tagsSelected = [...this.tagsAvailable];\n this.checkAllTags();\n }\n },\n\n allTagsSelected() {\n return this.tagsAvailable.every((id) => this.tagsSelected.includes(id));\n },\n\n submitFilters() {\n debounce(() => {\n this.setActiveFilters();\n this.$root.requestSubmit();\n }, 550);\n },\n\n checkAllTopics(skipSubmit = false) {\n this.$refs.topicFilters.querySelectorAll('input').forEach((input) => {\n input.checked = true;\n });\n if (!skipSubmit) this.submitFilters();\n },\n\n uncheckAllTopics(skipSubmit = false) {\n this.$refs.topicFilters.querySelectorAll('input').forEach((input) => {\n input.checked = false;\n });\n if (!skipSubmit) this.submitFilters();\n },\n\n checkAllTags(skipSubmit = false) {\n this.$refs.tagFilters.querySelectorAll('input').forEach((input) => {\n input.checked = true;\n });\n if (!skipSubmit) this.submitFilters();\n },\n\n uncheckAllTags(skipSubmit = false) {\n this.$refs.tagFilters.querySelectorAll('input').forEach((input) => {\n input.checked = false;\n });\n if (!skipSubmit) this.submitFilters();\n },\n\n setActiveFilters() {\n this.activeFilters = {\n publishStatus: this.publishStatus !== 'all',\n moderationStatus: this.moderationStatus !== 'all',\n query: this.searchQuery !== '',\n topics: this.topicsSelected.length > 0 && this.topicsSelected.length !== this.topicsAvailable.length,\n tags: this.tagsSelected.length > 0,\n };\n this.activeFilterCount = Object.values(this.activeFilters).filter((active) => active).length;\n },\n\n resetFilters() {\n this.setPublishStatusFilter('all', true);\n this.setModerationStatusFilter('all', true);\n this.uncheckAllTags(true);\n this.setTagsFilter(true);\n this.uncheckAllTopics(true);\n this.setTopicsFilter(true);\n this.submitFilters();\n this.showFilters = true;\n this.openTopics = false;\n },\n\n removeTopic(topicToRemove) {\n this.$refs.topicFilters.querySelector(`input[data-topic-filter='${topicToRemove}']`).checked = false;\n this.setTopicsFilter();\n },\n\n removeTag(tagToRemove) {\n this.$refs.tagFilters.querySelector(`input[data-tag-filter='${tagToRemove}']`).checked = false;\n this.setTagsFilter();\n },\n\n clearSearch() {\n this.$refs.search.value = '';\n this.searchQuery = '';\n this.submitFilters();\n },\n\n reset: {\n ['x-on:click.prevent.stop']() {\n this.resetFilters();\n },\n ['x-transition:enter']() {\n return 'transition ease-out duration-100';\n },\n ['x-transition:enter-start']() {\n return 'transform opacity-0 scale-95';\n },\n ['x-transition:enter-end']() {\n return 'transform opacity-100 scale-100';\n },\n ['x-transition:leave']() {\n return 'transition ease-in duration-75';\n },\n ['x-transition:leave-start']() {\n return 'transform opacity-100 scale-100';\n },\n ['x-transition:leave-end']() {\n return 'transform opacity-0 scale-95';\n },\n },\n\n filters: {\n ['x-show']() {\n return this.showFilters;\n },\n ['x-transition:enter']() {\n return 'transition ease-out duration-100';\n },\n ['x-transition:enter-start']() {\n return 'transform opacity-0 scale-95';\n },\n ['x-transition:enter-end']() {\n return 'transform opacity-100 scale-100';\n },\n ['x-transition:leave']() {\n return 'transition ease-in duration-75';\n },\n ['x-transition:leave-start']() {\n return 'transform opacity-100 scale-100';\n },\n ['x-transition:leave-end']() {\n return 'transform opacity-0 scale-95';\n },\n },\n };\n}\n","export default function moderationMailTemplates(participantEmail = '') {\n return {\n selectedTemplate: null,\n\n handleTemplateSelected(evt) {\n const selectedTemplateId = evt.target.value;\n this.selectedTemplate = document.querySelector(`[data-template-id='${selectedTemplateId}']`);\n\n this.setEditorContent();\n this.setRecipients();\n this.setSubject();\n },\n\n setEditorContent() {\n const content = this.selectedTemplate?.innerHTML || '';\n this.$refs.editor && tinymce.get(this.$refs.editor.id).setContent(content);\n },\n\n setRecipients() {\n const recipients = this.selectedTemplate?.dataset?.recipients ?? participantEmail;\n this.$refs.recipients.value = recipients;\n },\n\n setSubject() {\n const subject = this.selectedTemplate?.dataset?.subject || '';\n this.$refs.subject.value = subject;\n },\n };\n}\n","export default function organizationSettings() {\n return {\n openAllSections: false,\n useTwoColumns: false,\n openGeneral: false,\n openEmail: false,\n openLanding: false,\n openLanguage: false,\n openSocialSignIn: false,\n openAnalytics: false,\n openFooter: false,\n openCustom: false,\n openStyling: false,\n openOpenId: false,\n\n init() {\n if (this.supports_html5_storage()) {\n if (localStorage.getItem('organisationSettingsUseTwoColumns')) {\n this.useTwoColumns = localStorage.getItem('organisationSettingsUseTwoColumns') === 'true';\n }\n if (localStorage.getItem('organisationSettingsopenAllSections')) {\n this.openAllSections = localStorage.getItem('organisationSettingsopenAllSections') === 'true';\n }\n }\n this.setColumnLayout();\n this.setSectionFold();\n },\n\n switchSectionFold() {\n this.openAllSections = !this.openAllSections;\n localStorage.setItem('organisationSettingsopenAllSections', this.openAllSections);\n\n this.setSectionFold();\n },\n\n switchColumnView() {\n this.useTwoColumns = !this.useTwoColumns;\n localStorage.setItem('organisationSettingsUseTwoColumns', this.useTwoColumns);\n\n this.setColumnLayout();\n },\n\n setSectionFold() {\n // these attributes only control the chevron icon to point up or down\n this.openGeneral = this.openAllSections;\n this.openEmail = this.openAllSections;\n this.openLanding = this.openAllSections;\n this.openLanguage = this.openAllSections;\n this.openSocialSignIn = this.openAllSections;\n this.openAnalytics = this.openAllSections;\n this.openFooter = this.openAllSections;\n this.openCustom = this.openAllSections;\n this.openStyling = this.openAllSections;\n this.openOpenId = this.openAllSections;\n\n // open or close all sections\n const cardIds = [\n 'general',\n 'email',\n 'landing',\n 'language',\n 'socialSignIn',\n 'analytics',\n 'footer',\n 'custom',\n 'styling',\n 'openId',\n ];\n\n cardIds.forEach((cardId) => {\n if (document.getElementById(cardId)) {\n document.getElementById(cardId).open = this.openAllSections;\n }\n });\n },\n\n setColumnLayout() {\n if (this.useTwoColumns) {\n document.getElementById('settingsWrapper').classList.add('xl:flex', 'xl:gap-4', 'xl:space-y-0');\n } else {\n document.getElementById('settingsWrapper').classList.remove('xl:flex', 'xl:gap-4', 'xl:space-y-0');\n }\n },\n\n supports_html5_storage() {\n try {\n return 'localStorage' in window && window['localStorage'] !== null;\n } catch (e) {\n return false;\n }\n },\n };\n}\n","import { translate } from '~/scripts/locales/translations';\n\nconst locale = document.querySelector('html').getAttribute('lang');\n\nexport default function projectPath({ permittedDomains, currentDomainId, currentPath, forbiddenUrls }) {\n return {\n permittedDomains: JSON.parse(permittedDomains),\n currentDomainId,\n currentPath,\n forbiddenUrls: JSON.parse(forbiddenUrls),\n validPath: true,\n newDomainId: null,\n newPath: null,\n\n init() {\n this.newDomainId = Object.keys(this.permittedDomains)[0];\n this.$watch('newPath', () => {\n this.isValidPath();\n });\n this.$watch('newDomainId', () => {\n this.isValidPath();\n });\n this.isValidPath();\n this.errorMessage();\n },\n\n isValidPath() {\n this.validPath = this.isValidUrl() && this.isCorrectFormat() && this.isCorrectLength();\n },\n\n isValidUrl() {\n const domain = this.newDomainId\n ? this.permittedDomains[this.newDomainId]\n : this.permittedDomains[this.currentDomainId];\n const path = this.newPath !== null ? this.newPath : this.currentPath;\n const url = [domain, path].join('/').replace(/\\/$/, '');\n return !Object.values(this.forbiddenUrls).includes(url);\n },\n\n isCorrectFormat() {\n if (!this.newPath) return true;\n\n return /^[a-zA-Z0-9-_]*$/.test(this.newPath);\n },\n\n isCorrectLength() {\n if (!this.newPath) return true;\n\n return this.newPath.length >= 3 && this.newPath.length <= 50;\n },\n\n errorMessage() {\n if (!this.isValidUrl) {\n this.$refs.pathErrorMessage.innerHTML = translate('path_error_messages', 'already_taken', locale);\n this.$refs.pathInput.classList.remove('input--invalid');\n } else if (!this.isCorrectFormat()) {\n this.$refs.pathErrorMessage.innerHTML = translate('path_error_messages', 'wrong_format', locale);\n this.$refs.pathInput.classList.add('input--invalid');\n } else if (!this.isCorrectLength()) {\n this.$refs.pathErrorMessage.innerHTML = translate('path_error_messages', 'wrong_length', locale);\n this.$refs.pathInput.classList.add('input--invalid');\n } else {\n this.$refs.pathErrorMessage.innerHTML = '';\n this.$refs.pathInput.classList.remove('input--invalid');\n }\n },\n };\n}\n","export default function projectSettings() {\n return {\n openAllSections: false,\n useTwoColumns: false,\n openGeneral: false,\n openSocial: false,\n openIdeation: false,\n openHomepage: false,\n openGoogle: false,\n openLanding: false,\n openAuthentication: false,\n openEmails: false,\n openAnalytics: false,\n openLanguage: false,\n openTemplate: false,\n openFooter: false,\n openCcmServices: false,\n openVoting: false,\n openUrl: false,\n\n init() {\n if (this.supports_html5_storage()) {\n if (localStorage.getItem('projectSettingsUseTwoColumns')) {\n this.useTwoColumns = localStorage.getItem('projectSettingsUseTwoColumns') === 'true';\n }\n if (localStorage.getItem('projectSettingsopenAllSections')) {\n this.openAllSections = localStorage.getItem('projectSettingsopenAllSections') === 'true';\n }\n }\n this.setColumnLayout();\n this.setSectionFold();\n },\n\n switchSectionFold() {\n this.openAllSections = !this.openAllSections;\n localStorage.setItem('projectSettingsopenAllSections', this.openAllSections);\n\n this.setSectionFold();\n },\n\n switchColumnView() {\n this.useTwoColumns = !this.useTwoColumns;\n localStorage.setItem('projectSettingsUseTwoColumns', this.useTwoColumns);\n\n this.setColumnLayout();\n },\n\n setSectionFold() {\n // these attributes only control the chevron icon to point up or down\n this.openGeneral = this.openAllSections;\n this.openSocial = this.openAllSections;\n this.openIdeation = this.openAllSections;\n this.openHomepage = this.openAllSections;\n this.openGoogle = this.openAllSections;\n this.openLanding = this.openAllSections;\n this.openAuthentication = this.openAllSections;\n this.openEmails = this.openAllSections;\n this.openAnalytics = this.openAllSections;\n this.openLanguage = this.openAllSections;\n this.openTemplate = this.openAllSections;\n this.openFooter = this.openAllSections;\n this.openCcmServices = this.openAllSections;\n this.openVoting = this.openAllSections;\n this.openUrl = this.openAllSections;\n\n // open or close all sections\n const cardIds = [\n 'general',\n 'social',\n 'ideation',\n 'homepage',\n 'google',\n 'landing',\n 'authentication',\n 'emails',\n 'analytics',\n 'language',\n 'template',\n 'footer',\n 'services',\n 'initial',\n 'voting',\n 'url',\n ];\n\n cardIds.forEach((cardId) => {\n if (document.getElementById(cardId)) {\n document.getElementById(cardId).open = this.openAllSections;\n }\n });\n },\n\n setColumnLayout() {\n if (this.useTwoColumns) {\n document.getElementById('settingsWrapper').classList.add('xl:flex', 'xl:gap-4', 'xl:space-y-0');\n } else {\n document.getElementById('settingsWrapper').classList.remove('xl:flex', 'xl:gap-4', 'xl:space-y-0');\n }\n },\n\n supports_html5_storage() {\n try {\n return 'localStorage' in window && window['localStorage'] !== null;\n } catch (e) {\n return false;\n }\n },\n };\n}\n","export default function sidebar() {\n return {\n expanded: false,\n openGroup: \"\",\n\n init() {\n const trigger = document.getElementById('sidebar-collapse-trigger');\n trigger.addEventListener('click', () => {\n this.expanded = !this.expanded;\n });\n\n const groups = this.$root.querySelectorAll('[x-bind=\"groupContent\"]');\n \n groups.forEach((group) => {\n if (group.querySelector('.nav__item--active')) this.openGroup = group.id;\n })\n },\n toggleGroup(id) {\n this.openGroup = this.openGroup === id ? \"\" : id;\n },\n\n groupContent: {\n ['x-transition:enter']() {\n return 'transition ease-out duration-1000 overflow-y-hidden';\n },\n ['x-transition:enter-start']() {\n return 'h-0';\n },\n ['x-transition:enter-end']() {\n return 'h-full';\n },\n ['x-transition:leave']() {\n return 'transition ease-in duration-1000 overflow-y-hidden';\n },\n ['x-transition:leave-start']() {\n return 'h-full';\n },\n ['x-transition:leave-end']() {\n return 'h-0';\n },\n }\n }\n}","import Sortable from 'sortablejs';\n\n// A tiny wrapper around Sortable\n// By default we use the root element of this component\n// You can also set an element within this component with target\nexport default function sortableList({ paramKey, target = null }) {\n return {\n sortable: null,\n paramKey: paramKey,\n\n init() {\n const selectedTarget = this.$el.querySelector(target);\n this.sortable = new Sortable(selectedTarget ?? this.$el, {\n handle: '[data-sortable=\"handle\"]',\n dataIdAttr: 'data-sortable-id',\n onUpdate: () => this.update(),\n });\n \n },\n\n update() {\n const body = {}\n body[this.paramKey] = this.sortable.toArray();\n const token = document.querySelector('meta[name=csrf-token]')?.getAttribute('content');\n const request = new Request(this.$root.getAttribute('data-sortable-update-url'), {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n 'X-CSRF-Token': token,\n },\n body: JSON.stringify(body),\n });\n fetch(request);\n },\n \n };\n}\n","import Sortable from 'sortablejs';\n\n// A tiny wrapper around Sortable\n// By default we use the root element of this component\n// You can also set an element within this component with target\nexport default function sortableHomepage({ paramKey, target = null }) {\n return {\n sortable: null,\n paramKey: paramKey,\n\n init() {\n const selectedTarget = this.$el.querySelector(target);\n this.sortable = new Sortable(selectedTarget ?? this.$el, {\n handle: '[data-sortable=\"handle\"]',\n dataIdAttr: 'data-sortable-id',\n onUpdate: () => this.update(),\n });\n \n },\n\n update() {\n const sortorder = this.sortable.toArray();\n sortorder.forEach((element, index) => {\n const selected = document.getElementById(`project_${element}_homepage_sortorder`);\n selected.value = index + 1;\n });\n },\n \n };\n}\n","export default function settingsWizard() {\n return {\n openPage: 1,\n\n init() {\n this.$watch('open', () => { this.focusableEls = this.setFocusableElements() });\n this.$watch('openPage', () => { this.focusableEls = this.setFocusableElements() });\n },\n\n setFocusableElements() {\n const visibleModalElement = document.querySelector(`.settings-wizard__card[x-show=\"openPage === ${this.openPage}\"]`);\n const selectors = 'a[href]:not([disabled]), button:not([disabled]), textarea:not([disabled]), input[type=\"text\"]:not([disabled]), input[type=\"radio\"]:not([disabled]), input[type=\"checkbox\"]:not([disabled]), select:not([disabled])';\n const modalClose = document.querySelector('.modal__close');\n let focusableElements = visibleModalElement.querySelectorAll(selectors);\n\n focusableElements = Array.from(focusableElements);\n\n focusableElements.unshift(modalClose);\n\n return focusableElements;\n }\n }\n}\n","import 'core-js/stable';\nimport 'regenerator-runtime/runtime';\nimport '@hotwired/turbo-rails';\n\n// Import and start extra dependencies\nimport '../scripts';\nimport { scrollToInvalid } from '../scripts/scroll';\n\n// Setup Alpine and components\nimport Alpine from 'alpinejs';\nimport autocomplete from '../alpine/auto-complete';\nimport autoFlag from '../alpine/auto-flag';\nimport autoUpdate from '../alpine/auto-update';\nimport beforeUnload from '../alpine/before-unload';\nimport clipboard from '../alpine/clipboard';\nimport combobox from '../alpine/combobox';\nimport dropdown from '../alpine/dropdown';\nimport fileUpload from '../alpine/file-upload';\nimport formBuilder from '../alpine/form-builder';\nimport googleMapsAdmin from '../alpine/google-maps-admin';\nimport modal from '../alpine/modal';\nimport moderationFilters from '../alpine/moderation-filters';\nimport moderationMailTemplates from '../alpine/moderation-mail-templates';\nimport organizationSettings from '../alpine/organization-settings';\nimport projectPath from '../alpine/project-path';\nimport projectSettings from '../alpine/project-settings';\nimport sidebar from '../alpine/sidebar';\nimport sortableList from '../alpine/sortable-list';\nimport sortableHomepage from '../alpine/sortable-homepage';\nimport settingsWizard from '../alpine/settings-wizard';\n\nwindow.Alpine = Alpine;\nAlpine.data('autocomplete', autocomplete);\nAlpine.data('autoFlag', autoFlag);\nAlpine.data('autoUpdate', autoUpdate);\nAlpine.data('beforeUnload', beforeUnload);\nAlpine.data('clipboard', clipboard);\nAlpine.data('combobox', combobox);\nAlpine.data('dropdown', dropdown);\nAlpine.data('fileUpload', fileUpload);\nAlpine.data('formBuilder', formBuilder);\nAlpine.data('googleMapsAdmin', googleMapsAdmin);\nAlpine.data('modal', modal);\nAlpine.data('moderationFilters', moderationFilters);\nAlpine.data('moderationMailTemplates', moderationMailTemplates);\nAlpine.data('organizationSettings', organizationSettings);\nAlpine.data('projectPath', projectPath);\nAlpine.data('projectSettings', projectSettings);\nAlpine.data('sidebar', sidebar);\nAlpine.data('sortableList', sortableList);\nAlpine.data('sortableHomepage', sortableHomepage);\nAlpine.data('settingsWizard', settingsWizard);\n\ndocument.addEventListener('DOMContentLoaded', () => {\n Alpine.start();\n scrollToInvalid();\n});\n"],"names":["replaceContent","query","content","el","closeModal","id","modal","closeEvent","scrollBehavior","scrollIntoViewIfNeeded","element","checkInView","scrollToInvalid","firstInvalidElement","containerBox","elementBox","autocomplete","activeClass","selectedClass","value","index","oldIndex","_a","_b","newValue","newOption","option","o","g","dir","up","newIndex","selectedOption","$event","autoFlag","name","url","body","token","request","autoUpdate","beforeUnload","event","discardUnsavedChangesMsg","translate","clipboard","combobox","opt","indexes","oldIndexes","valueIndex","v","dropdown","item","searchTerm","word","MAX_IMAGE_SIZE","MAX_IMAGE_DIMENSION","reduce","ImageBlobReduce","locale","fileUpload","filename","fileExists","preview","fileExtension","videoExtensions","errorElement","inputField","input","file","fireSwal","img","reader","blob","transfer","reducedImg","e","ownKeys","object","enumerableOnly","keys","symbols","sym","_objectSpread2","target","i","source","key","_defineProperty","_typeof","obj","_extends","_objectWithoutPropertiesLoose","excluded","sourceKeys","_objectWithoutProperties","sourceSymbolKeys","version","userAgent","pattern","IE11OrLess","Edge","FireFox","Safari","IOS","ChromeForAndroid","captureMode","on","fn","off","matches","selector","getParentOrHost","closest","ctx","includeCTX","R_SPACE","toggleClass","state","className","css","prop","val","style","matrix","selfOnly","appliedTransforms","transform","matrixFn","find","tagName","iterator","list","n","getWindowScrollingElement","scrollingElement","getRect","relativeToContainingBlock","relativeToNonStaticParent","undoScale","container","elRect","top","left","bottom","right","height","width","containerRect","elMatrix","scaleX","scaleY","isScrolledPast","elSide","parentSide","parent","getParentAutoScrollElement","elSideVal","parentSideVal","visible","getChild","childNum","options","includeDragEl","currentChild","children","Sortable","lastChild","last","getRelativeScrollOffset","offsetLeft","offsetTop","winScroller","indexOfObject","arr","includeSelf","elem","gotSelf","elemCSS","extend","dst","src","isRectEqual","rect1","rect2","_throttleTimeout","throttle","callback","ms","args","_this","cancelThrottle","scrollBy","x","y","clone","Polymer","$","getChildContainingRectFromElement","ghostEl","rect","child","_rect$left","_rect$top","_rect$right","_rect$bottom","childRect","expando","AnimationStateManager","animationStates","animationCallbackId","fromRect","childMatrix","animating","animationTime","time","toRect","prevFromRect","prevToRect","animatingRect","targetMatrix","calculateRealTime","currentRect","duration","translateX","translateY","repaint","plugins","defaults","PluginManager","plugin","p","eventName","sortable","evt","eventNameGlobal","pluginName","initialized","modified","eventProperties","modifiedValue","dispatchEvent","_ref","rootEl","targetEl","cloneEl","toEl","fromEl","oldDraggableIndex","newDraggableIndex","originalEvent","putSortable","extraEventProperties","onName","allEventProperties","_excluded","pluginEvent","data","dragEl","parentEl","nextEl","lastDownEl","cloneHidden","moved","_hideGhostForTarget","_unhideGhostForTarget","_dispatchEvent","info","activeGroup","awaitingDragStarted","ignoreNextClick","sortables","tapEvt","touchEvt","lastDx","lastDy","tapDistanceLeft","tapDistanceTop","lastTarget","lastDirection","pastFirstInvertThresh","isCircumstantialInvert","targetMoveDistance","ghostRelativeParent","ghostRelativeParentInitialScroll","_silent","savedInputChecked","documentExists","PositionGhostAbsolutely","CSSFloatProperty","supportDraggable","supportCssPointerEvents","_detectDirection","elCSS","elWidth","child1","child2","firstChildCSS","secondChildCSS","firstChildWidth","secondChildWidth","touchingSideChild2","_dragElInRowColumn","dragRect","targetRect","vertical","dragElS1Opp","dragElS2Opp","dragElOppLength","targetS1Opp","targetS2Opp","targetOppLength","_detectNearestEmptySortable","ret","threshold","insideHorizontally","insideVertically","_prepareGroup","toFn","pull","to","from","sameGroup","otherGroup","group","originalGroup","nearestEmptyInsertDetectEvent","nearest","_checkOutsideTargetEl","dataTransfer","preventOnFilter","type","touch","originalTarget","filter","_saveInputCheckedState","criteria","ownerDocument","dragStartFn","_disableDraggable","_nextTick","fallback","inserted","fallbackTolerance","fallbackOffset","ghostMatrix","relativeScrollOffset","dx","dy","cssMatrix","revert","activeSortable","isOwner","canSort","fromSortable","completedFired","dragOverEvent","extra","completed","after","_onMove","changed","capture","insertion","elLastChild","_ghostIsLast","_ghostIsFirst","firstChild","direction","targetBeforeFirstSwap","differentLevel","differentRowCol","side1","scrolledPastTop","scrollBefore","_getSwapDirection","sibling","dragIndex","nextSibling","moveVector","_unsilent","_cancelNextTick","_globalDragOver","order","_generateId","useAnimation","items","store","willInsertAfter","onMoveFn","retVal","firstElRect","childContainingRect","spacer","lastElRect","swapThreshold","invertedSwapThreshold","invertSwap","isLastTarget","mouseOnAxis","targetLength","targetS1","targetS2","invert","_getInsertDirection","str","sum","root","inputs","idx","_len","_key","autoScrolls","scrollEl","scrollRootEl","scrolling","lastAutoScrollX","lastAutoScrollY","touchEvt$1","pointerElemChangedInterval","AutoScrollPlugin","AutoScroll","_ref2","clearPointerElemChangedInterval","clearAutoScrolls","autoScroll","ogElemScroller","newElem","isFallback","sens","speed","scrollThisInstance","scrollCustomFn","layersOut","currentParent","canScrollX","canScrollY","scrollWidth","scrollHeight","scrollPosX","scrollPosY","vx","vy","scrollOffsetY","scrollOffsetX","drop","dispatchSortableEvent","hideGhostForTarget","unhideGhostForTarget","toSortable","Revert","_ref3","Remove","_ref4","parentSortable","formBuilder","activeLocale","locales","attributable_type","formField","da","firstFormField","spinner","image","newFieldBottomButton","newFormField","newSettingsField","formFieldHeader","sortOrderInput","regex","formFieldForLocale","placeholder","optionsInputForLocale","optionForLocale","settingsField","requiredField","privateField","maxCharsField","internal_name","requiredCheckbox","privateCheckbox","maxChars","customMarkerUrl","currentFormField","otherFormField","arrow","cards","viaConfirmation","boolean","optionTemplate","field","formFieldOptionsInput","formFieldOptions","code","newMessage","googleMapsAdmin","originLatLng","mapParams","isProjectSettingsPage","noInteraction","mapSettings","mapOverlay","turboFrame","Map","AdvancedMarkerElement","Autocomplete","lat","lng","mapOptions","map","ev","icon","markerLatLng","marker","mapsMouseEvent","mapPosition","markerPosition","MapOverlay","bounds","overlayProjection","sw","ne","checkOverlayValidity","overlayNorth","overlaySouth","overlayEast","overlayWest","feature","checkGeoJsonValidity","Place","places","LatLngBounds","place","overlayURL","overlayBounds","areImageBoundsValid","coord","isImageUrlValid","geoJson","geoJsonObj","trapFocus","focusableEls","firstFocusableEl","lastFocusableEl","isTabPressed","dynamicFocusableEls","trackUnsavedChanges","moderationFilters","opts","timeout","debounce","status","skipSubmit","ids","active","topicToRemove","tagToRemove","moderationMailTemplates","participantEmail","selectedTemplateId","recipients","subject","organizationSettings","cardId","projectPath","permittedDomains","currentDomainId","currentPath","forbiddenUrls","domain","path","projectSettings","sidebar","sortableList","paramKey","selectedTarget","sortableHomepage","selected","settingsWizard","visibleModalElement","selectors","modalClose","focusableElements","Alpine"],"mappings":"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","x_google_ignoreList":[10]}