@acorex/connectivity 20.3.0-next.7 → 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, AXP_DISTRIBUTED_EVENT_LISTENER_PROVIDER, objectKeyValueTransforms, AXPSystemActionType, 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,7 +21,8 @@ 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';
24
+ import { RootConfig as RootConfig$5, AXMMetaDataDefinitionService } from '@acorex/modules/data-management';
25
+ import { get, set } from 'lodash-es';
25
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';
@@ -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,6 +22209,7 @@ 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;
@@ -21396,35 +22341,39 @@ class AXMOrgChartGenerateCommand {
21396
22341
  }
21397
22342
  return nodes;
21398
22343
  };
21399
- // Place BusinessUnits under Country/State/City (virtual), then attach position nodes
21400
- for (const bu of businessUnits) {
21401
- const type = buTypeById.get(bu.typeId);
21402
- const typeCode = type?.code ?? '';
21403
- const buNodeType = typeCode === 'division' ? AXMOrgChartNodeType.Division :
21404
- typeCode === 'department' ? AXMOrgChartNodeType.Department :
21405
- AXMOrgChartNodeType.Branch;
21406
- const countryNode = ensureCountry(bu.country);
21407
- const stateNode = ensureState(countryNode, bu.state);
21408
- const cityNode = ensureCity(stateNode, bu.city);
21409
- const buAssignments = assignmentsByBU.get(String(bu.id)) || [];
21410
- const children = includeEmployees ? buildPositionNodes(buAssignments) : [];
21411
- const buNode = {
21412
- id: AXPDataGenerator.uuid(),
21413
- title: bu.title,
21414
- description: bu.description,
21415
- type: buNodeType,
21416
- icon: typeCode === 'division' ? 'fa-sitemap' : typeCode === 'department' ? 'fa-building-user' : 'fa-network-wired',
21417
- entity: { id: bu.id, source: RootConfig$c.entities.businessUnit.source },
21418
- children,
21419
- };
21420
- if (cityNode) {
21421
- cityNode.children = cityNode.children || [];
21422
- cityNode.children.push(buNode);
21423
- }
21424
- else {
21425
- root.children.push(buNode);
21426
- }
21427
- }
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);
21428
22377
  // Persist as a new version
21429
22378
  const version = this.generateVersion();
21430
22379
  const id = await this.storage.insertOne(RootConfig$c.entities.chart.source, {
@@ -21842,177 +22791,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.8", ngImpor
21842
22791
  type: Injectable
21843
22792
  }] });
21844
22793
 
21845
- function generatePositionsCategory() {
21846
- const categories = [];
21847
- const roots = ['Engineering Positions', 'Technical Leadership', 'Product Positions', 'Operations', 'Business Functions', 'Executive Leadership'];
21848
- const ids = new Map();
21849
- roots.forEach((title) => {
21850
- const id = AXPDataGenerator.uuid();
21851
- ids.set(title, id);
21852
- const descriptionMap = {
21853
- 'Engineering Positions': 'All engineering role families',
21854
- 'Technical Leadership': 'Leadership tracks within technology',
21855
- 'Product Positions': 'Roles related to product management & design',
21856
- Operations: 'IT, Support and Security positions',
21857
- 'Business Functions': 'Sales, Marketing and BD roles',
21858
- 'Executive Leadership': 'C-level and executive roles',
21859
- };
21860
- categories.push({ id, title, description: descriptionMap[title] ?? '', childCount: 0 });
21861
- });
21862
- const children = [
21863
- { parent: 'Engineering Positions', children: ['Frontend Engineering', 'Backend Engineering', 'Mobile Engineering', 'Quality Engineering'] },
21864
- { parent: 'Technical Leadership', children: ['Engineering Management', 'Technical Architecture', 'DevOps Leadership'] },
21865
- { parent: 'Product Positions', children: ['Product Management', 'UX/UI Design', 'Product Analytics'] },
21866
- { parent: 'Operations', children: ['IT Operations', 'Technical Support', 'Security Operations', 'Health, Safety & Environment'] },
21867
- { parent: 'Business Functions', children: ['Sales', 'Marketing', 'Business Development'] },
21868
- { parent: 'Executive Leadership', children: ['C-Suite', 'Board Members', 'Corporate Strategy'] },
21869
- ];
21870
- children.forEach(({ parent, children }) => {
21871
- const parentId = ids.get(parent);
21872
- if (!parentId)
21873
- return;
21874
- children.forEach((title) => {
21875
- const id = AXPDataGenerator.uuid();
21876
- ids.set(title, id);
21877
- const descriptionMap = {
21878
- 'Frontend Engineering': 'Client-side engineering track',
21879
- 'Backend Engineering': 'Server-side engineering track',
21880
- 'Mobile Engineering': 'Mobile application engineering track',
21881
- 'Quality Engineering': 'Testing and QA track',
21882
- 'Engineering Management': 'People and delivery leadership track',
21883
- 'Technical Architecture': 'Architecture and system design track',
21884
- 'DevOps Leadership': 'Reliability and platform engineering track',
21885
- 'Product Management': 'Product strategy and delivery track',
21886
- 'UX/UI Design': 'User experience and interface design track',
21887
- 'Product Analytics': 'Data-driven product insights track',
21888
- 'IT Operations': 'IT and infrastructure operations track',
21889
- 'Technical Support': 'Customer and internal support track',
21890
- 'Security Operations': 'Cybersecurity and defense track',
21891
- Sales: 'Sales roles and career track',
21892
- Marketing: 'Marketing roles and career track',
21893
- 'Business Development': 'Partnerships and growth roles',
21894
- 'C-Suite': 'Executive leadership team',
21895
- 'Board Members': 'Corporate board members',
21896
- 'Corporate Strategy': 'Corporate planning and strategy',
21897
- };
21898
- categories.push({ id, title, description: descriptionMap[title] ?? '', parentId, childCount: 0 });
21899
- });
21900
- const parentObj = categories.find((c) => c.id === parentId);
21901
- if (parentObj)
21902
- parentObj.childCount = children.length;
21903
- });
21904
- return categories;
21905
- }
21906
- const POSITIONS_CATEGORY_MOCK = generatePositionsCategory();
21907
- function generatePositions() {
21908
- const positions = [];
21909
- const categories = POSITIONS_CATEGORY_MOCK;
21910
- const childPositions = [
21911
- { parent: 'Frontend Engineering', children: ['Junior Frontend Engineer', 'Frontend Engineer'] },
21912
- { parent: 'Backend Engineering', children: ['Junior Backend Engineer', 'Backend Engineer'] },
21913
- { parent: 'Mobile Engineering', children: ['Junior Mobile Developer', 'Mobile Developer', 'Senior Mobile Developer', 'Mobile Architect'] },
21914
- { parent: 'Quality Engineering', children: ['QA Analyst', 'QA Engineer', 'Senior QA Engineer', 'QA Manager'] },
21915
- { parent: 'Engineering Management', children: ['Engineering Team Lead', 'Engineering Manager', 'Director of Engineering', 'VP of Engineering'] },
21916
- { parent: 'Product Management', children: ['Associate Product Manager', 'Product Manager', 'Senior Product Manager', 'Director of Product'] },
21917
- { parent: 'UX/UI Design', children: ['UX Designer', 'UI Designer', 'Senior UX Designer', 'UX Design Manager'] },
21918
- { parent: 'IT Operations', children: ['IT Support Specialist', 'Systems Administrator'] },
21919
- { parent: 'Sales', children: ['Sales Associate', 'Account Executive', 'Sales Manager', 'VP of Sales'] },
21920
- { parent: 'C-Suite', children: ['CTO', 'CEO', 'CFO', 'COO'] },
21921
- { parent: 'DevOps Leadership', children: ['DevOps Engineer', 'Senior DevOps Engineer', 'DevOps Manager', 'Director of DevOps'] },
21922
- { parent: 'Health, Safety & Environment', children: ['HSE Officer', 'Safety Officer', 'Environmental Specialist', 'HSE Manager'] },
21923
- { parent: 'Engineering Management', children: ['Production Supervisor'] },
21924
- { parent: 'Operations', children: ['Maintenance Technician', 'Maintenance Engineer', 'Quality Inspector', 'Quality Engineer', 'Procurement Specialist', 'Warehouse Associate', 'Warehouse Supervisor', 'Production Planner'] },
21925
- ];
21926
- // Position descriptions mapping
21927
- const positionDescriptions = {
21928
- // Frontend Engineering
21929
- '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.',
21930
- 'Frontend Engineer': 'Mid-level frontend developer who builds responsive web applications, implements UI/UX designs, and collaborates with design and backend teams.',
21931
- 'Senior Frontend Engineer': 'Experienced frontend developer who leads technical decisions, mentors junior developers, and architects scalable frontend solutions.',
21932
- 'Frontend Architect': 'Senior technical leader responsible for frontend architecture decisions, performance optimization, and setting technical standards for the frontend team.',
21933
- // Backend Engineering
21934
- 'Junior Backend Engineer': 'Entry-level backend developer focused on building server-side logic, APIs, and database interactions. Learns backend technologies and best practices.',
21935
- 'Backend Engineer': 'Mid-level backend developer who designs and implements server-side applications, APIs, and database schemas.',
21936
- 'Senior Backend Engineer': 'Experienced backend developer who leads technical decisions, optimizes system performance, and mentors junior developers.',
21937
- 'Backend Architect': 'Senior technical leader responsible for backend architecture, system design, and technical strategy for server-side systems.',
21938
- // Mobile Engineering
21939
- 'Junior Mobile Developer': 'Entry-level mobile developer focused on building native or cross-platform mobile applications. Learns mobile development frameworks and best practices.',
21940
- 'Mobile Developer': 'Mid-level mobile developer who creates mobile apps, implements features, and ensures app performance and user experience.',
21941
- 'Senior Mobile Developer': 'Experienced mobile developer who leads mobile development initiatives, optimizes app performance, and mentors junior developers.',
21942
- 'Mobile Architect': 'Senior technical leader responsible for mobile architecture decisions, platform strategy, and technical standards for mobile development.',
21943
- // Quality Engineering
21944
- 'QA Analyst': 'Entry-level quality assurance professional who executes test plans, reports bugs, and ensures software quality through systematic testing.',
21945
- 'QA Engineer': 'Mid-level QA professional who designs test strategies, automates testing processes, and collaborates with development teams.',
21946
- 'Senior QA Engineer': 'Experienced QA professional who leads testing initiatives, implements quality processes, and mentors junior QA team members.',
21947
- 'QA Manager': 'Senior leader responsible for managing the QA team, establishing quality standards, and ensuring overall software quality.',
21948
- // Engineering Management
21949
- 'Engineering Team Lead': 'Technical leader who manages a small engineering team, provides technical guidance, and ensures project delivery.',
21950
- 'Engineering Manager': 'People manager responsible for team development, project planning, and technical decision-making for engineering teams.',
21951
- 'Director of Engineering': 'Senior leader who manages multiple engineering teams, sets technical strategy, and drives engineering excellence.',
21952
- 'VP of Engineering': 'Executive leader responsible for overall engineering strategy, team growth, and technical direction across the organization.',
21953
- // Product Management
21954
- 'Associate Product Manager': 'Entry-level product professional who supports product development, conducts research, and assists with product strategy.',
21955
- 'Product Manager': 'Mid-level product professional who defines product vision, prioritizes features, and collaborates with cross-functional teams.',
21956
- 'Senior Product Manager': 'Experienced product professional who leads product strategy, mentors junior PMs, and drives product success.',
21957
- 'Director of Product': 'Senior leader responsible for product portfolio strategy, team leadership, and product vision across multiple products.',
21958
- // UX/UI Design
21959
- 'UX Designer': 'Design professional focused on user experience research, user flows, and creating intuitive user interfaces.',
21960
- 'UI Designer': 'Visual designer who creates user interface designs, design systems, and ensures visual consistency across products.',
21961
- 'Senior UX Designer': 'Experienced UX professional who leads design initiatives, mentors junior designers, and drives user experience strategy.',
21962
- 'UX Design Manager': 'Senior leader responsible for managing the design team, establishing design processes, and ensuring design quality.',
21963
- // IT Operations
21964
- 'IT Support Specialist': 'Entry-level IT professional who provides technical support, troubleshoots issues, and maintains IT systems.',
21965
- 'Systems Administrator': 'Mid-level IT professional who manages server infrastructure, implements security measures, and ensures system reliability.',
21966
- // Sales
21967
- 'Sales Associate': 'Entry-level sales professional who supports sales activities, qualifies leads, and assists with customer relationships.',
21968
- 'Account Executive': 'Mid-level sales professional who manages customer accounts, drives sales growth, and builds client relationships.',
21969
- 'Sales Manager': 'Senior sales professional who leads sales teams, develops sales strategies, and drives revenue growth.',
21970
- 'VP of Sales': 'Executive leader responsible for overall sales strategy, team leadership, and revenue generation across the organization.',
21971
- // C-Suite
21972
- 'CTO': 'Chief Technology Officer responsible for technology strategy, innovation, and technical leadership across the organization.',
21973
- 'CEO': 'Chief Executive Officer responsible for overall company strategy, leadership, and business success.',
21974
- 'CFO': 'Chief Financial Officer responsible for financial strategy, planning, and financial operations.',
21975
- 'COO': 'Chief Operating Officer responsible for operational excellence, process optimization, and day-to-day business operations.',
21976
- // DevOps Leadership
21977
- 'DevOps Engineer': 'Mid-level DevOps professional who automates deployment processes, manages infrastructure, and ensures system reliability.',
21978
- 'Senior DevOps Engineer': 'Experienced DevOps professional who leads infrastructure initiatives, optimizes deployment processes, and mentors junior team members.',
21979
- 'DevOps Manager': 'Senior leader responsible for managing DevOps teams, establishing best practices, and driving operational excellence.',
21980
- 'Director of DevOps': 'Senior leader responsible for DevOps strategy, infrastructure planning, and technical leadership for operations teams.',
21981
- // Core Industrial Operations
21982
- 'Production Supervisor': 'Leads production lines and teams, manages shift performance, and ensures production targets and quality standards are met.',
21983
- 'Maintenance Technician': 'Executes routine and corrective maintenance tasks to ensure equipment uptime.',
21984
- 'Maintenance Engineer': 'Plans maintenance strategies, analyzes failures, and drives reliability improvements.',
21985
- 'Quality Inspector': 'Performs incoming, in-process, and final inspections to ensure product conformance.',
21986
- 'Quality Engineer': 'Develops control plans, handles nonconformances, and leads continuous improvement initiatives.',
21987
- 'Procurement Specialist': 'Sources materials, negotiates contracts, and manages purchase orders.',
21988
- 'Warehouse Associate': 'Handles receiving, storage, picking, packing, and shipping operations.',
21989
- 'Warehouse Supervisor': 'Oversees warehouse staff and processes, ensuring accuracy and on-time shipments.',
21990
- 'Production Planner': 'Creates production schedules, coordinates materials and capacity, and monitors adherence.',
21991
- // Health, Safety & Environment
21992
- 'HSE Officer': 'Professional supporting health and safety initiatives, audits, and safety training across operations.',
21993
- 'Safety Officer': 'Specialist enforcing safety standards, conducting inspections, and coordinating incident investigations.',
21994
- 'Environmental Specialist': 'Professional overseeing environmental compliance, waste management, and sustainability reporting.',
21995
- 'HSE Manager': 'Leader managing HSE programs, regulatory compliance, and continuous improvement in safety performance.'
21996
- };
21997
- childPositions.forEach(({ parent, children }) => {
21998
- const parentObj = categories.find((c) => c.title === parent);
21999
- if (!parentObj)
22000
- return;
22001
- children.forEach((title) => {
22002
- positions.push({
22003
- id: AXPDataGenerator.uuid(),
22004
- title,
22005
- description: positionDescriptions[title] || 'Professional position with specific responsibilities and requirements.',
22006
- categoryIds: [parentObj.id],
22007
- categories: [{ id: parentObj.id, title: parentObj.title }],
22008
- isManager: /(Manager|Director|Lead|VP|Chief|Head)/i.test(title),
22009
- });
22010
- });
22011
- });
22012
- return positions;
22013
- }
22014
- const POSITIONS_MOCK = generatePositions();
22015
-
22016
22794
  class AXMPositionDataSeeder {
22017
22795
  constructor() {
22018
22796
  this.storageService = inject(AXPEntityStorageService);
@@ -23110,8 +23888,10 @@ const AXCMockOrgChartEventListener = {
23110
23888
  return;
23111
23889
  // Relevant entities that should trigger org chart regeneration
23112
23890
  const relevantEntities = [
23891
+ // Organization Management
23113
23892
  `${RootConfig$c.module.name}.${RootConfig$c.entities.businessUnit.name}`,
23114
23893
  `${RootConfig$c.module.name}.${RootConfig$c.entities.position.name}`,
23894
+ // Human Capital Management
23115
23895
  `${RootConfig$d.module.name}.${RootConfig$d.entities.employee.name}`,
23116
23896
  `${RootConfig$d.module.name}.${RootConfig$d.entities.positionAssignment.name}`
23117
23897
  ];
@@ -23121,7 +23901,7 @@ const AXCMockOrgChartEventListener = {
23121
23901
  try {
23122
23902
  // Execute org chart generation command via command service
23123
23903
  const commandService = inject(AXPCommandService);
23124
- const result = await commandService.execute('organization.chart.generate', {
23904
+ const result = await commandService.execute('OrganizationManagement.OrgChart:Generate', {
23125
23905
  includeEmployees: true,
23126
23906
  preferPrimary: true
23127
23907
  });
@@ -23188,7 +23968,7 @@ class AXCOrganizationManagementMockModule {
23188
23968
  },
23189
23969
  // Commands
23190
23970
  provideCommandSetups([
23191
- { key: 'organization.chart.generate', command: () => AXMOrgChartGenerateCommand },
23971
+ { key: 'OrganizationManagement.OrgChart:Generate', command: () => AXMOrgChartGenerateCommand },
23192
23972
  ]),
23193
23973
  ] }); }
23194
23974
  }
@@ -23235,7 +24015,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.8", ngImpor
23235
24015
  },
23236
24016
  // Commands
23237
24017
  provideCommandSetups([
23238
- { key: 'organization.chart.generate', command: () => AXMOrgChartGenerateCommand },
24018
+ { key: 'OrganizationManagement.OrgChart:Generate', command: () => AXMOrgChartGenerateCommand },
23239
24019
  ]),
23240
24020
  ],
23241
24021
  }]
@@ -23516,7 +24296,12 @@ const POSITION_ASSIGNMENTS_MOCK = (() => {
23516
24296
  if (assignedEmployeeIds.has(candidate.id)) {
23517
24297
  return; // skip creating another active primary assignment for the same employee
23518
24298
  }
23519
- 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);
23520
24305
  rows.push({
23521
24306
  id: uuid$c(),
23522
24307
  employeeId: candidate.id,
@@ -28609,6 +29394,56 @@ class AXCDeviceSessionService extends AXMDeviceSessionsServiceImpl {
28609
29394
  }
28610
29395
  }
28611
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
+
28612
29447
  class AXCSecurityManagementMockModule {
28613
29448
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.8", ngImport: i0, type: AXCSecurityManagementMockModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
28614
29449
  static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.1.8", ngImport: i0, type: AXCSecurityManagementMockModule }); }
@@ -28628,6 +29463,11 @@ class AXCSecurityManagementMockModule {
28628
29463
  useClass: AXPSecurityManagementUserDataSeeder,
28629
29464
  multi: true,
28630
29465
  },
29466
+ {
29467
+ provide: AXP_DATA_SEEDER_TOKEN,
29468
+ useClass: AXPSecurityManagementPolicyDataSeeder,
29469
+ multi: true,
29470
+ },
28631
29471
  {
28632
29472
  provide: AXMDeviceSessionsService,
28633
29473
  useClass: AXCDeviceSessionService,
@@ -28656,6 +29496,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.8", ngImpor
28656
29496
  useClass: AXPSecurityManagementUserDataSeeder,
28657
29497
  multi: true,
28658
29498
  },
29499
+ {
29500
+ provide: AXP_DATA_SEEDER_TOKEN,
29501
+ useClass: AXPSecurityManagementPolicyDataSeeder,
29502
+ multi: true,
29503
+ },
28659
29504
  {
28660
29505
  provide: AXMDeviceSessionsService,
28661
29506
  useClass: AXCDeviceSessionService,
@@ -34119,7 +34964,13 @@ const auditLoggerMiddleware = {
34119
34964
  type: 'user',
34120
34965
  fullName: session.user?.title,
34121
34966
  }
34122
- }
34967
+ },
34968
+ /////
34969
+ isReadOnly: false,
34970
+ isHidden: false,
34971
+ isSystem: false,
34972
+ isImmutable: false,
34973
+ /////
34123
34974
  };
34124
34975
  }
34125
34976
  else if (ctx.op === 'update') {
@@ -34919,6 +35770,346 @@ const mergeDetailRelationMiddleware = {
34919
35770
  },
34920
35771
  };
34921
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
+
34922
36113
  class AXCMiddlewaresModule {
34923
36114
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.8", ngImport: i0, type: AXCMiddlewaresModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
34924
36115
  static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.1.8", ngImport: i0, type: AXCMiddlewaresModule }); }
@@ -34928,6 +36119,7 @@ class AXCMiddlewaresModule {
34928
36119
  // Provide the concrete backend and middlewares
34929
36120
  { provide: AXP_ENTITY_STORAGE_BACKEND, useClass: AXCDexieEntityStorageService },
34930
36121
  // Middlewares
36122
+ { provide: AXP_ENTITY_STORAGE_MIDDLEWARE, multi: true, useValue: policyEnforceMiddleware },
34931
36123
  { provide: AXP_ENTITY_STORAGE_MIDDLEWARE, multi: true, useValue: eventDispatchMiddleware },
34932
36124
  { provide: AXP_ENTITY_STORAGE_MIDDLEWARE, multi: true, useValue: mergeDetailRelationMiddleware },
34933
36125
  { provide: AXP_ENTITY_STORAGE_MIDDLEWARE, multi: true, useValue: identifierCommitMiddleware },
@@ -34949,6 +36141,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.8", ngImpor
34949
36141
  // Provide the concrete backend and middlewares
34950
36142
  { provide: AXP_ENTITY_STORAGE_BACKEND, useClass: AXCDexieEntityStorageService },
34951
36143
  // Middlewares
36144
+ { provide: AXP_ENTITY_STORAGE_MIDDLEWARE, multi: true, useValue: policyEnforceMiddleware },
34952
36145
  { provide: AXP_ENTITY_STORAGE_MIDDLEWARE, multi: true, useValue: eventDispatchMiddleware },
34953
36146
  { provide: AXP_ENTITY_STORAGE_MIDDLEWARE, multi: true, useValue: mergeDetailRelationMiddleware },
34954
36147
  { provide: AXP_ENTITY_STORAGE_MIDDLEWARE, multi: true, useValue: identifierCommitMiddleware },
@@ -36011,5 +37204,5 @@ const AXCMockEntityLogListener = {
36011
37204
  * Generated bundle index. Do not edit.
36012
37205
  */
36013
37206
 
36014
- 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 };
36015
37208
  //# sourceMappingURL=acorex-connectivity-mock.mjs.map