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