1050 lines
		
	
	
		
			24 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			1050 lines
		
	
	
		
			24 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
///
 | 
						|
/// Copyright © 2016-2025 The Thingsboard Authors
 | 
						|
///
 | 
						|
/// Licensed under the Apache License, Version 2.0 (the "License");
 | 
						|
/// you may not use this file except in compliance with the License.
 | 
						|
/// You may obtain a copy of the License at
 | 
						|
///
 | 
						|
///     http://www.apache.org/licenses/LICENSE-2.0
 | 
						|
///
 | 
						|
/// Unless required by applicable law or agreed to in writing, software
 | 
						|
/// distributed under the License is distributed on an "AS IS" BASIS,
 | 
						|
/// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
						|
/// See the License for the specific language governing permissions and
 | 
						|
/// limitations under the License.
 | 
						|
///
 | 
						|
 | 
						|
import { AuthState } from '@core/auth/auth.models';
 | 
						|
import { Authority } from '@shared/models/authority.enum';
 | 
						|
import { deepClone } from '@core/utils';
 | 
						|
 | 
						|
export declare type MenuSectionType = 'link' | 'toggle';
 | 
						|
 | 
						|
export interface MenuSection {
 | 
						|
  id: MenuId | string;
 | 
						|
  name: string;
 | 
						|
  fullName?: string;
 | 
						|
  type: MenuSectionType;
 | 
						|
  path: string;
 | 
						|
  icon: string;
 | 
						|
  pages?: Array<MenuSection>;
 | 
						|
  opened?: boolean;
 | 
						|
  rootOnly?: boolean;
 | 
						|
  customTranslate?: boolean;
 | 
						|
}
 | 
						|
 | 
						|
export interface MenuReference {
 | 
						|
  id: MenuId;
 | 
						|
  pages?: Array<MenuReference>;
 | 
						|
}
 | 
						|
 | 
						|
export interface HomeSectionReference {
 | 
						|
  name: string;
 | 
						|
  places: Array<MenuId>;
 | 
						|
}
 | 
						|
 | 
						|
export interface HomeSection {
 | 
						|
  name: string;
 | 
						|
  places: Array<MenuSection>;
 | 
						|
}
 | 
						|
 | 
						|
export enum MenuId {
 | 
						|
  home = 'home',
 | 
						|
  tenants = 'tenants',
 | 
						|
  tenant_profiles = 'tenant_profiles',
 | 
						|
  resources = 'resources',
 | 
						|
  widget_library = 'widget_library',
 | 
						|
  widget_types = 'widget_types',
 | 
						|
  widgets_bundles = 'widgets_bundles',
 | 
						|
  images = 'images',
 | 
						|
  scada_symbols = 'scada_symbols',
 | 
						|
  resources_library = 'resources_library',
 | 
						|
  javascript_library = 'javascript_library',
 | 
						|
  notifications_center = 'notifications_center',
 | 
						|
  notification_inbox = 'notification_inbox',
 | 
						|
  notification_sent = 'notification_sent',
 | 
						|
  notification_recipients = 'notification_recipients',
 | 
						|
  notification_templates = 'notification_templates',
 | 
						|
  notification_rules = 'notification_rules',
 | 
						|
  mobile_center = 'mobile_center',
 | 
						|
  mobile_apps = 'mobile_apps',
 | 
						|
  mobile_bundles = 'mobile_bundles',
 | 
						|
  mobile_qr_code_widget = 'mobile_qr_code_widget',
 | 
						|
  settings = 'settings',
 | 
						|
  general = 'general',
 | 
						|
  mail_server = 'mail_server',
 | 
						|
  home_settings = 'home_settings',
 | 
						|
  notification_settings = 'notification_settings',
 | 
						|
  repository_settings = 'repository_settings',
 | 
						|
  auto_commit_settings = 'auto_commit_settings',
 | 
						|
  queues = 'queues',
 | 
						|
  security_settings = 'security_settings',
 | 
						|
  security_settings_general = 'security_settings_general',
 | 
						|
  two_fa = 'two_fa',
 | 
						|
  oauth2 = 'oauth2',
 | 
						|
  domains = 'domains',
 | 
						|
  clients = 'clients',
 | 
						|
  audit_log = 'audit_log',
 | 
						|
  alarms = 'alarms',
 | 
						|
  dashboards = 'dashboards',
 | 
						|
  entities = 'entities',
 | 
						|
  devices = 'devices',
 | 
						|
  assets = 'assets',
 | 
						|
  entity_views = 'entity_views',
 | 
						|
  gateways = 'gateways',
 | 
						|
  profiles = 'profiles',
 | 
						|
  device_profiles = 'device_profiles',
 | 
						|
  asset_profiles = 'asset_profiles',
 | 
						|
  customers = 'customers',
 | 
						|
  rule_chains = 'rule_chains',
 | 
						|
  edge_management = 'edge_management',
 | 
						|
  edges = 'edges',
 | 
						|
  edge_instances = 'edge_instances',
 | 
						|
  rulechain_templates = 'rulechain_templates',
 | 
						|
  features = 'features',
 | 
						|
  otaUpdates = 'otaUpdates',
 | 
						|
  version_control = 'version_control',
 | 
						|
  api_usage = 'api_usage',
 | 
						|
  trendz_settings = 'trendz_settings'
 | 
						|
}
 | 
						|
 | 
						|
declare type MenuFilter = (authState: AuthState) => boolean;
 | 
						|
 | 
						|
export const menuSectionMap = new Map<MenuId, MenuSection>([
 | 
						|
  [
 | 
						|
    MenuId.home,
 | 
						|
    {
 | 
						|
      id: MenuId.home,
 | 
						|
      name: 'home.home',
 | 
						|
      type: 'link',
 | 
						|
      path: '/home',
 | 
						|
      icon: 'home'
 | 
						|
    }
 | 
						|
  ],
 | 
						|
  [
 | 
						|
    MenuId.tenants,
 | 
						|
    {
 | 
						|
      id: MenuId.tenants,
 | 
						|
      name: 'tenant.tenants',
 | 
						|
      type: 'link',
 | 
						|
      path: '/tenants',
 | 
						|
      icon: 'supervisor_account'
 | 
						|
    }
 | 
						|
  ],
 | 
						|
  [
 | 
						|
    MenuId.tenant_profiles,
 | 
						|
    {
 | 
						|
      id: MenuId.tenant_profiles,
 | 
						|
      name: 'tenant-profile.tenant-profiles',
 | 
						|
      type: 'link',
 | 
						|
      path: '/tenantProfiles',
 | 
						|
      icon: 'mdi:alpha-t-box'
 | 
						|
    }
 | 
						|
  ],
 | 
						|
  [
 | 
						|
    MenuId.resources,
 | 
						|
    {
 | 
						|
      id: MenuId.resources,
 | 
						|
      name: 'admin.resources',
 | 
						|
      type: 'toggle',
 | 
						|
      path: '/resources',
 | 
						|
      icon: 'folder'
 | 
						|
    }
 | 
						|
  ],
 | 
						|
  [
 | 
						|
    MenuId.widget_library,
 | 
						|
    {
 | 
						|
      id: MenuId.widget_library,
 | 
						|
      name: 'widget.widget-library',
 | 
						|
      type: 'link',
 | 
						|
      path: '/resources/widgets-library',
 | 
						|
      icon: 'now_widgets'
 | 
						|
    }
 | 
						|
  ],
 | 
						|
  [
 | 
						|
    MenuId.widget_types,
 | 
						|
    {
 | 
						|
      id: MenuId.widget_types,
 | 
						|
      name: 'widget.widgets',
 | 
						|
      type: 'link',
 | 
						|
      path: '/resources/widgets-library/widget-types',
 | 
						|
      icon: 'now_widgets'
 | 
						|
    }
 | 
						|
  ],
 | 
						|
  [
 | 
						|
    MenuId.widgets_bundles,
 | 
						|
    {
 | 
						|
      id: MenuId.widgets_bundles,
 | 
						|
      name: 'widgets-bundle.widgets-bundles',
 | 
						|
      type: 'link',
 | 
						|
      path: '/resources/widgets-library/widgets-bundles',
 | 
						|
      icon: 'now_widgets'
 | 
						|
    }
 | 
						|
  ],
 | 
						|
  [
 | 
						|
    MenuId.images,
 | 
						|
    {
 | 
						|
      id: MenuId.images,
 | 
						|
      name: 'image.gallery',
 | 
						|
      type: 'link',
 | 
						|
      path: '/resources/images',
 | 
						|
      icon: 'filter'
 | 
						|
    }
 | 
						|
  ],
 | 
						|
  [
 | 
						|
    MenuId.scada_symbols,
 | 
						|
    {
 | 
						|
      id: MenuId.scada_symbols,
 | 
						|
      name: 'scada.symbols',
 | 
						|
      type: 'link',
 | 
						|
      path: '/resources/scada-symbols',
 | 
						|
      icon: 'view_in_ar'
 | 
						|
    }
 | 
						|
  ],
 | 
						|
  [
 | 
						|
    MenuId.resources_library,
 | 
						|
    {
 | 
						|
      id: MenuId.resources_library,
 | 
						|
      name: 'resource.resources-library',
 | 
						|
      type: 'link',
 | 
						|
      path: '/resources/resources-library',
 | 
						|
      icon: 'mdi:rhombus-split'
 | 
						|
    }
 | 
						|
  ],
 | 
						|
  [
 | 
						|
    MenuId.javascript_library,
 | 
						|
    {
 | 
						|
      id: MenuId.javascript_library,
 | 
						|
      name: 'javascript.javascript-library',
 | 
						|
      type: 'link',
 | 
						|
      path: '/resources/javascript-library',
 | 
						|
      icon: 'mdi:language-javascript'
 | 
						|
    }
 | 
						|
  ],
 | 
						|
  [
 | 
						|
    MenuId.notifications_center,
 | 
						|
    {
 | 
						|
      id: MenuId.notifications_center,
 | 
						|
      name: 'notification.notification-center',
 | 
						|
      type: 'link',
 | 
						|
      path: '/notification',
 | 
						|
      icon: 'mdi:message-badge'
 | 
						|
    }
 | 
						|
  ],
 | 
						|
  [
 | 
						|
    MenuId.notification_inbox,
 | 
						|
    {
 | 
						|
      id: MenuId.notification_inbox,
 | 
						|
      name: 'notification.inbox',
 | 
						|
      fullName: 'notification.notification-inbox',
 | 
						|
      type: 'link',
 | 
						|
      path: '/notification/inbox',
 | 
						|
      icon: 'inbox'
 | 
						|
    }
 | 
						|
  ],
 | 
						|
  [
 | 
						|
    MenuId.notification_sent,
 | 
						|
    {
 | 
						|
      id: MenuId.notification_sent,
 | 
						|
      name: 'notification.sent',
 | 
						|
      fullName: 'notification.notification-sent',
 | 
						|
      type: 'link',
 | 
						|
      path: '/notification/sent',
 | 
						|
      icon: 'outbox'
 | 
						|
    }
 | 
						|
  ],
 | 
						|
  [
 | 
						|
    MenuId.notification_recipients,
 | 
						|
    {
 | 
						|
      id: MenuId.notification_recipients,
 | 
						|
      name: 'notification.recipients',
 | 
						|
      fullName: 'notification.notification-recipients',
 | 
						|
      type: 'link',
 | 
						|
      path: '/notification/recipients',
 | 
						|
      icon: 'contacts'
 | 
						|
    }
 | 
						|
  ],
 | 
						|
  [
 | 
						|
    MenuId.notification_templates,
 | 
						|
    {
 | 
						|
      id: MenuId.notification_templates,
 | 
						|
      name: 'notification.templates',
 | 
						|
      fullName: 'notification.notification-templates',
 | 
						|
      type: 'link',
 | 
						|
      path: '/notification/templates',
 | 
						|
      icon: 'mdi:message-draw'
 | 
						|
    }
 | 
						|
  ],
 | 
						|
  [
 | 
						|
    MenuId.notification_rules,
 | 
						|
    {
 | 
						|
      id: MenuId.notification_rules,
 | 
						|
      name: 'notification.rules',
 | 
						|
      fullName: 'notification.notification-rules',
 | 
						|
      type: 'link',
 | 
						|
      path: '/notification/rules',
 | 
						|
      icon: 'mdi:message-cog'
 | 
						|
    }
 | 
						|
  ],
 | 
						|
  [
 | 
						|
    MenuId.mobile_center,
 | 
						|
    {
 | 
						|
      id: MenuId.mobile_center,
 | 
						|
      name: 'mobile.mobile-center',
 | 
						|
      type: 'link',
 | 
						|
      path: '/mobile-center',
 | 
						|
      icon: 'smartphone'
 | 
						|
    }
 | 
						|
  ],
 | 
						|
  [
 | 
						|
    MenuId.mobile_apps,
 | 
						|
    {
 | 
						|
      id: MenuId.mobile_apps,
 | 
						|
      name: 'mobile.applications',
 | 
						|
      type: 'link',
 | 
						|
      path: '/mobile-center/applications',
 | 
						|
      icon: 'list'
 | 
						|
    }
 | 
						|
  ],
 | 
						|
  [
 | 
						|
    MenuId.mobile_bundles,
 | 
						|
    {
 | 
						|
      id: MenuId.mobile_bundles,
 | 
						|
      name: 'mobile.bundles',
 | 
						|
      type: 'link',
 | 
						|
      path: '/mobile-center/bundles',
 | 
						|
      icon: 'mdi:package'
 | 
						|
    }
 | 
						|
  ],
 | 
						|
  [
 | 
						|
    MenuId.mobile_qr_code_widget,
 | 
						|
    {
 | 
						|
      id: MenuId.mobile_qr_code_widget,
 | 
						|
      name: 'mobile.qr-code-widget',
 | 
						|
      fullName: 'mobile.qr-code-widget',
 | 
						|
      type: 'link',
 | 
						|
      path: '/mobile-center/qr-code-widget',
 | 
						|
      icon: 'qr_code'
 | 
						|
    }
 | 
						|
  ],
 | 
						|
  [
 | 
						|
    MenuId.settings,
 | 
						|
    {
 | 
						|
      id: MenuId.settings,
 | 
						|
      name: 'admin.settings',
 | 
						|
      type: 'link',
 | 
						|
      path: '/settings',
 | 
						|
      icon: 'settings'
 | 
						|
    }
 | 
						|
  ],
 | 
						|
  [
 | 
						|
    MenuId.general,
 | 
						|
    {
 | 
						|
      id: MenuId.general,
 | 
						|
      name: 'admin.general',
 | 
						|
      fullName: 'admin.general-settings',
 | 
						|
      type: 'link',
 | 
						|
      path: '/settings/general',
 | 
						|
      icon: 'settings_applications'
 | 
						|
    }
 | 
						|
  ],
 | 
						|
  [
 | 
						|
    MenuId.mail_server,
 | 
						|
    {
 | 
						|
      id: MenuId.mail_server,
 | 
						|
      name: 'admin.outgoing-mail',
 | 
						|
      type: 'link',
 | 
						|
      path: '/settings/outgoing-mail',
 | 
						|
      icon: 'mail'
 | 
						|
    }
 | 
						|
  ],
 | 
						|
  [
 | 
						|
    MenuId.home_settings,
 | 
						|
    {
 | 
						|
      id: MenuId.home_settings,
 | 
						|
      name: 'admin.home',
 | 
						|
      fullName: 'admin.home-settings',
 | 
						|
      type: 'link',
 | 
						|
      path: '/settings/home',
 | 
						|
      icon: 'settings_applications'
 | 
						|
    }
 | 
						|
  ],
 | 
						|
  [
 | 
						|
    MenuId.notification_settings,
 | 
						|
    {
 | 
						|
      id: MenuId.notification_settings,
 | 
						|
      name: 'admin.notifications',
 | 
						|
      fullName: 'admin.notifications-settings',
 | 
						|
      type: 'link',
 | 
						|
      path: '/settings/notifications',
 | 
						|
      icon: 'mdi:message-badge'
 | 
						|
    }
 | 
						|
  ],
 | 
						|
  [
 | 
						|
    MenuId.repository_settings,
 | 
						|
    {
 | 
						|
      id: MenuId.repository_settings,
 | 
						|
      name: 'admin.repository',
 | 
						|
      fullName: 'admin.repository-settings',
 | 
						|
      type: 'link',
 | 
						|
      path: '/settings/repository',
 | 
						|
      icon: 'manage_history'
 | 
						|
    }
 | 
						|
  ],
 | 
						|
  [
 | 
						|
    MenuId.auto_commit_settings,
 | 
						|
    {
 | 
						|
      id: MenuId.auto_commit_settings,
 | 
						|
      name: 'admin.auto-commit',
 | 
						|
      fullName: 'admin.auto-commit-settings',
 | 
						|
      type: 'link',
 | 
						|
      path: '/settings/auto-commit',
 | 
						|
      icon: 'settings_backup_restore'
 | 
						|
    }
 | 
						|
  ],
 | 
						|
  [
 | 
						|
    MenuId.queues,
 | 
						|
    {
 | 
						|
      id: MenuId.queues,
 | 
						|
      name: 'admin.queues',
 | 
						|
      type: 'link',
 | 
						|
      path: '/settings/queues',
 | 
						|
      icon: 'swap_calls'
 | 
						|
    }
 | 
						|
  ],
 | 
						|
  [
 | 
						|
    MenuId.security_settings,
 | 
						|
    {
 | 
						|
      id: MenuId.security_settings,
 | 
						|
      name: 'security.security',
 | 
						|
      type: 'toggle',
 | 
						|
      path: '/security-settings',
 | 
						|
      icon: 'security'
 | 
						|
    }
 | 
						|
  ],
 | 
						|
  [
 | 
						|
    MenuId.security_settings_general,
 | 
						|
    {
 | 
						|
      id: MenuId.security_settings_general,
 | 
						|
      name: 'admin.general',
 | 
						|
      fullName: 'security.general-settings',
 | 
						|
      type: 'link',
 | 
						|
      path: '/security-settings/general',
 | 
						|
      icon: 'settings_applications'
 | 
						|
    }
 | 
						|
  ],
 | 
						|
  [
 | 
						|
    MenuId.two_fa,
 | 
						|
    {
 | 
						|
      id: MenuId.two_fa,
 | 
						|
      name: 'admin.2fa.2fa',
 | 
						|
      type: 'link',
 | 
						|
      path: '/security-settings/2fa',
 | 
						|
      icon: 'mdi:two-factor-authentication'
 | 
						|
    }
 | 
						|
  ],
 | 
						|
  [
 | 
						|
    MenuId.oauth2,
 | 
						|
    {
 | 
						|
      id: MenuId.oauth2,
 | 
						|
      name: 'admin.oauth2.oauth2',
 | 
						|
      type: 'link',
 | 
						|
      path: '/security-settings/oauth2',
 | 
						|
      icon: 'mdi:shield-account'
 | 
						|
    }
 | 
						|
  ],
 | 
						|
  [
 | 
						|
    MenuId.domains,
 | 
						|
    {
 | 
						|
      id: MenuId.domains,
 | 
						|
      name: 'admin.oauth2.domains',
 | 
						|
      type: 'link',
 | 
						|
      path: '/security-settings/oauth2/domains',
 | 
						|
      icon: 'domain'
 | 
						|
    }
 | 
						|
  ],
 | 
						|
  [
 | 
						|
    MenuId.clients,
 | 
						|
    {
 | 
						|
      id: MenuId.clients,
 | 
						|
      name: 'admin.oauth2.clients',
 | 
						|
      type: 'link',
 | 
						|
      path: '/security-settings/oauth2/clients',
 | 
						|
      icon: 'public'
 | 
						|
    }
 | 
						|
  ],
 | 
						|
  [
 | 
						|
    MenuId.audit_log,
 | 
						|
    {
 | 
						|
      id: MenuId.audit_log,
 | 
						|
      name: 'audit-log.audit-logs',
 | 
						|
      type: 'link',
 | 
						|
      path: '/security-settings/auditLogs',
 | 
						|
      icon: 'track_changes'
 | 
						|
    }
 | 
						|
  ],
 | 
						|
  [
 | 
						|
    MenuId.alarms,
 | 
						|
    {
 | 
						|
      id: MenuId.alarms,
 | 
						|
      name: 'alarm.alarms',
 | 
						|
      type: 'link',
 | 
						|
      path: '/alarms',
 | 
						|
      icon: 'mdi:alert-outline'
 | 
						|
    }
 | 
						|
  ],
 | 
						|
  [
 | 
						|
    MenuId.dashboards,
 | 
						|
    {
 | 
						|
      id: MenuId.dashboards,
 | 
						|
      name: 'dashboard.dashboards',
 | 
						|
      type: 'link',
 | 
						|
      path: '/dashboards',
 | 
						|
      icon: 'dashboards'
 | 
						|
    }
 | 
						|
  ],
 | 
						|
  [
 | 
						|
    MenuId.entities,
 | 
						|
    {
 | 
						|
      id: MenuId.entities,
 | 
						|
      name: 'entity.entities',
 | 
						|
      type: 'toggle',
 | 
						|
      path: '/entities',
 | 
						|
      icon: 'category'
 | 
						|
    }
 | 
						|
  ],
 | 
						|
  [
 | 
						|
    MenuId.devices,
 | 
						|
    {
 | 
						|
      id: MenuId.devices,
 | 
						|
      name: 'device.devices',
 | 
						|
      type: 'link',
 | 
						|
      path: '/entities/devices',
 | 
						|
      icon: 'devices_other'
 | 
						|
    }
 | 
						|
  ],
 | 
						|
  [
 | 
						|
    MenuId.assets,
 | 
						|
    {
 | 
						|
      id: MenuId.assets,
 | 
						|
      name: 'asset.assets',
 | 
						|
      type: 'link',
 | 
						|
      path: '/entities/assets',
 | 
						|
      icon: 'domain'
 | 
						|
    }
 | 
						|
  ],
 | 
						|
  [
 | 
						|
    MenuId.entity_views,
 | 
						|
    {
 | 
						|
      id: MenuId.entity_views,
 | 
						|
      name: 'entity-view.entity-views',
 | 
						|
      type: 'link',
 | 
						|
      path: '/entities/entityViews',
 | 
						|
      icon: 'view_quilt'
 | 
						|
    }
 | 
						|
  ],
 | 
						|
  [
 | 
						|
    MenuId.gateways,
 | 
						|
    {
 | 
						|
      id: MenuId.gateways,
 | 
						|
      name: 'gateway.gateways',
 | 
						|
      type: 'link',
 | 
						|
      path: '/entities/gateways',
 | 
						|
      icon: 'lan'
 | 
						|
    }
 | 
						|
  ],
 | 
						|
  [
 | 
						|
    MenuId.profiles,
 | 
						|
    {
 | 
						|
      id: MenuId.profiles,
 | 
						|
      name: 'profiles.profiles',
 | 
						|
      type: 'toggle',
 | 
						|
      path: '/profiles',
 | 
						|
      icon: 'badge'
 | 
						|
    }
 | 
						|
  ],
 | 
						|
  [
 | 
						|
    MenuId.device_profiles,
 | 
						|
    {
 | 
						|
      id: MenuId.device_profiles,
 | 
						|
      name: 'device-profile.device-profiles',
 | 
						|
      type: 'link',
 | 
						|
      path: '/profiles/deviceProfiles',
 | 
						|
      icon: 'mdi:alpha-d-box'
 | 
						|
    }
 | 
						|
  ],
 | 
						|
  [
 | 
						|
    MenuId.asset_profiles,
 | 
						|
    {
 | 
						|
      id: MenuId.asset_profiles,
 | 
						|
      name: 'asset-profile.asset-profiles',
 | 
						|
      type: 'link',
 | 
						|
      path: '/profiles/assetProfiles',
 | 
						|
      icon: 'mdi:alpha-a-box'
 | 
						|
    }
 | 
						|
  ],
 | 
						|
  [
 | 
						|
    MenuId.customers,
 | 
						|
    {
 | 
						|
      id: MenuId.customers,
 | 
						|
      name: 'customer.customers',
 | 
						|
      type: 'link',
 | 
						|
      path: '/customers',
 | 
						|
      icon: 'supervisor_account'
 | 
						|
    }
 | 
						|
  ],
 | 
						|
  [
 | 
						|
    MenuId.rule_chains,
 | 
						|
    {
 | 
						|
      id: MenuId.rule_chains,
 | 
						|
      name: 'rulechain.rulechains',
 | 
						|
      type: 'link',
 | 
						|
      path: '/ruleChains',
 | 
						|
      icon: 'settings_ethernet'
 | 
						|
    }
 | 
						|
  ],
 | 
						|
  [
 | 
						|
    MenuId.edge_management,
 | 
						|
    {
 | 
						|
      id: MenuId.edge_management,
 | 
						|
      name: 'edge.management',
 | 
						|
      type: 'toggle',
 | 
						|
      path: '/edgeManagement',
 | 
						|
      icon: 'settings_input_antenna'
 | 
						|
    }
 | 
						|
  ],
 | 
						|
  [
 | 
						|
    MenuId.edges,
 | 
						|
    {
 | 
						|
      id: MenuId.edges,
 | 
						|
      name: 'edge.instances',
 | 
						|
      fullName: 'edge.edge-instances',
 | 
						|
      type: 'link',
 | 
						|
      path: '/edgeManagement/instances',
 | 
						|
      icon: 'router'
 | 
						|
    }
 | 
						|
  ],
 | 
						|
  [
 | 
						|
    MenuId.edge_instances,
 | 
						|
    {
 | 
						|
      id: MenuId.edge_instances,
 | 
						|
      name: 'edge.edge-instances',
 | 
						|
      fullName: 'edge.edge-instances',
 | 
						|
      type: 'link',
 | 
						|
      path: '/edgeManagement/instances',
 | 
						|
      icon: 'router'
 | 
						|
    }
 | 
						|
  ],
 | 
						|
  [
 | 
						|
    MenuId.rulechain_templates,
 | 
						|
    {
 | 
						|
      id: MenuId.rulechain_templates,
 | 
						|
      name: 'edge.rulechain-templates',
 | 
						|
      fullName: 'edge.edge-rulechain-templates',
 | 
						|
      type: 'link',
 | 
						|
      path: '/edgeManagement/ruleChains',
 | 
						|
      icon: 'settings_ethernet'
 | 
						|
    }
 | 
						|
  ],
 | 
						|
  [
 | 
						|
    MenuId.features,
 | 
						|
    {
 | 
						|
      id: MenuId.features,
 | 
						|
      name: 'feature.advanced-features',
 | 
						|
      type: 'toggle',
 | 
						|
      path: '/features',
 | 
						|
      icon: 'construction'
 | 
						|
    }
 | 
						|
  ],
 | 
						|
  [
 | 
						|
    MenuId.otaUpdates,
 | 
						|
    {
 | 
						|
      id: MenuId.otaUpdates,
 | 
						|
      name: 'ota-update.ota-updates',
 | 
						|
      type: 'link',
 | 
						|
      path: '/features/otaUpdates',
 | 
						|
      icon: 'memory'
 | 
						|
    }
 | 
						|
  ],
 | 
						|
  [
 | 
						|
    MenuId.version_control,
 | 
						|
    {
 | 
						|
      id: MenuId.version_control,
 | 
						|
      name: 'version-control.version-control',
 | 
						|
      type: 'link',
 | 
						|
      path: '/features/vc',
 | 
						|
      icon: 'history'
 | 
						|
    }
 | 
						|
  ],
 | 
						|
  [
 | 
						|
    MenuId.api_usage,
 | 
						|
    {
 | 
						|
      id: MenuId.api_usage,
 | 
						|
      name: 'api-usage.api-usage',
 | 
						|
      type: 'link',
 | 
						|
      path: '/usage',
 | 
						|
      icon: 'insert_chart'
 | 
						|
    }
 | 
						|
  ],
 | 
						|
  [
 | 
						|
    MenuId.trendz_settings,
 | 
						|
    {
 | 
						|
      id: MenuId.trendz_settings,
 | 
						|
      name: 'admin.trendz',
 | 
						|
      fullName: 'admin.trendz-settings',
 | 
						|
      type: 'link',
 | 
						|
      path: '/settings/trendz',
 | 
						|
      icon: 'trendz-settings'
 | 
						|
    }
 | 
						|
  ]
 | 
						|
]);
 | 
						|
 | 
						|
const menuFilters = new Map<MenuId, MenuFilter>([
 | 
						|
  [
 | 
						|
    MenuId.edges, (authState) => authState.edgesSupportEnabled
 | 
						|
  ],
 | 
						|
  [
 | 
						|
    MenuId.edge_management, (authState) => authState.edgesSupportEnabled
 | 
						|
  ],
 | 
						|
  [
 | 
						|
    MenuId.rulechain_templates, (authState) => authState.edgesSupportEnabled
 | 
						|
  ]
 | 
						|
]);
 | 
						|
 | 
						|
const defaultUserMenuMap = new Map<Authority, MenuReference[]>([
 | 
						|
  [
 | 
						|
    Authority.SYS_ADMIN,
 | 
						|
    [
 | 
						|
      {id: MenuId.home},
 | 
						|
      {id: MenuId.tenants},
 | 
						|
      {id: MenuId.tenant_profiles},
 | 
						|
      {
 | 
						|
        id: MenuId.resources,
 | 
						|
        pages: [
 | 
						|
          {
 | 
						|
            id: MenuId.widget_library,
 | 
						|
            pages: [
 | 
						|
              {id: MenuId.widget_types},
 | 
						|
              {id: MenuId.widgets_bundles}
 | 
						|
            ]
 | 
						|
          },
 | 
						|
          {id: MenuId.images},
 | 
						|
          {id: MenuId.scada_symbols},
 | 
						|
          {id: MenuId.javascript_library},
 | 
						|
          {id: MenuId.resources_library}
 | 
						|
        ]
 | 
						|
      },
 | 
						|
      {
 | 
						|
        id: MenuId.notifications_center,
 | 
						|
        pages: [
 | 
						|
          {id: MenuId.notification_inbox},
 | 
						|
          {id: MenuId.notification_sent},
 | 
						|
          {id: MenuId.notification_recipients},
 | 
						|
          {id: MenuId.notification_templates},
 | 
						|
          {id: MenuId.notification_rules}
 | 
						|
        ]
 | 
						|
      },
 | 
						|
      {
 | 
						|
        id: MenuId.mobile_center,
 | 
						|
        pages: [
 | 
						|
          {id: MenuId.mobile_bundles},
 | 
						|
          {id: MenuId.mobile_apps},
 | 
						|
          {id: MenuId.mobile_qr_code_widget}
 | 
						|
        ]
 | 
						|
      },
 | 
						|
      {
 | 
						|
        id: MenuId.settings,
 | 
						|
        pages: [
 | 
						|
          {id: MenuId.general},
 | 
						|
          {id: MenuId.mail_server},
 | 
						|
          {id: MenuId.notification_settings},
 | 
						|
          {id: MenuId.queues}
 | 
						|
        ]
 | 
						|
      },
 | 
						|
      {
 | 
						|
        id: MenuId.security_settings,
 | 
						|
        pages: [
 | 
						|
          {id: MenuId.security_settings_general},
 | 
						|
          {id: MenuId.two_fa},
 | 
						|
          {
 | 
						|
            id: MenuId.oauth2,
 | 
						|
            pages: [
 | 
						|
              {id: MenuId.domains},
 | 
						|
              {id: MenuId.clients}
 | 
						|
            ]
 | 
						|
          }
 | 
						|
        ]
 | 
						|
      }
 | 
						|
    ]
 | 
						|
  ],
 | 
						|
  [
 | 
						|
    Authority.TENANT_ADMIN,
 | 
						|
    [
 | 
						|
      {id: MenuId.home},
 | 
						|
      {id: MenuId.alarms},
 | 
						|
      {id: MenuId.dashboards},
 | 
						|
      {
 | 
						|
        id: MenuId.entities,
 | 
						|
        pages: [
 | 
						|
          {id: MenuId.devices},
 | 
						|
          {id: MenuId.assets},
 | 
						|
          {id: MenuId.entity_views},
 | 
						|
          {id: MenuId.gateways}
 | 
						|
        ]
 | 
						|
      },
 | 
						|
      {
 | 
						|
        id: MenuId.profiles,
 | 
						|
        pages: [
 | 
						|
          {id: MenuId.device_profiles},
 | 
						|
          {id: MenuId.asset_profiles}
 | 
						|
        ]
 | 
						|
      },
 | 
						|
      {id: MenuId.customers},
 | 
						|
      {id: MenuId.rule_chains},
 | 
						|
      {
 | 
						|
        id: MenuId.edge_management,
 | 
						|
        pages: [
 | 
						|
          {id: MenuId.edges},
 | 
						|
          {id: MenuId.rulechain_templates}
 | 
						|
        ]
 | 
						|
      },
 | 
						|
      {
 | 
						|
        id: MenuId.features,
 | 
						|
        pages: [
 | 
						|
          {id: MenuId.otaUpdates},
 | 
						|
          {id: MenuId.version_control}
 | 
						|
        ]
 | 
						|
      },
 | 
						|
      {
 | 
						|
        id: MenuId.resources,
 | 
						|
        pages: [
 | 
						|
          {
 | 
						|
            id: MenuId.widget_library,
 | 
						|
            pages: [
 | 
						|
              {id: MenuId.widget_types},
 | 
						|
              {id: MenuId.widgets_bundles}
 | 
						|
            ]
 | 
						|
          },
 | 
						|
          {id: MenuId.images},
 | 
						|
          {id: MenuId.scada_symbols},
 | 
						|
          {id: MenuId.javascript_library},
 | 
						|
          {id: MenuId.resources_library}
 | 
						|
        ]
 | 
						|
      },
 | 
						|
      {
 | 
						|
        id: MenuId.notifications_center,
 | 
						|
        pages: [
 | 
						|
          {id: MenuId.notification_inbox},
 | 
						|
          {id: MenuId.notification_sent},
 | 
						|
          {id: MenuId.notification_recipients},
 | 
						|
          {id: MenuId.notification_templates},
 | 
						|
          {id: MenuId.notification_rules}
 | 
						|
        ]
 | 
						|
      },
 | 
						|
      {
 | 
						|
        id: MenuId.mobile_center,
 | 
						|
        pages: [
 | 
						|
          {id: MenuId.mobile_bundles},
 | 
						|
          {id: MenuId.mobile_apps}
 | 
						|
        ]
 | 
						|
      },
 | 
						|
      {id: MenuId.api_usage},
 | 
						|
      {
 | 
						|
        id: MenuId.settings,
 | 
						|
        pages: [
 | 
						|
          {id: MenuId.home_settings},
 | 
						|
          {id: MenuId.notification_settings},
 | 
						|
          {id: MenuId.repository_settings},
 | 
						|
          {id: MenuId.auto_commit_settings},
 | 
						|
          {id: MenuId.trendz_settings}
 | 
						|
        ]
 | 
						|
      },
 | 
						|
      {
 | 
						|
        id: MenuId.security_settings,
 | 
						|
        pages: [
 | 
						|
          {id: MenuId.audit_log},
 | 
						|
          {
 | 
						|
            id: MenuId.oauth2,
 | 
						|
            pages: [
 | 
						|
              {id: MenuId.clients}
 | 
						|
            ]
 | 
						|
          }
 | 
						|
        ]
 | 
						|
      }
 | 
						|
    ]
 | 
						|
  ],
 | 
						|
  [
 | 
						|
    Authority.CUSTOMER_USER,
 | 
						|
    [
 | 
						|
      {id: MenuId.home},
 | 
						|
      {id: MenuId.alarms},
 | 
						|
      {id: MenuId.dashboards},
 | 
						|
      {
 | 
						|
        id: MenuId.entities,
 | 
						|
        pages: [
 | 
						|
          {id: MenuId.devices},
 | 
						|
          {id: MenuId.assets},
 | 
						|
          {id: MenuId.entity_views}
 | 
						|
        ]
 | 
						|
      },
 | 
						|
      {id: MenuId.edge_instances},
 | 
						|
      {
 | 
						|
        id: MenuId.notifications_center,
 | 
						|
        pages: [
 | 
						|
          {id: MenuId.notification_inbox}
 | 
						|
        ]
 | 
						|
      }
 | 
						|
    ]
 | 
						|
  ]
 | 
						|
]);
 | 
						|
 | 
						|
const defaultHomeSectionMap = new Map<Authority, HomeSectionReference[]>([
 | 
						|
  [
 | 
						|
    Authority.SYS_ADMIN,
 | 
						|
    [
 | 
						|
      {
 | 
						|
        name: 'tenant.management',
 | 
						|
        places: [MenuId.tenants, MenuId.tenant_profiles]
 | 
						|
      },
 | 
						|
      {
 | 
						|
        name: 'widget.management',
 | 
						|
        places: [MenuId.widget_library]
 | 
						|
      },
 | 
						|
      {
 | 
						|
        name: 'admin.system-settings',
 | 
						|
        places: [MenuId.general, MenuId.mail_server,
 | 
						|
          MenuId.notification_settings, MenuId.security_settings, MenuId.oauth2, MenuId.domains,
 | 
						|
          MenuId.clients, MenuId.two_fa, MenuId.resources_library, MenuId.queues]
 | 
						|
      }
 | 
						|
    ]
 | 
						|
  ],
 | 
						|
  [
 | 
						|
    Authority.TENANT_ADMIN,
 | 
						|
    [
 | 
						|
      {
 | 
						|
        name: 'rulechain.management',
 | 
						|
        places: [MenuId.rule_chains]
 | 
						|
      },
 | 
						|
      {
 | 
						|
        name: 'customer.management',
 | 
						|
        places: [MenuId.customers]
 | 
						|
      },
 | 
						|
      {
 | 
						|
        name: 'asset.management',
 | 
						|
        places: [MenuId.assets, MenuId.asset_profiles]
 | 
						|
      },
 | 
						|
      {
 | 
						|
        name: 'device.management',
 | 
						|
        places: [MenuId.devices, MenuId.device_profiles, MenuId.otaUpdates]
 | 
						|
      },
 | 
						|
      {
 | 
						|
        name: 'entity-view.management',
 | 
						|
        places: [MenuId.entity_views]
 | 
						|
      },
 | 
						|
      {
 | 
						|
        name: 'edge.management',
 | 
						|
        places: [MenuId.edges, MenuId.rulechain_templates]
 | 
						|
      },
 | 
						|
      {
 | 
						|
        name: 'dashboard.management',
 | 
						|
        places: [MenuId.widget_library, MenuId.dashboards]
 | 
						|
      },
 | 
						|
      {
 | 
						|
        name: 'version-control.management',
 | 
						|
        places: [MenuId.version_control]
 | 
						|
      },
 | 
						|
      {
 | 
						|
        name: 'audit-log.audit',
 | 
						|
        places: [MenuId.audit_log, MenuId.api_usage]
 | 
						|
      },
 | 
						|
      {
 | 
						|
        name: 'admin.system-settings',
 | 
						|
        places: [MenuId.home_settings, MenuId.resources_library, MenuId.repository_settings, MenuId.auto_commit_settings, MenuId.trendz_settings]
 | 
						|
      }
 | 
						|
    ]
 | 
						|
  ],
 | 
						|
  [
 | 
						|
    Authority.CUSTOMER_USER,
 | 
						|
    [
 | 
						|
      {
 | 
						|
        name: 'asset.view-assets',
 | 
						|
        places: [MenuId.assets]
 | 
						|
      },
 | 
						|
      {
 | 
						|
        name: 'device.view-devices',
 | 
						|
        places: [MenuId.devices]
 | 
						|
      },
 | 
						|
      {
 | 
						|
        name: 'entity-view.management',
 | 
						|
        places: [MenuId.entity_views]
 | 
						|
      },
 | 
						|
      {
 | 
						|
        name: 'edge.management',
 | 
						|
        places: [MenuId.edge_instances]
 | 
						|
      },
 | 
						|
      {
 | 
						|
        name: 'dashboard.view-dashboards',
 | 
						|
        places: [MenuId.dashboards]
 | 
						|
      }
 | 
						|
    ]
 | 
						|
  ]
 | 
						|
]);
 | 
						|
 | 
						|
export const buildUserMenu = (authState: AuthState): Array<MenuSection> => {
 | 
						|
  const references = defaultUserMenuMap.get(authState.authUser.authority);
 | 
						|
  return (references || []).map(ref => referenceToMenuSection(authState, ref)).filter(section => !!section);
 | 
						|
};
 | 
						|
 | 
						|
export const buildUserHome = (authState: AuthState, availableMenuSections: MenuSection[]): Array<HomeSection> => {
 | 
						|
  const references = defaultHomeSectionMap.get(authState.authUser.authority);
 | 
						|
  return (references || []).map(ref =>
 | 
						|
    homeReferenceToHomeSection(availableMenuSections, ref)).filter(section => !!section);
 | 
						|
};
 | 
						|
 | 
						|
const referenceToMenuSection = (authState: AuthState, reference: MenuReference): MenuSection | undefined => {
 | 
						|
  if (filterMenuReference(authState, reference)) {
 | 
						|
    const section = menuSectionMap.get(reference.id);
 | 
						|
    if (section) {
 | 
						|
      const result = deepClone(section);
 | 
						|
      if (reference.pages?.length) {
 | 
						|
        result.pages = reference.pages.map(page =>
 | 
						|
          referenceToMenuSection(authState, page)).filter(page => !!page);
 | 
						|
      }
 | 
						|
      return result;
 | 
						|
    } else {
 | 
						|
      return undefined;
 | 
						|
    }
 | 
						|
  } else {
 | 
						|
    return undefined;
 | 
						|
  }
 | 
						|
};
 | 
						|
 | 
						|
const filterMenuReference = (authState: AuthState, reference: MenuReference): boolean => {
 | 
						|
  const filter = menuFilters.get(reference.id);
 | 
						|
  if (filter) {
 | 
						|
    if (filter(authState)) {
 | 
						|
      if (reference.pages?.length) {
 | 
						|
        if (reference.pages.every(page => !filterMenuReference(authState, page))) {
 | 
						|
          return false;
 | 
						|
        }
 | 
						|
      }
 | 
						|
      return true;
 | 
						|
    }
 | 
						|
    return false;
 | 
						|
  } else {
 | 
						|
    return true;
 | 
						|
  }
 | 
						|
};
 | 
						|
 | 
						|
const homeReferenceToHomeSection = (availableMenuSections: MenuSection[], reference: HomeSectionReference): HomeSection | undefined => {
 | 
						|
  const places = reference.places.map(id => availableMenuSections.find(m => m.id === id)).filter(p => !!p);
 | 
						|
  if (places.length) {
 | 
						|
    return {
 | 
						|
      name: reference.name,
 | 
						|
      places
 | 
						|
    };
 | 
						|
  } else {
 | 
						|
    return undefined;
 | 
						|
  }
 | 
						|
};
 |