{ "version": 3, "sources": ["src/app/typeahead/_models/selection-model.ts"], "sourcesContent": ["import {SelectionCompareFn} from \"./typeahead-settings\";\n\n/**\n * SelectionModel is used for keeping track of multiple selections. Simple interface with ability to toggle.\n * @param selectedState Optional state to set selectedOptions to. If not passed, defaults to false.\n * @param selectedOptions Optional data elements to inform the SelectionModel of. If not passed, as toggle() occur, items are tracked.\n * @param propAccessor Optional string that points to a unique field within the T type. Used for quickly looking up.\n */\nexport class SelectionModel {\n _data!: Array<{value: T, selected: boolean}>;\n _propAccessor: string = '';\n\n constructor(selectedState: boolean = false, selectedOptions: Array = [], propAccessor: string = '') {\n this._data = [];\n\n if (propAccessor != undefined || propAccessor !== '') {\n this._propAccessor = propAccessor;\n }\n\n selectedOptions.forEach(d => {\n this._data.push({value: d, selected: selectedState});\n });\n }\n\n /**\n * Will toggle if the data item is selected or not. If data option is not tracked, will add it and set state to true.\n * @param data Item to toggle\n * @param selectedState Force the state\n * @param compareFn An optional function to use for the lookup, else will use shallowEqual implementation\n */\n toggle(data: T, selectedState?: boolean, compareFn?: SelectionCompareFn) {\n const lookupMethod = compareFn || this.defaultEqual;\n\n const dataItem = this._data.filter(d => lookupMethod(d.value, data));\n if (dataItem.length > 0) {\n if (selectedState != undefined) {\n dataItem[0].selected = selectedState;\n } else {\n dataItem[0].selected = !dataItem[0].selected;\n }\n } else {\n this._data.push({value: data, selected: (selectedState === undefined ? true : selectedState)});\n }\n }\n\n\n /**\n * Is the passed item selected\n * @param data item to check against\n * @param compareFn optional method to use to perform comparisons\n * @returns boolean\n */\n isSelected(data: T, compareFn?: SelectionCompareFn): boolean {\n const lookupMethod = compareFn || this.defaultEqual;\n\n const dataItem = this._data.filter(d => lookupMethod(d.value, data));\n\n if (dataItem.length > 0) {\n return dataItem[0].selected;\n }\n return false;\n }\n\n /**\n *\n * @returns If some of the items are selected, but not all\n */\n hasSomeSelected(): boolean {\n const selectedCount = this._data.filter(d => d.selected).length;\n return (selectedCount !== this._data.length && selectedCount !== 0)\n }\n\n /**\n *\n * @returns All Selected items\n */\n selected(): Array {\n return this._data.filter(d => d.selected).map(d => d.value);\n }\n\n /**\n *\n * @returns All Non-Selected items\n */\n unselected(): Array {\n return this._data.filter(d => !d.selected).map(d => d.value);\n }\n\n /**\n *\n * @returns Last element added/tracked or undefined if nothing is tracked\n */\n peek(): T | undefined {\n if (this._data.length > 0) {\n return this._data[this._data.length - 1].value;\n }\n\n return undefined;\n }\n\n private defaultEqual = (a: T, b: T): boolean => {\n if (typeof a === 'object' && a !== null && typeof b === 'object' && b !== null) {\n return this.shallowEqual(a, b);\n }\n return a === b;\n }\n\n private shallowEqual(a: object, b: object): boolean {\n for (const key in a) {\n if (!(key in b) || (a as any)[key] !== (b as any)[key]) {\n return false;\n }\n }\n for (const key in b) {\n if (!(key in a)) {\n return false;\n }\n }\n return true;\n }\n}\n"], "mappings": "AAQM,IAAOA,EAAP,KAAqB,CAIzBC,YAAYC,EAAyB,GAAOC,EAA4B,CAAA,EAAIC,EAAuB,GAAE,CAFrG,KAAAC,cAAwB,GA0FhB,KAAAC,aAAe,CAACC,EAAMC,IACxB,OAAOD,GAAM,UAAYA,IAAM,MAAQ,OAAOC,GAAM,UAAYA,IAAM,KACjE,KAAKC,aAAaF,EAAGC,CAAC,EAExBD,IAAMC,EA3Fb,KAAKE,MAAQ,CAAA,GAETN,GAAgBO,MAAaP,IAAiB,MAChD,KAAKC,cAAgBD,GAGvBD,EAAgBS,QAAQC,GAAI,CAC1B,KAAKH,MAAMI,KAAK,CAACC,MAAOF,EAAGG,SAAUd,CAAa,CAAC,CACrD,CAAC,CACH,CAQAe,OAAOC,EAAShB,EAAyBiB,EAAiC,CACxE,IAAMC,EAAeD,GAAa,KAAKb,aAEjCe,EAAW,KAAKX,MAAMY,OAAOT,GAAKO,EAAaP,EAAEE,MAAOG,CAAI,CAAC,EAC/DG,EAASE,OAAS,EAChBrB,GAAiBS,KACnBU,EAAS,CAAC,EAAEL,SAAWd,EAEvBmB,EAAS,CAAC,EAAEL,SAAW,CAACK,EAAS,CAAC,EAAEL,SAGtC,KAAKN,MAAMI,KAAK,CAACC,MAAOG,EAAMF,SAAWd,IAAkBS,OAAY,GAAOT,CAAc,CAAC,CAEjG,CASAsB,WAAWN,EAASC,EAAiC,CACnD,IAAMC,EAAeD,GAAa,KAAKb,aAEjCe,EAAW,KAAKX,MAAMY,OAAOT,GAAKO,EAAaP,EAAEE,MAAOG,CAAI,CAAC,EAEnE,OAAIG,EAASE,OAAS,EACbF,EAAS,CAAC,EAAEL,SAEd,EACT,CAMAS,iBAAe,CACb,IAAMC,EAAgB,KAAKhB,MAAMY,OAAOT,GAAKA,EAAEG,QAAQ,EAAEO,OACzD,OAAQG,IAAkB,KAAKhB,MAAMa,QAAUG,IAAkB,CACnE,CAMAV,UAAQ,CACN,OAAO,KAAKN,MAAMY,OAAOT,GAAKA,EAAEG,QAAQ,EAAEW,IAAId,GAAKA,EAAEE,KAAK,CAC5D,CAMAa,YAAU,CACR,OAAO,KAAKlB,MAAMY,OAAOT,GAAK,CAACA,EAAEG,QAAQ,EAAEW,IAAId,GAAKA,EAAEE,KAAK,CAC7D,CAMAc,MAAI,CACF,GAAI,KAAKnB,MAAMa,OAAS,EACtB,OAAO,KAAKb,MAAM,KAAKA,MAAMa,OAAS,CAAC,EAAER,KAI7C,CASQN,aAAaF,EAAWC,EAAS,CACvC,QAAWsB,KAAOvB,EAChB,GAAI,EAAEuB,KAAOtB,IAAOD,EAAUuB,CAAG,IAAOtB,EAAUsB,CAAG,EACnD,MAAO,GAGX,QAAWA,KAAOtB,EAChB,GAAI,EAAEsB,KAAOvB,GACX,MAAO,GAGX,MAAO,EACT", "names": ["SelectionModel", "constructor", "selectedState", "selectedOptions", "propAccessor", "_propAccessor", "defaultEqual", "a", "b", "shallowEqual", "_data", "undefined", "forEach", "d", "push", "value", "selected", "toggle", "data", "compareFn", "lookupMethod", "dataItem", "filter", "length", "isSelected", "hasSomeSelected", "selectedCount", "map", "unselected", "peek", "key"] }