@progress/kendo-angular-menu
Version:
Kendo UI Angular Menu component
129 lines (128 loc) • 4.15 kB
JavaScript
/**-----------------------------------------------------------------------------------------
* 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
}] });