UNPKG

@progress/kendo-angular-menu

Version:

Kendo UI Angular Menu component

129 lines (128 loc) 4.15 kB
/**----------------------------------------------------------------------------------------- * Copyright © 2025 Progress Software Corporation. All rights reserved. * Licensed under commercial license. See LICENSE.md in the project root for more information *-------------------------------------------------------------------------------------------*/ import { Injectable } from '@angular/core'; import * as i0 from "@angular/core"; const PARENT_REGEX = /_?\d+$/; const SEPARATOR = '_'; let id = 0; const itemIndexComparer = (a, b) => a.siblingIndex - b.siblingIndex; const next = (idx, items, dir) => { let current = items[idx + dir]; while (!current) { if (idx < 0) { idx = items.length - 1; } else if (idx >= items.length) { idx = 0; } else { idx += dir; } current = items[idx]; } return current; }; /** * @hidden */ export class ItemsService { items = {}; lists = []; idPrefix = `k-menu${id++}`; get hasItems() { return Object.keys(this.items).length > 0; } childId(index) { return `${this.idPrefix}-child${index}`; } itemIndex(parentIndex, index) { return (parentIndex ? parentIndex + SEPARATOR : '') + index; } get(index) { return this.items[index]; } add(item) { this.items[item.index] = item; } remove(item) { if (this.items[item.index] === item) { delete this.items[item.index]; } } addList(list) { this.lists.push(list); } removeList(list) { const index = this.lists.indexOf(list); if (index >= 0) { this.lists.splice(index, 1); } } containsList(element) { return Boolean(this.lists.find(list => list.element.nativeElement === element)); } siblings(item) { const parentIndex = this.parentIndex(item.index); return this.filter((index) => this.parentIndex(index) === parentIndex); } otherSiblings(item) { const parentIndex = this.parentIndex(item.index); return this.filter((index) => this.parentIndex(index) === parentIndex && index !== item.index); } children(item) { return this.filter((index) => this.parentIndex(index) === item.index); } parent(item) { return this.items[this.parentIndex(item.index)]; } root(item) { return this.items[this.indices(item.index)[0]]; } indices(index) { return index.split(SEPARATOR); } filter(predicate) { const result = []; const items = this.items; for (const index in items) { if (predicate(index, items[index])) { result.push(items[index]); } } return result.sort(itemIndexComparer); } previous(item) { const siblings = this.siblings(item); const itemIndex = siblings.indexOf(item); return next(itemIndex, siblings, -1); } next(item) { const siblings = this.siblings(item); const itemIndex = siblings.indexOf(item); return next(itemIndex, siblings, 1); } hasParent(item, parent) { return item.index.startsWith(parent.index); } areSiblings(item1, item2) { return item1 !== item2 && this.parent(item1) === this.parent(item2); } forEach(callback) { const items = this.items; for (const index in items) { if (items.hasOwnProperty(index)) { callback(items[index]); } } } parentIndex(index) { return index.replace(PARENT_REGEX, ''); } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ItemsService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ItemsService }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ItemsService, decorators: [{ type: Injectable }] });