{"version":3,"file":"searchfield.js","names":["app","component","bindings","list","inputString","type","searchIn","labelProperty","required","placeholder","disabled","limitText","noAdd","externalSearch","maxHeight","onSearch","onAddNew","onSelect","controller","$element","$timeout","ctrl","this","_init","_clickOff","event","target","closest","results","ux","showNewBtn","document","removeEventListener","searching","searchStr","modelStr","addNew","listIndex","$onInit","length","$onChanges","changes","angular","copy","$onDestroy","searchFieldFocus","searchField","addEventListener","key","find","focus","fullArr","splitArr","replace","split","str","rE","RegExp","filterArr","filter","fli","match","prop","Set","$event","string","resultsKeyUp","preventDefault","offset","selectAB","setNewAB","item","controllerAs","templateUrl","tios","util","cdnUrl"],"sources":["angular/component/searchfield.js"],"mappings":"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","sourcesContent":["(function () {\r\n 'use strict'\r\n\r\n var controller = function ($element, $timeout) {\r\n var ctrl = this;\r\n\r\n //Internal variables\r\n var _init = false;\r\n var _f = 'function';\r\n\r\n ctrl.ux = {\r\n searching: false,\r\n searchStr: '',\r\n modelStr: '',\r\n addNew: false,\r\n showNewBtn: true,\r\n listIndex: null,\r\n };\r\n\r\n ctrl.results = [];\r\n\r\n //Init function\r\n ctrl.$onInit = init;\r\n ctrl.$onChanges = changes;\r\n ctrl.$onDestroy = destroy;\r\n\r\n //-\r\n function _clickOff(event) {\r\n if (!event.target.closest(\"searchfield\")) {\r\n $timeout(function () {\r\n ctrl.results = [];\r\n ctrl.ux.showNewBtn = false;\r\n });\r\n document.removeEventListener('click', _clickOff);\r\n }\r\n }\r\n\r\n ctrl.searchFieldFocus = function () {\r\n if (!ctrl.disabled) {\r\n if (ctrl.ux.searchStr && ctrl.ux.searchStr.length) ctrl.searchField();\r\n }\r\n };\r\n\r\n ctrl.searchField = function (event) {\r\n if (!ctrl.disabled) {\r\n document.addEventListener('click', _clickOff);\r\n if (event?.key === 'ArrowDown') {\r\n if (ctrl.results.length || (!ctrl.noAdd && ctrl.ux.showNewBtn)) {\r\n $element.find('.results').focus();\r\n ctrl.ux.listIndex = 0;\r\n }\r\n } else {\r\n if (!!ctrl.externalSearch) {\r\n ctrl.ux.searching = true;\r\n } else {\r\n if (ctrl.list) {\r\n var fullArr = [];\r\n var searchStr = ctrl.ux.searchStr;\r\n if (!!searchStr && searchStr.length) {\r\n var splitArr = searchStr.replace(/[,\\/#!$%\\^&\\*;:{}\\\\\\[\\]=+\\-_<>?'\"`~()]/g, '').split(' ');\r\n fullArr = ctrl.list;\r\n for (var str of splitArr) {\r\n if (str.length) {\r\n var rE = new RegExp(str, 'i');\r\n var filterArr = fullArr.filter(function (fli) {\r\n if (!!ctrl.searchIn) {\r\n for (var prop of ctrl.searchIn) {\r\n //console.log('prop', prop, fli[prop], 'rE', rE)\r\n return !!fli[prop] && fli[prop].match(rE);\r\n }\r\n } else {\r\n return !!fli && typeof (fli.match) == _f && fli.match(rE);\r\n }\r\n });\r\n fullArr = [...filterArr];\r\n }\r\n }\r\n }\r\n //Create a new Set to remove duplicate results and immediately spread the Set into an array.\r\n ctrl.results = [...new Set(fullArr)];\r\n }\r\n }\r\n ctrl.ux.showNewBtn = true;\r\n\r\n if (typeof ctrl.onSearch === 'function') ctrl.onSearch({ $event: { type: ctrl.type || null, string: ctrl.ux.searchStr || '' } });\r\n }\r\n }\r\n };\r\n\r\n ctrl.resultsKeyUp = function (event) {\r\n if (!ctrl.disabled) {\r\n //console.log('key', event.key, ctrl.ux.listIndex, ctrl.results.length)\r\n event.preventDefault();\r\n switch (event.key) {\r\n case 'ArrowUp':\r\n if (ctrl.ux.listIndex > 0) {\r\n ctrl.ux.listIndex--;\r\n } else {\r\n var offset = (!ctrl.noAdd && ctrl.ux.showNewBtn) ? 0 : -1;\r\n ctrl.ux.listIndex = ctrl.results.length - offset;\r\n }\r\n break;\r\n case 'ArrowDown':\r\n var offset = (!ctrl.noAdd && ctrl.ux.showNewBtn) ? 1 : 0;\r\n if (ctrl.ux.listIndex < ctrl.results.length) {\r\n ctrl.ux.listIndex++;\r\n } else {\r\n ctrl.ux.listIndex = 0;\r\n }\r\n break;\r\n case 'Enter':\r\n if (!ctrl.results.length || ctrl.ux.listIndex === ctrl.results.length) {\r\n ctrl.setNewAB();\r\n } else {\r\n ctrl.selectAB(ctrl.results[ctrl.ux.listIndex]);\r\n }\r\n $element.find('input').focus();\r\n break;\r\n }\r\n }\r\n };\r\n\r\n ctrl.selectAB = function (item) {\r\n if (!ctrl.disabled) {\r\n ctrl.ux.searchStr = !!ctrl.labelProperty ? item[ctrl.labelProperty] : item;\r\n ctrl.results = [];\r\n ctrl.ux.showNewBtn = false;\r\n\r\n if (typeof ctrl.onSelect === 'function')\r\n ctrl.onSelect({ $event: { item: item, type: ctrl.type } });\r\n }\r\n };\r\n\r\n ctrl.setNewAB = function () {\r\n if (!ctrl.disabled) {\r\n ctrl.ux.addNew = true;\r\n ctrl.results = [];\r\n\r\n if (typeof ctrl.onAddNew === 'function')\r\n ctrl.onAddNew({ $event: { string: ctrl.ux.searchStr, type: ctrl.type } });\r\n }\r\n };\r\n\r\n function changes(changes) {\r\n // console.log('_init', _init, 'changes', changes);\r\n if (_init) {\r\n if (changes.list && !ctrl.searchIn) {\r\n ctrl.ux.searching = false;\r\n ctrl.results = angular.copy(ctrl.list);\r\n }\r\n if (changes.inputString) {\r\n ctrl.ux.searchStr = ctrl.inputString || '';\r\n ctrl.ux.showNewBtn = false;\r\n }\r\n }\r\n }\r\n\r\n function init() {\r\n //set up defaults\r\n ctrl.ux.searchStr = ctrl.inputString || '';\r\n if (!!ctrl.ux.searchStr?.length) ctrl.ux.showNewBtn = false;\r\n\r\n _init = true;\r\n }\r\n\r\n function destroy() {\r\n document.removeEventListener('click', _clickOff);\r\n //console.log('Searchfield destroyed');\r\n }\r\n };\r\n\r\n app.component('searchfield', {\r\n\r\n bindings: {\r\n list: '