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