ng-material-multilevel-menu
Version:
Material Multi-Level Menu for Angular Projects.
83 lines • 10.6 kB
JavaScript
import { Subject } from 'rxjs';
import { ExpandCollapseStatusEnum } from './app.model';
import { CONSTANT } from './constants';
export class MultilevelMenuService {
constructor() {
this.expandCollapseStatus = new Subject();
this.expandCollapseStatus$ = this.expandCollapseStatus.asObservable();
this.selectedMenuID = new Subject();
this.selectedMenuID$ = this.selectedMenuID.asObservable();
}
generateId() {
let text = '';
for (let i = 0; i < 20; i++) {
text += CONSTANT.POSSIBLE.charAt(Math.floor(Math.random() * CONSTANT.POSSIBLE.length));
}
return text;
}
addRandomId(nodes) {
nodes.forEach((node) => {
node.id = this.generateId();
if (node.items !== undefined) {
this.addRandomId(node.items);
}
});
}
recursiveCheckId(node, nodeId) {
if (node.id === nodeId) {
return true;
}
else {
if (node.items !== undefined) {
return node.items.some((nestedNode) => {
return this.recursiveCheckId(nestedNode, nodeId);
});
}
}
}
findNodeRecursively({ nodes, link, id }) {
for (let nodeIndex = 0; nodeIndex < nodes.length; nodeIndex++) {
const node = nodes[nodeIndex];
for (const key in node) {
if (node.hasOwnProperty(key)) {
if (encodeURI(node.link) === link) {
this.foundLinkObject = node;
}
else if (node.id === id) {
this.foundLinkObject = node;
}
else {
if (node.items !== undefined) {
this.findNodeRecursively({
nodes: node.items,
link: link ? link : null,
id: id ? id : null
});
}
}
}
}
}
}
getMatchedObjectByUrl(nodes, link) {
this.findNodeRecursively({ nodes, link });
return this.foundLinkObject;
}
getMatchedObjectById(nodes, id) {
this.findNodeRecursively({ nodes, id });
return this.foundLinkObject;
}
// overrides key-value pipe's default reordering (by key) by implementing dummy comprarer function
// https://angular.io/api/common/KeyValuePipe#description
kvDummyComparerFn() {
return 0;
}
setMenuExpandCollapseStatus(status) {
this.expandCollapseStatus.next(status ? status : ExpandCollapseStatusEnum.neutral);
}
selectMenuByID(menuID) {
this.selectedMenuID.next(menuID);
return this.foundLinkObject;
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGlsZXZlbC1tZW51LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1tYXRlcmlhbC1tdWx0aWxldmVsLW1lbnUvc3JjL2xpYi9tdWx0aWxldmVsLW1lbnUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQyxPQUFPLEVBQThCLE9BQU8sRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUMzRCxPQUFPLEVBQWtCLHdCQUF3QixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3ZFLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFckMsTUFBTSxPQUFPLHFCQUFxQjtJQUFsQztRQUVVLHlCQUFvQixHQUFzQyxJQUFJLE9BQU8sRUFBNEIsQ0FBQztRQUMxRywwQkFBcUIsR0FBeUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFlBQVksRUFBRSxDQUFDO1FBRS9GLG1CQUFjLEdBQW9CLElBQUksT0FBTyxFQUFVLENBQUM7UUFDaEUsb0JBQWUsR0FBdUIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQXNFM0UsQ0FBQztJQXBFUyxVQUFVO1FBQ2hCLElBQUksSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUNkLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDM0IsSUFBSSxJQUFJLFFBQVEsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztTQUN4RjtRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUNELFdBQVcsQ0FBQyxLQUF1QjtRQUNqQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBb0IsRUFBRSxFQUFFO1lBQ3JDLElBQUksQ0FB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QixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIgaW1wb3J0IHtCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUsIFN1YmplY3R9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgTXVsdGlsZXZlbE5vZGUsIEV4cGFuZENvbGxhcHNlU3RhdHVzRW51bSB9IGZyb20gJy4vYXBwLm1vZGVsJztcbmltcG9ydCB7Q09OU1RBTlR9IGZyb20gJy4vY29uc3RhbnRzJztcblxuZXhwb3J0IGNsYXNzIE11bHRpbGV2ZWxNZW51U2VydmljZSB7XG4gIGZvdW5kTGlua09iamVjdDogTXVsdGlsZXZlbE5vZGU7XG4gIHByaXZhdGUgZXhwYW5kQ29sbGFwc2VTdGF0dXM6IFN1YmplY3Q8RXhwYW5kQ29sbGFwc2VTdGF0dXNFbnVtPiA9IG5ldyBTdWJqZWN0PEV4cGFuZENvbGxhcHNlU3RhdHVzRW51bT4oKTtcbiAgZXhwYW5kQ29sbGFwc2VTdGF0dXMkOiBPYnNlcnZhYmxlPEV4cGFuZENvbGxhcHNlU3RhdHVzRW51bT4gPSB0aGlzLmV4cGFuZENvbGxhcHNlU3RhdHVzLmFzT2JzZXJ2YWJsZSgpO1xuXG4gIHByaXZhdGUgc2VsZWN0ZWRNZW51SUQ6IFN1YmplY3Q8c3RyaW5nPiA9IG5ldyBTdWJqZWN0PHN0cmluZz4oKTtcbiAgc2VsZWN0ZWRNZW51SUQkOiBPYnNlcnZhYmxlPHN0cmluZz4gPSB0aGlzLnNlbGVjdGVkTWVudUlELmFzT2JzZXJ2YWJsZSgpO1xuXG4gIHByaXZhdGUgZ2VuZXJhdGVJZCgpOiBzdHJpbmcge1xuICAgIGxldCB0ZXh0ID0gJyc7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCAyMDsgaSsrKSB7XG4gICAgICB0ZXh0ICs9IENPTlNUQU5ULlBPU1NJQkxFLmNoYXJBdChNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBDT05TVEFOVC5QT1NTSUJMRS5sZW5ndGgpKTtcbiAgICB9XG4gICAgcmV0dXJuIHRleHQ7XG4gIH1cbiAgYWRkUmFuZG9tSWQobm9kZXM6IE11bHRpbGV2ZWxOb2RlW10pOiB2b2lkIHtcbiAgICBub2Rlcy5mb3JFYWNoKChub2RlOiBNdWx0aWxldmVsTm9kZSkgPT4ge1xuICAgICAgbm9kZS5pZCA9IHRoaXMuZ2VuZXJhdGVJZCgpO1xuICAgICAgaWYgKG5vZGUuaXRlbXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmFkZFJhbmRvbUlkKG5vZGUuaXRlbXMpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIHJlY3Vyc2l2ZUNoZWNrSWQobm9kZTogTXVsdGlsZXZlbE5vZGUsIG5vZGVJZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKG5vZGUuaWQgPT09IG5vZGVJZCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChub2RlLml0ZW1zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUuaXRlbXMuc29tZSgobmVzdGVkTm9kZTogTXVsdGlsZXZlbE5vZGUpID0+IHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5yZWN1cnNpdmVDaGVja0lkKG5lc3RlZE5vZGUsIG5vZGVJZCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBwcml2YXRlIGZpbmROb2RlUmVjdXJzaXZlbHkoe25vZGVzLCBsaW5rLCBpZH06IHtub2RlczogTXVsdGlsZXZlbE5vZGVbXSwgbGluaz86IHN0cmluZywgaWQ/OiBzdHJpbmd9KTogdm9pZCB7XG4gICAgZm9yIChsZXQgbm9kZUluZGV4ID0gMDsgbm9kZUluZGV4IDwgbm9kZXMubGVuZ3RoOyBub2RlSW5kZXgrKykge1xuICAgICAgY29uc3Qgbm9kZSA9IG5vZGVzW25vZGVJbmRleF07XG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiBub2RlKSB7XG4gICAgICAgIGlmIChub2RlLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICBpZiAoZW5jb2RlVVJJKG5vZGUubGluaykgPT09IGxpbmspIHtcbiAgICAgICAgICAgIHRoaXMuZm91bmRMaW5rT2JqZWN0ID0gbm9kZTtcbiAgICAgICAgICB9IGVsc2UgaWYgKG5vZGUuaWQgPT09IGlkKSB7XG4gICAgICAgICAgICB0aGlzLmZvdW5kTGlua09iamVjdCA9IG5vZGU7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChub2RlLml0ZW1zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgdGhpcy5maW5kTm9kZVJlY3Vyc2l2ZWx5KHtcbiAgICAgICAgICAgICAgICBub2Rlczogbm9kZS5pdGVtcyxcbiAgICAgICAgICAgICAgICBsaW5rOiBsaW5rID8gbGluayA6IG51bGwsXG4gICAgICAgICAgICAgICAgaWQ6IGlkID8gaWQgOiBudWxsXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICBnZXRNYXRjaGVkT2JqZWN0QnlVcmwobm9kZXM6IE11bHRpbGV2ZWxOb2RlW10sIGxpbms6IHN0cmluZyk6IE11bHRpbGV2ZWxOb2RlIHtcbiAgICB0aGlzLmZpbmROb2RlUmVjdXJzaXZlbHkoe25vZGVzLCBsaW5rfSk7XG4gICAgcmV0dXJuIHRoaXMuZm91bmRMaW5rT2JqZWN0O1xuICB9XG4gIGdldE1hdGNoZWRPYmplY3RCeUlkKG5vZGVzOiBNdWx0aWxldmVsTm9kZVtdLCBpZDogc3RyaW5nKTogTXVsdGlsZXZlbE5vZGUge1xuICAgIHRoaXMuZmluZE5vZGVSZWN1cnNpdmVseSh7bm9kZXMsIGlkfSk7XG4gICAgcmV0dXJuIHRoaXMuZm91bmRMaW5rT2JqZWN0O1xuICB9XG4gIC8vIG92ZXJyaWRlcyBrZXktdmFsdWUgcGlwZSdzIGRlZmF1bHQgcmVvcmRlcmluZyAoYnkga2V5KSBieSBpbXBsZW1lbnRpbmcgZHVtbXkgY29tcHJhcmVyIGZ1bmN0aW9uXG4gIC8vIGh0dHBzOi8vYW5ndWxhci5pby9hcGkvY29tbW9uL0tleVZhbHVlUGlwZSNkZXNjcmlwdGlvblxuICBrdkR1bW15Q29tcGFyZXJGbigpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuICBzZXRNZW51RXhwYW5kQ29sbGFwc2VTdGF0dXMoc3RhdHVzOiBFeHBhbmRDb2xsYXBzZVN0YXR1c0VudW0pOiB2b2lkIHtcbiAgICB0aGlzLmV4cGFuZENvbGxhcHNlU3RhdHVzLm5leHQoc3RhdHVzID8gc3RhdHVzIDogRXhwYW5kQ29sbGFwc2VTdGF0dXNFbnVtLm5ldXRyYWwpO1xuICB9XG4gIHNlbGVjdE1lbnVCeUlEKG1lbnVJRDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZWxlY3RlZE1lbnVJRC5uZXh0KG1lbnVJRCk7XG4gICAgcmV0dXJuIHRoaXMuZm91bmRMaW5rT2JqZWN0O1xuICB9XG59XG4iXX0=