{"version":3,"file":"TreeHelper.js","mappings":"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","sources":["webpack://cheminfo-online-recherche/./Views/Suche/TreeHelper.ts"],"sourcesContent":["type SearchType = \"key\" | \"name\";\r\n\r\nexport interface TreeHelperOptions {\r\n readonly selectableTypes: string[];\r\n readonly onSelectFunction: (node: any) => void;\r\n readonly scrollIntoView: boolean;\r\n readonly isExactSearch: boolean;\r\n}\r\n\r\nclass MerkmalSearchModel {\r\n searchTerm: string;\r\n searchType: SearchType;\r\n}\r\n\r\nclass Hierarchy {\r\n key: string;\r\n pk: string;\r\n constructor(key: string, pk: string) {\r\n this.key = key;\r\n this.pk = pk;\r\n }\r\n}\r\n\r\nclass TreeViewItem {\r\n key: string;\r\n pk?: string;\r\n text: string;\r\n items?: TreeViewItem[];\r\n isMatch?: boolean;\r\n expanded? = false;\r\n type: \"Oberbegriff\" | \"Merkmal\" | \"Feld\" | \"Index\" | \"Hierarchie\" | \"Virtuell\";\r\n iconClassName?: string;\r\n className?: string;\r\n}\r\n\r\nexport class TreeHelper {\r\n\r\n private matches: string[];\r\n private expandedKeys = [];\r\n private hierarchy: { [index: string]: Hierarchy; } = {};\r\n private index: number;\r\n private items: TreeViewItem[] = [];\r\n private viewModel: kendo.data.ObservableObject;\r\n private isExactSearch;\r\n private scrollIntoView;\r\n \r\n private readonly selectableTypes: string[] = [];\r\n private readonly onSelectFunction: (node) => void;\r\n private readonly prevButtonElement: HTMLButtonElement;\r\n private readonly nextButtonElement: HTMLButtonElement;\r\n private readonly formElement: HTMLFormElement;\r\n private readonly searchTermElement: HTMLInputElement;\r\n private readonly treeElement: HTMLDivElement;\r\n\r\n constructor(options: TreeHelperOptions) {\r\n this.prev = this.prev.bind(this);\r\n this.next = this.next.bind(this);\r\n this.startSearch = this.startSearch.bind(this);\r\n this.treeElement = document.querySelector(\"div#modal_tree\");\r\n this.prevButtonElement = this.treeElement.querySelector(\"button#btn_prev\");\r\n this.prevButtonElement.addEventListener(\"click\", this.prev);\r\n this.nextButtonElement = this.treeElement.querySelector(\"button#btn_next\");\r\n this.nextButtonElement.addEventListener(\"click\", this.next);\r\n this.formElement = this.treeElement.querySelector(\"form#form_filter\");\r\n this.formElement.addEventListener(\"submit\", this.startSearch);\r\n this.searchTermElement = this.treeElement.querySelector(\"input#searchTerm\");\r\n this.selectableTypes = options.selectableTypes;\r\n this.onSelectFunction = options.onSelectFunction;\r\n this.scrollIntoView = options.scrollIntoView;\r\n this.isExactSearch = options.isExactSearch;\r\n }\r\n\r\n public initTree(items: TreeViewItem[], viewModel: kendo.data.ObservableObject): void {\r\n this.createHierarchy(items);\r\n this.items = items;\r\n this.viewModel = viewModel;\r\n this.updateTree();\r\n }\r\n\r\n public select(node: TreeViewItem) {\r\n if (typeof this.onSelectFunction === \"function\" && this.isSelectable(node)) {\r\n this.onSelectFunction(node);\r\n }\r\n }\r\n\r\n private isSelectable(node: TreeViewItem) {\r\n return this.selectableTypes.indexOf(node.type) > -1;\r\n }\r\n\r\n private createHierarchy(items: TreeViewItem[]) {\r\n if (items && items.length > 0) {\r\n items.forEach(item => {\r\n this.hierarchy[item.key] = new Hierarchy(item.key, item.pk);\r\n if (item.items && item.items.length > 0) {\r\n this.createHierarchy(item.items);\r\n }\r\n });\r\n }\r\n }\r\n\r\n private enrichTree(items: TreeViewItem[]) {\r\n items.forEach(item => {\r\n item.expanded = this.expandedKeys && this.expandedKeys.length > 0 && this.expandedKeys.indexOf(item.key) !== -1;\r\n item.isMatch = this.matches && this.matches.length > 0 && this.matches.indexOf(item.key) !== -1;\r\n item.iconClassName = this.getIconClassName(item);\r\n item.className = this.getClassName(item);\r\n if (item.items && item.items.length > 0) {\r\n this.enrichTree(item.items);\r\n }\r\n });\r\n }\r\n\r\n private getIconClassName(item: TreeViewItem) {\r\n if (item !== null && item.type) {\r\n switch (item.type) {\r\n case \"Oberbegriff\":\r\n return \"fas fa-sitemap\";\r\n case \"Merkmal\":\r\n return \"fas fa-square\";\r\n case \"Feld\":\r\n return \"fas fa-list\";\r\n case \"Index\":\r\n return \"fas fa-search\";\r\n case \"Hierarchie\":\r\n return \"fas fa-cubes\";\r\n }\r\n }\r\n return \"fas fa-birthday-cake\"; // unbekannter Knotentyp\r\n }\r\n\r\n private getClassName(item: TreeViewItem) {\r\n let className = \"\";\r\n if (item != null) {\r\n if (this.isSelectable(item)) {\r\n className += \"selectable\";\r\n }\r\n if (this.isCurrentMatch(item)) {\r\n className += \" highlight\";\r\n }\r\n }\r\n return className;\r\n }\r\n\r\n private isCurrentMatch(item: TreeViewItem) {\r\n if (this.matches && this.matches.length > 0 && this.index !== undefined) {\r\n return this.matches[this.index] === item.key;\r\n }\r\n return false;\r\n }\r\n\r\n private startSearch(e: Event) {\r\n this.search({\r\n searchTerm: this.searchTermElement.value,\r\n searchType: (this.treeElement.querySelector(\"input[name=searchType]:checked\") as HTMLInputElement).value as SearchType,\r\n });\r\n e.preventDefault();\r\n return false;\r\n }\r\n\r\n private search(query: MerkmalSearchModel) {\r\n this.matches = [];\r\n this.index = 0;\r\n this.expandedKeys = [];\r\n this.filterBySearchType(query, this.items);\r\n if (this.matches && this.matches.length > 0) {\r\n this.expandByKey(this.matches[0]);\r\n }\r\n this.updateTree();\r\n }\r\n\r\n private updateTree() {\r\n this.enrichTree(this.items);\r\n this.viewModel.set(\"tree\", this.items);\r\n }\r\n\r\n private filterBySearchType(query: MerkmalSearchModel, items: TreeViewItem[]) {\r\n switch (query.searchType) {\r\n case \"name\":\r\n this.filterByText({\r\n items: items,\r\n key: \"ROOT\",\r\n text: \"root\",\r\n type: \"Oberbegriff\",\r\n },\r\n query.searchTerm);\r\n break;\r\n\r\n case \"key\":\r\n this.filterByKey({\r\n items: items,\r\n key: \"ROOT\",\r\n text: \"root\",\r\n type: \"Oberbegriff\"\r\n },\r\n query.searchTerm);\r\n break;\r\n\r\n default:\r\n throw new Error(\"No such search type\");\r\n }\r\n }\r\n\r\n\r\n private filterByKey(merkmal: TreeViewItem, searchTerm: string): void {\r\n const key = merkmal.key.toUpperCase();\r\n let isMatch: boolean;\r\n if (this.isExactSearch) {\r\n isMatch = key === searchTerm.toUpperCase();\r\n } else {\r\n isMatch = key.indexOf(searchTerm.toUpperCase()) > -1;\r\n }\r\n\r\n merkmal.isMatch = isMatch;\r\n if (isMatch) {\r\n this.matches.push(merkmal.key);\r\n }\r\n if (merkmal.items && merkmal.items.length > 0) {\r\n merkmal.items.forEach(item => {\r\n this.filterByKey(item, searchTerm);\r\n });\r\n }\r\n }\r\n\r\n private filterByText(merkmal: TreeViewItem, searchTerm: string): void {\r\n const name = merkmal.text.toUpperCase();\r\n let isMatch: boolean;\r\n if (this.isExactSearch) {\r\n isMatch = name === searchTerm.toUpperCase();\r\n } else {\r\n isMatch = name.indexOf(searchTerm.toUpperCase()) > -1;\r\n }\r\n merkmal.isMatch = isMatch;\r\n if (isMatch) {\r\n this.matches.push(merkmal.key);\r\n }\r\n if (merkmal.items && merkmal.items.length > 0) {\r\n merkmal.items.forEach(item => {\r\n this.filterByText(item, searchTerm);\r\n });\r\n }\r\n }\r\n\r\n private prev() {\r\n if (this.matches && this.matches.length > 0) {\r\n this.index--;\r\n if (this.index < 0) {\r\n this.index = this.matches.length - 1;\r\n } \r\n this.expandedKeys = [];\r\n this.expandByKey(this.matches[this.index]);\r\n this.enrichTree(this.items);\r\n this.updateTree();\r\n }\r\n }\r\n\r\n private next() {\r\n if (this.matches && this.matches.length > 0) {\r\n this.index++;\r\n if (this.index >= this.matches.length) {\r\n this.index = 0;\r\n }\r\n this.expandedKeys = [];\r\n this.expandByKey(this.matches[this.index]);\r\n this.enrichTree(this.items);\r\n this.updateTree();\r\n }\r\n }\r\n\r\n private expandByKey(key: string) {\r\n if (!!key) {\r\n this.expandedKeys.push(key);\r\n if (this.hierarchy[key] && this.hierarchy[key].pk !== \"root\") {\r\n this.expandByKey(this.hierarchy[key].pk);\r\n } else {\r\n this.scrollTo();\r\n }\r\n }\r\n }\r\n\r\n private scrollTo(): void {\r\n if (this.scrollIntoView) {\r\n setTimeout(() => {\r\n let element = this.treeElement.querySelector(\".highlight\");\r\n if (element) {\r\n element.scrollIntoView({ block: \"center\", behavior: \"smooth\", inline: \"end\" });\r\n }\r\n }, 400);\r\n }\r\n }\r\n}\r\n"],"names":["key","pk","this","options","expandedKeys","hierarchy","items","selectableTypes","prev","bind","next","startSearch","treeElement","document","querySelector","prevButtonElement","addEventListener","nextButtonElement","formElement","searchTermElement","onSelectFunction","scrollIntoView","isExactSearch","initTree","viewModel","createHierarchy","updateTree","select","node","isSelectable","indexOf","type","length","forEach","item","Hierarchy","enrichTree","expanded","isMatch","matches","iconClassName","getIconClassName","className","getClassName","isCurrentMatch","undefined","index","e","search","searchTerm","value","searchType","preventDefault","query","filterBySearchType","expandByKey","set","filterByText","text","filterByKey","Error","merkmal","toUpperCase","push","name","scrollTo","setTimeout","element","block","behavior","inline","TreeHelper"],"sourceRoot":""}