{ "version": 3, "sources": ["src/app/typeahead/_models/selection-model.ts"], "sourcesContent": ["import {SelectionCompareFn} from \"./typeahead-settings\";\r\n\r\n/**\r\n * SelectionModel is used for keeping track of multiple selections. Simple interface with ability to toggle.\r\n * @param selectedState Optional state to set selectedOptions to. If not passed, defaults to false.\r\n * @param selectedOptions Optional data elements to inform the SelectionModel of. If not passed, as toggle() occur, items are tracked.\r\n * @param propAccessor Optional string that points to a unique field within the T type. Used for quickly looking up.\r\n */\r\nexport class SelectionModel {\r\n _data!: Array<{value: T, selected: boolean}>;\r\n _propAccessor: string = '';\r\n\r\n constructor(selectedState: boolean = false, selectedOptions: Array = [], propAccessor: string = '') {\r\n this._data = [];\r\n\r\n if (propAccessor != undefined || propAccessor !== '') {\r\n this._propAccessor = propAccessor;\r\n }\r\n\r\n selectedOptions.forEach(d => {\r\n this._data.push({value: d, selected: selectedState});\r\n });\r\n }\r\n\r\n /**\r\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.\r\n * @param data Item to toggle\r\n * @param selectedState Force the state\r\n * @param compareFn An optional function to use for the lookup, else will use shallowEqual implementation\r\n */\r\n toggle(data: T, selectedState?: boolean, compareFn?: SelectionCompareFn) {\r\n const lookupMethod = compareFn || this.defaultEqual;\r\n\r\n const dataItem = this._data.filter(d => lookupMethod(d.value, data));\r\n if (dataItem.length > 0) {\r\n if (selectedState != undefined) {\r\n dataItem[0].selected = selectedState;\r\n } else {\r\n dataItem[0].selected = !dataItem[0].selected;\r\n }\r\n } else {\r\n this._data.push({value: data, selected: (selectedState === undefined ? true : selectedState)});\r\n }\r\n }\r\n\r\n\r\n /**\r\n * Is the passed item selected\r\n * @param data item to check against\r\n * @param compareFn optional method to use to perform comparisons\r\n * @returns boolean\r\n */\r\n isSelected(data: T, compareFn?: SelectionCompareFn): boolean {\r\n const lookupMethod = compareFn || this.defaultEqual;\r\n\r\n const dataItem = this._data.filter(d => lookupMethod(d.value, data));\r\n\r\n if (dataItem.length > 0) {\r\n return dataItem[0].selected;\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n *\r\n * @returns If some of the items are selected, but not all\r\n */\r\n hasSomeSelected(): boolean {\r\n const selectedCount = this._data.filter(d => d.selected).length;\r\n return (selectedCount !== this._data.length && selectedCount !== 0)\r\n }\r\n\r\n /**\r\n *\r\n * @returns All Selected items\r\n */\r\n selected(): Array {\r\n return this._data.filter(d => d.selected).map(d => d.value);\r\n }\r\n\r\n /**\r\n *\r\n * @returns All Non-Selected items\r\n */\r\n unselected(): Array {\r\n return this._data.filter(d => !d.selected).map(d => d.value);\r\n }\r\n\r\n /**\r\n *\r\n * @returns Last element added/tracked or undefined if nothing is tracked\r\n */\r\n peek(): T | undefined {\r\n if (this._data.length > 0) {\r\n return this._data[this._data.length - 1].value;\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n private defaultEqual = (a: T, b: T): boolean => {\r\n if (typeof a === 'object' && a !== null && typeof b === 'object' && b !== null) {\r\n return this.shallowEqual(a, b);\r\n }\r\n return a === b;\r\n }\r\n\r\n private shallowEqual(a: object, b: object): boolean {\r\n for (const key in a) {\r\n if (!(key in b) || (a as any)[key] !== (b as any)[key]) {\r\n return false;\r\n }\r\n }\r\n for (const key in b) {\r\n if (!(key in a)) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n}\r\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"] }