@acorex/connectivity 20.3.0-next.6 → 20.3.0-next.8

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.
@@ -2,12 +2,12 @@ import { AXSafePipe } from '@acorex/core/pipes';
2
2
  import * as i2$1 from '@acorex/platform/auth';
3
3
  import { AXPAuthStrategy, AXP_TENANT_LOADER, AXP_APPLICATION_LOADER, AXP_FEATURE_LOADER, AXP_PERMISSION_LOADER, AXPSessionService, AXPAuthModule } from '@acorex/platform/auth';
4
4
  import * as i1$1 from '@acorex/platform/core';
5
- import { AXPDataGenerator, AXPActivityLogProvider, AXP_ACTIVITY_LOG_PROVIDER, AXP_DATASOURCE_DEFINITION_PROVIDER, objectKeyValueTransforms, AXPSystemActionType, AXP_DISTRIBUTED_EVENT_LISTENER_PROVIDER, applySortArray, applyFilterArray } from '@acorex/platform/core';
6
- import { AXPEntityDefinitionRegistryService, AXPEntityStorageService, AXP_DATA_SEEDER_TOKEN, AXP_ENTITY_STORAGE_BACKEND, AXPMiddlewareEntityStorageService, eventDispatchMiddleware, AXP_ENTITY_STORAGE_MIDDLEWARE, AXPDataSeederService } from '@acorex/platform/layout/entity';
5
+ import { AXPDataGenerator, AXPActivityLogProvider, AXP_ACTIVITY_LOG_PROVIDER, AXP_DATASOURCE_DEFINITION_PROVIDER, AXP_DISTRIBUTED_EVENT_LISTENER_PROVIDER, objectKeyValueTransforms, AXPSystemActionType, applySortArray, applyFilterArray, AXPExpressionEvaluatorService } from '@acorex/platform/core';
6
+ import { AXPEntityDefinitionRegistryService, AXPEntityStorageService, AXP_DATA_SEEDER_TOKEN, AXMEntityCrudServiceImpl, AXP_ENTITY_STORAGE_BACKEND, AXPMiddlewareEntityStorageService, AXP_ENTITY_STORAGE_MIDDLEWARE, eventDispatchMiddleware, AXPDataSeederService } from '@acorex/platform/layout/entity';
7
7
  import * as i0 from '@angular/core';
8
- import { inject, Injectable, NgModule, Injector } from '@angular/core';
8
+ import { inject, Injectable, NgModule, Injector, runInInjectionContext } from '@angular/core';
9
9
  import { AXMDeviceSessionsService, AXMSessionStatusTypes, AXMDeviceSessionsServiceImpl, AXM_AUTH_CONFIG_TOKEN } from '@acorex/modules/auth';
10
- import { RootConfig, AXMUsersEntityService } from '@acorex/modules/security-management';
10
+ import { RootConfig, AXMUsersEntityService, AXMPolicyService } from '@acorex/modules/security-management';
11
11
  import { Router } from '@angular/router';
12
12
  import { of, delay, filter, take, map, throttleTime } from 'rxjs';
13
13
  import { AXMPermissionsKeys, RootConfig as RootConfig$7, AXMFormTemplateTypes } from '@acorex/modules/form-template-management';
@@ -21,8 +21,9 @@ import { AXMChatManagementService, AXMChatRealtimeService, AXMCommentManagementS
21
21
  import { AXPBarChartWidget, AXPDonutChartWidget, AXPGaugeChartWidget, AXPLineChartWidget, AXPDashboardShortcutWidget, AXPAdvancedWeatherWidget, AXPAnalogClockWidget, AXPMinimalWeatherWidget, AXPStickyNoteWidget, RootConfig as RootConfig$4 } from '@acorex/modules/dashboard-management';
22
22
  import { AXPTaskBoardShortcut, AXPTaskBoardWidget, RootConfig as RootConfig$h } from '@acorex/modules/task-management';
23
23
  import { AXPMyNotificationDashboardWidget, RootConfig as RootConfig$b, AXMNotificationEntityServiceImpl, AXMNotificationEntityService } from '@acorex/modules/notification-management';
24
- import { RootConfig as RootConfig$5 } from '@acorex/modules/data-management';
25
- import { provideQuerySetups, provideCommandSetups, AXPQueryService, AXPRuntimeModule, AXPCommandService } from '@acorex/platform/runtime';
24
+ import { RootConfig as RootConfig$5, AXMMetaDataDefinitionService } from '@acorex/modules/data-management';
25
+ import { get, set } from 'lodash-es';
26
+ import { provideQuerySetups, AXPCommandService, provideCommandSetups, AXPQueryService, AXPRuntimeModule } from '@acorex/platform/runtime';
26
27
  import { AXMDistributionServiceImpl, AXMDocumentService, AXMDistributionInteractionService, RootConfig as RootConfig$6, AXMFolderServiceImpl, AXMDocumentServiceImpl, AXMReviewService, AXMReviewServiceImpl, AXMDistributionInteractionServiceImpl, AXMFolderService, AXMDistributionService } from '@acorex/modules/document-management';
27
28
  import { AXDataSource } from '@acorex/cdk/common';
28
29
  import { AXPWidgetsCatalog } from '@acorex/platform/layout/builder';
@@ -44,7 +45,6 @@ import { AXP_IDENTIFIER_RULES, AXPIdentifierService, AXPSimplePatternEngine, bui
44
45
  import { RootConfig as RootConfig$l } from '@acorex/modules/meeting-management';
45
46
  import * as i1 from '@acorex/components/dialog';
46
47
  import * as i2 from '@acorex/core/translation';
47
- import { get, set } from 'lodash-es';
48
48
  import { RootConfig as RootConfig$n } from '@acorex/modules/customer-management';
49
49
  import { AXCExternalAuthorizationService } from '@acorex/connectivity/utils';
50
50
  import { APPLICATION_SOURCE_NAME, MODULE_SOURCE_NAME, ENTITY_SOURCE_NAME, FEATURE_SOURCE_NAME, PERMISSION_SOURCE_NAME, PROPERTY_SOURCE_NAME, AXPModuleDesignerService } from '@acorex/modules/application-management';
@@ -4404,57 +4404,86 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.8", ngImpor
4404
4404
  type: Injectable
4405
4405
  }] });
4406
4406
 
4407
- // const OHS_ID = AXPDataGenerator.uuid();
4408
- // const child1 = {
4409
- // id: AXPDataGenerator.uuid(),
4410
- // title: 'General',
4411
- // parentId: OHS_ID,
4412
- // childCount: 0,
4413
- // };
4414
- // const child2 = {
4415
- // id: AXPDataGenerator.uuid(),
4416
- // title: 'License',
4417
- // parentId: OHS_ID,
4418
- // childCount: 0,
4419
- // };
4420
- // const child3 = {
4421
- // id: AXPDataGenerator.uuid(),
4422
- // title: 'Training',
4423
- // parentId: OHS_ID,
4424
- // childCount: 0,
4425
- // };
4426
- const METADATA_CATEGORY_MOCK = [
4427
- {
4428
- id: AXPDataGenerator.uuid(),
4429
- title: 'General',
4430
- childCount: 0,
4431
- },
4432
- // {
4433
- // id: OHS_ID,
4434
- // title: 'OHS',
4435
- // childCount: 2,
4436
- // children: [child1, child2,child3],
4437
- // },
4438
- // child1,
4439
- // child2,
4440
- // child3,
4441
- ];
4442
- const checkbox$2 = '{"type":"document-layout","children":[{"type":"page-layout","children":[{"type":"checkbox-editor","name":"checkbox-editor1","options":{"label":"i accept","readonly":false,"disabled":false},"defaultValue":false,"path":"accept-check-box"}],"name":"page-layout1"}],"name":"document"}';
4443
- const colorboxInterface = '{"type":"document-layout","children":[{"type":"page-layout","children":[{"type":"block-layout","name":"block-layout1","options":{"flexDirection":{"id":"ax-flex-row"},"flexJustifyContent":{"id":"ax-justify-normal"},"flexAlignItems":{"id":"ax-items-start"},"gap":2,"flexWrap":{"id":"ax-flex-nowrap"},"spacing":{"margin":"0px 0px 0px 0px","padding":"0px 0px 0px 0px"},"border":{"width":"0px","radius":"0px","color":"#000000","style":"none"},"flexOptions":{"gap":"0px","flexDirection":"row","flexWrap":"nowrap","justifyContent":"flex-start","alignItems":"flex-start"}}},"children":[{"type":"color-editor","name":"color-editor1","options":{"readonly":false,"disabled":false,"validations":{"required":{"rule":"required","message":"This field is required."}},"placeholder":"pick color"},"path":"color-box"}]}],"name":"page-layout1"}],"name":"document"}';
4444
- const titleInterface$1 = '{"type":"document-layout","children":[{"type":"page-layout","children":[{"type":"text-editor","name":"title-editor1","meta":{"header":true},"options":{"multiple":false,"disabled":false,"hasClearButton":false,"validations":{"regex":null,"required":{"rule":"required","message":"This field is required."}}},"defaultValue":"","path":"title"}],"name":"page-layout1"}],"name":"document"}';
4445
- const descriptionInterface$1 = '{"type":"document-layout","children":[{"type":"page-layout","children":[{"type":"text-editor","name":"description-editor1","meta":{"header":true},"options":{"multiple":false,"disabled":false,"hasClearButton":false},"defaultValue":"","path":"description"}],"name":"page-layout1"}],"name":"document"}';
4446
- const contractNumberInterface$1 = '{"type":"document-layout","children":[{"type":"page-layout","children":[{"type":"number-editor","name":"number-editor1","meta":{"header":true},"options":{"multiple":false,"disabled":false,"hasClearButton":false},"defaultValue":"","path":"contract-number"}],"name":"page-layout1"}],"name":"document"}';
4447
- const evaluatorInterface$1 = '{"type":"document-layout","children":[{"type":"page-layout","children":[{"type":"text-editor","name":"text-editor1","meta":{"header":true},"options":{"multiple":false,"disabled":false,"hasClearButton":false},"defaultValue":"","path":"evaluator"}],"name":"page-layout1"}],"name":"document"}';
4448
- const companyInterface$1 = '{"type":"document-layout","children":[{"type":"page-layout","children":[{"type":"select-editor","name":"select-editor1"}],"name":"page-layout1"}],"name":"document"}';
4407
+ function generateMetadataCategories() {
4408
+ const categories = [];
4409
+ const roots = ['General', 'Document Management', 'Quality Control', 'Compliance', 'Project Management'];
4410
+ const ids = new Map();
4411
+ roots.forEach((title) => {
4412
+ const id = AXPDataGenerator.uuid();
4413
+ ids.set(title, id);
4414
+ categories.push({
4415
+ id,
4416
+ title,
4417
+ description: title === 'General'
4418
+ ? 'Common metadata fields used across all document types'
4419
+ : title === 'Document Management'
4420
+ ? 'Document creation, storage, and retrieval metadata'
4421
+ : title === 'Quality Control'
4422
+ ? 'Quality assurance and control metadata'
4423
+ : title === 'Compliance'
4424
+ ? 'Regulatory compliance and audit metadata'
4425
+ : 'Project planning and execution metadata',
4426
+ childCount: 0,
4427
+ });
4428
+ });
4429
+ const children = [
4430
+ { parent: 'Document Management', children: ['Version Control', 'Access Control', 'Document Types'] },
4431
+ { parent: 'Quality Control', children: ['Standards', 'Testing', 'Validation'] },
4432
+ { parent: 'Compliance', children: ['Regulations', 'Audit Trail', 'Certifications'] },
4433
+ { parent: 'Project Management', children: ['Planning', 'Resources', 'Timeline'] },
4434
+ ];
4435
+ children.forEach(({ parent, children }) => {
4436
+ const parentId = ids.get(parent);
4437
+ if (!parentId)
4438
+ return;
4439
+ children.forEach((title) => {
4440
+ const id = AXPDataGenerator.uuid();
4441
+ ids.set(title, id);
4442
+ const descriptionMap = {
4443
+ 'Version Control': 'Document versioning and change tracking',
4444
+ 'Access Control': 'User permissions and access management',
4445
+ 'Document Types': 'Classification and categorization of documents',
4446
+ 'Standards': 'Quality standards and specifications',
4447
+ 'Testing': 'Test procedures and results tracking',
4448
+ 'Validation': 'Data validation and verification processes',
4449
+ 'Regulations': 'Regulatory requirements and compliance rules',
4450
+ 'Audit Trail': 'Activity logging and audit documentation',
4451
+ 'Certifications': 'Certification and accreditation tracking',
4452
+ 'Planning': 'Project planning and scheduling metadata',
4453
+ 'Resources': 'Resource allocation and management',
4454
+ 'Timeline': 'Project timeline and milestone tracking',
4455
+ };
4456
+ categories.push({ id, title, description: descriptionMap[title] ?? '', parentId, childCount: 0 });
4457
+ });
4458
+ const parentObj = categories.find((c) => c.id === parentId);
4459
+ if (parentObj)
4460
+ parentObj.childCount = children.length;
4461
+ });
4462
+ return categories;
4463
+ }
4464
+ const METADATA_CATEGORY_MOCK = generateMetadataCategories();
4465
+ // Interface definitions for different metadata types
4466
+ const titleInterface$1 = '{"type":"text-editor","path":"title","options":{"validations":[{"rule":"required","message":"This field is required."}]}}';
4467
+ const descriptionInterface$1 = '{"type":"large-text-editor","path":"description","options":{}}';
4468
+ const versionInterface = '{"type":"text-editor","path":"version","options":{"validations":[{"rule":"required","message":"This field is required."}]}}';
4469
+ const dateInterface = '{"type":"date-time-editor","path":"date","options":{"validations":[{"rule":"required","message":"This field is required."}]}}';
4470
+ const numberInterface = '{"type":"number-editor","path":"number","options":{"validations":[{"rule":"required","message":"This field is required."}]}}';
4471
+ const selectInterface = '{"type":"select-editor","path":"select","options":{"dataSource":"languages","validations":[{"rule":"required","message":"This field is required."}]}}';
4472
+ const checkboxInterface = '{"type":"checkbox-editor","path":"checkbox","options":{"label":"Checkbox"}}';
4473
+ const textAreaInterface = '{"type":"large-text-editor","path":"textarea","options":{}}';
4474
+ const emailInterface = '{"type":"email-editor","path":"email","options":{"validations":[{"rule":"required","message":"This field is required."}]}}';
4475
+ const urlInterface = '{"type":"link-editor","path":"url","options":{"validations":[{"rule":"required","message":"This field is required."}]}}';
4476
+ const textInterface = '{"type":"text-editor","path":"text","options":{"validations":[{"rule":"required","message":"This field is required."}]}}';
4449
4477
  const METADATA_MOCK = [
4478
+ // General - Common metadata fields
4450
4479
  {
4451
4480
  id: AXPDataGenerator.uuid(),
4452
4481
  name: 'title',
4453
4482
  title: 'Title',
4454
4483
  defaultValue: '',
4455
4484
  interface: titleInterface$1,
4456
- categoryIds: [METADATA_CATEGORY_MOCK[0].id],
4457
- categories: [METADATA_CATEGORY_MOCK[0]],
4485
+ categoryIds: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'General').id],
4486
+ categories: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'General')],
4458
4487
  },
4459
4488
  {
4460
4489
  id: AXPDataGenerator.uuid(),
@@ -4462,8 +4491,425 @@ const METADATA_MOCK = [
4462
4491
  title: 'Description',
4463
4492
  defaultValue: '',
4464
4493
  interface: descriptionInterface$1,
4465
- categoryIds: [METADATA_CATEGORY_MOCK[0].id],
4466
- categories: [METADATA_CATEGORY_MOCK[0]],
4494
+ categoryIds: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'General').id],
4495
+ categories: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'General')],
4496
+ },
4497
+ {
4498
+ id: AXPDataGenerator.uuid(),
4499
+ name: 'created-date',
4500
+ title: 'Created Date',
4501
+ defaultValue: '',
4502
+ interface: dateInterface,
4503
+ categoryIds: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'General').id],
4504
+ categories: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'General')],
4505
+ },
4506
+ {
4507
+ id: AXPDataGenerator.uuid(),
4508
+ name: 'created-by',
4509
+ title: 'Created By',
4510
+ defaultValue: '',
4511
+ interface: emailInterface,
4512
+ categoryIds: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'General').id],
4513
+ categories: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'General')],
4514
+ },
4515
+ {
4516
+ id: AXPDataGenerator.uuid(),
4517
+ name: 'status',
4518
+ title: 'Status',
4519
+ defaultValue: 'Draft',
4520
+ interface: selectInterface,
4521
+ categoryIds: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'General').id],
4522
+ categories: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'General')],
4523
+ },
4524
+ {
4525
+ id: AXPDataGenerator.uuid(),
4526
+ name: 'priority',
4527
+ title: 'Priority',
4528
+ defaultValue: 'Medium',
4529
+ interface: selectInterface,
4530
+ categoryIds: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'General').id],
4531
+ categories: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'General')],
4532
+ },
4533
+ {
4534
+ id: AXPDataGenerator.uuid(),
4535
+ name: 'tags',
4536
+ title: 'Tags',
4537
+ defaultValue: '',
4538
+ interface: textAreaInterface,
4539
+ categoryIds: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'General').id],
4540
+ categories: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'General')],
4541
+ },
4542
+ {
4543
+ id: AXPDataGenerator.uuid(),
4544
+ name: 'keywords',
4545
+ title: 'Keywords',
4546
+ defaultValue: '',
4547
+ interface: textAreaInterface,
4548
+ categoryIds: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'General').id],
4549
+ categories: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'General')],
4550
+ },
4551
+ {
4552
+ id: AXPDataGenerator.uuid(),
4553
+ name: 'language',
4554
+ title: 'Language',
4555
+ defaultValue: 'English',
4556
+ interface: selectInterface,
4557
+ categoryIds: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'General').id],
4558
+ categories: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'General')],
4559
+ },
4560
+ {
4561
+ id: AXPDataGenerator.uuid(),
4562
+ name: 'is-confidential',
4563
+ title: 'Confidential',
4564
+ defaultValue: 'false',
4565
+ interface: checkboxInterface,
4566
+ categoryIds: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'General').id],
4567
+ categories: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'General')],
4568
+ },
4569
+ // Document Management - Version Control
4570
+ {
4571
+ id: AXPDataGenerator.uuid(),
4572
+ name: 'document-title',
4573
+ title: 'Document Title',
4574
+ defaultValue: '',
4575
+ interface: titleInterface$1,
4576
+ categoryIds: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Version Control').id],
4577
+ categories: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Version Control')],
4578
+ },
4579
+ {
4580
+ id: AXPDataGenerator.uuid(),
4581
+ name: 'document-version',
4582
+ title: 'Document Version',
4583
+ defaultValue: '1.0',
4584
+ interface: versionInterface,
4585
+ categoryIds: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Version Control').id],
4586
+ categories: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Version Control')],
4587
+ },
4588
+ {
4589
+ id: AXPDataGenerator.uuid(),
4590
+ name: 'last-modified',
4591
+ title: 'Last Modified',
4592
+ defaultValue: '',
4593
+ interface: dateInterface,
4594
+ categoryIds: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Version Control').id],
4595
+ categories: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Version Control')],
4596
+ },
4597
+ {
4598
+ id: AXPDataGenerator.uuid(),
4599
+ name: 'change-log',
4600
+ title: 'Change Log',
4601
+ defaultValue: '',
4602
+ interface: textAreaInterface,
4603
+ categoryIds: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Version Control').id],
4604
+ categories: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Version Control')],
4605
+ },
4606
+ // Document Management - Access Control
4607
+ {
4608
+ id: AXPDataGenerator.uuid(),
4609
+ name: 'access-level',
4610
+ title: 'Access Level',
4611
+ defaultValue: 'Public',
4612
+ interface: selectInterface,
4613
+ categoryIds: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Access Control').id],
4614
+ categories: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Access Control')],
4615
+ },
4616
+ {
4617
+ id: AXPDataGenerator.uuid(),
4618
+ name: 'owner',
4619
+ title: 'Document Owner',
4620
+ defaultValue: '',
4621
+ interface: emailInterface,
4622
+ categoryIds: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Access Control').id],
4623
+ categories: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Access Control')],
4624
+ },
4625
+ {
4626
+ id: AXPDataGenerator.uuid(),
4627
+ name: 'permissions',
4628
+ title: 'Permissions',
4629
+ defaultValue: '',
4630
+ interface: textAreaInterface,
4631
+ categoryIds: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Access Control').id],
4632
+ categories: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Access Control')],
4633
+ },
4634
+ // Document Management - Document Types
4635
+ {
4636
+ id: AXPDataGenerator.uuid(),
4637
+ name: 'document-type',
4638
+ title: 'Document Type',
4639
+ defaultValue: '',
4640
+ interface: selectInterface,
4641
+ categoryIds: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Document Types').id],
4642
+ categories: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Document Types')],
4643
+ },
4644
+ {
4645
+ id: AXPDataGenerator.uuid(),
4646
+ name: 'document-category',
4647
+ title: 'Document Category',
4648
+ defaultValue: '',
4649
+ interface: selectInterface,
4650
+ categoryIds: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Document Types').id],
4651
+ categories: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Document Types')],
4652
+ },
4653
+ {
4654
+ id: AXPDataGenerator.uuid(),
4655
+ name: 'file-format',
4656
+ title: 'File Format',
4657
+ defaultValue: '',
4658
+ interface: selectInterface,
4659
+ categoryIds: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Document Types').id],
4660
+ categories: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Document Types')],
4661
+ },
4662
+ // Quality Control - Standards
4663
+ {
4664
+ id: AXPDataGenerator.uuid(),
4665
+ name: 'quality-standard',
4666
+ title: 'Quality Standard',
4667
+ defaultValue: '',
4668
+ interface: selectInterface,
4669
+ categoryIds: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Standards').id],
4670
+ categories: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Standards')],
4671
+ },
4672
+ {
4673
+ id: AXPDataGenerator.uuid(),
4674
+ name: 'compliance-level',
4675
+ title: 'Compliance Level',
4676
+ defaultValue: '',
4677
+ interface: selectInterface,
4678
+ categoryIds: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Standards').id],
4679
+ categories: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Standards')],
4680
+ },
4681
+ {
4682
+ id: AXPDataGenerator.uuid(),
4683
+ name: 'standard-version',
4684
+ title: 'Standard Version',
4685
+ defaultValue: '',
4686
+ interface: versionInterface,
4687
+ categoryIds: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Standards').id],
4688
+ categories: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Standards')],
4689
+ },
4690
+ // Quality Control - Testing
4691
+ {
4692
+ id: AXPDataGenerator.uuid(),
4693
+ name: 'test-status',
4694
+ title: 'Test Status',
4695
+ defaultValue: 'Pending',
4696
+ interface: selectInterface,
4697
+ categoryIds: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Testing').id],
4698
+ categories: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Testing')],
4699
+ },
4700
+ {
4701
+ id: AXPDataGenerator.uuid(),
4702
+ name: 'test-results',
4703
+ title: 'Test Results',
4704
+ defaultValue: '',
4705
+ interface: textAreaInterface,
4706
+ categoryIds: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Testing').id],
4707
+ categories: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Testing')],
4708
+ },
4709
+ {
4710
+ id: AXPDataGenerator.uuid(),
4711
+ name: 'test-date',
4712
+ title: 'Test Date',
4713
+ defaultValue: '',
4714
+ interface: dateInterface,
4715
+ categoryIds: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Testing').id],
4716
+ categories: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Testing')],
4717
+ },
4718
+ // Quality Control - Validation
4719
+ {
4720
+ id: AXPDataGenerator.uuid(),
4721
+ name: 'validation-status',
4722
+ title: 'Validation Status',
4723
+ defaultValue: 'Not Validated',
4724
+ interface: selectInterface,
4725
+ categoryIds: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Validation').id],
4726
+ categories: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Validation')],
4727
+ },
4728
+ {
4729
+ id: AXPDataGenerator.uuid(),
4730
+ name: 'validator',
4731
+ title: 'Validator',
4732
+ defaultValue: '',
4733
+ interface: emailInterface,
4734
+ categoryIds: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Validation').id],
4735
+ categories: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Validation')],
4736
+ },
4737
+ {
4738
+ id: AXPDataGenerator.uuid(),
4739
+ name: 'validation-notes',
4740
+ title: 'Validation Notes',
4741
+ defaultValue: '',
4742
+ interface: textAreaInterface,
4743
+ categoryIds: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Validation').id],
4744
+ categories: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Validation')],
4745
+ },
4746
+ // Compliance - Regulations
4747
+ {
4748
+ id: AXPDataGenerator.uuid(),
4749
+ name: 'regulatory-framework',
4750
+ title: 'Regulatory Framework',
4751
+ defaultValue: '',
4752
+ interface: selectInterface,
4753
+ categoryIds: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Regulations').id],
4754
+ categories: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Regulations')],
4755
+ },
4756
+ {
4757
+ id: AXPDataGenerator.uuid(),
4758
+ name: 'compliance-status',
4759
+ title: 'Compliance Status',
4760
+ defaultValue: 'Under Review',
4761
+ interface: selectInterface,
4762
+ categoryIds: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Regulations').id],
4763
+ categories: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Regulations')],
4764
+ },
4765
+ {
4766
+ id: AXPDataGenerator.uuid(),
4767
+ name: 'regulation-reference',
4768
+ title: 'Regulation Reference',
4769
+ defaultValue: '',
4770
+ interface: textAreaInterface,
4771
+ categoryIds: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Regulations').id],
4772
+ categories: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Regulations')],
4773
+ },
4774
+ // Compliance - Audit Trail
4775
+ {
4776
+ id: AXPDataGenerator.uuid(),
4777
+ name: 'audit-trail',
4778
+ title: 'Audit Trail',
4779
+ defaultValue: '',
4780
+ interface: textAreaInterface,
4781
+ categoryIds: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Audit Trail').id],
4782
+ categories: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Audit Trail')],
4783
+ },
4784
+ {
4785
+ id: AXPDataGenerator.uuid(),
4786
+ name: 'audit-date',
4787
+ title: 'Audit Date',
4788
+ defaultValue: '',
4789
+ interface: dateInterface,
4790
+ categoryIds: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Audit Trail').id],
4791
+ categories: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Audit Trail')],
4792
+ },
4793
+ {
4794
+ id: AXPDataGenerator.uuid(),
4795
+ name: 'auditor',
4796
+ title: 'Auditor',
4797
+ defaultValue: '',
4798
+ interface: emailInterface,
4799
+ categoryIds: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Audit Trail').id],
4800
+ categories: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Audit Trail')],
4801
+ },
4802
+ // Compliance - Certifications
4803
+ {
4804
+ id: AXPDataGenerator.uuid(),
4805
+ name: 'certification-type',
4806
+ title: 'Certification Type',
4807
+ defaultValue: '',
4808
+ interface: selectInterface,
4809
+ categoryIds: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Certifications').id],
4810
+ categories: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Certifications')],
4811
+ },
4812
+ {
4813
+ id: AXPDataGenerator.uuid(),
4814
+ name: 'certification-number',
4815
+ title: 'Certification Number',
4816
+ defaultValue: '',
4817
+ interface: textInterface,
4818
+ categoryIds: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Certifications').id],
4819
+ categories: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Certifications')],
4820
+ },
4821
+ {
4822
+ id: AXPDataGenerator.uuid(),
4823
+ name: 'certification-expiry',
4824
+ title: 'Certification Expiry',
4825
+ defaultValue: '',
4826
+ interface: dateInterface,
4827
+ categoryIds: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Certifications').id],
4828
+ categories: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Certifications')],
4829
+ },
4830
+ // Project Management - Planning
4831
+ {
4832
+ id: AXPDataGenerator.uuid(),
4833
+ name: 'project-phase',
4834
+ title: 'Project Phase',
4835
+ defaultValue: 'Planning',
4836
+ interface: selectInterface,
4837
+ categoryIds: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Planning').id],
4838
+ categories: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Planning')],
4839
+ },
4840
+ {
4841
+ id: AXPDataGenerator.uuid(),
4842
+ name: 'project-milestone',
4843
+ title: 'Project Milestone',
4844
+ defaultValue: '',
4845
+ interface: textAreaInterface,
4846
+ categoryIds: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Planning').id],
4847
+ categories: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Planning')],
4848
+ },
4849
+ {
4850
+ id: AXPDataGenerator.uuid(),
4851
+ name: 'project-objectives',
4852
+ title: 'Project Objectives',
4853
+ defaultValue: '',
4854
+ interface: textAreaInterface,
4855
+ categoryIds: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Planning').id],
4856
+ categories: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Planning')],
4857
+ },
4858
+ // Project Management - Resources
4859
+ {
4860
+ id: AXPDataGenerator.uuid(),
4861
+ name: 'resource-allocation',
4862
+ title: 'Resource Allocation',
4863
+ defaultValue: '',
4864
+ interface: textAreaInterface,
4865
+ categoryIds: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Resources').id],
4866
+ categories: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Resources')],
4867
+ },
4868
+ {
4869
+ id: AXPDataGenerator.uuid(),
4870
+ name: 'budget',
4871
+ title: 'Budget',
4872
+ defaultValue: '',
4873
+ interface: numberInterface,
4874
+ categoryIds: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Resources').id],
4875
+ categories: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Resources')],
4876
+ },
4877
+ {
4878
+ id: AXPDataGenerator.uuid(),
4879
+ name: 'team-members',
4880
+ title: 'Team Members',
4881
+ defaultValue: '',
4882
+ interface: textAreaInterface,
4883
+ categoryIds: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Resources').id],
4884
+ categories: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Resources')],
4885
+ },
4886
+ // Project Management - Timeline
4887
+ {
4888
+ id: AXPDataGenerator.uuid(),
4889
+ name: 'start-date',
4890
+ title: 'Start Date',
4891
+ defaultValue: '',
4892
+ interface: dateInterface,
4893
+ categoryIds: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Timeline').id],
4894
+ categories: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Timeline')],
4895
+ },
4896
+ {
4897
+ id: AXPDataGenerator.uuid(),
4898
+ name: 'end-date',
4899
+ title: 'End Date',
4900
+ defaultValue: '',
4901
+ interface: dateInterface,
4902
+ categoryIds: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Timeline').id],
4903
+ categories: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Timeline')],
4904
+ },
4905
+ {
4906
+ id: AXPDataGenerator.uuid(),
4907
+ name: 'deadline',
4908
+ title: 'Deadline',
4909
+ defaultValue: '',
4910
+ interface: dateInterface,
4911
+ categoryIds: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Timeline').id],
4912
+ categories: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Timeline')],
4467
4913
  },
4468
4914
  ];
4469
4915
 
@@ -4482,6 +4928,141 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.8", ngImpor
4482
4928
  type: Injectable
4483
4929
  }] });
4484
4930
 
4931
+ class AXCQueryCategoryMetadataInheritanceQuery {
4932
+ constructor() {
4933
+ this.injector = inject(Injector);
4934
+ this.metaDataService = inject(AXMMetaDataDefinitionService);
4935
+ }
4936
+ async fetch(params) {
4937
+ const { entityName, categoryId } = params;
4938
+ //1a25158a-3e0f-4e9c-bdc2-d6cc0ece86ba
4939
+ const service = runInInjectionContext(this.injector, () => new AXMEntityCrudServiceImpl(`${params.entityName}Category`));
4940
+ // Find the category by ID
4941
+ const category = await this.findCategoryById(categoryId, service);
4942
+ if (!category) {
4943
+ throw new Error(`Category with ID ${categoryId} not found`);
4944
+ }
4945
+ // Build the hierarchy (traverse up to root)
4946
+ const hierarchy = await this.buildCategoryHierarchy(category, service);
4947
+ // Collect all metadata fields from the hierarchy
4948
+ //const inheritedMetadata = await this.collectInheritedMetadata(hierarchy);
4949
+ const result = hierarchy.map(cat => get(cat, 'metaData')).flat() ?? [];
4950
+ return result;
4951
+ }
4952
+ async findCategoryById(categoryId, service) {
4953
+ try {
4954
+ const result = await service.query({
4955
+ filter: {
4956
+ logic: 'and',
4957
+ filters: [
4958
+ {
4959
+ field: 'id',
4960
+ operator: {
4961
+ type: 'equal',
4962
+ },
4963
+ value: categoryId,
4964
+ },
4965
+ ],
4966
+ },
4967
+ take: 1,
4968
+ skip: 0,
4969
+ });
4970
+ return result.items.length > 0 ? result.items[0] : null;
4971
+ }
4972
+ catch (error) {
4973
+ console.error('Error finding category by ID:', error);
4974
+ return null;
4975
+ }
4976
+ }
4977
+ async buildCategoryHierarchy(category, service) {
4978
+ const hierarchy = [category];
4979
+ let currentCategory = category;
4980
+ // Traverse up the parent hierarchy
4981
+ while (currentCategory.parentId) {
4982
+ try {
4983
+ const parentResult = await service.query({
4984
+ filter: {
4985
+ logic: 'and',
4986
+ filters: [
4987
+ {
4988
+ field: 'id',
4989
+ operator: {
4990
+ type: 'equal',
4991
+ },
4992
+ value: currentCategory.parentId,
4993
+ },
4994
+ ],
4995
+ },
4996
+ take: 1,
4997
+ skip: 0,
4998
+ });
4999
+ if (parentResult.items.length > 0) {
5000
+ const parent = parentResult.items[0];
5001
+ hierarchy.unshift(parent); // Add to beginning to maintain hierarchy order
5002
+ currentCategory = parent;
5003
+ }
5004
+ else {
5005
+ break; // Parent not found, stop traversal
5006
+ }
5007
+ }
5008
+ catch (error) {
5009
+ console.error('Error finding parent category:', error);
5010
+ break;
5011
+ }
5012
+ }
5013
+ return hierarchy;
5014
+ }
5015
+ async collectInheritedMetadata(hierarchy) {
5016
+ const allMetadata = [];
5017
+ const seenMetadataIds = new Set();
5018
+ // Collect metadata from each level in the hierarchy
5019
+ for (const category of hierarchy) {
5020
+ try {
5021
+ const metadataResult = await this.metaDataService.query({
5022
+ filter: {
5023
+ logic: 'and',
5024
+ filters: [
5025
+ {
5026
+ field: 'categoryIds',
5027
+ operator: {
5028
+ type: 'contains',
5029
+ },
5030
+ value: category.id,
5031
+ },
5032
+ ],
5033
+ },
5034
+ take: 1000,
5035
+ skip: 0,
5036
+ });
5037
+ // Add metadata fields that haven't been seen before (avoid duplicates)
5038
+ for (const metadata of metadataResult.items) {
5039
+ if (!seenMetadataIds.has(metadata.id)) {
5040
+ allMetadata.push(metadata);
5041
+ seenMetadataIds.add(metadata.id);
5042
+ }
5043
+ }
5044
+ }
5045
+ catch (error) {
5046
+ console.error(`Error collecting metadata for category ${category.id}:`, error);
5047
+ }
5048
+ }
5049
+ return allMetadata;
5050
+ }
5051
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.8", ngImport: i0, type: AXCQueryCategoryMetadataInheritanceQuery, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
5052
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.1.8", ngImport: i0, type: AXCQueryCategoryMetadataInheritanceQuery, providedIn: 'root' }); }
5053
+ }
5054
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.8", ngImport: i0, type: AXCQueryCategoryMetadataInheritanceQuery, decorators: [{
5055
+ type: Injectable,
5056
+ args: [{
5057
+ providedIn: 'root'
5058
+ }]
5059
+ }] });
5060
+
5061
+ var categoryMetadataInheritance_query = /*#__PURE__*/Object.freeze({
5062
+ __proto__: null,
5063
+ AXCQueryCategoryMetadataInheritanceQuery: AXCQueryCategoryMetadataInheritanceQuery
5064
+ });
5065
+
4485
5066
  class AXCDataManagementMockModule {
4486
5067
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.8", ngImport: i0, type: AXCDataManagementMockModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
4487
5068
  static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.1.8", ngImport: i0, type: AXCDataManagementMockModule }); }
@@ -4498,8 +5079,12 @@ class AXCDataManagementMockModule {
4498
5079
  },
4499
5080
  provideQuerySetups([
4500
5081
  {
4501
- key: 'category-with-items',
5082
+ key: 'DataManagement:Metadata:GetCategoryWithItems',
4502
5083
  loader: () => import('./acorex-connectivity-mock-category-with-items.query-DEY9R9q2.mjs').then(m => m.AXCQueryCategoryWithItemsQuery),
5084
+ },
5085
+ {
5086
+ key: 'DataManagement:Metadata:GetCategoryInheritance',
5087
+ loader: () => Promise.resolve().then(function () { return categoryMetadataInheritance_query; }).then(m => m.AXCQueryCategoryMetadataInheritanceQuery),
4503
5088
  }
4504
5089
  ])
4505
5090
  ] }); }
@@ -4523,8 +5108,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.8", ngImpor
4523
5108
  },
4524
5109
  provideQuerySetups([
4525
5110
  {
4526
- key: 'category-with-items',
5111
+ key: 'DataManagement:Metadata:GetCategoryWithItems',
4527
5112
  loader: () => import('./acorex-connectivity-mock-category-with-items.query-DEY9R9q2.mjs').then(m => m.AXCQueryCategoryWithItemsQuery),
5113
+ },
5114
+ {
5115
+ key: 'DataManagement:Metadata:GetCategoryInheritance',
5116
+ loader: () => Promise.resolve().then(function () { return categoryMetadataInheritance_query; }).then(m => m.AXCQueryCategoryMetadataInheritanceQuery),
4528
5117
  }
4529
5118
  ])
4530
5119
  ],
@@ -4821,6 +5410,7 @@ const DOCUMENT_TYPES = [
4821
5410
  enableExpiration: false,
4822
5411
  requiresReview: false,
4823
5412
  requiresDistribution: false,
5413
+ control: { isSystem: true },
4824
5414
  meta: [],
4825
5415
  type: {
4826
5416
  selectedItems: [],
@@ -21070,6 +21660,177 @@ const BUSINESS_UNIT_TYPES_MOCK = [
21070
21660
  { id: uuid$i(), title: 'Branch', code: 'branch', isLocationBased: true },
21071
21661
  ];
21072
21662
 
21663
+ function generatePositionsCategory() {
21664
+ const categories = [];
21665
+ const roots = ['Engineering Positions', 'Technical Leadership', 'Product Positions', 'Operations', 'Business Functions', 'Executive Leadership'];
21666
+ const ids = new Map();
21667
+ roots.forEach((title) => {
21668
+ const id = AXPDataGenerator.uuid();
21669
+ ids.set(title, id);
21670
+ const descriptionMap = {
21671
+ 'Engineering Positions': 'All engineering role families',
21672
+ 'Technical Leadership': 'Leadership tracks within technology',
21673
+ 'Product Positions': 'Roles related to product management & design',
21674
+ Operations: 'IT, Support and Security positions',
21675
+ 'Business Functions': 'Sales, Marketing and BD roles',
21676
+ 'Executive Leadership': 'C-level and executive roles',
21677
+ };
21678
+ categories.push({ id, title, description: descriptionMap[title] ?? '', childCount: 0 });
21679
+ });
21680
+ const children = [
21681
+ { parent: 'Engineering Positions', children: ['Frontend Engineering', 'Backend Engineering', 'Mobile Engineering', 'Quality Engineering'] },
21682
+ { parent: 'Technical Leadership', children: ['Engineering Management', 'Technical Architecture', 'DevOps Leadership'] },
21683
+ { parent: 'Product Positions', children: ['Product Management', 'UX/UI Design', 'Product Analytics'] },
21684
+ { parent: 'Operations', children: ['IT Operations', 'Technical Support', 'Security Operations', 'Health, Safety & Environment'] },
21685
+ { parent: 'Business Functions', children: ['Sales', 'Marketing', 'Business Development'] },
21686
+ { parent: 'Executive Leadership', children: ['C-Suite', 'Board Members', 'Corporate Strategy'] },
21687
+ ];
21688
+ children.forEach(({ parent, children }) => {
21689
+ const parentId = ids.get(parent);
21690
+ if (!parentId)
21691
+ return;
21692
+ children.forEach((title) => {
21693
+ const id = AXPDataGenerator.uuid();
21694
+ ids.set(title, id);
21695
+ const descriptionMap = {
21696
+ 'Frontend Engineering': 'Client-side engineering track',
21697
+ 'Backend Engineering': 'Server-side engineering track',
21698
+ 'Mobile Engineering': 'Mobile application engineering track',
21699
+ 'Quality Engineering': 'Testing and QA track',
21700
+ 'Engineering Management': 'People and delivery leadership track',
21701
+ 'Technical Architecture': 'Architecture and system design track',
21702
+ 'DevOps Leadership': 'Reliability and platform engineering track',
21703
+ 'Product Management': 'Product strategy and delivery track',
21704
+ 'UX/UI Design': 'User experience and interface design track',
21705
+ 'Product Analytics': 'Data-driven product insights track',
21706
+ 'IT Operations': 'IT and infrastructure operations track',
21707
+ 'Technical Support': 'Customer and internal support track',
21708
+ 'Security Operations': 'Cybersecurity and defense track',
21709
+ Sales: 'Sales roles and career track',
21710
+ Marketing: 'Marketing roles and career track',
21711
+ 'Business Development': 'Partnerships and growth roles',
21712
+ 'C-Suite': 'Executive leadership team',
21713
+ 'Board Members': 'Corporate board members',
21714
+ 'Corporate Strategy': 'Corporate planning and strategy',
21715
+ };
21716
+ categories.push({ id, title, description: descriptionMap[title] ?? '', parentId, childCount: 0 });
21717
+ });
21718
+ const parentObj = categories.find((c) => c.id === parentId);
21719
+ if (parentObj)
21720
+ parentObj.childCount = children.length;
21721
+ });
21722
+ return categories;
21723
+ }
21724
+ const POSITIONS_CATEGORY_MOCK = generatePositionsCategory();
21725
+ function generatePositions() {
21726
+ const positions = [];
21727
+ const categories = POSITIONS_CATEGORY_MOCK;
21728
+ const childPositions = [
21729
+ { parent: 'Frontend Engineering', children: ['Junior Frontend Engineer', 'Frontend Engineer'] },
21730
+ { parent: 'Backend Engineering', children: ['Junior Backend Engineer', 'Backend Engineer'] },
21731
+ { parent: 'Mobile Engineering', children: ['Junior Mobile Developer', 'Mobile Developer', 'Senior Mobile Developer', 'Mobile Architect'] },
21732
+ { parent: 'Quality Engineering', children: ['QA Analyst', 'QA Engineer', 'Senior QA Engineer', 'QA Manager'] },
21733
+ { parent: 'Engineering Management', children: ['Engineering Team Lead', 'Engineering Manager', 'Director of Engineering', 'VP of Engineering'] },
21734
+ { parent: 'Product Management', children: ['Associate Product Manager', 'Product Manager', 'Senior Product Manager', 'Director of Product'] },
21735
+ { parent: 'UX/UI Design', children: ['UX Designer', 'UI Designer', 'Senior UX Designer', 'UX Design Manager'] },
21736
+ { parent: 'IT Operations', children: ['IT Support Specialist', 'Systems Administrator'] },
21737
+ { parent: 'Sales', children: ['Sales Associate', 'Account Executive', 'Sales Manager', 'VP of Sales'] },
21738
+ { parent: 'C-Suite', children: ['CTO', 'CEO', 'CFO', 'COO'] },
21739
+ { parent: 'DevOps Leadership', children: ['DevOps Engineer', 'Senior DevOps Engineer', 'DevOps Manager', 'Director of DevOps'] },
21740
+ { parent: 'Health, Safety & Environment', children: ['HSE Officer', 'Safety Officer', 'Environmental Specialist', 'HSE Manager'] },
21741
+ { parent: 'Engineering Management', children: ['Production Supervisor'] },
21742
+ { parent: 'Operations', children: ['Maintenance Technician', 'Maintenance Engineer', 'Quality Inspector', 'Quality Engineer', 'Procurement Specialist', 'Warehouse Associate', 'Warehouse Supervisor', 'Production Planner'] },
21743
+ ];
21744
+ // Position descriptions mapping
21745
+ const positionDescriptions = {
21746
+ // Frontend Engineering
21747
+ 'Junior Frontend Engineer': 'Entry-level frontend developer responsible for building user interfaces using HTML, CSS, and JavaScript frameworks. Focuses on learning best practices and contributing to team projects.',
21748
+ 'Frontend Engineer': 'Mid-level frontend developer who builds responsive web applications, implements UI/UX designs, and collaborates with design and backend teams.',
21749
+ 'Senior Frontend Engineer': 'Experienced frontend developer who leads technical decisions, mentors junior developers, and architects scalable frontend solutions.',
21750
+ 'Frontend Architect': 'Senior technical leader responsible for frontend architecture decisions, performance optimization, and setting technical standards for the frontend team.',
21751
+ // Backend Engineering
21752
+ 'Junior Backend Engineer': 'Entry-level backend developer focused on building server-side logic, APIs, and database interactions. Learns backend technologies and best practices.',
21753
+ 'Backend Engineer': 'Mid-level backend developer who designs and implements server-side applications, APIs, and database schemas.',
21754
+ 'Senior Backend Engineer': 'Experienced backend developer who leads technical decisions, optimizes system performance, and mentors junior developers.',
21755
+ 'Backend Architect': 'Senior technical leader responsible for backend architecture, system design, and technical strategy for server-side systems.',
21756
+ // Mobile Engineering
21757
+ 'Junior Mobile Developer': 'Entry-level mobile developer focused on building native or cross-platform mobile applications. Learns mobile development frameworks and best practices.',
21758
+ 'Mobile Developer': 'Mid-level mobile developer who creates mobile apps, implements features, and ensures app performance and user experience.',
21759
+ 'Senior Mobile Developer': 'Experienced mobile developer who leads mobile development initiatives, optimizes app performance, and mentors junior developers.',
21760
+ 'Mobile Architect': 'Senior technical leader responsible for mobile architecture decisions, platform strategy, and technical standards for mobile development.',
21761
+ // Quality Engineering
21762
+ 'QA Analyst': 'Entry-level quality assurance professional who executes test plans, reports bugs, and ensures software quality through systematic testing.',
21763
+ 'QA Engineer': 'Mid-level QA professional who designs test strategies, automates testing processes, and collaborates with development teams.',
21764
+ 'Senior QA Engineer': 'Experienced QA professional who leads testing initiatives, implements quality processes, and mentors junior QA team members.',
21765
+ 'QA Manager': 'Senior leader responsible for managing the QA team, establishing quality standards, and ensuring overall software quality.',
21766
+ // Engineering Management
21767
+ 'Engineering Team Lead': 'Technical leader who manages a small engineering team, provides technical guidance, and ensures project delivery.',
21768
+ 'Engineering Manager': 'People manager responsible for team development, project planning, and technical decision-making for engineering teams.',
21769
+ 'Director of Engineering': 'Senior leader who manages multiple engineering teams, sets technical strategy, and drives engineering excellence.',
21770
+ 'VP of Engineering': 'Executive leader responsible for overall engineering strategy, team growth, and technical direction across the organization.',
21771
+ // Product Management
21772
+ 'Associate Product Manager': 'Entry-level product professional who supports product development, conducts research, and assists with product strategy.',
21773
+ 'Product Manager': 'Mid-level product professional who defines product vision, prioritizes features, and collaborates with cross-functional teams.',
21774
+ 'Senior Product Manager': 'Experienced product professional who leads product strategy, mentors junior PMs, and drives product success.',
21775
+ 'Director of Product': 'Senior leader responsible for product portfolio strategy, team leadership, and product vision across multiple products.',
21776
+ // UX/UI Design
21777
+ 'UX Designer': 'Design professional focused on user experience research, user flows, and creating intuitive user interfaces.',
21778
+ 'UI Designer': 'Visual designer who creates user interface designs, design systems, and ensures visual consistency across products.',
21779
+ 'Senior UX Designer': 'Experienced UX professional who leads design initiatives, mentors junior designers, and drives user experience strategy.',
21780
+ 'UX Design Manager': 'Senior leader responsible for managing the design team, establishing design processes, and ensuring design quality.',
21781
+ // IT Operations
21782
+ 'IT Support Specialist': 'Entry-level IT professional who provides technical support, troubleshoots issues, and maintains IT systems.',
21783
+ 'Systems Administrator': 'Mid-level IT professional who manages server infrastructure, implements security measures, and ensures system reliability.',
21784
+ // Sales
21785
+ 'Sales Associate': 'Entry-level sales professional who supports sales activities, qualifies leads, and assists with customer relationships.',
21786
+ 'Account Executive': 'Mid-level sales professional who manages customer accounts, drives sales growth, and builds client relationships.',
21787
+ 'Sales Manager': 'Senior sales professional who leads sales teams, develops sales strategies, and drives revenue growth.',
21788
+ 'VP of Sales': 'Executive leader responsible for overall sales strategy, team leadership, and revenue generation across the organization.',
21789
+ // C-Suite
21790
+ 'CTO': 'Chief Technology Officer responsible for technology strategy, innovation, and technical leadership across the organization.',
21791
+ 'CEO': 'Chief Executive Officer responsible for overall company strategy, leadership, and business success.',
21792
+ 'CFO': 'Chief Financial Officer responsible for financial strategy, planning, and financial operations.',
21793
+ 'COO': 'Chief Operating Officer responsible for operational excellence, process optimization, and day-to-day business operations.',
21794
+ // DevOps Leadership
21795
+ 'DevOps Engineer': 'Mid-level DevOps professional who automates deployment processes, manages infrastructure, and ensures system reliability.',
21796
+ 'Senior DevOps Engineer': 'Experienced DevOps professional who leads infrastructure initiatives, optimizes deployment processes, and mentors junior team members.',
21797
+ 'DevOps Manager': 'Senior leader responsible for managing DevOps teams, establishing best practices, and driving operational excellence.',
21798
+ 'Director of DevOps': 'Senior leader responsible for DevOps strategy, infrastructure planning, and technical leadership for operations teams.',
21799
+ // Core Industrial Operations
21800
+ 'Production Supervisor': 'Leads production lines and teams, manages shift performance, and ensures production targets and quality standards are met.',
21801
+ 'Maintenance Technician': 'Executes routine and corrective maintenance tasks to ensure equipment uptime.',
21802
+ 'Maintenance Engineer': 'Plans maintenance strategies, analyzes failures, and drives reliability improvements.',
21803
+ 'Quality Inspector': 'Performs incoming, in-process, and final inspections to ensure product conformance.',
21804
+ 'Quality Engineer': 'Develops control plans, handles nonconformances, and leads continuous improvement initiatives.',
21805
+ 'Procurement Specialist': 'Sources materials, negotiates contracts, and manages purchase orders.',
21806
+ 'Warehouse Associate': 'Handles receiving, storage, picking, packing, and shipping operations.',
21807
+ 'Warehouse Supervisor': 'Oversees warehouse staff and processes, ensuring accuracy and on-time shipments.',
21808
+ 'Production Planner': 'Creates production schedules, coordinates materials and capacity, and monitors adherence.',
21809
+ // Health, Safety & Environment
21810
+ 'HSE Officer': 'Professional supporting health and safety initiatives, audits, and safety training across operations.',
21811
+ 'Safety Officer': 'Specialist enforcing safety standards, conducting inspections, and coordinating incident investigations.',
21812
+ 'Environmental Specialist': 'Professional overseeing environmental compliance, waste management, and sustainability reporting.',
21813
+ 'HSE Manager': 'Leader managing HSE programs, regulatory compliance, and continuous improvement in safety performance.'
21814
+ };
21815
+ childPositions.forEach(({ parent, children }) => {
21816
+ const parentObj = categories.find((c) => c.title === parent);
21817
+ if (!parentObj)
21818
+ return;
21819
+ children.forEach((title) => {
21820
+ positions.push({
21821
+ id: AXPDataGenerator.uuid(),
21822
+ title,
21823
+ description: positionDescriptions[title] || 'Professional position with specific responsibilities and requirements.',
21824
+ categoryIds: [parentObj.id],
21825
+ categories: [{ id: parentObj.id, title: parentObj.title }],
21826
+ isManager: /(Manager|Director|Lead|VP|Chief|Head)/i.test(title),
21827
+ });
21828
+ });
21829
+ });
21830
+ return positions;
21831
+ }
21832
+ const POSITIONS_MOCK = generatePositions();
21833
+
21073
21834
  const uuid$h = AXPDataGenerator.uuid;
21074
21835
  const TYPE = {
21075
21836
  division: BUSINESS_UNIT_TYPES_MOCK.find(t => t.code === 'division'),
@@ -21094,6 +21855,13 @@ const DE_BAV = regionBy('state', 'BAV');
21094
21855
  const MUNICH = regionBy('city', 'MUNICH');
21095
21856
  const BUSINESS_UNITS_MOCK = (() => {
21096
21857
  const items = [];
21858
+ function positionsByTitles(titles) {
21859
+ const map = new Map();
21860
+ POSITIONS_MOCK.forEach(p => map.set(p.title, { id: p.id, title: p.title }));
21861
+ const refs = titles.map(t => map.get(t)).filter(Boolean);
21862
+ const ids = refs.map(r => r.id);
21863
+ return { positionIds: ids, positions: refs };
21864
+ }
21097
21865
  // Divisions (top-level)
21098
21866
  const divisionOps = {
21099
21867
  id: uuid$h(),
@@ -21109,6 +21877,7 @@ const BUSINESS_UNITS_MOCK = (() => {
21109
21877
  country: US,
21110
21878
  state: US_CA,
21111
21879
  city: LA,
21880
+ ...positionsByTitles(['Maintenance Engineer', 'Maintenance Technician', 'Quality Engineer', 'Quality Inspector', 'Production Supervisor', 'HSE Manager'])
21112
21881
  };
21113
21882
  const divisionSales = {
21114
21883
  id: uuid$h(),
@@ -21124,6 +21893,7 @@ const BUSINESS_UNITS_MOCK = (() => {
21124
21893
  country: AU,
21125
21894
  state: AU_NSW,
21126
21895
  city: SYDNEY,
21896
+ ...positionsByTitles(['Sales Associate', 'Account Executive', 'Sales Manager', 'VP of Sales'])
21127
21897
  };
21128
21898
  const divisionEngineering = {
21129
21899
  id: uuid$h(),
@@ -21139,6 +21909,7 @@ const BUSINESS_UNITS_MOCK = (() => {
21139
21909
  country: DE,
21140
21910
  state: DE_BAV,
21141
21911
  city: MUNICH,
21912
+ ...positionsByTitles(['Frontend Engineer', 'Backend Engineer', 'Engineering Manager', 'Director of Engineering'])
21142
21913
  };
21143
21914
  items.push(divisionOps, divisionSales, divisionEngineering);
21144
21915
  // Departments under Operations
@@ -21150,6 +21921,7 @@ const BUSINESS_UNITS_MOCK = (() => {
21150
21921
  type: { id: TYPE.department.id, title: TYPE.department.title },
21151
21922
  parentId: divisionOps.id,
21152
21923
  parent: { id: divisionOps.id, title: divisionOps.title },
21924
+ ...positionsByTitles(['HSE Officer', 'Safety Officer', 'Environmental Specialist', 'HSE Manager'])
21153
21925
  };
21154
21926
  const depQuality = {
21155
21927
  id: uuid$h(),
@@ -21159,6 +21931,7 @@ const BUSINESS_UNITS_MOCK = (() => {
21159
21931
  type: { id: TYPE.department.id, title: TYPE.department.title },
21160
21932
  parentId: divisionOps.id,
21161
21933
  parent: { id: divisionOps.id, title: divisionOps.title },
21934
+ ...positionsByTitles(['QA Analyst', 'QA Engineer', 'Senior QA Engineer', 'QA Manager', 'Quality Inspector', 'Quality Engineer'])
21162
21935
  };
21163
21936
  const depMaintenance = {
21164
21937
  id: uuid$h(),
@@ -21168,6 +21941,7 @@ const BUSINESS_UNITS_MOCK = (() => {
21168
21941
  type: { id: TYPE.department.id, title: TYPE.department.title },
21169
21942
  parentId: divisionOps.id,
21170
21943
  parent: { id: divisionOps.id, title: divisionOps.title },
21944
+ ...positionsByTitles(['Maintenance Technician', 'Maintenance Engineer'])
21171
21945
  };
21172
21946
  items.push(depHSE, depQuality, depMaintenance);
21173
21947
  // Departments under Engineering
@@ -21179,6 +21953,7 @@ const BUSINESS_UNITS_MOCK = (() => {
21179
21953
  type: { id: TYPE.department.id, title: TYPE.department.title },
21180
21954
  parentId: divisionEngineering.id,
21181
21955
  parent: { id: divisionEngineering.id, title: divisionEngineering.title },
21956
+ ...positionsByTitles(['DevOps Engineer', 'Senior DevOps Engineer', 'Engineering Team Lead', 'Director of DevOps'])
21182
21957
  };
21183
21958
  const depProduct = {
21184
21959
  id: uuid$h(),
@@ -21188,6 +21963,7 @@ const BUSINESS_UNITS_MOCK = (() => {
21188
21963
  type: { id: TYPE.department.id, title: TYPE.department.title },
21189
21964
  parentId: divisionEngineering.id,
21190
21965
  parent: { id: divisionEngineering.id, title: divisionEngineering.title },
21966
+ ...positionsByTitles(['Associate Product Manager', 'Product Manager', 'Senior Product Manager', 'UX Designer'])
21191
21967
  };
21192
21968
  items.push(depPlatform, depProduct);
21193
21969
  // Branches (location-based) under cities
@@ -21205,6 +21981,7 @@ const BUSINESS_UNITS_MOCK = (() => {
21205
21981
  country: US,
21206
21982
  state: US_CA,
21207
21983
  city: LA,
21984
+ ...positionsByTitles(['Sales Associate', 'Account Executive'])
21208
21985
  };
21209
21986
  const branchSF = {
21210
21987
  id: uuid$h(),
@@ -21220,6 +21997,7 @@ const BUSINESS_UNITS_MOCK = (() => {
21220
21997
  country: US,
21221
21998
  state: US_CA,
21222
21999
  city: SF,
22000
+ ...positionsByTitles(['Sales Associate', 'Account Executive'])
21223
22001
  };
21224
22002
  const branchSydney = {
21225
22003
  id: uuid$h(),
@@ -21235,6 +22013,7 @@ const BUSINESS_UNITS_MOCK = (() => {
21235
22013
  country: AU,
21236
22014
  state: AU_NSW,
21237
22015
  city: SYDNEY,
22016
+ ...positionsByTitles(['Sales Associate', 'Account Executive'])
21238
22017
  };
21239
22018
  items.push(branchLA, branchSF, branchSydney);
21240
22019
  return items;
@@ -21254,6 +22033,171 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.8", ngImpor
21254
22033
  type: Injectable
21255
22034
  }] });
21256
22035
 
22036
+ class LocationOrgChartBuilder {
22037
+ build(context) {
22038
+ const { root, indices, helpers, includeEmployees, orgRootConfig } = context;
22039
+ for (const bu of context.data.businessUnits) {
22040
+ const type = indices.buTypeById.get(bu.typeId);
22041
+ const typeCode = type?.code ?? '';
22042
+ const buNodeType = typeCode === 'division' ? AXMOrgChartNodeType.Division :
22043
+ typeCode === 'department' ? AXMOrgChartNodeType.Department :
22044
+ AXMOrgChartNodeType.Branch;
22045
+ const countryNode = helpers.ensureCountry(bu.country);
22046
+ const stateNode = helpers.ensureState(countryNode, bu.state);
22047
+ const cityNode = helpers.ensureCity(stateNode, bu.city);
22048
+ const buAssignments = indices.assignmentsByBU.get(String(bu.id)) || [];
22049
+ const children = includeEmployees ? helpers.buildPositionNodes(buAssignments) : [];
22050
+ const buNode = {
22051
+ id: AXPDataGenerator.uuid(),
22052
+ title: bu.title,
22053
+ description: bu.description,
22054
+ type: buNodeType,
22055
+ icon: typeCode === 'division' ? 'fa-sitemap' : typeCode === 'department' ? 'fa-building-user' : 'fa-network-wired',
22056
+ entity: { id: bu.id, source: orgRootConfig.entities.businessUnit.source },
22057
+ children,
22058
+ };
22059
+ if (cityNode) {
22060
+ cityNode.children = cityNode.children || [];
22061
+ cityNode.children.push(buNode);
22062
+ }
22063
+ else {
22064
+ root.children.push(buNode);
22065
+ }
22066
+ }
22067
+ return root;
22068
+ }
22069
+ }
22070
+
22071
+ class StructureOrgChartBuilder {
22072
+ build(context) {
22073
+ const { root, indices, helpers, includeEmployees, orgRootConfig } = context;
22074
+ // Build BU hierarchy by parent reference if exists; otherwise group by type
22075
+ const childrenByParent = new Map();
22076
+ for (const bu of context.data.businessUnits) {
22077
+ const parentId = bu.parentId ?? undefined;
22078
+ const list = childrenByParent.get(parentId) || [];
22079
+ list.push(bu);
22080
+ childrenByParent.set(parentId, list);
22081
+ }
22082
+ const createBuNode = (bu) => {
22083
+ const type = indices.buTypeById.get(bu.typeId);
22084
+ const typeCode = type?.code ?? '';
22085
+ const buNodeType = typeCode === 'division' ? AXMOrgChartNodeType.Division :
22086
+ typeCode === 'department' ? AXMOrgChartNodeType.Department :
22087
+ AXMOrgChartNodeType.Branch;
22088
+ const buAssignments = indices.assignmentsByBU.get(String(bu.id)) || [];
22089
+ const children = includeEmployees ? helpers.buildPositionNodes(buAssignments) : [];
22090
+ const node = {
22091
+ id: AXPDataGenerator.uuid(),
22092
+ title: bu.title,
22093
+ description: bu.description,
22094
+ type: buNodeType,
22095
+ icon: typeCode === 'division' ? 'fa-sitemap' : typeCode === 'department' ? 'fa-building-user' : 'fa-network-wired',
22096
+ entity: { id: bu.id, source: orgRootConfig.entities.businessUnit.source },
22097
+ children,
22098
+ };
22099
+ const childrenList = childrenByParent.get(String(bu.id)) || [];
22100
+ for (const childBu of childrenList) {
22101
+ node.children = node.children || [];
22102
+ node.children.push(createBuNode(childBu));
22103
+ }
22104
+ return node;
22105
+ };
22106
+ // Roots: undefined parent or explicit null
22107
+ const rootCandidates = childrenByParent.get(undefined) || childrenByParent.get(null) || [];
22108
+ if (rootCandidates.length) {
22109
+ for (const top of rootCandidates) {
22110
+ root.children.push(createBuNode(top));
22111
+ }
22112
+ }
22113
+ else {
22114
+ // Fallback: group by type order Division -> Department -> Branch
22115
+ const divisions = context.data.businessUnits.filter(bu => (indices.buTypeById.get(bu.typeId)?.code ?? '') === 'division');
22116
+ const departments = context.data.businessUnits.filter(bu => (indices.buTypeById.get(bu.typeId)?.code ?? '') === 'department');
22117
+ const branches = context.data.businessUnits.filter(bu => (indices.buTypeById.get(bu.typeId)?.code ?? '') === 'branch');
22118
+ const addAll = (list) => list.forEach(bu => root.children.push(createBuNode(bu)));
22119
+ addAll(divisions);
22120
+ addAll(departments);
22121
+ addAll(branches);
22122
+ }
22123
+ return root;
22124
+ }
22125
+ }
22126
+
22127
+ /**
22128
+ * Reporting builder: builds a tree based on position reporting chain.
22129
+ * Assumptions:
22130
+ * - Prefer using `position.reportsToPositionId` if exists.
22131
+ * - Fallback: derive manager from assignments by `managerPositionId` or similar if present; otherwise flat under BU.
22132
+ */
22133
+ class ReportingOrgChartBuilder {
22134
+ build(context) {
22135
+ const { root, indices } = context;
22136
+ // Map child positions by manager position id
22137
+ const childrenByManager = new Map();
22138
+ for (const position of context.data.positions) {
22139
+ const reportsTo = position.reportsToPositionId ?? undefined;
22140
+ const list = childrenByManager.get(reportsTo) || [];
22141
+ list.push(position.id);
22142
+ childrenByManager.set(reportsTo, list);
22143
+ }
22144
+ const createPositionNode = (positionId) => {
22145
+ const pos = indices.positionById.get(positionId);
22146
+ const assignmentsInAllBU = this.collectAssignmentsForPosition(context, positionId);
22147
+ const rep = context.helpers.chooseRepresentativeAssignment(assignmentsInAllBU);
22148
+ const employee = rep ? context.indices.employeeById.get(rep.employeeId) : null;
22149
+ const employeeName = employee?.party?.displayName ?? employee?.fullName ?? null;
22150
+ const employeeRole = employee?.role?.title ?? null;
22151
+ const node = {
22152
+ id: AXPDataGenerator.uuid(),
22153
+ title: pos?.title ?? 'Position',
22154
+ subtitle: employeeName ?? 'Vacant',
22155
+ description: employeeName && employeeRole ? employeeRole : undefined,
22156
+ type: AXMOrgChartNodeType.Position,
22157
+ icon: 'fa-user-tie',
22158
+ entity: { id: positionId, source: context.orgRootConfig.entities.position.source },
22159
+ children: [],
22160
+ };
22161
+ const children = childrenByManager.get(positionId) || [];
22162
+ for (const childPosId of children) {
22163
+ node.children.push(createPositionNode(childPosId));
22164
+ }
22165
+ return node;
22166
+ };
22167
+ // Top managers: positions without a manager
22168
+ const tops = childrenByManager.get(undefined) || [];
22169
+ for (const posId of tops) {
22170
+ root.children.push(createPositionNode(posId));
22171
+ }
22172
+ return root;
22173
+ }
22174
+ collectAssignmentsForPosition(context, positionId) {
22175
+ const result = [];
22176
+ for (const [_buId, list] of context.indices.assignmentsByBU.entries()) {
22177
+ for (const a of list) {
22178
+ if (String(a.positionId) !== String(positionId))
22179
+ continue;
22180
+ if (!context.helpers.isActiveAssignment(a, context.now, context.preferPrimary))
22181
+ continue;
22182
+ result.push(a);
22183
+ }
22184
+ }
22185
+ return result;
22186
+ }
22187
+ }
22188
+
22189
+ const createBuilder = (mode) => {
22190
+ switch (mode) {
22191
+ case 'structure':
22192
+ return new StructureOrgChartBuilder();
22193
+ case 'reporting':
22194
+ return new ReportingOrgChartBuilder();
22195
+ case 'location':
22196
+ default:
22197
+ return new LocationOrgChartBuilder();
22198
+ }
22199
+ };
22200
+
21257
22201
  class AXMOrgChartGenerateCommand {
21258
22202
  constructor() {
21259
22203
  //#region ---- Services & Dependencies ----
@@ -21265,15 +22209,17 @@ class AXMOrgChartGenerateCommand {
21265
22209
  async execute(input) {
21266
22210
  const includeEmployees = input?.includeEmployees !== false;
21267
22211
  const preferPrimary = input?.preferPrimary !== false;
22212
+ const mode = input?.mode ?? 'location';
21268
22213
  const now = new Date();
21269
22214
  // Build root from tenant (virtual root)
21270
22215
  const tenant = this.session.tenant;
21271
22216
  const root = {
21272
22217
  id: AXPDataGenerator.uuid(),
21273
- title: tenant?.name || 'Demo Organization',
22218
+ title: tenant?.title || 'Demo Organization',
21274
22219
  type: AXMOrgChartNodeType.Company,
21275
22220
  entity: tenant ? { id: tenant.id, source: 'tenant' } : undefined,
21276
22221
  isExpanded: true,
22222
+ icon: 'fa-building',
21277
22223
  children: [],
21278
22224
  };
21279
22225
  // Load sources
@@ -21395,35 +22341,39 @@ class AXMOrgChartGenerateCommand {
21395
22341
  }
21396
22342
  return nodes;
21397
22343
  };
21398
- // Place BusinessUnits under Country/State/City (virtual), then attach position nodes
21399
- for (const bu of businessUnits) {
21400
- const type = buTypeById.get(bu.typeId);
21401
- const typeCode = type?.code ?? '';
21402
- const buNodeType = typeCode === 'division' ? AXMOrgChartNodeType.Division :
21403
- typeCode === 'department' ? AXMOrgChartNodeType.Department :
21404
- AXMOrgChartNodeType.Branch;
21405
- const countryNode = ensureCountry(bu.country);
21406
- const stateNode = ensureState(countryNode, bu.state);
21407
- const cityNode = ensureCity(stateNode, bu.city);
21408
- const buAssignments = assignmentsByBU.get(String(bu.id)) || [];
21409
- const children = includeEmployees ? buildPositionNodes(buAssignments) : [];
21410
- const buNode = {
21411
- id: AXPDataGenerator.uuid(),
21412
- title: bu.title,
21413
- description: bu.description,
21414
- type: buNodeType,
21415
- icon: typeCode === 'division' ? 'fa-sitemap' : typeCode === 'department' ? 'fa-building-user' : 'fa-network-wired',
21416
- entity: { id: bu.id, source: RootConfig$c.entities.businessUnit.source },
21417
- children,
21418
- };
21419
- if (cityNode) {
21420
- cityNode.children = cityNode.children || [];
21421
- cityNode.children.push(buNode);
21422
- }
21423
- else {
21424
- root.children.push(buNode);
21425
- }
21426
- }
22344
+ // Build context for selected builder
22345
+ const ctx = {
22346
+ now,
22347
+ includeEmployees,
22348
+ preferPrimary,
22349
+ orgRootConfig: RootConfig$c,
22350
+ hcmRootConfig: RootConfig$d,
22351
+ root,
22352
+ data: {
22353
+ businessUnits: businessUnits,
22354
+ businessUnitTypes: businessUnitTypes,
22355
+ positions: positions,
22356
+ employees: employees,
22357
+ assignments: assignments,
22358
+ },
22359
+ indices: {
22360
+ businessUnitById,
22361
+ buTypeById,
22362
+ positionById,
22363
+ employeeById,
22364
+ assignmentsByBU,
22365
+ },
22366
+ helpers: {
22367
+ isActiveAssignment: this.isActiveAssignment.bind(this),
22368
+ chooseRepresentativeAssignment,
22369
+ ensureCountry,
22370
+ ensureState,
22371
+ ensureCity,
22372
+ buildPositionNodes,
22373
+ },
22374
+ };
22375
+ const builder = createBuilder(mode);
22376
+ builder.build(ctx);
21427
22377
  // Persist as a new version
21428
22378
  const version = this.generateVersion();
21429
22379
  const id = await this.storage.insertOne(RootConfig$c.entities.chart.source, {
@@ -21841,177 +22791,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.8", ngImpor
21841
22791
  type: Injectable
21842
22792
  }] });
21843
22793
 
21844
- function generatePositionsCategory() {
21845
- const categories = [];
21846
- const roots = ['Engineering Positions', 'Technical Leadership', 'Product Positions', 'Operations', 'Business Functions', 'Executive Leadership'];
21847
- const ids = new Map();
21848
- roots.forEach((title) => {
21849
- const id = AXPDataGenerator.uuid();
21850
- ids.set(title, id);
21851
- const descriptionMap = {
21852
- 'Engineering Positions': 'All engineering role families',
21853
- 'Technical Leadership': 'Leadership tracks within technology',
21854
- 'Product Positions': 'Roles related to product management & design',
21855
- Operations: 'IT, Support and Security positions',
21856
- 'Business Functions': 'Sales, Marketing and BD roles',
21857
- 'Executive Leadership': 'C-level and executive roles',
21858
- };
21859
- categories.push({ id, title, description: descriptionMap[title] ?? '', childCount: 0 });
21860
- });
21861
- const children = [
21862
- { parent: 'Engineering Positions', children: ['Frontend Engineering', 'Backend Engineering', 'Mobile Engineering', 'Quality Engineering'] },
21863
- { parent: 'Technical Leadership', children: ['Engineering Management', 'Technical Architecture', 'DevOps Leadership'] },
21864
- { parent: 'Product Positions', children: ['Product Management', 'UX/UI Design', 'Product Analytics'] },
21865
- { parent: 'Operations', children: ['IT Operations', 'Technical Support', 'Security Operations', 'Health, Safety & Environment'] },
21866
- { parent: 'Business Functions', children: ['Sales', 'Marketing', 'Business Development'] },
21867
- { parent: 'Executive Leadership', children: ['C-Suite', 'Board Members', 'Corporate Strategy'] },
21868
- ];
21869
- children.forEach(({ parent, children }) => {
21870
- const parentId = ids.get(parent);
21871
- if (!parentId)
21872
- return;
21873
- children.forEach((title) => {
21874
- const id = AXPDataGenerator.uuid();
21875
- ids.set(title, id);
21876
- const descriptionMap = {
21877
- 'Frontend Engineering': 'Client-side engineering track',
21878
- 'Backend Engineering': 'Server-side engineering track',
21879
- 'Mobile Engineering': 'Mobile application engineering track',
21880
- 'Quality Engineering': 'Testing and QA track',
21881
- 'Engineering Management': 'People and delivery leadership track',
21882
- 'Technical Architecture': 'Architecture and system design track',
21883
- 'DevOps Leadership': 'Reliability and platform engineering track',
21884
- 'Product Management': 'Product strategy and delivery track',
21885
- 'UX/UI Design': 'User experience and interface design track',
21886
- 'Product Analytics': 'Data-driven product insights track',
21887
- 'IT Operations': 'IT and infrastructure operations track',
21888
- 'Technical Support': 'Customer and internal support track',
21889
- 'Security Operations': 'Cybersecurity and defense track',
21890
- Sales: 'Sales roles and career track',
21891
- Marketing: 'Marketing roles and career track',
21892
- 'Business Development': 'Partnerships and growth roles',
21893
- 'C-Suite': 'Executive leadership team',
21894
- 'Board Members': 'Corporate board members',
21895
- 'Corporate Strategy': 'Corporate planning and strategy',
21896
- };
21897
- categories.push({ id, title, description: descriptionMap[title] ?? '', parentId, childCount: 0 });
21898
- });
21899
- const parentObj = categories.find((c) => c.id === parentId);
21900
- if (parentObj)
21901
- parentObj.childCount = children.length;
21902
- });
21903
- return categories;
21904
- }
21905
- const POSITIONS_CATEGORY_MOCK = generatePositionsCategory();
21906
- function generatePositions() {
21907
- const positions = [];
21908
- const categories = POSITIONS_CATEGORY_MOCK;
21909
- const childPositions = [
21910
- { parent: 'Frontend Engineering', children: ['Junior Frontend Engineer', 'Frontend Engineer'] },
21911
- { parent: 'Backend Engineering', children: ['Junior Backend Engineer', 'Backend Engineer'] },
21912
- { parent: 'Mobile Engineering', children: ['Junior Mobile Developer', 'Mobile Developer', 'Senior Mobile Developer', 'Mobile Architect'] },
21913
- { parent: 'Quality Engineering', children: ['QA Analyst', 'QA Engineer', 'Senior QA Engineer', 'QA Manager'] },
21914
- { parent: 'Engineering Management', children: ['Engineering Team Lead', 'Engineering Manager', 'Director of Engineering', 'VP of Engineering'] },
21915
- { parent: 'Product Management', children: ['Associate Product Manager', 'Product Manager', 'Senior Product Manager', 'Director of Product'] },
21916
- { parent: 'UX/UI Design', children: ['UX Designer', 'UI Designer', 'Senior UX Designer', 'UX Design Manager'] },
21917
- { parent: 'IT Operations', children: ['IT Support Specialist', 'Systems Administrator'] },
21918
- { parent: 'Sales', children: ['Sales Associate', 'Account Executive', 'Sales Manager', 'VP of Sales'] },
21919
- { parent: 'C-Suite', children: ['CTO', 'CEO', 'CFO', 'COO'] },
21920
- { parent: 'DevOps Leadership', children: ['DevOps Engineer', 'Senior DevOps Engineer', 'DevOps Manager', 'Director of DevOps'] },
21921
- { parent: 'Health, Safety & Environment', children: ['HSE Officer', 'Safety Officer', 'Environmental Specialist', 'HSE Manager'] },
21922
- { parent: 'Engineering Management', children: ['Production Supervisor'] },
21923
- { parent: 'Operations', children: ['Maintenance Technician', 'Maintenance Engineer', 'Quality Inspector', 'Quality Engineer', 'Procurement Specialist', 'Warehouse Associate', 'Warehouse Supervisor', 'Production Planner'] },
21924
- ];
21925
- // Position descriptions mapping
21926
- const positionDescriptions = {
21927
- // Frontend Engineering
21928
- 'Junior Frontend Engineer': 'Entry-level frontend developer responsible for building user interfaces using HTML, CSS, and JavaScript frameworks. Focuses on learning best practices and contributing to team projects.',
21929
- 'Frontend Engineer': 'Mid-level frontend developer who builds responsive web applications, implements UI/UX designs, and collaborates with design and backend teams.',
21930
- 'Senior Frontend Engineer': 'Experienced frontend developer who leads technical decisions, mentors junior developers, and architects scalable frontend solutions.',
21931
- 'Frontend Architect': 'Senior technical leader responsible for frontend architecture decisions, performance optimization, and setting technical standards for the frontend team.',
21932
- // Backend Engineering
21933
- 'Junior Backend Engineer': 'Entry-level backend developer focused on building server-side logic, APIs, and database interactions. Learns backend technologies and best practices.',
21934
- 'Backend Engineer': 'Mid-level backend developer who designs and implements server-side applications, APIs, and database schemas.',
21935
- 'Senior Backend Engineer': 'Experienced backend developer who leads technical decisions, optimizes system performance, and mentors junior developers.',
21936
- 'Backend Architect': 'Senior technical leader responsible for backend architecture, system design, and technical strategy for server-side systems.',
21937
- // Mobile Engineering
21938
- 'Junior Mobile Developer': 'Entry-level mobile developer focused on building native or cross-platform mobile applications. Learns mobile development frameworks and best practices.',
21939
- 'Mobile Developer': 'Mid-level mobile developer who creates mobile apps, implements features, and ensures app performance and user experience.',
21940
- 'Senior Mobile Developer': 'Experienced mobile developer who leads mobile development initiatives, optimizes app performance, and mentors junior developers.',
21941
- 'Mobile Architect': 'Senior technical leader responsible for mobile architecture decisions, platform strategy, and technical standards for mobile development.',
21942
- // Quality Engineering
21943
- 'QA Analyst': 'Entry-level quality assurance professional who executes test plans, reports bugs, and ensures software quality through systematic testing.',
21944
- 'QA Engineer': 'Mid-level QA professional who designs test strategies, automates testing processes, and collaborates with development teams.',
21945
- 'Senior QA Engineer': 'Experienced QA professional who leads testing initiatives, implements quality processes, and mentors junior QA team members.',
21946
- 'QA Manager': 'Senior leader responsible for managing the QA team, establishing quality standards, and ensuring overall software quality.',
21947
- // Engineering Management
21948
- 'Engineering Team Lead': 'Technical leader who manages a small engineering team, provides technical guidance, and ensures project delivery.',
21949
- 'Engineering Manager': 'People manager responsible for team development, project planning, and technical decision-making for engineering teams.',
21950
- 'Director of Engineering': 'Senior leader who manages multiple engineering teams, sets technical strategy, and drives engineering excellence.',
21951
- 'VP of Engineering': 'Executive leader responsible for overall engineering strategy, team growth, and technical direction across the organization.',
21952
- // Product Management
21953
- 'Associate Product Manager': 'Entry-level product professional who supports product development, conducts research, and assists with product strategy.',
21954
- 'Product Manager': 'Mid-level product professional who defines product vision, prioritizes features, and collaborates with cross-functional teams.',
21955
- 'Senior Product Manager': 'Experienced product professional who leads product strategy, mentors junior PMs, and drives product success.',
21956
- 'Director of Product': 'Senior leader responsible for product portfolio strategy, team leadership, and product vision across multiple products.',
21957
- // UX/UI Design
21958
- 'UX Designer': 'Design professional focused on user experience research, user flows, and creating intuitive user interfaces.',
21959
- 'UI Designer': 'Visual designer who creates user interface designs, design systems, and ensures visual consistency across products.',
21960
- 'Senior UX Designer': 'Experienced UX professional who leads design initiatives, mentors junior designers, and drives user experience strategy.',
21961
- 'UX Design Manager': 'Senior leader responsible for managing the design team, establishing design processes, and ensuring design quality.',
21962
- // IT Operations
21963
- 'IT Support Specialist': 'Entry-level IT professional who provides technical support, troubleshoots issues, and maintains IT systems.',
21964
- 'Systems Administrator': 'Mid-level IT professional who manages server infrastructure, implements security measures, and ensures system reliability.',
21965
- // Sales
21966
- 'Sales Associate': 'Entry-level sales professional who supports sales activities, qualifies leads, and assists with customer relationships.',
21967
- 'Account Executive': 'Mid-level sales professional who manages customer accounts, drives sales growth, and builds client relationships.',
21968
- 'Sales Manager': 'Senior sales professional who leads sales teams, develops sales strategies, and drives revenue growth.',
21969
- 'VP of Sales': 'Executive leader responsible for overall sales strategy, team leadership, and revenue generation across the organization.',
21970
- // C-Suite
21971
- 'CTO': 'Chief Technology Officer responsible for technology strategy, innovation, and technical leadership across the organization.',
21972
- 'CEO': 'Chief Executive Officer responsible for overall company strategy, leadership, and business success.',
21973
- 'CFO': 'Chief Financial Officer responsible for financial strategy, planning, and financial operations.',
21974
- 'COO': 'Chief Operating Officer responsible for operational excellence, process optimization, and day-to-day business operations.',
21975
- // DevOps Leadership
21976
- 'DevOps Engineer': 'Mid-level DevOps professional who automates deployment processes, manages infrastructure, and ensures system reliability.',
21977
- 'Senior DevOps Engineer': 'Experienced DevOps professional who leads infrastructure initiatives, optimizes deployment processes, and mentors junior team members.',
21978
- 'DevOps Manager': 'Senior leader responsible for managing DevOps teams, establishing best practices, and driving operational excellence.',
21979
- 'Director of DevOps': 'Senior leader responsible for DevOps strategy, infrastructure planning, and technical leadership for operations teams.',
21980
- // Core Industrial Operations
21981
- 'Production Supervisor': 'Leads production lines and teams, manages shift performance, and ensures production targets and quality standards are met.',
21982
- 'Maintenance Technician': 'Executes routine and corrective maintenance tasks to ensure equipment uptime.',
21983
- 'Maintenance Engineer': 'Plans maintenance strategies, analyzes failures, and drives reliability improvements.',
21984
- 'Quality Inspector': 'Performs incoming, in-process, and final inspections to ensure product conformance.',
21985
- 'Quality Engineer': 'Develops control plans, handles nonconformances, and leads continuous improvement initiatives.',
21986
- 'Procurement Specialist': 'Sources materials, negotiates contracts, and manages purchase orders.',
21987
- 'Warehouse Associate': 'Handles receiving, storage, picking, packing, and shipping operations.',
21988
- 'Warehouse Supervisor': 'Oversees warehouse staff and processes, ensuring accuracy and on-time shipments.',
21989
- 'Production Planner': 'Creates production schedules, coordinates materials and capacity, and monitors adherence.',
21990
- // Health, Safety & Environment
21991
- 'HSE Officer': 'Professional supporting health and safety initiatives, audits, and safety training across operations.',
21992
- 'Safety Officer': 'Specialist enforcing safety standards, conducting inspections, and coordinating incident investigations.',
21993
- 'Environmental Specialist': 'Professional overseeing environmental compliance, waste management, and sustainability reporting.',
21994
- 'HSE Manager': 'Leader managing HSE programs, regulatory compliance, and continuous improvement in safety performance.'
21995
- };
21996
- childPositions.forEach(({ parent, children }) => {
21997
- const parentObj = categories.find((c) => c.title === parent);
21998
- if (!parentObj)
21999
- return;
22000
- children.forEach((title) => {
22001
- positions.push({
22002
- id: AXPDataGenerator.uuid(),
22003
- title,
22004
- description: positionDescriptions[title] || 'Professional position with specific responsibilities and requirements.',
22005
- categoryIds: [parentObj.id],
22006
- categories: [{ id: parentObj.id, title: parentObj.title }],
22007
- isManager: /(Manager|Director|Lead|VP|Chief|Head)/i.test(title),
22008
- });
22009
- });
22010
- });
22011
- return positions;
22012
- }
22013
- const POSITIONS_MOCK = generatePositions();
22014
-
22015
22794
  class AXMPositionDataSeeder {
22016
22795
  constructor() {
22017
22796
  this.storageService = inject(AXPEntityStorageService);
@@ -23097,6 +23876,58 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.8", ngImpor
23097
23876
  type: Injectable
23098
23877
  }] });
23099
23878
 
23879
+ //#region ---- Imports ----
23880
+ //#endregion
23881
+ //#region ---- Org Chart Event Listener ----
23882
+ const AXCMockOrgChartEventListener = {
23883
+ key: 'entity.updated',
23884
+ async execute(data) {
23885
+ // Check if the updated entity is relevant for org chart generation
23886
+ const entityName = data?.entityName;
23887
+ if (!entityName)
23888
+ return;
23889
+ // Relevant entities that should trigger org chart regeneration
23890
+ const relevantEntities = [
23891
+ // Organization Management
23892
+ `${RootConfig$c.module.name}.${RootConfig$c.entities.businessUnit.name}`,
23893
+ `${RootConfig$c.module.name}.${RootConfig$c.entities.position.name}`,
23894
+ // Human Capital Management
23895
+ `${RootConfig$d.module.name}.${RootConfig$d.entities.employee.name}`,
23896
+ `${RootConfig$d.module.name}.${RootConfig$d.entities.positionAssignment.name}`
23897
+ ];
23898
+ if (!relevantEntities.includes(entityName)) {
23899
+ return; // Not a relevant entity, skip processing
23900
+ }
23901
+ try {
23902
+ // Execute org chart generation command via command service
23903
+ const commandService = inject(AXPCommandService);
23904
+ const result = await commandService.execute('OrganizationManagement.OrgChart:Generate', {
23905
+ includeEmployees: true,
23906
+ preferPrimary: true
23907
+ });
23908
+ // Log successful regeneration
23909
+ // eslint-disable-next-line no-console
23910
+ console.log('[Mock Org Chart Event]', {
23911
+ triggeredBy: entityName,
23912
+ operation: data?.operation,
23913
+ chartId: result?.id,
23914
+ version: result?.version,
23915
+ timestamp: new Date().toISOString()
23916
+ });
23917
+ }
23918
+ catch (error) {
23919
+ // Log error but don't throw to avoid breaking the event system
23920
+ // eslint-disable-next-line no-console
23921
+ console.error('[Mock Org Chart Event] Error generating chart:', {
23922
+ triggeredBy: entityName,
23923
+ error: error instanceof Error ? error.message : String(error),
23924
+ timestamp: new Date().toISOString()
23925
+ });
23926
+ }
23927
+ },
23928
+ };
23929
+ //#endregion
23930
+
23100
23931
  class AXCOrganizationManagementMockModule {
23101
23932
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.8", ngImport: i0, type: AXCOrganizationManagementMockModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
23102
23933
  static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.1.8", ngImport: i0, type: AXCOrganizationManagementMockModule }); }
@@ -23130,9 +23961,14 @@ class AXCOrganizationManagementMockModule {
23130
23961
  useClass: AXMTeamDataSeeder,
23131
23962
  multi: true,
23132
23963
  },
23964
+ {
23965
+ provide: AXP_DISTRIBUTED_EVENT_LISTENER_PROVIDER,
23966
+ useValue: AXCMockOrgChartEventListener,
23967
+ multi: true,
23968
+ },
23133
23969
  // Commands
23134
23970
  provideCommandSetups([
23135
- { key: 'organization.chart.generate', command: () => AXMOrgChartGenerateCommand },
23971
+ { key: 'OrganizationManagement.OrgChart:Generate', command: () => AXMOrgChartGenerateCommand },
23136
23972
  ]),
23137
23973
  ] }); }
23138
23974
  }
@@ -23172,9 +24008,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.8", ngImpor
23172
24008
  useClass: AXMTeamDataSeeder,
23173
24009
  multi: true,
23174
24010
  },
24011
+ {
24012
+ provide: AXP_DISTRIBUTED_EVENT_LISTENER_PROVIDER,
24013
+ useValue: AXCMockOrgChartEventListener,
24014
+ multi: true,
24015
+ },
23175
24016
  // Commands
23176
24017
  provideCommandSetups([
23177
- { key: 'organization.chart.generate', command: () => AXMOrgChartGenerateCommand },
24018
+ { key: 'OrganizationManagement.OrgChart:Generate', command: () => AXMOrgChartGenerateCommand },
23178
24019
  ]),
23179
24020
  ],
23180
24021
  }]
@@ -23455,7 +24296,12 @@ const POSITION_ASSIGNMENTS_MOCK = (() => {
23455
24296
  if (assignedEmployeeIds.has(candidate.id)) {
23456
24297
  return; // skip creating another active primary assignment for the same employee
23457
24298
  }
23458
- const position = managerPositions.length ? pick(managerPositions) : pick(POSITIONS_MOCK);
24299
+ // Prefer a position that is listed for this business unit if available
24300
+ const buPositions = bu.positionIds ?? [];
24301
+ const candidatePositions = (buPositions.length
24302
+ ? POSITIONS_MOCK.filter(p => buPositions.includes(p.id))
24303
+ : managerPositions.length ? managerPositions : POSITIONS_MOCK);
24304
+ const position = pick(candidatePositions);
23459
24305
  rows.push({
23460
24306
  id: uuid$c(),
23461
24307
  employeeId: candidate.id,
@@ -28548,6 +29394,56 @@ class AXCDeviceSessionService extends AXMDeviceSessionsServiceImpl {
28548
29394
  }
28549
29395
  }
28550
29396
 
29397
+ /**
29398
+ * Mock policies for seeding into the Mock (IndexedDB) backend.
29399
+ * This policy enforces readonly on entire records when control.isSystem === true.
29400
+ * Note: The policy record itself is marked as system via control.isSystem = true.
29401
+ */
29402
+ const mockPolicyDefinitions = [
29403
+ {
29404
+ id: AXPDataGenerator.uuid(),
29405
+ control: { isSystem: true },
29406
+ name: 'system-record-readonly',
29407
+ title: 'System Records Readonly',
29408
+ description: 'Make whole record readonly when control.isSystem is true.',
29409
+ permission: 'policy.system.readonly',
29410
+ scope: 'system',
29411
+ resource: {
29412
+ type: 'entity',
29413
+ target: '*',
29414
+ },
29415
+ rules: [
29416
+ {
29417
+ // Evaluated in middleware using AXPExpressionEvaluatorService
29418
+ // Available scope: context.{ op, entity, id, data, existing, result, eval }
29419
+ // Use context.eval to access data fields
29420
+ conditions: '{{ context.eval("control.isSystem") == true }}',
29421
+ effects: [
29422
+ // Apply readonly to the entire record (blocks write fields)
29423
+ { effect: 'readonly', target: '*' },
29424
+ // Block delete/update entirely for system records
29425
+ { effect: 'immutable', target: '*' },
29426
+ ],
29427
+ },
29428
+ ],
29429
+ },
29430
+ ];
29431
+
29432
+ class AXPSecurityManagementPolicyDataSeeder {
29433
+ constructor() {
29434
+ this.storageService = inject(AXPEntityStorageService);
29435
+ }
29436
+ async seed() {
29437
+ // Seed the predefined policies. The policy records themselves are marked as system.
29438
+ await this.storageService.initial(`${RootConfig.module.name}.${RootConfig.entities.policy.name}`, mockPolicyDefinitions);
29439
+ }
29440
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.8", ngImport: i0, type: AXPSecurityManagementPolicyDataSeeder, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
29441
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.1.8", ngImport: i0, type: AXPSecurityManagementPolicyDataSeeder }); }
29442
+ }
29443
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.8", ngImport: i0, type: AXPSecurityManagementPolicyDataSeeder, decorators: [{
29444
+ type: Injectable
29445
+ }] });
29446
+
28551
29447
  class AXCSecurityManagementMockModule {
28552
29448
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.8", ngImport: i0, type: AXCSecurityManagementMockModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
28553
29449
  static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.1.8", ngImport: i0, type: AXCSecurityManagementMockModule }); }
@@ -28567,6 +29463,11 @@ class AXCSecurityManagementMockModule {
28567
29463
  useClass: AXPSecurityManagementUserDataSeeder,
28568
29464
  multi: true,
28569
29465
  },
29466
+ {
29467
+ provide: AXP_DATA_SEEDER_TOKEN,
29468
+ useClass: AXPSecurityManagementPolicyDataSeeder,
29469
+ multi: true,
29470
+ },
28570
29471
  {
28571
29472
  provide: AXMDeviceSessionsService,
28572
29473
  useClass: AXCDeviceSessionService,
@@ -28595,6 +29496,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.8", ngImpor
28595
29496
  useClass: AXPSecurityManagementUserDataSeeder,
28596
29497
  multi: true,
28597
29498
  },
29499
+ {
29500
+ provide: AXP_DATA_SEEDER_TOKEN,
29501
+ useClass: AXPSecurityManagementPolicyDataSeeder,
29502
+ multi: true,
29503
+ },
28598
29504
  {
28599
29505
  provide: AXMDeviceSessionsService,
28600
29506
  useClass: AXCDeviceSessionService,
@@ -34058,7 +34964,13 @@ const auditLoggerMiddleware = {
34058
34964
  type: 'user',
34059
34965
  fullName: session.user?.title,
34060
34966
  }
34061
- }
34967
+ },
34968
+ /////
34969
+ isReadOnly: false,
34970
+ isHidden: false,
34971
+ isSystem: false,
34972
+ isImmutable: false,
34973
+ /////
34062
34974
  };
34063
34975
  }
34064
34976
  else if (ctx.op === 'update') {
@@ -34858,6 +35770,346 @@ const mergeDetailRelationMiddleware = {
34858
35770
  },
34859
35771
  };
34860
35772
 
35773
+ /**
35774
+ * resolve whether a policy matches current entity by wildcard (*) or exact name
35775
+ */
35776
+ function matchesEntity(target, entityName) {
35777
+ if (!target || target === '*')
35778
+ return true;
35779
+ return target === entityName;
35780
+ }
35781
+ /**
35782
+ * apply masking to a value using a simple standard mask
35783
+ */
35784
+ function maskValue(value) {
35785
+ if (value == null)
35786
+ return value;
35787
+ const str = String(value);
35788
+ if (str.length <= 4)
35789
+ return '****';
35790
+ return `${'*'.repeat(Math.max(0, str.length - 4))}${str.slice(-4)}`;
35791
+ }
35792
+ /**
35793
+ * remove fields from an object by dotted paths; supports single-level for now
35794
+ */
35795
+ function removeFields(obj, paths) {
35796
+ if (!obj || !paths?.length)
35797
+ return;
35798
+ // Helper: delete by dotted path (e.g., "a.b.c")
35799
+ const deleteByPath = (target, path) => {
35800
+ const parts = path.split('.');
35801
+ let cursor = target;
35802
+ for (let i = 0; i < parts.length - 1; i++) {
35803
+ const key = parts[i];
35804
+ if (cursor == null || typeof cursor !== 'object')
35805
+ return;
35806
+ cursor = cursor[key];
35807
+ }
35808
+ const lastKey = parts[parts.length - 1];
35809
+ if (cursor && typeof cursor === 'object' && Object.prototype.hasOwnProperty.call(cursor, lastKey)) {
35810
+ delete cursor[lastKey];
35811
+ }
35812
+ };
35813
+ // If wildcard present, remove all top-level fields
35814
+ if (paths.includes('*')) {
35815
+ for (const key of Object.keys(obj)) {
35816
+ delete obj[key];
35817
+ }
35818
+ }
35819
+ for (const p of paths) {
35820
+ if (!p || p === '*')
35821
+ continue;
35822
+ if (p.includes('.')) {
35823
+ deleteByPath(obj, p);
35824
+ }
35825
+ else if (Object.prototype.hasOwnProperty.call(obj, p)) {
35826
+ delete obj[p];
35827
+ }
35828
+ }
35829
+ }
35830
+ /**
35831
+ * set masked fields in object by dotted paths; supports single-level for now
35832
+ */
35833
+ function setMasked(obj, paths) {
35834
+ if (!obj || !paths?.length)
35835
+ return;
35836
+ // Helper: set mask by dotted path (e.g., "a.b.c")
35837
+ const maskByPath = (target, path) => {
35838
+ const parts = path.split('.');
35839
+ let cursor = target;
35840
+ for (let i = 0; i < parts.length - 1; i++) {
35841
+ const key = parts[i];
35842
+ if (cursor == null || typeof cursor !== 'object')
35843
+ return;
35844
+ cursor = cursor[key];
35845
+ }
35846
+ const lastKey = parts[parts.length - 1];
35847
+ if (cursor && typeof cursor === 'object' && Object.prototype.hasOwnProperty.call(cursor, lastKey)) {
35848
+ cursor[lastKey] = maskValue(cursor[lastKey]);
35849
+ }
35850
+ };
35851
+ // If wildcard present, mask all top-level primitive fields
35852
+ if (paths.includes('*')) {
35853
+ for (const key of Object.keys(obj)) {
35854
+ if (Object.prototype.hasOwnProperty.call(obj, key)) {
35855
+ const val = obj[key];
35856
+ if (val == null || typeof val !== 'object') {
35857
+ obj[key] = maskValue(val);
35858
+ }
35859
+ }
35860
+ }
35861
+ }
35862
+ for (const p of paths) {
35863
+ if (!p || p === '*')
35864
+ continue;
35865
+ if (p.includes('.')) {
35866
+ maskByPath(obj, p);
35867
+ }
35868
+ else if (Object.prototype.hasOwnProperty.call(obj, p)) {
35869
+ obj[p] = maskValue(obj[p]);
35870
+ }
35871
+ }
35872
+ }
35873
+ /**
35874
+ * collect effect targets from a list of rules filtered by effect name
35875
+ */
35876
+ function collectTargets(rules, effect) {
35877
+ return rules.filter(r => r.effect === effect).map(r => r.target).filter(Boolean);
35878
+ }
35879
+ /**
35880
+ * Evaluate a policy's rules against the provided scope
35881
+ */
35882
+ async function isRuleActive(conditions, evaluator, extraScope) {
35883
+ // Note: conditions is AXPExpression and may be a template string {{ ... }} or boolean
35884
+ const result = await evaluator.evaluate(conditions, extraScope);
35885
+ return Boolean(result);
35886
+ }
35887
+ const policyEnforceMiddleware = {
35888
+ target: { ops: ['create', 'update', 'delete', 'getOne', 'getAll', 'query'], order: 5 },
35889
+ execute: async (ctx, next) => {
35890
+ //try { console.warn('[policy] enter-middleware', ctx.op, ctx.entityName, ctx.id); } catch {}
35891
+ // Prevent recursion: skip enforcement when querying the Policy entity itself
35892
+ const policyEntityFullName = `${RootConfig.module.name}.${RootConfig.entities.policy.name}`;
35893
+ if (ctx.entityName === policyEntityFullName) {
35894
+ await next();
35895
+ return;
35896
+ }
35897
+ const policyService = inject(AXMPolicyService);
35898
+ const evaluator = inject(AXPExpressionEvaluatorService);
35899
+ const backend = inject(AXP_ENTITY_STORAGE_BACKEND);
35900
+ // Load all policies (could be cached later); filter by resource.type === 'entity' and target match
35901
+ let policies = [];
35902
+ try {
35903
+ const res = await policyService.query({ skip: 0, take: 1000 });
35904
+ policies = (res?.items ?? []);
35905
+ }
35906
+ catch {
35907
+ policies = [];
35908
+ }
35909
+ const applicable = policies.filter(p => p?.resource?.type === 'entity' && matchesEntity(p.resource?.target, ctx.entityName));
35910
+ if (applicable.length === 0) {
35911
+ await next();
35912
+ return;
35913
+ }
35914
+ // Build evaluation scope per operation
35915
+ const buildScope = (overrides) => {
35916
+ const existing = overrides?.existing;
35917
+ const result = overrides?.result ?? ctx.result;
35918
+ return {
35919
+ // Additional scopes are provided via providers (session, permission). Here we add op-specific context.
35920
+ context: {
35921
+ op: ctx.op,
35922
+ entity: ctx.entityName,
35923
+ id: ctx.id,
35924
+ data: ctx.data,
35925
+ existing: existing,
35926
+ result: result,
35927
+ // Add eval function to access data fields
35928
+ eval: (key) => {
35929
+ // Helper function to get nested property
35930
+ const getNestedProperty = (obj, path) => {
35931
+ if (!obj || !path)
35932
+ return undefined;
35933
+ const parts = path.split('.');
35934
+ let current = obj;
35935
+ for (const part of parts) {
35936
+ if (current && typeof current === 'object' && part in current) {
35937
+ current = current[part];
35938
+ }
35939
+ else {
35940
+ return undefined;
35941
+ }
35942
+ }
35943
+ return current;
35944
+ };
35945
+ // For delete operations, use existing data
35946
+ if (ctx.op === 'delete' && existing) {
35947
+ return getNestedProperty(existing, key);
35948
+ }
35949
+ // For create/update operations, use data
35950
+ if (ctx.data) {
35951
+ const dataValue = getNestedProperty(ctx.data, key);
35952
+ if (dataValue !== undefined) {
35953
+ return dataValue;
35954
+ }
35955
+ }
35956
+ // Fallback to existing for update operations
35957
+ if (existing) {
35958
+ return getNestedProperty(existing, key);
35959
+ }
35960
+ return undefined;
35961
+ }
35962
+ }
35963
+ };
35964
+ };
35965
+ // Helper: evaluate active rules for a given scope
35966
+ const evaluateActiveRules = async (scope) => {
35967
+ const list = [];
35968
+ for (const pol of applicable) {
35969
+ for (const rule of pol.rules ?? []) {
35970
+ const active = await isRuleActive(rule.conditions, evaluator, scope);
35971
+ if (active) {
35972
+ for (const eff of rule.effects ?? []) {
35973
+ list.push(eff);
35974
+ }
35975
+ }
35976
+ }
35977
+ }
35978
+ return list;
35979
+ };
35980
+ // Resolve effects per operation following simple standard semantics
35981
+ const deriveTargets = (rules) => ({
35982
+ readonlyTargets: collectTargets(rules, 'readonly'),
35983
+ immutableTargets: collectTargets(rules, 'immutable'),
35984
+ hiddenTargets: collectTargets(rules, 'hidden'),
35985
+ maskedTargets: collectTargets(rules, 'masked'),
35986
+ editableTargets: collectTargets(rules, 'editable'),
35987
+ });
35988
+ let activeRules = [];
35989
+ let readonlyTargets = [];
35990
+ let immutableTargets = [];
35991
+ let hiddenTargets = [];
35992
+ let maskedTargets = [];
35993
+ let editableTargets = [];
35994
+ // Conflict resolution (standard): editable overrides readonly (not immutable), hidden beats everything in output, immutable strongest on write
35995
+ const isEditable = (t) => editableTargets.includes(t) || editableTargets.includes('*');
35996
+ // WRITE PATH
35997
+ if (ctx.op === 'create' || ctx.op === 'update') {
35998
+ // For update, load existing to allow conditions to reference current record state
35999
+ let existing;
36000
+ if (ctx.op === 'update' && ctx.id && backend?.getOne) {
36001
+ try {
36002
+ existing = await backend.getOne(ctx.entityName, ctx.id);
36003
+ }
36004
+ catch {
36005
+ existing = undefined;
36006
+ }
36007
+ }
36008
+ // Re-evaluate rules with existing in scope
36009
+ activeRules = await evaluateActiveRules(buildScope({ existing }));
36010
+ ({ readonlyTargets, immutableTargets, hiddenTargets, maskedTargets, editableTargets } = deriveTargets(activeRules));
36011
+ if (ctx.data && typeof ctx.data === 'object') {
36012
+ // Check if entire object is immutable
36013
+ const immutableAll = immutableTargets.includes('*');
36014
+ if (immutableAll) {
36015
+ throw new Error('Update forbidden by policy: Record is marked as system and cannot be modified');
36016
+ }
36017
+ // For specific immutable/readonly fields, remove them from payload
36018
+ const forbiddenPaths = [];
36019
+ const addForbiddenFromTargets = (targets) => {
36020
+ for (const t of targets) {
36021
+ if (t === '*') {
36022
+ // This case is handled above
36023
+ continue;
36024
+ }
36025
+ else if (!isEditable(t)) {
36026
+ forbiddenPaths.push(t);
36027
+ }
36028
+ }
36029
+ };
36030
+ // readonly and immutable (excluding '*')
36031
+ addForbiddenFromTargets(readonlyTargets);
36032
+ addForbiddenFromTargets(immutableTargets);
36033
+ // Remove forbidden fields from payload
36034
+ const uniqueForbidden = Array.from(new Set(forbiddenPaths));
36035
+ if (uniqueForbidden.length > 0) {
36036
+ removeFields(ctx.data, uniqueForbidden);
36037
+ // Log which fields were removed
36038
+ try {
36039
+ console.warn('[policy] fields-removed', {
36040
+ entity: ctx.entityName,
36041
+ id: ctx.id,
36042
+ removedFields: uniqueForbidden
36043
+ });
36044
+ }
36045
+ catch { }
36046
+ }
36047
+ }
36048
+ }
36049
+ // DELETE PATH
36050
+ if (ctx.op === 'delete') {
36051
+ // Load existing to evaluate conditions based on record's current state
36052
+ let existing;
36053
+ if (ctx.id && backend?.getOne) {
36054
+ try {
36055
+ existing = await backend.getOne(ctx.entityName, ctx.id);
36056
+ }
36057
+ catch {
36058
+ existing = undefined;
36059
+ }
36060
+ }
36061
+ activeRules = await evaluateActiveRules(buildScope({ existing }));
36062
+ ({ readonlyTargets, immutableTargets, hiddenTargets, maskedTargets, editableTargets } = deriveTargets(activeRules));
36063
+ // If immutable '*' exists, block delete by short-circuiting
36064
+ const immutableAll = immutableTargets.includes('*');
36065
+ // Temporary debug logs for troubleshooting policy delete enforcement
36066
+ try {
36067
+ // eslint-disable-next-line no-console
36068
+ console.warn('[policy] delete-check', {
36069
+ entity: ctx.entityName,
36070
+ id: ctx.id,
36071
+ existingIsSystem: existing?.control?.isSystem,
36072
+ immutableTargets,
36073
+ readonlyTargets,
36074
+ editableTargets,
36075
+ immutableAll,
36076
+ });
36077
+ }
36078
+ catch { }
36079
+ if (immutableAll) {
36080
+ // Block delete and throw error to notify frontend
36081
+ try {
36082
+ console.warn('[policy] delete-blocked', { entity: ctx.entityName, id: ctx.id });
36083
+ }
36084
+ catch { }
36085
+ throw new Error('Delete forbidden by policy: Record is marked as system and cannot be deleted');
36086
+ }
36087
+ }
36088
+ await next();
36089
+ //try { console.warn('[policy] after-next', ctx.op, ctx.entityName); } catch { }
36090
+ // READ PATH (after next to transform response)
36091
+ if (ctx.op === 'getOne' || ctx.op === 'getAll' || ctx.op === 'query') {
36092
+ // Re-evaluate rules with result in scope (read conditions can depend on returned data)
36093
+ activeRules = await evaluateActiveRules(buildScope({ result: ctx.result }));
36094
+ ({ readonlyTargets, immutableTargets, hiddenTargets, maskedTargets, editableTargets } = deriveTargets(activeRules));
36095
+ const applyReadTransforms = (obj) => {
36096
+ if (!obj || typeof obj !== 'object')
36097
+ return;
36098
+ // hidden ⇒ remove field
36099
+ removeFields(obj, hiddenTargets);
36100
+ // masked ⇒ mask value
36101
+ setMasked(obj, maskedTargets);
36102
+ };
36103
+ if (Array.isArray(ctx.result)) {
36104
+ ctx.result.forEach(applyReadTransforms);
36105
+ }
36106
+ else {
36107
+ applyReadTransforms(ctx.result);
36108
+ }
36109
+ }
36110
+ },
36111
+ };
36112
+
34861
36113
  class AXCMiddlewaresModule {
34862
36114
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.8", ngImport: i0, type: AXCMiddlewaresModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
34863
36115
  static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.1.8", ngImport: i0, type: AXCMiddlewaresModule }); }
@@ -34867,6 +36119,7 @@ class AXCMiddlewaresModule {
34867
36119
  // Provide the concrete backend and middlewares
34868
36120
  { provide: AXP_ENTITY_STORAGE_BACKEND, useClass: AXCDexieEntityStorageService },
34869
36121
  // Middlewares
36122
+ { provide: AXP_ENTITY_STORAGE_MIDDLEWARE, multi: true, useValue: policyEnforceMiddleware },
34870
36123
  { provide: AXP_ENTITY_STORAGE_MIDDLEWARE, multi: true, useValue: eventDispatchMiddleware },
34871
36124
  { provide: AXP_ENTITY_STORAGE_MIDDLEWARE, multi: true, useValue: mergeDetailRelationMiddleware },
34872
36125
  { provide: AXP_ENTITY_STORAGE_MIDDLEWARE, multi: true, useValue: identifierCommitMiddleware },
@@ -34888,6 +36141,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.8", ngImpor
34888
36141
  // Provide the concrete backend and middlewares
34889
36142
  { provide: AXP_ENTITY_STORAGE_BACKEND, useClass: AXCDexieEntityStorageService },
34890
36143
  // Middlewares
36144
+ { provide: AXP_ENTITY_STORAGE_MIDDLEWARE, multi: true, useValue: policyEnforceMiddleware },
34891
36145
  { provide: AXP_ENTITY_STORAGE_MIDDLEWARE, multi: true, useValue: eventDispatchMiddleware },
34892
36146
  { provide: AXP_ENTITY_STORAGE_MIDDLEWARE, multi: true, useValue: mergeDetailRelationMiddleware },
34893
36147
  { provide: AXP_ENTITY_STORAGE_MIDDLEWARE, multi: true, useValue: identifierCommitMiddleware },
@@ -35950,5 +37204,5 @@ const AXCMockEntityLogListener = {
35950
37204
  * Generated bundle index. Do not edit.
35951
37205
  */
35952
37206
 
35953
- export { APPLICATIONS, APPLICATIONS_MODULES, AXCAppTermDataSeeder, AXCAppVersionDataSeeder, AXCApplicationManagementMockModule, AXCApplicationTemplateDataSeeder, AXCAuthMockModule, AXCCalendarDataSeeder, AXCCalendarEventDataSeeder, AXCCalendarManagementMockModule, AXCCommonMockModule, AXCContactManagementMockModule, AXCContentManagementMockModule, AXCConversationMockModule, AXCCustomerManagementMockModule, AXCDashboardManagementMockModule, AXCDataManagementMockModule, AXCDexieEntityStorageService, AXCDocumentManagementMockModule, AXCFileStorageService, AXCFormTemplateManagementMockModule, AXCGlobalVariablesDataSeeder, AXCGoogleStrategyMock, AXCHelpDeskMockModule, AXCHumanCapitalManagementMockModule, AXCIdentifierManagementMockModule, AXCJsaSeeder, AXCLocaleManagementMockModule, AXCLocationManagementMockModule, AXCLockService, AXCLogManagementMockModule, AXCMeetingManagementMockModule, AXCMetaDataDefinitionDataSeeder, AXCMiddlewaresModule, AXCMockEntityLogListener, AXCMockModule, AXCNotificationManagementMockModule, AXCOrganizationManagementMockModule, AXCPartyManagementMockModule, AXCPlatformManagementMockModule, AXCProjectManagementMockModule, AXCReportManagementMockModule, AXCSchedulerJobDataSeeder, AXCSchedulerJobManagementMockModule, AXCSecurityManagementMockModule, AXCTaskManagementMockModule, AXCTextTemplateCategoryDataSeeder, AXCTextTemplateDataSeeder, AXCTextTemplateManagementMockModule, AXCTrainingManagementMockModule, AXCUserPassStrategyMock, AXCWorkflowManagementMockModule, AXMAiResponderService, AXMBusinessUnitDataSeeder, AXMCalendarEventTypeSeeder, AXMEmployeeDataSeeder, AXMEmployeeSkillDataSeeder, AXMEmployeeSkillsCategoryProvider, AXMEmployeeSkillsReportDefinitionProvider, AXMEmploymentTypeDataSeeder, AXMFormDataSourcesProvider, AXMIndustryDataSeeder, AXMLeaveRequestDataSeeder, AXMMeetingDataSeeder, AXMMeetingFilesDataSeeder, AXMMeetingParticipantDataSeeder, AXMMeetingRoleTypeDataSeeder, AXMMeetingSessionDataSeeder, AXMMeetingTypeDataSeeder, AXMMeetingTypeFileTemplateDataSeeder, AXMPositionAssignmentDataSeeder, AXMPositionDataSeeder, AXMReportCategoryDataSeeder, AXMReportDefinitionDataSeeder, AXMReportExecuteCommand, AXMReportMockDataService, AXMResponsibilityDataSeeder, AXMRoleDataSeeder, AXMSkillDataSeeder, AXMSkillLevelDataSeeder, AXMTeamDataSeeder, AXM_EMPLOYEE_SKILLS_CATEGORY_PROVIDER, AXM_EMPLOYEE_SKILLS_DEFINITION_PROVIDER, AXPDashboardDataSeeder, AXPIdentifierDB, AXPMessageDataSeeder, AXPMockChecksumProvider, AXPMockClockProvider, AXPMockIdentifierService, AXPMockLookupProvider, AXPMockPolicyProvider, AXPMockSequenceProvider, AXPRoomDataSeeder, AXPSecurityManagementRoleDataSeeder, AXPSecurityManagementUserDataSeeder, AXPTaskBoardPlatformManagementTaskProvider, AXPTaskBoardProjectManagementTaskProvider, AXQEmployeeSkillsLevelPercentagesQuery, AXQEmployeeSkillsLevelsQuery, AXQEmployeeSkillsListQuery, AXQEmployeeSkillsSkillPercentagesQuery, AXQEmployeeSkillsStatsQuery, AXQEmployeeSkillsTrendQuery, BUSINESS_UNITS_MOCK, DASHBOARDS, EDITIONS, EMPLOYEES_MOCK, EMPLOYEE_SKILLS_MOCK, EMPLOYMENT_TYPES_MOCK, ENTITIES, FEATURES, GLOBAL_VARIABLES, LEAVE_REQUESTS_MOCK, MODULES, PERMISSIONS, POSITIONS_CATEGORY_MOCK, POSITIONS_MOCK, POSITION_ASSIGNMENTS_MOCK, PROPERTIES, RESPONSIBILITIES_CATEGORY_MOCK, RESPONSIBILITIES_MOCK, ROLES_CATEGORY_MOCK, ROLES_MOCK, SKILLS_CATEGORY_MOCK, SKILLS_MOCK, SKILL_LEVELS_MOCK, TASKS, TASK_STATUSES, TASK_TEMPLATES, TASK_TYPES, TEAMS_MOCK, TEXT_TEMPLATES, TEXT_TEMPLATE_CATEGORY, applications, auditLoggerMiddleware, calendarEventMock, calendarEventTypeMockData, calendarMock, createAndSaveDashboardForUser, createDashboardForUser, createFileCastMiddleware, findContactMethod, findEmployeeById, findPartyById, generateUserDashboard, identifierCommitMiddleware, meetingFilesMock, meetingIds, meetingMock, meetingParticipantMock, meetingRoleTypeMock, meetingSessionMock, meetingTimeSlotMock, meetingTypeFileTemplateMock, meetingTypeMock, mergeDetailRelationMiddleware, mockRoleDefinitions, mockUsers, participantIds, tenantsMock };
37207
+ export { APPLICATIONS, APPLICATIONS_MODULES, AXCAppTermDataSeeder, AXCAppVersionDataSeeder, AXCApplicationManagementMockModule, AXCApplicationTemplateDataSeeder, AXCAuthMockModule, AXCCalendarDataSeeder, AXCCalendarEventDataSeeder, AXCCalendarManagementMockModule, AXCCommonMockModule, AXCContactManagementMockModule, AXCContentManagementMockModule, AXCConversationMockModule, AXCCustomerManagementMockModule, AXCDashboardManagementMockModule, AXCDataManagementMockModule, AXCDexieEntityStorageService, AXCDocumentManagementMockModule, AXCFileStorageService, AXCFormTemplateManagementMockModule, AXCGlobalVariablesDataSeeder, AXCGoogleStrategyMock, AXCHelpDeskMockModule, AXCHumanCapitalManagementMockModule, AXCIdentifierManagementMockModule, AXCJsaSeeder, AXCLocaleManagementMockModule, AXCLocationManagementMockModule, AXCLockService, AXCLogManagementMockModule, AXCMeetingManagementMockModule, AXCMetaDataDefinitionDataSeeder, AXCMiddlewaresModule, AXCMockEntityLogListener, AXCMockModule, AXCNotificationManagementMockModule, AXCOrganizationManagementMockModule, AXCPartyManagementMockModule, AXCPlatformManagementMockModule, AXCProjectManagementMockModule, AXCQueryCategoryMetadataInheritanceQuery, AXCReportManagementMockModule, AXCSchedulerJobDataSeeder, AXCSchedulerJobManagementMockModule, AXCSecurityManagementMockModule, AXCTaskManagementMockModule, AXCTextTemplateCategoryDataSeeder, AXCTextTemplateDataSeeder, AXCTextTemplateManagementMockModule, AXCTrainingManagementMockModule, AXCUserPassStrategyMock, AXCWorkflowManagementMockModule, AXMAiResponderService, AXMBusinessUnitDataSeeder, AXMCalendarEventTypeSeeder, AXMEmployeeDataSeeder, AXMEmployeeSkillDataSeeder, AXMEmployeeSkillsCategoryProvider, AXMEmployeeSkillsReportDefinitionProvider, AXMEmploymentTypeDataSeeder, AXMFormDataSourcesProvider, AXMIndustryDataSeeder, AXMLeaveRequestDataSeeder, AXMMeetingDataSeeder, AXMMeetingFilesDataSeeder, AXMMeetingParticipantDataSeeder, AXMMeetingRoleTypeDataSeeder, AXMMeetingSessionDataSeeder, AXMMeetingTypeDataSeeder, AXMMeetingTypeFileTemplateDataSeeder, AXMPositionAssignmentDataSeeder, AXMPositionDataSeeder, AXMReportCategoryDataSeeder, AXMReportDefinitionDataSeeder, AXMReportExecuteCommand, AXMReportMockDataService, AXMResponsibilityDataSeeder, AXMRoleDataSeeder, AXMSkillDataSeeder, AXMSkillLevelDataSeeder, AXMTeamDataSeeder, AXM_EMPLOYEE_SKILLS_CATEGORY_PROVIDER, AXM_EMPLOYEE_SKILLS_DEFINITION_PROVIDER, AXPDashboardDataSeeder, AXPIdentifierDB, AXPMessageDataSeeder, AXPMockChecksumProvider, AXPMockClockProvider, AXPMockIdentifierService, AXPMockLookupProvider, AXPMockPolicyProvider, AXPMockSequenceProvider, AXPRoomDataSeeder, AXPSecurityManagementRoleDataSeeder, AXPSecurityManagementUserDataSeeder, AXPTaskBoardPlatformManagementTaskProvider, AXPTaskBoardProjectManagementTaskProvider, AXQEmployeeSkillsLevelPercentagesQuery, AXQEmployeeSkillsLevelsQuery, AXQEmployeeSkillsListQuery, AXQEmployeeSkillsSkillPercentagesQuery, AXQEmployeeSkillsStatsQuery, AXQEmployeeSkillsTrendQuery, BUSINESS_UNITS_MOCK, DASHBOARDS, EDITIONS, EMPLOYEES_MOCK, EMPLOYEE_SKILLS_MOCK, EMPLOYMENT_TYPES_MOCK, ENTITIES, FEATURES, GLOBAL_VARIABLES, LEAVE_REQUESTS_MOCK, MODULES, PERMISSIONS, POSITIONS_CATEGORY_MOCK, POSITIONS_MOCK, POSITION_ASSIGNMENTS_MOCK, PROPERTIES, RESPONSIBILITIES_CATEGORY_MOCK, RESPONSIBILITIES_MOCK, ROLES_CATEGORY_MOCK, ROLES_MOCK, SKILLS_CATEGORY_MOCK, SKILLS_MOCK, SKILL_LEVELS_MOCK, TASKS, TASK_STATUSES, TASK_TEMPLATES, TASK_TYPES, TEAMS_MOCK, TEXT_TEMPLATES, TEXT_TEMPLATE_CATEGORY, applications, auditLoggerMiddleware, calendarEventMock, calendarEventTypeMockData, calendarMock, createAndSaveDashboardForUser, createDashboardForUser, createFileCastMiddleware, findContactMethod, findEmployeeById, findPartyById, generateUserDashboard, identifierCommitMiddleware, meetingFilesMock, meetingIds, meetingMock, meetingParticipantMock, meetingRoleTypeMock, meetingSessionMock, meetingTimeSlotMock, meetingTypeFileTemplateMock, meetingTypeMock, mergeDetailRelationMiddleware, mockRoleDefinitions, mockUsers, participantIds, tenantsMock };
35954
37208
  //# sourceMappingURL=acorex-connectivity-mock.mjs.map