ngx-vector-components 6.29.1 → 6.29.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # Changelog
2
2
 
3
+ ## [6.29.2] (16/09/2026)
4
+
5
+ ### Fix
6
+
7
+ - Fixes the issue where the main menu's submenu would close upon clicking a submenu item in (`menu.component.ts` and `sub-menu-list.component.ts`)
8
+
3
9
  ## [6.29.1] (16/09/2026)
4
10
 
5
11
  ### Fix
@@ -6194,15 +6194,19 @@ class SubMenusListComponent {
6194
6194
  this.submenuSelectedChange.emit(option);
6195
6195
  }
6196
6196
  }
6197
+ onChildSelectedChange(option) {
6198
+ // keep the submenu expanded.
6199
+ this.submenuSelectedChange.emit(option);
6200
+ }
6197
6201
  get paddingLeft() {
6198
6202
  return this.childLevel * 10 + 'px';
6199
6203
  }
6200
6204
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: SubMenusListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
6201
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.25", type: SubMenusListComponent, isStandalone: false, selector: "vector-sub-menus-list", inputs: { showList: "showList", options: "options", childLevel: "childLevel", submenuSelected: "submenuSelected" }, outputs: { submenuSelectedChange: "submenuSelectedChange" }, ngImport: i0, template: "<div class=\"sub-menu-container\">\n <ul *ngIf=\"showList\" class=\"sub-menu\">\n <div *ngFor=\"let submenuItem of options\">\n <li class=\"sub-menu-item\" [ngStyle]=\"{ 'padding-left': paddingLeft }\" (click)=\"submenuClick(submenuItem)\">\n <div\n class=\"current-item\"\n [ngClass]=\"{\n 'active-menu': submenuSelected?.id === submenuItem.id,\n 'always-open': !!submenuItem.alwaysOpen,\n 'last-child': !submenuItem.children?.length || submenuItem.showChildren === false\n }\"\n >\n <div *ngIf=\"submenuItem.icon\" class=\"icon-container\">\n <i [class]=\"submenuItem.icon\"></i>\n </div>\n <span class=\"menu-label\">{{ submenuItem.label }}</span>\n <i\n *ngIf=\"submenuItem.children?.length && !submenuItem.alwaysOpen && submenuItem.showChildren !== false\"\n class=\"fas angle-icon\"\n [ngClass]=\"{\n 'fa-angle-down': submenuSelected?.id !== submenuItem.id,\n 'fa-angle-up': submenuSelected?.id === submenuItem.id\n }\"\n ></i>\n </div>\n </li>\n <vector-sub-menus-list\n *ngIf=\"submenuItem?.children && submenuItem?.showChildren !== false\"\n [options]=\"submenuItem?.children\"\n [showList]=\"submenuItem?.id === submenuSelected?.id || !!submenuItem?.alwaysOpen\"\n [childLevel]=\"childLevel + 1\"\n (submenuSelectedChange)=\"submenuClick($event)\"\n ></vector-sub-menus-list>\n </div>\n </ul>\n</div>\n", styles: [".angle-icon{position:absolute;right:10px}.menu-icon{filter:brightness(0) saturate(100%) invert(14%) sepia(87%) saturate(1218%) hue-rotate(233deg) brightness(88%) contrast(90%);width:20px;height:20px}.icon-container{width:20px;height:20px;position:relative}.icon-container .menu-icon{display:flex;justify-content:center;align-items:center;font-size:1.4em}.icon-container .menu-notifications-count{padding:0 4.5px;background-color:var(--error-color);border-radius:10px;position:absolute;top:-4px;right:-4px;font-size:8px}.menu-label{color:var(--theme-dark);font-weight:600;text-decoration:none;padding-bottom:1px;padding-right:24px;margin-left:20px;min-width:170px;white-space:normal;overflow:visible}.active-menu:not(.always-open){background-color:var(--gray-light)}.sub-menu-container .sub-menu{list-style:none;display:contents}.sub-menu-container .sub-menu .sub-menu-item{animation:showSubMenu ease-in-out .1s;animation-fill-mode:both}.sub-menu-container .sub-menu .sub-menu-item:not(:first-child):nth-child(n){animation-delay:50ms}.sub-menu-container .sub-menu .sub-menu-item:not(:first-child):nth-child(2n){animation-delay:.1s}.sub-menu-container .sub-menu .sub-menu-item:not(:first-child):nth-child(3n){animation-delay:.15s}.sub-menu-container .sub-menu .sub-menu-item:not(:first-child):nth-child(4n){animation-delay:.2s}.sub-menu-container .sub-menu .sub-menu-item:not(:first-child):nth-child(5n){animation-delay:.25s}.sub-menu-container .sub-menu .sub-menu-item:not(:first-child):nth-child(6n){animation-delay:.3s}.sub-menu-container .sub-menu .sub-menu-item:not(:first-child):nth-child(7n){animation-delay:.35s}.sub-menu-container .sub-menu .sub-menu-item:not(:first-child):nth-child(8n){animation-delay:.4s}.sub-menu-container .sub-menu .sub-menu-item:not(:first-child):nth-child(9n){animation-delay:.45s}.sub-menu-container .sub-menu .sub-menu-item:not(:first-child):nth-child(10n){animation-delay:.5s}.sub-menu-container .sub-menu .sub-menu-item .current-item{min-height:40px;display:flex;flex-direction:row;align-items:center;transition:background-color ease-in-out .1s;z-index:2;overflow:hidden;padding:0 10px;border-radius:15px;margin:5px 0;position:relative}.sub-menu-container .sub-menu .sub-menu-item .current-item:not(.always-open){cursor:pointer}.sub-menu-container .sub-menu .sub-menu-item .current-item:hover,.sub-menu-container .sub-menu .sub-menu-item .current-item.active{background-color:var(--gray-light)}.sub-menu-container .sub-menu .sub-menu-item .current-item.active span,.sub-menu-container .sub-menu .sub-menu-item .current-item.active i{color:#fff}@keyframes showSubMenu{0%{transform:translate(-100%)}to{transform:translate(0)}}.sub-menu-container .sub-menu .sub-menu-item .last-child .menu-label{font-weight:400}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: SubMenusListComponent, selector: "vector-sub-menus-list", inputs: ["showList", "options", "childLevel", "submenuSelected"], outputs: ["submenuSelectedChange"] }] }); }
6205
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.25", type: SubMenusListComponent, isStandalone: false, selector: "vector-sub-menus-list", inputs: { showList: "showList", options: "options", childLevel: "childLevel", submenuSelected: "submenuSelected" }, outputs: { submenuSelectedChange: "submenuSelectedChange" }, ngImport: i0, template: "<div class=\"sub-menu-container\">\n <ul *ngIf=\"showList\" class=\"sub-menu\">\n <div *ngFor=\"let submenuItem of options\">\n <li class=\"sub-menu-item\" [ngStyle]=\"{ 'padding-left': paddingLeft }\" (click)=\"submenuClick(submenuItem)\">\n <div\n class=\"current-item\"\n [ngClass]=\"{\n 'active-menu': submenuSelected?.id === submenuItem.id,\n 'always-open': !!submenuItem.alwaysOpen,\n 'last-child': !submenuItem.children?.length || submenuItem.showChildren === false,\n }\"\n >\n <div *ngIf=\"submenuItem.icon\" class=\"icon-container\">\n <i [class]=\"submenuItem.icon\"></i>\n </div>\n <span class=\"menu-label\">{{ submenuItem.label }}</span>\n <i\n *ngIf=\"submenuItem.children?.length && !submenuItem.alwaysOpen && submenuItem.showChildren !== false\"\n class=\"fas angle-icon\"\n [ngClass]=\"{\n 'fa-angle-down': submenuSelected?.id !== submenuItem.id,\n 'fa-angle-up': submenuSelected?.id === submenuItem.id,\n }\"\n ></i>\n </div>\n </li>\n <vector-sub-menus-list\n *ngIf=\"submenuItem?.children && submenuItem?.showChildren !== false\"\n [options]=\"submenuItem?.children\"\n [showList]=\"submenuItem?.id === submenuSelected?.id || !!submenuItem?.alwaysOpen\"\n [childLevel]=\"childLevel + 1\"\n (submenuSelectedChange)=\"onChildSelectedChange($event)\"\n ></vector-sub-menus-list>\n </div>\n </ul>\n</div>\n", styles: [".angle-icon{position:absolute;right:10px}.menu-icon{filter:brightness(0) saturate(100%) invert(14%) sepia(87%) saturate(1218%) hue-rotate(233deg) brightness(88%) contrast(90%);width:20px;height:20px}.icon-container{width:20px;height:20px;position:relative}.icon-container .menu-icon{display:flex;justify-content:center;align-items:center;font-size:1.4em}.icon-container .menu-notifications-count{padding:0 4.5px;background-color:var(--error-color);border-radius:10px;position:absolute;top:-4px;right:-4px;font-size:8px}.menu-label{color:var(--theme-dark);font-weight:600;text-decoration:none;padding-bottom:1px;padding-right:24px;margin-left:20px;min-width:170px;white-space:normal;overflow:visible}.active-menu:not(.always-open){background-color:var(--gray-light)}.sub-menu-container .sub-menu{list-style:none;display:contents}.sub-menu-container .sub-menu .sub-menu-item{animation:showSubMenu ease-in-out .1s;animation-fill-mode:both}.sub-menu-container .sub-menu .sub-menu-item:not(:first-child):nth-child(n){animation-delay:50ms}.sub-menu-container .sub-menu .sub-menu-item:not(:first-child):nth-child(2n){animation-delay:.1s}.sub-menu-container .sub-menu .sub-menu-item:not(:first-child):nth-child(3n){animation-delay:.15s}.sub-menu-container .sub-menu .sub-menu-item:not(:first-child):nth-child(4n){animation-delay:.2s}.sub-menu-container .sub-menu .sub-menu-item:not(:first-child):nth-child(5n){animation-delay:.25s}.sub-menu-container .sub-menu .sub-menu-item:not(:first-child):nth-child(6n){animation-delay:.3s}.sub-menu-container .sub-menu .sub-menu-item:not(:first-child):nth-child(7n){animation-delay:.35s}.sub-menu-container .sub-menu .sub-menu-item:not(:first-child):nth-child(8n){animation-delay:.4s}.sub-menu-container .sub-menu .sub-menu-item:not(:first-child):nth-child(9n){animation-delay:.45s}.sub-menu-container .sub-menu .sub-menu-item:not(:first-child):nth-child(10n){animation-delay:.5s}.sub-menu-container .sub-menu .sub-menu-item .current-item{min-height:40px;display:flex;flex-direction:row;align-items:center;transition:background-color ease-in-out .1s;z-index:2;overflow:hidden;padding:0 10px;border-radius:15px;margin:5px 0;position:relative}.sub-menu-container .sub-menu .sub-menu-item .current-item:not(.always-open){cursor:pointer}.sub-menu-container .sub-menu .sub-menu-item .current-item:hover,.sub-menu-container .sub-menu .sub-menu-item .current-item.active{background-color:var(--gray-light)}.sub-menu-container .sub-menu .sub-menu-item .current-item.active span,.sub-menu-container .sub-menu .sub-menu-item .current-item.active i{color:#fff}@keyframes showSubMenu{0%{transform:translate(-100%)}to{transform:translate(0)}}.sub-menu-container .sub-menu .sub-menu-item .last-child .menu-label{font-weight:400}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: SubMenusListComponent, selector: "vector-sub-menus-list", inputs: ["showList", "options", "childLevel", "submenuSelected"], outputs: ["submenuSelectedChange"] }] }); }
6202
6206
  }
6203
6207
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: SubMenusListComponent, decorators: [{
6204
6208
  type: Component,
6205
- args: [{ standalone: false, selector: 'vector-sub-menus-list', template: "<div class=\"sub-menu-container\">\n <ul *ngIf=\"showList\" class=\"sub-menu\">\n <div *ngFor=\"let submenuItem of options\">\n <li class=\"sub-menu-item\" [ngStyle]=\"{ 'padding-left': paddingLeft }\" (click)=\"submenuClick(submenuItem)\">\n <div\n class=\"current-item\"\n [ngClass]=\"{\n 'active-menu': submenuSelected?.id === submenuItem.id,\n 'always-open': !!submenuItem.alwaysOpen,\n 'last-child': !submenuItem.children?.length || submenuItem.showChildren === false\n }\"\n >\n <div *ngIf=\"submenuItem.icon\" class=\"icon-container\">\n <i [class]=\"submenuItem.icon\"></i>\n </div>\n <span class=\"menu-label\">{{ submenuItem.label }}</span>\n <i\n *ngIf=\"submenuItem.children?.length && !submenuItem.alwaysOpen && submenuItem.showChildren !== false\"\n class=\"fas angle-icon\"\n [ngClass]=\"{\n 'fa-angle-down': submenuSelected?.id !== submenuItem.id,\n 'fa-angle-up': submenuSelected?.id === submenuItem.id\n }\"\n ></i>\n </div>\n </li>\n <vector-sub-menus-list\n *ngIf=\"submenuItem?.children && submenuItem?.showChildren !== false\"\n [options]=\"submenuItem?.children\"\n [showList]=\"submenuItem?.id === submenuSelected?.id || !!submenuItem?.alwaysOpen\"\n [childLevel]=\"childLevel + 1\"\n (submenuSelectedChange)=\"submenuClick($event)\"\n ></vector-sub-menus-list>\n </div>\n </ul>\n</div>\n", styles: [".angle-icon{position:absolute;right:10px}.menu-icon{filter:brightness(0) saturate(100%) invert(14%) sepia(87%) saturate(1218%) hue-rotate(233deg) brightness(88%) contrast(90%);width:20px;height:20px}.icon-container{width:20px;height:20px;position:relative}.icon-container .menu-icon{display:flex;justify-content:center;align-items:center;font-size:1.4em}.icon-container .menu-notifications-count{padding:0 4.5px;background-color:var(--error-color);border-radius:10px;position:absolute;top:-4px;right:-4px;font-size:8px}.menu-label{color:var(--theme-dark);font-weight:600;text-decoration:none;padding-bottom:1px;padding-right:24px;margin-left:20px;min-width:170px;white-space:normal;overflow:visible}.active-menu:not(.always-open){background-color:var(--gray-light)}.sub-menu-container .sub-menu{list-style:none;display:contents}.sub-menu-container .sub-menu .sub-menu-item{animation:showSubMenu ease-in-out .1s;animation-fill-mode:both}.sub-menu-container .sub-menu .sub-menu-item:not(:first-child):nth-child(n){animation-delay:50ms}.sub-menu-container .sub-menu .sub-menu-item:not(:first-child):nth-child(2n){animation-delay:.1s}.sub-menu-container .sub-menu .sub-menu-item:not(:first-child):nth-child(3n){animation-delay:.15s}.sub-menu-container .sub-menu .sub-menu-item:not(:first-child):nth-child(4n){animation-delay:.2s}.sub-menu-container .sub-menu .sub-menu-item:not(:first-child):nth-child(5n){animation-delay:.25s}.sub-menu-container .sub-menu .sub-menu-item:not(:first-child):nth-child(6n){animation-delay:.3s}.sub-menu-container .sub-menu .sub-menu-item:not(:first-child):nth-child(7n){animation-delay:.35s}.sub-menu-container .sub-menu .sub-menu-item:not(:first-child):nth-child(8n){animation-delay:.4s}.sub-menu-container .sub-menu .sub-menu-item:not(:first-child):nth-child(9n){animation-delay:.45s}.sub-menu-container .sub-menu .sub-menu-item:not(:first-child):nth-child(10n){animation-delay:.5s}.sub-menu-container .sub-menu .sub-menu-item .current-item{min-height:40px;display:flex;flex-direction:row;align-items:center;transition:background-color ease-in-out .1s;z-index:2;overflow:hidden;padding:0 10px;border-radius:15px;margin:5px 0;position:relative}.sub-menu-container .sub-menu .sub-menu-item .current-item:not(.always-open){cursor:pointer}.sub-menu-container .sub-menu .sub-menu-item .current-item:hover,.sub-menu-container .sub-menu .sub-menu-item .current-item.active{background-color:var(--gray-light)}.sub-menu-container .sub-menu .sub-menu-item .current-item.active span,.sub-menu-container .sub-menu .sub-menu-item .current-item.active i{color:#fff}@keyframes showSubMenu{0%{transform:translate(-100%)}to{transform:translate(0)}}.sub-menu-container .sub-menu .sub-menu-item .last-child .menu-label{font-weight:400}\n"] }]
6209
+ args: [{ standalone: false, selector: 'vector-sub-menus-list', template: "<div class=\"sub-menu-container\">\n <ul *ngIf=\"showList\" class=\"sub-menu\">\n <div *ngFor=\"let submenuItem of options\">\n <li class=\"sub-menu-item\" [ngStyle]=\"{ 'padding-left': paddingLeft }\" (click)=\"submenuClick(submenuItem)\">\n <div\n class=\"current-item\"\n [ngClass]=\"{\n 'active-menu': submenuSelected?.id === submenuItem.id,\n 'always-open': !!submenuItem.alwaysOpen,\n 'last-child': !submenuItem.children?.length || submenuItem.showChildren === false,\n }\"\n >\n <div *ngIf=\"submenuItem.icon\" class=\"icon-container\">\n <i [class]=\"submenuItem.icon\"></i>\n </div>\n <span class=\"menu-label\">{{ submenuItem.label }}</span>\n <i\n *ngIf=\"submenuItem.children?.length && !submenuItem.alwaysOpen && submenuItem.showChildren !== false\"\n class=\"fas angle-icon\"\n [ngClass]=\"{\n 'fa-angle-down': submenuSelected?.id !== submenuItem.id,\n 'fa-angle-up': submenuSelected?.id === submenuItem.id,\n }\"\n ></i>\n </div>\n </li>\n <vector-sub-menus-list\n *ngIf=\"submenuItem?.children && submenuItem?.showChildren !== false\"\n [options]=\"submenuItem?.children\"\n [showList]=\"submenuItem?.id === submenuSelected?.id || !!submenuItem?.alwaysOpen\"\n [childLevel]=\"childLevel + 1\"\n (submenuSelectedChange)=\"onChildSelectedChange($event)\"\n ></vector-sub-menus-list>\n </div>\n </ul>\n</div>\n", styles: [".angle-icon{position:absolute;right:10px}.menu-icon{filter:brightness(0) saturate(100%) invert(14%) sepia(87%) saturate(1218%) hue-rotate(233deg) brightness(88%) contrast(90%);width:20px;height:20px}.icon-container{width:20px;height:20px;position:relative}.icon-container .menu-icon{display:flex;justify-content:center;align-items:center;font-size:1.4em}.icon-container .menu-notifications-count{padding:0 4.5px;background-color:var(--error-color);border-radius:10px;position:absolute;top:-4px;right:-4px;font-size:8px}.menu-label{color:var(--theme-dark);font-weight:600;text-decoration:none;padding-bottom:1px;padding-right:24px;margin-left:20px;min-width:170px;white-space:normal;overflow:visible}.active-menu:not(.always-open){background-color:var(--gray-light)}.sub-menu-container .sub-menu{list-style:none;display:contents}.sub-menu-container .sub-menu .sub-menu-item{animation:showSubMenu ease-in-out .1s;animation-fill-mode:both}.sub-menu-container .sub-menu .sub-menu-item:not(:first-child):nth-child(n){animation-delay:50ms}.sub-menu-container .sub-menu .sub-menu-item:not(:first-child):nth-child(2n){animation-delay:.1s}.sub-menu-container .sub-menu .sub-menu-item:not(:first-child):nth-child(3n){animation-delay:.15s}.sub-menu-container .sub-menu .sub-menu-item:not(:first-child):nth-child(4n){animation-delay:.2s}.sub-menu-container .sub-menu .sub-menu-item:not(:first-child):nth-child(5n){animation-delay:.25s}.sub-menu-container .sub-menu .sub-menu-item:not(:first-child):nth-child(6n){animation-delay:.3s}.sub-menu-container .sub-menu .sub-menu-item:not(:first-child):nth-child(7n){animation-delay:.35s}.sub-menu-container .sub-menu .sub-menu-item:not(:first-child):nth-child(8n){animation-delay:.4s}.sub-menu-container .sub-menu .sub-menu-item:not(:first-child):nth-child(9n){animation-delay:.45s}.sub-menu-container .sub-menu .sub-menu-item:not(:first-child):nth-child(10n){animation-delay:.5s}.sub-menu-container .sub-menu .sub-menu-item .current-item{min-height:40px;display:flex;flex-direction:row;align-items:center;transition:background-color ease-in-out .1s;z-index:2;overflow:hidden;padding:0 10px;border-radius:15px;margin:5px 0;position:relative}.sub-menu-container .sub-menu .sub-menu-item .current-item:not(.always-open){cursor:pointer}.sub-menu-container .sub-menu .sub-menu-item .current-item:hover,.sub-menu-container .sub-menu .sub-menu-item .current-item.active{background-color:var(--gray-light)}.sub-menu-container .sub-menu .sub-menu-item .current-item.active span,.sub-menu-container .sub-menu .sub-menu-item .current-item.active i{color:#fff}@keyframes showSubMenu{0%{transform:translate(-100%)}to{transform:translate(0)}}.sub-menu-container .sub-menu .sub-menu-item .last-child .menu-label{font-weight:400}\n"] }]
6206
6210
  }], propDecorators: { showList: [{
6207
6211
  type: Input
6208
6212
  }], options: [{
@@ -6360,12 +6364,15 @@ class MenuComponent {
6360
6364
  }
6361
6365
  onSubmenuClick(submenuItem) {
6362
6366
  if (!submenuItem.alwaysOpen) {
6367
+ const isExpandable = !!submenuItem.children?.length && submenuItem.showChildren !== false;
6363
6368
  if (this.activeSubmenuOption?.id === submenuItem?.id) {
6364
6369
  this.activeSubmenuOption = undefined;
6365
6370
  }
6366
- else {
6367
- this.activeSubmenuOption =
6368
- submenuItem.children?.length && submenuItem.showChildren !== false ? submenuItem : undefined;
6371
+ else if (isExpandable) {
6372
+ this.activeSubmenuOption = submenuItem;
6373
+ }
6374
+ else if (!this.isDescendantOf(submenuItem, this.activeSubmenuOption)) {
6375
+ this.activeSubmenuOption = undefined;
6369
6376
  }
6370
6377
  if (submenuItem.frameUrl) {
6371
6378
  this.menuService.frameUrl$.next(submenuItem.frameUrl);
@@ -6384,6 +6391,9 @@ class MenuComponent {
6384
6391
  }
6385
6392
  }
6386
6393
  }
6394
+ isDescendantOf(item, parent) {
6395
+ return !!parent?.children?.some((child) => child.id === item.id || this.isDescendantOf(item, child));
6396
+ }
6387
6397
  openTermsOfUse() {
6388
6398
  this.accountService.termsOfUse$.next();
6389
6399
  }