@acorex/connectivity 20.3.0-next.7 → 20.3.0-next.9

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, AXPMiddlewareAbortError, 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';
@@ -29,10 +30,10 @@ import { AXPWidgetsCatalog } from '@acorex/platform/layout/builder';
29
30
  import { RootConfig as RootConfig$8 } from '@acorex/modules/locale-management';
30
31
  import { RootConfig as RootConfig$9 } from '@acorex/modules/location-management';
31
32
  import { RootConfig as RootConfig$a } from '@acorex/modules/log-management';
33
+ import { AXPWidgetsList } from '@acorex/modules/common';
34
+ import { AXP_REPORT_CATEGORY_PROVIDER, AXP_REPORT_DEFINITION_PROVIDER, RootConfig as RootConfig$g, AXPReportDefinitionService } from '@acorex/modules/report-management';
32
35
  import { RootConfig as RootConfig$c, AXMOrgChartNodeType } from '@acorex/modules/organization-management';
33
36
  import { RootConfig as RootConfig$d } from '@acorex/modules/human-capital-management';
34
- import { AXP_REPORT_CATEGORY_PROVIDER, AXP_REPORT_DEFINITION_PROVIDER, RootConfig as RootConfig$g, AXPReportDefinitionService } from '@acorex/modules/report-management';
35
- import { AXPWidgetsList } from '@acorex/modules/common';
36
37
  import { RootConfig as RootConfig$e } from '@acorex/modules/platform-management';
37
38
  import { RootConfig as RootConfig$f } from '@acorex/modules/project-management';
38
39
  import { RootConfig as RootConfig$i } from '@acorex/modules/training-management';
@@ -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,66 +4404,474 @@ 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 = '{"type":"text-editor","path":"title","options":{"validations":[{"rule":"required","message":"This field is required."}]}}';
4467
+ const descriptionInterface = '{"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 textInterface = '{"type":"text-editor","path":"text","options":{"validations":[{"rule":"required","message":"This field is required."}]}}';
4449
4475
  const METADATA_MOCK = [
4476
+ // General - Common metadata fields
4450
4477
  {
4451
4478
  id: AXPDataGenerator.uuid(),
4452
4479
  name: 'title',
4453
4480
  title: 'Title',
4454
4481
  defaultValue: '',
4455
- interface: titleInterface$1,
4456
- categoryIds: [METADATA_CATEGORY_MOCK[0].id],
4457
- categories: [METADATA_CATEGORY_MOCK[0]],
4482
+ interface: titleInterface,
4483
+ categoryIds: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'General').id],
4484
+ categories: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'General')],
4458
4485
  },
4459
4486
  {
4460
4487
  id: AXPDataGenerator.uuid(),
4461
4488
  name: 'description',
4462
4489
  title: 'Description',
4463
4490
  defaultValue: '',
4464
- interface: descriptionInterface$1,
4465
- categoryIds: [METADATA_CATEGORY_MOCK[0].id],
4466
- categories: [METADATA_CATEGORY_MOCK[0]],
4491
+ interface: descriptionInterface,
4492
+ categoryIds: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'General').id],
4493
+ categories: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'General')],
4494
+ },
4495
+ {
4496
+ id: AXPDataGenerator.uuid(),
4497
+ name: 'created-date',
4498
+ title: 'Created Date',
4499
+ defaultValue: '',
4500
+ interface: dateInterface,
4501
+ categoryIds: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'General').id],
4502
+ categories: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'General')],
4503
+ },
4504
+ {
4505
+ id: AXPDataGenerator.uuid(),
4506
+ name: 'status',
4507
+ title: 'Status',
4508
+ defaultValue: 'Draft',
4509
+ interface: selectInterface,
4510
+ categoryIds: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'General').id],
4511
+ categories: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'General')],
4512
+ },
4513
+ {
4514
+ id: AXPDataGenerator.uuid(),
4515
+ name: 'priority',
4516
+ title: 'Priority',
4517
+ defaultValue: 'Medium',
4518
+ interface: selectInterface,
4519
+ categoryIds: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'General').id],
4520
+ categories: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'General')],
4521
+ },
4522
+ {
4523
+ id: AXPDataGenerator.uuid(),
4524
+ name: 'tags',
4525
+ title: 'Tags',
4526
+ defaultValue: '',
4527
+ interface: textAreaInterface,
4528
+ categoryIds: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'General').id],
4529
+ categories: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'General')],
4530
+ },
4531
+ {
4532
+ id: AXPDataGenerator.uuid(),
4533
+ name: 'keywords',
4534
+ title: 'Keywords',
4535
+ defaultValue: '',
4536
+ interface: textAreaInterface,
4537
+ categoryIds: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'General').id],
4538
+ categories: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'General')],
4539
+ },
4540
+ {
4541
+ id: AXPDataGenerator.uuid(),
4542
+ name: 'language',
4543
+ title: 'Language',
4544
+ defaultValue: 'English',
4545
+ interface: selectInterface,
4546
+ categoryIds: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'General').id],
4547
+ categories: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'General')],
4548
+ },
4549
+ {
4550
+ id: AXPDataGenerator.uuid(),
4551
+ name: 'is-confidential',
4552
+ title: 'Confidential',
4553
+ defaultValue: 'false',
4554
+ interface: checkboxInterface,
4555
+ categoryIds: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'General').id],
4556
+ categories: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'General')],
4557
+ },
4558
+ // Document Management - Version Control
4559
+ {
4560
+ id: AXPDataGenerator.uuid(),
4561
+ name: 'document-title',
4562
+ title: 'Document Title',
4563
+ defaultValue: '',
4564
+ interface: titleInterface,
4565
+ categoryIds: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Version Control').id],
4566
+ categories: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Version Control')],
4567
+ },
4568
+ {
4569
+ id: AXPDataGenerator.uuid(),
4570
+ name: 'document-version',
4571
+ title: 'Document Version',
4572
+ defaultValue: '1.0',
4573
+ interface: versionInterface,
4574
+ categoryIds: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Version Control').id],
4575
+ categories: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Version Control')],
4576
+ },
4577
+ {
4578
+ id: AXPDataGenerator.uuid(),
4579
+ name: 'last-modified',
4580
+ title: 'Last Modified',
4581
+ defaultValue: '',
4582
+ interface: dateInterface,
4583
+ categoryIds: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Version Control').id],
4584
+ categories: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Version Control')],
4585
+ },
4586
+ {
4587
+ id: AXPDataGenerator.uuid(),
4588
+ name: 'change-log',
4589
+ title: 'Change Log',
4590
+ defaultValue: '',
4591
+ interface: textAreaInterface,
4592
+ categoryIds: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Version Control').id],
4593
+ categories: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Version Control')],
4594
+ },
4595
+ // Document Management - Access Control
4596
+ {
4597
+ id: AXPDataGenerator.uuid(),
4598
+ name: 'access-level',
4599
+ title: 'Access Level',
4600
+ defaultValue: 'Public',
4601
+ interface: selectInterface,
4602
+ categoryIds: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Access Control').id],
4603
+ categories: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Access Control')],
4604
+ },
4605
+ {
4606
+ id: AXPDataGenerator.uuid(),
4607
+ name: 'permissions',
4608
+ title: 'Permissions',
4609
+ defaultValue: '',
4610
+ interface: textAreaInterface,
4611
+ categoryIds: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Access Control').id],
4612
+ categories: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Access Control')],
4613
+ },
4614
+ // Document Management - Document Types
4615
+ {
4616
+ id: AXPDataGenerator.uuid(),
4617
+ name: 'document-type',
4618
+ title: 'Document Type',
4619
+ defaultValue: '',
4620
+ interface: selectInterface,
4621
+ categoryIds: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Document Types').id],
4622
+ categories: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Document Types')],
4623
+ },
4624
+ {
4625
+ id: AXPDataGenerator.uuid(),
4626
+ name: 'document-category',
4627
+ title: 'Document Category',
4628
+ defaultValue: '',
4629
+ interface: selectInterface,
4630
+ categoryIds: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Document Types').id],
4631
+ categories: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Document Types')],
4632
+ },
4633
+ {
4634
+ id: AXPDataGenerator.uuid(),
4635
+ name: 'file-format',
4636
+ title: 'File Format',
4637
+ defaultValue: '',
4638
+ interface: selectInterface,
4639
+ categoryIds: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Document Types').id],
4640
+ categories: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Document Types')],
4641
+ },
4642
+ // Quality Control - Standards
4643
+ {
4644
+ id: AXPDataGenerator.uuid(),
4645
+ name: 'quality-standard',
4646
+ title: 'Quality Standard',
4647
+ defaultValue: '',
4648
+ interface: selectInterface,
4649
+ categoryIds: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Standards').id],
4650
+ categories: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Standards')],
4651
+ },
4652
+ {
4653
+ id: AXPDataGenerator.uuid(),
4654
+ name: 'compliance-level',
4655
+ title: 'Compliance Level',
4656
+ defaultValue: '',
4657
+ interface: selectInterface,
4658
+ categoryIds: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Standards').id],
4659
+ categories: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Standards')],
4660
+ },
4661
+ {
4662
+ id: AXPDataGenerator.uuid(),
4663
+ name: 'standard-version',
4664
+ title: 'Standard Version',
4665
+ defaultValue: '',
4666
+ interface: versionInterface,
4667
+ categoryIds: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Standards').id],
4668
+ categories: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Standards')],
4669
+ },
4670
+ // Quality Control - Testing
4671
+ {
4672
+ id: AXPDataGenerator.uuid(),
4673
+ name: 'test-status',
4674
+ title: 'Test Status',
4675
+ defaultValue: 'Pending',
4676
+ interface: selectInterface,
4677
+ categoryIds: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Testing').id],
4678
+ categories: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Testing')],
4679
+ },
4680
+ {
4681
+ id: AXPDataGenerator.uuid(),
4682
+ name: 'test-results',
4683
+ title: 'Test Results',
4684
+ defaultValue: '',
4685
+ interface: textAreaInterface,
4686
+ categoryIds: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Testing').id],
4687
+ categories: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Testing')],
4688
+ },
4689
+ {
4690
+ id: AXPDataGenerator.uuid(),
4691
+ name: 'test-date',
4692
+ title: 'Test Date',
4693
+ defaultValue: '',
4694
+ interface: dateInterface,
4695
+ categoryIds: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Testing').id],
4696
+ categories: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Testing')],
4697
+ },
4698
+ // Quality Control - Validation
4699
+ {
4700
+ id: AXPDataGenerator.uuid(),
4701
+ name: 'validation-status',
4702
+ title: 'Validation Status',
4703
+ defaultValue: 'Not Validated',
4704
+ interface: selectInterface,
4705
+ categoryIds: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Validation').id],
4706
+ categories: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Validation')],
4707
+ },
4708
+ {
4709
+ id: AXPDataGenerator.uuid(),
4710
+ name: 'validation-notes',
4711
+ title: 'Validation Notes',
4712
+ defaultValue: '',
4713
+ interface: textAreaInterface,
4714
+ categoryIds: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Validation').id],
4715
+ categories: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Validation')],
4716
+ },
4717
+ // Compliance - Regulations
4718
+ {
4719
+ id: AXPDataGenerator.uuid(),
4720
+ name: 'regulatory-framework',
4721
+ title: 'Regulatory Framework',
4722
+ defaultValue: '',
4723
+ interface: selectInterface,
4724
+ categoryIds: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Regulations').id],
4725
+ categories: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Regulations')],
4726
+ },
4727
+ {
4728
+ id: AXPDataGenerator.uuid(),
4729
+ name: 'compliance-status',
4730
+ title: 'Compliance Status',
4731
+ defaultValue: 'Under Review',
4732
+ interface: selectInterface,
4733
+ categoryIds: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Regulations').id],
4734
+ categories: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Regulations')],
4735
+ },
4736
+ {
4737
+ id: AXPDataGenerator.uuid(),
4738
+ name: 'regulation-reference',
4739
+ title: 'Regulation Reference',
4740
+ defaultValue: '',
4741
+ interface: textAreaInterface,
4742
+ categoryIds: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Regulations').id],
4743
+ categories: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Regulations')],
4744
+ },
4745
+ // Compliance - Audit Trail
4746
+ {
4747
+ id: AXPDataGenerator.uuid(),
4748
+ name: 'audit-trail',
4749
+ title: 'Audit Trail',
4750
+ defaultValue: '',
4751
+ interface: textAreaInterface,
4752
+ categoryIds: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Audit Trail').id],
4753
+ categories: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Audit Trail')],
4754
+ },
4755
+ {
4756
+ id: AXPDataGenerator.uuid(),
4757
+ name: 'audit-date',
4758
+ title: 'Audit Date',
4759
+ defaultValue: '',
4760
+ interface: dateInterface,
4761
+ categoryIds: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Audit Trail').id],
4762
+ categories: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Audit Trail')],
4763
+ },
4764
+ // Compliance - Certifications
4765
+ {
4766
+ id: AXPDataGenerator.uuid(),
4767
+ name: 'certification-type',
4768
+ title: 'Certification Type',
4769
+ defaultValue: '',
4770
+ interface: selectInterface,
4771
+ categoryIds: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Certifications').id],
4772
+ categories: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Certifications')],
4773
+ },
4774
+ {
4775
+ id: AXPDataGenerator.uuid(),
4776
+ name: 'certification-number',
4777
+ title: 'Certification Number',
4778
+ defaultValue: '',
4779
+ interface: textInterface,
4780
+ categoryIds: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Certifications').id],
4781
+ categories: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Certifications')],
4782
+ },
4783
+ {
4784
+ id: AXPDataGenerator.uuid(),
4785
+ name: 'certification-expiry',
4786
+ title: 'Certification Expiry',
4787
+ defaultValue: '',
4788
+ interface: dateInterface,
4789
+ categoryIds: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Certifications').id],
4790
+ categories: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Certifications')],
4791
+ },
4792
+ // Project Management - Planning
4793
+ {
4794
+ id: AXPDataGenerator.uuid(),
4795
+ name: 'project-phase',
4796
+ title: 'Project Phase',
4797
+ defaultValue: 'Planning',
4798
+ interface: selectInterface,
4799
+ categoryIds: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Planning').id],
4800
+ categories: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Planning')],
4801
+ },
4802
+ {
4803
+ id: AXPDataGenerator.uuid(),
4804
+ name: 'project-milestone',
4805
+ title: 'Project Milestone',
4806
+ defaultValue: '',
4807
+ interface: textAreaInterface,
4808
+ categoryIds: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Planning').id],
4809
+ categories: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Planning')],
4810
+ },
4811
+ {
4812
+ id: AXPDataGenerator.uuid(),
4813
+ name: 'project-objectives',
4814
+ title: 'Project Objectives',
4815
+ defaultValue: '',
4816
+ interface: textAreaInterface,
4817
+ categoryIds: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Planning').id],
4818
+ categories: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Planning')],
4819
+ },
4820
+ // Project Management - Resources
4821
+ {
4822
+ id: AXPDataGenerator.uuid(),
4823
+ name: 'resource-allocation',
4824
+ title: 'Resource Allocation',
4825
+ defaultValue: '',
4826
+ interface: textAreaInterface,
4827
+ categoryIds: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Resources').id],
4828
+ categories: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Resources')],
4829
+ },
4830
+ {
4831
+ id: AXPDataGenerator.uuid(),
4832
+ name: 'budget',
4833
+ title: 'Budget',
4834
+ defaultValue: '',
4835
+ interface: numberInterface,
4836
+ categoryIds: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Resources').id],
4837
+ categories: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Resources')],
4838
+ },
4839
+ {
4840
+ id: AXPDataGenerator.uuid(),
4841
+ name: 'team-members',
4842
+ title: 'Team Members',
4843
+ defaultValue: '',
4844
+ interface: textAreaInterface,
4845
+ categoryIds: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Resources').id],
4846
+ categories: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Resources')],
4847
+ },
4848
+ // Project Management - Timeline
4849
+ {
4850
+ id: AXPDataGenerator.uuid(),
4851
+ name: 'start-date',
4852
+ title: 'Start Date',
4853
+ defaultValue: '',
4854
+ interface: dateInterface,
4855
+ categoryIds: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Timeline').id],
4856
+ categories: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Timeline')],
4857
+ },
4858
+ {
4859
+ id: AXPDataGenerator.uuid(),
4860
+ name: 'end-date',
4861
+ title: 'End Date',
4862
+ defaultValue: '',
4863
+ interface: dateInterface,
4864
+ categoryIds: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Timeline').id],
4865
+ categories: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Timeline')],
4866
+ },
4867
+ {
4868
+ id: AXPDataGenerator.uuid(),
4869
+ name: 'deadline',
4870
+ title: 'Deadline',
4871
+ defaultValue: '',
4872
+ interface: dateInterface,
4873
+ categoryIds: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Timeline').id],
4874
+ categories: [METADATA_CATEGORY_MOCK.find((c) => c.title === 'Timeline')],
4467
4875
  },
4468
4876
  ];
4469
4877
 
@@ -4482,6 +4890,141 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.8", ngImpor
4482
4890
  type: Injectable
4483
4891
  }] });
4484
4892
 
4893
+ class AXCQueryCategoryMetadataInheritanceQuery {
4894
+ constructor() {
4895
+ this.injector = inject(Injector);
4896
+ this.metaDataService = inject(AXMMetaDataDefinitionService);
4897
+ }
4898
+ async fetch(params) {
4899
+ const { entityName, categoryId } = params;
4900
+ //1a25158a-3e0f-4e9c-bdc2-d6cc0ece86ba
4901
+ const service = runInInjectionContext(this.injector, () => new AXMEntityCrudServiceImpl(`${params.entityName}Category`));
4902
+ // Find the category by ID
4903
+ const category = await this.findCategoryById(categoryId, service);
4904
+ if (!category) {
4905
+ throw new Error(`Category with ID ${categoryId} not found`);
4906
+ }
4907
+ // Build the hierarchy (traverse up to root)
4908
+ const hierarchy = await this.buildCategoryHierarchy(category, service);
4909
+ // Collect all metadata fields from the hierarchy
4910
+ //const inheritedMetadata = await this.collectInheritedMetadata(hierarchy);
4911
+ const result = hierarchy.map(cat => get(cat, 'metaData')).flat() ?? [];
4912
+ return result;
4913
+ }
4914
+ async findCategoryById(categoryId, service) {
4915
+ try {
4916
+ const result = await service.query({
4917
+ filter: {
4918
+ logic: 'and',
4919
+ filters: [
4920
+ {
4921
+ field: 'id',
4922
+ operator: {
4923
+ type: 'equal',
4924
+ },
4925
+ value: categoryId,
4926
+ },
4927
+ ],
4928
+ },
4929
+ take: 1,
4930
+ skip: 0,
4931
+ });
4932
+ return result.items.length > 0 ? result.items[0] : null;
4933
+ }
4934
+ catch (error) {
4935
+ console.error('Error finding category by ID:', error);
4936
+ return null;
4937
+ }
4938
+ }
4939
+ async buildCategoryHierarchy(category, service) {
4940
+ const hierarchy = [category];
4941
+ let currentCategory = category;
4942
+ // Traverse up the parent hierarchy
4943
+ while (currentCategory.parentId) {
4944
+ try {
4945
+ const parentResult = await service.query({
4946
+ filter: {
4947
+ logic: 'and',
4948
+ filters: [
4949
+ {
4950
+ field: 'id',
4951
+ operator: {
4952
+ type: 'equal',
4953
+ },
4954
+ value: currentCategory.parentId,
4955
+ },
4956
+ ],
4957
+ },
4958
+ take: 1,
4959
+ skip: 0,
4960
+ });
4961
+ if (parentResult.items.length > 0) {
4962
+ const parent = parentResult.items[0];
4963
+ hierarchy.unshift(parent); // Add to beginning to maintain hierarchy order
4964
+ currentCategory = parent;
4965
+ }
4966
+ else {
4967
+ break; // Parent not found, stop traversal
4968
+ }
4969
+ }
4970
+ catch (error) {
4971
+ console.error('Error finding parent category:', error);
4972
+ break;
4973
+ }
4974
+ }
4975
+ return hierarchy;
4976
+ }
4977
+ async collectInheritedMetadata(hierarchy) {
4978
+ const allMetadata = [];
4979
+ const seenMetadataIds = new Set();
4980
+ // Collect metadata from each level in the hierarchy
4981
+ for (const category of hierarchy) {
4982
+ try {
4983
+ const metadataResult = await this.metaDataService.query({
4984
+ filter: {
4985
+ logic: 'and',
4986
+ filters: [
4987
+ {
4988
+ field: 'categoryIds',
4989
+ operator: {
4990
+ type: 'contains',
4991
+ },
4992
+ value: category.id,
4993
+ },
4994
+ ],
4995
+ },
4996
+ take: 1000,
4997
+ skip: 0,
4998
+ });
4999
+ // Add metadata fields that haven't been seen before (avoid duplicates)
5000
+ for (const metadata of metadataResult.items) {
5001
+ if (!seenMetadataIds.has(metadata.id)) {
5002
+ allMetadata.push(metadata);
5003
+ seenMetadataIds.add(metadata.id);
5004
+ }
5005
+ }
5006
+ }
5007
+ catch (error) {
5008
+ console.error(`Error collecting metadata for category ${category.id}:`, error);
5009
+ }
5010
+ }
5011
+ return allMetadata;
5012
+ }
5013
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.8", ngImport: i0, type: AXCQueryCategoryMetadataInheritanceQuery, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
5014
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.1.8", ngImport: i0, type: AXCQueryCategoryMetadataInheritanceQuery, providedIn: 'root' }); }
5015
+ }
5016
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.8", ngImport: i0, type: AXCQueryCategoryMetadataInheritanceQuery, decorators: [{
5017
+ type: Injectable,
5018
+ args: [{
5019
+ providedIn: 'root'
5020
+ }]
5021
+ }] });
5022
+
5023
+ var categoryMetadataInheritance_query = /*#__PURE__*/Object.freeze({
5024
+ __proto__: null,
5025
+ AXCQueryCategoryMetadataInheritanceQuery: AXCQueryCategoryMetadataInheritanceQuery
5026
+ });
5027
+
4485
5028
  class AXCDataManagementMockModule {
4486
5029
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.8", ngImport: i0, type: AXCDataManagementMockModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
4487
5030
  static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.1.8", ngImport: i0, type: AXCDataManagementMockModule }); }
@@ -4498,8 +5041,12 @@ class AXCDataManagementMockModule {
4498
5041
  },
4499
5042
  provideQuerySetups([
4500
5043
  {
4501
- key: 'category-with-items',
5044
+ key: 'DataManagement:Metadata:GetCategoryWithItems',
4502
5045
  loader: () => import('./acorex-connectivity-mock-category-with-items.query-DEY9R9q2.mjs').then(m => m.AXCQueryCategoryWithItemsQuery),
5046
+ },
5047
+ {
5048
+ key: 'DataManagement:Metadata:GetCategoryInheritance',
5049
+ loader: () => Promise.resolve().then(function () { return categoryMetadataInheritance_query; }).then(m => m.AXCQueryCategoryMetadataInheritanceQuery),
4503
5050
  }
4504
5051
  ])
4505
5052
  ] }); }
@@ -4523,8 +5070,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.8", ngImpor
4523
5070
  },
4524
5071
  provideQuerySetups([
4525
5072
  {
4526
- key: 'category-with-items',
5073
+ key: 'DataManagement:Metadata:GetCategoryWithItems',
4527
5074
  loader: () => import('./acorex-connectivity-mock-category-with-items.query-DEY9R9q2.mjs').then(m => m.AXCQueryCategoryWithItemsQuery),
5075
+ },
5076
+ {
5077
+ key: 'DataManagement:Metadata:GetCategoryInheritance',
5078
+ loader: () => Promise.resolve().then(function () { return categoryMetadataInheritance_query; }).then(m => m.AXCQueryCategoryMetadataInheritanceQuery),
4528
5079
  }
4529
5080
  ])
4530
5081
  ],
@@ -4643,119 +5194,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.8", ngImpor
4643
5194
  type: Injectable
4644
5195
  }] });
4645
5196
 
4646
- const checkbox$1 = '{"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"}';
4647
- const color = '{"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"}';
4648
- const titleInterface = `{
4649
- "type": "document-layout",
4650
- "children": [
4651
- {
4652
- "type": "page-layout",
4653
- "children": [
4654
- {
4655
- "type": "title-editor",
4656
- "name": "title-editor1",
4657
- "meta": {
4658
- "header": true
4659
- },
4660
- "options": {
4661
- "multiple": false,
4662
- "disabled": false,
4663
- "hasClearButton": false,
4664
- "validations": {
4665
- "regex": null,
4666
- "required": {
4667
- "rule": "required",
4668
- "message": "This field is required."
4669
- }
4670
- }
4671
- },
4672
- "defaultValue": "",
4673
- "path": "title"
4674
- }
4675
- ],
4676
- "name": "page-layout1"
4677
- }
4678
- ],
4679
- "name": "document"
4680
- }`;
4681
- const descriptionInterface = `{
4682
- "type": "document-layout",
4683
- "children": [
4684
- {
4685
- "type": "page-layout",
4686
- "children": [
4687
- {
4688
- "type": "description-editor",
4689
- "name": "description-editor1",
4690
- "meta": {
4691
- "header": true
4692
- },
4693
- "options": {
4694
- "multiple": false,
4695
- "disabled": false,
4696
- "hasClearButton": false,
4697
- },
4698
- "defaultValue": "",
4699
- "path": "description"
4700
- }
4701
- ],
4702
- "name": "page-layout1"
4703
- }
4704
- ],
4705
- "name": "document"
4706
- }`;
4707
- const contractNumberInterface = `{
4708
- "type": "document-layout",
4709
- "children": [
4710
- {
4711
- "type": "page-layout",
4712
- "children": [
4713
- {
4714
- "type": "number-editor",
4715
- "name": "number-editor1",
4716
- "meta": {
4717
- "header": true
4718
- },
4719
- "options": {
4720
- "multiple": false,
4721
- "disabled": false,
4722
- "hasClearButton": false,
4723
- },
4724
- "defaultValue": "",
4725
- "path": "contract-number"
4726
- }
4727
- ],
4728
- "name": "page-layout1"
4729
- }
4730
- ],
4731
- "name": "document"
4732
- }`;
4733
- const evaluatorInterface = `{
4734
- "type": "document-layout",
4735
- "children": [
4736
- {
4737
- "type": "page-layout",
4738
- "children": [
4739
- {
4740
- "type": "text-editor",
4741
- "name": "text-editor1",
4742
- "meta": {
4743
- "header": true
4744
- },
4745
- "options": {
4746
- "multiple": false,
4747
- "disabled": false,
4748
- "hasClearButton": false,
4749
- },
4750
- "defaultValue": "",
4751
- "path": "evaluator"
4752
- }
4753
- ],
4754
- "name": "page-layout1"
4755
- }
4756
- ],
4757
- "name": "document"
4758
- }`;
4759
5197
  const DOCUMENT_TYPES = [
4760
5198
  {
4761
5199
  id: AXPDataGenerator.uuid(),
@@ -4767,14 +5205,14 @@ const DOCUMENT_TYPES = [
4767
5205
  enableExpiration: false,
4768
5206
  requiresReview: true,
4769
5207
  requiresDistribution: false,
4770
- meta: [
5208
+ metaData: [
4771
5209
  {
4772
5210
  id: AXPDataGenerator.uuid(),
4773
5211
  text: 'Description',
4774
5212
  // "parentId": "9e3c7586-4722-4170-bc55-e612ca2ab4b5",
4775
5213
  hasCheckbox: true,
4776
5214
  isSelected: true,
4777
- interface: '{"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"}',
5215
+ interface: '{"type":"text-editor","name":"description-editor1","meta":{"header":true},"options":{"multiple":false,"disabled":false,"hasClearButton":false},"defaultValue":"","path":"description"}',
4778
5216
  name: 'description',
4779
5217
  title: 'Description',
4780
5218
  isRequired: true,
@@ -4821,7 +5259,8 @@ const DOCUMENT_TYPES = [
4821
5259
  enableExpiration: false,
4822
5260
  requiresReview: false,
4823
5261
  requiresDistribution: false,
4824
- meta: [],
5262
+ control: { isSystem: true },
5263
+ metaData: [],
4825
5264
  type: {
4826
5265
  selectedItems: [],
4827
5266
  context: {
@@ -4842,14 +5281,14 @@ const DOCUMENT_TYPES = [
4842
5281
  enableExpiration: true,
4843
5282
  requiresReview: true,
4844
5283
  requiresDistribution: true,
4845
- meta: [
5284
+ metaData: [
4846
5285
  {
4847
5286
  id: AXPDataGenerator.uuid(),
4848
5287
  text: 'Description',
4849
5288
  // "parentId": "9e3c7586-4722-4170-bc55-e612ca2ab4b5",
4850
5289
  hasCheckbox: true,
4851
5290
  isSelected: true,
4852
- interface: '{"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"}',
5291
+ interface: '{"type":"text-editor","name":"description-editor1","meta":{"header":true},"options":{"multiple":false,"disabled":false,"hasClearButton":false},"defaultValue":"","path":"description"}',
4853
5292
  name: 'description',
4854
5293
  title: 'Description',
4855
5294
  isRequired: true,
@@ -20846,11 +21285,739 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.8", ngImpor
20846
21285
  type: Injectable
20847
21286
  }] });
20848
21287
 
21288
+ //#region ---- Imports ----
21289
+ //#endregion
21290
+ //#region ---- Category & Report Data (Log Management) ----
21291
+ const LOG_REPORT_ROOT_CATEGORY_ID = 'log-management.reports.root';
21292
+ const LOG_REPORT_AUDIT_CATEGORY_ID = 'log-management.reports.audit';
21293
+ const LOG_REPORT_IDENTITY_CATEGORY_ID = 'log-management.reports.identity-audit-log';
21294
+ const LOG_REPORT_CATEGORIES = [
21295
+ {
21296
+ id: LOG_REPORT_ROOT_CATEGORY_ID,
21297
+ title: 'Log Management',
21298
+ description: 'Reports related to application logs',
21299
+ hasChild: true,
21300
+ },
21301
+ {
21302
+ id: LOG_REPORT_AUDIT_CATEGORY_ID,
21303
+ parentId: LOG_REPORT_ROOT_CATEGORY_ID,
21304
+ title: 'Audit Logs',
21305
+ description: 'User actions and system audit trail',
21306
+ hasReport: true,
21307
+ },
21308
+ {
21309
+ id: LOG_REPORT_IDENTITY_CATEGORY_ID,
21310
+ parentId: LOG_REPORT_ROOT_CATEGORY_ID,
21311
+ title: 'Identity Audit Log',
21312
+ description: 'Authentication and identity management logs',
21313
+ hasReport: true,
21314
+ },
21315
+ ];
21316
+ const LOG_REPORT_DEFINITIONS = [
21317
+ {
21318
+ id: 'log-management.report.audit-trail-by-user',
21319
+ title: 'Audit Trail by User',
21320
+ description: 'Comprehensive audit trail showing user actions, system events, and entity changes',
21321
+ categoryIds: [LOG_REPORT_AUDIT_CATEGORY_ID],
21322
+ parameterGroups: [
21323
+ {
21324
+ name: 'period',
21325
+ title: 'Period',
21326
+ parameters: [
21327
+ {
21328
+ path: 'startDate',
21329
+ title: 'Start Date',
21330
+ widget: { type: AXPWidgetsList.Editors.DateTimeBox, options: { format: 'date' } },
21331
+ },
21332
+ {
21333
+ path: 'endDate',
21334
+ title: 'End Date',
21335
+ widget: { type: AXPWidgetsList.Editors.DateTimeBox, options: { format: 'date' } },
21336
+ },
21337
+ ],
21338
+ },
21339
+ {
21340
+ name: 'filters',
21341
+ title: 'Filters',
21342
+ parameters: [
21343
+ {
21344
+ path: 'userName',
21345
+ title: 'User Name',
21346
+ widget: { type: AXPWidgetsList.Editors.TextBox, options: { placeholder: 'Filter by username' } },
21347
+ },
21348
+ {
21349
+ path: 'httpMethod',
21350
+ title: 'HTTP Method',
21351
+ widget: {
21352
+ type: AXPWidgetsList.Editors.SelectBox,
21353
+ options: {
21354
+ dataSource: ['GET', 'POST', 'PUT', 'DELETE', 'PATCH'],
21355
+ multiple: true,
21356
+ },
21357
+ },
21358
+ },
21359
+ {
21360
+ path: 'httpStatusCode',
21361
+ title: 'HTTP Status',
21362
+ widget: {
21363
+ type: AXPWidgetsList.Editors.SelectBox,
21364
+ options: {
21365
+ dataSource: ['200', '201', '400', '401', '403', '404', '500'],
21366
+ multiple: true,
21367
+ },
21368
+ },
21369
+ },
21370
+ ],
21371
+ },
21372
+ ],
21373
+ layouts: [
21374
+ {
21375
+ id: 'table',
21376
+ title: 'Table View',
21377
+ layout: {
21378
+ type: 'table',
21379
+ columns: [
21380
+ {
21381
+ field: 'executionTime',
21382
+ title: 'Date',
21383
+ visible: true,
21384
+ width: 180,
21385
+ align: 'left',
21386
+ widget: {
21387
+ type: AXPWidgetsList.Editors.DateTimeBox,
21388
+ options: { format: 'datetime' },
21389
+ path: 'executionTime',
21390
+ },
21391
+ },
21392
+ {
21393
+ field: 'userName',
21394
+ title: 'User Name',
21395
+ visible: true,
21396
+ width: 150,
21397
+ align: 'left',
21398
+ widget: { type: AXPWidgetsList.Editors.TextBox, path: 'userName' },
21399
+ },
21400
+ {
21401
+ field: 'tenantName',
21402
+ title: 'Tenant',
21403
+ visible: true,
21404
+ width: 120,
21405
+ align: 'left',
21406
+ widget: { type: AXPWidgetsList.Editors.TextBox, path: 'tenantName' },
21407
+ },
21408
+ {
21409
+ field: 'httpMethod',
21410
+ title: 'Method',
21411
+ visible: true,
21412
+ width: 80,
21413
+ align: 'center',
21414
+ widget: { type: AXPWidgetsList.Editors.TextBox, path: 'httpMethod' },
21415
+ },
21416
+ {
21417
+ field: 'url',
21418
+ title: 'URL',
21419
+ visible: true,
21420
+ width: 300,
21421
+ align: 'left',
21422
+ widget: { type: AXPWidgetsList.Editors.TextBox, path: 'url' },
21423
+ },
21424
+ {
21425
+ field: 'httpStatusCode',
21426
+ title: 'Status',
21427
+ visible: true,
21428
+ width: 80,
21429
+ align: 'center',
21430
+ widget: { type: AXPWidgetsList.Editors.TextBox, path: 'httpStatusCode' },
21431
+ },
21432
+ {
21433
+ field: 'httpStatus',
21434
+ title: 'HTTP Status',
21435
+ visible: true,
21436
+ width: 100,
21437
+ align: 'center',
21438
+ widget: { type: AXPWidgetsList.Editors.TextBox, path: 'httpStatus' },
21439
+ },
21440
+ {
21441
+ field: 'executionDuration',
21442
+ title: 'Duration (ms)',
21443
+ visible: true,
21444
+ width: 120,
21445
+ align: 'right',
21446
+ widget: { type: AXPWidgetsList.Editors.NumberBox, path: 'executionDuration' },
21447
+ },
21448
+ {
21449
+ field: 'clientIpAddress',
21450
+ title: 'Client IP',
21451
+ visible: true,
21452
+ width: 120,
21453
+ align: 'left',
21454
+ widget: { type: AXPWidgetsList.Editors.TextBox, path: 'clientIpAddress' },
21455
+ },
21456
+ {
21457
+ field: 'clientName',
21458
+ title: 'Client',
21459
+ visible: true,
21460
+ width: 120,
21461
+ align: 'left',
21462
+ widget: { type: AXPWidgetsList.Editors.TextBox, path: 'clientName' },
21463
+ },
21464
+ {
21465
+ field: 'correlationId',
21466
+ title: 'Correlation ID',
21467
+ visible: true,
21468
+ width: 200,
21469
+ align: 'left',
21470
+ widget: { type: AXPWidgetsList.Editors.TextBox, path: 'correlationId' },
21471
+ },
21472
+ {
21473
+ field: 'comments',
21474
+ title: 'Comments',
21475
+ visible: true,
21476
+ width: 200,
21477
+ align: 'left',
21478
+ widget: { type: AXPWidgetsList.Editors.TextBox, path: 'comments' },
21479
+ },
21480
+ {
21481
+ field: 'exceptions',
21482
+ title: 'Exceptions',
21483
+ visible: false,
21484
+ width: 200,
21485
+ align: 'left',
21486
+ widget: { type: AXPWidgetsList.Editors.TextBox, path: 'exceptions' },
21487
+ },
21488
+ {
21489
+ field: 'impersonatorUserName',
21490
+ title: 'Impersonated By',
21491
+ visible: false,
21492
+ width: 150,
21493
+ align: 'left',
21494
+ widget: { type: AXPWidgetsList.Editors.TextBox, path: 'impersonatorUserName' },
21495
+ },
21496
+ ],
21497
+ options: {
21498
+ pagination: true,
21499
+ },
21500
+ },
21501
+ dataSource: {
21502
+ type: 'custom',
21503
+ provider: 'mock-data',
21504
+ },
21505
+ export: {
21506
+ fileNameTemplate: 'AuditTrailByUser_{date}_{user}',
21507
+ pdf: {
21508
+ enabled: true,
21509
+ pageSize: 'A4',
21510
+ headerEnabled: true,
21511
+ footerEnabled: true,
21512
+ showPageNumbers: true,
21513
+ },
21514
+ },
21515
+ },
21516
+ ],
21517
+ defaultLayoutId: 'table',
21518
+ },
21519
+ {
21520
+ id: 'log-management.report.login-logs',
21521
+ title: 'Login Logs',
21522
+ description: 'Authentication and login activity reports',
21523
+ categoryIds: [LOG_REPORT_IDENTITY_CATEGORY_ID],
21524
+ parameterGroups: [
21525
+ {
21526
+ name: 'period',
21527
+ title: 'Period',
21528
+ parameters: [
21529
+ {
21530
+ path: 'startDate',
21531
+ title: 'Start Date',
21532
+ widget: { type: AXPWidgetsList.Editors.DateTimeBox, options: { format: 'date' } },
21533
+ },
21534
+ {
21535
+ path: 'endDate',
21536
+ title: 'End Date',
21537
+ widget: { type: AXPWidgetsList.Editors.DateTimeBox, options: { format: 'date' } },
21538
+ },
21539
+ ],
21540
+ },
21541
+ {
21542
+ name: 'filters',
21543
+ title: 'Filters',
21544
+ parameters: [
21545
+ {
21546
+ path: 'userName',
21547
+ title: 'User Name',
21548
+ widget: { type: AXPWidgetsList.Editors.TextBox, options: { placeholder: 'Filter by username' } },
21549
+ },
21550
+ {
21551
+ path: 'status',
21552
+ title: 'Login Status',
21553
+ widget: {
21554
+ type: AXPWidgetsList.Editors.SelectBox,
21555
+ options: {
21556
+ dataSource: ['Success', 'Failed'],
21557
+ multiple: true,
21558
+ },
21559
+ },
21560
+ },
21561
+ ],
21562
+ },
21563
+ ],
21564
+ layouts: [
21565
+ {
21566
+ id: 'table',
21567
+ title: 'Table View',
21568
+ layout: {
21569
+ type: 'table',
21570
+ columns: [
21571
+ {
21572
+ field: 'userName',
21573
+ title: 'User Name',
21574
+ visible: true,
21575
+ width: 150,
21576
+ align: 'left',
21577
+ widget: { type: AXPWidgetsList.Editors.TextBox, path: 'userName' },
21578
+ },
21579
+ {
21580
+ field: 'httpStatus',
21581
+ title: 'HTTP Status',
21582
+ visible: true,
21583
+ width: 100,
21584
+ align: 'center',
21585
+ widget: { type: AXPWidgetsList.Editors.TextBox, path: 'httpStatus' },
21586
+ },
21587
+ {
21588
+ field: 'clientName',
21589
+ title: 'Client',
21590
+ visible: true,
21591
+ width: 120,
21592
+ align: 'left',
21593
+ widget: { type: AXPWidgetsList.Editors.TextBox, path: 'clientName' },
21594
+ },
21595
+ {
21596
+ field: 'tenantName',
21597
+ title: 'Tenant',
21598
+ visible: true,
21599
+ width: 120,
21600
+ align: 'left',
21601
+ widget: { type: AXPWidgetsList.Editors.TextBox, path: 'tenantName' },
21602
+ },
21603
+ {
21604
+ field: 'applicationName',
21605
+ title: 'Application',
21606
+ visible: true,
21607
+ width: 150,
21608
+ align: 'left',
21609
+ widget: { type: AXPWidgetsList.Editors.TextBox, path: 'applicationName' },
21610
+ },
21611
+ {
21612
+ field: 'impersonatorUserName',
21613
+ title: 'Impersonated By',
21614
+ visible: false,
21615
+ width: 200,
21616
+ align: 'left',
21617
+ widget: { type: AXPWidgetsList.Editors.TextBox, path: 'impersonatorUserName' },
21618
+ },
21619
+ {
21620
+ field: 'executionTime',
21621
+ title: 'Execution Time',
21622
+ visible: true,
21623
+ width: 180,
21624
+ align: 'right',
21625
+ widget: {
21626
+ type: AXPWidgetsList.Editors.DateTimeBox,
21627
+ options: { format: 'datetime' },
21628
+ path: 'executionTime',
21629
+ },
21630
+ },
21631
+ ],
21632
+ options: {
21633
+ pagination: true,
21634
+ },
21635
+ },
21636
+ dataSource: {
21637
+ type: 'custom',
21638
+ provider: 'mock-data',
21639
+ },
21640
+ export: {
21641
+ fileNameTemplate: 'LoginLogs_{date}_{user}',
21642
+ pdf: {
21643
+ enabled: true,
21644
+ pageSize: 'A4',
21645
+ headerEnabled: true,
21646
+ footerEnabled: true,
21647
+ showPageNumbers: true,
21648
+ },
21649
+ },
21650
+ },
21651
+ ],
21652
+ defaultLayoutId: 'table',
21653
+ },
21654
+ {
21655
+ id: 'log-management.report.change-password-logs',
21656
+ title: 'Change Password Logs',
21657
+ description: 'Password change activity and security events',
21658
+ categoryIds: [LOG_REPORT_IDENTITY_CATEGORY_ID],
21659
+ parameterGroups: [
21660
+ {
21661
+ name: 'period',
21662
+ title: 'Period',
21663
+ parameters: [
21664
+ {
21665
+ path: 'startDate',
21666
+ title: 'Start Date',
21667
+ widget: { type: AXPWidgetsList.Editors.DateTimeBox, options: { format: 'date' } },
21668
+ },
21669
+ {
21670
+ path: 'endDate',
21671
+ title: 'End Date',
21672
+ widget: { type: AXPWidgetsList.Editors.DateTimeBox, options: { format: 'date' } },
21673
+ },
21674
+ ],
21675
+ },
21676
+ {
21677
+ name: 'filters',
21678
+ title: 'Filters',
21679
+ parameters: [
21680
+ {
21681
+ path: 'userName',
21682
+ title: 'User Name',
21683
+ widget: { type: AXPWidgetsList.Editors.TextBox, options: { placeholder: 'Filter by username' } },
21684
+ },
21685
+ {
21686
+ path: 'status',
21687
+ title: 'Change Status',
21688
+ widget: {
21689
+ type: AXPWidgetsList.Editors.SelectBox,
21690
+ options: {
21691
+ dataSource: ['Success', 'Failed'],
21692
+ multiple: true,
21693
+ },
21694
+ },
21695
+ },
21696
+ ],
21697
+ },
21698
+ ],
21699
+ layouts: [
21700
+ {
21701
+ id: 'table',
21702
+ title: 'Table View',
21703
+ layout: {
21704
+ type: 'table',
21705
+ columns: [
21706
+ {
21707
+ field: 'userName',
21708
+ title: 'User Name',
21709
+ visible: true,
21710
+ width: 150,
21711
+ align: 'left',
21712
+ widget: { type: AXPWidgetsList.Editors.TextBox, path: 'userName' },
21713
+ },
21714
+ {
21715
+ field: 'httpStatus',
21716
+ title: 'HTTP Status',
21717
+ visible: true,
21718
+ width: 100,
21719
+ align: 'center',
21720
+ widget: { type: AXPWidgetsList.Editors.TextBox, path: 'httpStatus' },
21721
+ },
21722
+ {
21723
+ field: 'clientName',
21724
+ title: 'Client',
21725
+ visible: true,
21726
+ width: 120,
21727
+ align: 'left',
21728
+ widget: { type: AXPWidgetsList.Editors.TextBox, path: 'clientName' },
21729
+ },
21730
+ {
21731
+ field: 'tenantName',
21732
+ title: 'Tenant',
21733
+ visible: true,
21734
+ width: 120,
21735
+ align: 'left',
21736
+ widget: { type: AXPWidgetsList.Editors.TextBox, path: 'tenantName' },
21737
+ },
21738
+ {
21739
+ field: 'applicationName',
21740
+ title: 'Application',
21741
+ visible: true,
21742
+ width: 150,
21743
+ align: 'left',
21744
+ widget: { type: AXPWidgetsList.Editors.TextBox, path: 'applicationName' },
21745
+ },
21746
+ {
21747
+ field: 'impersonatorUserName',
21748
+ title: 'Impersonated By',
21749
+ visible: false,
21750
+ width: 150,
21751
+ align: 'left',
21752
+ widget: { type: AXPWidgetsList.Editors.TextBox, path: 'impersonatorUserName' },
21753
+ },
21754
+ {
21755
+ field: 'executionTime',
21756
+ title: 'Date',
21757
+ visible: true,
21758
+ width: 180,
21759
+ align: 'left',
21760
+ widget: {
21761
+ type: AXPWidgetsList.Editors.DateTimeBox,
21762
+ options: { format: 'datetime' },
21763
+ path: 'executionTime',
21764
+ },
21765
+ },
21766
+ ],
21767
+ options: {
21768
+ pagination: true,
21769
+ },
21770
+ },
21771
+ dataSource: {
21772
+ type: 'custom',
21773
+ provider: 'mock-data',
21774
+ },
21775
+ export: {
21776
+ fileNameTemplate: 'ChangePasswordLogs_{date}_{user}',
21777
+ pdf: {
21778
+ enabled: true,
21779
+ pageSize: 'A4',
21780
+ headerEnabled: true,
21781
+ footerEnabled: true,
21782
+ showPageNumbers: true,
21783
+ },
21784
+ },
21785
+ },
21786
+ ],
21787
+ defaultLayoutId: 'table',
21788
+ },
21789
+ {
21790
+ id: 'log-management.report.identity-error-logs',
21791
+ title: 'Identity Error Logs',
21792
+ description: 'Authentication errors, token failures, and security violations',
21793
+ categoryIds: [LOG_REPORT_IDENTITY_CATEGORY_ID],
21794
+ parameterGroups: [
21795
+ {
21796
+ name: 'period',
21797
+ title: 'Period',
21798
+ parameters: [
21799
+ {
21800
+ path: 'startDate',
21801
+ title: 'Start Date',
21802
+ widget: { type: AXPWidgetsList.Editors.DateTimeBox, options: { format: 'date' } },
21803
+ },
21804
+ {
21805
+ path: 'endDate',
21806
+ title: 'End Date',
21807
+ widget: { type: AXPWidgetsList.Editors.DateTimeBox, options: { format: 'date' } },
21808
+ },
21809
+ ],
21810
+ },
21811
+ {
21812
+ name: 'filters',
21813
+ title: 'Filters',
21814
+ parameters: [
21815
+ {
21816
+ path: 'userName',
21817
+ title: 'User Name',
21818
+ widget: { type: AXPWidgetsList.Editors.TextBox, options: { placeholder: 'Filter by username' } },
21819
+ },
21820
+ {
21821
+ path: 'errorType',
21822
+ title: 'Error Type',
21823
+ widget: {
21824
+ type: AXPWidgetsList.Editors.SelectBox,
21825
+ options: {
21826
+ dataSource: ['Token Expired', 'Invalid Credentials', 'Rate Limited', 'User Not Found'],
21827
+ multiple: true,
21828
+ },
21829
+ },
21830
+ },
21831
+ ],
21832
+ },
21833
+ ],
21834
+ layouts: [
21835
+ {
21836
+ id: 'table',
21837
+ title: 'Table View',
21838
+ layout: {
21839
+ type: 'table',
21840
+ columns: [
21841
+ {
21842
+ field: 'executionTime',
21843
+ title: 'Date',
21844
+ visible: true,
21845
+ width: 180,
21846
+ align: 'left',
21847
+ widget: {
21848
+ type: AXPWidgetsList.Editors.DateTimeBox,
21849
+ options: { format: 'datetime' },
21850
+ path: 'executionTime',
21851
+ },
21852
+ },
21853
+ {
21854
+ field: 'userName',
21855
+ title: 'User Name',
21856
+ visible: true,
21857
+ width: 150,
21858
+ align: 'left',
21859
+ widget: { type: AXPWidgetsList.Editors.TextBox, path: 'userName' },
21860
+ },
21861
+ {
21862
+ field: 'tenantName',
21863
+ title: 'Tenant',
21864
+ visible: true,
21865
+ width: 120,
21866
+ align: 'left',
21867
+ widget: { type: AXPWidgetsList.Editors.TextBox, path: 'tenantName' },
21868
+ },
21869
+ {
21870
+ field: 'httpMethod',
21871
+ title: 'Method',
21872
+ visible: true,
21873
+ width: 80,
21874
+ align: 'center',
21875
+ widget: { type: AXPWidgetsList.Editors.TextBox, path: 'httpMethod' },
21876
+ },
21877
+ {
21878
+ field: 'url',
21879
+ title: 'URL',
21880
+ visible: true,
21881
+ width: 300,
21882
+ align: 'left',
21883
+ widget: { type: AXPWidgetsList.Editors.TextBox, path: 'url' },
21884
+ },
21885
+ {
21886
+ field: 'httpStatusCode',
21887
+ title: 'Status',
21888
+ visible: true,
21889
+ width: 80,
21890
+ align: 'center',
21891
+ widget: { type: AXPWidgetsList.Editors.TextBox, path: 'httpStatusCode' },
21892
+ },
21893
+ {
21894
+ field: 'executionDuration',
21895
+ title: 'Duration (ms)',
21896
+ visible: true,
21897
+ width: 120,
21898
+ align: 'right',
21899
+ widget: { type: AXPWidgetsList.Editors.NumberBox, path: 'executionDuration' },
21900
+ },
21901
+ {
21902
+ field: 'clientIpAddress',
21903
+ title: 'Client IP',
21904
+ visible: true,
21905
+ width: 120,
21906
+ align: 'left',
21907
+ widget: { type: AXPWidgetsList.Editors.TextBox, path: 'clientIpAddress' },
21908
+ },
21909
+ {
21910
+ field: 'clientName',
21911
+ title: 'Client',
21912
+ visible: true,
21913
+ width: 120,
21914
+ align: 'left',
21915
+ widget: { type: AXPWidgetsList.Editors.TextBox, path: 'clientName' },
21916
+ },
21917
+ {
21918
+ field: 'correlationId',
21919
+ title: 'Correlation ID',
21920
+ visible: true,
21921
+ width: 200,
21922
+ align: 'left',
21923
+ widget: { type: AXPWidgetsList.Editors.TextBox, path: 'correlationId' },
21924
+ },
21925
+ {
21926
+ field: 'comments',
21927
+ title: 'Comments',
21928
+ visible: true,
21929
+ width: 200,
21930
+ align: 'left',
21931
+ widget: { type: AXPWidgetsList.Editors.TextBox, path: 'comments' },
21932
+ },
21933
+ {
21934
+ field: 'exceptions',
21935
+ title: 'Exceptions',
21936
+ visible: true,
21937
+ width: 200,
21938
+ align: 'left',
21939
+ widget: { type: AXPWidgetsList.Editors.TextBox, path: 'exceptions' },
21940
+ },
21941
+ {
21942
+ field: 'impersonatorUserName',
21943
+ title: 'Impersonated By',
21944
+ visible: false,
21945
+ width: 150,
21946
+ align: 'left',
21947
+ widget: { type: AXPWidgetsList.Editors.TextBox, path: 'impersonatorUserName' },
21948
+ },
21949
+ ],
21950
+ options: {
21951
+ pagination: true,
21952
+ },
21953
+ },
21954
+ dataSource: {
21955
+ type: 'custom',
21956
+ provider: 'mock-data',
21957
+ },
21958
+ export: {
21959
+ fileNameTemplate: 'IdentityErrorLogs_{date}_{user}',
21960
+ pdf: {
21961
+ enabled: true,
21962
+ pageSize: 'A4',
21963
+ headerEnabled: true,
21964
+ footerEnabled: true,
21965
+ showPageNumbers: true,
21966
+ },
21967
+ },
21968
+ },
21969
+ ],
21970
+ defaultLayoutId: 'table',
21971
+ },
21972
+ ];
21973
+ //#endregion
21974
+ //#region ---- Providers ----
21975
+ class AXCLogReportCategoryProvider {
21976
+ async getList(parentId) {
21977
+ if (!parentId)
21978
+ return LOG_REPORT_CATEGORIES.filter((c) => !c.parentId);
21979
+ return LOG_REPORT_CATEGORIES.filter((c) => c.parentId === parentId);
21980
+ }
21981
+ async getById(id) {
21982
+ return LOG_REPORT_CATEGORIES.find((c) => c.id === id);
21983
+ }
21984
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.8", ngImport: i0, type: AXCLogReportCategoryProvider, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
21985
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.1.8", ngImport: i0, type: AXCLogReportCategoryProvider }); }
21986
+ }
21987
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.8", ngImport: i0, type: AXCLogReportCategoryProvider, decorators: [{
21988
+ type: Injectable
21989
+ }] });
21990
+ class AXCLogReportDefinitionProvider {
21991
+ async getList(categoryId) {
21992
+ return LOG_REPORT_DEFINITIONS.filter((r) => r.categoryIds.includes(categoryId));
21993
+ }
21994
+ async getById(id) {
21995
+ return LOG_REPORT_DEFINITIONS.find((r) => r.id === id);
21996
+ }
21997
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.8", ngImport: i0, type: AXCLogReportDefinitionProvider, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
21998
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.1.8", ngImport: i0, type: AXCLogReportDefinitionProvider }); }
21999
+ }
22000
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.8", ngImport: i0, type: AXCLogReportDefinitionProvider, decorators: [{
22001
+ type: Injectable
22002
+ }] });
22003
+ const AXC_LOG_REPORT_CATEGORY_PROVIDER = {
22004
+ provide: AXP_REPORT_CATEGORY_PROVIDER,
22005
+ useClass: AXCLogReportCategoryProvider,
22006
+ multi: true,
22007
+ };
22008
+ const AXC_LOG_REPORT_DEFINITION_PROVIDER = {
22009
+ provide: AXP_REPORT_DEFINITION_PROVIDER,
22010
+ useClass: AXCLogReportDefinitionProvider,
22011
+ multi: true,
22012
+ };
22013
+
20849
22014
  class AXCLogManagementMockModule {
20850
22015
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.8", ngImport: i0, type: AXCLogManagementMockModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
20851
22016
  static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.1.8", ngImport: i0, type: AXCLogManagementMockModule }); }
20852
22017
  static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "20.1.8", ngImport: i0, type: AXCLogManagementMockModule, providers: [
20853
22018
  { provide: AXP_DATA_SEEDER_TOKEN, useClass: AXMLogDataSeeder, multi: true },
22019
+ AXC_LOG_REPORT_CATEGORY_PROVIDER,
22020
+ AXC_LOG_REPORT_DEFINITION_PROVIDER,
20854
22021
  ] }); }
20855
22022
  }
20856
22023
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.8", ngImport: i0, type: AXCLogManagementMockModule, decorators: [{
@@ -20861,6 +22028,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.8", ngImpor
20861
22028
  declarations: [],
20862
22029
  providers: [
20863
22030
  { provide: AXP_DATA_SEEDER_TOKEN, useClass: AXMLogDataSeeder, multi: true },
22031
+ AXC_LOG_REPORT_CATEGORY_PROVIDER,
22032
+ AXC_LOG_REPORT_DEFINITION_PROVIDER,
20864
22033
  ],
20865
22034
  }]
20866
22035
  }] });
@@ -21070,6 +22239,177 @@ const BUSINESS_UNIT_TYPES_MOCK = [
21070
22239
  { id: uuid$i(), title: 'Branch', code: 'branch', isLocationBased: true },
21071
22240
  ];
21072
22241
 
22242
+ function generatePositionsCategory() {
22243
+ const categories = [];
22244
+ const roots = ['Engineering Positions', 'Technical Leadership', 'Product Positions', 'Operations', 'Business Functions', 'Executive Leadership'];
22245
+ const ids = new Map();
22246
+ roots.forEach((title) => {
22247
+ const id = AXPDataGenerator.uuid();
22248
+ ids.set(title, id);
22249
+ const descriptionMap = {
22250
+ 'Engineering Positions': 'All engineering role families',
22251
+ 'Technical Leadership': 'Leadership tracks within technology',
22252
+ 'Product Positions': 'Roles related to product management & design',
22253
+ Operations: 'IT, Support and Security positions',
22254
+ 'Business Functions': 'Sales, Marketing and BD roles',
22255
+ 'Executive Leadership': 'C-level and executive roles',
22256
+ };
22257
+ categories.push({ id, title, description: descriptionMap[title] ?? '', childCount: 0 });
22258
+ });
22259
+ const children = [
22260
+ { parent: 'Engineering Positions', children: ['Frontend Engineering', 'Backend Engineering', 'Mobile Engineering', 'Quality Engineering'] },
22261
+ { parent: 'Technical Leadership', children: ['Engineering Management', 'Technical Architecture', 'DevOps Leadership'] },
22262
+ { parent: 'Product Positions', children: ['Product Management', 'UX/UI Design', 'Product Analytics'] },
22263
+ { parent: 'Operations', children: ['IT Operations', 'Technical Support', 'Security Operations', 'Health, Safety & Environment'] },
22264
+ { parent: 'Business Functions', children: ['Sales', 'Marketing', 'Business Development'] },
22265
+ { parent: 'Executive Leadership', children: ['C-Suite', 'Board Members', 'Corporate Strategy'] },
22266
+ ];
22267
+ children.forEach(({ parent, children }) => {
22268
+ const parentId = ids.get(parent);
22269
+ if (!parentId)
22270
+ return;
22271
+ children.forEach((title) => {
22272
+ const id = AXPDataGenerator.uuid();
22273
+ ids.set(title, id);
22274
+ const descriptionMap = {
22275
+ 'Frontend Engineering': 'Client-side engineering track',
22276
+ 'Backend Engineering': 'Server-side engineering track',
22277
+ 'Mobile Engineering': 'Mobile application engineering track',
22278
+ 'Quality Engineering': 'Testing and QA track',
22279
+ 'Engineering Management': 'People and delivery leadership track',
22280
+ 'Technical Architecture': 'Architecture and system design track',
22281
+ 'DevOps Leadership': 'Reliability and platform engineering track',
22282
+ 'Product Management': 'Product strategy and delivery track',
22283
+ 'UX/UI Design': 'User experience and interface design track',
22284
+ 'Product Analytics': 'Data-driven product insights track',
22285
+ 'IT Operations': 'IT and infrastructure operations track',
22286
+ 'Technical Support': 'Customer and internal support track',
22287
+ 'Security Operations': 'Cybersecurity and defense track',
22288
+ Sales: 'Sales roles and career track',
22289
+ Marketing: 'Marketing roles and career track',
22290
+ 'Business Development': 'Partnerships and growth roles',
22291
+ 'C-Suite': 'Executive leadership team',
22292
+ 'Board Members': 'Corporate board members',
22293
+ 'Corporate Strategy': 'Corporate planning and strategy',
22294
+ };
22295
+ categories.push({ id, title, description: descriptionMap[title] ?? '', parentId, childCount: 0 });
22296
+ });
22297
+ const parentObj = categories.find((c) => c.id === parentId);
22298
+ if (parentObj)
22299
+ parentObj.childCount = children.length;
22300
+ });
22301
+ return categories;
22302
+ }
22303
+ const POSITIONS_CATEGORY_MOCK = generatePositionsCategory();
22304
+ function generatePositions() {
22305
+ const positions = [];
22306
+ const categories = POSITIONS_CATEGORY_MOCK;
22307
+ const childPositions = [
22308
+ { parent: 'Frontend Engineering', children: ['Junior Frontend Engineer', 'Frontend Engineer'] },
22309
+ { parent: 'Backend Engineering', children: ['Junior Backend Engineer', 'Backend Engineer'] },
22310
+ { parent: 'Mobile Engineering', children: ['Junior Mobile Developer', 'Mobile Developer', 'Senior Mobile Developer', 'Mobile Architect'] },
22311
+ { parent: 'Quality Engineering', children: ['QA Analyst', 'QA Engineer', 'Senior QA Engineer', 'QA Manager'] },
22312
+ { parent: 'Engineering Management', children: ['Engineering Team Lead', 'Engineering Manager', 'Director of Engineering', 'VP of Engineering'] },
22313
+ { parent: 'Product Management', children: ['Associate Product Manager', 'Product Manager', 'Senior Product Manager', 'Director of Product'] },
22314
+ { parent: 'UX/UI Design', children: ['UX Designer', 'UI Designer', 'Senior UX Designer', 'UX Design Manager'] },
22315
+ { parent: 'IT Operations', children: ['IT Support Specialist', 'Systems Administrator'] },
22316
+ { parent: 'Sales', children: ['Sales Associate', 'Account Executive', 'Sales Manager', 'VP of Sales'] },
22317
+ { parent: 'C-Suite', children: ['CTO', 'CEO', 'CFO', 'COO'] },
22318
+ { parent: 'DevOps Leadership', children: ['DevOps Engineer', 'Senior DevOps Engineer', 'DevOps Manager', 'Director of DevOps'] },
22319
+ { parent: 'Health, Safety & Environment', children: ['HSE Officer', 'Safety Officer', 'Environmental Specialist', 'HSE Manager'] },
22320
+ { parent: 'Engineering Management', children: ['Production Supervisor'] },
22321
+ { parent: 'Operations', children: ['Maintenance Technician', 'Maintenance Engineer', 'Quality Inspector', 'Quality Engineer', 'Procurement Specialist', 'Warehouse Associate', 'Warehouse Supervisor', 'Production Planner'] },
22322
+ ];
22323
+ // Position descriptions mapping
22324
+ const positionDescriptions = {
22325
+ // Frontend Engineering
22326
+ '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.',
22327
+ 'Frontend Engineer': 'Mid-level frontend developer who builds responsive web applications, implements UI/UX designs, and collaborates with design and backend teams.',
22328
+ 'Senior Frontend Engineer': 'Experienced frontend developer who leads technical decisions, mentors junior developers, and architects scalable frontend solutions.',
22329
+ 'Frontend Architect': 'Senior technical leader responsible for frontend architecture decisions, performance optimization, and setting technical standards for the frontend team.',
22330
+ // Backend Engineering
22331
+ 'Junior Backend Engineer': 'Entry-level backend developer focused on building server-side logic, APIs, and database interactions. Learns backend technologies and best practices.',
22332
+ 'Backend Engineer': 'Mid-level backend developer who designs and implements server-side applications, APIs, and database schemas.',
22333
+ 'Senior Backend Engineer': 'Experienced backend developer who leads technical decisions, optimizes system performance, and mentors junior developers.',
22334
+ 'Backend Architect': 'Senior technical leader responsible for backend architecture, system design, and technical strategy for server-side systems.',
22335
+ // Mobile Engineering
22336
+ 'Junior Mobile Developer': 'Entry-level mobile developer focused on building native or cross-platform mobile applications. Learns mobile development frameworks and best practices.',
22337
+ 'Mobile Developer': 'Mid-level mobile developer who creates mobile apps, implements features, and ensures app performance and user experience.',
22338
+ 'Senior Mobile Developer': 'Experienced mobile developer who leads mobile development initiatives, optimizes app performance, and mentors junior developers.',
22339
+ 'Mobile Architect': 'Senior technical leader responsible for mobile architecture decisions, platform strategy, and technical standards for mobile development.',
22340
+ // Quality Engineering
22341
+ 'QA Analyst': 'Entry-level quality assurance professional who executes test plans, reports bugs, and ensures software quality through systematic testing.',
22342
+ 'QA Engineer': 'Mid-level QA professional who designs test strategies, automates testing processes, and collaborates with development teams.',
22343
+ 'Senior QA Engineer': 'Experienced QA professional who leads testing initiatives, implements quality processes, and mentors junior QA team members.',
22344
+ 'QA Manager': 'Senior leader responsible for managing the QA team, establishing quality standards, and ensuring overall software quality.',
22345
+ // Engineering Management
22346
+ 'Engineering Team Lead': 'Technical leader who manages a small engineering team, provides technical guidance, and ensures project delivery.',
22347
+ 'Engineering Manager': 'People manager responsible for team development, project planning, and technical decision-making for engineering teams.',
22348
+ 'Director of Engineering': 'Senior leader who manages multiple engineering teams, sets technical strategy, and drives engineering excellence.',
22349
+ 'VP of Engineering': 'Executive leader responsible for overall engineering strategy, team growth, and technical direction across the organization.',
22350
+ // Product Management
22351
+ 'Associate Product Manager': 'Entry-level product professional who supports product development, conducts research, and assists with product strategy.',
22352
+ 'Product Manager': 'Mid-level product professional who defines product vision, prioritizes features, and collaborates with cross-functional teams.',
22353
+ 'Senior Product Manager': 'Experienced product professional who leads product strategy, mentors junior PMs, and drives product success.',
22354
+ 'Director of Product': 'Senior leader responsible for product portfolio strategy, team leadership, and product vision across multiple products.',
22355
+ // UX/UI Design
22356
+ 'UX Designer': 'Design professional focused on user experience research, user flows, and creating intuitive user interfaces.',
22357
+ 'UI Designer': 'Visual designer who creates user interface designs, design systems, and ensures visual consistency across products.',
22358
+ 'Senior UX Designer': 'Experienced UX professional who leads design initiatives, mentors junior designers, and drives user experience strategy.',
22359
+ 'UX Design Manager': 'Senior leader responsible for managing the design team, establishing design processes, and ensuring design quality.',
22360
+ // IT Operations
22361
+ 'IT Support Specialist': 'Entry-level IT professional who provides technical support, troubleshoots issues, and maintains IT systems.',
22362
+ 'Systems Administrator': 'Mid-level IT professional who manages server infrastructure, implements security measures, and ensures system reliability.',
22363
+ // Sales
22364
+ 'Sales Associate': 'Entry-level sales professional who supports sales activities, qualifies leads, and assists with customer relationships.',
22365
+ 'Account Executive': 'Mid-level sales professional who manages customer accounts, drives sales growth, and builds client relationships.',
22366
+ 'Sales Manager': 'Senior sales professional who leads sales teams, develops sales strategies, and drives revenue growth.',
22367
+ 'VP of Sales': 'Executive leader responsible for overall sales strategy, team leadership, and revenue generation across the organization.',
22368
+ // C-Suite
22369
+ 'CTO': 'Chief Technology Officer responsible for technology strategy, innovation, and technical leadership across the organization.',
22370
+ 'CEO': 'Chief Executive Officer responsible for overall company strategy, leadership, and business success.',
22371
+ 'CFO': 'Chief Financial Officer responsible for financial strategy, planning, and financial operations.',
22372
+ 'COO': 'Chief Operating Officer responsible for operational excellence, process optimization, and day-to-day business operations.',
22373
+ // DevOps Leadership
22374
+ 'DevOps Engineer': 'Mid-level DevOps professional who automates deployment processes, manages infrastructure, and ensures system reliability.',
22375
+ 'Senior DevOps Engineer': 'Experienced DevOps professional who leads infrastructure initiatives, optimizes deployment processes, and mentors junior team members.',
22376
+ 'DevOps Manager': 'Senior leader responsible for managing DevOps teams, establishing best practices, and driving operational excellence.',
22377
+ 'Director of DevOps': 'Senior leader responsible for DevOps strategy, infrastructure planning, and technical leadership for operations teams.',
22378
+ // Core Industrial Operations
22379
+ 'Production Supervisor': 'Leads production lines and teams, manages shift performance, and ensures production targets and quality standards are met.',
22380
+ 'Maintenance Technician': 'Executes routine and corrective maintenance tasks to ensure equipment uptime.',
22381
+ 'Maintenance Engineer': 'Plans maintenance strategies, analyzes failures, and drives reliability improvements.',
22382
+ 'Quality Inspector': 'Performs incoming, in-process, and final inspections to ensure product conformance.',
22383
+ 'Quality Engineer': 'Develops control plans, handles nonconformances, and leads continuous improvement initiatives.',
22384
+ 'Procurement Specialist': 'Sources materials, negotiates contracts, and manages purchase orders.',
22385
+ 'Warehouse Associate': 'Handles receiving, storage, picking, packing, and shipping operations.',
22386
+ 'Warehouse Supervisor': 'Oversees warehouse staff and processes, ensuring accuracy and on-time shipments.',
22387
+ 'Production Planner': 'Creates production schedules, coordinates materials and capacity, and monitors adherence.',
22388
+ // Health, Safety & Environment
22389
+ 'HSE Officer': 'Professional supporting health and safety initiatives, audits, and safety training across operations.',
22390
+ 'Safety Officer': 'Specialist enforcing safety standards, conducting inspections, and coordinating incident investigations.',
22391
+ 'Environmental Specialist': 'Professional overseeing environmental compliance, waste management, and sustainability reporting.',
22392
+ 'HSE Manager': 'Leader managing HSE programs, regulatory compliance, and continuous improvement in safety performance.'
22393
+ };
22394
+ childPositions.forEach(({ parent, children }) => {
22395
+ const parentObj = categories.find((c) => c.title === parent);
22396
+ if (!parentObj)
22397
+ return;
22398
+ children.forEach((title) => {
22399
+ positions.push({
22400
+ id: AXPDataGenerator.uuid(),
22401
+ title,
22402
+ description: positionDescriptions[title] || 'Professional position with specific responsibilities and requirements.',
22403
+ categoryIds: [parentObj.id],
22404
+ categories: [{ id: parentObj.id, title: parentObj.title }],
22405
+ isManager: /(Manager|Director|Lead|VP|Chief|Head)/i.test(title),
22406
+ });
22407
+ });
22408
+ });
22409
+ return positions;
22410
+ }
22411
+ const POSITIONS_MOCK = generatePositions();
22412
+
21073
22413
  const uuid$h = AXPDataGenerator.uuid;
21074
22414
  const TYPE = {
21075
22415
  division: BUSINESS_UNIT_TYPES_MOCK.find(t => t.code === 'division'),
@@ -21094,6 +22434,13 @@ const DE_BAV = regionBy('state', 'BAV');
21094
22434
  const MUNICH = regionBy('city', 'MUNICH');
21095
22435
  const BUSINESS_UNITS_MOCK = (() => {
21096
22436
  const items = [];
22437
+ function positionsByTitles(titles) {
22438
+ const map = new Map();
22439
+ POSITIONS_MOCK.forEach(p => map.set(p.title, { id: p.id, title: p.title }));
22440
+ const refs = titles.map(t => map.get(t)).filter(Boolean);
22441
+ const ids = refs.map(r => r.id);
22442
+ return { positionIds: ids, positions: refs };
22443
+ }
21097
22444
  // Divisions (top-level)
21098
22445
  const divisionOps = {
21099
22446
  id: uuid$h(),
@@ -21109,6 +22456,7 @@ const BUSINESS_UNITS_MOCK = (() => {
21109
22456
  country: US,
21110
22457
  state: US_CA,
21111
22458
  city: LA,
22459
+ ...positionsByTitles(['Maintenance Engineer', 'Maintenance Technician', 'Quality Engineer', 'Quality Inspector', 'Production Supervisor', 'HSE Manager'])
21112
22460
  };
21113
22461
  const divisionSales = {
21114
22462
  id: uuid$h(),
@@ -21124,6 +22472,7 @@ const BUSINESS_UNITS_MOCK = (() => {
21124
22472
  country: AU,
21125
22473
  state: AU_NSW,
21126
22474
  city: SYDNEY,
22475
+ ...positionsByTitles(['Sales Associate', 'Account Executive', 'Sales Manager', 'VP of Sales'])
21127
22476
  };
21128
22477
  const divisionEngineering = {
21129
22478
  id: uuid$h(),
@@ -21139,6 +22488,7 @@ const BUSINESS_UNITS_MOCK = (() => {
21139
22488
  country: DE,
21140
22489
  state: DE_BAV,
21141
22490
  city: MUNICH,
22491
+ ...positionsByTitles(['Frontend Engineer', 'Backend Engineer', 'Engineering Manager', 'Director of Engineering'])
21142
22492
  };
21143
22493
  items.push(divisionOps, divisionSales, divisionEngineering);
21144
22494
  // Departments under Operations
@@ -21150,6 +22500,7 @@ const BUSINESS_UNITS_MOCK = (() => {
21150
22500
  type: { id: TYPE.department.id, title: TYPE.department.title },
21151
22501
  parentId: divisionOps.id,
21152
22502
  parent: { id: divisionOps.id, title: divisionOps.title },
22503
+ ...positionsByTitles(['HSE Officer', 'Safety Officer', 'Environmental Specialist', 'HSE Manager'])
21153
22504
  };
21154
22505
  const depQuality = {
21155
22506
  id: uuid$h(),
@@ -21159,6 +22510,7 @@ const BUSINESS_UNITS_MOCK = (() => {
21159
22510
  type: { id: TYPE.department.id, title: TYPE.department.title },
21160
22511
  parentId: divisionOps.id,
21161
22512
  parent: { id: divisionOps.id, title: divisionOps.title },
22513
+ ...positionsByTitles(['QA Analyst', 'QA Engineer', 'Senior QA Engineer', 'QA Manager', 'Quality Inspector', 'Quality Engineer'])
21162
22514
  };
21163
22515
  const depMaintenance = {
21164
22516
  id: uuid$h(),
@@ -21168,6 +22520,7 @@ const BUSINESS_UNITS_MOCK = (() => {
21168
22520
  type: { id: TYPE.department.id, title: TYPE.department.title },
21169
22521
  parentId: divisionOps.id,
21170
22522
  parent: { id: divisionOps.id, title: divisionOps.title },
22523
+ ...positionsByTitles(['Maintenance Technician', 'Maintenance Engineer'])
21171
22524
  };
21172
22525
  items.push(depHSE, depQuality, depMaintenance);
21173
22526
  // Departments under Engineering
@@ -21179,6 +22532,7 @@ const BUSINESS_UNITS_MOCK = (() => {
21179
22532
  type: { id: TYPE.department.id, title: TYPE.department.title },
21180
22533
  parentId: divisionEngineering.id,
21181
22534
  parent: { id: divisionEngineering.id, title: divisionEngineering.title },
22535
+ ...positionsByTitles(['DevOps Engineer', 'Senior DevOps Engineer', 'Engineering Team Lead', 'Director of DevOps'])
21182
22536
  };
21183
22537
  const depProduct = {
21184
22538
  id: uuid$h(),
@@ -21188,6 +22542,7 @@ const BUSINESS_UNITS_MOCK = (() => {
21188
22542
  type: { id: TYPE.department.id, title: TYPE.department.title },
21189
22543
  parentId: divisionEngineering.id,
21190
22544
  parent: { id: divisionEngineering.id, title: divisionEngineering.title },
22545
+ ...positionsByTitles(['Associate Product Manager', 'Product Manager', 'Senior Product Manager', 'UX Designer'])
21191
22546
  };
21192
22547
  items.push(depPlatform, depProduct);
21193
22548
  // Branches (location-based) under cities
@@ -21205,6 +22560,7 @@ const BUSINESS_UNITS_MOCK = (() => {
21205
22560
  country: US,
21206
22561
  state: US_CA,
21207
22562
  city: LA,
22563
+ ...positionsByTitles(['Sales Associate', 'Account Executive'])
21208
22564
  };
21209
22565
  const branchSF = {
21210
22566
  id: uuid$h(),
@@ -21220,6 +22576,7 @@ const BUSINESS_UNITS_MOCK = (() => {
21220
22576
  country: US,
21221
22577
  state: US_CA,
21222
22578
  city: SF,
22579
+ ...positionsByTitles(['Sales Associate', 'Account Executive'])
21223
22580
  };
21224
22581
  const branchSydney = {
21225
22582
  id: uuid$h(),
@@ -21235,6 +22592,7 @@ const BUSINESS_UNITS_MOCK = (() => {
21235
22592
  country: AU,
21236
22593
  state: AU_NSW,
21237
22594
  city: SYDNEY,
22595
+ ...positionsByTitles(['Sales Associate', 'Account Executive'])
21238
22596
  };
21239
22597
  items.push(branchLA, branchSF, branchSydney);
21240
22598
  return items;
@@ -21254,6 +22612,171 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.8", ngImpor
21254
22612
  type: Injectable
21255
22613
  }] });
21256
22614
 
22615
+ class LocationOrgChartBuilder {
22616
+ build(context) {
22617
+ const { root, indices, helpers, includeEmployees, orgRootConfig } = context;
22618
+ for (const bu of context.data.businessUnits) {
22619
+ const type = indices.buTypeById.get(bu.typeId);
22620
+ const typeCode = type?.code ?? '';
22621
+ const buNodeType = typeCode === 'division' ? AXMOrgChartNodeType.Division :
22622
+ typeCode === 'department' ? AXMOrgChartNodeType.Department :
22623
+ AXMOrgChartNodeType.Branch;
22624
+ const countryNode = helpers.ensureCountry(bu.country);
22625
+ const stateNode = helpers.ensureState(countryNode, bu.state);
22626
+ const cityNode = helpers.ensureCity(stateNode, bu.city);
22627
+ const buAssignments = indices.assignmentsByBU.get(String(bu.id)) || [];
22628
+ const children = includeEmployees ? helpers.buildPositionNodes(buAssignments) : [];
22629
+ const buNode = {
22630
+ id: AXPDataGenerator.uuid(),
22631
+ title: bu.title,
22632
+ description: bu.description,
22633
+ type: buNodeType,
22634
+ icon: typeCode === 'division' ? 'fa-sitemap' : typeCode === 'department' ? 'fa-building-user' : 'fa-network-wired',
22635
+ entity: { id: bu.id, source: orgRootConfig.entities.businessUnit.source },
22636
+ children,
22637
+ };
22638
+ if (cityNode) {
22639
+ cityNode.children = cityNode.children || [];
22640
+ cityNode.children.push(buNode);
22641
+ }
22642
+ else {
22643
+ root.children.push(buNode);
22644
+ }
22645
+ }
22646
+ return root;
22647
+ }
22648
+ }
22649
+
22650
+ class StructureOrgChartBuilder {
22651
+ build(context) {
22652
+ const { root, indices, helpers, includeEmployees, orgRootConfig } = context;
22653
+ // Build BU hierarchy by parent reference if exists; otherwise group by type
22654
+ const childrenByParent = new Map();
22655
+ for (const bu of context.data.businessUnits) {
22656
+ const parentId = bu.parentId ?? undefined;
22657
+ const list = childrenByParent.get(parentId) || [];
22658
+ list.push(bu);
22659
+ childrenByParent.set(parentId, list);
22660
+ }
22661
+ const createBuNode = (bu) => {
22662
+ const type = indices.buTypeById.get(bu.typeId);
22663
+ const typeCode = type?.code ?? '';
22664
+ const buNodeType = typeCode === 'division' ? AXMOrgChartNodeType.Division :
22665
+ typeCode === 'department' ? AXMOrgChartNodeType.Department :
22666
+ AXMOrgChartNodeType.Branch;
22667
+ const buAssignments = indices.assignmentsByBU.get(String(bu.id)) || [];
22668
+ const children = includeEmployees ? helpers.buildPositionNodes(buAssignments) : [];
22669
+ const node = {
22670
+ id: AXPDataGenerator.uuid(),
22671
+ title: bu.title,
22672
+ description: bu.description,
22673
+ type: buNodeType,
22674
+ icon: typeCode === 'division' ? 'fa-sitemap' : typeCode === 'department' ? 'fa-building-user' : 'fa-network-wired',
22675
+ entity: { id: bu.id, source: orgRootConfig.entities.businessUnit.source },
22676
+ children,
22677
+ };
22678
+ const childrenList = childrenByParent.get(String(bu.id)) || [];
22679
+ for (const childBu of childrenList) {
22680
+ node.children = node.children || [];
22681
+ node.children.push(createBuNode(childBu));
22682
+ }
22683
+ return node;
22684
+ };
22685
+ // Roots: undefined parent or explicit null
22686
+ const rootCandidates = childrenByParent.get(undefined) || childrenByParent.get(null) || [];
22687
+ if (rootCandidates.length) {
22688
+ for (const top of rootCandidates) {
22689
+ root.children.push(createBuNode(top));
22690
+ }
22691
+ }
22692
+ else {
22693
+ // Fallback: group by type order Division -> Department -> Branch
22694
+ const divisions = context.data.businessUnits.filter(bu => (indices.buTypeById.get(bu.typeId)?.code ?? '') === 'division');
22695
+ const departments = context.data.businessUnits.filter(bu => (indices.buTypeById.get(bu.typeId)?.code ?? '') === 'department');
22696
+ const branches = context.data.businessUnits.filter(bu => (indices.buTypeById.get(bu.typeId)?.code ?? '') === 'branch');
22697
+ const addAll = (list) => list.forEach(bu => root.children.push(createBuNode(bu)));
22698
+ addAll(divisions);
22699
+ addAll(departments);
22700
+ addAll(branches);
22701
+ }
22702
+ return root;
22703
+ }
22704
+ }
22705
+
22706
+ /**
22707
+ * Reporting builder: builds a tree based on position reporting chain.
22708
+ * Assumptions:
22709
+ * - Prefer using `position.reportsToPositionId` if exists.
22710
+ * - Fallback: derive manager from assignments by `managerPositionId` or similar if present; otherwise flat under BU.
22711
+ */
22712
+ class ReportingOrgChartBuilder {
22713
+ build(context) {
22714
+ const { root, indices } = context;
22715
+ // Map child positions by manager position id
22716
+ const childrenByManager = new Map();
22717
+ for (const position of context.data.positions) {
22718
+ const reportsTo = position.reportsToPositionId ?? undefined;
22719
+ const list = childrenByManager.get(reportsTo) || [];
22720
+ list.push(position.id);
22721
+ childrenByManager.set(reportsTo, list);
22722
+ }
22723
+ const createPositionNode = (positionId) => {
22724
+ const pos = indices.positionById.get(positionId);
22725
+ const assignmentsInAllBU = this.collectAssignmentsForPosition(context, positionId);
22726
+ const rep = context.helpers.chooseRepresentativeAssignment(assignmentsInAllBU);
22727
+ const employee = rep ? context.indices.employeeById.get(rep.employeeId) : null;
22728
+ const employeeName = employee?.party?.displayName ?? employee?.fullName ?? null;
22729
+ const employeeRole = employee?.role?.title ?? null;
22730
+ const node = {
22731
+ id: AXPDataGenerator.uuid(),
22732
+ title: pos?.title ?? 'Position',
22733
+ subtitle: employeeName ?? 'Vacant',
22734
+ description: employeeName && employeeRole ? employeeRole : undefined,
22735
+ type: AXMOrgChartNodeType.Position,
22736
+ icon: 'fa-user-tie',
22737
+ entity: { id: positionId, source: context.orgRootConfig.entities.position.source },
22738
+ children: [],
22739
+ };
22740
+ const children = childrenByManager.get(positionId) || [];
22741
+ for (const childPosId of children) {
22742
+ node.children.push(createPositionNode(childPosId));
22743
+ }
22744
+ return node;
22745
+ };
22746
+ // Top managers: positions without a manager
22747
+ const tops = childrenByManager.get(undefined) || [];
22748
+ for (const posId of tops) {
22749
+ root.children.push(createPositionNode(posId));
22750
+ }
22751
+ return root;
22752
+ }
22753
+ collectAssignmentsForPosition(context, positionId) {
22754
+ const result = [];
22755
+ for (const [_buId, list] of context.indices.assignmentsByBU.entries()) {
22756
+ for (const a of list) {
22757
+ if (String(a.positionId) !== String(positionId))
22758
+ continue;
22759
+ if (!context.helpers.isActiveAssignment(a, context.now, context.preferPrimary))
22760
+ continue;
22761
+ result.push(a);
22762
+ }
22763
+ }
22764
+ return result;
22765
+ }
22766
+ }
22767
+
22768
+ const createBuilder = (mode) => {
22769
+ switch (mode) {
22770
+ case 'structure':
22771
+ return new StructureOrgChartBuilder();
22772
+ case 'reporting':
22773
+ return new ReportingOrgChartBuilder();
22774
+ case 'location':
22775
+ default:
22776
+ return new LocationOrgChartBuilder();
22777
+ }
22778
+ };
22779
+
21257
22780
  class AXMOrgChartGenerateCommand {
21258
22781
  constructor() {
21259
22782
  //#region ---- Services & Dependencies ----
@@ -21265,6 +22788,7 @@ class AXMOrgChartGenerateCommand {
21265
22788
  async execute(input) {
21266
22789
  const includeEmployees = input?.includeEmployees !== false;
21267
22790
  const preferPrimary = input?.preferPrimary !== false;
22791
+ const mode = input?.mode ?? 'location';
21268
22792
  const now = new Date();
21269
22793
  // Build root from tenant (virtual root)
21270
22794
  const tenant = this.session.tenant;
@@ -21396,35 +22920,39 @@ class AXMOrgChartGenerateCommand {
21396
22920
  }
21397
22921
  return nodes;
21398
22922
  };
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
- }
22923
+ // Build context for selected builder
22924
+ const ctx = {
22925
+ now,
22926
+ includeEmployees,
22927
+ preferPrimary,
22928
+ orgRootConfig: RootConfig$c,
22929
+ hcmRootConfig: RootConfig$d,
22930
+ root,
22931
+ data: {
22932
+ businessUnits: businessUnits,
22933
+ businessUnitTypes: businessUnitTypes,
22934
+ positions: positions,
22935
+ employees: employees,
22936
+ assignments: assignments,
22937
+ },
22938
+ indices: {
22939
+ businessUnitById,
22940
+ buTypeById,
22941
+ positionById,
22942
+ employeeById,
22943
+ assignmentsByBU,
22944
+ },
22945
+ helpers: {
22946
+ isActiveAssignment: this.isActiveAssignment.bind(this),
22947
+ chooseRepresentativeAssignment,
22948
+ ensureCountry,
22949
+ ensureState,
22950
+ ensureCity,
22951
+ buildPositionNodes,
22952
+ },
22953
+ };
22954
+ const builder = createBuilder(mode);
22955
+ builder.build(ctx);
21428
22956
  // Persist as a new version
21429
22957
  const version = this.generateVersion();
21430
22958
  const id = await this.storage.insertOne(RootConfig$c.entities.chart.source, {
@@ -21842,177 +23370,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.8", ngImpor
21842
23370
  type: Injectable
21843
23371
  }] });
21844
23372
 
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
23373
  class AXMPositionDataSeeder {
22017
23374
  constructor() {
22018
23375
  this.storageService = inject(AXPEntityStorageService);
@@ -23110,8 +24467,10 @@ const AXCMockOrgChartEventListener = {
23110
24467
  return;
23111
24468
  // Relevant entities that should trigger org chart regeneration
23112
24469
  const relevantEntities = [
24470
+ // Organization Management
23113
24471
  `${RootConfig$c.module.name}.${RootConfig$c.entities.businessUnit.name}`,
23114
24472
  `${RootConfig$c.module.name}.${RootConfig$c.entities.position.name}`,
24473
+ // Human Capital Management
23115
24474
  `${RootConfig$d.module.name}.${RootConfig$d.entities.employee.name}`,
23116
24475
  `${RootConfig$d.module.name}.${RootConfig$d.entities.positionAssignment.name}`
23117
24476
  ];
@@ -23121,7 +24480,7 @@ const AXCMockOrgChartEventListener = {
23121
24480
  try {
23122
24481
  // Execute org chart generation command via command service
23123
24482
  const commandService = inject(AXPCommandService);
23124
- const result = await commandService.execute('organization.chart.generate', {
24483
+ const result = await commandService.execute('OrganizationManagement.OrgChart:Generate', {
23125
24484
  includeEmployees: true,
23126
24485
  preferPrimary: true
23127
24486
  });
@@ -23188,7 +24547,7 @@ class AXCOrganizationManagementMockModule {
23188
24547
  },
23189
24548
  // Commands
23190
24549
  provideCommandSetups([
23191
- { key: 'organization.chart.generate', command: () => AXMOrgChartGenerateCommand },
24550
+ { key: 'OrganizationManagement.OrgChart:Generate', command: () => AXMOrgChartGenerateCommand },
23192
24551
  ]),
23193
24552
  ] }); }
23194
24553
  }
@@ -23235,7 +24594,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.8", ngImpor
23235
24594
  },
23236
24595
  // Commands
23237
24596
  provideCommandSetups([
23238
- { key: 'organization.chart.generate', command: () => AXMOrgChartGenerateCommand },
24597
+ { key: 'OrganizationManagement.OrgChart:Generate', command: () => AXMOrgChartGenerateCommand },
23239
24598
  ]),
23240
24599
  ],
23241
24600
  }]
@@ -23516,7 +24875,12 @@ const POSITION_ASSIGNMENTS_MOCK = (() => {
23516
24875
  if (assignedEmployeeIds.has(candidate.id)) {
23517
24876
  return; // skip creating another active primary assignment for the same employee
23518
24877
  }
23519
- const position = managerPositions.length ? pick(managerPositions) : pick(POSITIONS_MOCK);
24878
+ // Prefer a position that is listed for this business unit if available
24879
+ const buPositions = bu.positionIds ?? [];
24880
+ const candidatePositions = (buPositions.length
24881
+ ? POSITIONS_MOCK.filter(p => buPositions.includes(p.id))
24882
+ : managerPositions.length ? managerPositions : POSITIONS_MOCK);
24883
+ const position = pick(candidatePositions);
23520
24884
  rows.push({
23521
24885
  id: uuid$c(),
23522
24886
  employeeId: candidate.id,
@@ -27251,11 +28615,11 @@ class AXMReportMockDataService {
27251
28615
  generateMockDataForReport(reportDefinition, parameters, pageSize) {
27252
28616
  const reportTitle = reportDefinition.title.toLowerCase();
27253
28617
  const reportId = reportDefinition.id;
27254
- // Generate data based on report type
28618
+ // Generate data based on report type - check reportId first for log management reports
27255
28619
  if (reportId.includes('log-management.report.audit-trail') ||
27256
28620
  reportId.includes('log-management.report.login-logs') ||
27257
28621
  reportId.includes('log-management.report.change-password-logs') ||
27258
- reportId.includes('log-management.report.identity-audit-log-error-logs')) {
28622
+ reportId.includes('log-management.report.identity-error-logs')) {
27259
28623
  return this.generateAuditTrailData(reportDefinition, parameters, pageSize);
27260
28624
  }
27261
28625
  else if (reportTitle.includes('balance sheet') || reportTitle.includes('financial')) {
@@ -27282,14 +28646,41 @@ class AXMReportMockDataService {
27282
28646
  // Use imported log mock data
27283
28647
  const baseData = logMock;
27284
28648
  const data = [];
28649
+ // For Identity Error Logs, filter to only include failed operations
28650
+ let filteredBaseData = baseData;
28651
+ if (reportDefinition.id.includes('identity-error-logs')) {
28652
+ filteredBaseData = baseData.filter(item => item['httpStatus'] === 'failed' ||
28653
+ item['httpStatusCode'] >= 400);
28654
+ }
28655
+ // If no filtered data available, use all data
28656
+ if (filteredBaseData.length === 0) {
28657
+ filteredBaseData = baseData;
28658
+ }
27285
28659
  // Duplicate base data to reach pageSize
27286
28660
  for (let i = 0; i < pageSize; i++) {
27287
- const baseItem = baseData[i % baseData.length];
28661
+ const baseItem = filteredBaseData[i % filteredBaseData.length];
27288
28662
  const duplicatedItem = {
27289
- ...baseItem,
27290
- id: AXPDataGenerator.uuid(), // Generate new ID for each item
27291
- executionTime: this.getRandomPastDate(30), // Randomize execution time
27292
- correlationId: AXPDataGenerator.uuid(), // Generate new correlation ID
28663
+ id: AXPDataGenerator.uuid(),
28664
+ executionTime: this.getRandomPastDate(30),
28665
+ userName: baseItem['userName'] || 'Unknown User',
28666
+ tenantName: baseItem['tenantName'] || 'ark',
28667
+ httpMethod: baseItem['httpMethod'] || 'GET',
28668
+ url: baseItem['url'] || '/unknown',
28669
+ httpStatusCode: baseItem['httpStatusCode'] || 200,
28670
+ executionDuration: baseItem['executionDuration'] || 0,
28671
+ clientIpAddress: baseItem['clientIpAddress'] || '0.0.0.0',
28672
+ clientName: baseItem['clientName'] || 'Unknown Client',
28673
+ correlationId: AXPDataGenerator.uuid(),
28674
+ comments: baseItem['comments'] || '',
28675
+ exceptions: baseItem['exceptions'] || '',
28676
+ httpStatus: baseItem['httpStatus'] || 'unknown',
28677
+ applicationName: baseItem['applicationName'] || 'DemoApp',
28678
+ impersonatorUserName: baseItem['impersonatorUserName'] || null,
28679
+ // Include any other fields from baseItem
28680
+ ...Object.fromEntries(Object.entries(baseItem).filter(([key]) => !['id', 'executionTime', 'userName', 'tenantName', 'httpMethod', 'url',
28681
+ 'httpStatusCode', 'executionDuration', 'clientIpAddress', 'clientName',
28682
+ 'correlationId', 'comments', 'exceptions', 'httpStatus', 'applicationName',
28683
+ 'impersonatorUserName'].includes(key)))
27293
28684
  };
27294
28685
  data.push(duplicatedItem);
27295
28686
  }
@@ -27529,7 +28920,7 @@ class AXMReportExecuteCommand {
27529
28920
  else if (reportDefinition.id.includes('log-management.report.change-password-logs')) {
27530
28921
  filteredData = this.applyChangePasswordLogsFilters(allData, parameters);
27531
28922
  }
27532
- else if (reportDefinition.id.includes('log-management.report.identity-audit-log-error-logs')) {
28923
+ else if (reportDefinition.id.includes('log-management.report.identity-error-logs')) {
27533
28924
  filteredData = this.applyIdentityAuditLogErrorLogsFilters(allData, parameters);
27534
28925
  }
27535
28926
  // Debug logging
@@ -28057,7 +29448,7 @@ class AXMReportExecuteCommand {
28057
29448
  }
28058
29449
  }
28059
29450
  // Debug logging
28060
- console.log('🔍 Identity Audit Log Error Logs Filter Debug:', {
29451
+ console.log('🔍 Identity Error Logs Filter Debug:', {
28061
29452
  startDate,
28062
29453
  endDate,
28063
29454
  userNameFilter,
@@ -28609,6 +30000,56 @@ class AXCDeviceSessionService extends AXMDeviceSessionsServiceImpl {
28609
30000
  }
28610
30001
  }
28611
30002
 
30003
+ /**
30004
+ * Mock policies for seeding into the Mock (IndexedDB) backend.
30005
+ * This policy enforces readonly on entire records when control.isSystem === true.
30006
+ * Note: The policy record itself is marked as system via control.isSystem = true.
30007
+ */
30008
+ const mockPolicyDefinitions = [
30009
+ {
30010
+ id: AXPDataGenerator.uuid(),
30011
+ control: { isSystem: true },
30012
+ name: 'system-record-readonly',
30013
+ title: 'System Records Readonly',
30014
+ description: 'Make whole record readonly when control.isSystem is true.',
30015
+ permission: 'policy.system.readonly',
30016
+ scope: 'system',
30017
+ resource: {
30018
+ type: 'entity',
30019
+ target: '*',
30020
+ },
30021
+ rules: [
30022
+ {
30023
+ // Evaluated in middleware using AXPExpressionEvaluatorService
30024
+ // Available scope: context.{ op, entity, id, data, existing, result, eval }
30025
+ // Use context.eval to access data fields
30026
+ conditions: '{{ context.eval("control.isSystem") == true }}',
30027
+ effects: [
30028
+ // Apply readonly to the entire record (blocks write fields)
30029
+ { effect: 'readonly', target: '*' },
30030
+ // Block delete/update entirely for system records
30031
+ { effect: 'immutable', target: '*' },
30032
+ ],
30033
+ },
30034
+ ],
30035
+ },
30036
+ ];
30037
+
30038
+ class AXPSecurityManagementPolicyDataSeeder {
30039
+ constructor() {
30040
+ this.storageService = inject(AXPEntityStorageService);
30041
+ }
30042
+ async seed() {
30043
+ // Seed the predefined policies. The policy records themselves are marked as system.
30044
+ await this.storageService.initial(`${RootConfig.module.name}.${RootConfig.entities.policy.name}`, mockPolicyDefinitions);
30045
+ }
30046
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.8", ngImport: i0, type: AXPSecurityManagementPolicyDataSeeder, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
30047
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.1.8", ngImport: i0, type: AXPSecurityManagementPolicyDataSeeder }); }
30048
+ }
30049
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.8", ngImport: i0, type: AXPSecurityManagementPolicyDataSeeder, decorators: [{
30050
+ type: Injectable
30051
+ }] });
30052
+
28612
30053
  class AXCSecurityManagementMockModule {
28613
30054
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.8", ngImport: i0, type: AXCSecurityManagementMockModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
28614
30055
  static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.1.8", ngImport: i0, type: AXCSecurityManagementMockModule }); }
@@ -28628,6 +30069,11 @@ class AXCSecurityManagementMockModule {
28628
30069
  useClass: AXPSecurityManagementUserDataSeeder,
28629
30070
  multi: true,
28630
30071
  },
30072
+ {
30073
+ provide: AXP_DATA_SEEDER_TOKEN,
30074
+ useClass: AXPSecurityManagementPolicyDataSeeder,
30075
+ multi: true,
30076
+ },
28631
30077
  {
28632
30078
  provide: AXMDeviceSessionsService,
28633
30079
  useClass: AXCDeviceSessionService,
@@ -28656,6 +30102,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.8", ngImpor
28656
30102
  useClass: AXPSecurityManagementUserDataSeeder,
28657
30103
  multi: true,
28658
30104
  },
30105
+ {
30106
+ provide: AXP_DATA_SEEDER_TOKEN,
30107
+ useClass: AXPSecurityManagementPolicyDataSeeder,
30108
+ multi: true,
30109
+ },
28659
30110
  {
28660
30111
  provide: AXMDeviceSessionsService,
28661
30112
  useClass: AXCDeviceSessionService,
@@ -34088,12 +35539,129 @@ class AXCDexieEntityStorageService extends Dexie {
34088
35539
  if (request.sort && request.sort.length) {
34089
35540
  result = applySortArray(result, request.sort);
34090
35541
  }
34091
- result = applyFilterArray(result, request.filter ? [request.filter] : []);
35542
+ // Handle recursive category filtering
35543
+ if (request.filter && this.isCategoryFilter(request.filter)) {
35544
+ result = await this.applyRecursiveCategoryFilter(result, request.filter, entityName);
35545
+ }
35546
+ else {
35547
+ result = applyFilterArray(result, request.filter ? [request.filter] : []);
35548
+ }
35549
+ // Calculate childCount for category entities
35550
+ if (this.isCategoryEntity(entityName)) {
35551
+ result = await this.calculateChildCounts(result, entityName);
35552
+ }
34092
35553
  return Promise.resolve({
34093
35554
  total: result.length,
34094
35555
  items: result.slice(request.skip, (request.skip ?? 0) + (request.take ?? 0)),
34095
35556
  });
34096
35557
  }
35558
+ //#region ---- Private Helper Methods ----
35559
+ /**
35560
+ * Check if the entity is a category entity (ends with 'Category')
35561
+ */
35562
+ isCategoryEntity(entityName) {
35563
+ return entityName.endsWith('Category');
35564
+ }
35565
+ /**
35566
+ * Calculate childCount for each category entity
35567
+ */
35568
+ async calculateChildCounts(items, entityName) {
35569
+ return Promise.all(items.map(async (item) => {
35570
+ const childCount = await this.getDirectChildCount(item.id, entityName);
35571
+ return {
35572
+ ...item,
35573
+ childCount
35574
+ };
35575
+ }));
35576
+ }
35577
+ /**
35578
+ * Get the count of direct children for a category
35579
+ */
35580
+ async getDirectChildCount(categoryId, entityName) {
35581
+ const children = await this.table('entity-store')
35582
+ .where({ entityName })
35583
+ .filter((item) => item.parentId === categoryId)
35584
+ .toArray();
35585
+ return children.length;
35586
+ }
35587
+ /**
35588
+ * Check if the filter is a category filter (contains operator on categoryIds field)
35589
+ * Handles both simple filters and compound filters
35590
+ */
35591
+ isCategoryFilter(filter) {
35592
+ // Handle simple filter
35593
+ if (filter?.operator?.type === 'contains' &&
35594
+ (filter.field === 'categoryIds' || filter.field?.endsWith('Ids'))) {
35595
+ return true;
35596
+ }
35597
+ // Handle compound filter - check if any nested filter is a category filter
35598
+ if (filter?.logic && filter?.filters && Array.isArray(filter.filters)) {
35599
+ return filter.filters.some((nestedFilter) => nestedFilter?.operator?.type === 'contains' &&
35600
+ (nestedFilter.field === 'categoryIds' || nestedFilter.field?.endsWith('Ids')));
35601
+ }
35602
+ return false;
35603
+ }
35604
+ /**
35605
+ * Apply recursive category filtering - finds entities that belong to the category or any of its children
35606
+ */
35607
+ async applyRecursiveCategoryFilter(result, filter, entityName) {
35608
+ // Handle compound filter - find the category filter within it
35609
+ let categoryFilter = filter;
35610
+ let otherFilters = [];
35611
+ if (filter?.logic && filter?.filters && Array.isArray(filter.filters)) {
35612
+ // Find the category filter and collect other filters
35613
+ const categoryFilterIndex = filter.filters.findIndex((f) => f?.operator?.type === 'contains' &&
35614
+ (f.field === 'categoryIds' || f.field?.endsWith('Ids')));
35615
+ if (categoryFilterIndex !== -1) {
35616
+ categoryFilter = filter.filters[categoryFilterIndex];
35617
+ // Get all other filters (excluding the category filter)
35618
+ otherFilters = filter.filters.filter((_, index) => index !== categoryFilterIndex);
35619
+ }
35620
+ }
35621
+ if (!categoryFilter) {
35622
+ // Fallback to regular filtering if no category filter found
35623
+ return applyFilterArray(result, [filter]);
35624
+ }
35625
+ const categoryId = categoryFilter.value;
35626
+ const categoryField = categoryFilter.field;
35627
+ // Get all child category IDs recursively
35628
+ const allCategoryIds = await this.getAllChildCategoryIds(categoryId, entityName);
35629
+ // Filter results to include entities that belong to any of the collected category IDs
35630
+ let filteredResult = result.filter((item) => {
35631
+ const categoryIds = item[categoryField];
35632
+ if (!categoryIds)
35633
+ return false;
35634
+ // Handle both string and array formats
35635
+ const itemCategoryIds = Array.isArray(categoryIds) ? categoryIds : [categoryIds];
35636
+ // Check if any of the item's categories match any of the collected category IDs
35637
+ return itemCategoryIds.some((itemCategoryId) => allCategoryIds.includes(itemCategoryId));
35638
+ });
35639
+ // Apply other filters if they exist
35640
+ if (otherFilters.length > 0) {
35641
+ filteredResult = applyFilterArray(filteredResult, otherFilters);
35642
+ }
35643
+ return filteredResult;
35644
+ }
35645
+ /**
35646
+ * Recursively gets all child category IDs including the parent category itself
35647
+ */
35648
+ async getAllChildCategoryIds(categoryId, entityName) {
35649
+ const allIds = [categoryId];
35650
+ // Extract module name and entity name from entityName (e.g., "module.entity" -> "module" and "entity")
35651
+ const [moduleName, entityNameOnly] = entityName.split('.');
35652
+ const categoryEntityName = `${moduleName}.${entityNameOnly}Category`;
35653
+ // Get direct children
35654
+ const childrenResult = await this.table('entity-store').where({
35655
+ entityName: categoryEntityName
35656
+ }).toArray();
35657
+ const directChildren = childrenResult.filter((child) => child.parentId === categoryId);
35658
+ // Recursively get children of children
35659
+ for (const child of directChildren) {
35660
+ const childIds = await this.getAllChildCategoryIds(child.id, entityName);
35661
+ allIds.push(...childIds);
35662
+ }
35663
+ return allIds;
35664
+ }
34097
35665
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.8", ngImport: i0, type: AXCDexieEntityStorageService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
34098
35666
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.1.8", ngImport: i0, type: AXCDexieEntityStorageService }); }
34099
35667
  }
@@ -34119,7 +35687,13 @@ const auditLoggerMiddleware = {
34119
35687
  type: 'user',
34120
35688
  fullName: session.user?.title,
34121
35689
  }
34122
- }
35690
+ },
35691
+ /////
35692
+ isReadOnly: false,
35693
+ isHidden: false,
35694
+ isSystem: false,
35695
+ isImmutable: false,
35696
+ /////
34123
35697
  };
34124
35698
  }
34125
35699
  else if (ctx.op === 'update') {
@@ -34133,6 +35707,70 @@ const auditLoggerMiddleware = {
34133
35707
  },
34134
35708
  };
34135
35709
 
35710
+ const childCountMiddleware = {
35711
+ target: { ops: ['create', 'delete'], order: 20 },
35712
+ execute: async (ctx, next) => {
35713
+ // Check if entity name ends with "Category"
35714
+ if (!ctx.entityName.endsWith('Category')) {
35715
+ await next();
35716
+ return;
35717
+ }
35718
+ // For delete operations, get the entity data before deletion
35719
+ let entityDataBeforeDelete = null;
35720
+ if (ctx.op === 'delete') {
35721
+ try {
35722
+ entityDataBeforeDelete = await ctx.backend.getOne(ctx.entityName, ctx.id);
35723
+ }
35724
+ catch (error) {
35725
+ // Entity might not exist, continue anyway
35726
+ console.warn('Could not fetch entity before delete:', error);
35727
+ }
35728
+ }
35729
+ // Execute the operation first
35730
+ await next();
35731
+ // After successful operation, update childCount for parent categories
35732
+ await updateChildCountForParent(ctx, entityDataBeforeDelete);
35733
+ },
35734
+ };
35735
+ /**
35736
+ * Updates childCount for parent categories when a category entity is created, updated, or deleted
35737
+ */
35738
+ async function updateChildCountForParent(ctx, entityDataBeforeDelete) {
35739
+ try {
35740
+ let currentEntity = null;
35741
+ if (ctx.op === 'delete' && entityDataBeforeDelete) {
35742
+ // For delete operations, use the data we fetched before deletion
35743
+ currentEntity = entityDataBeforeDelete;
35744
+ }
35745
+ else {
35746
+ // For create operations, get the entity data after creation
35747
+ const id = ctx.result ?? ctx.data?.id ?? ctx.id;
35748
+ currentEntity = await ctx.backend.getOne(ctx.entityName, id);
35749
+ }
35750
+ if (!currentEntity || !currentEntity.parentId) {
35751
+ return; // No parent to update
35752
+ }
35753
+ // Count children for the parent category
35754
+ const childrenResult = await ctx.backend.query(ctx.entityName, {
35755
+ skip: 0,
35756
+ take: 1000, // Reasonable limit for counting
35757
+ filter: {
35758
+ field: 'parentId',
35759
+ operator: { type: 'equal' },
35760
+ value: currentEntity.parentId
35761
+ }
35762
+ });
35763
+ // Update parent's childCount
35764
+ await ctx.backend.updateOne(ctx.entityName, currentEntity.parentId, {
35765
+ childCount: childrenResult.items.length
35766
+ });
35767
+ }
35768
+ catch (error) {
35769
+ // Log error but don't fail the operation
35770
+ console.warn('Failed to update childCount:', error);
35771
+ }
35772
+ }
35773
+
34136
35774
  /**
34137
35775
  * File Cast Middleware - Handles file operations in entity storage
34138
35776
  *
@@ -34919,6 +36557,439 @@ const mergeDetailRelationMiddleware = {
34919
36557
  },
34920
36558
  };
34921
36559
 
36560
+ /**
36561
+ * resolve whether a policy matches current entity by wildcard (*) or exact name
36562
+ */
36563
+ function matchesEntity(target, entityName) {
36564
+ if (!target || target === '*')
36565
+ return true;
36566
+ return target === entityName;
36567
+ }
36568
+ /**
36569
+ * apply masking to a value using a simple standard mask
36570
+ */
36571
+ function maskValue(value) {
36572
+ if (value == null)
36573
+ return value;
36574
+ const str = String(value);
36575
+ if (str.length <= 4)
36576
+ return '****';
36577
+ return `${'*'.repeat(Math.max(0, str.length - 4))}${str.slice(-4)}`;
36578
+ }
36579
+ /**
36580
+ * remove fields from an object by dotted paths; supports single-level for now
36581
+ */
36582
+ function removeFields(obj, paths) {
36583
+ if (!obj || !paths?.length)
36584
+ return;
36585
+ // Helper: delete by dotted path (e.g., "a.b.c")
36586
+ const deleteByPath = (target, path) => {
36587
+ const parts = path.split('.');
36588
+ let cursor = target;
36589
+ for (let i = 0; i < parts.length - 1; i++) {
36590
+ const key = parts[i];
36591
+ if (cursor == null || typeof cursor !== 'object')
36592
+ return;
36593
+ cursor = cursor[key];
36594
+ }
36595
+ const lastKey = parts[parts.length - 1];
36596
+ if (cursor && typeof cursor === 'object' && Object.prototype.hasOwnProperty.call(cursor, lastKey)) {
36597
+ delete cursor[lastKey];
36598
+ }
36599
+ };
36600
+ // If wildcard present, remove all top-level fields
36601
+ if (paths.includes('*')) {
36602
+ for (const key of Object.keys(obj)) {
36603
+ delete obj[key];
36604
+ }
36605
+ }
36606
+ for (const p of paths) {
36607
+ if (!p || p === '*')
36608
+ continue;
36609
+ if (p.includes('.')) {
36610
+ deleteByPath(obj, p);
36611
+ }
36612
+ else if (Object.prototype.hasOwnProperty.call(obj, p)) {
36613
+ delete obj[p];
36614
+ }
36615
+ }
36616
+ }
36617
+ /**
36618
+ * set masked fields in object by dotted paths; supports single-level for now
36619
+ */
36620
+ function setMasked(obj, paths) {
36621
+ if (!obj || !paths?.length)
36622
+ return;
36623
+ // Helper: set mask by dotted path (e.g., "a.b.c")
36624
+ const maskByPath = (target, path) => {
36625
+ const parts = path.split('.');
36626
+ let cursor = target;
36627
+ for (let i = 0; i < parts.length - 1; i++) {
36628
+ const key = parts[i];
36629
+ if (cursor == null || typeof cursor !== 'object')
36630
+ return;
36631
+ cursor = cursor[key];
36632
+ }
36633
+ const lastKey = parts[parts.length - 1];
36634
+ if (cursor && typeof cursor === 'object' && Object.prototype.hasOwnProperty.call(cursor, lastKey)) {
36635
+ cursor[lastKey] = maskValue(cursor[lastKey]);
36636
+ }
36637
+ };
36638
+ // If wildcard present, mask all top-level primitive fields
36639
+ if (paths.includes('*')) {
36640
+ for (const key of Object.keys(obj)) {
36641
+ if (Object.prototype.hasOwnProperty.call(obj, key)) {
36642
+ const val = obj[key];
36643
+ if (val == null || typeof val !== 'object') {
36644
+ obj[key] = maskValue(val);
36645
+ }
36646
+ }
36647
+ }
36648
+ }
36649
+ for (const p of paths) {
36650
+ if (!p || p === '*')
36651
+ continue;
36652
+ if (p.includes('.')) {
36653
+ maskByPath(obj, p);
36654
+ }
36655
+ else if (Object.prototype.hasOwnProperty.call(obj, p)) {
36656
+ obj[p] = maskValue(obj[p]);
36657
+ }
36658
+ }
36659
+ }
36660
+ /**
36661
+ * collect effect targets from a list of rules filtered by effect name
36662
+ */
36663
+ function collectTargets(rules, effect) {
36664
+ return rules.filter(r => r.effect === effect).map(r => r.target).filter(Boolean);
36665
+ }
36666
+ /**
36667
+ * Evaluate a policy's rules against the provided scope
36668
+ */
36669
+ async function isRuleActive(conditions, evaluator, extraScope) {
36670
+ // Note: conditions is AXPExpression and may be a template string {{ ... }} or boolean
36671
+ const result = await evaluator.evaluate(conditions, extraScope);
36672
+ return Boolean(result);
36673
+ }
36674
+ const policyEnforceMiddleware = {
36675
+ target: { ops: ['create', 'update', 'delete', 'getOne', 'getAll', 'query'], order: 5 },
36676
+ execute: async (ctx, next) => {
36677
+ // try { console.warn('[policy] enter-middleware', ctx.op, ctx.entityName, ctx.id); } catch {}
36678
+ // Prevent recursion: skip enforcement when querying the Policy entity itself
36679
+ const policyEntityFullName = `${RootConfig.module.name}.${RootConfig.entities.policy.name}`;
36680
+ if (ctx.entityName === policyEntityFullName) {
36681
+ await next();
36682
+ return;
36683
+ }
36684
+ const policyService = inject(AXMPolicyService);
36685
+ const evaluator = inject(AXPExpressionEvaluatorService);
36686
+ const backend = inject(AXP_ENTITY_STORAGE_BACKEND);
36687
+ // Load all policies (could be cached later); filter by resource.type === 'entity' and target match
36688
+ let policies = [];
36689
+ try {
36690
+ const res = await policyService.query({ skip: 0, take: 1000 });
36691
+ policies = (res?.items ?? []);
36692
+ }
36693
+ catch {
36694
+ policies = [];
36695
+ }
36696
+ const applicable = policies.filter(p => p?.resource?.type === 'entity' && matchesEntity(p.resource?.target, ctx.entityName));
36697
+ if (applicable.length === 0) {
36698
+ await next();
36699
+ return;
36700
+ }
36701
+ // Build evaluation scope per operation
36702
+ const buildScope = (overrides) => {
36703
+ const existing = overrides?.existing;
36704
+ const result = overrides?.result ?? ctx.result;
36705
+ return {
36706
+ // Additional scopes are provided via providers (session, permission). Here we add op-specific context.
36707
+ context: {
36708
+ op: ctx.op,
36709
+ entity: ctx.entityName,
36710
+ id: ctx.id,
36711
+ data: ctx.data,
36712
+ existing: existing,
36713
+ result: result,
36714
+ // Add eval function to access data fields
36715
+ eval: (key) => {
36716
+ // Helper function to get nested property
36717
+ const getNestedProperty = (obj, path) => {
36718
+ if (!obj || !path)
36719
+ return undefined;
36720
+ const parts = path.split('.');
36721
+ let current = obj;
36722
+ for (const part of parts) {
36723
+ if (current && typeof current === 'object' && part in current) {
36724
+ current = current[part];
36725
+ }
36726
+ else {
36727
+ return undefined;
36728
+ }
36729
+ }
36730
+ return current;
36731
+ };
36732
+ // For delete operations, use existing data
36733
+ if (ctx.op === 'delete' && existing) {
36734
+ return getNestedProperty(existing, key);
36735
+ }
36736
+ // For create/update operations, use data
36737
+ if (ctx.data) {
36738
+ const dataValue = getNestedProperty(ctx.data, key);
36739
+ if (dataValue !== undefined) {
36740
+ return dataValue;
36741
+ }
36742
+ }
36743
+ // Fallback to existing for update operations
36744
+ if (existing) {
36745
+ return getNestedProperty(existing, key);
36746
+ }
36747
+ return undefined;
36748
+ }
36749
+ }
36750
+ };
36751
+ };
36752
+ // Helper: evaluate active rules for a given scope
36753
+ const evaluateActiveRules = async (scope) => {
36754
+ const list = [];
36755
+ for (const pol of applicable) {
36756
+ for (const rule of pol.rules ?? []) {
36757
+ const active = await isRuleActive(rule.conditions, evaluator, scope);
36758
+ if (active) {
36759
+ for (const eff of rule.effects ?? []) {
36760
+ list.push(eff);
36761
+ }
36762
+ }
36763
+ }
36764
+ }
36765
+ return list;
36766
+ };
36767
+ // Resolve effects per operation following simple standard semantics
36768
+ const deriveTargets = (rules) => ({
36769
+ readonlyTargets: collectTargets(rules, 'readonly'),
36770
+ immutableTargets: collectTargets(rules, 'immutable'),
36771
+ hiddenTargets: collectTargets(rules, 'hidden'),
36772
+ maskedTargets: collectTargets(rules, 'masked'),
36773
+ editableTargets: collectTargets(rules, 'editable'),
36774
+ });
36775
+ let activeRules = [];
36776
+ let readonlyTargets = [];
36777
+ let immutableTargets = [];
36778
+ let hiddenTargets = [];
36779
+ let maskedTargets = [];
36780
+ let editableTargets = [];
36781
+ // Conflict resolution (standard): editable overrides readonly (not immutable), hidden beats everything in output, immutable strongest on write
36782
+ const isEditable = (t) => editableTargets.includes(t) || editableTargets.includes('*');
36783
+ // WRITE PATH
36784
+ if (ctx.op === 'create' || ctx.op === 'update') {
36785
+ // For update, load existing to allow conditions to reference current record state
36786
+ let existing;
36787
+ if (ctx.op === 'update' && ctx.id && backend?.getOne) {
36788
+ try {
36789
+ existing = await backend.getOne(ctx.entityName, ctx.id);
36790
+ }
36791
+ catch {
36792
+ existing = undefined;
36793
+ }
36794
+ }
36795
+ // Re-evaluate rules with existing in scope
36796
+ activeRules = await evaluateActiveRules(buildScope({ existing }));
36797
+ ({ readonlyTargets, immutableTargets, hiddenTargets, maskedTargets, editableTargets } = deriveTargets(activeRules));
36798
+ if (ctx.data && typeof ctx.data === 'object') {
36799
+ // Check if entire object is immutable
36800
+ const immutableAll = immutableTargets.includes('*');
36801
+ if (immutableAll) {
36802
+ throw new AXPMiddlewareAbortError('Update forbidden by policy: Record is marked as system and cannot be modified', {
36803
+ status: 409,
36804
+ code: 'POLICY_IMMUTABLE_RECORD',
36805
+ details: { entity: ctx.entityName, id: ctx.id },
36806
+ });
36807
+ }
36808
+ // For specific immutable/readonly fields, remove them from payload
36809
+ const forbiddenPaths = [];
36810
+ const addForbiddenFromTargets = (targets) => {
36811
+ for (const t of targets) {
36812
+ if (t === '*') {
36813
+ // This case is handled above
36814
+ continue;
36815
+ }
36816
+ else if (!isEditable(t)) {
36817
+ forbiddenPaths.push(t);
36818
+ }
36819
+ }
36820
+ };
36821
+ // readonly and immutable (excluding '*')
36822
+ addForbiddenFromTargets(readonlyTargets);
36823
+ addForbiddenFromTargets(immutableTargets);
36824
+ // Remove forbidden fields from payload
36825
+ const uniqueForbidden = Array.from(new Set(forbiddenPaths));
36826
+ if (uniqueForbidden.length > 0) {
36827
+ removeFields(ctx.data, uniqueForbidden);
36828
+ // Log which fields were removed
36829
+ // try {
36830
+ // console.warn('[policy] fields-removed', {
36831
+ // entity: ctx.entityName,
36832
+ // id: ctx.id,
36833
+ // removedFields: uniqueForbidden
36834
+ // });
36835
+ // } catch {}
36836
+ }
36837
+ }
36838
+ }
36839
+ // DELETE PATH
36840
+ if (ctx.op === 'delete') {
36841
+ // Load existing to evaluate conditions based on record's current state
36842
+ let existing;
36843
+ if (ctx.id && backend?.getOne) {
36844
+ try {
36845
+ existing = await backend.getOne(ctx.entityName, ctx.id);
36846
+ }
36847
+ catch {
36848
+ existing = undefined;
36849
+ }
36850
+ }
36851
+ activeRules = await evaluateActiveRules(buildScope({ existing }));
36852
+ ({ readonlyTargets, immutableTargets, hiddenTargets, maskedTargets, editableTargets } = deriveTargets(activeRules));
36853
+ // If immutable '*' exists, block delete by short-circuiting
36854
+ const immutableAll = immutableTargets.includes('*');
36855
+ // Temporary debug logs for troubleshooting policy delete enforcement
36856
+ try {
36857
+ // eslint-disable-next-line no-console
36858
+ console.warn('[policy] delete-check', {
36859
+ entity: ctx.entityName,
36860
+ id: ctx.id,
36861
+ existingIsSystem: existing?.control?.isSystem,
36862
+ immutableTargets,
36863
+ readonlyTargets,
36864
+ editableTargets,
36865
+ immutableAll,
36866
+ });
36867
+ }
36868
+ catch { }
36869
+ if (immutableAll) {
36870
+ // Block delete and throw error to notify frontend
36871
+ try {
36872
+ console.warn('[policy] delete-blocked', { entity: ctx.entityName, id: ctx.id });
36873
+ }
36874
+ catch { }
36875
+ throw new AXPMiddlewareAbortError('Delete forbidden by policy: Record is marked as system and cannot be deleted', {
36876
+ status: 409,
36877
+ code: 'POLICY_IMMUTABLE_RECORD',
36878
+ details: { entity: ctx.entityName, id: ctx.id },
36879
+ });
36880
+ }
36881
+ }
36882
+ await next();
36883
+ // try { console.warn('[policy] after-next', ctx.op, ctx.entityName); } catch {}
36884
+ // READ PATH (after next to transform response)
36885
+ if (ctx.op === 'getOne' || ctx.op === 'getAll' || ctx.op === 'query') {
36886
+ // Re-evaluate rules with result in scope (read conditions can depend on returned data)
36887
+ activeRules = await evaluateActiveRules(buildScope({ result: ctx.result }));
36888
+ ({ readonlyTargets, immutableTargets, hiddenTargets, maskedTargets, editableTargets } = deriveTargets(activeRules));
36889
+ const applyReadTransforms = (obj) => {
36890
+ if (!obj || typeof obj !== 'object')
36891
+ return;
36892
+ // hidden ⇒ remove field
36893
+ removeFields(obj, hiddenTargets);
36894
+ // masked ⇒ mask value
36895
+ setMasked(obj, maskedTargets);
36896
+ };
36897
+ if (Array.isArray(ctx.result)) {
36898
+ ctx.result.forEach(applyReadTransforms);
36899
+ }
36900
+ else {
36901
+ applyReadTransforms(ctx.result);
36902
+ }
36903
+ }
36904
+ },
36905
+ };
36906
+
36907
+ const primaryMiddleware = {
36908
+ target: { ops: ['create', 'update'], order: 70 },
36909
+ execute: async (ctx, next) => {
36910
+ const backend = inject(AXP_ENTITY_STORAGE_BACKEND);
36911
+ // Check if this is a primary-related operation
36912
+ const isSettingPrimary = ctx.data && ctx.data.isPrimary === true;
36913
+ if (isSettingPrimary) {
36914
+ // Before setting a record as primary, unset all other primary records for this entity
36915
+ try {
36916
+ // Query all records for this entity to find existing primary records
36917
+ const queryResult = await ctx.backend.query(ctx.entityName, {
36918
+ filter: {
36919
+ field: null,
36920
+ logic: 'and',
36921
+ operator: null,
36922
+ filters: [
36923
+ {
36924
+ field: 'isPrimary',
36925
+ operator: { type: 'equal' },
36926
+ value: true
36927
+ }
36928
+ ]
36929
+ },
36930
+ skip: 0,
36931
+ take: 1000 // Get all primary records
36932
+ });
36933
+ // Update all existing primary records to set isPrimary = false
36934
+ if (queryResult.items && queryResult.items.length > 0) {
36935
+ for (const item of queryResult.items) {
36936
+ // Skip the current record being updated
36937
+ if (ctx.op === 'update' && item.id === ctx.id) {
36938
+ continue;
36939
+ }
36940
+ // Update the record to set isPrimary = false
36941
+ await ctx.backend.updateOne(ctx.entityName, item.id, { isPrimary: false });
36942
+ }
36943
+ }
36944
+ }
36945
+ catch (error) {
36946
+ console.error('Failed to unset existing primary records:', error);
36947
+ // Continue with the operation even if this fails
36948
+ }
36949
+ }
36950
+ // Execute the main operation
36951
+ await next();
36952
+ // After the operation, ensure only one primary record exists
36953
+ if (isSettingPrimary) {
36954
+ try {
36955
+ // Double-check: query again to ensure only one primary record exists
36956
+ const queryResult = await ctx.backend.query(ctx.entityName, {
36957
+ filter: {
36958
+ field: null,
36959
+ logic: 'and',
36960
+ operator: null,
36961
+ filters: [
36962
+ {
36963
+ field: 'isPrimary',
36964
+ operator: { type: 'equal' },
36965
+ value: true
36966
+ }
36967
+ ]
36968
+ },
36969
+ skip: 0,
36970
+ take: 1000
36971
+ });
36972
+ // If multiple primary records exist, keep only the most recent one
36973
+ if (queryResult.items && queryResult.items.length > 1) {
36974
+ // Sort by creation/update date to keep the most recent
36975
+ const sortedItems = queryResult.items.sort((a, b) => {
36976
+ const dateA = new Date(a.createdAt || a.updatedAt || 0);
36977
+ const dateB = new Date(b.createdAt || b.updatedAt || 0);
36978
+ return dateB.getTime() - dateA.getTime();
36979
+ });
36980
+ // Set all but the first (most recent) to isPrimary = false
36981
+ for (let i = 1; i < sortedItems.length; i++) {
36982
+ await ctx.backend.updateOne(ctx.entityName, sortedItems[i].id, { isPrimary: false });
36983
+ }
36984
+ }
36985
+ }
36986
+ catch (error) {
36987
+ console.error('Failed to ensure single primary record:', error);
36988
+ }
36989
+ }
36990
+ },
36991
+ };
36992
+
34922
36993
  class AXCMiddlewaresModule {
34923
36994
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.8", ngImport: i0, type: AXCMiddlewaresModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
34924
36995
  static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.1.8", ngImport: i0, type: AXCMiddlewaresModule }); }
@@ -34928,11 +36999,14 @@ class AXCMiddlewaresModule {
34928
36999
  // Provide the concrete backend and middlewares
34929
37000
  { provide: AXP_ENTITY_STORAGE_BACKEND, useClass: AXCDexieEntityStorageService },
34930
37001
  // Middlewares
37002
+ { provide: AXP_ENTITY_STORAGE_MIDDLEWARE, multi: true, useValue: policyEnforceMiddleware },
34931
37003
  { provide: AXP_ENTITY_STORAGE_MIDDLEWARE, multi: true, useValue: eventDispatchMiddleware },
34932
37004
  { provide: AXP_ENTITY_STORAGE_MIDDLEWARE, multi: true, useValue: mergeDetailRelationMiddleware },
34933
37005
  { provide: AXP_ENTITY_STORAGE_MIDDLEWARE, multi: true, useValue: identifierCommitMiddleware },
37006
+ { provide: AXP_ENTITY_STORAGE_MIDDLEWARE, multi: true, useValue: childCountMiddleware },
34934
37007
  { provide: AXP_ENTITY_STORAGE_MIDDLEWARE, multi: true, useValue: auditLoggerMiddleware },
34935
37008
  { provide: AXP_ENTITY_STORAGE_MIDDLEWARE, multi: true, useValue: createFileCastMiddleware },
37009
+ { provide: AXP_ENTITY_STORAGE_MIDDLEWARE, multi: true, useValue: primaryMiddleware },
34936
37010
  // Sample entity event listener to show logs for all entity.* events
34937
37011
  //{ provide: AXP_DISTRIBUTED_EVENT_LISTENER_PROVIDER, multi: true, useValue: AXCMockEntityLogListener },
34938
37012
  ] }); }
@@ -34949,11 +37023,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.8", ngImpor
34949
37023
  // Provide the concrete backend and middlewares
34950
37024
  { provide: AXP_ENTITY_STORAGE_BACKEND, useClass: AXCDexieEntityStorageService },
34951
37025
  // Middlewares
37026
+ { provide: AXP_ENTITY_STORAGE_MIDDLEWARE, multi: true, useValue: policyEnforceMiddleware },
34952
37027
  { provide: AXP_ENTITY_STORAGE_MIDDLEWARE, multi: true, useValue: eventDispatchMiddleware },
34953
37028
  { provide: AXP_ENTITY_STORAGE_MIDDLEWARE, multi: true, useValue: mergeDetailRelationMiddleware },
34954
37029
  { provide: AXP_ENTITY_STORAGE_MIDDLEWARE, multi: true, useValue: identifierCommitMiddleware },
37030
+ { provide: AXP_ENTITY_STORAGE_MIDDLEWARE, multi: true, useValue: childCountMiddleware },
34955
37031
  { provide: AXP_ENTITY_STORAGE_MIDDLEWARE, multi: true, useValue: auditLoggerMiddleware },
34956
37032
  { provide: AXP_ENTITY_STORAGE_MIDDLEWARE, multi: true, useValue: createFileCastMiddleware },
37033
+ { provide: AXP_ENTITY_STORAGE_MIDDLEWARE, multi: true, useValue: primaryMiddleware },
34957
37034
  // Sample entity event listener to show logs for all entity.* events
34958
37035
  //{ provide: AXP_DISTRIBUTED_EVENT_LISTENER_PROVIDER, multi: true, useValue: AXCMockEntityLogListener },
34959
37036
  ],
@@ -36011,5 +38088,5 @@ const AXCMockEntityLogListener = {
36011
38088
  * Generated bundle index. Do not edit.
36012
38089
  */
36013
38090
 
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 };
38091
+ 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, AXCLogReportCategoryProvider, AXCLogReportDefinitionProvider, AXCMeetingManagementMockModule, AXCMetaDataDefinitionDataSeeder, AXCMiddlewaresModule, AXCMockEntityLogListener, AXCMockModule, AXCNotificationManagementMockModule, AXCOrganizationManagementMockModule, AXCPartyManagementMockModule, AXCPlatformManagementMockModule, AXCProjectManagementMockModule, AXCQueryCategoryMetadataInheritanceQuery, AXCReportManagementMockModule, AXCSchedulerJobDataSeeder, AXCSchedulerJobManagementMockModule, AXCSecurityManagementMockModule, AXCTaskManagementMockModule, AXCTextTemplateCategoryDataSeeder, AXCTextTemplateDataSeeder, AXCTextTemplateManagementMockModule, AXCTrainingManagementMockModule, AXCUserPassStrategyMock, AXCWorkflowManagementMockModule, AXC_LOG_REPORT_CATEGORY_PROVIDER, AXC_LOG_REPORT_DEFINITION_PROVIDER, 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, childCountMiddleware, createAndSaveDashboardForUser, createDashboardForUser, createFileCastMiddleware, findContactMethod, findEmployeeById, findPartyById, generateUserDashboard, identifierCommitMiddleware, meetingFilesMock, meetingIds, meetingMock, meetingParticipantMock, meetingRoleTypeMock, meetingSessionMock, meetingTimeSlotMock, meetingTypeFileTemplateMock, meetingTypeMock, mergeDetailRelationMiddleware, mockRoleDefinitions, mockUsers, participantIds, primaryMiddleware, tenantsMock };
36015
38092
  //# sourceMappingURL=acorex-connectivity-mock.mjs.map