{"version":3,"file":"uppsala.multiselect.min.js","names":["define","$","multiselectCallbackOnChange","multiselectSelector","isClosedClass","buttonSelector","closeDialogSelector","groupSelectLabelClass","labelClass","labelSelector","labelTextClass","labelTextSelector","checkboxClass","checkboxSelector","allOptionClass","allOptionSelector","allSelectedText","unsetTrap","multiselect","clickTrap","off","keyTrap","focusTrap","event","$target","target","unset","$openMultiselect","length","parentMultiselect","closest","hasClass","close","keyHandled","keyCode","shiftKey","movePrevious","moveNext","preventDefault","$focusedElement","find","$visibleFocusables","$firstFocusable","first","is","focus","indexOfFocused","index","nextElement","get","$lastFocusableElement","last","previousElement","hasSelectionGroups","$baseElement","attr","handleCheckboxChange","$checkbox","updateLabelStatus","handleGroupSelectStatus","updateButtonText","toggleClass","prop","$selectedOptionsLabel","$additionalSelectionsCountLabel","selectedNames","getSelectedNames","hasSelections","join","text","selectedAddonText","toggle","name","names","populateNamesWithAllCheckedInSection","$section","not","each","this","push","$fieldset","$groupSelectCheckbox","allControlledCheckboxesAreChecked","init","callbackOnChange","$elements","element","setup","refreshMultiSelects","$button","$dialogCloseButton","addClass","dialogId","click","handleButtonClick","change","baseName","fieldsetName","$legend","children","groupCheckboxId","$controlledCheckboxes","controlledCheckboxIds","map","id","isSelectAllOptionClass","$groupSelectElements","insertAfter","$groupCheckbox","hide","setupGroupSelects","$allCheckbox","$allCheckboxes","setupAllOptionLogic","$dialog","open","removeClass","on","shouldFocusButton","getSelectedValues","val","setSelected","values","checked","i","getAttribute"],"sources":["components/uppsala.multiselect.js"],"mappings":"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","ignoreList":[],"sourcesContent":["define(['jquery'], function ($) {\n\n /* This multiselect implementation only supports one multiselect per page. If need arrises, update this code to support more. */\n\n var multiselectSelector = '.multiselect';\n var isClosedClass = 'multiselect--isclosed';\n var isSelectedClass = 'multiselect--isselected';\n var hasSelectionsClass = 'multiselect--hasselections';\n var buttonSelector = '.multiselect--button';\n var closeDialogSelector = '.js-multiselect-close';\n var groupSelectLabelClass = 'multiselect--groupselectlabel';\n var labelClass = 'multiselect--label';\n var labelSelector = '.' + labelClass;\n var labelTextClass = 'multiselect--labeltext';\n var labelTextSelector = '.' + labelTextClass;\n var checkboxClass = 'multiselect--checkbox';\n var checkboxSelector = '.' + checkboxClass;\n var allOptionClass = 'js-multiselect-alloption';\n var allOptionSelector = '.' + allOptionClass;\n var multiselectCallbackOnChange;\n\n var ESC_keycode = 27;\n var TAB_keycode = 9;\n var UP_keycode = 38;\n var DOWN_keycode = 40;\n var allSelectedText = \"Alla\";\n\n var setTrap = function () {\n if (!multiselect.clickTrap) {\n multiselect.clickTrap = clickTrap;\n $(\"body\").on(\"click\", clickTrap);\n }\n if (!multiselect.keyTrap) {\n multiselect.keyTrap = keyTrap;\n $(\"body\").on(\"keydown\", keyTrap);\n }\n if (!multiselect.focusTrap) {\n multiselect.focusTrap = focusTrap;\n $(\"body\").on(\"focusin\", focusTrap);\n }\n }\n\n var unsetTrap = function () {\n if (multiselect.clickTrap) {\n multiselect.clickTrap = null;\n $(\"body\").off(\"click\", clickTrap);\n }\n if (multiselect.keyTrap) {\n multiselect.keyTrap = null;\n $(\"body\").off(\"keydown\", keyTrap);\n }\n if (multiselect.focusTrap) {\n multiselect.focusTrap = null;\n $(\"body\").off(\"focusin\", focusTrap);\n }\n }\n\n //click outside of multiselect should close multiselect.\n var clickTrap = function (event) {\n var $target = $(event.target);\n var unset = true;\n\n var $openMultiselect = $(multiselectSelector + \":not(.\" + isClosedClass + \")\");\n if ($openMultiselect.length > 0) {\n //check if we are inside open multiselect\n var parentMultiselect = $target.closest(multiselectSelector);\n if (parentMultiselect.length && !parentMultiselect.hasClass(isClosedClass)) {\n unset = false;\n } else {\n multiselect.close($openMultiselect);\n }\n }\n\n if (unset) {\n unsetTrap();\n }\n }\n\n //pressing ESC should close multiselect\n //arrow up/down should work as tab/shift+tab\n //tabbing past last checkbox should focus on first checkbox\n //shift+tab from button should select last checkbox\n var keyTrap = function (event) {\n var unset = false;\n var $openMultiselect = $(multiselectSelector + \":not(.\" + isClosedClass + \")\");\n if ($openMultiselect.length > 0) {\n var keyHandled = true;\n switch (event.keyCode) {\n case ESC_keycode:\n multiselect.close($openMultiselect, true);\n unset = true;\n break;\n case TAB_keycode:\n if (event.shiftKey) {\n movePrevious($openMultiselect);\n } else {\n moveNext($openMultiselect);\n }\n break;\n case UP_keycode:\n movePrevious($openMultiselect);\n break;\n case DOWN_keycode:\n moveNext($openMultiselect);\n break;\n default:\n keyHandled = false;\n }\n if (keyHandled) {\n event.preventDefault();\n } \n }\n\n if (unset) {\n unsetTrap();\n }\n }\n\n var moveNext = function ($openMultiselect) {\n var $focusedElement = $openMultiselect.find(\":focus\");\n var $visibleFocusables = $openMultiselect.find(checkboxSelector + \":visible , \" + closeDialogSelector);\n\n var $firstFocusable = $visibleFocusables.first();\n if ($focusedElement.is(buttonSelector)) {\n $firstFocusable.focus();\n return;\n }\n if ($focusedElement.is(closeDialogSelector)) {\n $firstFocusable.focus();\n return;\n }\n var indexOfFocused = $visibleFocusables.index($focusedElement);\n var nextElement = $visibleFocusables.get(indexOfFocused + 1);\n $(nextElement).focus();\n return;\n }\n\n var movePrevious = function ($openMultiselect) {\n var $focusedElement = $openMultiselect.find(\":focus\");\n var $visibleFocusables = $openMultiselect.find(checkboxSelector + \":visible , \" + closeDialogSelector);\n\n var $lastFocusableElement = $visibleFocusables.last();\n if ($focusedElement.is(buttonSelector)) {\n $lastFocusableElement.focus();\n return;\n }\n\n var $firstFocusable = $visibleFocusables.first();\n if ($focusedElement.is($firstFocusable)) {\n $openMultiselect.find(buttonSelector).focus();\n return;\n }\n var indexOfFocused = $visibleFocusables.index($focusedElement);\n var previousElement = $visibleFocusables.get(indexOfFocused - 1);\n $(previousElement).focus();\n return;\n }\n\n\n //multiselect losing focus should close multiselect\n var focusTrap = function (event) {\n var $target = $(event.target);\n var unset = true; \n\n var $openMultiselect = $(multiselectSelector + \":not(.\" + isClosedClass + \")\");\n\n if ($openMultiselect.length > 0) {\n //check if target is inside multiselect\n var isInsideOpenMultiselect = $target.closest($openMultiselect).length > 0;\n if (isInsideOpenMultiselect) {\n unset = false;\n } else {\n multiselect.close($openMultiselect);\n } \n }\n\n if (unset) {\n unsetTrap();\n }\n }\n\n var hasSelectionGroups = function ($baseElement) {\n return $baseElement.attr(\"data-groupselect\") === \"true\";\n }\n\n var handleCheckboxChange = function (event) {\n var $checkbox = $(event.target);\n updateLabelStatus($checkbox);\n\n var $baseElement = $checkbox.closest(multiselectSelector);\n if (hasSelectionGroups($baseElement)) {\n handleGroupSelectStatus($checkbox);\n }\n\n updateButtonText($baseElement);\n }\n\n var updateLabelStatus = function ($checkbox) {\n var $label = $checkbox.closest(labelSelector);\n $label.toggleClass(isSelectedClass, $checkbox.prop(\"checked\"));\n }\n\n var updateButtonText = function ($baseElement) {\n var $selectedOptionsLabel = $baseElement.find(\".multiselect--selectedoptions\");\n var $additionalSelectionsCountLabel = $baseElement.find(\".multiselect--additionalselectionscount\");\n var $caption = $baseElement.find(\".multiselect--caption\");\n var $selectedOptionsWrapper = $baseElement.find(\".multiselect--selectedoptionswrapper\");\n\n var selectedNames = getSelectedNames($baseElement);\n var hasSelections = selectedNames.length > 0;\n $baseElement.toggleClass(hasSelectionsClass, hasSelections);\n\n if (hasSelections) {\n $selectedOptionsLabel.attr(\"aria-label\", selectedNames.join(\", \"));\n } else {\n // TODO: hide label count with addClass visuallyhidden\n $selectedOptionsLabel.text(allSelectedText);\n $selectedOptionsLabel.attr(\"aria-label\", allSelectedText);\n }\n\n //Note: selectedNames could have been correctly reduced if spliced in hasSelections.\n var selectedAddonText = selectedNames.length > 1 ? ' valda' : ' vald';\n $additionalSelectionsCountLabel.text(selectedNames.length + selectedAddonText);\n $additionalSelectionsCountLabel.toggle(!!selectedNames.length);\n }\n\n var getSelectedNames = function ($baseElement) {\n var name = $baseElement.attr(\"data-name\");\n var names = [];\n\n var populateNamesWithAllCheckedInSection = function ($section) {\n var $allChecked = $section.find(\"[name=\" + name + \"]:checked\").not(allOptionSelector);\n $allChecked.each(function (index) {\n var $checked = $(this);\n var text = $checked.closest(labelSelector).find(labelTextSelector).text();\n names.push(text);\n });\n }\n\n if (!hasSelectionGroups($baseElement)) {\n populateNamesWithAllCheckedInSection($baseElement);\n } else {\n var $fieldsets = $baseElement.find(\"fieldset\");\n $fieldsets.each(function () {\n var $fieldset = $(this);\n //find all checkboxes under this fieldset, but ignore the All option\n var $groupSelectCheckbox = $fieldset.find(\".\" + groupSelectLabelClass + \" \" + checkboxSelector).not(allOptionSelector);\n if ($groupSelectCheckbox.prop(\"checked\")) {\n var text = $groupSelectCheckbox.closest(labelSelector).find(labelTextSelector).text();\n names.push(text);\n } else {\n populateNamesWithAllCheckedInSection($fieldset);\n }\n })\n }\n\n return names;\n }\n\n var setupGroupSelects = function ($baseElement) {\n var baseName = $baseElement.attr(\"data-name\");\n var $fieldsets = $baseElement.find(\"fieldset\");\n $fieldsets.each(function (index) {\n var $fieldset = $(this); \n var fieldsetName = $fieldset.attr(\"name\");\n var $legend = $fieldset.children(\"legend\").first();\n var groupCheckboxId = baseName + \"_\" + fieldsetName;\n var $controlledCheckboxes = $fieldset.find(checkboxSelector);\n var controlledCheckboxIds = $controlledCheckboxes.map(function () { return this.id; }).get();\n\n // special class for the select all option, because we have special behavior on it like it does not count as a selected option in the status text, and special event handlers\n var isSelectAllOptionClass = $controlledCheckboxes.hasClass(allOptionClass) ? \" \" + allOptionClass : \"\";\n\n var $groupSelectElements =\n $('');\n $groupSelectElements.insertAfter($legend);\n\n //handle groupselect change\n $groupSelectElements.find(\"#\" + groupCheckboxId).change(function (event) {\n var $groupCheckbox = $(this);\n\n // check all child checkboxes if group checkbox is checked. Uncheck childs if group checkbox is unchecked\n $controlledCheckboxes.prop(\"checked\", $groupCheckbox.prop(\"checked\"));\n\n updateLabelStatus($groupCheckbox);\n $controlledCheckboxes.each(function () { updateLabelStatus($(this)) });\n\n updateButtonText($baseElement);\n });\n\n //if all child checkboxes are checked, then check the group checkbox\n var allChecked = $fieldset.find('input[type=\"checkbox\"]:checked').length === $controlledCheckboxes.length;\n if (allChecked) {\n $groupSelectElements.find(\"#\" + groupCheckboxId).each(function () {\n var $groupCheckbox = $(this);\n $groupCheckbox.prop(\"checked\", \"checked\");\n })\n }\n\n //handle single checkbox in group\n if ($controlledCheckboxes.length === 1) {\n $controlledCheckboxes.closest(labelSelector).hide();\n }\n\n $legend.addClass(\"visuallyhidden\");\n })\n\n $baseElement.addClass(\"multiselect--hasgroupselects\");\n }\n\n // updates parent checkbox status based on all child checkboxes\n var handleGroupSelectStatus = function ($checkbox) {\n var $groupSelectCheckbox = $checkbox.closest(\"fieldset\").find(\".\" + groupSelectLabelClass + \" \" + checkboxSelector);\n var $controlledCheckboxes = $checkbox.closest(\"fieldset\").find(labelSelector + \":not(.\" + groupSelectLabelClass + \") \" + checkboxSelector);\n\n var anyUncheckedCheckbox = $controlledCheckboxes.is(\":not(:checked)\");\n var allControlledCheckboxesAreChecked = !anyUncheckedCheckbox;\n\n $groupSelectCheckbox.prop(\"checked\", allControlledCheckboxesAreChecked);\n\n updateLabelStatus($groupSelectCheckbox);\n }\n\n var setupAllOptionLogic = function($baseElement) {\n // find the elements we need\n var $allCheckbox = $baseElement.find(allOptionSelector);\n var $allCheckboxes = $baseElement.find(checkboxSelector).not(allOptionSelector);\n\n // if all option is checked, de-select all other options\n $allCheckbox.click(function (event) {\n if ($allCheckbox.is(\":checked\")) {\n $allCheckboxes.prop(\"checked\", false);\n $allCheckboxes.each(function () { updateLabelStatus($(this)); });\n updateButtonText($baseElement);\n }\n });\n\n // if any other option than all option is checked, uncheck all option\n $allCheckboxes.click(function (event) {\n if ($(event.target).is(\":checked\")) {\n $allCheckbox.prop(\"checked\", false);\n updateLabelStatus($allCheckbox);\n }\n })\n }\n\n var multiselect = {\n\n keyTrap: null,\n clickTrap: null,\n focusTrap: null,\n\n init: function (callbackOnChange) {\n var $elements = $(multiselectSelector);\n multiselectCallbackOnChange = callbackOnChange;\n $elements.each(function (index, element) {\n multiselect.setup($(element))\n });\n },\n refreshMultiSelects: function () {\n\n var $multiSelects = $(multiselectSelector);\n $multiSelects.each(function (index) {\n updateButtonText($(this));\n });\n\n var $checkboxes = $(checkboxSelector);\n $checkboxes.each(function (index) {\n handleGroupSelectStatus($(this))\n updateLabelStatus($(this));\n });\n },\n setup: function ($baseElement) {\n //The default when javascript is disabled is that the button is nonfunctional/disabled and the options are always visible.\n //when initialising we therefore first hide/close the options and \n //add aria-attributes that tells us that the button opens a related dialog\n\n //the main button to open and close the dialog\n var $button = $baseElement.find(buttonSelector).first(); \n //the \"close\" button inside at the bottom of the dialog window\n var $dialogCloseButton = $baseElement.find(closeDialogSelector).first();\n $baseElement.addClass(isClosedClass);\n $button.attr(\"aria-expanded\", \"false\");\n\n var dialogId = $button.attr(\"data-dialogid\");\n var $dialog = $(\"#\" + dialogId);\n\n $dialog.attr(\"role\", \"dialog\");\n $button.click(multiselect.handleButtonClick);\n $dialogCloseButton.click(multiselect.handleButtonClick);\n\n var $checkboxesBeforeGroupSelects = $baseElement.find(checkboxSelector);\n $checkboxesBeforeGroupSelects.change(handleCheckboxChange);\n \n if (hasSelectionGroups($baseElement)) { \n setupGroupSelects($baseElement);\n }\n\n updateButtonText($baseElement);\n\n // must run after any elements have been inserted, like setupGroupSelects\n setupAllOptionLogic($baseElement);\n\n $baseElement.addClass(\"multiselect--isinitialized\");\n $baseElement.change(function () {\n multiselectCallbackOnChange();\n });\n\n },\n\n handleButtonClick: function (event) {\n var $baseElement = $(event.target).closest(multiselectSelector);\n\n var $button = $baseElement.find(buttonSelector).first();\n var dialogId = $button.attr(\"data-dialogid\");\n var $dialog = $(\"#\" + dialogId);\n\n if ($baseElement.hasClass(isClosedClass)) {\n multiselect.open($baseElement, $dialog, $button); \n } else {\n multiselect.close($baseElement, true); \n }\n },\n\n open: function ($baseElement, $dialog, $button) {\n $baseElement.removeClass(isClosedClass);\n $button.attr(\"aria-expanded\", \"true\");\n\n //focus first\n $dialog.find(checkboxSelector).first().focus();\n\n setTrap();\n },\n\n close: function ($baseElement, shouldFocusButton) {\n var $button = $baseElement.find(buttonSelector).first();\n\n $baseElement.addClass(isClosedClass);\n $button.attr(\"aria-expanded\", \"false\");\n\n if (shouldFocusButton) {\n //focus button\n $button.focus();\n }\n },\n getSelectedValues: function () {\n return $(checkboxSelector + \":checked\").map(function () { return $(this).val(); }).get();\n },\n\n setSelected: function (values) {\n if (values === 'undefined')\n return;\n\n // unselect all\n $(checkboxSelector).each(function (index, element) {\n element.checked = false;\n });\n\n // set selected\n $(checkboxSelector).each(function (index, element) {\n $(values).each(function (i, val) {\n if (element.getAttribute('value') === val)\n element.checked = true;\n });\n });\n\n // update texts on button\n this.refreshMultiSelects();\n }\n }\n return multiselect;\n\n});"]}